15 章拆解 OpenAI Codex CLI 的架构设计与实现 —— 一个 102 个 crate、147 万行 Rust 的生产级 agent(智能体)运行外壳
本教程的定位(2026-08-24) 同目录下已有两份 harness 拆解:Pi-Agent 教程拆的是减法哲学(4 个包,刻意不做 MCP / 子 Agent / 权限弹窗),DeepSeek Harness 教程拆的是全插件化(185 个包,连 agent loop 都是配置里的一行)。
Codex 是这道题的第三种答案:不追求最小,也不追求最大可替换性,而是把一个每天被几百万开发者使用的产品该有的东西全部做出来并塞进一个静态二进制里。它的关键词是工程化——协议先行、平台全覆盖、14168 个测试、四套沙箱实现、一个用模型守模型的安全层。
三者不是优劣关系。第 15 章有完整对照。
关于"OpenAI 最近开源了 Codex"这个说法的更正 Codex CLI 的仓库 openai/codex 初始提交是 2025-04-16,从第一天起就是 Apache-2.0 开源,不是最近才开放。本教程核实的时间线:
事件 时间 依据 仓库初始提交 2025-04-16 git log --reverse 首条 codex-rs/core(Rust 重写核心)落地 2025-04-24 该目录首次出现的提交 Guardian 安全层进入仓库 2026-03-15 core/src/guardian/ 首次出现 ext/ 内部扩展平面 2026-05-11 codex-rs/ext/ 首次出现 所以真实情况不是"某天开源了",而是持续在公开仓库里开发——包括生产系统提示词、Guardian 风险策略、四套沙箱实现这些通常会被藏起来的东西。本教程认为这才是它值得读的原因。
版本与写作方法 本教程基于 openai/codex main 分支 09609ba4(2026-08-24),对照本机安装的 codex-cli 0.146.0。仓库当时的最新 tag 是 rust-v0.149.1 与 rust-v0.150.0-alpha.7。
与 Pi 教程(转载)不同、与 dsh 教程(读打包产物)也不同:本教程读的是原始 Rust 源码——注释、测试、TODO 全在。凡是标注 [源码] 的结论都给了 文件:行号,你可以 clone 仓库当场核对。
如果你读过前两份 harness 教程,会带着这些问题来看 Codex:
如果你没读过前两份教程,本教程也是自洽的:从第 2 章的工程骨架讲起,不预设你了解任何一个具体 harness,也不要求你会写 Rust(所有代码片段都有中文解读)。
| 章节 | 主题 | 核心问题 | 难度 |
|---|---|---|---|
| 第 1 章 | 开篇总览 | Codex 是什么?和 Pi / dsh 的本质区别在哪? | 入门 |
| 第 2 章 | 工程骨架 | 102 个 crate 怎么塞进一个二进制? | 入门 |
| 第 3 章 | 协议先行 | 为什么 core 完全不知道前端是谁? | ★ 核心 |
| 第 4 章 | Agent Loop | Task / Turn / Step 三级生命周期怎么转? | ★ 核心 |
| 第 5 章 | 模型调用 | 为什么砍掉了 Chat Completions?WebSocket 预热是什么? | ★ 核心 |
| 第 6 章 | 上下文工程 | 那份真实的生产系统提示词长什么样? | ★ 核心 |
| 第 7 章 | 上下文压缩 | 为什么压缩要做两套? | 进阶 |
| 第 8 章 | 工具系统 | 工具太多喂不下时怎么办? | ★ 核心 |
| 第 9 章 | 命令执行 | 为什么跑个命令需要 5000 行代码? | 进阶 |
| 第 10 章 | 沙箱 | 三套内核级隔离机制怎么统一? | 进阶 |
| 第 11 章 | 审批与策略 | Guardian 凭什么能拦住提示词注入? | ★ 核心 |
| 第 12 章 | 会话持久化 | 一个会话怎么做到能恢复、能分叉、能迁移? | 进阶 |
| 第 13 章 | 扩展面 | 五种扩展方式各自解决什么? | 进阶 |
| 第 14 章 | 多 Agent 委派 | 主 agent 变成协调者之后怎么工作? | 进阶 |
| 第 15 章 | 设计精华 | 哪些设计该抄,哪些不该? | 总结 |
阅读建议:第 1–4 章是骨架,建议顺序通读——不理解第 3 章的提交/事件队列,后面每一章都会卡住。第 5 章起可按需跳读。第 11 章(Guardian)和第 15 章即使不读源码也值得单独看。
每一章回答三个层次的问题:是什么(概念)、怎么做(源码取证)、为什么这样做(设计取舍)。
本教程的所有事实都可以在一台 clone 了仓库的机器上复核。写作时使用的取证路径:
| 素材 | 位置 | 规模 |
|---|---|---|
| Rust 源码 | codex-rs/ | 102 个 crate / 3293 个 .rs 文件 / 1465720 行 |
| 测试 | 同上 | 493 个 tests/ 文件,14168 处 #[test] / #[tokio::test] |
| 生产系统提示词 | codex-rs/core/*.md + core/templates/ | 6 份模型提示词 + 指令模板 + 2 份人格模板 |
| Guardian 策略 | codex-rs/core/src/guardian/policy.md | 8281 字节风险分类学 |
| 提示词模板库 | codex-rs/prompts/templates/ | 压缩 / 目标 / 复核 / 实时 / 权限 五类 |
| 协议规范 | codex-rs/docs/protocol_v1.md | 191 行,含 Mermaid 时序图 |
| 依赖锁定 | codex-rs/Cargo.lock | 1359 个 crate |
| 本机运行时 | codex-cli 0.146.0(npm 全局) | 350 MB,musl 静态二进制 |
自己动手复核 每章末尾都有「动手复核」小节,给出可直接运行的命令。教程正文里凡标注 [源码] 的结论都出自这些命令能定位到的位置。
起手式:
原始资料索引见 00-资料索引,研究背景与结论摘要见 Codex Harness 研究摘要。
| 维度 | Pi 教程 | dsh 教程 | 本教程 |
|---|---|---|---|
| 拆解对象 | pi-agent SDK | DeepSeek Harness | OpenAI Codex CLI |
| 语言 | TypeScript | TypeScript | Rust |
| 设计哲学 | 减法:核心极简 | 全插件化:一切可替换 | 工程化:产品该有的全做 |
| 规模 | 4 个核心包 | 185 个包 | 102 个 crate / 147 万行 |
| 交付形态 | npm 库 | npm 运行时 + 插件树 | 单个静态二进制 |
| 前端 | TUI | Web GUI + CLI | TUI / IDE / 桌面 App / MCP / 云端,共用一份协议 |
| 扩展方式 | TS 扩展文件 | cordis 插件 + 四层 patch | MCP / Skills / Hooks / Plugins / Code Mode 五条路 |
| 沙箱 | 无(明确不做) | seam + 多后端 | 三套操作系统原生实现 |
| 安全上限 | 靠人 | 沙箱 + 审批 seam | 沙箱 + 审批 + 模型判官 |
| 内容来源 | 转载 + 补全 | 本机取证(打包产物) | 原始源码取证 |
第 15 章会把这张表展开成完整的哲学对照,并汇总全书 26 条可迁移的设计判断(其中 10 条标星为优先采纳项),最后给出对本仓的具体启示。