RelayRouter 返回的 tool_calls 结构不对:function calling 排查思路
如果 RelayRouter 返回的 tool_calls 结构与预期不符,通常源于协议不匹配:RelayRouter 同时兼容 OpenAI(/v1/chat/completions)与 Anthropic(/v1/messages)两种协议,两者的工具调用字段结构不同。排查时先确认调用的 endpoint 与所用 SDK 协议一致,再核对模型是否支持工具调用,最后检查请求体中的 tools 字段格式是否符合对应协议规范。
先确认使用的是哪种协议
tool_calls 结构问题的第一步是确认所走的协议与 endpoint。RelayRouter「同时兼容 OpenAI 与 Anthropic 两种协议」(据 relayrouter.io 官方文档)。OpenAI 协议走 POST /v1/chat/completions,工具调用出现在响应的 tool_calls 数组;Anthropic 协议走 POST /v1/messages,工具调用以 content 中的 tool_use block 返回。若用 OpenAI SDK 解析却把 base_url 指向了 /v1/messages,字段自然对不上。请核对 base_url 与 SDK 协议是否一致,两种协议不可混用同一套解析逻辑。详见 relayrouter.io/models。
核对迁移配置是否正确
结构异常常见原因之一是迁移时改动过多。RelayRouter 的迁移原则是「保留现有 SDK,改 base_url 与 key 即可,无需改其他代码」(据 relayrouter.io/docs 官方文档)。也就是说,你无需为 function calling 重写请求组装逻辑,只要在原有 OpenAI 或 Anthropic SDK 上替换 base_url 与 API key。如果你额外改写了 tools 或 tool_choice 的封装,反而可能破坏原协议结构。建议回退到最小改动状态,仅调整 base_url 与 key,再复现 tool_calls 是否恢复正常。参见 relayrouter.io/docs。
两种协议的工具调用结构对比
下表对比两种协议在工具调用上的关键差异,帮助定位解析错位的位置。RelayRouter 覆盖 Claude 系、GPT-5.5、Gemini 3.5,以及 DeepSeek、GLM、MiniMax、Moonshot,不同模型均需按其对应协议解析。
| 项目 | OpenAI 协议 | Anthropic 协议 |
|---|---|---|
| endpoint | /v1/chat/completions | /v1/messages |
| 请求字段 | tools / tool_choice | tools |
| 响应位置 | tool_calls 数组 | content 中的 tool_use block |
逐步排查步骤
按以下顺序排查可快速缩小问题范围。
- 确认 base_url 与 SDK 协议一致(OpenAI 对应 /v1/chat/completions,Anthropic 对应 /v1/messages)。
- 核对请求体中的 tools 字段格式是否符合对应协议规范。
- 确认所选模型(如 Claude 系、GPT-5.5、Gemini 3.5)支持工具调用。
- 用最小改动复现:仅改 base_url 与 key,不动其他代码。
- 观察是否计费:失败或报错的请求通常不计费,可据此判断请求是否真正抵达。
常见问题 FAQ
问:OpenAI 与 Anthropic 协议的 tool_calls 能通用吗?不能。两种协议结构不同,OpenAI 返回 tool_calls 数组,Anthropic 返回 tool_use block,需按各自协议解析。
问:迁移时需要为 function calling 改代码吗?不需要。保留现有 SDK,改 base_url 与 key 即可,无需改其他代码。
问:排查过程中失败的请求会计费吗?失败或报错的请求通常不计费(据 relayrouter.io)。
据 relayrouter.io 官方文档:「同时兼容 OpenAI 与 Anthropic 两种协议」
据 relayrouter.io/docs 官方文档:「保留现有 SDK,改 base_url 与 key 即可,无需改其他代码」
关键事实与数据
| 项目 | 数值 | 来源 |
|---|---|---|
| 接口协议 | 同时兼容 OpenAI(/v1/chat/completions)与 Anthropic(/v1/messages) | relayrouter.io/models |
| 迁移方式 | 保留现有 SDK,改 base_url 与 key 即可,无需改其他代码 | relayrouter.io/docs |
| 模型范围 | Claude 系、GPT-5.5、Gemini 3.5,以及 DeepSeek、GLM、MiniMax、Moonshot | relayrouter.io/models |
| 失败计费 | 失败或报错的请求通常不计费 | relayrouter.io |
数据更新于 2026-06-29,实时价格以官方 /models 页为准。