在空仓库里敲下一个"ping",模型还没开始干活,账单已经先跑起来了。OpenAI 的 codex exec --json 文档里给了一行示例:24,763 个输入 token,其中 24,448 个命中缓存,输出只有 122 个 token。文档没说这行示例背后是什么提示词。不管它是什么,模型大约每写一个 token,就要先读进去 200 个。
![]()
这不是个例。每个编程 agent 的命令行工具,在你的任务开口之前,都会先发一段前缀:它自己的系统提示词、内置工具的定义、你配置的 MCP 服务器的工具、以及它沿途找到的每一个指令文件。新会话会重发这段前缀,CI 里的每一次无头运行也会。
所以别抄任何人的数字,包括上面那两行。前缀会随 CLI 版本、模型、你的全局配置和启动目录一起变。要测就自己测:用一个单词的提示词,分别跑 Claude Code、Codex、GitHub Copilot CLI 和 OpenCode,然后再加一个 MCP 服务器和一个 AGENTS.md 跑一遍。表里的每个数字都该来自你自己的机器。
前缀里到底装了什么
系统提示词和内置工具归厂商管,MCP 服务器和指令文件归你管。这两类东西在不同 CLI 里的行为并不一致。
Claude Code 默认推迟加载 MCP 工具定义,其 MCP 文档的说法是"会话启动时只加载工具名和服务器说明"。OpenCode 的文档则给出相反的警告:一个 MCP 服务器"会增加上下文",有些服务器比如 GitHub MCP server"往往会加进大量 token"。Copilot CLI 内置了 GitHub MCP 服务器。Codex 的 MCP 页面没有说明是否推迟加载——这又多了一个必须实测的理由。
指令文件是"空"提示词不再空的地方。每个 CLI 读的文件都比它自己的多:没有全局 OpenCode 文件时,你个人的 ~/.claude/CLAUDE.md 也会跟着进 OpenCode;仓库里的 CLAUDE.md 除了进 Claude,也会落进 Copilot CLI 的前缀。
第一轮:一个词,四个 CLI
先在一个空的 git 仓库里开始,免得项目文件混进来。全局文件仍然会加载,这正是重点:这就是你今天要付的基线。Claude Code 和 OpenCode 还会搜索父目录,所以确认 ~ 和 ~/tmp 下没有 CLAUDE.md 或 AGENTS.md;Codex 到 git 根目录就停。
Claude Code 用 --output-format json 会返回 usage、total_cost_usd 和按模型拆分的 modelUsage。这个成本是客户端估算,不是你的账单。读 usage 时要注意:在 Anthropic 的 usage 对象里,input_tokens 只统计最后一个缓存断点之后的部分,完整输入是 input_tokens、cache_creation_input_tokens、cache_read_input_tokens 三项之和。只看 input_tokens,基线会显得很小。另外检查 .num_turns:如果 agent 为了回答 ping 跑了一次工具,usage 就覆盖了不止一次模型请求,前缀会被重复计入。想要一个不含 hooks、插件、MCP 服务器和 CLAUDE.md 的下限,加 --bare,但它需要 ANTHROPIC_API_KEY,因为 bare 模式会跳过订阅登录。
Codex 的 codex exec --json 输出 JSONL,turn.completed 事件里带 input_tokens、cached_input_tokens、output_tokens 和 reasoning_output_tokens。这里缓存数包含在输入数里:OpenAI 的缓存说明是从 input 里减去 cached 得到未缓存部分。所以只要这一轮只调了一次模型,input_tokens 就是你的前缀加那个单词。
Copilot CLI 的编程参考文档写了 --output-format json,但没写 usage 字段。它的 -s 标志会抑制统计,所以别加,统计会在回复后打印。GitHub 的更新日志说 /usage 和会话结束时打印的摘要都包含"按模型拆分的 token 用量"。想看分层拆分,启动 copilot 输入 /context,它会分别列出 System Prompt、Custom Instructions、System Tools、MCP Tools 和 Messages。
OpenCode 的 opencode run --format json 输出原始 JSON 事件,每一步的 token 记为 input、output、reasoning 和 cache.read/cache.write。在一个提交到 OpenCode 追踪器的会话里,存储的步骤显示 input 209、cache read 18,944,所以要把缓存字段加到 input 上。如果 step_finish 什么都没打印,你可能在用 v2 构建,它不会把 step_finish 送到 stdout;改用 opencode stats --days 1 从存储的会话里读用量。
每条命令在几分钟内跑两次。第一次倾向于把前缀写进缓存,第二次读回来。在 Claude 模型上,缓存读取按输入费率的 0.1 倍或更低计费,所以冷的首次会话比热的重复会话更贵。
第二轮:一个 MCP 服务器加一个 AGENTS.md
现在加上大多数仓库最先长出来的两样东西。MCP 服务器用参考实现"everything"服务器,它的 README 自称"面向 MCP 客户端构建者的测试服务器"。记忆文件写一个简短的 AGENTS.md,更好的做法是从工作仓库里拷一个。在这个仓库里四个 CLI 都会读它,因为这里和上层都没有 CLAUDE.md(Claude Code 需要 v2.1.277 或更高版本才支持这一点)。
Claude Code 这边,默认推迟加载的情况下跑一次,再用 ENABLE_TOOL_SEARCH=false 让所有 MCP 工具提前加载跑一次,两个文件的差值就是一个服务器的工具定义在每次新会话里的价格。Codex 用 codex mcp add 注册服务器后重跑第一轮命令,完事把 [mcp_servers.everything] 从 ~/.codex/config.toml 删掉。Copilot CLI 用 /mcp add 添加,或在 ~/.copilot/mcp-config.json 里放同样的 mcpServers 块并标 "type": "local",重跑后看 /context 里 MCP Tools 那一行变大。OpenCode 把服务器写进仓库的 opencode.json 再重跑。
把差值换算成钱
第一轮和第二轮之间的差距,就是一个 MCP 服务器加一个记忆文件给每次会话启动增加的量。按你账单的方式乘:前缀 token 数,乘以每天的新会话数,乘以模型的输入或缓存写入费率,再加上之后每一次重发前缀的轮次的缓存读取。无头运行要算,并行 agent 也要算。Claude Code 的文档说 agent-team 的队友会"自动加载 CLAUDE.md、MCP 服务器和技能"。
怎么变成钱取决于套餐。在 Claude Pro 或 Max 订阅上,/usage 里的美元数字"与计费无关",但 token 仍然消耗你的套餐额度。Copilot 的套餐在 2026 年 6 月 1 日转向 GitHub AI Credits,"根据 token 消耗计算,包括输入、输出和缓存 token";年度 Pro 和 Pro+ 套餐在到期前仍走 premium requests。用 API key 的话,每个 token 都计费。
如果差值让你意外,修法很无聊:把特定工作流的指令从 CLAUDE.md 挪到按需加载的技能里,把 CLAUDE.md 控制在 200 行以内;关掉不用的 MCP 服务器;检查全局文件,因为它们会跟着进每一个仓库。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.