agent.Run — Agent 循环流程

turn 循环:分区工具 → 主动压缩 → provider 流式(重连/停顿重试)→ 工具批处理(权限门+沙箱)→ 完成判定

有工具调用 无工具调用 上下文超限 → 压缩重试 下一轮 turn(未完成则继续,直到 maxTurns) agent.Run(ctx, prompt, provider, opts) internal/agent/loop.go · 校验 provider · maxTurns/registry/权限默认值 初始化上下文 SeedMessages(系统提示 + prompt + images) guards · compactor · loaded(延迟工具) · nudge 计数 for turn := 0; turn < maxTurns(每轮一次) partitionTools 按权限模式 + loaded 计算本轮暴露工具集 超阈值的 MCP 工具折叠到 tool_search 之后 主动压缩 maybeCompact 接近上下文窗口 → 摘要最旧中段 ContextWindow=0 时为 no-op · OnContext 报预算 provider 流式 streamWithReconnect CollectStream:转发 OnText/OnReasoning OnToolCallStart/Delta/OnUsage 连接前重连 · 停顿超时重试(未出正文时) 图片拒绝 / ctx 取消 → 直接返回 追加 assistant 消息 text + toolCalls + reasoning 块(供下轮回放)· FinishReason 是否有工具调用? dropped 调用 → 提示重试 continue 空回合 → no-output 守卫 / 催继续 纯文本回合 → 完成判定(见右) 有工具调用 → 批处理(见下) 工具批处理 executeToolCall(逐个) OnToolCall → 过滤/spec 门 → PrePermission 拒绝 ask_user / request_permissions 在循环内拦截 权限门 + Sandbox.Evaluate(策略/授权/前缀) → tool.Run → 追加 tool_result · OnToolResult loaded 记录延迟工具 · stopReason → 提前结束 重复失败守卫:注入 schema 提示 / halt abort(ask_user 取消 / ctx)→ 补齐占位后返回 批后处理 SelfCorrect.AfterEdit(变更文件并集,一次)→ 反馈入队 模型升级 ModelSwitcher(每轮至多一次,非致命) 完成判定 / 返回 交互式:文本即最终答案 → FinalAnswer, return Headless(RequireCompletionSignal): ① 自报未完成 → Incomplete ② 续接线索 → 催继续(有上限) ③ 任务验收检查(一次) 通过 → FinalAnswer 成功返回 超 maxTurns → 未完成收尾 返回 Result{Turns, Messages, FinalAnswer, FinishReason, Usage} 图例 循环/流式 工具分区/压缩 工具批处理 判定/返回 压缩/错误分支 下一轮回边

请求前(每轮)

  • partitionTools:按权限+loaded 定本轮工具集
  • • 超阈值 MCP 工具折叠到 tool_search
  • maybeCompact 主动压缩最旧中段
  • streamWithReconnect 连接前重连 + 停顿重试

工具批处理

  • • 逐个 executeToolCall:过滤/spec 门/预拒绝
  • • 权限门 + Sandbox.Evaluate(策略/授权/前缀)
  • ask_user / request_permissions 循环内拦截
  • • 重复失败守卫 · stopReason 提前结束
  • • 批后一次 SelfCorrect.AfterEdit + 模型升级

完成判定

  • • 交互式:文本即最终答案,立即返回
  • • Headless:自报未完成 / 续接催继续 / 验收检查
  • • 空回合、dropped 调用有专门守卫与 nudge
  • • 超 maxTurns 收尾 · 返回 Result