Skip to content

流式输出与 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 已经帮你组装好,实际上没有

聚焦 OpenClaw、tool_calls、function calling 与 agent 实战。