OpenAI 管它叫轻量级,Codex 仓库里躺着 115 个 Rust crate
- 重写为 Rust 后含 115 个 crate 和 3290 个源文件,周下载量超 1600 万次
- 采用“笼子优先”安全模型:默认操作系统级沙箱隔离,减少审批疲劳
- 改文件使用自定义补丁格式 apply_patch,节省 token 并支持审计回滚
- 架构五层,核心复用多种交互形态,TUI 依赖 ratatui unstable 特性
- 存在 token 消耗快、自动提问无响应、平台支持不均等和社区贡献有限问题
大家好,我是若风。
2025 年 4 月中,OpenAI 把一个 TypeScript 写的终端编码工具传上了 GitHub,仓库叫 codex。上线几天就冲上各大趋势榜头名,star 数以天为单位往上涨,是那年最凶猛的开源开场之一。
然后他们干了一件让围观群众没想到的事。
上线不满一个月,推倒重写,语言从 TypeScript 换成 Rust。翻 2025 年 4 月 19 日的提交记录,还能看到上一个时代的痕迹,那时 CI 在跑 Prettier 检查,功能是给 codex-cli 加 /diff 命令和 @mention 文件引用,一个标准 Node 项目该有的样子。
十六个月后我再看这个仓库,数字换了一副面孔。112,740 个 star,17,310 个 fork,codex-rs 目录下 115 个 crate、3,290 个 Rust 源文件,npm 包 @openai/codex 过去七天下载 16,334,410 次。发布节奏更夸张,2026 年 8 月 21 日这一天发了 5 个版本,从 rust-v0.149.0-alpha.7.1 一路发到 rust-v0.150.0-alpha.6。
这个 npm 下载量我查了两遍,确认不是接口抽风。
说真的,重写得这么狠、迭代又这么快的项目,我很少见。这篇就把仓库拆开,看看「轻量级终端 Agent」这八个字底下,到底压着多少东西。
「轻量级」三个字,得打个折
README 对这个项目的定位只有一句英文,lightweight coding agent that runs in your terminal,轻量级编码智能体,跑在终端里。
坦白讲,这个「轻量级」我持保留意见。
你 npm install -g @openai/codex 装下来的,其实是一份按平台预编译的二进制,真正的源码在 codex-rs 这个 Rust workspace 里,115 个成员 crate,从 linux-sandbox、windows-sandbox-rs、network-proxy 到 rollout、protocol、tui,安全、会话、界面、协议每一层都是独立 crate,3,290 个 .rs 文件靠 Bazel 加 Cargo 双构建系统管着。
更有意思的是仓库的文档目录。docs/sandbox.md 这个文件,听名字是讲沙箱的,打开只有三行,一行标题,一句「请看官网文档」,一个跳转链接,然后没了。安全设计的细节都收进了 developers.openai.com,仓库里只留了个门牌号。
我一直觉得这个细节值得琢磨。项目越做越大,官方把「轻量」的叙事和「巨兽」的现实两头都占着,仓库文档空心化,社区想读懂它的安全模型,只能自己去翻源码。
所以这篇就翻源码。
先关笼子,再放权
终端编码 Agent 最核心的矛盾从来不是聪明不聪明,是你敢不敢让它动手。让一个 LLM 在你的机器上跑 shell 命令、改你的文件,第一次体验很惊艳,冷静下来全是后怕。
市面上的主流解法是审批,每条命令弹窗问你允不允许,Claude Code 走的就是这条路,权限粒度做得很细。这条路的问题是审批疲劳。你想想看,一个晚上 Agent 可能跑几百条命令,你从第五条开始就闭着眼睛按回车了,审批形同虚设。
Codex 选了另一条路,先关笼子,再放权。它默认假设命令不可信,先丢进操作系统级的沙箱里跑,跑炸了也炸不出工作目录,笼子不够用的时候才升级成问你。
这套笼子在源码里是三层结构。
最外层是文件系统隔离。macOS 这边我直接翻到了策略文件本体,codex-rs/sandboxing/src/seatbelt_base_policy.sbpl 和 seatbelt_network_policy.sbpl,两份 Seatbelt 策略写得明明白白。Linux 这边有个好玩的故事。crate 名叫 linux-sandbox,源码里有个 landlock.rs,347 行,干 Landlock 文件系统限制的活。但文件头注释自己招了,文件系统限制已经改由 linux_run_main 里的 bubblewrap 负责,Landlock 相关代码保留为 legacy 备用。
也就是说,Linux 的文件隔离方案换过一次血,从内核态的 Landlock 换成了 bubblewrap 用户态沙箱,旧代码还在原地当化石。这种决策你不读源码根本不知道,官网文档一个字没提。
第二层是系统调用拦截。landlock.rs 里有个函数叫 apply_permission_profile_to_current_thread,做法很讲究,seccomp 的限制只应用在派生子进程的那个线程上,而不是整个 CLI 进程。注释里还专门解释了 PR_SET_NO_NEW_PRIVS 为什么不能随便开,因为很多 bubblewrap 部署依赖 setuid 提权,一开就废。断网场景就是在这里装 seccomp 过滤器,直接把网络相关的系统调用掐掉。
第三层最精巧,网络归因。一刀切断网太粗暴,很多任务需要网,但你得能回答「这条 curl 是哪个命令发起的、连去了哪」。codex-rs/network-proxy/src/attribution.rs 实现了一套握手协议,沙箱子进程的所有出网流量都会被重定向到本地代理,代理读取环境变量 CODEX_NETWORK_PROXY_ATTRIBUTION 里的令牌,配合一个 8 字节的 magic 帧,字面量是 \0CDXPXY1,令牌最长 128 字节,握手超时 3 秒。靠这套东西,Agent 的每一次出网都能归因到具体命令,审计链路就通了。
其实吧,这三层加起来才是 Codex 真正的护城河。
模型能力是 OpenAI 的,别家买得到。这套操作系统级的笼子是工程团队一行行 Rust 磨出来的,短期抄不走。
改文件不靠写文件,靠一张补丁
第二个值得拆的机制是改文件。
大多数 Agent 让模型直接输出整段文件内容,或者调一个 write 工具。Codex 定义了一套叫 apply_patch 的补丁格式,模型每次改文件输出的是一张自定义补丁,核心结构叫 UpdateFileChunk 和 Hunk,客户端有个 1,444 行的解析器(codex-rs/apply-patch/src/lib.rs),边流式接收边解析边校验,补丁对不上原文件就拒绝落盘。
这个设计有两个直接好处。一是省 token,改十行不用重写一千行,长上下文的窗口能省出余量。二是可审计可回滚,每次编辑都是一张结构化补丁,rollout crate 把它连同会话一起落盘,recorder.rs 和 ordinal.rs 保证事件顺序,之后任何一次修改都能重放。
还有个冷知识。apply_patch 是个独立可执行入口,Codex 二进制会用一个特殊的 argv[1] 标记自我调用,走内部的 apply_patch 路径。一个打补丁的格式做到「进程把自己当子命令」的程度,可见它在这套系统里的地位。
一个内核,长出一堆形态
拆完安全层和补丁层,再看全局架构就顺了。
整张图从上往下五层,交互形态层的四种外壳都只是壳,真正的差异发生在下面的策略判定和系统沙箱两层,最底下那层负责把发生过的每件事都记下来。
core 是唯一的大脑,上面挂着 cli、tui、app-server 三种壳。tui 那个终端界面用 ratatui 写,Cargo.toml 里开了三个 unstable 特性,scrolling-regions、unstable-backend-writer、unstable-rendered-line-info。老实说这是相当激进的选择,unstable 特性随上游版本说撕就撕,等于把 TUI 的渲染性能押在 ratatui 的开发分支上,对一个周下载千万级的工具,这个决定需要点胆量。
同一个 core 还往两端长。sdk/python 和 sdk/typescript 把 Agent 能力包成库,codex app 命令拉起桌面应用。core 里面甚至有个多 Agent 子系统,codex-rs/core/src/agent/ 目录下有 agent_resolver、registry、control/spawn 这些模块,还内置了两个子代理定义,builtins/awaiter.toml 和 builtins/explorer.toml,一个等结果一个探路,主 Agent 按需孵化。
版本治理也值得提一句。execpolicy crate 里有个 RequirementsExecPolicy 结构,文档注释强调它是「需求方所有的执行策略,相等性与顺序无关」,内部用 MultiMap 做程序名到规则的索引。策略匹配做到顺序无关,意味着同一份策略不管怎么存储排序,判定结果都一致,这种确定性是安全审计的地基。
笼子有缝,账单会说话
夸了这么多,该泼冷水了,下面每条都是从 issue 区和源码里亲手挖的。
最大的槽点是 token 消耗。issue #14593,标题就叫 Burning tokens very fast,630 条评论,是这个仓库历史上讨论最凶的帖子,用户抱怨它在空闲或简单任务场景也大把烧 token。旁边的 #28879 有 210 条评论,用户实测 Plus 计划的 rate-limit 成本从 6 月中旬起涨了 10 到 20 倍,5 小时额度两三条提问就耗尽。如果你打算用 ChatGPT 订阅跑 Codex,先去这两条 issue 里看看再决定。
第二个槽点藏在一个 83 条评论的功能请求里。#28969,用户要求给「60 秒自动解决提问」加个开关。Agent 遇到问题会向用户提问,但 60 秒没人答它就按默认值继续跑,挂机的人回来发现它自作主张走了半天歪路。沙箱拦得住它删你的文件,拦不住它拿你的额度跑偏。
第三是平台不对等。macOS 和 Linux 的笼子是第一批建好的,windows-sandbox-rs 这个 crate 是后来补的,Windows 侧还有 #20214 这种 107 条评论的 App 冻结卡顿问题挂着。Linux 那边则依赖 bubblewrap,部分发行版和容器环境装不上,沙箱只能降级。这些 README 都不会告诉你。
还有一条只看贡献数据才明显。头部 30 名贡献者里,前 10 名有 8 个的 ID 直接带着 oai 或 openai 后缀,第一名的提交量 1,482 次,第十名 174 次,断崖式分布。Apache-2.0 协议是真诚的,但「社区共建」目前更多是象征性的,真正的路线图还是一家公司在画。
带走一个判断
如果你只从这篇带走一句话,我希望是这一句。
Codex 的核心设计决策是把审批模型倒过来了。传统方案是「事前问,问累了就放行」,它是「默认关笼子,笼子够用就不问」。我把这个模式叫笼子优先,它的成立有两个前提,一是笼子必须建在操作系统层而不是应用层,应用层的沙箱是君子协定,拦不住真正的越狱,二是笼子内的每个动作要可归因,就像那个 \0CDXPXY1 握手帧干的活,出了事能查到是哪条命令。
这个判断可以迁移到你手头任何 Agent 工具的选型上。看到一个新编码 Agent,先别问它接的什么模型,先看它的权限模型,是每条命令问你,还是默认圈在一块跑不出去的地方。前者考验你的耐心,后者考验它的工程。
耐心总会耗尽,工程不会。
至于 Codex 本身,重仓 Rust 让它拿到性能、单二进制分发和系统级安全原语这三张牌,代价是贡献门槛和 115 个 crate 的维护成本。从一天能发 5 个 alpha 版本来看,OpenAI 目前付得起这个代价。
仓库在 github.com/openai/codex,源码比这篇文章精彩。

评论互动