1. 从 401 与 config.toml 读错开始:把 21 个组合收敛到 TaoToken Base URL
当 Claude Code 报401 invalid x-api-key,Codex 在config.toml里找不到model_providers,Pi 又把旧的ANTHROPIC_BASE_URL读进环境变量时,先别急着换模型。更稳的做法是把供应商层统一:去 TaoToken 官网入口拿 Key,链接是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=harness_cost_intro ,Base URL 固定为 https://taotoken.net/api 。这一步做完,再去拆 7 个模型 × Claude Code、Codex、Pi 三种 harness 的 21 个组合,成本差异才有可比性。
外部评测里常见一个结论:同一批模型放进不同 harness,任务成功率未必差很多,但账单可能差出明显幅度。原因不神秘,harness 不生产 Token,它决定模型推理被触发多少次、每次携带多少上下文、工具结果是否重复注入、失败后是否重试、历史是否被压缩、输出是否被截断。真正消耗 Token 的是模型推理本身,harness 负责改变推理路径。于是“模型单价”只是成本公式的一半,另一半藏在 harness 的上下文工程里。
本文按成本结构拆解者视角写:不讨论玄学排名,只做可复现的成本归因。你会得到三样东西:Claude Code、Codex、Pi 三类 harness 的供应商配置方法;21 个模型-harness 组合的成本拆解表;一套把请求日志映射到 Token 账单的本地分析流程。所有 Key 都用YOUR_API_KEY占位,Base URL 统一为https://taotoken.net/api,工具配置里不加 UTM,官网跳转链接带 UTM。
2. 成本结构拆解口径:harness 不是模型单价,而是 Token 路径
先把口径定清楚,否则 21 个组合会变成 21 组不可比数字。
总成本可以粗略写成:
总成本 = 输入 Token × 输入单价 + 输出 Token × 输出单价 + 缓存写入成本 + 缓存读取成本 + 失败重试带来的重复推理 + 工具结果与系统提示的重复注入其中模型单价由 TaoToken 侧按实际模型计费,harness 改动的是后面的 Token 路径。具体来说,三种 harness 会在这些地方产生分叉:
- 系统提示长度:Claude Code、Codex、Pi 对任务约束、工具 schema、仓库规则的注入方式不同,输入 Token 的起点就不同。
- 文件读取策略:有的 harness 倾向先读目录再读文件,有的会批量读取;读得越多,输入 Token 越高。
- 上下文压缩:长任务里是否自动摘要、何时丢弃历史,会直接影响后续每轮请求的输入长度。
- 工具调用次数:同一任务被拆成多少次工具调用,就有多少次模型推理。
- 失败重试:命令失败、补丁冲突、测试挂掉后是否自动重试,重试次数就是成本放大器。
- 输出长度:补丁、解释、计划、日志摘要都会消耗输出 Token。
- 缓存命中:相同前缀是否复用,缓存读取比例会影响实际单价。
所以 21 个组合不能只记录“成功/失败”。至少还要记录:输入 Token、输出 Token、缓存写入、缓存读取、工具调用次数、重试次数、每成功任务成本。成功率接近时,比较每成功任务成本;成功率差距大时,先看失败任务是否产生了无效推理。
在统一 TaoToken Key 后,你可以把模型 ID 作为横轴,harness 作为纵轴。7 个模型可以先用 M1 到 M7 占位,实际替换成你控制台可用的模型 ID。不要用“感觉哪个便宜”来选,直接用矩阵跑。
3. Claude Code 配置:settings.json 与 ANTHROPIC_* 的可复制写法
Claude Code 侧优先使用settings.json,这样项目级和用户级配置可分离。创建 Key 的入口在 TaoToken 官网,链接是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=claude_code_key 。Key 占位符用YOUR_API_KEY,Base URL 用https://taotoken.net/api。
用户级配置可参考:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "YOUR_API_KEY", "ANTHROPIC_MODEL": "your-main-model-id", "ANTHROPIC_SMALL_FAST_MODEL": "your-fast-model-id", "CLAUDE_CODE_MAX_OUTPUT_TOKENS": "8192" } }如果习惯用 shell 环境变量,也可以这样:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="YOUR_API_KEY" export ANTHROPIC_MODEL="your-main-model-id" export ANTHROPIC_SMALL_FAST_MODEL="your-fast-model-id"这里的关键点是:Claude Code 读取的是ANTHROPIC_*系列变量,不要把 Codex 的config.toml混进来。常见报错401 invalid x-api-key多数不是模型问题,而是 Key 没被当前 shell 或当前项目配置读到;404则要检查 Base URL 是否被写成了别的路径。统一写https://taotoken.net/api,不要给 Base URL 附加 UTM 参数。
成本观察点:Claude Code 的上下文往往包含项目规则、工具说明、文件片段。做 21 组合评测时,建议固定工作目录、固定初始 prompt、固定测试命令。否则 Claude Code 在不同仓库里读到的文件数量不同,输入 Token 会漂移,最后把 harness 成本差异误判成模型差异。
4. Codex 配置:config.toml 独立 provider,不要把 ANTHROPIC_* 混进去
Codex 侧使用config.toml,不要复用ANTHROPIC_*。很多配置失败就败在这一步:把 Claude Code 的变量复制进 Codex,结果 Codex 既不读ANTHROPIC_BASE_URL,也不认ANTHROPIC_API_KEY,最后表现为请求没发出或认证失败。
可复制配置示意:
model = "your-codex-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 中设置 Key:
export TAOTOKEN_API_KEY="YOUR_API_KEY"如果你的 Codex 版本要求responses或其他 wire API,以你本地版本文档为准;本文能核实的是供应商入口:Base URL 为https://taotoken.net/api,Key 来自 TaoToken 控制台。创建 Key 的入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=codex_key 。
成本观察点:Codex 在编码任务里常出现“计划—编辑—运行测试—修复”的循环。每一次循环都可能重新携带部分历史。要拆成本,就在本地日志里记录每轮请求的 input tokens 和 output tokens。若同一模型在 Codex 下的重试次数明显高于 Claude Code,那么成本上升不一定来自单价,而是来自重复推理。
另外,不要为了让 Codex 读 Claude Code 配置而把ANTHROPIC_*写进config.toml。这是无效映射。正确做法是三份配置各自独立:Claude Code 用settings.json,Codex 用config.toml,共享的只有同一个 TaoToken Key 和同一个 Base URL。
5. Pi 与 CC Switch 三件套:多 harness 并行时的 Key 映射
Pi 作为第三种 harness,在原文语境里和 Claude Code、Codex 并列参与 21 组合。如果 Pi 本地版本支持自定义 OpenAI 兼容或 Anthropic 兼容供应商,就把 Base URL 填https://taotoken.net/api,Key 填YOUR_API_KEY。如果它没有公开的自定义供应商入口,不要臆造插件名或配置字段;这种组合只能标记为“不可改写”,不纳入统一 Key 成本对比。否则你会得到一张假表:看起来 21 个组合都统一了,实际 Pi 走的是另一条链路。
CC Switch 三件套可以理解为三份配置文件的切换:
Claude Code:~/.claude/settings.json Codex:~/.codex/config.toml Shell 环境:~/.config/taotoken/env.shenv.sh可以这样拆开写:
# Claude Code 使用 export ANTHROPIC_API_KEY="YOUR_API_KEY" export ANTHROPIC_BASE_URL="https://taotoken.net/api" # Codex 使用 export TAOTOKEN_API_KEY="YOUR_API_KEY"切换时只加载对应变量。常见错误是全局同时导出所有变量,结果 Codex 读到了ANTHROPIC_*,或者 Claude Code 读到了空 Key。多 harness 评测里,建议每个组合用独立 shell 会话,并在日志开头打印当前 harness 名称、Base URL、模型 ID,但不打印完整 Key。
Pi 的成本观察点与另外两者类似:看它每轮携带多少历史、工具结果是否截断、失败后是否重试。如果 Pi 不支持统一 Key,就不要把它的账单和 TaoToken 账单混在一起比较;可以单独记录它的本地耗时和成功率,但成本表里标注为不可比。
6. 21 个模型-harness 成本结构拆解表
下面这张表是复现产出的核心。模型用 M1 到 M7 占位,实际替换成你可用列表中的模型 ID。Harness 固定为 Claude Code、Codex、Pi。每个组合都重点看“谁在消耗 Token”:模型推理。harness 负责改变输入长度、输出长度、重试次数和工具调用次数。
| 编号 | 模型 | Harness | 主要 Token 消耗 | 成本放大点 | 可观察指标 | 优化动作 |
|---|---|---|---|---|---|---|
| H-01 | M1 | Claude Code | 系统提示 + 文件读取 | 历史压缩前重复读文件 | input tokens、cache read | 固定工作目录,关闭无关自动读取 |
| H-02 | M1 | Codex | 多轮计划与补丁 | 测试失败后重复推理 | output tokens、retry 次数 | 缩短计划输出,限制最大重试 |
| H-03 | M1 | Pi | 工具结果注入 | 长日志反复进入上下文 | tool result tokens | 只保留失败行,截断成功日志 |
| H-04 | M2 | Claude Code | 大文件片段 | 每轮重新注入项目规则 | cache creation | 合并规则文件,减少重复前缀 |
| H-05 | M2 | Codex | 编辑循环 | 小步提交导致轮次过多 | request count | 合并补丁,减少中间确认 |
| H-06 | M2 | Pi | 上下文摘要 | 摘要质量差导致再次读取 | input tokens | 固定摘要模板,限制历史轮数 |
| H-07 | M3 | Claude Code | 代码搜索 | 搜索范围过大 | 检索结果 Token | 限定目录,排除构建产物 |
| H-08 | M3 | Codex | 命令输出 | 全量测试日志 | output tokens | 只输出失败用例摘要 |
| H-09 | M3 | Pi | 多文件编辑 | 文件内容重复携带 | input/output tokens | 分批编辑,完成后清空上下文 |
| H-10 | M4 | Claude Code | 长系统提示 | 工具 schema 较大 | 初始 input tokens | 精简自定义指令 |
| H-11 | M4 | Codex | 自动修复 | 失败后连续重试 | retry 次数 | 设置重试上限,失败即停 |
| H-12 | M4 | Pi | 对话历史 | 未压缩历史累积 | input tokens | 每 N 轮压缩一次 |
| H-13 | M5 | Claude Code | 文件分片读取 | 重复读取同一文件 | cache read | 使用缓存前缀,减少重复读取 |
| H-14 | M5 | Codex | 计划与执行分离 | 计划文本过长 | output tokens | 限制计划字数,直接给补丁 |
| H-15 | M5 | Pi | 工具调用链 | 工具结果格式冗长 | tool result tokens | 要求工具返回结构化短结果 |
| H-16 | M6 | Claude Code | 测试反馈循环 | 测试输出全量回灌 | input tokens | 只回灌失败堆栈 |
| H-17 | M6 | Codex | 长上下文修复 | 历史未及时裁剪 | input tokens | 每轮只保留最近变更 |
| H-18 | M6 | Pi | 多阶段任务 | 阶段间上下文重复 | request count | 阶段结束生成短摘要 |
| H-19 | M7 | Claude Code | 复杂重构 | 大范围文件读取 | input tokens | 先列影响面,再按需读取 |
| H-20 | M7 | Codex | 迭代补丁 | 补丁冲突重试 | output tokens | 冲突后停止并请求人工确认 |
| H-21 | M7 | Pi | 长会话 | 会话越长输入越高 | input tokens | 设置会话上限,超限新建 |
这张表不要只填一次。建议每个组合至少跑 3 次,记录均值和中位数。若某组合成功率接近但每成功任务成本明显高,优先优化该 harness 的上下文重复和重试策略。若某组合成功率低且成本高,先检查是否因为失败后无限重试,而不是模型本身不适合编码。
7. 一次编码任务如何归因:从请求日志到 Token 账单
要让 21 组合可复现,必须在本地记录日志。不要连接生产库,也不要把真实业务数据塞进评测。用本地 fixture 仓库即可。每次任务记录以下字段:
model harness task_id input_tokens output_tokens cache_creation_tokens cache_read_tokens retry_count tool_call_count wall_time_ms success如果工具输出 JSONL,可以用jq做本地汇总:
jq -r '[.harness, .model, .input_tokens, .output_tokens, .retry_count, .success] | @tsv' runs.jsonl \ > summary.tsv再按 harness 和模型聚合成本:
awk -F '\t' '{ key=$1" "$2; in[key]+=$3; out[key]+=$4; ret[key]+=$5; cnt[key]++; if($6=="true") ok[key]++ } END { for (k in cnt) printf "%s\tinput=%d\toutput=%d\tretry=%d\truns=%d\tsuccess=%d\n", k, in[k], out[k], ret[k], cnt[k], ok[k] }' summary.tsv成本归因时,先算每成功任务成本:
每成功任务成本 = 该组合总成本 / 成功任务数如果只算平均每次请求成本,会掩盖重试。一个组合可能单次请求便宜,但失败后重试五次,最终每成功任务成本更高。另一个组合可能单次输入很长,但一次通过,反而更便宜。
还要区分输入和输出。输入 Token 通常由 harness 的上下文策略决定,输出 Token 由模型回答风格和任务要求决定。若输出 Token 异常高,检查是否要求模型输出过多解释、计划、日志摘要。若输入 Token 异常高,检查文件读取、历史压缩、工具结果注入。缓存读取比例高时,实际成本会下降,但不要假设缓存一定命中;在表格里单独记录 cache read 和 cache creation,才能解释账单波动。
8. 降本矩阵:哪些 harness 改动不会伤成功率,只改成本
基于 21 组合,可以把优化动作分成四层。
第一层:输入压缩。限定读取目录,排除node_modules、dist、build、.git;只回灌失败堆栈,不回灌全量成功日志;每 N 轮生成短摘要,替代原始历史。这些动作通常不影响任务成功率,但会直接降低输入 Token。
第二层:输出控制。要求模型先给最小补丁,再给必要说明;限制计划文本长度;禁止重复粘贴已读文件内容。输出 Token 下降后,账单会立刻变化。
第三层:重试策略。给测试失败、补丁冲突、命令错误设置重试上限;相同错误连续出现两次就停止;重试前先压缩上下文。无限重试是成本结构里最隐蔽的漏洞。
第四层:模型路由。大模型做规划和难点修复,小模型做格式转换、简单补全、日志摘要。统一 TaoToken Key 后,切换模型不需要改 harness 的供应商入口,只需要改模型 ID。但要注意:模型路由会增加调用次数,若小模型也产生大量请求,总成本未必下降。用 21 组合矩阵验证,而不是凭感觉。
如果要在 TaoToken 侧查看 Key 与用量,可以再回到官网入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=cost_console 。Base URL 仍然是https://taotoken.net/api。为每个 harness 或每个实验批次创建独立 Key,便于把账单和组合对应起来。
9. 复现清单、报错对照与文末 CTA
复现清单可以按下面顺序执行:
- 准备本地 fixture 仓库,固定任务集、固定初始 prompt、固定测试命令。
- 在 TaoToken 创建实验 Key,占位符统一写
YOUR_API_KEY,Base URL 使用https://taotoken.net/api。 - Claude Code 写入
settings.json,使用ANTHROPIC_*。 - Codex 写入
config.toml,使用独立 provider,不要把ANTHROPIC_*混进去。 - Pi 若支持自定义供应商则填同一个 Base URL;若不支持,标记为不可比。
- 每个模型-harness 组合跑 3 次,记录 input、output、cache、retry、tool calls、success。
- 汇总成 21 行成本表,计算每成功任务成本。
- 先优化上下文重复和无限重试,再考虑模型路由。
常见报错对照:
401 invalid x-api-key:Key 没被当前 harness 读到,或 shell 会话未加载环境变量。404:Base URL 写错,或误加了多余路径。工具配置统一用https://taotoken.net/api。- Codex 不生效:检查
config.toml的model_providers,确认没有依赖ANTHROPIC_*。 - Claude Code 不生效:检查
settings.json的env,确认ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY存在。 - Pi 无法统一:不要编造配置字段,先确认本地版本是否支持自定义供应商。
- 成本异常高:优先看 retry 次数、工具结果注入、历史是否未压缩。
最后按高转化路径走一遍:先在模型对话里验证模型 ID 和响应是否符合预期,入口是 https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=harness_cost_cta_chat ;如果你要长期跑 21 组合,使用 Coding Plan 降低成本不确定性,入口是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=harness_cost_cta_plan ;然后创建独立 API Key,入口是 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=harness_cost_cta_keys ;Claude Code 的接入细节看文档 https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=harness_cost_cta_doc 。官网总入口也可以从这里进入:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=harness_cost_final 。统一 Key 之后,21 个模型-harness 的成本差异就不再是黑盒,而是可以逐项拆开的 Token 路径。