流式输出与 Tool Calls
流式输出会让 tool calling 的处理难度上一个台阶。
为什么更难
因为在 streaming 场景下,工具调用信息可能不是一次性完整给出,而是逐块增量到达。
你需要考虑:
- 名称是否分段到达
- arguments 是否分段拼接
- 什么时候算一个 tool call 完整结束
- 流中混杂自然语言 token 怎么处理
工程建议
1. 先累积,再解析
不要一拿到半截 arguments 就立刻 json.loads。
更稳的方式是:
- 先按 tool call id 缓存增量片段
- 等 provider 明确结束或结构闭合后再解析
2. 把 provider-specific parser 隔离开
OpenAI、Anthropic、Gemini 在流式 tool 数据上的事件形式不一样,最好不要共用一套硬编码 parser。
3. 日志一定要保留原始事件
否则出了问题很难判断是:
- provider 返回异常
- SDK 丢字段
- 你的拼接器写错
最容易踩的坑
- arguments 被截断
- 多个并行 tool call 串线
- 最终 completion 和 tool delta 顺序搞混
- 以为 SDK 已经帮你组装好,实际上没有