Skip to content

Codex 运行机制与工程优化:运行机制篇

分册导航: 本篇聚焦 Codex 的概念边界、Agent Loop、源码模块、工具、安全与状态机制;工程优化、项目实践、能力评测与选型见 Codex 运行机制与工程优化:工程实践篇

目录

1. 学习目标

  • 区分 Codex 模型、开源 Agent Runtime 与 CLI、IDE、Desktop App、Cloud 等产品形态;
  • 能从 Thread 创建、上下文装配、Responses API 推理、工具路由、审批与沙箱、Observation 回灌、压缩、验证和终止完整解释一次运行;
  • 能说明 OpenAI 官方 openai/codex 仓库的入口、核心 crate、协议、工具、安全、持久化和客户端文件分别负责什么;
  • 能说明普通业务项目中的 AGENTS.md.codex/config.toml、Rules、Skills、Hooks、MCP 与本机状态文件如何分工;
  • 能解释 Prompt Cache、Compaction、WebSocket、Tool Search、并行工具、Subagent、Worktree、容器缓存和 OpenTelemetry 分别优化什么;
  • 能把“为什么强”拆成模型、Harness、上下文、工具、验证、安全、恢复、并行和交互九个可测维度;
  • 能识别上下文压缩丢信息、错误完工、Prompt Injection、权限越界、工具结果过长、并行写冲突和外部副作用等风险;
  • 能在面试中区分官方文档事实、开源源码事实、合理推断与当前未知。

2. 面试结论

2.1 30 秒回答

Codex 本质上不是“一个会写代码的 GPT”,而是“面向工程任务优化的模型 + 开源 Rust Agent Runtime + 真实开发工具 + 受约束执行环境 + 状态与多端协作”的完整系统。它把用户目标转成连续的“取证、行动、观察、验证”循环:模型提出工具调用,Runtime 负责上下文、路由、审批、沙箱、执行和结果回灌,直到有证据地结束。它在终端型长任务、工具协调、并行隔离、开源可审计和本地到云端协同上很有竞争力,但“比所有工具强”并不成立,必须在同一仓库、版本、权限、预算和隐藏测试下比较。

2.2 一分钟复述版

我会把 Codex 分成六层。第一层是模型,负责理解目标、推理和选择候选动作;第二层是 Agent Loop,负责在模型与工具之间持续循环;第三层是 Context,把基础指令、权限说明、AGENTS.md、Skills、环境、历史和工具定义按生命周期装入;第四层是 Execution,通过 Shell、Patch、搜索、MCP、浏览器或其他扩展作用于真实环境;第五层是 Control,用 Approval、Sandbox、Rules、Network Policy 和 Managed Requirements 限制副作用;第六层是 State 与 Surface,用 Rollout、SQLite、Thread Protocol、App Server、CLI、IDE、App 和 Cloud 支持流式展示、恢复、分叉和并行。

Codex 的优化不是一个神秘 Prompt。模型层会按任务复杂度分配推理预算;Harness 通过稳定前缀利用 Prompt Cache,通过自动 Compaction延长任务,通过 Tool Search、Skill 渐进披露和 Subagent 隔离控制 Context;执行层用 Rust 模块、WebSocket、并行只读工具和云容器缓存降低延迟;控制层用 OS Sandbox、审批、Auto-review 与遥测提高安全自治时长。最终是否更强,仍要看任务更像本地长调试、云端异步 PR、IDE 补全,还是高风险确定性流程。

2.3 一句话技术判断

Codex 的核心竞争力,是把模型的概率性推理放进一个开源、可执行、可观察、可恢复且受权限约束的工程循环,并把同一套能力延伸到本地、IDE、App、Cloud 与 SDK。

3. 面试官为什么问

  • Agent 原理:是否知道模型只产生候选动作,Runtime 才负责执行、状态和终止;
  • 源码能力:能否从真实入口、协议、Session、Turn、ToolRouter 和 Sandbox 文件还原调用链;
  • Context Engineering:是否理解缓存、压缩、渐进披露、工具结果裁剪和子线程隔离的差别;
  • 工程能力:是否关注退出码、测试、Diff、重试、超时、并发、日志、恢复和成本;
  • 安全意识:是否知道 Prompt 指令、Approval、Rules、Sandbox、Network Policy 与服务端授权不是同一层;
  • 系统设计:是否能把开源 Core、App Server、SDK、多端客户端与 Cloud 环境分层;
  • 评测意识:是否会控制模型、版本、权限和预算,而不是用一次演示下结论;
  • 事实纪律:是否能在开源 CLI 和闭源 Cloud、IDE、Desktop App 之间划清证据边界。

4. 概念、边界与证据等级

4.1 Codex 到底指什么

“Codex”至少有三种不同含义:

