Skip to content

Codex 源码电子书(41 章) ​

读者优先,不是代码优先。按产品误区和工程分层拆 openai/codex,不按 crate 名排目录。

源码仓库:openai/codex。真正干活的代码在 codex-rs/。官方产品文档在 developers.openai.com/codex;仓库里 docs/ 大量只是跳转,以官网为准。

本书对齐 codex-rs @ 944d6fd1 (2026-09-12)。 行号会随重构漂移;对不上时按文件名和符号名重新定位,别信本书里的具体行号胜过当前源码。

这本电子书教的是:2025+ 这个 Agent harness 为什么这样拆,以及你自己做时该抄哪几层。 不是 API 手册,也不是提 PR 指南——上游仓库不接受外部代码 PR。

适合谁 / 不适合谁 ​

  • 适合:已经懂「模型调用工具」,想对着 OpenAI Codex 源码建立 coding agent harness 的工程分层(主循环、工具、沙箱、上下文、扩展),并带走可抄切片。
  • 不适合:只想用 TypeScript 跟练最小闭环——请先 实践篇;OpenCode 主书概念入口见 什么是 AI Agent。

跨线入口 ​

怎么读 ​

新读者或者第一次接触 agent harness 概念的人,先扫一眼 术语表 混个脸熟——不用记,读到生词回来查就行。这本书本身写给已经懂"模型调用工具"这类通用概念的工程师,术语表是补那道台阶,不是替你从零讲 agent 是什么。

你的目的读法
自己做一个 coding agentA0–A2 站稳,B1–B7 必抄,G1 G2 补推理与落盘,附录 F 钉一枪,F2–F3 收束
搞清产品家族和账号能力A1,再按需翻 E
读仓库为什么代码在、默认看不见G4
给项目写说明书 / 配扩展C1,然后 D1–D4
对照 TUI / CI / IDEE1,协议和 daemon 看 G3,细节回 B1
第一周最小切片直接看 F3

目录按阅读职责排,不是字母序:G(抄 harness 绕不开的层)在 F(收束)前面。

一次只消化一章。正文引用写成 path:line,对着仓库打开,不在这里贴完整函数。行号会随重构漂移,对不上时按文件名和符号名重新定位。

目录 ​

A. 地图 ​

章文件读完应带走的判断
A0A0-这份拆解怎么读.md同名不同物;开源的是客户端 harness,不是整个 Codex 产品
A1A1-产品家族.md六个入口不是六套 Agent;API Key / 本地 provider 能跑循环,没有 Codex 后端
A2A2-一次任务的生命周期.mdThread 活着,Turn 干活,Step 采样;/side 不是协议 fork

B. 内核(做 Agent 必抄) ​

章文件读完应带走的判断
B1B1-主循环与事件总线.md智能在 Session 的 SQ/EQ 上;EventMsg 按职分流;oneshot 不是 Event
B2B2-工具系统.md模型看见的和机器执行的必须拆开;产品能力挂 Extension,不往 core 焊 Handler;默认 exec 是可恢复 PTY
B3B3-沙箱审批与ExecPolicy.md能力是 permission profile;三档只是内置档案;--yolo 只给外层已隔离的环境
B4B4-上下文装配与压缩.md模型看见的必须能从 fragment 和 rollout 重建;compact 是替换起点,不是改过去
B5B5-配置鉴权与持久化.md身份在 CODEX_HOME;几条登录路进同一只 AuthManager;JSONL 是会话真相
B6B6-执行环境与exec-server.md执行后端可以是另一台机器;审批和 profile 仍在本机 Orchestrator
B7B7-一枪采样与指令栈.md一枪是 Prompt 三块;指令栈谁常驻谁点名;失败不是一种 retry

C. 行为、记忆与个性化 ​

章文件读完应带走的判断
C1C1-AGENTS项目说明书.md说明书是短而可执行的项目政策;正本是 AGENTS.md,fallback 才去读 CLAUDE.md
C2C2-Memories跨会话记忆.md默关的本机笔记;读/写两套开关;不替代 AGENTS.md
C3C3-Chronicle与Computer-History.md采集器写扩展文件,不是第二条 Turn;截屏预览已被交互事件替换
C4C4-Personality语气.md只改指令里的语气段;Friendly/Pragmatic 已不再换模板,None 才剥掉那一节
C5C5-Plan与Goal.md/plan 是先调查再改;/goal 是 thread 上的完成条件;并行 Goal 配 worktree

D. 扩展层 ​

