# 4. Agent Loop

# 4.1 原理

Agent Loop 是 Runtime 内部的决策—执行—观察循环:

Observe(context)          // 读取当前目标、历史、环境、计划和可用工具
  → Think/Plan(model)     // 模型基于观察选择下一步策略或动作
  → Act(tool call)        // 将模型意图转换成结构化 ToolCall 提议
  → Observe(tool result)  // 获取权限受控执行后的真实外部结果
  → Update state/context  // 持久化结果并更新下一 Step 的上下文视图
  → Stop or continue      // 由 Runtime 根据验收、预算和失败策略决定终止或迭代

生产 Loop 需要显式停止条件:

  • 模型输出最终答案且无 ToolCall;
  • 任务验收器通过;
  • 达到 Step/Token/费用/墙钟时间预算;
  • 用户取消;
  • 连续同类失败、无进展或循环检测触发;
  • 进入必须人工处理的权限/业务状态。

应区分模型内隐推理和 Harness 的外显状态。模型可以选择动作,但是否继续、是否允许、预算是否耗尽必须由 Runtime 决定。

# 4.2 源码对照

Codex 的外层 RegularTask 在有 pending input 时继续执行 Turn;Turn 内层循环每次重新构造模型输入,模型或 Mailbox 要求 follow-up 时继续,达到上下文阈值时先压缩后继续:regular.rs:73turn.rs:333turn.rs:360

Claude Code 将工具结果以 tool_result 消息重新送回查询链;并行工具完成后持续 yield 结果,直到所有工具进入 yielded 终态:StreamingToolExecutor.ts:450

# 4.3 循环检测伪代码

fingerprint = hash(normalize(action.name, action.args, relevantState)) // 对动作、参数和相关状态规范化后生成循环指纹
loopCounter[fingerprint] += 1                                        // 累计相同状态下同一动作的出现次数
if loopCounter[fingerprint] >= 3 and noNewEvidenceSinceFirstOccurrence: // 连续重复且没有新证据时判定可能陷入循环
    inject("Repeated action detected; diagnose before retrying")     // 向模型注入诊断提示,要求改变策略而非机械重试
    if loopCounter[fingerprint] >= 5:                                // 重复达到更高阈值说明自恢复已经无效
        stop(reason = NO_PROGRESS)                                   // 以无进展原因安全终止并保留轨迹供排查

# 4.4 面试题

问:ReAct 就等于 Agent Loop 吗?

不是。ReAct 是促使模型交替 Reason/Act 的一种提示范式;Agent Loop 是 Runtime 的控制结构,还包括工具协议、状态、权限、预算、失败恢复与停止条件。

# 4.5 原理深化:Loop 是“带原因的状态迁移”,不是 while true

Claude Code 的 query.ts 用异步生成器同时承载模型流、工具结果和恢复事件。一次迭代结束后不会只有“继续/停止”布尔值,而会区分正常 next_turn、上下文超长压缩、输出 Token 恢复、Stop Hook 阻塞和预算续航等 transition reason:query.ts:1095query.ts:1220query.ts:1305。结构化原因决定下一轮要修改 Prompt、预算还是状态,不能统一原样重试。

Codex 的 Turn Loop 每轮从 History 生成 Prompt 投影,处理模型 Response Item,再根据 ToolCall、pending user input、Mailbox 或终止条件决定是否产生下一 Step。外层 RegularTask 还会在一次 run_turn 返回后检查运行期间到达的用户输入,从安全边界启动后续循环:regular.rs:49regular.rs:73

实现 Loop 时应持久化 step_id/reason/budget_before/budget_after/evidence_delta。循环检测不能只比较相同工具名:相同 grep 在新文件或新假设下可能有进展;真正的无进展是动作指纹、相关世界状态和证据集合都没有变化。

最终答案也应视为一种“完成提议”。Harness 要检查是否仍有 running ToolCall、未完成 Task、待处理审批和失败验收,再决定 Turn terminal。这样模型的自然语言结束不会越过系统状态机。

最后更新: 2026/8/5 22:05:21