#接入指南#工具调用
工具调用经过中转为什么会失灵:参数、schema 与并发三处

工具调用依赖严格的结构化返回。中转只要做了字段裁剪或流式重写,就可能让 function call 变成一段普通文本。
工具调用(function calling / tool use)对协议的要求比普通对话严格得多:模型必须返回结构化的 tool_calls 字段,而不能把调用意图写进自然语言。中转站如果在中间做了响应重写,最容易破坏的就是这一层。
第一类失灵是字段被裁剪。某些中转为了兼容旧版客户端,会把 tool_calls 转成 content 里的 JSON 文本。表现为模型似乎在“描述”要调用什么,但客户端拿不到可执行的结构。判断方法很简单:看原始响应里是否存在 tool_calls 数组,而不是看模型说了什么。
第二类是 schema 宽松化。工具定义里的 required、enum、additionalProperties 如果被中转忽略,模型会返回缺字段的参数,客户端解析失败。此时应当把校验放在自己这一侧:收到参数后先做一次本地 schema 校验,失败就带着错误信息重试一次,而不是直接把脏参数传给业务函数。
第三类是并发与流式组合。流式模式下,工具调用的参数是分片到达的,需要按 index 拼接 delta。部分中转会把分片重排或丢弃空分片,导致拼接出的 JSON 不完整。稳妥做法是在流式场景下先关闭并行工具调用,等参数完整再执行。
实际工程里还有一个易忽略点:工具调用失败后的重试要幂等。模型可能已经触发了一次副作用(例如下单接口),重试会重复执行。建议在工具层加请求指纹,同一指纹在短时间内只执行一次。
如果业务强依赖工具调用,选型时应当把这一项单独列为验证项:准备三个工具、两组必填参数、一次并行调用,跑通再决定是否长期使用。