跳转至

06. 模型流式采样

模型采样阶段负责把本地运行时的内部状态转换成 Claude API 请求,并把 API 的流式事件转换回内部消息。这里有两个方向的适配:请求前要把上下文、工具和模型能力整理成合法参数;响应后要把流式增量累积成文本、推理内容、工具调用、用量和停止原因。

请求构造先处理工具。本地运行时不一定把所有工具完整暴露给模型。内置工具、MCP 工具、动态发现工具和工具搜索会根据当前模型、开关、权限上下文、是否延迟加载等条件过滤。某些工具可以只提供搜索入口,等模型引用或任务需要时再加载完整结构说明。这样可以减少提示词体积,也避免把暂时无关的工具全部加入工具列表。

消息也会在发送前规范化。本地运行时要保证工具调用与工具结果成对,移除当前模型不支持的块,处理过多媒体内容,按模型提供方能力调整顾问、推理、工具搜索、MCP 试验字段等参数。系统提示会和归因、命令行前缀、模型提供方特定提示合并。为了保持提示词缓存稳定,部分试验头和缓存相关字段会被谨慎锁定,避免同一类请求因为细微顺序变化失去缓存命中。

flowchart LR Internal[内部消息 / 上下文 / 工具] --> Normalize[规范化消息] Normalize --> ToolSchema[生成工具结构说明] ToolSchema --> Params[API 参数] Params --> Stream[流式响应] Stream --> Blocks[累积 content block] Blocks --> Assistant[assistant message] Assistant --> Loop[查询循环]

流式响应不是一次性 JSON。API 会先给出消息开始,然后按内容块返回开始、增量和结束。文本块的增量会累积成完整文本;推理块会累积推理内容和签名;工具调用块的输入 JSON 会以增量字符串形式到达,运行时必须持续拼接,直到内容块结束才能得到完整输入。消息增量最后会补充用量、停止原因或部分错误状态。

这种事件模型决定了工具调用不能在半截参数到达时立即执行。工具处理器需要完整、可验证的 JSON 输入。运行时可以在流式执行模式下尽早调度已经完成的工具块,但仍然要等对应内容块结束、输入完整、消息结构确定。这样既能缩短长工具任务的等待时间,也不会拿半截 JSON 去执行本地命令。

模型流还要处理失败恢复。若主模型触发备用路径,运行时会丢弃部分已经产生但不应进入新模型请求的助手片段,补齐缺失工具结果,清理不兼容签名,再用备用模型重试。若出现上下文窗口或最大 token 相关错误,查询循环可能触发响应式压缩、上下文折叠或最大输出 token 恢复。若流式连接本身异常,API 层还会重试,必要时尝试非流式或备用路径。

权限拒绝和工具错误不属于模型流错误。模型流只负责模型请求和响应事件;工具处理器产生的参数错误、执行失败、权限拒绝会作为工具结果回到历史,由下一次采样读取。传输错误、模型协议错误和工具执行错误分开表达,恢复路径才不会互相污染。

最终,模型层输出给查询循环的不是原始 SSE 事件,而是内部助手消息流。查询循环只需要关心这些消息里有没有工具调用、有没有 API 错误、用量如何累计、停止原因是否表示可继续。API 层负责适配模型提供方协议,循环负责智能体语义。下一章会说明模型产生的工具调用如何进入本地工具和技能系统。