对象负责什么可以从哪里验证
Codex 中使用的模型理解目标、代码推理、规划、工具选择和结果修正OpenAI 模型发布、System Card 与公开评测
Codex Agent RuntimeThread、Turn、Context、模型请求、工具、审批、沙箱、状态和事件流Apache-2.0 的 openai/codex Rust 源码
Codex 产品族CLI、IDE Extension、Desktop App、Cloud、SDK、App ServerOpenAI 产品文档;只有部分组件开源

OpenAI 对产品术语的公开说明把 Codex CLI、Codex Cloud 和 VS Code Extension 都归入 Codex 产品族;官方开源清单则明确 CLI、SDK 与 App Server 可审计,Cloud 服务端和 IDE Extension 并非完整开源实现。因此,本文能做源码级结论的是本地 Runtime 与公开接口,不能从 CLI 源码反推出所有托管实现。

来源定位: Unrolling the Codex agent loopCodex Open Source(访问日期:2026-07-11)。

4.2 它不是什么

  • 不是单独一个模型;同一模型放进不同 Harness,完成率、成本和安全边界都会变化;
  • 不是普通代码补全;它能搜索、编辑、运行、观察和继续决策;
  • 不是模型直接执行 Shell;模型只输出结构化动作,Runtime 决定能否、在哪里、以什么权限执行;
  • 不是一次 Tool Calling;工具结果会进入下一轮推理,形成长链路;
  • 不是“无限上下文”;Prompt Cache 不会删除内容,Compaction 也是有损压缩;
  • 不是绝对安全系统;Sandbox、审批、网络策略、外部服务授权仍各有边界;
  • 不是所有产品形态都开源;Cloud 调度、Desktop App 和 IDE 全部内部实现不能由 CLI 源码代替;
  • 不是确定性编译器;测试不完整、需求模糊或工具环境错误时,它仍可能错误完工。

4.3 四类证据必须分开

证据等级含义本文示例
官方文档事实OpenAI 产品文档、工程文章或 System Card 明确说明Responses API Agent Loop、Container Cache、Auto-review、OpenTelemetry
开源源码事实固定 Commit 中能定位到类型、函数、注释或测试run_turn 循环、ToolRouter、Rollout、Protocol
基于证据的推断多条公开事实支持,但没有公开因果实验模型、工具语义、Prompt 与 Runtime 联合迭代形成协同优势
当前无法确认没有足够公开证据完整训练数据、Reward 配比、Cloud 调度细节、各优化的单独增益

本文源码快照固定为 openai/codex@5c19155,提交时间为 2026-07-11。后续 main 的路径、类型和默认值可能变化。

4.4 “为什么更强”的正确问法

不要问“Codex 是否绝对最强”,而要先固定:

  1. 任务是 Inline Completion、跨模块修改、长调试、代码审查、Issue 到 PR,还是知识工作;
  2. 使用哪个模型、Reasoning Effort、版本和并发模式;
  3. 是否给予相同的 Shell、网络、浏览器、MCP、依赖和仓库指令;
  4. 预算按 Token、费用、墙钟时间、人工干预还是风险计算;
  5. 结果由最终文字、编译器、隐藏测试、安全扫描还是人工 Review 验收;
  6. 比较的是模型、开源 Harness、某个客户端,还是完整产品族。

这些变量不固定,“更强”只能是体验,不是工程结论。

4.5 小白直觉:隔离工位里的高级工程师

小林要修复支付系统的偶发退款错误。公司没有只给他一张“请修好”的纸,而是安排了一间隔离工位:

  1. 工单说明目标和范围;
  2. 项目手册告诉他架构、禁止事项和权威测试;
  3. 他先查现场、跑复现,再决定改哪块;
  4. 每次想用新工具,都要经过工位门禁和安全规则;
  5. 工具返回真实读数,他据此继续判断;
  6. 遇到可并行调查的问题,他把日志、数据库和前端分别交给同事;
  7. 每一步都写进工作日志,必要时恢复或从某个节点分叉;
  8. 最后不是小林口头说“修好了”,而是测试、Diff 和人工复核共同验收。
生活场景Codex 对应物技术作用
工单用户输入与验收条件定义目标和边界
小林的判断Codex 中的模型推理、规划和选择候选动作
隔离工位Codex Runtime 与 Sandbox提供工具并限制副作用
项目手册AGENTS.md注入项目事实、命令和约束
专项 RunbookSkill按需加载领域流程
工位门禁Approval、Rules、Network Policy裁决动作是否允许
工具读数Tool Result / Observation为下一轮决策提供真实证据
独立同事Subagent并行调查并隔离噪声 Context
工作日志Rollout、Event、Diff、Telemetry恢复、审计和排障
独立工位Worktree 或 Cloud Container隔离并行写入和依赖

回到专业机制:模型并不持有 Shell 权限,也不会在 API 请求之间自动保留完整世界状态;Runtime 负责重建 Context、执行动作、持久化轨迹和控制权限。

