Codex App 并不比 CLI 更省 token:它每轮多带 949 token
网上常说 Codex CLI 比 ChatGPT Desktop 更省额度。我把本机的 CLI 和 ChatGPT.app 拆开看了:本地写代码时,它们走同一条 /backend-api/codex。系统提示两边相同。Desktop 从第一轮就多塞一段桌面说明书,大约 949 token。对话长到 200K 时,这截税大概不到 1 credit。
cbefa6b0bede
<app-context>,12 条 Desktop 会话都在这个量级
先说答案
本地 Codex 任务里,CLI 没有另一套更省 token 的计费器。ChatGPT Desktop 现在的 Codex 模式,就是同一个 Rust app-server 外面加了 Electron 驾驶舱。计费发生在请求离开本机之后,公式按模型的 input / cached / output credit,不按窗口是终端还是 GUI。
真正多出来的,是 Desktop 写进 history 的那段 <app-context>。默认 949 token。第一轮就在,后面每轮还带着,但不会 949、1898 那样叠加。
普通 ChatGPT 聊天气泡不走这条链路。Help Center 写明 Regular Chat 不进 Desktop 的 Codex 用量看板。本文只比较 Codex CLI 和 ChatGPT.app 里的 Codex 模式。
本机 ChatGPT.app 已经是 Codex 壳
我看的安装包是 ChatGPT.app 26.818.61809,bundle id com.openai.codex,从 codex/codex-apps/electron 打出来。旁边还有 ChatGPT Classic.app(com.openai.chat),那是旧聊天客户端。现在这个 ChatGPT.app 里同时有 Codex 线程和 ChatGPT 会话,别把两者的额度混着谈。
捆绑的 codex 二进制版本是 0.149.0-alpha.4.3。本机 npm 安装的 CLI 是 0.149.1。两个 Mach-O 都大约 210MB,都带 https://chatgpt.com/backend-api/codex 这条基址。
同一台引擎,两套驾驶舱
CLI 的 TUI 在进程里启动 app-server,client_name 是 codex-tui。Desktop 用 stdio 拉起捆绑二进制,originator 写成 Codex Desktop,并且固定加上 -c features.code_mode_host=true。
请求体在 ModelClient::build_responses_request 里拼出来:instructions、input、tools、推理设置,并用 thread_id 当 prompt_cache_key。开源仓库里,ChatGPT 登录的基址是 https://chatgpt.com/backend-api/codex。公开文档也写明富客户端连的是同一套 app-server。
Base Instruction 两边就是同一份
生产目录不再用仓库里那份写着 “running in the Codex CLI” 的 prompt.md 兜底。本机 ~/.codex/models_cache.json 在 2026-08-26 拉到的 gpt-5.6-sol 模板是 17,730 字符。CLI 会话和 Desktop 会话落盘的 base_instructions.text 与这份模板逐字节相同。
它每轮都在 instructions 字段里。这不是 App 税。换模型才会变:gpt-5.4-mini 大约 2,303,gpt-5.5 大约 4,090。
Desktop 多出来的是 app-context,不是另一套系统提示
Electron 把一段 <app-context> 塞进第一段 developer 消息。CLI 的 TUI 启动线程时不传这段。最近 12 条 Desktop 会话(0.148 到 0.149)默认都是下面这组小节:
| 小节 | o200k | 作用 |
|---|---|---|
| # Codex desktop context | 31 | 声明你在桌面 App 里 |
| ### Images/Visuals/Files | 228 | 图片要用绝对路径 Markdown |
| ### Automations | 93 | 自动化走专用工具 |
| ### Thread Coordination | 428 | create_thread 等线程工具 |
| ### Inline Code Comments | 168 | ::code-comment |
| 小节合计 | 948 | 实测整段 949,差 1 token 来自拼接 |
视线程类型还会再加:工作区依赖 27、Git 设置 244、无项目目录 140。自动化线程另有 remark-directive 709,手聊没有。用户会话(带 Git)整段 app-context 实测 1,203。
所以「第一次 prompt 一样、后面才变」是误读。系统提示从头到尾一样。Desktop 从第一轮就多了这段说明书。
每轮都带,不等于每轮按全价再收一次
每一轮发出去的请求更像一叠纸:
- 信头:Base Instruction + tool 定义,几乎固定。
- 已经写过的正文:对话、工具结果、Memory、AGENTS.md,以及 Desktop 的 app-context。
- 这轮新写的几行。
信头和 app-context 每轮都会附上,所以看起来「每次都在用这些 token」。同一条 thread 带同一个 prompt_cache_key。服务端认的是前缀:第一轮把前缀写入 cache,后面只对新长出来的那截按全价收,前面按 cached input 收。
官方 Sol 卡:cached 是 input 的十分之一。949 token 未命中大约 0.095 credit,命中后大约 0.0095 credit。
Cache 不是把 prompt 改了
本机一条 CLI 会话的 token_count 是这样涨的。input 变大是因为历史在长,不是 Base Instruction 从 3,552 变成了别的数:
| 第几次 | input | cached | 命中率 | uncached |
|---|---|---|---|---|
| 1 | 25,832 | 5,888 | 22.8% | 19,944 |
| 2 | 35,665 | 25,344 | 71.1% | 10,321 |
| 3 | 38,015 | 34,560 | 90.9% | 3,455 |
| 7 | 56,421 | 56,064 | 99.4% | 357 |
Desktop 首包同样已经有 cache:27,946 input 里 cached 6,912。新开 thread 等于换信纸,前缀要再付一次全价。
对话 200K 时,会贵多少
200K 文本不会让 949 变成 200K 的某个百分比加成。多出来的仍是每轮 949。贵不贵取决于模型被调用了多少次 N(用户一句话往往不止一次,工具循环也算)。
| 调用次数 N | 额外 credit | 怎么理解 |
|---|---|---|
| 1 | 0.095 | 整段一次性塞进去;相对 200K 未缓存 input(20 credit)约 0.5% |
| 20 | 0.28 | 短一点的 agent 会话 |
| 50 | 0.56 | 更常见的长会话 |
| 100 | 1.03 | 工具很碎、轮次很多 |
窗口已经到 200K 的单次请求里,若大部分前缀命中 cache,App 多出来的 949 大约 0.0095 credit,占这一笔往往不到 0.3%。整条会话从短聊长到 200K,正文才是几十 credit 的量级;桌面税大约 0.3–1 credit。
套餐内额度没用完时,这不是额外钞票,只是额度多耗一点点。买 credit 续用时,第三方用 API 价反推大约 1 credit ≈ $0.04,OpenAI 价目表没有把这个美元换算写成官方标价。按那个量级,0.3–1 credit 大约 1–4 美分。
工具和插件:核心一样,外壳不同
核心 tool 规划器是同一份 spec_plan.rs。这台机器的 ~/.codex/config.toml 两边共用,启用了 12 个插件。ChatGPT.app 还捆绑了 config 里没有的 5 个:messages、latex、deep-research、computer-history、record-and-replay。
本机 CLI 和 Desktop 会话的 skills 清单都是 55 条、同名。Apps 连接器工具缓存 159 个;因为 ≥100,会走 tool_search 延迟加载,不会把大约 198k token 的 schema 整包塞进每一轮。
TUI 会丢掉可发现的 Plugin 工具;codex-tui 里装插件类 request_plugin_install 会直接拒绝。Desktop 还可能露出线程协调工具。Computer Use 截图不在 949 里,用到时另加,而且图像远比这段说明书贵。
首包 API input_tokens 减去 instructions 和已落盘 messages 之后,CLI 大约剩 8,847,Desktop 大约 9,186–9,268。这是 tool schema 加上未写入 rollout 的字段,不是受控 A/B,只能当量级:Desktop 大约再多 400–500。
证据边界
- 没有抓 TLS。tool JSON 的精确字节只能从残差反推。
- 首包 CLI 25,832 vs Desktop 27,946 不能当成干净对照,仓库和用户话不同。
- 服务端会不会按
originator再打折,开源仓库里没有。 - Compact 之后 app-context 会不会被摘要掉,这次抽样没有观察到 compact。
- Sol credit 卡是 2026-08-27 核对的促销价。数字会变。
aggregate.json 和 verify.mjs 会把小节合计、credit 公式和 cache 序列再算一遍。构建时走 bun run verify:articles。主要材料:build_responses_request、Codex 基址、App Server 文档、Using Codex with your ChatGPT plan、Codex pricing。