Codex CLI Agent Loop 全流程拆解:按下 Enter 后 TaoToken 通道里发生了什么
1. 按下 Enter 之后Codex CLI 到底在忙什么你在终端里敲下一句fix the failing test in auth_test.go手指落下回车键屏幕开始滚动。大多数人以为这只是发个请求、等个回答但 Codex CLI 内部其实启动了一个完整的 Agent Loop组装提示、调用模型、执行工具、管理上下文一轮接一轮地转直到模型自己说我干完了。这套循环是 Codex CLI 区别于普通聊天式编程助手的核心。普通助手是你问一句、它答一句而 Codex CLI 是你给个目标、它自己拆步骤、自己跑命令、自己看结果、自己决定下一步。理解这个循环你才能从把它当黑盒用变成知道它卡在哪、为什么慢、怎么调。本文面向在本地跑 Codex CLI 的开发者把单次回车后的全链路拆开从输入解析、提示组装、模型推理、工具调用到结果回填和上下文压缩。每一步我都会给出可复制的配置片段和可观察的日志并且说明怎么把 endpoint 切到 TaoToken 的统一 Key/API 通道方便你对照排查。适合已经装好 Codex CLI、想搞清楚它内部行为、或者正被卡在工具循环响应越来越慢困扰的人。一个回合turn可能包含几十次内部迭代iteration每次迭代都是一次模型推理加零到多次工具执行。只有模型发出 done 事件回合才结束。下面按这个顺序拆。2. 前置准备把 Codex CLI 的 endpoint 接到 TaoToken 通道在拆循环之前先把通道理顺。Codex CLI 默认走官方端点但很多开发者希望用统一的 Key 和 API 通道来管理多个模型、方便对照日志。TaoToken 提供的就是这样一个统一入口一个 Key、一个 Base URL兼容 OpenAI 风格的 Responses/Chat 接口。你需要准备三样东西我称之为三件套Base URL、API Key、Model ID。缺一个都连不上。Base URL 用https://taotoken.net/api注意这里不加任何查询参数。API Key 在控制台生成路径是 API Keys 页面。Model ID 按你要用的模型填比如gpt-4o-mini、o4-mini这类。生成 Key 的入口在这里https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcodex_loopCodex CLI 的配置分两层全局配置在~/.codex/config.toml项目级指令在AGENTS.md。先看全局配置。打开~/.codex/config.toml写入下面这段把sk-xxx换成你自己的 Key# ~/.codex/config.toml model gpt-4o-mini model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api responses [sandbox] mode auto [history] persistence save-all这里几个字段值得说清楚。model_provider指向你自定义的 provider 名base_url就是 TaoToken 的 API 地址env_key表示 Key 从环境变量读不硬编码进文件。wire_api responses告诉 Codex CLI 用 Responses 风格的接口这和它内部的 SSE 流式处理是对齐的。然后设置环境变量。macOS/Linux 下export TAOTOKEN_API_KEYsk-xxxWindows PowerShell$env:TAOTOKEN_API_KEYsk-xxx想持久化就写进~/.zshrc或~/.bashrc。配好后跑一次codex --version确认 CLI 正常再随便发一句让它读个文件看是否走通。如果这一步就报 401先别往下看循环直接跳到第 5 节排错。项目级指令用AGENTS.md。在项目根目录建一个写清楚项目规范比如用 go test 跑测试不要改 vendor 目录。这个文件会在提示组装阶段被读进去是循环的输入之一。指令级联的顺序是~/.codex/config.toml→AGENTS.override.md→AGENTS.md→ 已配置的 skill 指令每个来源上限 32 KiB。团队可以在根目录AGENTS.md定规范个人在config.toml或AGENTS.override.md加偏好。3. 可复制配置观察 Agent Loop 每一步的 settings 片段光连上还不够你要能看见循环。Codex CLI 的日志和配置决定了你能观察到多少细节。这一节给出可直接复制的 settings 片段路径和字段都按实际文件来。先补全~/.codex/config.toml加上日志和压缩相关配置# ~/.codex/config.toml 续 [log] level debug file ~/.codex/logs/codex.log [context] auto_compact_limit 120000 compact_threshold 0.8log.level debug会把每次迭代的提示组装、工具调用、SSE 事件都写进日志文件。auto_compact_limit是触发上下文压缩的 token 阈值compact_threshold是压缩触发比例。这两个值调大能减少压缩次数但会占用更多上下文窗口。如果你用 Cline 或 Claude Code 这类工具配合 Codex CLIMCP 配置也要对齐。MCP 服务器配置写在config.toml里# ~/.codex/config.toml MCP 片段 [mcp_servers.local_tools] command npx args [-y, modelcontextprotocol/server-filesystem, /path/to/project]注意MCP 直连生产库是禁止的这里只连本地文件系统做演示。任何 MCP 服务器都要在沙箱和审批策略约束下运行。如果你用 Codex 的auth.json做认证某些版本支持它长这样{ provider: taotoken, base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, model: gpt-4o-mini }三件套在这里体现为base_urlapi_key_envmodel一个都不能少。文件路径通常是~/.codex/auth.json权限设成 600。审批策略也在config.toml里控制。三种模式模式行为适用场景auto默认工作目录内读写和命令自动执行外部访问需审批日常开发read-only只能浏览文件不能执行命令或写入审查陌生代码full-access不受限的机器和网络访问受控环境批量任务沙箱作用于整个进程树不只是直接子进程。macOS 用 App SandboxLinux 用 Landlock seccompWindows 用 job objects。这意味着工具调用派生的后台进程也逃不出策略边界。配好这些你就能在~/.codex/logs/codex.log里看到每次迭代的完整轨迹。下面用一次真实请求来验证。4. 验证请求跟着日志走一遍完整回合配置就绪后发一个真实任务然后对照日志看循环。我用一个修测试的场景项目里有个auth_test.go故意留了个空指针 bug让 Codex CLI 去修。在项目目录下启动codex fix the failing test in auth_test.go按下回车循环开始。打开另一个终端实时看日志tail -f ~/.codex/logs/codex.log你会看到类似这样的阶段划分。阶段一提示组装。日志里出现prompt_assembly字样列出系统消息、工具定义、指令来源、输入序列。指令来源会显示config.toml、AGENTS.md各贡献了多少字节。这一步把 JSON 载荷拼好准备发给 Responses API。阶段二模型推理。日志出现POST https://taotoken.net/api/responses然后是 SSE 事件流。关键事件类型有response.output_text.delta增量文本用于实时显示、response.output_item.added新的输出项比如工具调用、response.output_item.done单项完成、response.done回合结束。一次响应可能有多个 done 事件每个都要捕获并放进下一次迭代的输入。阶段三工具执行。模型发出function_call参数是cat auth_test.go。日志显示ToolRouter检查审批策略auto 模式允许读取于是在沙箱里派生命令捕获 stdout/stderr。文件内容被追加到对话历史。阶段四结果回填与下一轮。工具输出追加进提示进入下一次迭代。模型看到测试代码定位 bug发出文件编辑的function_call。编辑在沙箱内应用。再下一轮模型决定跑go test ./...验证。测试通过后模型发出 done 事件消息类似已修复 TestAuthToken 中的空指针检查所有测试通过。整个回合的迭代次数、每次的 token 数、缓存命中情况日志里都有。你可以用 grep 快速统计grep -c iteration ~/.codex/logs/codex.log grep cache_hit ~/.codex/logs/codex.log | tail -20如果一切正常你会看到迭代次数在个位数到十几次之间缓存命中率随迭代上升。这就是一次健康的 Agent Loop。想更直观地验证模型通道是否走通可以单独用模型对话页面发一条测试消息确认 Key 和 Base URL 没问题https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcodex_loop5. 常见报错排查401、local proxy failed、reading choices、OAuth循环跑不起来八成是通道或配置问题。这一节对照真实报错逐个拆。401 Unauthorized。最常见。日志里出现401加invalid api key。原因通常是环境变量没生效或者 Key 复制时带了空格。检查echo $TAOTOKEN_API_KEY如果为空说明 export 没在当前 shell 生效重新 source 一下配置文件。如果 Key 正确还报 401确认config.toml里env_key的名字和实际环境变量名完全一致大小写敏感。local proxy failed。日志出现local proxy failed或connection refused。这通常是 Base URL 写错或者本地网络到taotoken.net不通。先测连通性curl -I https://taotoken.net/api返回 200 或 401 都说明网络通返回超时就是网络问题。确认base_url是https://taotoken.net/api不要多加/v1或结尾斜杠路径不一致会导致代理层拒绝。reading choices 报错。类似error reading choices或unexpected response format。这多半是wire_api设错了。Codex CLI 用 Responses 风格如果你设成chat但端点只支持 responses或者反过来解析就会失败。把wire_api responses对齐再确认 Model ID 是端点支持的模型。OAuth 相关报错。如果你之前用 ChatGPT 登录方式认证日志里可能有OAuth token expired。Codex CLI 支持多种认证ChatGPT 登录走chatgpt.com/backend-api/codex/responsesAPI Key 走标准端点本地模型走localhost。切到 TaoToken 通道后确保没有残留的 OAuth 配置覆盖了model_provider。检查auth.json和config.toml是否冲突以config.toml的model_provider为准。卡在工具调用循环。模型反复调工具不收敛。先看AGENTS.md指令是否自相矛盾比如同时要求不要改测试和修复测试。把任务拆小加明确约束。压缩循环。日志里反复出现compact却没有进展。这是已知问题通常说明任务所需上下文超过压缩能保留的量。把任务拆成更小的部分或者调大auto_compact_limit。缓存未命中导致变慢。会话中途性能下降多半是前缀失效。避免在回合中途改工具列表、切模型、改沙箱设置或换工作目录这些都会让缓存前缀作废。排错时如果拿不准通道配置直接对照接入文档逐字段核对https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcodex_loop6. 把循环用顺长期编码与 Agent 场景的通道选择搞清楚 Agent Loop 之后你会发现它对通道的稳定性要求比普通对话高得多。一个回合几十次迭代每次都要重新发完整历史Codex 刻意保持无状态请求从不使用previous_response_id这是为了零数据保留合规。这意味着通道的延迟和限流会直接放大到整个回合。如果你只是偶尔跑几个小任务按第 2 节的配置用统一 Key 就够了。但如果你要长期跑编码 Agent、让 Codex CLI 在项目里持续干活建议用 Coding Plan 这类面向长会话的方案它在配额和稳定性上更适合高频迭代https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcodex_loop回到循环本身几个实用技巧。保持AGENTS.md稳定别频繁改这样提示缓存前缀能一直命中二次方成本被压成近似线性。任务拆小、聚焦收敛更快也少触发压缩。压缩是不可逆的原始工具输出会被永久删除所以重要中间结果及时落盘到文件别只留在对话里。最后养成看日志的习惯。~/.codex/logs/codex.log里的迭代次数、缓存命中、工具调用序列比任何猜测都准。循环在概念上就是查询、行动、重复但让它在大规模下跑得稳靠的是这些可观察、可复制的细节。