01. 请求生命周期¶
一轮请求从用户输入开始,但真正进入模型之前会经过本地预处理。入口层先准备当前工作目录、设置、权限模式、可用工具、斜杠命令(slash command,指以 / 开头的本地命令)、MCP 客户端、智能体定义和应用状态。随后查询引擎接收这条输入,把它转成内部消息,并判断这一轮是否需要调用模型。
有些输入不需要进入模型。例如某些斜杠命令只读取本地状态、切换模式或更新允许工具列表。查询引擎会先通过输入处理逻辑识别这些情况,生成本地反馈消息,必要时更新权限上下文。如果处理结果表明仍然需要模型,才继续进入查询循环。
查询引擎会在真正调用模型前先写入用户消息。这一步让恢复路径更稳定:如果进程在发出 API 请求前后被杀掉,转录记录至少已经有用户输入,下一次恢复时不会丢掉这轮意图。后续助手消息、工具结果、用量、压缩边界和附件会随着流式处理继续追加。
进入查询循环后,生命周期变成“采样、解释、执行、回填”的循环。模型第一次采样可能直接回答,也可能返回一个或多个工具调用。只要助手消息中出现工具调用,循环就不会把这一轮视为完成,而是把这些工具调用交给工具系统。工具系统执行后会生成工具结果,这些结果被包装成新的用户侧消息,再进入下一次模型采样。模型因此能看到刚才命令的输出、文件读取结果或权限拒绝原因,并据此决定下一步。
这也是 Claude Code 与普通聊天补全的差别。普通补全通常一次请求结束;智能体循环会把一次用户任务拆成多个模型回合,每个回合之间穿插本地动作。工具结果不是界面上的旁路信息,而是对话历史的一部分。模型后续推理依赖这些结构化结果,本地运行时也会根据这些结果更新已读文件缓存、文件历史、任务状态和压缩触发条件。
请求结束有几种路径。最常见的是模型没有再请求工具,停止钩子(stop hook,指模型结束前运行的本地检查)也没有要求继续,此时循环返回完成。另一种是达到最大轮数、预算、token 限制或中断信号,本地运行时会生成相应的结束状态。还有一种是工具或 API 失败,循环可能先尝试恢复:例如切换备用模型、触发响应式压缩、恢复最大输出 token 或补齐缺失工具结果。只有恢复失败或策略不允许继续时,错误才会作为最终结果暴露给调用方。
请求生命周期的核心是结构化回流。用户消息、助手消息、工具调用、工具结果、权限拒绝和压缩摘要都沿同一条历史链推进。下一章会把这些链路中的会话、轮次、消息和状态对象拆开说明。