类比边界: 人类工程师能理解组织责任和隐含业务语义,模型只能基于输入、参数和工具结果近似判断。测试通过也只证明覆盖范围内的行为,不能自动证明安全、业务正确或远程副作用可恢复。

5. 运行机制与源码深度剖析

5.1 从聊天请求到 Agent Loop

一次 Codex 运行可以抽象为:

atπθ(ag,Ct),ot=E(at,Pt),Ct+1=M(Ct,at,ot)

其中:

  • g 是用户目标;
  • Ct 是第 t 次采样时模型可见的指令、历史、环境和工具;
  • πθ 是模型产生回答或工具动作的策略;
  • at 是候选回答、Shell、Patch、搜索、MCP、浏览器、委派等动作;
  • Pt 是 Approval、Sandbox、Rules、Network Policy 与组织约束;
  • E 是受策略限制的执行环境;
  • ot 是 stdout、stderr、退出码、Diff、拒绝原因或外部结果;
  • M 是追加、规范化、裁剪、压缩和持久化 Context 的 Runtime 逻辑。

这不是 OpenAI 的源码公式,而是对公开控制关系的准确抽象:模型提议,Runtime 裁决和执行,真实结果再影响模型。

固定快照中的 session/turn.rs 直接写明:每次采样后,模型要么请求函数调用,要么给出 Assistant Message;有工具调用就执行并把输出放进下一次采样,只有不再需要工具且没有待处理输入时,Turn 才能结束。

5.1.1 技术清单

技术点 ID技术点/环节类型采用方案链路职责版本/证据边界
TP-CODEX-CONTEXT指令、能力与长上下文治理运行时/配置AGENTS.md、Skill/Tool Search、Prompt Cache、Compaction 与 Steering合并稳定项目规则,按需加载能力,控制增长历史并支持长任务中途纠偏依据固定源码快照和官方文档;模型内部训练、产品端私有实现与未来协议变化不在本文证明范围
TP-CODEX-EXECUTION多端接入与工具执行Runtime/协议/基础设施Rust Core + 进程内/外部 App Server + Responses API + ToolRouter + Approval/Sandbox统一 Thread/Turn/Event 语义,把模型 Tool Call 路由到 Shell、Patch、MCP、浏览器和 SubagentCLI/Core/App Server 开源可核验;Desktop、IDE 与 Cloud 并非全部开源,外部工具仍需自有授权
TP-CODEX-RECOVERY轨迹、状态、并行与观测存储/版本控制/可观测组件Rollout JSONL + SQLite State + Git/Worktree + OpenTelemetry保存 Response Item、Thread 元数据、Diff、事件和遥测,支持 Resume/Fork、重放调查与并行 Writer 隔离Git 与 Rollout 不能回滚数据库、部署或消息;外部副作用必须使用幂等、对账和补偿

5.2 启动阶段:建立模型能工作的世界

初次采样前,Runtime 大致装配以下信息:

  1. 模型对应的基础指令;
  2. 当前 Sandbox、可写目录、网络和 Approval 说明;
  3. 用户级或客户端级 Developer Instructions;
  4. 从全局到项目根,再到当前目录合并的 AGENTS.md / AGENTS.override.md
  5. Skill 的名称、描述和路径;选中后再加载完整 SKILL.md
  6. 当前工作目录、Shell、平台和环境选择;
  7. 内置、MCP、Plugin、App 或 Dynamic Tool 的可见规格;
  8. Thread 历史、先前 Tool Result、当前用户输入和中途 Steering;
  9. 模型、Reasoning Effort、Collaboration Mode、权限配置和 Context Window 状态。

官方工程文章说明,Codex 把静态内容放在前面、动态内容追加在后面,以尽量保持 Exact-prefix Prompt Cache;项目指令默认总大小上限为 32 KiB,Skill 初始列表还有独立 Context 预算。

图:架构|Codex Runtime 的多端接入、执行与恢复组件边界

替代文本: 用户从 CLI、IDE、App 或 Cloud 提交目标,客户端通过 Core 或 App Server 创建 Thread;Context 装配基础指令、权限、项目规则、Skills、环境、历史和工具后请求 Responses API。模型返回文本或 Tool Call,ToolRouter 将调用交给审批和沙箱,再执行 Shell、Patch、MCP、浏览器等工具;Observation 回写历史并继续采样,直到验证完成或停止。Rollout、State、Diff 和 Telemetry 并行记录全过程。

图表加载中…

读图结论: Codex 的智能来自模型,但端到端完成能力来自 Runtime 把 Context、工具反馈、安全裁决、持久化和外部验证闭成一条可重复循环。

图中最重要的边界是:AGENTS.md 影响模型行为,Approval 和 Sandbox 才限制执行;Tool Result 是下一轮证据,最终消息只是结束候选,不是正确性的充分证明。

