客户端工具调用要保留身份
客户端执行的工具调用,不能只把“结果”送回模型;它也要作为完整的协议事件保留调用身份。Vercel AI SDK 在 6 月 17 日的 @ai-sdk/openai@3.0.73 修复了一个细节:通过 OpenAI Responses API 发送 client-executed tool calls 时,要把它们作为完整的 function_call item 发送,这样后续 function_call_output 才能按 call_id 正确配对。
这件事看起来只是 provider adapter 的 patch,但它暴露的是 Agent runtime 的一个边界:工具在哪里执行,不应该改变协议语义。服务端工具、浏览器内工具、用户本地工具、移动端工具,本质上都需要一个稳定的 call identity,把“模型提出调用”“人/客户端执行”“输出回传”“trace 展示”“重试/去重”串在一起。如果中间只传 output,短 demo 可能能跑,复杂链路里就会出现输出挂错调用、UI 回放不一致、审计日志看不到原始意图的问题。
做 OPC 或 Agent 平台时,可以把 client-side tool 当成一种远程执行器,而不是前端小技巧:模型侧协议里保留 tool name、arguments、call_id;客户端只负责执行授权后的那一次调用;回传时只允许输出绑定到已存在且未完成的 call_id。这样以后接浏览器插件、本地文件选择器、钱包签名、企业 SaaS 授权动作时,才不会把“谁请求了什么”和“谁返回了什么”混成一团。
一个值得检查的问题:你现在的 Agent 前端如果执行了某个本地/浏览器工具,trace 里还能完整看到原始 tool call 和对应 call_id,还是只剩下一段看似成功的 tool output?