工具顺序要按协议重排
Agent 的工具调用不只是“模型说要调、客户端调完再塞回结果”这么简单;当同一轮里混有模型侧 tool use、客户端执行 tool result、以及 provider 自己要求的 assistant content 顺序时,消息数组的顺序就是协议契约。Vercel AI SDK 在 6 月 24 日的 @ai-sdk/anthropic@3.0.86 里修了一个很小但很关键的问题:Anthropic provider 需要在 client tool use 和 provider tool use 之间重排 assistant content,否则后续工具结果可能对不上模型期望的上下文结构。
这类 bug 的危险点在于,它通常不会表现成“工具不存在”或“HTTP 请求失败”,而是表现成模型看起来变笨:重复调用工具、忽略刚返回的结果、把某个工具结果理解成另一个调用的上下文。根因不是推理能力,而是 transcript projection 把事件流投影成 provider message 时丢了顺序约束。
做 Agent runtime 时,可以把内部事件流拆成三层:原始执行事件保持 append-only;中间层保留 call id、tool name、role、source(client/provider/server)和因果顺序;最后才按不同 provider 的格式投影。不要让前端 UI 消息、OpenAI/Anthropic message schema、内部 trace 共用同一个“万能 message object”,否则一旦接入多 provider 或本地工具执行,最先坏的就是顺序和归属。
一个实用的回归测试是:构造同一轮里既有 provider tool use、又有 client-executed tool call 的 case,断言投影后的 assistant content 与 tool result 顺序、call id 配对、以及再次 stream resume 后的 transcript 完全一致。你现在的 Agent/OPC 运行时,是在测试“工具能跑”,还是在测试“工具事件能被正确投影给每个模型供应商”?