5.3 一轮执行的真实时序

以“修复一个失败测试”为例:

固定快照里,交互式 TUI 与非交互式 codex exec 都先启动同一套进程内 App Server。TUI 的 AppServerSessionapp-server-client 的有界强类型 Channel 提交 turn/start;只有 IDE、自研客户端等跨进程接入才在 stdio、WebSocket 或 Unix Socket 边界序列化 JSON。这样,热路径复用 App Server 的认证、Thread、审批和 Event 语义,同时避免本地 UI 与 Core 之间反复 JSON 编解码。

当前主链不是旧文档中的 Op::UserTurn,而是 turn/start → TurnRequestProcessor → core::Op::UserInput。它进入 CodexThread 的有界 Submission Queue,再由 submission_loop → RegularTask → run_turn 执行。因此,一轮真实时序是:

  1. TUI、codex exec 或外部客户端向 App Server 创建或恢复 Thread,并提交 turn/start
  2. App Server 把请求转换成 Op::UserInput,送入 CodexThread 的有界 Submission Queue;
  3. submission_loop 选择 RegularTask,建立本轮 Turn Context;
  4. Runtime 规范化历史,并在必要时预先 Compaction;
  5. 构建 Skills、Plugins、Connectors 与 Tool Specs;
  6. run_turn 通过 Responses API 的 SSE 或 WebSocket 流请求模型;
  7. 模型返回 Reasoning Summary、Assistant Message 或 Tool Call;
  8. ToolRouter 将 Response Item 解析成统一 Tool Call;
  9. Tool Orchestrator 检查 Approval、Network Approval、Sandbox 与安全升级;
  10. Handler 执行测试、读取文件、应用 Patch 或调用外部工具;
  11. stdout、stderr、退出码、拒绝或 Diff 被标准化为 Tool Result;
  12. Tool Result 写入 History,模型继续采样;
  13. 若达到 Context 阈值,Runtime 自动压缩后继续;
  14. 若无后续工具、无待处理输入且 Stop Hook 不要求继续,Turn 结束;
  15. Rollout、State、Event 和 Telemetry 保存可恢复轨迹。

图:技术调用流程|Codex 修复失败测试的一轮交互时序

替代文本: 用户请求经客户端进入 Session Turn;Turn 向模型发出包含历史与工具的流式请求,模型提出运行测试;ToolRouter 先经过审批与沙箱,再由 Shell 返回失败日志。失败结果写回历史后,模型读取代码、申请 Patch、再次测试;只有测试证据和范围审查足够时才结束。

图表加载中…

读图结论: App Server 统一接入和事件语义,Core 承担 Agent Loop;模型每次只决定下一步候选动作,真正使修复可靠的是“执行后得到失败或成功证据,再继续决定”的反馈链。

5.4 Thread、Turn、Step 与 Event 如何分工

概念主要职责工程意义
Thread一段可恢复、可分叉的长期工作上下文保存配置、历史、来源、父子关系和持久化路径
Turn一次用户输入触发的 Agent 工作包含若干模型采样与工具回路
Step Context某次采样和工具执行的不可变快照避免运行中配置漂移导致同一步状态不一致
Response Item消息、Reasoning、Tool Call、Tool Result、Compaction 等模型协议项统一模型与 Runtime 的数据形态
Submission / OpUI 或客户端提交给 Core 的操作用户输入、配置、停止、审批和其他控制
Event / EventMsgCore 发给 TUI、IDE、App Server 或 SDK 的结构化事件流式展示、审计、遥测和客户端解耦

当前源码中 codex_thread.rsCodexThread 定义为 Thread 双向消息流的通道;protocol.rs 维护共享操作与事件类型;session/turn.rs 承担主循环。

主 Thread 的一个 Turn 不能简单等同整个系统只做一件事:Subagent 会创建独立 Thread 并行工作,后台终端、Hook、MCP 和事件流也可能并行存在。正确理解是“每条 Thread 内要保持明确的活动 Turn 与历史边界,跨 Thread 再做协作”。

5.5 模型请求为什么既流式又保持状态可重建

Codex CLI 使用 Responses API。官方公开链路包括:

  • 发送 instructionstoolsinput
  • 通过 SSE 或 WebSocket 接收增量 Reasoning Summary、文本、Tool Call 和完成事件;
  • 把完成的 Response Item 与 Tool Result 追加到下一次请求;
  • 默认保持请求可重建,而不是完全依赖服务端隐式会话;
  • ZDR 场景可携带加密的 Reasoning 或 Compaction 内容,而不要求服务端保存原始会话数据。

源码中的 client.rs 负责模型请求、流式连接、压缩端点、重试与 Turn 级 Client Session;run_turn 会在同一 Turn 中复用 ModelClientSession,保留 WebSocket 和 Sticky Routing 状态。

