展开 Codex 的执行循环
观察每轮输入如何变化,以及工具结果如何回填。
对应资料:Unrolling the Codex Agent Loop [S004]
沿着对象与状态理解本章
把模型、宿主、工具画成不同泳道后,问“谁真正改变了文件”就有明确答案。跟踪每条返回消息,再判断需要继续调用模型、执行工具还是结束;不要把模型说完成当成环境已经完成。
下方图解的固定输入在“输入与适用条件”中声明。它用于解释本章机制,不与本章其他独立例子的数值暗中接续。
把一个Agent任务拆成真正发生的几轮
同一句用户任务,为什么可能调用模型不止一次?
LLM生成下一步提议,宿主执行获准的动作,把结果再交给LLM。这是外层任务循环;每次模型调用内部还要经历逐Token生成。外层的一轮工具行动不等于内部生成一个Token,两种“循环”不能混用。
输入与适用条件:构造的只读教学任务:文件config.txt含timeout=30。泳道展示职责边界,不声称调用了真实商业API;数据和动作顺序固定。
1 / 8 · 1. 用户任务:读config.txt中的timeout
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
模型尚未看到磁盘文件。先区分用户给的任务与环境真实内容。
未读取默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。
为什么需要
模型可以借助工具获得新证据,而不把一切都塞入参数。
怎样实现
按请求、校验、执行、结果回填、继续决策组织循环。
可能的代价与误解
忘记回填工具结果会让模型重复请求;把输出文本当执行证明会误报完成。
如何判断是否做对
对照每轮模型输入和工具日志,确认结果与call_id匹配。
把一次Codex任务展开为多轮输入
本篇对应Codex Agent Loop的公开机制。以下轨迹是原创教学示例,不是真实产品日志,也不声称展示隐藏Prompt。模型与工具交替工作,Harness维护调用和结果。[S004]
第1轮:目标 + 项目指导 + 工具定义
→ 模型请求搜索exclude
第2轮:加入搜索结果
→ 模型请求读取过滤器和测试
第3轮:加入源码与复现结果
→ 模型提出补丁
第4轮:加入补丁应用结果
→ 模型请求测试
第5轮:加入测试观察
→ 继续修复或给出有证据的交付
输入组装决定模型“知道什么”
工作目录存在源码,不代表源码进入输入。工具定义告诉模型能做什么,不代表动作已发生。历史中一句“测试可能通过”也不能变成已通过状态。
因此调试Agent时,应分别检查可访问、已读取、已解释和已验证。缺证据先修检索与输入;有证据但误用,再考虑提示、模型或验证方式。[S045][S102]
工具输出如何被利用
返回应包含足够上下文与明确错误类型。文件不存在、权限不足和文件为空不能都表示成空字符串。模型看到不同观察,才可能选择合适后续动作。[S058]
原创例子:搜索结果只有“filter.py”,模型需再猜路径;返回“路径、匹配行、片段、是否截断”更容易定位。返回整个仓库则可能造成另一种噪声问题。
长任务为何需要压缩与外置
每轮结果累积,历史可能变长。压缩保留任务连续性,但不能保证完整恢复所有细节。重要原始日志与版本应外置并保留引用。[S089][S084]
不要把压缩看成模型重新学习了任务,也不要把缓存命中看成永久记忆。它们分别改变内容表示与计算复用。
运行状态如何与界面分离
App Server等接口让不同客户端围绕会话与事件交互。界面进度、模型意图和实际环境结果不应混为一谈。[S064]
练习:在补丁应用后断开客户端,恢复时先查看文件版本和执行记录,再决定是否继续。重复显示一条消息无妨,重复执行有副作用的动作却可能产生问题。
完成本篇后,应能从一条最终回答追溯必要动作和证据,而不是只凭模型自述判断任务完成。
继续深入:第6章 · 真实编码Agent 或阅读拓展阅读目录6.1的逐项讲义。所有链接均为本地内容。
一个修复任务,为什么产生三次模型调用
输入与条件。任务是把 config.json 的超时从3改成5,工具有read、write、test。下面是确定的教学轨迹,而非真实模型自主运行。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1调用1输入 | 用户任务+可用工具说明 | 模型提出read,尚未承诺文件已修改。 |
| 2工具1结果 | 读取版本v7,timeout=3 | 结果连同调用ID进入历史。 |
| 3调用2输入 | 任务+read调用+结果 | 模型提出在v7基础上写timeout=5。 |
| 4工具2结果 | 写入成功,得到v8 | 宿主仍未证明功能测试通过。 |
| 5调用3输入 | 新版本和测试返回pass | 模型归纳变更与验证;如果模型还需自行提出test,则还要增加一轮。 |
| 6计数区别 | 用户看见一个任务 | 后端可能有多次模型请求和多次工具操作。 |
把过程连起来。一轮模型调用的输出不是任务的全部生命周期;哪些工具由模型决策、哪些由宿主自动触发必须说清。
边界与反例。本例test由宿主固定触发,因此三次调用成立;不要与“每一步工具都须另一次模型提议”的配置混计。
依据与适用范围:[TOOLS]。示例输入和场景由本书明确设定。