Codex App 与 CLI 的 token 差在哪:本机 app-context 对照
我对照本机 Codex CLI、ChatGPT.app 的 Codex 模式和会话文件,想知道桌面端多带了哪些内容。两边记录的基础指令相同;Desktop 另有默认约 949 token 的 app-context,带 Git 设置的样本为 1,203 token。下面把这个输入差异与缓存、费用估算分开说明。
cbefa6b0bede
<app-context>,12 条 Desktop 会话都在这个量级
先限定比较对象
这里比较本机两种 Codex 客户端的请求构造,不比较普通 ChatGPT 聊天。两边使用相关的 Rust app-server 路径,但这不足以单独证明服务端对所有客户端、账号和套餐执行完全相同的计费规则。本文可核对的是指令文本、客户端配置和已有会话记录。
真正多出来的,是 Desktop 写进 history 的那段 <app-context>。默认 949 token。第一轮就在,后面每轮还带着,但不会 949、1898 那样叠加。
普通 ChatGPT 聊天气泡不走这条链路。Help Center 写明 Regular Chat 不进 Desktop 的 Codex 用量看板。本文只比较 Codex CLI 和 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 这条基址。
请求怎样进入 app-server
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 与这份模板逐字节相同。
这份基础指令与桌面 app-context 分开记录。不同模型的指令长度也不同;原稿统计的 gpt-5.4-mini 约为 2,303 token,gpt-5.5 约为 4,090 token。不能把它们算作只属于 Desktop 的开销。
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。
在这些会话样本中,app-context 从第一轮就存在。基础指令相同,与开发者消息中另有桌面上下文并不矛盾。实际长度还会随线程设置变化。
每轮都带,不等于每轮按全价再收一次
为了看清重复部分,可以把请求中的基础指令、桌面上下文、历史和新增内容分别列出:
- 信头:Base Instruction + tool 定义,几乎固定。
- 已经写过的正文:对话、工具结果、Memory、AGENTS.md,以及 Desktop 的 app-context。
- 这轮新写的几行。
同一 thread 使用相同的 prompt_cache_key,但有这个字段不保证每次都命中缓存。是否按 cached input 计量,要查看具体请求的 usage;前缀变化、失效和路由等都可能影响结果。后面的计算器只是给定命中假设后的估算。
按原稿采用的 Sol credit 单价,949 token 全部未命中时约为 0.095 credit,全部按缓存输入计算时约为 0.0095 credit。这是给定单价的算式,不是每轮实测账单。
从 usage 看实际命中,而非只看线程名
本机一条 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 的这条首包记录已有缓存:27,946 input 中 cached 为 6,912。因此,新建 thread 不等于所有前缀必然按未缓存输入计费;应读取实际 usage,不能仅用“第一轮”推算。
费用估算要给出调用次数和命中假设
对话增长到 200K,不会把固定的桌面段自动变成一个百分比加成。估算需要知道每次 app-context 的长度、模型调用次数 N,以及各次缓存命中情况;一句用户消息也可能产生多次工具循环。
| 调用次数 N | 额外 credit | 怎么理解 |
|---|---|---|
| 1 | 0.095 | 整段一次性塞进去;相对 200K 未缓存 input(20 credit)约 0.5% |
| 20 | 0.28 | 短一点的 agent 会话 |
| 50 | 0.56 | 更常见的长会话 |
| 100 | 1.03 | 工具很碎、轮次很多 |
下方示例假设固定增加 949 token、第一调用未命中、之后全部命中,再沿用原稿单价计算。只要长度、调用次数或命中情况改变,结果就会变。因此不能把“200K 对话”直接等同于固定的 0.3–1 credit 差额。
本文不把这个估算换算成美元,也不据此推荐套餐。额度计量、套餐内使用和追加购买是不同问题,需要对应账号的正式账单或价格说明。
工具和插件:核心一样,外壳不同
核心 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 的插件发现和安装路径有限制,Desktop 可能包含线程协调或 Computer Use 工具。相关 schema、截图和工具结果不在默认 949 token 中,不能用这一个数字概括总输入差异。
把首包 input_tokens 减去 instructions 和已落盘 messages 后,CLI 约剩 8,847,Desktop 约剩 9,186–9,268。这些余量可能包括工具 schema 和未写入 rollout 的字段,但样本不是受控 A/B,也没有逐项捕获请求体,所以不能将差额精确归因于工具。
证据边界
- 没有抓 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。