平台约 3 分钟
智能体循环
一次发送如何变成多次模型步骤、工具调用与可验证的结果,以及边界在哪里。
本页目录
一次对话补全只回答一次。智能体的一轮会继续下去:模型规划、调用工具、读取返回结果,再判断目标是否达成。Lumo 在 Vercel AI SDK 之上实现这个循环,并把每一步都展示在过程记录里。
一轮里有什么#
一轮从用户消息与附件开始,加上系统提示词和工具目录。它结束于模型给出最终答案、用户按下停止,或达到配置的上限。
- 组装上下文:对话、页面或选区附件、文件引用,以及已启用的工具列表。
- 调用模型并流式接收各部分:推理、文本,以及零个或多个工具调用。
- 执行每个工具调用(模型一次发出多个时并行执行),并追加结构化结果。
- 把扩大的上下文送回模型,从第 2 步重复,直到模型不再调用工具而直接回答。
步数预算#
默认预算是不限步数。浏览类任务合理地需要几十步,任何固定上限都会变成「任务做到一半停下,让用户输入继续」。
0表示不设上限,也是默认值;它不是步数。- 低于
MIN_MAX_STEPS(10)的自定义上限会被抬高,因为更低的上限几乎会截断所有真实任务。 20与60作为预设,提供给希望有可预期上限的用户。
唯一的预算判断typescript
工具执行#
- 工具目录在每次请求时从所有已连接的 MCP 服务组装,因此禁用服务后,下一步就不会再出现它的工具。
- 每次调用渲染成可折叠卡片,包含输入、状态与输出;失败默认展开。
- 工具返回的图片会从后续提示词中移除并替换为说明,避免 base64 占满上下文窗口。
- 一轮被中断时仍在运行的工具调用会显示为已中断,而不是永远转圈。
上下文与压缩#
上下文环估算的是下一次请求的成本,而不是这段对话已经花掉的成本。当估算超过模型窗口时,旧轮次会被折叠成检查点,以摘要形式回放;原始消息仍然留在过程记录中可读。
| 信号 | 来源 | 改变什么 |
|---|---|---|
| 上下文环 | 提示词估算 + 提供方实时用量 | 下一次请求距离窗口还有多远 |
| 压缩检查点 | 旧轮次折叠为摘要 | 回放给模型的内容 |
| 步骤用量 | 每步 token 统计 | 助手消息上的用量明细 |
| 停止原因 | 提供方 finish reason | 回复是否标记为中断 |
过程记录才是事实来源
压缩只改变提示词投影,从不改变已存储的对话。用户永远可以翻回被摘要的原始消息。
停止与继续#
- 停止会中止进行中的请求,并结算每一个未完成的工具调用。
- 重试会重新发送失败的那一轮,带有限次数的退避。
- 重新生成会为助手消息创建新变体,旧变体仍可切换查看。
模型提供方也是循环的一部分#
循环与协议无关。支持三种线协议,以及 OpenCode 的厂商档案——后者会派生端点与会话标识。
| 档案 | 协议 | 端点 | 说明 |
|---|---|---|---|
| OpenAI Chat | Chat Completions | POST {baseUrl}/chat/completions | 通用默认值,适配大多数网关。 |
| OpenAI Responses | Responses | POST {baseUrl}/responses | 推理与内置工具形态。 |
| Anthropic | Messages | POST {baseUrl}/messages | Claude 模型、视觉与推理强度。 |
| OpenCode | 三种都支持 | 由厂商档案派生 | 客户端标识与稳定的会话亲和。 |
OpenCode 是厂商类型,不是协议
如果使用 OpenCode 端点,请把提供方的厂商类型设为 OpenCode。它会派生协议路径、发送客户端标识请求头,并带上按会话的 ID。自定义提供方指向同一路径时缺少这些请求头,OpenCode 会拒绝请求。
推理强度是模型级设置
推理强度按模型保存,未设置时不会写入请求,因此空值永远不会覆盖提供方的默认行为。