Skip to content

第 3 章:心跳放在哪 — Query Loop 对照 Thread、Rollout 与 State ​

出处

来源:原网页 · 状态:已读 · PDF:book2-comparing.pdf p.16–21

一句话 ​

谁来拥有连续性,谁就定义了 harness 的中心。 Claude Code 把连续性压进主循环,Codex 把连续性拆成线程、rollout 与状态桥。这不是审美差异,是系统权力分配。

核心概念 ​

把代理系统当成多轮聊天,就像把数据库当成一个比较耐心的记事本——掩盖了真正的架构难题。须处理的是:轮次如何衔接、工具结果如何回填、中断如何收束、过长上下文如何压缩、失败时重试还是如实上报。这些才决定系统是否算 agent,而不只是带工具调用的问答接口。

Claude Code 把连续性压进 query() / queryLoop()。消息序列、tool-use 上下文、compact 跟踪、输出 token 恢复、pending summary、turn count、transition 都被压进循环状态。对「代理如何活着」的回答是运行时性的:连续性主要由 loop 维护,系统结构是一个不断自我校正的会话发动机。工具返回顺序、输出截断、prompt too long、history snip、microcompact、用户插话,都被当作循环内部的合法状态,而不是外部异常。设计有工程的粗粝感——不优雅但通常更稳。

Codex 更偏账本。连续性分摊到 codex_thread、thread_manager、rollout、state_db_bridge、state、message_history。TypeScript SDK 里 Thread 已是开发者可直接操作的一级概念:持 id,可 runStreamed() / run();approval policy、工作目录、sandbox、网络、附加目录都是 turn 级显式参数。runStreamedInternal() 先规范化输入、准备 schema,再把上述条件一并送进 _exec.run();收到 thread.started 后回填 _id。thread 不是外围包装,是 turn 级执行语义真正经过的一层。连续性不再等于「循环还在转」,而是「一条线程被显式状态结构持续记录并约束」。rollout 表明系统在乎回放、索引、持久化与会话外可见性。系统因此更接近执行记录器,而非现场对话管理器。

两边都有状态、都有循环。差异不在有没有,而在主权在哪。

事件Claude CodeCodex
用户中断且工具在飞循环内合成 tool_result 闭账线程层 abort,写 rollout interrupted
模型输出截断提高 cap 或追加 meta 续写线程记录 truncation,由 caller 重启 turn
prompt too long循环内 collapse / reactive compactthread_manager 裁剪 history 后再一轮
进程重启依赖外部 PR/Git,loop 状态易丢可按 thread.id 用 rollout + state_db_bridge 重放
恢复失败(compact 熔断)跳过 stop hook,如实报错返回 state bridge 错误,保留 thread 记录

Claude Code:loop 拥有 messages / toolUseContext / compactTracking / turnCount;每轮重算「此刻要紧的是什么」;未闭合的 pending tool_use 须在同一 iteration 内闭合或 synthetic 兜底。Codex:thread.id 跨 run 稳定,rollout 记录每一 turn;approvalPolicy / sandboxMode / workingDirectory 在 exec.run() 入参中显式;thread.started 先于任何工具调用;state_db_bridge 持久化早于主循环退出。

关键洞察 ​

状态安放位置直接决定恢复与审计路径。Claude Code 像现场救火队:reactive compact、token 上限恢复、工具中断处理都在循环内发现并修补,不必先搬到更高层状态模型。Codex 像带档案系统的调度中心:线程有 ID,rollout 有记录,state bridge 与 message history 提供外部结构,更容易回答上一轮到底发生了什么。前者擅长维持运行,后者擅长把「运行如何被维持」说清楚。

主权在 loop:团队按运行时问题组织——哪些错误要恢复、哪些动作该中断、compact 何时触发、工具结果如何串回主对话。主权在线程与状态结构:团队按接口与治理组织——thread 生命周期、rollout 保留哪些事件、状态库放哪、approval policy 如何成为 turn 级选项。Claude Code 更像先把 agent 做会再嵌制度,Codex 更像先立制度接口再让 agent 在里面工作。

结论:Claude Code 的连续性更多由主循环承担,Codex 的连续性更多由 thread、rollout 与 state 基础设施承担。前者强调 runtime heartbeat;后者强调 persisted session substrate。

个人思考 ​

Book 1 第 3 章已经把主循环写成「几轮之后还知不知道自己在做什么」。这一章把那句话变成对照:知道自己在做什么,可以靠循环内的状态机,也可以靠线程账本。自己写 agent 时如果主循环只是 while tool_calls: execute(),缺的不只是治理输入,还有一个更早的选择——连续性要不要成为产品概念。Codex 让 Thread 出现在 SDK 里,等于承认「会话」对团队接口必须可见;Claude Code 把同一件事藏在发动机室。

相关 ​

Copyright © 2026 openalon. All rights reserved.