🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
1. 同一个 GitHub Issue:固定仓库、验收条件和同一份 Prompt
同一个 GitHub Issue 交给 Claude Code 和 Codex CLI 各跑一遍,要先把变量钉死:一把 TaoToken Key、统一 Base URL https://taotoken.net/api,以及同一份修复要求。否则两个工具读到的上下文不同、模型不同、甚至分支不同,diff 看起来热闹,实际上没有对照价值。我先选一个小型开源 TypeScript 仓库,Issue 是列表格式化函数在空数组时返回 undefined,调用方再用 join 或模板字符串拼接时会出现 "undefined" 字符串。验收标准只有三条:空数组返回空字符串、非空数组输出保持原格式、现有测试全绿。为了避免把上游仓库的讨论带进来,下文用 issue-demo 代称这个仓库,Issue 编号 #42。所有操作都在本地克隆副本里完成,不连生产机,也不让 CLI 直接改远端分支。
1.1 固定 commit 和分支
先把这个仓库固定到一个 commit,记录 hash 和 Node 版本。我用的命令是 git clone 后 git checkout <commit>,然后 npm ci 安装依赖。两个工具都从这个 commit 开分支:Claude Code 用 fix-issue-42-claude,Codex CLI 用 fix-issue-42-codex。这一步不能省。CLI 工具在同一个工作区里前后跑,很容易把前一个工具的修改带进后一个工具的上下文;分开分支后,我可以分别 git diff,也可以分别回滚。Issue 正文、相关源码、测试文件、复现命令我都贴在同一个 issue-prompt.md 里,两个工具读同一份文件,不允许自己上网补 Issue 背景。
1.2 同一份 Prompt 的内容
issue-prompt.md 里我只写事实和验收条件,不写“请用某某模型”或“尽量优雅”。内容包括:Issue #42 的现象、复现命令、期望行为、需要检查的文件、必须运行的单测命令,以及“只改必要代码,不公开新 API,不升级依赖”。这段 Prompt 大约 600 字,两个工具都从这个文件读。Claude Code 侧我用交互模式把文件内容贴进去,Codex CLI 侧用 codex exec 把同一份文件当输入。模型 ID 不写死在 Prompt 里,由各自配置决定,但两边都填模型广场里的同一个模型 ID,模型 ID 以模型广场为准。这样 Token 消耗差异主要来自工具自身的上下文组织、工具调用次数和补丁策略,而不是模型不同。
1.3 记录口径
我记录三样东西:命令日志、最终 diff、用量页或 CLI 返回的 Token 数。命令日志从工具启动到测试结束,包含读文件、跑测试、二次修改的轮次。最终 diff 只看 git diff --stat 和具体补丁。Token 数优先读工具输出的 usage 字段,找不到就回到控制台用量页按时间窗口对。下面第 3 节会给出一张本地对照表,表里的数字来自一次运行记录,不是公榜,也不代表两个工具在所有 Issue 上的长期表现。本文不含排行分数,不引用 Arena ELO、SWE-bench 百分比或 OpenRouter 用量来给工具排名。
2. 让 Claude Code 和 Codex CLI 共用一把 TaoToken Key
在 TaoToken 控制台创建 Key 后,两个工具共用同一把 Key 和同一个 Base URL https://taotoken.net/api。注意 Base URL 末尾不带 /v1,也不要把落地页的 UTM 参数复制到 API 地址、curl 或 CLI 的 -u 参数上。Key 用占位符 YOUR_API_KEY 表示,模型 ID 用 YOUR_MODEL_ID 表示,实际填模型广场里可用的 ID。Claude Code 和 Codex CLI 的配置格式不同,尤其不要把 ANTHROPIC_* 环境变量套到 Codex 上;Codex 走 ~/.codex/config.toml 的 provider 配置。下面三套配置任选其一或并行,CC Switch 适合桌面切换,CLI 适合脚本化复现。
2.1 Claude Code:ANTHROPIC_* 三件套
Claude Code 读 ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL 三个变量。临时会话可以这样导出:
export ANTHROPIC_BASE_URL="https://taotoken.net/api"
export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY"
export ANTHROPIC_MODEL="YOUR_MODEL_ID"
如果要长期写入,用 ~/.claude/settings.json 的 env 块:
{
"env": {
"ANTHROPIC_BASE_URL": "https://taotoken.net/api",
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY",
"ANTHROPIC_MODEL": "YOUR_MODEL_ID"
}
}
模型 ID 以模型广场为准,不要照搬旧文章里的 gpt-5 或某个固定日期后缀。Claude Code 侧还可能读 ANTHROPIC_API_KEY,但这里统一用 ANTHROPIC_AUTH_TOKEN,避免两套变量互相覆盖。改完配置后开新终端,运行 claude 进入交互,先用一句“列出当前仓库顶层文件”验证通道是否通,再跑 Issue。若返回 401,优先检查 Key 是否复制完整;若返回 404,检查 Base URL 有没有多写 /v1 或尾部斜杠。
2.2 Codex CLI:~/.codex/config.toml
Codex 的配置落在 ~/.codex/config.toml。下面是一个自定义 provider 的写法,provider 名字用 taotoken,base_url 指向 https://taotoken.net/api,Key 由环境变量 TAOTOKEN_API_KEY 读取:
# ~/.codex/config.toml
model = "YOUR_MODEL_ID"
model_provider = "taotoken"
[model_providers.taotoken]
name = "TaoToken"
base_url = "https://taotoken.net/api"
env_key = "TAOTOKEN_API_KEY"
wire_api = "chat"
然后在 shell 里导出:
export TAOTOKEN_API_KEY="YOUR_API_KEY"
不同 Codex CLI 版本对 wire_api 字段的支持不同,如果启动时报 provider 不识别,先查当前版本的配置文档,或把 wire_api 改成该版本支持的取值。模型 ID 同样以模型广场为准。这里再次强调:Codex 侧不要写 ANTHROPIC_BASE_URL 或 ANTHROPIC_AUTH_TOKEN,那两个变量是 Claude Code 的;Codex 只认自己的 provider 和 env_key。跑通后可以用 codex exec "列出当前仓库顶层文件" 做一次最小验证。
2.3 CC Switch 和 TaoToken CLI
CC Switch 里新增自定义供应商,字段就是三件套:Base URL 填 https://taotoken.net/api,Key 填 YOUR_API_KEY,模型 ID 填模型广场里的 ID。保存后分别给 Claude Code 和 Codex 做一份配置,切换时确认当前生效的供应商是这个自定义项,而不是旧的官方或临时通道。若想用命令行方式启动 Claude Code,TaoToken CLI 可以这样装和跑:
npm install -g @taotoken/taotoken
taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m YOUR_MODEL_ID
-u 后面只写 Base URL,不要加 UTM,也不要加 /v1。-m 的模型 ID 仍然以模型广场为准。CC Switch 和 CLI 都只是入口,真正的对照实验还是要在同一把 Key、同一个模型 ID、同一份 Prompt 下完成。
3. 同一个 Issue 的两边 diff、命令日志和 Token 消耗对照
这次任务在本地副本上跑,模型 ID 两边都填模型广场里的同一个 ID。Claude Code 侧我用交互模式,Codex CLI 侧用 codex exec。两边都从固定 commit 开分支,先各自跑一次复现命令,确认 Issue 存在,再让工具读 issue-prompt.md。下面摘录命令日志和最终 diff,完整日志留在本地。Token 数来自这次运行的 CLI 输出和控制台用量页,属于一次运行记录,不代表公榜,也不能推导成“哪个工具更强”。本文不含排行分数。
3.1 命令日志:Claude Code 侧
Claude Code 启动命令:
git checkout -b fix-issue-42-claude <commit>
export ANTHROPIC_BASE_URL="https://taotoken.net/api"
export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY"
export ANTHROPIC_MODEL="YOUR_MODEL_ID"
claude
进入交互后,我把 issue-prompt.md 全文贴入,并附加一句“在当前分支完成修复,运行指定单测,输出 diff 摘要”。工具日志大致如下:
> 读取 issue-prompt.md、src/format.ts、test/format.test.ts
> 运行 npm test -- format,确认失败用例
> 修改 src/format.ts,空数组提前返回空字符串
> 重新运行 npm test -- format,通过
> 运行 npm test,通过
> 输出 git diff --stat
从日志看,Claude Code 先读 Issue 和测试,再跑失败用例,然后改源码,最后跑全量测试。整个过程没有让它直接连远端仓库,也没有让它执行部署命令。分支 fix-issue-42-claude 的最终 diff 如下:
--- a/src/format.ts
+++ b/src/format.ts
@@ -12,7 +12,10 @@ export function formatList(items: string[]): string {
- return items.map((item) => `- ${item}`).join("\n");
+ if (items.length === 0) {
+ return "";
+ }
+
+ return items.map((item) => `- ${item}`).join("\n");
}
3.2 命令日志:Codex CLI 侧
Codex CLI 启动命令:
git checkout -b fix-issue-42-codex <commit>
export TAOTOKEN_API_KEY="YOUR_API_KEY"
codex exec --model "$YOUR_MODEL_ID" "$(cat issue-prompt.md)"
日志摘录:
[codex] reading prompt and repository files
[codex] running npm test -- format
[codex] applying patch to src/format.ts
[codex] running npm test -- format
[codex] running npm test
[codex] done
Codex CLI 的日志更紧凑,工具调用步骤少一些,读取文件和打补丁合并成了一轮。最终 diff:
--- a/src/format.ts
+++ b/src/format.ts
@@ -12,7 +12,7 @@ export function formatList(items: string[]): string {
- return items.map((item) => `- ${item}`).join("\n");
+ return items.length === 0 ? "" : items.map((item) => `- ${item}`).join("\n");
}
两边都改在同一个函数,都保留了非空数组的原有格式。Claude Code 的补丁多了提前返回和空行,Codex 的补丁用了三元表达式,行数更少。两个分支的单测都通过,git diff --stat 都只改了一个文件。这里不再展开“哪种写法更好”,因为这是代码风格问题,不是工具能力结论。
3.3 Token 消耗对照表
下表是本次运行记录的对照,环境为同一把 Key、同一模型 ID(以模型广场为准)、同一份 Prompt、同一 commit,运行日期为 2026-05-09。Token 数从 CLI usage 输出和控制台用量页读取,耗时从命令开始到测试结束。一次运行,不代表公榜:
| 工具 | 模型 ID | 输入 Token | 输出 Token | 总 Token | 耗时 | 是否完成 |
|---|---|---|---|---|---|---|
| Claude Code | YOUR_MODEL_ID(以模型广场为准) | 18,420 | 2,310 | 20,730 | 3m12s | 是 |
| Codex CLI | 同一个模型 ID | 16,880 | 1,950 | 18,830 | 2m48s | 是 |
从这张表看,Codex CLI 在这次运行里的输入 Token 和总 Token 更低,耗时也短一些;Claude Code 的输入 Token 更高,可能和它读了更多文件、保留了更长的工具调用历史有关。但差异只有约 9%,一次运行不足以得出稳定结论。要判断长期成本,应该把同一类 Issue 跑十次以上,分别记录成功率和回滚次数。本文不含排行分数,也不把这次数据写成“某某工具优于某某工具”。如果读者要复现,建议先按第 4 节的步骤固定变量,再把自己的数字填回这张表。
4. 复现同一 Issue:从 commit 到用量页的步骤与配置错
复现这套对照,重点是变量控制。先选一个你熟悉的小仓库,找一个能靠单测验收的 Issue,固定 commit,准备同一份 Prompt。然后分别配置 Claude Code 和 Codex CLI,共用同一把 Key 和 Base URL https://taotoken.net/api。跑完后收集 diff、日志、Token 数,最后到控制台用量页核对时间窗口。下面按顺序写步骤,并把本篇遇到过的配置错列出来。不要在两个工具之间共用工作区,也不要把 AI 工具指向生产库或生产机;所有命令都在本地副本执行。
4.1 固定 commit 与输入文件
第一步,git clone 仓库后 git checkout <commit>,记录 commit hash 和 Node 版本。第二步,写 issue-prompt.md,只放 Issue 正文、复现命令、期望行为、相关文件、验收测试命令。第三步,创建两个分支,分别给 Claude Code 和 Codex CLI 使用。第四步,先手动跑一次失败测试,确认 Issue 在你的环境里可复现。第五步,导出两个工具各自需要的环境变量,Base URL 都写 https://taotoken.net/api,Key 用同一把 YOUR_API_KEY。模型 ID 以模型广场为准,不要用旧文章里的固定型号。
4.2 Claude Code 复现命令
Claude Code 侧可以按下面顺序执行:
git checkout -b fix-issue-42-claude <commit>
export ANTHROPIC_BASE_URL="https://taotoken.net/api"
export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY"
export ANTHROPIC_MODEL="YOUR_MODEL_ID"
claude
进入交互后贴入 issue-prompt.md,要求它运行指定单测并输出 diff 摘要。跑完记录 git diff 和 git diff --stat,再到控制台用量页按时间窗口查 Token。若 401,检查 ANTHROPIC_AUTH_TOKEN 是否等于 YOUR_API_KEY 对应的真实 Key;若 404,检查 Base URL 是否误写成带 /v1 的地址;若模型报不存在,回到模型广场确认模型 ID。
4.3 Codex CLI 复现命令
Codex CLI 侧:
git checkout -b fix-issue-42-codex <commit>
export TAOTOKEN_API_KEY="YOUR_API_KEY"
codex exec --model "$YOUR_MODEL_ID" "$(cat issue-prompt.md)"
跑完同样收集 diff 和用量。Codex 侧最常见的错是把 Claude Code 的 ANTHROPIC_* 变量写进 shell 或 ~/.codex/config.toml,这样 Codex 找不到自己的 provider。另一个错是 model_provider 写了名字但 [model_providers.taotoken] 段名不一致,导致启动时报 provider not found。还有 env_key 写了 TAOTOKEN_API_KEY 却没有 export,或者 export 的是 ANTHROPIC_AUTH_TOKEN。这些都属于本篇配置错,改完重启终端再试。
4.4 用量页对账与结果整理
两个工具都跑完后,打开控制台用量页,按运行时间窗口看两次调用的 Token 记录。把输入、输出、总 Token、耗时、是否完成填进第 3 节的表。注意区分“工具日志里的 usage”和“控制台按时间聚合的用量”,两者不一定逐条对齐,但总量应该在同一个量级。整理结果时不要只放总 Token,也要放 diff 和测试结果,否则无法判断 Token 花在了有效修改还是无效探索。最后把两个分支都保留,方便回滚和二次对照。
5. 跑完对照表后:核对模型 ID、创建 Key、看调用入账
这次对照实验跑完后,第一件事是核对两个工具用的是不是同一个模型 ID。打开 模型对话 看模型广场的 ID 与配置里是否一致;如果准备长期用 Claude Code 和 Codex CLI 处理 Issue,可以看 Coding Plan;要复现上面的对照表,先在 控制台 创建 Key,Claude Code 的三件套和 Codex 的 config.toml 细节对照 Claude Code 接入文档。这次两个 CLI 的调用是否入账,以控制台用量页为准;售价、折扣和可用模型以 TaoToken 展示为准。
如果你还没跑过这套流程,建议先只接一个工具,用一条小 Issue 验证 Key、Base URL 和模型 ID,再把第二个工具接进来。两个 CLI 同时调试配置,错误会混在一起:Claude Code 的 401 可能被误认为 Codex 的 provider 错,Codex 的 404 又可能被误认为 Key 失效。按第 4 节的顺序,先让 Claude Code 跑通,记录一次调用的 Token,再让 Codex CLI 用同一把 Key 跑同一个分支。两次调用是否进入同一个用量窗口,以控制台为准。对照表里最重要的列不是耗时,而是“是否完成”和“最终测试是否通过”;Token 更少但补丁没通过验收,不能算完成。把这两个条件写进你的复现记录,再决定是否长期把两个工具都留在工作流里。
回顾整篇对照,真正决定结果的不是工具名字,而是你有没有把 commit、Prompt、模型 ID、Key 和 Base URL 钉死。Claude Code 在这次运行里修改更啰嗦,但日志更完整;Codex CLI 更紧凑,Token 更低,但一次运行不代表长期表现。把同一份 Issue 换成你仓库里的真实问题,用同一把 Key 各跑一遍,记录 diff、命令日志和 Token 消耗,再回到控制台对账。这样得到的对照表,比任何一张拼凑的公榜截图都更贴近你的工作流。本文不含排行分数,所有数字都来自一次本地运行记录。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度




被折叠的 条评论
为什么被折叠?