5.6 ToolRouter:模型动作怎样变成真实执行

固定快照中的 Tool 链可分为五步:

  1. Tool Spec 规划:根据模型能力、配置、Skill、MCP、Plugin、Dynamic Tool 与 Multi-Agent 模式生成本轮可见工具;
  2. Response 解析:把 Function Call、Custom Tool Call 或 Tool Search 结果解析为统一 ToolCall
  3. Registry 查询:找到 Handler、是否允许并行、是否需要等待取消和工具可见性;
  4. Orchestrator 控制:处理审批、网络授权、Sandbox 首次执行与受控升级;
  5. Handler 执行:运行 Shell、Patch、搜索、MCP、图像、浏览器或 Subagent,并标准化输出。

关键源码:

Codex 可以并行执行标记为支持并行的调用,但不是“所有工具一起跑”。tools/parallel.rs 对支持并行的工具使用共享读锁,不支持并行的工具使用写锁,从而让搜索和独立检查并发,同时避免状态写入互相踩踏。

5.7 Approval、Rules 与 Sandbox 是三层,不是一层

控制面回答的问题典型实现不能替代什么
Approval Policy什么时候必须暂停并取得许可on-requestnever 等策略不能形成 OS 级隔离
Rules哪类命令允许、提示或禁止prefix_rule 与管理员限制不能识别所有运行时副作用
Sandbox进程技术上能访问哪些文件、网络和资源macOS Seatbelt、Linux 隔离、Windows Sandbox不能证明业务动作合理
Network Policy能连接哪些域名、方法、地址或 Socket代理、Allow/Deny、私网限制不能替代服务端 IAM
External Authorization外部系统允许谁做什么OAuth、Token Scope、RBAC、业务审批不由本地 Prompt 或 Git 恢复提供

Approval 和 Sandbox 协同的价值是:边界内的低风险动作连续执行,跨边界动作再询问,避免“每条命令都弹窗”与“完全放权”两种极端。

关键边界: Codex 提供的 Shell Sandbox 只直接约束它所执行的本地进程;MCP、App 或其他外部工具必须自己实现权限和审计,不能因为工具出现在 Codex 中就假设自动受同一 OS Sandbox 保护。

官方安全文章还介绍了 Auto-review:跨 Sandbox 的请求可交给独立 Reviewer Agent 判断风险和用户授权,低风险或已充分授权动作可以自动通过,高风险动作仍停止。它优化的是审批摩擦,不会自动扩大可写根目录、开放网络或取消保护路径。

5.8 Context 为什么不会无限膨胀

Codex 同时使用多种机制,职责不同:

机制主要解决什么不能解决什么
Exact-prefix Prompt Cache复用相同前缀的模型计算不减少 Context 内容,也不保证长期命中
Tool Result 裁剪与规范化限制超长 stdout、孤立调用和不兼容内容可能丢失低频但关键细节
Automatic Compaction用较小的继续工作状态替代长历史是有损压缩,不是无限无损记忆
Skill 渐进披露只在匹配任务时加载完整 Runbook依赖描述匹配,可能漏触发
Tool Search / Deferred Tool避免全部工具 Schema 常驻动态工具变化仍可能破坏 Cache
Subagent 隔离把高噪声探索留在独立 Thread增加 Token 和协调成本
AGENTS.md 分层让项目规则稳定、按目录生效不是权限系统,也受大小上限约束

官方 Agent Loop 文章说明,Cache 只有在 Prompt 前缀完全一致时才能命中。中途改变模型、工具集合、Sandbox、Approval 或工作目录都可能造成 Cache Miss;Codex 尽量通过在历史末尾追加变更消息,而不是修改早期内容,保持旧前缀稳定。

当 Token 超过阈值,Runtime 使用 /responses/compact 或本地兼容路径生成可继续的较小输入。源码中的 compact.rscontext_manager/Compaction Prompt 分别负责压缩流程、历史治理和 Handoff 要求。

5.9 持久化、恢复和分叉

Codex 的“记住”至少分成四层:

状态保存什么主要用途风险边界
Thread Rollout消息、工具调用、结果、事件与上下文记录Resume、Fork、审计和故障恢复体积可能增长,包含敏感上下文
SQLite / Thread StoreThread 元数据、索引、状态和派生信息列表、检索、归档与客户端恢复数据库损坏或索引漂移仍需恢复
Memory从合格历史中提取的跨任务辅助信息减少重复解释和召回经验不是权威规则源,可能陈旧
Git / Worktree代码、提交、分支和并行工作目录Patch 审查、回滚和 Writer 隔离不能撤销数据库、部署或消息发送

对应源码包括 rollout/state/thread-store/ 与 Memory 扩展。强制规则仍应放入版本化的 AGENTS.md、测试或策略,而不是只依赖 Memory。

