Skip to content

A0|这份拆解怎么读:你打开的不是 2021 那个 Codex ​

先把名字拆开 ​

第一次搜 “OpenAI Codex”,搜索引擎会把三样东西叠在同一个词上:2021 年那个补全模型、2025 年以后这个本地 Agent、以及 chatgpt.com 上那套云端任务。仓库根 README.md 也在切开——CLI 是本机 agent,编辑器走 IDE 安装页,桌面走 codex app,云端走 chatgpt.com/codex。

这个 git 树开源的是 客户端 harness:用户输入怎么变成模型调用、工具执行、审批、落盘。模型权重、云端沙箱、IDE 外壳都不在这里。把它当「开源 Copilot」读,后面每一章都会对不上号。


1. 2021 的 Codex 模型 vs 2025+ 的 Codex Agent:同名不同物 ​

2021 年的 Codex 是模型。它把公开代码微调进 GPT-3,主业是 token 级补全:给你半个函数,猜下一截。GitHub Copilot 早期吃的就是这套。产品形态是编辑器灰字,不是一个会跑测试、会申请沙箱升级的进程。

2025 年以后重新启用这个名字时,产品已经换成 任务级 agent。CLI 在 2025 年 4 月左右公开,云端 Web 随后跟上,再被收进同一套 ChatGPT 账号。你在这个仓库里看到的,是那个 agent 的本地运行时:TUI、codex exec、给 IDE / 桌面用的 app-server、沙箱、execpolicy、rollout。模型侧是另一条线——GPT-5 / GPT-5-Codex 这类 agentic coding 模型,训练目标是多步改仓库,不是补全一行。

两套东西共享一个词,不共享架构:

2021 Codex2025+ Codex(本仓库)
单位补全建议Thread / Turn / Step
副作用几乎没有跑命令、改文件、调 MCP
安全编辑器撤销沙箱 × 审批 × ExecPolicy
开源模型并未开源harness 开源,模型仍闭源

没有这个区分会怎样?你会把 core/src/session/turn.rs 读成「补全管线」,然后奇怪为什么还要有 AskForApproval、为什么写文件不走万能 shell。那些机制是给 会动手的 agent 准备的,补全模型根本用不上。


2. 本仓库开源什么,闭源什么 ​

许可证是 Apache-2.0(LICENSE)。NOTICE 写明版权 2025 OpenAI。开源的边界以 这个 git 树里有什么 为准,不以产品页上的 “Codex” 二字为准。

在这个仓库里、工程师可以对着读的:

  • 本地 CLI / TUI:codex-rs/cli/、codex-rs/tui/。无 subcommand 就进交互界面:MultitoolCli 的注释写明 options 会 forward 给 interactive CLI(cli/src/main.rs 里 If no subcommand is specified)。
  • 无头执行:codex exec(Subcommand::Exec,cli/src/main.rs:152-154)。
  • 给所有图形客户端用的 JSON-RPC:app-server。IDE 和桌面不是另一套 agent,它们是这个协议的客户端。
  • 执行与隔离:sandboxing/、linux-sandbox/、windows-sandbox-rs/、execpolicy/、exec-server/、apply-patch/。
  • 协议与配置:protocol/(文件头就写了 SQ/EQ,protocol/src/protocol.rs:1-4)、config/、login/、rollout/。
  • 嵌入用 SDK:sdk/typescript/、sdk/python/。TypeScript SDK 自己说了,它是 spawn CLI、吃 JSONL 的薄封装(sdk/typescript/README.md:5)。

不在这个仓库、不要假装能在源码里找到实现的:

  • 模型本身,以及云端任务用的隔离虚拟机。
  • chatgpt.com/codex 的 Web UI 和云端编排。本仓库只有把云端 diff 应用到本地的入口:codex apply(Subcommand::Apply,cli/src/main.rs:200-202)和实验性 codex cloud(:225-227),不是云端 runtime。
  • IDE 扩展的编辑器 UI(VS Code / Cursor / Windsurf / JetBrains / Xcode)。它们走 app-server;行内 diff、打开文件进上下文,是客户端投影,见 E9。
  • 桌面 App 的原生壳。codex app 在 macOS/Windows 上只负责打开或拉安装器(cli/src/app_cmd.rs:15-24),不是 Electron 源码。
  • 部分 ChatGPT Apps / 托管连接器的服务端,以及独立产品 Codex Security(E11 点到为止)。

