🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
1. 任务设定:用 Go 仓库重构当 Claude Code 与 Codex 的起跑线
同一个 Go 模块,同一把 TaoToken Key,Claude Code 和 Codex CLI 跑出来的 commit 风格完全不同。先把 Key 建好,两条 CLI 都填同一个 Base URL,剩下的交给工具自己发挥。
这次对照实验选 Go 模块而不是普通 JavaScript 脚本,原因是 Go 的编译器就是最严格的验收员。拆公共函数这件事,改完不能光靠肉眼检查,go test ./... 必须真的跑过。我用一个本地 orders 模块做测试仓库,结构如下,刻意保留一点依赖关系:CalculateTotal 会调用 ApplyDiscount,Checkout 和 NotifyCustomer 都依赖 FormatReceipt。这样一来,把函数拆到独立 package 时就牵涉多个文件的 import 修改,而不只是剪切粘贴。
仓库初始 commit 只有一个 go.mod、一个 main.go、internal 下三个文件,都是最小可跑状态。
orders/
├── go.mod
├── main.go
└── internal/
├── calc.go
├── checkout.go
└── notify.go
两个工具收到的 prompt 也完全一致:把 internal/calc.go 里的 CalculateTotal、ApplyDiscount 拆到 internal/pricing,把 FormatReceipt 拆到 internal/format,保持对外行为不变,跑通 go test ./... 后提交 commit。为了安全,我是在临时目录跑的,没有让 agent 直连生产仓库。先把这一点说清楚:这类工具默认会直接修改工作区文件,所以在生产环境前一定要先用复制出来的仓库验证流程。
2. 两个 CLI 怎么接到同一把 TaoToken Key
TaoToken 在这里只负责两件事:给一把 Key,给一个所有模型共用的 Base URL。创建 Key 的部分不展开,官网落地页就有入口。重点看两个 CLI 各自怎么认这把 Key。
Claude Code 使用的是一组 ANTHROPIC_* 环境变量,TaoToken 的 Base URL 替换掉 Anthropic 官方端点即可。终端里这样起:
export ANTHROPIC_BASE_URL=https://taotoken.net/api
export ANTHROPIC_AUTH_TOKEN=YOUR_API_KEY
export ANTHROPIC_MODEL=模型广场里的Claude模型ID
这三个变量分别指定网关地址、认证 token 和模型 ID。注意 Base URL 只到 /api,不需要拼 /v1。如果你习惯用配置文件,也可以把同样内容写进 ~/.claude/settings.json 的 env 块,这样每次启动 claude 都自动生效:
{
"env": {
"ANTHROPIC_BASE_URL": "https://taotoken.net/api",
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY",
"ANTHROPIC_MODEL": "模型广场里的Claude模型ID"
}
}
Codex CLI 走的不是 ANTHROPIC_*,它有自己的供应商机制。先在 shell 里导出 Key:
export TAOTOKEN_API_KEY=YOUR_API_KEY
然后编辑 ~/.codex/config.toml:
model = "模型广场里的模型ID"
model_provider = "taotoken"
[model_providers.taotoken]
name = "TaoToken"
base_url = "https://taotoken.net/api"
env_key = "TAOTOKEN_API_KEY"
wire_api = "chat"
这段配置的关键是 model_providers 块。Codex 会把名为 taotoken 的 provider 作为自定义供应商加载,base_url 指向统一 API;env_key 告诉 Codex 去读取环境变量里的 Key,而不是把 Key 明文写进 toml。model 字段填模型广场上与你本次任务匹配的模型 ID。两个工具都配置好后,在仓库根目录分别执行命令即可。
3. 重构实录:Claude Code 两步提交,Codex 一次 patch 落地
3.1 Claude Code:先读文件,再建子包,两次 commit 收尾
我这次跑的时候,Claude Code 进了仓库后的第一轮动作是读文件。它不是直接建 internal/pricing,而是先把 go.mod、main.go 和 internal 下三个文件都读了一遍,然后在上下文里列了一份调用关系草图:Checkout 调用 CalculateTotal,CalculateTotal 调用 ApplyDiscount,NotifyCustomer 依赖 FormatReceipt。第一轮输出几乎都是计划和文件内容确认,没有产生实际文件改动。
它的第一个 commit 只新增了 internal/pricing/price.go 和 internal/format/format.go,函数体搬去了新文件,但 checkout.go、notify.go 里的调用还是旧名字,go test 处于失败状态。第二个 commit 才补齐 import 和调用点。main.go 里原本直接调用 CalculateTotal 的地方被改成 pricing.CalculateTotal。这次运行时,Claude Code 把大量 token 花在了读文件并把文件内容留在上下文这件事上,所以输入 token 偏高。
3.2 Codex CLI:一个 commit 完成整段迁移
Codex CLI 这次的使用方式与非交互模式类似,它的处理路径跟 Claude Code 差异明显。Codex 进入仓库后没有输出长长的计划,而是先在内部把改动范围定下来,然后一次性应用 patch。最终 commit 里同时包含新增的子包文件、checkout.go、notify.go、main.go 的调用点修正。也就是说,一个 commit 就完成了 Claude Code 两步做的事。
代码风格上,Codex 保留了原有注释,只新增了必要的 import 和包前缀;Claude Code 则在新文件里补了一些包级别注释。两者最终都通过 go test。区别主要来自工具自己的工作方式:Claude Code 的 Agent 循环倾向于逐步确认,Codex 更愿意把完整 diff 一次性落盘。这个差异对重构类任务的影响在 commit 历史里看得最清楚,对最终代码质量的影响则没有想象中大。
4. Token 消耗对照表:Claude Code 与 Codex 的实测差异
| 指标 | Claude Code | Codex CLI |
|---|---|---|
| 输出 commit 数量 | 2 个 | 1 个 |
| 总 token 消耗 | 约 48,200 | 约 39,400 |
| 其中输入 token | 约 31,600 | 约 24,300 |
| 其中输出 token | 约 16,600 | 约 15,100 |
| 单次任务耗时 | 约 3 分 20 秒 | 约 2 分 05 秒 |
| 是否通过 go test | 通过 | 通过 |
| 是否需要人工介入 | 否 | 否 |
这张表来自 2025-09-13 的一次本地运行,使用 TaoToken 提供的同一把 Key、同一个 Base URL,两个工具在同一初始 commit 上各跑一遍。一次运行只能代表这一次运行,不代表公榜,也不代表模型能力排序。数字差异比较大的是输入 token:Claude Code 多出约 7,300。原因是它把读文件的内容计进了上下文,而 Codex 内部把读文件与生成 patch 分开处理,最终输出 token 反而只差了约 1,500。这说明两个工具消耗差异主要来自交互策略,而不是最终代码量。
跑完后去 TaoToken 控制台对账可以看到每轮请求的 token 明细。控制台里的模型 ID 和本次 prompt 用到的模型 ID 应该与模型广场一致。多跑几轮之后,在控制台按时间筛选能直接比较两个工具各自的总消耗,不需要自己加总。这正是我建议用统一 API 做 Agent 对比的原因:Key 只有一个,计费入口只有一个,变量被压到最小。
5. 三个配置坑:Base URL 后缀、Codex 环境变量、模型 ID
5.1 Claude Code 的 Base URL 多拼了 /v1
第一个坑是 Claude Code 的 Base URL 多拼了 /v1。TaoToken 的 API 地址是 https://taotoken.net/api 本身,不需要像某些官方 SDK 默认值那样补 /v1。Claude Code 会拿这个 Base URL 直接拼路径,多了 /v1 就会 404。如果你看到请求发到 /api/v1/... 且 404,先把 Base URL 改回 https://taotoken.net/api。
5.2 把 ANTHROPIC_AUTH_TOKEN 抄给 Codex
第二个坑是把 ANTHROPIC_AUTH_TOKEN 抄给 Codex。Codex CLI 的供应商机制不读 ANTHROPIC_*,它会从 config.toml 里的 env_key 指定的环境变量取 Key。正确做法是 export TAOTOKEN_API_KEY=... 后在 toml 里写 env_key = "TAOTOKEN_API_KEY"。有人把 Key 直接塞进 toml 也能跑,但权限控制和轮换都不方便,不推荐。
5.3 模型 ID 凭印象填
第三个坑是模型 ID 凭印象填。Claude Code 的 ANTHROPIC_MODEL 和 Codex 的 model 字段都要求精确匹配模型广场里的 ID,哪怕差一个点都会报 model not found。创建好 Key 后先到 TaoToken 官网看模型广场,把 ID 复制下来再填。这条对两个工具通用,也是这次排障里最值得提醒的。
6. 复现这张表:同一仓库、同一 prompt、同一 TaoToken Key
要复现上面这张对照表,不需要复杂的测试平台,一台能跑 Go 的机器加上两个 CLI 就够了。步骤如下,建议每一步之间保持仓库干净。
- 创建 Key。到 TaoToken 官网创建 API Key,复制下来备用。官网在建 Key 时也会展示你当前可用的模型 ID。
- 准备仓库。将 orders 模块复制到临时目录,确保初始 commit 存在。先跑一次 go test ./...,确认基线是绿的。
- 配置 Claude Code。把 ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL 写入当前 shell 或 settings.json,然后进入仓库根目录运行 claude,粘贴 prompt。等它提交完,记录 git log 和运行输出里的 token 统计。
- 重置仓库。用 git reset --hard 回到初始 commit,git clean -fd 清掉新增文件。这步不能省,否则 Codex 面对的是已经拆完包的代码。
- 配置 Codex CLI。导出 TAOTOKEN_API_KEY,写好 config.toml,运行 codex 并粘贴同一个 prompt。同样记录 commit 和 token。两个工具用的是同一把 Key,所以 TaoToken 控制台会自动区分请求时间,方便核对。
- 对账。打开 模型对话 用同一模型 ID 发一条消息,确认模型 ID 没填错;如果之后要长期重复这类 Agent 对比,可以对照 Coding Plan 看长任务资源包。
- 创建 Key 的入口在 控制台,如果还没建 Key,就从这一步开始。
单次运行不代表公榜,但你可以用这套流程建立自己的基线。同一把 Key,同一个仓库,两个工具跑完以后,你会得到一张只属于自己环境的表。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度




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



