跳到正文
平台约 3 分钟

智能体循环

一次发送如何变成多次模型步骤、工具调用与可验证的结果,以及边界在哪里。

更新于 2025年11月6日约 3 分钟编辑此页
本页目录

一次对话补全只回答一次。智能体的一轮会继续下去:模型规划、调用工具、读取返回结果,再判断目标是否达成。Lumo 在 Vercel AI SDK 之上实现这个循环,并把每一步都展示在过程记录里。

一轮里有什么#

一轮从用户消息与附件开始,加上系统提示词和工具目录。它结束于模型给出最终答案、用户按下停止,或达到配置的上限。

  1. 组装上下文:对话、页面或选区附件、文件引用,以及已启用的工具列表。
  2. 调用模型并流式接收各部分:推理、文本,以及零个或多个工具调用。
  3. 执行每个工具调用(模型一次发出多个时并行执行),并追加结构化结果。
  4. 把扩大的上下文送回模型,从第 2 步重复,直到模型不再调用工具而直接回答。

步数预算#

默认预算是不限步数。浏览类任务合理地需要几十步,任何固定上限都会变成「任务做到一半停下,让用户输入继续」。

  • 0 表示不设上限,也是默认值;它不是步数。
  • 低于 MIN_MAX_STEPS(10)的自定义上限会被抬高,因为更低的上限几乎会截断所有真实任务。
  • 20 与 60 作为预设,提供给希望有可预期上限的用户。
唯一的预算判断typescript
export function stepAllowed(step: number, maxSteps: number): boolean {  return maxSteps === 0 || step < maxSteps;}

工具执行#

  • 工具目录在每次请求时从所有已连接的 MCP 服务组装,因此禁用服务后,下一步就不会再出现它的工具。
  • 每次调用渲染成可折叠卡片,包含输入、状态与输出;失败默认展开。
  • 工具返回的图片会从后续提示词中移除并替换为说明,避免 base64 占满上下文窗口。
  • 一轮被中断时仍在运行的工具调用会显示为已中断,而不是永远转圈。

上下文与压缩#

上下文环估算的是下一次请求的成本,而不是这段对话已经花掉的成本。当估算超过模型窗口时,旧轮次会被折叠成检查点,以摘要形式回放;原始消息仍然留在过程记录中可读。

信号来源改变什么
上下文环提示词估算 + 提供方实时用量下一次请求距离窗口还有多远
压缩检查点旧轮次折叠为摘要回放给模型的内容
步骤用量每步 token 统计助手消息上的用量明细
停止原因提供方 finish reason回复是否标记为中断

过程记录才是事实来源

压缩只改变提示词投影,从不改变已存储的对话。用户永远可以翻回被摘要的原始消息。

停止与继续#

  • 停止会中止进行中的请求,并结算每一个未完成的工具调用。
  • 重试会重新发送失败的那一轮,带有限次数的退避。
  • 重新生成会为助手消息创建新变体,旧变体仍可切换查看。

模型提供方也是循环的一部分#

循环与协议无关。支持三种线协议,以及 OpenCode 的厂商档案——后者会派生端点与会话标识。

档案协议端点说明
OpenAI ChatChat CompletionsPOST {baseUrl}/chat/completions通用默认值,适配大多数网关。
OpenAI ResponsesResponsesPOST {baseUrl}/responses推理与内置工具形态。
AnthropicMessagesPOST {baseUrl}/messagesClaude 模型、视觉与推理强度。
OpenCode三种都支持由厂商档案派生客户端标识与稳定的会话亲和。

OpenCode 是厂商类型,不是协议

如果使用 OpenCode 端点,请把提供方的厂商类型设为 OpenCode。它会派生协议路径、发送客户端标识请求头,并带上按会话的 ID。自定义提供方指向同一路径时缺少这些请求头,OpenCode 会拒绝请求。

推理强度是模型级设置

推理强度按模型保存,未设置时不会写入请求,因此空值永远不会覆盖提供方的默认行为。