5.10 Multi-Agent、App 与 Cloud 如何协同

Subagent 工作流会把独立调查放进不同 Thread:

  1. 主 Agent 识别可并行且边界清楚的子任务;
  2. 每个 Subagent 拥有独立模型和工具工作;
  3. 探索日志、堆栈和中间输出留在子 Thread;
  4. 主 Thread 接收摘要和证据;
  5. Desktop App、CLI 与 IDE 可显示和切换 Agent Thread;
  6. 多个 Writer 应通过 Worktree 或职责边界隔离;
  7. 主 Agent 负责整合、冲突处理和最终验收。

Subagent 能减少主 Context 污染并缩短墙钟时间,但会增加总 Token、协调和合并成本。当前官方文档说明本地 Codex 默认具备 Subagent 工作流,Desktop App 还面向多个 Agent 的并行监督。

Cloud 则把执行环境换成托管容器:克隆仓库、Checkout 任务分支、运行 Setup,再进入 Agent Loop。当前官方文档说明 Container State 最长缓存 12 小时;Setup、Maintenance、环境变量或 Secrets 变化会使缓存失效,Agent 阶段网络默认关闭但可配置。

5.11 OpenAI Codex 官方仓库的主要文件与用途

以下表格基于 openai/codex@5c19155,不是对未来 main 的永久承诺。

路径主要用途阅读建议
README.md项目入口、安装与官方文档导航先确认产品与开源边界
AGENTS.md官方仓库自身的开发与协作规则贡献前必读
codex-cli/package.json@openai/codex npm 包元信息不是核心 Runtime
codex-cli/bin/codex.js按 OS/CPU 找到原生 Rust 二进制并转发参数和信号理解 npm 只是分发薄层
codex-rs/Cargo.tomlRust Workspace、crate 与共享依赖看全局模块边界
codex-rs/cli/src/main.rs原生命令入口,分发 TUI、Exec、Review、Login、MCP、App Server、Sandbox、Cloud 等命令从入口追主链
codex-rs/tui/终端交互 UI、消息、Diff、审批、模型和 Agent 状态UI 层,不承担核心决策
codex-rs/exec/codex exec 非交互模式、脚本/CI 与 JSONL 输出自动化入口
codex-rs/app-server-client/TUI 与 Exec 共用的进程内 App Server Client,以有界强类型 Channel 传输请求、响应和通知看本地热路径如何避免 JSON 往返
codex-rs/core/Thread、Turn、Context、模型、工具、安全、MCP、Skill、Hook、Diff 和 Compaction核心事实源
core/src/thread_manager.rs创建、恢复、Fork 和管理内存 Thread看生命周期入口
core/src/codex_thread.rsThread 双向操作/Event 通道、配置快照和持久化桥看客户端与 Core 边界
core/src/session/session.rsSession 状态、服务集合、配置与活动任务看运行状态聚合
core/src/session/mod.rsSession 模块入口、共享类型和任务装配从模块边界进入 Session 主链
core/src/session/handlers.rs消费 Submission,运行 submission_loop 并分派用户操作Op::UserInput 怎样进入任务
core/src/tasks/regular.rs普通用户 Turn 的任务实现,衔接 Session 与 run_turn看常规任务而非专项任务
core/src/session/turn.rs主 Agent Loop、采样、工具反馈、压缩与停止条件最关键文件
core/src/client.rsResponses API、流式连接、Compaction API、预热和重试看模型 I/O
codex-rs/codex-api/codex-client/Responses API 数据类型、请求构造和底层传输客户端区分模型协议与 Core 编排
core/src/context_manager/历史规范化、裁剪和 Token 估算看 Context 治理
core/src/compact.rs手动/自动、Turn 前/Turn 中、Local/Remote Compaction看长会话续航
core/src/agents_md.rs发现与组合项目指令看目录作用域
core/src/tools/Tool Spec、Registry、Router、并行、审批和 Handler看动作执行主链
codex-rs/protocol/Thread、Turn、Item、Approval、Permission、Tool 和 Model 共享类型看跨客户端契约
codex-rs/app-server/面向 IDE/富客户端的 JSON-RPC 服务,提供认证、历史、审批和流式事件深度嵌入入口
codex-rs/app-server-protocol/App Server 消息 Schema 与版本协议客户端生成/兼容
codex-rs/app-server-transport/stdio、WebSocket、Unix Socket 等跨进程传输边界JSON 序列化主要发生在这里
codex-rs/rollout/JSONL 轨迹记录、读取、压缩、归档和状态桥恢复与审计
codex-rs/state/本地 SQLite 状态与查询元数据和索引
codex-rs/thread-store/Thread 持久化抽象与本地实现解耦 Runtime 与存储
codex-rs/sandboxing/跨平台 Sandbox Policy 抽象看统一安全模型
codex-rs/bwrap/linux-sandbox/windows-sandbox-rs/Linux/WSL 与 Windows 具体隔离后端看平台差异
codex-rs/execpolicy/Starlark prefix_rule 决策看命令策略
codex-rs/network-proxy/Sandbox 网络代理与目标策略看网络边界
codex-rs/rmcp-client/Codex 作为 MCP Client 连接外部工具外部能力入口
codex-rs/mcp-server/Codex 作为 MCP Server 被其他客户端调用反向嵌入入口
codex-rs/skills/plugin/Skill 发现、加载与 Plugin 分发渐进披露与复用
codex-rs/features/Feature Flag、默认状态与能力成熟度区分 Stable、实验和开发中能力
codex-rs/otel/OpenTelemetry Logs、Metrics 与 Traces生产可观测性
codex-rs/cloud-tasks/CLI 侧查看和拉取 Cloud Task 的客户端逻辑不代表 Cloud 服务端源码
sdk/typescript/sdk/python/程序化启动、恢复和驱动 Codex Thread自动化优先入口
docs/仓库构建、贡献、安全和兼容文档产品能力以 Learn 文档为准

