/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
OpenAI Codex CLI 深度技术分析报告
项目:openai/codex — Lightweight coding agent that runs in your terminal
仓库:https://github.com/openai/codex
分析日期:2026-08-29
License:Apache 2.0
00. Executive Summary
OpenAI Codex CLI 是一个用 Rust 编写的本地终端 Coding Agent,本质上是"模型层 + 宿主层(Harness)+ 沙箱层"三件套。它解决的核心问题是:如何让 LLM 在开发者本地文件系统上安全地完成多步代码任务(读文件 → 编辑 → 跑测试 → 修 lint → 提交),同时把 Agent 的"自主性"和"安全性"通过操作系统级 sandbox + 显式 approval 流程绑定在一起。
技术上,它不是又一个 LangChain Wrapper。
它的核心壁垒是三层:
一是 Rust 重写带来的零依赖安装与 OS 级 sandbox 原生绑定(macOS Seatbelt / Linux Landlock+seccomp / Windows Job Objects);
二是 Event-Driven 双通道协议;
三是 App Server + JSON-RPC 多 surface 复用架构(CLI、VS Code、Desktop、Web 共享同一个 Codex Core)。
模型本身是 GPT-5.x-Codex 系列,但真正的工程复杂度在于围绕模型构建的 Harness(prompt 组装、context compaction、prefix caching、审批流、sandbox 策略),这一点 OpenAI 团队自己也承认。
最大优势:safety-by-default + 多 surface 一致性 + 极致 token 效率(同等任务比 Claude Code 省 2-3x tokens)。
最大缺陷:Agent Loop 的长链路连贯性弱于 Claude Code(SWE-bench Verified 上 77.3% vs 80.8%),第三方评测普遍反映 Codex 在 3-4 步以上任务会"丢失方向感"。
工程成熟度:Developer Ready 向 Production Ready 过渡中,10,006 commits、640+ tagged releases、约 400 contributors,内部最高每天发 3-4 个版本,有完善的 Bazel + 三平台 CI,但 codex-core 单 crate 已被官方自己标记为"bloated"。
适合:本地个人/小团队高频日常编码、CI/CD 集成、企业内部需要严格控制文件/网络访问的场景。不适合:需要长链路自主规划的重构任务(此场景 Claude Code 更稳)、完全离线场景(强依赖 OpenAI Responses API,虽然可以通过 OpenAI-compatible endpoint 接本地模型但生态支持一般)。
是否值得学习:强烈值得。它是目前开源界最完整的"生产级 Agent Harness"参考实现。
是否值得二次开发:条件性值得。适合 fork 出做内部 Coding Agent(替换 model provider、加企业治理),不适合做通用 Agent Framework。
是否适合生产:个人/团队场景 Yes,企业场景需要补 RBAC / Audit / Multi-tenancy。
| 技术创新 | 9/10 |
| 架构设计 | 8/10 |
| AI 能力 | 8/10 |
| 工程质量 | 9/10 |
| 可扩展性 | 7/10 |
| 可维护性 | 6/10 |
| 文档质量 | 7/10 |
| 测试完整度 | 7/10 |
| 生产成熟度 | 7/10 |
| 二次开发价值 | 7/10 |
| 开源价值 | 9/10 |
| 综合 | 7.8/10 |
01. Project Positioning
1.1 项目一句话定义
一个用 Rust 编写、运行在开发者本地终端的 Safety-First Coding Agent,通过 OS 级 sandbox、双通道事件协议和可插拔 Model Provider,把 LLM 的代码生成能力绑定在受控的本地文件系统操作之上。
1.2 项目解决的问题
| 用户痛点 | 现有 AI Coding 工具(Copilot)是补全式的,不能自主执行"读-改-测-提交"闭环;ChatGPT 网页版没有本地文件系统访问 |
| 技术问题 | LLM 输出不可靠,直接 shell 执行有安全风险;上下文超过 token 限制后任务失败 |
| 工程问题 | 多 IDE / CLI / Web 多端复用同一个 Agent 逻辑,不希望每个 surface 重写一遍 |
| 业务问题 | 企业担心 Agent 执行 rm -rf / 网络外发;需要默认安全的 sandbox |
| Codex 团队对此的回答是**"aSWE(Autonomous Software Engineer)"愿景**——2024 年秋由 Greg Brockman 与 Sam Altman 亲自立项,目标不是补全工具,而是"坐在工程师旁边"的自治 SWE。 |
1.3 Target Users
- 个人开发者(主力):在终端里写代码,需要 quick iteration
- 企业工程师:需要 audit + sandbox + 内部 model endpoint 接入
- Agent 框架研究者:学习如何构建 production-grade Agent Harness
- 第三方 IDE 厂商(Xcode、JetBrains):通过 App Server JSON-RPC 协议集成
1.4 Use Cases
1.5 Project Boundary
Codex 做什么:本地 Coding Agent 的全部 Harness(sandbox、approval、prompt 组装、context 管理、tool 调度、协议层)。
Codex 明确不做什么:
- 不做 Cloud Agent(Codex Web / Codex Cloud 是另一个闭源产品)
- 不做 IDE 插件本身(VS Code / JetBrains 扩展是独立仓库)
- 不做 Model Training(GPT-5.x-Codex 是闭源模型,通过 Responses API 调用)
- 不支持图像输入(截至 v0.150 仍不支持,这是 ByteByteGo 报道时明确指出的限制)
- 不实现 RAG Pipeline(它不是 RAG 项目,是 Agent 项目)
02. Project Evolution
| 创建时间 | 2025-04 (公开), 内部 2024 秋立项 | |
| Stars | 109K–120K(不同时点) | |
| Forks | 17.3K–18.3K | |
| Contributors | ~400 | |
| Commits | 10,006 (main) | |
| Tagged Releases | 640+ | |
| 最新版本 | v0.150.x (2026-08) | |
| 发布节奏 | 内部 3-4 次/天,外部每 2-3 天 | |
| 主语言 | Rust (95.6%),TypeScript 仅遗留 | |
| 关键演进节点: |
状态判断: Active — 不是 Demo,也不是 Maintenance,是高频演进的活跃项目。但官方在 AGENTS.md 中明确写"codex-core crate is bloated, resist adding code to codex-core",说明主 crate 正在承受快速迭代带来的复杂度压力。
03. Repository Structure
基于 GitHub main 分支实际目录结构:
openai/codex/
├── codex-rs/ # Rust 主代码库 (~95.6%)
│ ├── core/ # codex-core: Agent Loop / Session / Codex 主体
│ │ ├── src/
│ │ │ ├── codex.rs # TurnContext、核心 Codex 结构
│ │ │ ├── context/ # ContextualUserFragment trait 及实现
│ │ │ ├── tools/ # 工具执行
│ │ │ ├── suite/ # Integration tests
│ │ │ └── config.rs
│ │ └── config.schema.json # 由 just write-config-schema 生成
│ ├── tui/ # codex-tui: Ratatui 终端 UI
│ │ └── src/
│ │ ├── app.rs # 主事件循环
│ │ ├── chatwidget.rs # 聊天组件(orchestration)
│ │ └── bottom_pane/ # chat_composer / footer
│ ├── tui2/ # tui 重构版,main.rs 在这里
│ ├── protocol/ # codex-protocol: Op / Event 枚举
│ │ └── src/protocol.rs # Op::UserInput/ExecApproval/… 定义
│ ├── mcp/ # codex-mcp: MCP 集成
│ │ └── src/mcp_connection_manager.rs
│ ├── exec/ # codex exec 非 interactive 模式
│ ├── app-server/ # JSON-RPC over stdio,IDE 集成入口
│ ├── sandbox/ # sandbox 策略 (Seatbelt/Landlock/Job Objects)
│ ├── apply-patch/ # patch 解析与应用
│ └── … (40+ crates)
├── codex-cli/ # 遗留 TypeScript CLI (maintenance)
├── sdk/ # Codex SDK (TypeScript,多 surface 集成)
├── docs/ # 项目内 docs(仅 app-server API,不放产品文档)
├── .github/ # CI workflows (三平台)
├── .devcontainer/
├── bazel/ # Bazel 构建配置
├── scripts/
├── AGENTS.md # 项目自身的 Agent 指令(Rust 规范)
├── CHANGELOG.md
└── README.md
| codex-rs/core | Agent Loop、Session、TurnContext、Context 管理 | High |
| codex-rs/tui + tui2 | Ratatui 终端 UI、事件循环、ChatWidget | High |
| codex-rs/protocol | Op / ResponseEvent 枚举,客户端/服务端共享类型 | High |
| codex-rs/app-server | JSON-RPC over stdio 协议服务,VS Code / Desktop 入口 | High |
| codex-rs/mcp | MCP client 与 tool 调度 | High |
| codex-rs/sandbox | Seatbelt / Landlock / Job Objects 策略实现 | High |
| codex-rs/apply-patch | 把 LLM 输出的 patch 应用到文件系统 | Medium |
| codex-rs/exec | 非 interactive headless 模式(CI 用) | Medium |
| sdk/ | 第三方/TypeScript SDK | Medium |
| codex-cli/ | 遗留 TS 实现,已 maintenance | Low |
| docs/ | 仅 app-server API,产品文档在外 | Low |
| .github/ | CI(3 平台)、release automation | High |
04. Architecture Deep Dive
4.1 System Architecture
实际架构与模板中"Orchestrator → Agent → Tools → RAG → LLM"流不同。 Codex 没有 RAG 层,核心是 “Client Surface → App Server (JSON-RPC) → Codex Core (Agent Loop) → Model Provider / Tool Executor / Sandbox”:
#mermaid-svg-yyDivpMfqInPgh5m{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-yyDivpMfqInPgh5m .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-yyDivpMfqInPgh5m .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-yyDivpMfqInPgh5m .error-icon{fill:#552222;}#mermaid-svg-yyDivpMfqInPgh5m .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-yyDivpMfqInPgh5m .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-yyDivpMfqInPgh5m .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-yyDivpMfqInPgh5m .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-yyDivpMfqInPgh5m .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-yyDivpMfqInPgh5m .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-yyDivpMfqInPgh5m .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-yyDivpMfqInPgh5m .marker{fill:#333333;stroke:#333333;}#mermaid-svg-yyDivpMfqInPgh5m .marker.cross{stroke:#333333;}#mermaid-svg-yyDivpMfqInPgh5m svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-yyDivpMfqInPgh5m p{margin:0;}#mermaid-svg-yyDivpMfqInPgh5m .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-yyDivpMfqInPgh5m .cluster-label text{fill:#333;}#mermaid-svg-yyDivpMfqInPgh5m .cluster-label span{color:#333;}#mermaid-svg-yyDivpMfqInPgh5m .cluster-label span p{background-color:transparent;}#mermaid-svg-yyDivpMfqInPgh5m .label text,#mermaid-svg-yyDivpMfqInPgh5m span{fill:#333;color:#333;}#mermaid-svg-yyDivpMfqInPgh5m .node rect,#mermaid-svg-yyDivpMfqInPgh5m .node circle,#mermaid-svg-yyDivpMfqInPgh5m .node ellipse,#mermaid-svg-yyDivpMfqInPgh5m .node polygon,#mermaid-svg-yyDivpMfqInPgh5m .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-yyDivpMfqInPgh5m .rough-node .label text,#mermaid-svg-yyDivpMfqInPgh5m .node .label text,#mermaid-svg-yyDivpMfqInPgh5m .image-shape .label,#mermaid-svg-yyDivpMfqInPgh5m .icon-shape .label{text-anchor:middle;}#mermaid-svg-yyDivpMfqInPgh5m .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-yyDivpMfqInPgh5m .rough-node .label,#mermaid-svg-yyDivpMfqInPgh5m .node .label,#mermaid-svg-yyDivpMfqInPgh5m .image-shape .label,#mermaid-svg-yyDivpMfqInPgh5m .icon-shape .label{text-align:center;}#mermaid-svg-yyDivpMfqInPgh5m .node.clickable{cursor:pointer;}#mermaid-svg-yyDivpMfqInPgh5m .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-yyDivpMfqInPgh5m .arrowheadPath{fill:#333333;}#mermaid-svg-yyDivpMfqInPgh5m .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-yyDivpMfqInPgh5m .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-yyDivpMfqInPgh5m .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-yyDivpMfqInPgh5m .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-yyDivpMfqInPgh5m .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-yyDivpMfqInPgh5m .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-yyDivpMfqInPgh5m .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-yyDivpMfqInPgh5m .cluster text{fill:#333;}#mermaid-svg-yyDivpMfqInPgh5m .cluster span{color:#333;}#mermaid-svg-yyDivpMfqInPgh5m div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-yyDivpMfqInPgh5m .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-yyDivpMfqInPgh5m rect.text{fill:none;stroke-width:0;}#mermaid-svg-yyDivpMfqInPgh5m .icon-shape,#mermaid-svg-yyDivpMfqInPgh5m .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-yyDivpMfqInPgh5m .icon-shape p,#mermaid-svg-yyDivpMfqInPgh5m .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-yyDivpMfqInPgh5m .icon-shape .label rect,#mermaid-svg-yyDivpMfqInPgh5m .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-yyDivpMfqInPgh5m .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-yyDivpMfqInPgh5m .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-yyDivpMfqInPgh5m :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Model Provider
Sandbox Layer
Tool Layer
Codex Core (codex-rs/core)
App Server Layer
Client Surfaces
Op / Event 双通道
tool_call
result
next turn
TUI Terminalcodex-tui
VS Code Extension
Desktop App
Web App
SDK / 3rd party
App ServerJSON-RPC over stdio/HTTP
submission_loopOp channel consumer
run_turn / run_model_turn
try_run_turn+ exponential backoff
Context Builder+ Compaction
Tool Executor
Approval Policy Engine
shell tool
file read/patch
MCP Client→ External MCP Servers
Skills progressive disclosure
macOS Seatbelt
Linux Landlock+seccomp
Windows Job Objects
OpenAI Responses APIGPT-5.x-Codex
OpenAI-compatiblecustom providers
4.2 Component Architecture
| Submission Loop | codex-rs/core submission_loop | 永续循环,消费 Op channel,直到 Op::Shutdown |
| Turn Runner | run_turn → run_model_turn → try_run_turn | 单 turn 内:构建 prompt → 推理 → 处理流式事件 → tool 执行 |
| TurnContext | struct | 持有 client、cwd、approval_policy、sandbox_policy、tools_config |
| Protocol Types | codex-protocol::Op | UserInput/UserTurn/Interrupt/ExecApproval/PatchApproval/Compact/ListSkills/Shutdown |
| App Server | JSON-RPC over stdio | 多 surface 统一协议,双向:client → server 起任务,server → client 请求审批 |
4.3 Data Flow (一个请求进来后发生什么)
SandboxTool ExecutorResponses APIContext Buildersubmission_loopUser (TUI)SandboxTool ExecutorResponses APIContext Buildersubmission_loopUser (TUI)#mermaid-svg-nAe0dbLWalxvGx0N{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nAe0dbLWalxvGx0N .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nAe0dbLWalxvGx0N .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nAe0dbLWalxvGx0N .error-icon{fill:#552222;}#mermaid-svg-nAe0dbLWalxvGx0N .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nAe0dbLWalxvGx0N .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nAe0dbLWalxvGx0N .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nAe0dbLWalxvGx0N .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nAe0dbLWalxvGx0N .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nAe0dbLWalxvGx0N .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nAe0dbLWalxvGx0N .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nAe0dbLWalxvGx0N .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nAe0dbLWalxvGx0N .marker.cross{stroke:#333333;}#mermaid-svg-nAe0dbLWalxvGx0N svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nAe0dbLWalxvGx0N p{margin:0;}#mermaid-svg-nAe0dbLWalxvGx0N .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nAe0dbLWalxvGx0N text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-nAe0dbLWalxvGx0N .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-nAe0dbLWalxvGx0N .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-nAe0dbLWalxvGx0N .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-nAe0dbLWalxvGx0N .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-nAe0dbLWalxvGx0N #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-nAe0dbLWalxvGx0N .sequenceNumber{fill:white;}#mermaid-svg-nAe0dbLWalxvGx0N #sequencenumber{fill:#333;}#mermaid-svg-nAe0dbLWalxvGx0N #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-nAe0dbLWalxvGx0N .messageText{fill:#333;stroke:none;}#mermaid-svg-nAe0dbLWalxvGx0N .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nAe0dbLWalxvGx0N .labelText,#mermaid-svg-nAe0dbLWalxvGx0N .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-nAe0dbLWalxvGx0N .loopText,#mermaid-svg-nAe0dbLWalxvGx0N .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-nAe0dbLWalxvGx0N .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-nAe0dbLWalxvGx0N .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-nAe0dbLWalxvGx0N .noteText,#mermaid-svg-nAe0dbLWalxvGx0N .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-nAe0dbLWalxvGx0N .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nAe0dbLWalxvGx0N .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nAe0dbLWalxvGx0N .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nAe0dbLWalxvGx0N .actorPopupMenu{position:absolute;}#mermaid-svg-nAe0dbLWalxvGx0N .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-nAe0dbLWalxvGx0N .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nAe0dbLWalxvGx0N .actor-man circle,#mermaid-svg-nAe0dbLWalxvGx0N line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-nAe0dbLWalxvGx0N :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}alt[is tool_call][is final message]Op::UserInput(text)handlers::user_input_or_turn组装 prompt = system + AGENTS.md+ tools + skills metadata + envPOST /v1/responses (stream)ResponseEvent::OutputItemDoneexecutespawn in sandboxexit code / stdouttool resultappend result, next turnneeds_follow_up=false
4.4 Control Flow
- 终止条件: needs_follow_up = false(LLM 返回非 tool_call 的最终 message)
- 循环上限: 没有硬编码 max iterations,靠 token 预算与 compaction 控制(见 §5.3 风险)
- 审批中断: Tool 调用触发 Op::ExecApproval,turn 暂停直到用户 allow/deny
- 失败恢复: try_run_turn 失败 → run_model_turn 用 exponential backoff 重试(针对 stream 连接错误)
4.5 Dependency Graph
codex-tui ──┐
codex-exec ─┼──> codex-core ──> codex-protocol
app-server ─┘ │
├──> codex-sandbox (Seatbelt/Landlock/JobObjects)
├──> codex-mcp ──> External MCP servers
├──> codex-apply-patch
└──> Model Provider (Responses API / OpenAI-compatible)
4.6 Runtime Lifecycle
完整源码位置:codex-rs/tui2/src/main.rs → run_main → App::run
05. AI Architecture
5.1 LLM Layer
| Model Provider | OpenAI Responses API 独占(Chat Completions 已 deprecate) | ByteByteGo + Unsloth 文档 |
| Provider 抽象 | [model_providers.<id>] TOML 块,base_url 必填,支持 OpenAI-compatible 网关 / LM Studio / 本地 llama.cpp | |
| Wire API | 每个 provider 单独指定 wire_api(目前基本只有 responses) | |
| Streaming | ResponseEvent 流式回传,通过 unbounded_channel 推到 TUI | |
| Function/Tool Calling | 模型返回 OutputItemDone,判断是否 tool_call | |
| Retry | run_model_turn 包 try_run_turn,对 stream 错误 exponential backoff | |
| Token Management | Compaction:超过阈值时调特殊 Responses API endpoint,生成加密的 latent state payload 替换原对话 | |
| Prompt Caching | 依赖"前缀不变"性质 — 因此 AGENTS.md、tools 列表顺序、模型 ID 不能中途变化,否则缓存击穿 | |
| Multi-Provider 切换 | config.toml 定义多 provider,–profile 切换 |
5.2 Agent Architecture
类型:Single Agent + 状态机 Agent Loop + Planner-Executor 混合(模型自身规划,无显式 planner 模块)。
| Agent State | TurnContext(client、cwd、approval/sandbox policy、tools_config) |
| Planning | 由模型在 prompt 内完成,无独立 Planner 模块 |
| Execution | run_turn 循环 + tool executor |
| Reflection | 模型自发通过读取 tool 结果实现,无显式 Reflection node |
| Memory | 见 §8 |
| Tool Selection | 模型自主通过 tool_call 选择;sandbox + approval policy 作为安全网 |
| Context Management | 分层 Prompt(见 §5.2.1) |
| Error Recovery | stream retry + tool result 回填 + approval 拒绝后模型自我修正 |
5.2.1 分层 Prompt 结构
[System Message] ← server 控制
[Model-specific Instructions] ← server 控制
[Developer Instructions] ← 来自 config
[Sandbox Permission Rules] ← 来自 sandbox policy
[AGENTS.md contents] ← 项目级 Agent 指令
[Tool Definitions] ← 含 MCP servers
[Environment Context] ← cwd、shell
[User Input] ← 实际用户消息
[Tool results from prior turns] ← 持续 append
每层有 system / developer / user 角色,客户端控制下三层,server 控制上三层。这种分层结构是 Prompt Cache 命中的关键 — Codex 刻意放弃 server-side conversation state(避免破坏 ZDR 客户),接受二次方流量但用 prefix caching 摊平计算。
5.3 Agent Loop
已验证的实际 Loop(源码 + ByteByteGo + Pragmatic Engineer 三方一致):
Observe (user input / tool result)
↓
Prompt Assembly (system + tools + AGENTS.md + env + history)
↓
Inference (Responses API, streaming)
↓
ResponseEvent::OutputItemDone
↓
is tool_call?
├─ YES → Approval Policy check → Sandbox Execute → append result → loop
└─ NO → needs_follow_up = false → final message → exit turn
| Loop 控制在哪? | codex-rs/core/src/codex.rs 的 run_turn / try_run_turn |
| Stop condition? | needs_follow_up = false(LLM 不再发起 tool call) |
| 最大循环次数? | 源码未见硬上限;由 token 预算 + compaction 间接控制。这是潜在风险 |
| 如何避免死循环? | Token 预算触发 compaction;用户 Op::Interrupt;审批拒绝 |
| Tool failure? | 错误信息回填 prompt,模型自主决定 retry 或换路 |
| LLM failure? | run_model_turn exponential backoff 重试 stream 错误 |
06. RAG Architecture
Codex CLI 不是 RAG 项目。 它没有 Vector Store、Embedding、Retrieval、Reranking、Citation 任何一层。它的"知识注入"机制是:
为什么不做 RAG:Coding Agent 的"知识"主要是当前 repo 的文件系统本身,通过 read_file tool 按需拉取即可,不需要预建 vector index。这是 Coding Agent 与通用 Chat Bot 的根本区别。
如果你想给它加 RAG(比如企业内部代码库跨 repo 检索),正确的扩展点是把检索器封装成 MCP Server,而不是改 Codex core。
07. Tool / Function Calling / MCP
7.1 Tool Architecture
Agent (codex-core)
↓
Tool Executor (core/src/tools/)
↓
Tool Registry (shell / read_file / apply_patch / MCP tools / Skills)
↓
Approval Policy Engine (untrusted / on-request / on-failure / never)
↓
Sandbox (Seatbelt / Landlock / Job Objects)
↓
External System (filesystem / shell / MCP server)
| Tool schema | 由 Responses API tool 定义,JSON schema |
| Tool discovery | 启动时静态注册 + MCP 启动时动态发现 |
| Tool validation | 在 sandbox 层做路径白名单(writable_roots、network_access、exclude_slash_tmp) |
| Tool permission | ApprovalPolicy:untrusted/on-request/on-failure/never |
| Tool execution | Tokio spawn,stdout/stderr 流回 |
| Timeout | 由 sandbox/OS 控制,未见显式 tool timeout 配置(源码未验证,标 Unknown) |
| Error handling | stderr 回填到 LLM,模型自主诊断 |
| Result normalization | 通过 Op/ResponseEvent 协议统一 |
7.2 MCP Integration
MCP 在 Codex 中是真正的架构能力,不只是接口适配层。 证据:
已知限制:
- 远程 MCP server 在早期不支持(issue #3696,2025 报"missing field command"错误)。后续版本已修复,但反映出 MCP 在 codex-rs 内最初是按 local stdio 子进程设计的
- MCP 与 Codex 自身协议的关系:Codex App Server 不是 MCP server,而是自建 JSON-RPC 协议。OpenAI 团队承认曾尝试把 Codex 暴露为 MCP server,但"streaming progress / mid-task approval / structured diffs"等 agent 语义 MCP 无法承载,所以另起炉灶
7.3 Skills(渐进式披露)
不属于传统 Function Calling,但是一种"延迟加载的 tool"机制:
| L1 | SKILL.md 的 name + description | session 启动,全量进 system prompt |
| L2 | SKILL.md 完整主体 | 模型判定需要时(或用户显式指定) |
| L3 | references/、scripts/ | 模型按 SKILL.md 指令自主读取 |
| 官方 Codex 团队内部有 100+ skills,包括"Security best-practices"、“Yeet”(自动 PR)、“Datadog integration”。 |
08. Memory Architecture
| Short-term | ✅ | 当前会话 message history,append 到下一 turn 的 prompt | |
| Working Memory | ✅ | TurnContext | |
| Long-term | ⚠️ 有限 | Session persistence(–resume 加载过去 session 信息),Memory System 在 v0.150 文档中列为独立 section | |
| User Memory | ⚠️ 通过 ~/.codex/config.toml 与全局 instructions 实现,非自动学习 | ||
| Semantic / Episodic Memory | ❌ 无向量库,无自动 memory 检索 | — | |
| Memory 存的是什么? 完整 conversation history(包含所有 tool call 与结果)。 | |||
| 为什么存? 因为 Codex 放弃 server-side state(为支持 ZDR 客户),每次请求必须自包含完整历史。 | |||
| 何时读? 每次构建 prompt 时全量读取。 | |||
| 何时写? 每个事件(模型输出、tool result)append。 | |||
| 如何淘汰? Compaction:超阈值时调用特殊 Responses API endpoint,生成更小的代表版本(技术上不是简单 summary,而是加密的 latent state payload),替换原历史。 | |||
| 如何避免 Memory 污染? AGENTS.md 中硬约束:“No unbounded items – everything injected in model context must have bounded size and a hard cap. No items larger than 10K tokens.” |
09. Data Architecture
Codex 是单机工具,无外部数据库依赖:
User Input (Op)
↓
Submission Channel (Tokio unbounded_channel)
↓
Codex Core (in-memory state)
↓
Event Channel (Tokio unbounded_channel)
↓
TUI / App Server (surface rendering)
| Conversation history | 内存 + ~/.codex/sessions/ 本地文件 | Session 期间内存;关闭后持久化用于 –resume |
| Config | ~/.codex/config.toml + .codex/config.toml | 永久,用户/项目级 |
| Skills | ~/.codex/skills/ + 项目 SKILL.md | 永久 |
| Auth credentials | ~/.codex/auth.json | 永久 |
| 无 Vector DB、无 Message Queue、无 Object Storage。如果做企业部署,需要自行加会话存储层(目前 codex exec + CI 模式 ephemeral)。 |
10. API Architecture
Codex 有两层 API:
10.1 用户面向的 CLI
codex # interactive TUI
codex exec "<prompt>" # headless / CI mode
codex app # desktop app 入口
codex –profile <name> # 切换 profile
codex –model <id>
codex –resume <session>
codex -c key=value # config override
10.2 App Server JSON-RPC(IDE / 第三方集成)
codex-rs/app-server 提供 JSON-RPC over stdio,双向:
| client → server | thread_start | 开新 thread |
| client → server | turn_start | 提交一轮输入 |
| server → client | approval request | 暂停 turn,等待 allow/deny |
| server → client | streaming events | reasoning steps、diffs、tool calls |
| 协议特性: |
- Backward compatible:旧 client 可与新 server 通信
- 双向:server 主动请求 client 审批
- Stateless from OpenAI’s perspective:conversation state 全在 client 侧,便于 ZDR
- 第三方库:codex_codes crate 提供 typed Rust interface
没有 REST/GraphQL/gRPC 公共 API。Codex 不打算成为 SaaS API,它是本地进程。
11. Frontend Architecture
TUI 不是简单 Chat UI,它对 Agent 产品有深度理解:
- Ratatui Rust 库(OpenAI 团队直接 hire 了 Ratatui maintainer),不是 Electron/Ink
- 三层结构:main.rs → App → ChatWidget(orchestration)+ bottom_pane/(chat_composer、footer)
- 双事件源: tokio::select! 同时处理 app_event_rx(LLM/tool)+ tui_events(键盘/鼠标)
- 审批流 UI:diff 视图、approve/deny 按钮、Esc 中断
- Multi-surface 复用: VS Code / Desktop 都不是独立 Agent 实现,而是 App Server 协议的 client
前端限制: - codex-tui 主文件 app.rs、chatwidget.rs、bottom_pane/chat_composer.rs 已被官方标记为"high-touch files",要求新增功能放新模块 — 反映 UI 层也有复杂度压力
- 无 Web 前端在 codex repo 中(Web App 是闭源 Codex Cloud 的一部分)
12. Engineering Quality
Code Quality
| Modularity | 优秀但正在变差:40+ crates 设计良好,但官方自己写"codex-core is bloated, resist adding code to codex-core" | |
| Coupling | 低(协议层隔离 surface 与 core) | App Server 抽象 |
| Cohesion | 高(每个 crate 单一职责) | crate 命名规范 codex-* |
| Naming | 严格(Op、TurnContext、ResponseEvent 语义清晰) | protocol.rs |
| Abstraction | 高(ContextualUserFragment trait、wire_api 抽象) | AGENTS.md |
| Dependency | 极少(Rust + 少量 crates,无 npm 链) | 重写动机 |
| 代码规模:约 549K lines of Rust(社区 teardown 数据)。 |
Testing
| Unit | ✅ | 内嵌于各 crate,cargo test 跑 |
| Integration | ✅ | codex-rs/core/suite/,使用 test_codex fixture;官方推荐"agent changes prefer integration tests" |
| E2E | ✅ | CI 在 macOS/Linux/Windows 三平台跑完整套件 |
| Agent Evaluation | ⚠️ 部分 | 官方有"self-test skill"让 Codex 跑自身测试套件;但无公开 eval 框架(如 SWE-bench runner 不在 repo 内) |
| RAG Evaluation | N/A | 不是 RAG 项目 |
| Regression | ✅ | Bazel lockfile drift check、just fix、argument_comment_lint |
| Sandbox Tests | ✅ | Seatbelt/Landlock 集成测试,但在 sandbox 内无法跑(用 CODEX_SANDBOX=seatbelt env 早期退出) |
| CI/CD:GitHub Actions + Bazel,三平台矩阵,每日多次发版。 |
13. Reliability & Fault Tolerance
| LLM API 失败 | run_model_turn 包 try_run_turn,对 stream 错误 exponential backoff |
| Tool 失败 | stderr 回填 prompt,模型自主诊断 retry |
| Sandbox 拒绝 | 错误信息回填,模型请求 approval 升级 |
| Agent 无限循环 | 无硬上限,依赖 token 预算 + compaction + 用户 Op::Interrupt。⚠️ 这是潜在风险 |
| 用户重复提交 | Op::Interrupt 取消当前 turn,新 turn 从干净状态开始 |
| Approval 拒绝 | 模型收到"deny",自我修正 |
| Context 超限 | 自动 compaction,用 latent state payload 替换 |
| Cache 击穿 | prefix caching 失效不会失败,只是变慢变贵 |
| 缺失项:Circuit Breaker、Queue、Idempotency key、Graceful degradation(对本地工具来说不必要)。整体评价:单机工具的 reliability 设计恰当,没有过度工程化。 |
14. Security
这是 Codex 最强的维度之一。
Sandbox 实现(3-OS)
| macOS | Seatbelt(/usr/bin/sandbox-exec),子进程设 CODEX_SANDBOX=seatbelt | |
| Linux | Landlock + seccomp(Rust bindings 在重写时就已存在) | |
| Windows | Job Objects + 自定义设计(现有 Windows isolation 机制不满足 agentic workload,OpenAI 自研) | |
| 默认策略:network_access = false、workspace 外路径只读,通过 sandbox_workspace_write.writable_roots 精确放行。环境变量 CODEX_SANDBOX_NETWORK_DISABLED=1 在 shell tool 内自动设置。 |
Approval 流程
- Op::ExecApproval / Op::PatchApproval 把 turn 暂停,等用户决定
- Guardian AI approval system(社区 teardown 报告提及):一个独立的 LLM 来判断 tool call 是否合理
- 配置粒度:untrusted / on-request / on-failure / never
剩余安全风险
| Prompt Injection via AGENTS.md / Skill.md | High | AGENTS.md 是 repo 内文件,malicious repo 可以注入恶意指令。Codex 没有对 AGENTS.md 内容做安全审查 |
| Prompt Injection via MCP server 输出 | High | MCP 返回内容进入 prompt,恶意 MCP server 可注入 |
| Tool Injection | Medium | Tool list 由 config 决定,本地用户控制,风险低 |
| Secret leakage through shell | Medium | sandbox 阻止网络外发,但本地文件读取仍可能读到 .env |
| Approval fatigue | Medium | 用户长期用 never 模式后,sandbox 是唯一防线 |
| Skill injection | Medium | 恶意 SKILL.md 可在 L3 引导模型读任意文件 |
| 对"Agent 是否拥有过大 Tool 权限"的回答:默认权限设计优秀(sandbox + approval 双层),但信任链上有 AGENTS.md / Skills / MCP 三个用户可控入口,这三个入口的输入没有任何内容审查 — 是当前最大的攻击面。 |
15. Observability
| Logging | tracing crate,官方要求用 #[tracing::instrument(…)] 装饰 async 函数 |
| Tracing | Session-level;支持 –resume 重放 |
| Token Usage | 由 Responses API 返回,UI 展示 |
| Latency / Cost | TUI 内可见 |
| Agent Trace | Event channel 全量记录 tool calls + results |
| MCP Trace | 同上,通过统一 event 流 |
| 可定位失败原因? | ✅ 是,事件流包含完整因果链 |
| 无独立 Metrics/Prometheus endpoint — 这是单机工具的合理取舍,但对企业部署是 gap。 |
16. Deployment Architecture
Developer Laptop
└── codex binary (Rust, single executable)
├── TUI (default)
├── App Server (stdio, IDE 集成)
└── codex exec (headless)
↓
~/.codex/ (config, auth, sessions, skills)
↓
Model Provider (OpenAI Responses API / custom base_url)
| Local Development | ✅ Excellent(单二进制,零依赖) |
| Team Development | ✅ Good(.codex/config.toml 可入 repo,统一 profile) |
| Production (CLI in CI) | ✅ Good(codex exec + GitHub Action 官方支持) |
| Enterprise | ⚠️ Partial — 需自建 session 集中存储、audit log 聚合、SSO 接入 |
| Kubernetes / Serverless | ❌ 不是设计目标 |
| 安装:`curl | sh/npm i -g @openai/codex/brew install –cask codex` / 直接二进制。 |
17. Performance & Cost
Performance(有 Benchmark)
| Terminal-Bench 2.1 | 89.5%(GPT-5.6 Sol, extra-high effort) — 当前最高 | |
| Terminal-Bench 2.0 | 77.3%(GPT-5.3-Codex) | |
| SWE-bench Verified | mini-SWE-agent 版本 72.80% | |
| Token 速度 | 标准 65-70 tok/s;Spark 变体在 Cerebras 上 1000+ tok/s | |
| Token 效率 | 比 Claude Code 省 2-3x tokens |
Cost Model
无官方定价数据,成本主要由以下因素决定(不编造具体金额):
Total Cost
= Σ (per-turn LLM cost)
+ Σ (compaction LLM cost) # 长会话额外成本
+ Embedding cost # N/A(无 RAG)
+ Rerank cost # N/A
+ Infrastructure cost # 接近 0(本地运行)
+ Storage cost # 接近 0(本地 session 文件)
关键影响因素:
18. Architecture Strengths
Strength 1: Multi-Surface 复用通过 App Server 协议,而非抽象层
- Problem: CLI / VS Code / Desktop / Web / 第三方 IDE 需要共享同一 Agent 逻辑
- Design Decision: 抽出 Codex Core,包一层 JSON-RPC over stdio,所有 surface 都是协议 client
- Implementation: codex-rs/app-server + codex_codes typed Rust SDK
- Benefit: VS Code 扩展只需几十行 glue code;第三方 IDE(Xcode、JetBrains)解耦发版节奏;协议 backward compatible
Strength 2: Rust 重写不只是性能,而是安全架构的前提
- Problem: Node.js 难以原生绑定 OS sandbox(Seatbelt/Landlock)
- Design Decision: 全栈 Rust,依赖极少,可以直接 FFI OS API
- Implementation: Linux Landlock+seccomp 在重写公告时"already available";Windows Job Objects 自研
- Benefit: zero-dependency install;安全边界从进程内移到 OS 内核;GC 不存在,latency 可控
Strength 3: Prefix Caching 通过严格不变量保证,而非依赖框架
- Problem: Conversation 历史二次方增长,直接重发代价高
- Design Decision: 刻意放弃 server-side conversation state(支持 ZDR 客户),用 prefix caching 摊平
- Implementation: AGENTS.md 中规定"No history rewrite"、tools 顺序稳定、单条 fragment ≤ 10K tokens
- Benefit: ZDR 兼容 + 推理成本近线性;同时把这些不变量写成 review 强制规则
Strength 4: Skills 渐进式披露,token-aware 的知识注入
- Problem: 把所有项目知识塞 system prompt 会撑爆 context
- Design Decision: 3-Level Progressive Disclosure,按需加载
- Implementation: SKILL.md 仅 L1 metadata 进 base prompt
- Benefit: 大幅节省 base token,同时保持 agent 可发现性
Strength 5: Sandbox + Approval 双层防御,安全默认开启
- Problem: LLM 不可靠,直接 shell 执行有危险
- Design Decision: 默认 sandbox + 默认 approval,接受这会"伤害 general adoption" — 团队原话
- Implementation: 3-OS sandbox,CODEX_SANDBOX_NETWORK_DISABLED=1 强制环境变量,Guardian AI 二次判断
- Benefit: 非技术用户默认安全;企业可审计
19. Architecture Weaknesses
Weakness 1: codex-core 单 crate 膨胀 — 官方自己承认
- Problem: 新功能都往 codex-core 塞,模块边界退化
- Evidence: AGENTS.md 原文 “the codex-core crate…has become bloated because it is the largest crate, so it is often easier to add something new to codex-core rather than refactor out”
- Impact: 长期维护成本上升,新 contributor 学习曲线陡峭
- Severity: Medium
- Recommendation: 持续按 codex-rs/exec、codex-mcp 等模式拆分;强制 PR review 中"是否必须进 core"
Weakness 2: Agent Loop 无硬 max-iteration 上限
- Problem: needs_follow_up 由模型决定,没有 N-step 上限
- Evidence: 源码 run_turn 循环仅检查 needs_follow_up,未见 max_iterations 字段
- Impact: 模型陷入循环时,只靠 token 预算/用户中断止损
- Severity: Medium
- Recommendation: 在 TurnContext 增加 max_steps 配置项,默认 50
Weakness 3: AGENTS.md / Skills / MCP 是无审查的 prompt 注入入口
- Problem: 这些文件的作者 = repo 作者,可注入任意指令
- Evidence: AGENTS.md 内容直接进 system prompt;Skill L3 引导模型读任意文件
- Impact: malicious repo / malicious MCP server 可诱导执行危险命令(虽然有 sandbox 兜底)
- Severity: High
- Recommendation: 增加"untrusted project"模式,首次进入新 repo 时 AGENTS.md 不自动加载
Weakness 4: 没有 RAG / 跨 repo 检索,长仓库导航靠 tool 循环
- Problem: 大型 monorepo 中模型靠 read_file 逐步探索,token 浪费
- Evidence: Codex 无任何 retrieval 机制(见 §06)
- Impact: 大 repo 任务 token 成本高、延迟高
- Severity: Low-Medium
- Recommendation: 企业部署可加 code-index MCP server(如 Sourcegraph)
Weakness 5: 长链路连贯性弱于 Claude Code
- Problem: 多步任务(3-4 步以上)会"丢失方向感",重新问已答过的问题
- Evidence: 独立评测一致反馈;SWE-bench Verified 77.3% vs Claude Code 80.8%
- Impact: 重构/跨文件 feature 任务成功率下降
- Severity: High(对用户而言)
- Recommendation: 这是模型能力 + compaction 机制的组合问题;应用层可通过"小任务拆分 + 频繁 commit"缓解
Weakness 6: 企业特性(RBAC / Audit / Multi-tenancy)缺失
- Problem: CLI 设计假设单用户本地运行
- Evidence: 无 team / org 概念;audit log 仅本地 session 文件
- Impact: 企业落地需自建包装层
- Severity: Medium
- Recommendation: v0.116.0 已开始加 enterprise features,但距离企业 Ready 仍有距离
Weakness 7: 依赖 Responses API,生态锁定
- Problem: Chat Completions 已 deprecate,非 OpenAI-compatible 的模型接入困难
- Evidence: Unsloth 文档明确"Codex has changed…It now uses the OpenAI Responses API exclusively, and Chat Completions support has been deprecated"
- Impact: 想用 Anthropic / Google 原生 API 的团队需要 gateway 翻译
- Severity: Low(设计选择,不是 bug)
20. What Is Actually Innovative?
| True Innovation | ① Windows Job Objects 沙箱自研设计(现有 Windows isolation 不足);② Compaction 使用加密 latent state payload 而非简单 summary |
| Engineering Innovation | ① Rust 重写带来的 zero-dependency + 原生 sandbox binding;② App Server JSON-RPC 协议解决多 surface 复用;③ Prefix caching 通过工程不变量保证而非依赖框架 |
| Integration Innovation | MCP + Skills + AGENTS.md 的组合,以及它们与 Responses API 的 prefix caching 协同设计 |
| Marketing Innovation | "aSWE / Autonomous Software Engineer"叙事 |
| Codex 的真创新不在模型,而在 Harness。ByteByteGo 的总结精确:“the model is a component and the agent is the system. Most of the engineering is in the system.” |
21. What Is Just Repackaging?
Codex 不属于 Wrapper / Repackaging:
- ❌ 不是 LangChain + Vector DB + LLM 的 Basic Agent Wrapper — 没有用 LangChain,核心 loop 是自研 Rust
- ❌ 不是把 OpenAI API 包一层 UI — sandbox、approval、compaction、caching、multi-surface 协议都是原创工程
- ⚠️ Agent Loop 本身是通用范式(所有 agent 都长这样,OpenAI 自己承认),这部分是 ReAct 标准实现,不是创新
- ⚠️ Skills 机制直接借鉴 Anthropic Agent Skills 标准,是跟随而非引领
22. Competitive Landscape
| Codex CLI | Rust | State machine + JSON-RPC multi-surface | ★★★★ (Terminal-Bench 89.5%) | ★★★★★ | ★★★★ (MCP+Skills) | ★★★★ | Sandbox 最强 |
| Claude Code | TypeScript | Node.js CLI | ★★★★★ (SWE-bench 80.8%) | ★★★★ | ★★★ | ★★★★ | 长链路更稳,token 消耗 2-3x |
| Aider | Python | Git-centric CLI | ★★★ | ★★★ | ★★ | ★★★ | git-first,轻量 |
| OpenCode | ? | Open source Claude Code 类似物 | ★★★★ | ★★★ | ★★★ | ★★ | 199K stars(社区驱动) |
| Gemini CLI | ? | Google 官方 | ★★★ | ★★★ | ★★★ | ★★★ | 配额慷慨 |
| Cline | VS Code 扩展 | IDE-integrated | ★★★★ | ★★★ | ★★★ | ★★★ | IDE 用户首选 |
| SWE-agent | Python | Research 框架 | ★★★★ (SWE-bench 鼻祖) | ★★ | ★★ | ★ | 学术向 |
| Cursor | 闭源 SaaS | IDE | ★★★★★ | ★★★★★ | ★ | ★★★★★ | 商业标杆 |
| 差异化定位: |
- vs Claude Code:安全与 token 效率,牺牲部分长链路能力
- vs Aider:agentic 多步自主vs Aider 的 git-centric 单步
- vs Cursor:开源可审计vs 闭源 SaaS;终端优先vs IDE 优先
- vs SWE-agent:生产可用vs 学术实验
用户为什么选 Codex:企业安全合规(OS-level sandbox + ZDR 兼容)+ OpenAI 模型质量 + 极致 token 成本。
23. 二次开发价值分析
KEEP(直接复用)
REFACTOR(设计好但需改)
REPLACE
REMOVE
ADD(企业化必加)
24. 二次开发路线
V1 — MVP(2-4 周)
目标:替换 model provider + 本地跑通核心 loop,验证可用性。
- Fork repo,保留 codex-rs/,删除 codex-cli/
- 配置 [model_providers.internal] 指向内部 LLM gateway
- 替换默认 auth.json 为内部 token 机制
- 跑通 TUI + codex exec 两个 surface
- 端到端 smoke test:读文件 → 改文件 → 跑测试
交付:内部演示可用的 Coding Agent,沿用 Codex 全部安全机制。
V2 — Production(2-3 月)
目标:团队/CI 可用,具备可观测性。
- Observability:集成 OpenTelemetry,tracing spans 上报到 Jaeger/Tempo
- Session persistence:本地文件 → Postgres(或保留本地但加 S3 backup)
- Central config:企业统一 config.toml 分发(版本控制 + signature 校验)
- CI integration:GitHub Action / GitLab CI 模板,codex exec + PR comment
- Error handling hardening:为 agent loop 增加 max_steps 上限
- Security hardening:AGENTS.md/Skills 内容扫描(prompt injection heuristics)
- Performance baseline:token usage / latency / compaction 频率 metrics
- Docs:内部 deployment guide + troubleshooting
V3 — Enterprise(6 月+)
目标:合规、可治理、可扩展。
- RBAC:user → role → allowed tools 矩阵
- Multi-tenancy:org / team / project 三层
- Audit:所有 tool call + approval decision 写入 SIEM(Splunk/Elastic)
- Policy as Code:OPA/Rego 策略引擎,动态决定 approval
- Cost Control:per-team token budget + 实时 quota
- Evaluation Pipeline:内部 SWE-bench 子集 + 真实任务回放,模型升级前回归测试
- Plugin Architecture:允许团队发布内部 MCP servers / Skills 到内部 registry
- Enterprise SSO:OIDC / SAML
- Model routing:按任务类型路由(代码生成用 GPT-5.x,review 用 Claude,research 用 Gemini)
25. Recommended Target Architecture
#mermaid-svg-HWmlhPuXpDHzTt3K{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-HWmlhPuXpDHzTt3K .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HWmlhPuXpDHzTt3K .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HWmlhPuXpDHzTt3K .error-icon{fill:#552222;}#mermaid-svg-HWmlhPuXpDHzTt3K .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HWmlhPuXpDHzTt3K .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HWmlhPuXpDHzTt3K .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HWmlhPuXpDHzTt3K .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HWmlhPuXpDHzTt3K .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HWmlhPuXpDHzTt3K .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HWmlhPuXpDHzTt3K .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HWmlhPuXpDHzTt3K .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HWmlhPuXpDHzTt3K .marker.cross{stroke:#333333;}#mermaid-svg-HWmlhPuXpDHzTt3K svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HWmlhPuXpDHzTt3K p{margin:0;}#mermaid-svg-HWmlhPuXpDHzTt3K .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-HWmlhPuXpDHzTt3K .cluster-label text{fill:#333;}#mermaid-svg-HWmlhPuXpDHzTt3K .cluster-label span{color:#333;}#mermaid-svg-HWmlhPuXpDHzTt3K .cluster-label span p{background-color:transparent;}#mermaid-svg-HWmlhPuXpDHzTt3K .label text,#mermaid-svg-HWmlhPuXpDHzTt3K span{fill:#333;color:#333;}#mermaid-svg-HWmlhPuXpDHzTt3K .node rect,#mermaid-svg-HWmlhPuXpDHzTt3K .node circle,#mermaid-svg-HWmlhPuXpDHzTt3K .node ellipse,#mermaid-svg-HWmlhPuXpDHzTt3K .node polygon,#mermaid-svg-HWmlhPuXpDHzTt3K .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HWmlhPuXpDHzTt3K .rough-node .label text,#mermaid-svg-HWmlhPuXpDHzTt3K .node .label text,#mermaid-svg-HWmlhPuXpDHzTt3K .image-shape .label,#mermaid-svg-HWmlhPuXpDHzTt3K .icon-shape .label{text-anchor:middle;}#mermaid-svg-HWmlhPuXpDHzTt3K .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-HWmlhPuXpDHzTt3K .rough-node .label,#mermaid-svg-HWmlhPuXpDHzTt3K .node .label,#mermaid-svg-HWmlhPuXpDHzTt3K .image-shape .label,#mermaid-svg-HWmlhPuXpDHzTt3K .icon-shape .label{text-align:center;}#mermaid-svg-HWmlhPuXpDHzTt3K .node.clickable{cursor:pointer;}#mermaid-svg-HWmlhPuXpDHzTt3K .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-HWmlhPuXpDHzTt3K .arrowheadPath{fill:#333333;}#mermaid-svg-HWmlhPuXpDHzTt3K .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-HWmlhPuXpDHzTt3K .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-HWmlhPuXpDHzTt3K .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HWmlhPuXpDHzTt3K .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-HWmlhPuXpDHzTt3K .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HWmlhPuXpDHzTt3K .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-HWmlhPuXpDHzTt3K .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-HWmlhPuXpDHzTt3K .cluster text{fill:#333;}#mermaid-svg-HWmlhPuXpDHzTt3K .cluster span{color:#333;}#mermaid-svg-HWmlhPuXpDHzTt3K div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-HWmlhPuXpDHzTt3K .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-HWmlhPuXpDHzTt3K rect.text{fill:none;stroke-width:0;}#mermaid-svg-HWmlhPuXpDHzTt3K .icon-shape,#mermaid-svg-HWmlhPuXpDHzTt3K .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HWmlhPuXpDHzTt3K .icon-shape p,#mermaid-svg-HWmlhPuXpDHzTt3K .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-HWmlhPuXpDHzTt3K .icon-shape .label rect,#mermaid-svg-HWmlhPuXpDHzTt3K .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HWmlhPuXpDHzTt3K .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-HWmlhPuXpDHzTt3K .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-HWmlhPuXpDHzTt3K :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Observability
Model Layer
Storage
Tool Layer
Codex Core
App Server
Gateway Layer
Surfaces
TUI
IDE Extensions
CI Pipeline
Internal API
Enterprise GatewayAuthN/AuthZ + Rate Limit
JSON-RPC Server+ OTel exporter
Orchestrator+ Max-Step Guard
Context Manager+ Compaction
Policy EngineOPA/Rego
Tool Registry
Sandbox Executor
MCP Client
Skill Loader+ Content Scanner
PostgresSessions/Audit
S3Artifacts
RedisCache
Model Router
OpenAI
Anthropic
Internal LLM
OpenTelemetry Collector
SIEM
设计理由
| Enterprise Gateway | Codex 原生无 AuthN,加一层集中认证/审计,避免每个 surface 重复实现 |
| App Server 保留 | Codex 原架构最优秀的设计,不要替换 |
| Policy Engine(新增) | 把 sandbox + approval 决策抽出来,支持企业策略集中管理 |
| Skill Content Scanner(新增) | 解决 AGENTS.md/Skills 注入风险 |
| Model Router(新增) | 解决 Responses API 锁定问题,支持多模型成本/能力优化 |
| OTel + SIEM(新增) | 企业合规刚需 |
| Postgres session store(替换) | 支持团队共享 session / 跨设备 resume |
| Redis(新增) | Prompt prefix cache 元数据 + rate limit counter |
26. Coding Agent Implementation Plan
Repository Structure(企业 fork)
codex-enterprise/
├── crates/
│ ├── codex-core/ # 精简后 core
│ ├── codex-protocol/
│ ├── codex-app-server/
│ ├── codex-tui/
│ ├── codex-sandbox/
│ ├── codex-mcp/
│ ├── codex-policy/ # NEW: Policy Engine
│ ├── codex-router/ # NEW: Model Router
│ ├── codex-observability/ # NEW: OTel exporter
│ ├── codex-scanner/ # NEW: Content scanner
│ ├── codex-storage/ # NEW: Postgres/S3/Redis
│ ├── codex-auth/ # NEW: SSO/OIDC
│ └── codex-rbac/ # NEW: RBAC
├── surfaces/
│ ├── cli/
│ ├── vscode/
│ └── github-action/
├── policies/ # Rego 策略
├── skills/ # 企业内部 skills
├── docs/
├── tests/
│ ├── integration/
│ ├── e2e/
│ └── eval/ # SWE-bench 子集
└── deploy/
├── docker/
├── k8s/
└── terraform/
Implementation Order(依赖驱动)
1. Foundation: build system (Bazel), CI, base crates
2. Domain Model: codex-protocol + policy schema
3. Infrastructure: storage, cache, OTel
4. Provider: codex-router + multi-provider adapters
5. Core Logic: codex-core (瘦身) + policy engine
6. Agent: sandbox + tool executor + approval
7. Workflow: MCP + Skills + scanner
8. API: app-server + gateway
9. Surfaces: TUI → VS Code → GitHub Action
10. Observability: traces → metrics → SIEM
11. Testing: unit → integration → e2e → eval
12. Deployment: docker → k8s → enterprise rollout
27. Recommended Engineering Standards
| Coding Standards | 沿用 Codex 自身 AGENTS.md 规范:模块 < 500 LoC、tracing::instrument、 exhaustive match、禁 #[async_trait] |
| Git Workflow | Trunk-based + 短 feature branch(≤ 3 天) |
| Branch Strategy | main + feat/* + fix/*;企业 fork 加 enterprise/* 隔离层 |
| Commit Convention | Conventional Commits(feat/fix/docs/chore/refactor/test) |
| Testing Strategy | Unit 70% / Integration 20% / E2E 10%;agent changes 强制 integration(core/suite) |
| Error Handling | anyhow for app,thiserror for libs;所有 tool 错误结构化(不丢 stderr) |
| Logging | tracing + JSON subscriber to OTel |
| Configuration | 类型化 config(TOML + JSON schema),启动时校验 |
| Env Management | .env 仅本地;CI 用 secret manager |
| Documentation | docs/ 仅架构与 API;用户文档走站点 |
| CI/CD | Bazel build + 三平台 test + clippy + codespell + release automation |
28. Definition of Done
任何二次开发 PR 必须满足:
[ ] Core functionality implemented
[ ] Unit tests added (coverage not decreased)
[ ] Integration test in core/suite (if agent-related)
[ ] E2E test passes on all 3 OS
[ ] Error handling covers: tool fail / LLM fail / approval deny / interrupt
[ ] OTel tracing spans added
[ ] Security validation: no new prompt injection surface, sandbox bypass check
[ ] Documentation updated (docs/ or inline doc comments)
[ ] Docker image builds
[ ] CI green (3 platforms + clippy + codespell)
[ ] Performance baseline: no regression in token usage / latency
[ ] Regression test: existing eval suite passes
29. Final Technical Verdict
项目类型
Developer Tool / Agent Harness(不是 Agent Framework,不是 RAG Framework,不是 Infrastructure)
技术成熟度
Experimental
↓
Prototype
↓
Developer Ready ← ★ 当前位置
↓
Production Ready ← 接近(CI/桌面场景已可)
↓
Enterprise Ready ← 尚需 RBAC/Audit/Multi-tenancy
是否值得学习?
Yes — 它是当前开源界最完整的 production-grade Agent Harness 参考实现,特别是 sandbox、协议、prompt caching、compaction 四个主题。
是否值得二次开发?
条件性 Yes — 适合 fork 做企业内部 Coding Agent(替换 provider + 加治理),不适合做通用 Agent Framework(那应该用 LangGraph / AutoGen)。
是否适合生产?
- 个人/小团队本地使用:Yes
- 企业内部部署:需要改造(RBAC/Audit/Multi-tenancy 自建)
最值得复用的 5 个部分
最应该重构的 5 个部分
最大的 5 个技术风险
最大的 5 个技术机会
30. One-Page Decision Matrix
| Worth Learning? | ⭐⭐⭐⭐⭐ |
| Worth Forking? | ⭐⭐⭐⭐ |
| Worth Production? | ⭐⭐⭐⭐ |
| Worth Enterprise Adoption? | ⭐⭐⭐(需改造) |
| Worth Building Upon? | ⭐⭐⭐⭐ |
| Architecture Quality | ⭐⭐⭐⭐⭐ |
| AI Capability | ⭐⭐⭐⭐ |
| Engineering Quality | ⭐⭐⭐⭐⭐ |
| Extensibility | ⭐⭐⭐⭐ |
| Community | ⭐⭐⭐⭐⭐ |
| Long-term Potential | ⭐⭐⭐⭐⭐ |
31. Evidence Appendix
Repository Evidence
- Repository URL: https://github.com/openai/codex
- Branch analyzed: main
- Commits: 10,006
- Tagged releases: 640+
- 主代码: codex-rs/ (~95.6% of codebase)
Key Files
| AGENTS.md | 项目自身的 Agent 规范,codex-core 膨胀问题、Context 不变量、测试规范均在此声明 |
| codex-rs/core/src/codex.rs | TurnContext 定义,Agent Loop 核心数据结构 |
| codex-rs/protocol/src/protocol.rs | Op 枚举(UserInput/ExecApproval/…) — 协议契约 |
| codex-rs/core/src/context/ | ContextualUserFragment trait — prompt 分层的类型化抽象 |
| codex-rs/mcp/src/mcp_connection_manager.rs | MCP 集成唯一入口 |
| codex-rs/app-server/ | 多 surface JSON-RPC 协议实现 |
| codex-rs/tui2/src/main.rs | 启动流程:Tokio runtime → config → App::run |
| codex-rs/core/config.schema.json | 由 just write-config-schema 生成,配置契约 |
| codex-rs/core/suite/ | Integration test fixture test_codex |
Important Issues / Discussions
| #1174 | Codex CLI is Going Native | Rust 重写官方公告,重写动机第一手资料 |
| #3696 | Support remote MCP servers | 早期 MCP 仅支持 local stdio,反映协议演进 |
| #4849 | Make config.toml profiles selectable via CLI | 配置系统实际使用痛点 |
| #17051 | Architecture teardown of Codex CLI source code | 社区 549K LoC 逆向分析,确认 queue-pair protocol、Guardian AI approval、3-OS sandbox |
| #24742 | Support user-provided Seatbelt sandbox rules via config | sandbox 可配置性需求 |
| #7380 | Why does Codex keep stalling when approval mode is Read Only | approval + sandbox 交互的真实用户痛点 |
Key External Sources
- ByteByteGo, “How OpenAI Codex Works” — App Server 协议、Compaction latent state、prefix caching 失效案例(MCP tools 顺序 bug)
- Pragmatic Engineer, “How Codex is built” — Tibo 团队访谈:Rust 选择理由、Agent Loop 流程、Skills 内部实践、self-testing
- InfoQ, “Codex CLI Goes Native” — Rust 重写四项动机原文
- InfoQ, “Windows Sandbox Design” — Windows Job Objects 设计细节
- Blake Crosley, “Codex CLI Guide 2026 v0.150.1” — 完整 feature 矩阵与 Memory System 章节
- Zenn, “How Codex CLI Implements Agent Skills” — Agent Loop 三层结构与 Skills 3-Level Progressive Disclosure 源码走读
- Unsloth docs — Responses API 独占、Chat Completions deprecate 确认
- SWE-bench / Terminal-Bench leaderboards — 量化对比数据
Facts Not Verified(明确标注 Unknown)
| codex-core 源码的具体模块行数分布 | 未逐文件统计,仅采信官方 AGENTS.md 与社区 teardown 数据 |
| Tool execution 的显式 timeout 配置项 | 未见文档/源码确认,标 Unknown |
| Compaction 触发的具体 token 阈值数值 | 未见公开数值,标 Unknown |
| 内部企业用户数量、生产案例 | OpenAI 未公开,标 Not Verified |
| Windows sandbox 的完整策略语义 | InfoQ 报道为架构概述,未读源码,标 Not Verified |
| Guardian AI approval system 的具体实现位置 | 社区 teardown 提及,未在主分支独立验证,标 Not Verified |
报告自检:
Architecture(✅ Data Flow/Control Flow/核心抽象)·
AI(✅ Agent Loop/Tool/Memory/Context Engineering,❌ RAG 不适用)·
Engineering(✅ Tests/CI/Deployment/Error Handling/Observability)·
Security(✅ Prompt Injection/Tool Security/权限/数据泄露)·
Business(✅ 使用场景/竞品/定位/生产成熟度)·
Second Development(✅ KEEP/REFACTOR/REPLACE/REMOVE/ADD + 目标架构 + 路线 + DoD)·
Evidence(✅ 关键结论均有源码或一手资料支撑,未验证项已显式标注)