开源客户端、闭源模型和云,这个组合有一个直接后果:你在本仓库里能抄到的是 harness,抄不到「OpenAI 怎么训模型、怎么排云端队列」。把产品全家桶当成一份 git 历史,会在 E3、E4、E11 全部撞墙。


3. 不接受外部代码 PR ​

docs/contributing.md:5 写得很硬:

We do not accept external code contributions or pull requests.

他们欢迎 issue、复现、根因、设计讨论,代码改动由 Codex 团队自己做。理由写在同文件第 7–13 行:有效改动需要架构上下文、系统约束和路线图;外部 PR 评审往往比自己改更贵。

这对读者意味着两件事。

第一,这本电子书 不是贡献指南。不要读完 B2 就去提一个「重构 ToolOrchestrator」的 PR。社区杠杆在 issue 里的事实,不在 diff 里。

第二,仓库文档和代码纪律是写给内部 agent 和内部开发者的。AGENTS.md 里那些「别再往 codex-core 塞东西」「上下文必须有界」——是他们自己踩过的坑,不是对外 API 承诺。行号会变,判断更值钱。

安全漏洞不要开公开 issue,走 SECURITY.md 指向的 Bugcrowd。


4. 两张图:用户看见的功能 vs 工程师该抄的分层 ​

用户看见的是产品表面。工程师该抄的是 harness 分层。两张图不要合成一张,合成之后你会把 Pets 和 ToolOrchestrator 放在同一层。

用户看见的 ​

同一账号可以把本地任务和云端任务串起来,但 实现不在同一棵源码树。API Key 能驱动本机循环,缺的是订阅产品上的那一圈:部分模型、云端任务、和账号绑定的 Apps。细节在 A1。

工程师该抄的 ​

抄的顺序不是从上到下把功能做全,而是 先让 B 立住:没有事件总线就没有多前端;没有工具四层和 Extension 缝,Skills / MCP / imagegen 都会焊进 codex-core;没有三套旋钮,--yolo 会变成默认安全模型;没有 environment,远程 FS 会再发明一套审批。G1 是 B7 那一枪怎么飞出去,G2 是关掉进程还能翻出来,G3 是多前端共用一只插座,G4 是有效开关从哪来,G5 是 Plan 只换说明书,G6 是有网之后的出站门。F3 的周末切片就是按这个图砍的。

用户图里很显眼的 Pets、Voice、Computer Use,在工程师图里故意靠边。它们是通道或装饰,不是政策层——E5、E8 会反复钉这句。


5. 推荐阅读顺序 ​

41 章不是要你按字母顺序熬完。按目的走。

要自己做 agent: A 之后立刻进 B1–B7,再用 G1 看这一枪怎么打出去、G2 看关掉还能不能翻出来,用 附录 F 钉一枪采样,然后 F2、F3。B 是必抄内核。C / D / E 按你真要做的产品形态再加。第一周不要做宠物、Voice、Computer Use、插件市场、远程 exec-server、本机 daemon、Network Proxy(F3)。读开关看 G4,Plan 模式机制看 G5。

要给团队写 AGENTS.md、配 MCP: C1 → D1 → D3 → D4 → F1。政策放说明书和 ExecPolicy,不要放 Memories。

要对着 TUI 或 IDE 查行为: E1 看「前端只适配」,协议和进程模型看 G3,具体 slash 回 E10 索引,再跳回对应章。不要从 tui/src/chatwidget.rs 开始读——那是投影,不是内核。

读的时候记住三个禁区:

  1. 不要把 docs/ 当架构正文。很多文件只有一行官网链接(例如 docs/getting-started.md、docs/sandbox.md)。F4 会列对照;有冲突以官网和源码为准。
  2. 不要在 TUI 里找智能。协议在 protocol/,循环在 core/src/session/。
  3. 不要跳过「未信任项目」。它同时改配置合并、AGENTS.md 发现、hooks 加载,是 B5 / C1 / D4 的共用前提。

6. 结语:带走一句话 ​

值得抄的是本地 harness;模型、云端 runtime 和不接受外部 PR,标出了故意不让你抄的边界。