图:Codex 开源 Runtime 的主要模块关系

替代文本: CLI 分发到 TUI 或 codex exec,两者通过进程内 App Server Client 的有界强类型 Channel 进入 App Server;IDE、SDK 或自研客户端经 stdio、WebSocket 或 Unix Socket 进入同一服务。App Server 把请求转为 Core Operation,经 Protocol、Thread Manager、Submission Queue、Session 与 Turn 进入 Context Manager 和 Model Client;模型动作再由 Tool Spec、Router、Registry、Orchestrator、安全边界和 Handler 执行。Rollout、State、Thread Store 与 OpenTelemetry 横向记录状态。

图表加载中…

读图结论: 当前 TUI 与 codex exec 也复用 App Server,只是本地热路径走强类型 Channel;多个客户端共享的不是一堆复制 Prompt,而是 App Server、Protocol、Core、Tool 和 State 原语。

5.12 普通项目接入 Codex 时的主要文件

这一节回答另一个常见歧义:不是 Codex 源码仓库,而是“我的业务项目里哪些文件会影响 Codex”。

文件或目录主要用途加载时机与优先级是否建议提交 Git安全边界
AGENTS.md团队架构、命令、代码风格、验证和业务边界从项目根到当前目录合并,越近越晚出现是,适合团队共享只是模型指令,不是 IAM
AGENTS.override.md在某一层覆盖普通项目指令同目录优先于 AGENTS.md团队覆盖可提交;个人覆盖谨慎仍受总大小和 Prompt 遵循边界
.codex/config.toml项目模型、Approval、Sandbox、MCP、Hooks 等允许的项目级配置只有 Trusted Project 才加载;离当前目录更近的层优先可提交无秘密的团队配置某些 Provider、Auth、Telemetry 键不能由项目覆盖
.codex/rules/*.rules控制 Sandbox 外命令的 Allow、Prompt 或 Forbidden 决策启动时扫描 Active Config Layer;当前仍属实验能力可提交团队规则与内联匹配测试不能替代 OS Sandbox 和外部 RBAC
.agents/skills/{name}/SKILL.md按需加载的工作流、知识和执行说明启动先放名称/描述/路径,选中后读全文是,适合团队 Runbook脚本仍需审批、Sandbox 和代码审查
.agents/skills/{name}/scripts/复用确定性命令或转换逻辑Skill 指示时执行是,但要测试和审计不写秘密,不把危险动作藏在脚本中
.agents/skills/{name}/references/assets/延迟读取资料、模板和资源Skill 需要时读取避免把敏感大文件放进仓库
Hook 脚本与 .codex/config.toml 的 Hooks 配置生命周期校验、日志过滤、通知和确定性门禁对应事件发生时可提交稳定脚本Hook 失败策略和超时必须明确
项目自身的 Makefilepackage.jsonjustfilescripts/权威构建、测试、Lint、迁移和验收入口Codex 读取或调用时原本就应版本化这些命令才是可执行事实源
.gitignore阻止凭据、私有配置和运行状态误提交Git 层应覆盖本地秘密与临时产物

本机或管理员范围的文件不要和项目事实混在一起:

本机或管理文件用途Git 建议
~/.codex/config.toml用户默认模型、Provider、Approval、Sandbox、MCP、Telemetry 等不提交
~/.codex/{profile}.config.toml可切换 Profile不提交,除非作为脱敏示例
~/.codex/rules/*.rules个人长期命令规则不提交到业务仓库
requirements.toml管理员强制约束用户不能覆盖的安全设置由组织管理,不当普通项目偏好
$CODEX_HOME/sessions/...Rollout JSONL 与 Thread 历史不提交,按敏感数据治理
$CODEX_HOME 下 SQLite、Logs、History本地 Thread 索引、状态、日志和输入历史不提交
Auth 与 MCP OAuth 凭据或 OS Keyring登录与外部工具授权绝不提交

配置优先级: CLI Flags 与一次性 Overrides 最高,其次是从项目根到当前目录的 Trusted .codex/config.toml,再是选中的 Profile、用户配置、系统配置和内置默认值;管理员 requirements.toml 作为不可被用户放宽的约束参与最终裁决。

最容易踩的坑是把所有内容都塞进 AGENTS.md。正确分层是:每轮都需要的事实进入 AGENTS.md,偶用流程进入 Skill,确定性命令进入脚本,工具连接进入 Config/MCP,安全边界进入 Approval、Rules、Sandbox 与外部授权,运行轨迹留在本机 State。

5.13 Rules 与 Skills:先消除同名歧义

“Rules 是每次请求都携带的边界提示词,Skill 是命中后才加载的方法和步骤”这个理解方向基本正确,但在 Codex 中需要拆成三层,否则容易把同名概念混在一起:

层次典型载体何时生效或加载主要内容不能替代什么
持久行为指令System / Developer Instructions、AGENTS.mdSystem 与 Developer Instructions 由宿主注入;Codex 在每次 Run 或 TUI Session 启动时构建一次 AGENTS.md 指令链,并在其目录作用域内持续适用项目事实、必须/禁止事项、代码规范、验证要求和协作边界不能替代 Sandbox、IAM、RBAC 或程序化校验
Codex 命令 Rules.codex/rules/*.rules~/.codex/rules/*.rules启动时扫描;准备在 Sandbox 外执行命令时,根据参数前缀匹配 allowpromptforbidden命令执行策略和内联匹配测试不是通用 Prompt,也不能表达完整业务工作流
按需 SkillSKILL.mdscripts/references/assets/初始只暴露名称、描述和路径;用户显式调用,或任务语义匹配描述后,才读取完整 SKILL.md 和必要资源可复用方法、步骤、模板、脚本、检查清单和领域知识不能作为不可绕过的安全策略,也不能保证一定被隐式命中

因此,“Skill 命中才加载”还要再精确一步:Skill 的发现元数据会先进入初始 Context,完整正文和资源才按需加载。 Skill 可以通过用户显式指定触发,也可以由 Codex 根据 description 隐式选择;描述写得模糊会漏触发或误触发。被选中后,Skill 中的步骤是当前任务应遵循的执行说明,并不只是可有可无的参考建议。

“Rules 每次请求都携带”也不宜理解成网络层一定在每次底层 API 调用中原样重复传输。对 AGENTS.md 更准确的说法是:Codex 每次 Run 或 TUI Session 启动时,从全局到当前目录构建一次指令链,使其成为当前作用域的持续上下文;具体产品可能通过会话状态或缓存复用稳定前缀。对 Codex 的 .rules 而言,它甚至不是模型 Prompt,而是命令执行前的策略判断。

工程上可以用下面三条判断:

  1. 删除后会让多数相关任务失去共同边界、项目事实或验收标准,放入 AGENTS.md 等持久指令;
  2. 只在某类任务出现时才需要,并且能写成可复用 Runbook,放入 Skill;
  3. 必须确定性地允许、询问或阻止某类外部命令,放入 Codex .rules,并继续由 Sandbox 和外部权限兜底。

复杂项目常用“薄规则 + 厚 Skill”:持久指令只写“什么场景必须使用哪个 Skill、最终必须满足什么验收”,详细步骤、脚本和参考资料留在 Skill 中。这样既保证关键边界常驻,又避免每个任务都为偶用流程支付完整 Context 成本。

来源定位: Custom instructions with AGENTS.mdRulesBuild skills(访问日期:2026-08-20)。

继续阅读: 完成运行机制后,进入 工程实践篇,继续学习 Context、性能、安全自治、并行、故障演练与评测选型。

总结

一句话记忆: Codex 运行机制的本质,是由开源 Rust Runtime 把模型提出的候选动作组织成可执行、受约束、可观察、可恢复的 Agent Loop。

  • 模型负责推理和提出动作,Runtime 负责 Context、工具路由、权限裁决、执行、结果回灌与终止;
  • Thread、Turn、Response Item、Submission 和 Event 分别承载长期状态、单轮工作、协议数据、客户端操作与流式反馈;
  • ToolRouter、Registry、Orchestrator 和 Handler 将模型输出转换为真实工具执行,并通过 Approval、Rules、Sandbox 与外部授权限制副作用;
  • Prompt Cache、Compaction、Skill、Tool Search 和 Subagent 解决的是不同层次的 Context 成本与长任务续航问题;
  • Rollout、SQLite State、Git/Worktree 和外部验证共同提供恢复与审计证据,但不能把测试通过等同于生产业务正确。