检测项目一览 / 工具调用协议
工具调用协议检测
中转站检测:强制调用一个工具,检查返回的 tool_use / tool_calls 结构、名称、入参是否符合官方 schema。适用于 Claude 和 OpenAI。
测什么
定义一个简单工具(回显一个字符串),用 tool_choice 强制模型必须调用它,检查响应里有没有返回结构规范的工具调用块——Claude 是 content 数组里的 tool_use block,OpenAI 是 message.tool_calls 数组——名称是否对得上、入参是否是能被正常解析的合法 JSON。
为什么能判真假 / 来路
官方协议对「强制工具调用」的返回结构是固定的。协议实现不完整或做了转换的网关,往往拿不出规范的 tool_use / tool_calls 结构,或者入参不是合法 JSON——这是判断这条通道协议实现是否完整的一项硬指标。
结果怎么读
- 通过:返回了名称正确、入参是合法 JSON 且字段符合 schema 的工具调用块。
- 存疑:强制要求调用工具,响应里却没有工具调用块;或者有工具调用块但名称不对、入参不是合法 JSON、字段不符合 schema。
- 未通过:这个探针不会给出「未通过」,只有通过/存疑/信息不足三档。
- 信息不足:请求失败或超时,没拿到有效响应。
局限:它判不了什么
仅 Claude 和 OpenAI 两个协议有这项检测,Gemini 官方走的是不同的 function calling 字段形状,本站目前未实现这一项。存疑不代表掉包,在供货层它被归为「功能残缺/非官方后端直通」——说明这条通道没把工具调用这个功能做全,不是身份不符(掉包嫌疑)的证据。
自己怎么验
强制模型调用一个简单工具,看响应里有没有规范的工具调用结构。
curl -s https://YOUR_RELAY_BASE_URL/v1/messages \
-H "x-api-key: YOUR_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-opus-5","max_tokens":256,"tools":[{"name":"echo_check","description":"echo the token back","input_schema":{"type":"object","properties":{"token":{"type":"string"}},"required":["token"]}}],"tool_choice":{"type":"tool","name":"echo_check"},"messages":[{"role":"user","content":"Call echo_check with token \"ZZC\"."}]}' \
| grep -o '"type":"tool_use"'OpenAI 把 tools/tool_choice 换成官方 function-calling 的字段形状(type: function),请求体和响应里找的是 tool_calls 而不是 tool_use,其余思路一样。
相关检测项
常见问题
为什么工具调用检测判不了「掉包」?
这一项测的是协议实现完不完整,不是模型身份。没做好工具调用支持,更可能是这条通道功能残缺或没走官方直通,而不是把模型换成了别的——判断掉包要看 thinking 签名和模型名回显。
为什么 Gemini 没有工具调用检测?
官方 Gemini 的 function calling 走的是不同的字段形状(和 Claude 的 tool_use、OpenAI 的 tool_calls 都不一样),本站引擎目前没有针对 Gemini 实现这一项探针,不代表 Gemini 的工具调用功能一定有问题。