章文件读完应带走的判断
D1D1-Skills.mdSkill 是说明书包:先目录后正文;目录变了推 skills/changed,当前枪仍冻住
D2D2-Plugins.mdPlugin 是安装单元,不是进程内 Extension;一份 plugin.json 打包四件套,MCP 可单独关
D3D3-MCP与Apps.mdCodex 是 MCP client;stdio 启动即执行;嵌 Codex 走 app-server
D4D4-Hooks.md同步 hook 用 exit 2 或 JSON 拦截;项目 hook 过未信任闸,脚本还要过哈希
D5D5-Subagents.md默认不主动拆;角色只能减权;V2 是另一套协议,不是 V1 换皮

E. 产品表面 ​

章文件读完应带走的判断
E1E1-多前端.md同一只 app-server 插座;TUI overlay、exec 守 stdout、SDK 只适配
E2E2-Worktrees与Local-environments.md隔离单位是第二份 checkout;一条 worktree 绑一条 thread
E3E3-Cloud与Remote.md云端不在这棵树里跑;Remote 是看本机 app-server;缝是 git apply
E4E4-Computer-Use.md看点打是桌面插件;OS 辅助功能 ≠ 应用白名单 ≠ Seatbelt
E5E5-感知通道.md搜、看、听、贴图都是进 fragment 的通道;看见不等于能写
E6E6-Review与Git.md/review 是减权只读会话;Guardian 拦工具;/diff 只给人看
E7E7-Automations.md时刻表叫醒 harness;默认后台 worktree;调度器不在 core
E8E8-Pets宠物.md四态只投影 Session;Kitty/Sixel 才画得出;不准进 ToolRouter
E9E9-IDE与桌面特有UX.md选区和行内 diff 是投影;/import 迁 Claude/Cursor 配置
E10E10-TUI-slash命令总表.mdslash 只是菜单;无 /personality;/pet 是 /pets 别名
E11E11-Codex-Security.md找洞产品 ≠ /review ≠ Guardian;/codex/security 不是沙箱文档

G. 抄 harness 绕不开的层 ​

章文件读完应带走的判断
G1G1-推理栈与Responses客户端.mdPrompt 是合同;打出去是 turn-scoped 的 Responses 客户端,不是一个 URL
G2G2-会话持久化与Thread-Store.mdJSONL 重建上下文;Thread Store 做列表、分页、持久队列
G3G3-App-server与Daemon.md多前端共用 v2 插座;TUI 只探测已有 socket,不默默 Start
G4G4-Feature-Flags.md有效开关来自注册表和合并链,不是一份 [features]
G5G5-协作模式.md模式是 developer 说明书预设;不是子代理,不是 /side
G6G6-Network-Proxy.md双门闩 + allowlist;limited 只许 GET/HEAD/OPTIONS;升出沙箱就绕过代理

F. 收束 ​

章文件读完应带走的判断
F1F1-分层对照表.md十层各答一个问题;进 git 的是政策,不是账号和记忆
F2F2-可抄清单与反模式.md先抄总线、Prompt、PTY、三套旋钮;--yolo、项目 MCP 自启、记忆当政策是反模式
F3F3-周末最小切片.mdP0 交出可审批的 patch + 可恢复 exec + Event 流;宠物和插件市场不进第一周
F4F4-源码与官方入口.md源码 > 官网 > docs/ 跳转;sandbox.md 链的是 Security 产品页

附录 ​

章文件读完应带走的判断
A附录A-Guardian评审员Session.md隔离的同步评审员;替代的是部分「人点 Allow」,不是沙箱
B附录B-unified_exec长进程.md管的是可恢复 PTY;启动冻沙箱,stdin 再审;Unix zsh-fork 用 socket 升权,不拆终端
C附录C-远程compact-v2.md压缩是 provider 能力;流最多 2 次重试;64k 保留窗,图片整块留
D附录D-code-mode.md模型写 JS 编排工具;V8 无 I/O;嵌套 call 仍过 Orchestrator
E附录E-apply-patch文法.mdLark freeform:三种 hunk;按内容匹配;shell 拦截走同一解析器
F附录F-一枪采样解剖.md一枪是 Prompt 三块;流才重试;用 test_codex 钉文件和 Event

写作约定 ​

  • 先判断,再给文件行号。
  • 每个关键设计都写「如果没有这一层会怎样」。
  • 章末只带走一句判断,不列提纲式总结。
  • 产品能力以当时源码和官网为准;E7 触发器、模型名等会变,正文会标明「以当时产品为准」。

读完这一章,下一步做什么

本章行动任务