拓冰建站拓冰建站
首页 / 资讯中心 / 正文

先取 TaoToken Key,再让 Claude Code 和 Pi 各跑 30 个任务

1. HarnessTax 实验顺序先取 TaoToken Key再让 Claude Code 与 Pi 各跑 30 个任务最近 UC Berkeley 团队围绕 coding agent 的 harness 变量做了一组评测把 Claude Code、Codex CLI、Pi 三类 harness 放在同一个任务池里对比。这个研究最值得注意的地方不是“谁比谁强”而是它把harness 本身当作影响结果的重要变量同一批模型换一个执行外壳工具调用、上下文管理、重试策略、停止条件都会变最终消耗的 Token 和任务通过率也会变。对于准备复现类似实验的开发者来说第一步不是急着把 30 个任务全跑一遍而是先把 Key、Base URL、harness 配置和日志格式固定下来否则你后面看到的差异很可能来自配置漂移而不是 harness 本身。我建议的顺序是第 1 步明确评测任务与 harness第 2 步去 TaoToken 官网拿 Key第 3 步分别配置 Claude Code 和 Pi第 4 步各跑 30 个任务第 5 步汇总 Token 与任务状态。其中第 2 步可以直接访问 TaoToken 官网 完成注册并创建 API Key。TaoToken 在这里只提供 Key 和 Base URL不参与评测过程也不改变 harness 的任务执行逻辑。Base URL 统一写https://taotoken.net/api不要在这个地址后面加任何追踪参数工具配置里只认干净的端点。为什么强调“先取 Key”因为 Claude Code 的settings.json、Pi 的环境变量、Codex CLI 的config.toml三者对 Key 的读取方式不同。如果先装工具、先写任务脚本最后才补 Key最容易出现三类问题一是 Claude Code 报 401但你以为是网络问题二是 Pi 读到了空的OPENAI_API_KEY任务直接失败三是 Token 消耗已经产生但日志里没有记录实际调用量最后无法做汇总。先把 Key 准备好再让每个 harness 做一次最小连通性验证最后才批量跑 30 个任务整个实验的可复现性会高很多。本文给出可落地的准备清单、Claude Code 与 Pi 的配置示例、双 harness 跑 30 任务的命令以及一份 Token 汇总方法。你可以把本文当作一个最小复现实验模板替换成自己的模型、任务集和评测标准。2. 准备清单TaoToken Key、Base URL 与 30 任务目录在跑任务之前先把下面这些物料准备好。不要小看清单HarnessTax 类实验里最常见的返工就是“任务跑到一半发现 Key 额度不够”或者“Token 统计字段对不上”。项目建议值说明API KeyYOUR_API_KEY从 TaoToken 控制台创建不要写进 GitBase URLhttps://taotoken.net/api工具配置统一使用不加 UTMClaude Code 配置settings.json使用ANTHROPIC_*变量Pi 配置环境变量或启动参数按 Pi 文档映射 OpenAI 兼容端点Codex CLI 配置config.toml不要套用ANTHROPIC_*任务列表tasks.txt每行一个任务描述共 30 行输出目录runs/{harness}_{timestamp}每个任务一个 JSON 或日志文件Token 账本token_summary.csv记录输入、输出、总量、状态获取 Key 的路径很简单进入 TaoToken 官网完成登录后进入控制台在 API Keys 页面创建新的 Key。创建后立刻复制到本地密码管理器或临时环境变量里不要直接提交到仓库。如果你需要先确认模型能力也可以从模型对话入口试跑一条简单指令确认 Key 和 Base URL 可用。本地目录可以这样组织mkdir -p harness-tax/{configs,runs,tasks,scripts} cd harness-tax touch tasks/tasks.txttasks/tasks.txt里放 30 个任务每行一个。建议按“任务类型 仓库/文件 期望输出”写清楚例如修复 parser 在空输入时的崩溃并补充单元测试 重构 auth 模块的错误处理保持现有 API 不变 为 CLI 增加 --dry-run 参数并更新帮助文本 定位 flaky test 的根因给出最小修复 ……不建议把 30 个任务写成 30 个模糊的“修 bug”否则后面无法判断失败是模型能力问题、harness 问题还是任务描述本身有歧义。任务集固定后再分别用 Claude Code 和 Pi 跑同一份tasks.txt这样对比才有意义。环境变量建议分成两组避免互相污染# Claude Code 使用 export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYYOUR_API_KEY # Pi / OpenAI 兼容客户端使用 export OPENAI_BASE_URLhttps://taotoken.net/api export OPENAI_API_KEYYOUR_API_KEY注意ANTHROPIC_*只给 Claude Code 一类 Anthropic 协议客户端使用Pi、Codex CLI 如果走 OpenAI 兼容协议应使用OPENAI_*或它们自己的配置项。把ANTHROPIC_*硬套到 Codex 的config.toml里通常不会生效反而会让你误判 Key 有问题。3. Claude Code 配置settings.json 中的 ANTHROPIC_BASE_URL 与 ANTHROPIC_API_KEYClaude Code 的配置可以放在项目级settings.json也可以放在用户级配置目录。为了让实验可复现建议在harness-tax/configs/claude/settings.json里保留一份项目级配置然后通过环境变量注入真实 Key。示例{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: YOUR_API_KEY, ANTHROPIC_MODEL: YOUR_MODEL_NAME, ANTHROPIC_SMALL_FAST_MODEL: YOUR_SMALL_MODEL_NAME }, permissions: { allow: [ Read, Write, Bash(git status), Bash(git diff), Bash(npm test), Bash(pytest) ], deny: [] } }把YOUR_MODEL_NAME和YOUR_SMALL_MODEL_NAME替换成 TaoToken 当前可用的模型名。不要凭记忆填一个不存在的模型 ID否则 Claude Code 可能返回 404 或模型不可用。你可以从 TaoToken 模型对话 页面确认可用模型再写回配置。如果不想把 Key 写进settings.json可以只用环境变量方式export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYYOUR_API_KEY export ANTHROPIC_MODELYOUR_MODEL_NAME然后进入一个临时目录做连通性测试claude -p 只输出一行pong --output-format json如果返回 JSON 中包含结果字段说明 Key、Base URL、模型名三者至少基本正确。接下来再跑一个带文件读写的任务claude -p 读取当前目录下的 README.md总结成三行以内不要修改文件 \ --output-format json \ runs/claude_smoke.json确认烟雾测试通过后再用脚本批量跑 30 个任务。Claude Code 的-p适合非交互式执行--output-format json便于后续提取用量。不同版本字段名可能略有差异建议先跑一个任务用jq查看结构jq . runs/claude_smoke.json | head -n 80如果字段里有usage.input_tokens、usage.output_tokens就可以进入后面的汇总环节。若没有则需要保留完整日志后续用文本解析或控制台用量做核对。批量脚本可以写成#!/usr/bin/env bash set -euo pipefail HARNESSclaude TASKS_FILEtasks/tasks.txt OUT_DIRruns/${HARNESS}_$(date %Y%m%d_%H%M%S) mkdir -p $OUT_DIR i0 while IFS read -r task; do [ -z $task ] continue i$((i 1)) echo [$HARNESS] running task $i: $task claude -p $task \ --output-format json \ $OUT_DIR/task_$(printf %02d $i).json \ 2 $OUT_DIR/task_$(printf %02d $i).err || true done $TASKS_FILE echo done: $OUT_DIR注意|| true的作用是让单个任务失败时不中断整个循环。30 个任务里只要有一个因为超时或权限问题退出整个实验就断掉后面汇总会很麻烦。把每个任务的标准输出和标准错误分开保存便于复盘。4. Pi harness 接入OpenAI 兼容变量与 30 任务批跑脚本Pi 作为 harness具体启动参数以它自己的文档为准。这里不编造插件名或内部 API只给出通用接入思路如果 Pi 通过 OpenAI 兼容协议调用模型那么它通常需要两个东西——Base URL 和 API Key。把 Base URL 指向https://taotoken.net/api把 Key 设为YOUR_API_KEY然后按 Pi 的实际参数把任务提示词传进去。先设置环境变量export OPENAI_BASE_URLhttps://taotoken.net/api export OPENAI_API_KEYYOUR_API_KEY export OPENAI_MODELYOUR_MODEL_NAME如果你的 Pi 版本使用独立变量名例如PI_BASE_URL、PI_API_KEY请按官方说明映射但值仍然是同一个 Base URL 和同一个 Key。不要把 Claude Code 的ANTHROPIC_API_KEY直接当成 Pi 的 Key 变量也不要把ANTHROPIC_BASE_URL写进 Pi 的 OpenAI 兼容配置里。两者协议不同混用会导致请求头或端点路径不匹配。Pi 跑 30 个任务时建议同样采用串行或小并发。示例脚本把 Pi 的实际命令抽象成PI_CMD你只需要替换成文档中的真实命令#!/usr/bin/env bash set -euo pipefail HARNESSpi TASKS_FILEtasks/tasks.txt OUT_DIRruns/${HARNESS}_$(date %Y%m%d_%H%M%S) mkdir -p $OUT_DIR # 替换为 Pi 的实际调用方式例如 # PI_CMD(pi run --prompt) PI_CMD(pi --prompt) i0 while IFS read -r task; do [ -z $task ] continue i$((i 1)) echo [$HARNESS] running task $i: $task ${PI_CMD[]} $task \ --json \ $OUT_DIR/task_$(printf %02d $i).json \ 2 $OUT_DIR/task_$(printf %02d $i).err || true done $TASKS_FILE echo done: $OUT_DIR如果 Pi 不支持--json就去掉该参数保留完整日志。Token 汇总时可以退而求其次从日志里正则匹配 usage 字段或者在 TaoToken 控制台查看该 Key 在对应时间段的调用量。无论用哪种方式都要保证 Claude Code 和 Pi 的 30 个任务在时间窗口上尽量分离避免控制台用量混在一起无法归因。跑之前做一次最小验证pi --prompt 只输出一行pi-ok如果返回内容正常再检查环境变量是否真的被进程读到env | grep -E OPENAI_BASE_URL|OPENAI_API_KEY|ANTHROPIC_BASE_URL注意不要在高并发下暴露完整 Key。终端历史、CI 日志、截图都可能泄露 Key。建议用临时环境变量跑完后清理unset OPENAI_API_KEY unset ANTHROPIC_API_KEY5. Codex CLI 与 CC Switch 三件套config.toml 单独写不要混用 ANTHROPIC_*虽然本文重点是 Claude Code 和 Pi 各跑 30 个任务但 HarnessTax 的对照里还有 Codex CLI。如果你想把 Codex CLI 也纳入对比配置方式要独立处理。Codex CLI 使用config.toml不要把它当成 Claude Code 的settings.json来写更不要把ANTHROPIC_*变量塞进去。一个可参考的config.toml结构如下model YOUR_MODEL_NAME model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY然后在 shell 里设置export TAOTOKEN_API_KEYYOUR_API_KEY codex exec 只输出一行codex-ok这里的关键点是Codex 的 provider 配置和 Claude Code 的 Anthropic 配置是两套体系。Claude Code 关心ANTHROPIC_BASE_URL和ANTHROPIC_API_KEYCodex 关心自己的 provider、base_url、env_key。把它们混在一起最典型的现象是 Claude Code 能通Codex 一直 401然后你反复换 Key其实问题在变量名不对。所谓“CC Switch 三件套”可以理解成三份配置要分开管理第一份是 Claude Code 的settings.json第二份是 Codex 的config.toml第三份是 shell 环境变量文件或密钥管理文件。三者的职责是settings.jsonClaude Code 的模型、权限、环境变量映射。config.tomlCodex CLI 的 provider、模型、端点。环境变量文件只存放 Key不提交到 Git。如果你用 CC Switch 一类工具切换配置也要确保切换的是整套配置而不是只换 Key。只换 Key 不换 Base URL或者只换 Base URL 不换协议变量都会让 harness 行为不可预测。6. 双 harness 跑 30 个任务命令、日志与 Token 汇总现在进入核心复现环节Claude Code 和 Pi 各跑 30 个任务。建议顺序如下用tasks.txt准备 30 行任务。先跑 Claude Code 的 1 个烟雾任务确认 JSON 输出和 usage 字段。跑 Claude Code 的 30 个任务输出到runs/claude_*。清理环境变量切换到 Pi 的 OpenAI 兼容变量。跑 Pi 的 1 个烟雾任务。跑 Pi 的 30 个任务输出到runs/pi_*。分别汇总 Token、耗时、任务状态。Claude Code 批跑命令可以整理成独立脚本#!/usr/bin/env bash set -euo pipefail TASKS_FILEtasks/tasks.txt OUT_DIRruns/claude_$(date %Y%m%d_%H%M%S) mkdir -p $OUT_DIR export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYYOUR_API_KEY export ANTHROPIC_MODELYOUR_MODEL_NAME i0 while IFS read -r task; do [ -z $task ] continue i$((i 1)) id$(printf %02d $i) echo [claude][$id] $task start$(date %s) claude -p $task --output-format json $OUT_DIR/task_${id}.json 2 $OUT_DIR/task_${id}.err || true end$(date %s) echo $id,$((end - start)) $OUT_DIR/duration.csv done $TASKS_FILEPi 批跑脚本同理#!/usr/bin/env bash set -euo pipefail TASKS_FILEtasks/tasks.txt OUT_DIRruns/pi_$(date %Y%m%d_%H%M%S) mkdir -p $OUT_DIR export OPENAI_BASE_URLhttps://taotoken.net/api export OPENAI_API_KEYYOUR_API_KEY export OPENAI_MODELYOUR_MODEL_NAME i0 while IFS read -r task; do [ -z $task ] continue i$((i 1)) id$(printf %02d $i) echo [pi][$id] $task start$(date %s) pi --prompt $task --json $OUT_DIR/task_${id}.json 2 $OUT_DIR/task_${id}.err || true end$(date %s) echo $id,$((end - start)) $OUT_DIR/duration.csv done $TASKS_FILE跑完后先不要急着手工看 60 个文件。用jq或 Python 做一次结构化汇总。假设 Claude Code 和 Pi 的 JSON 输出里都有 usage 字段可以写一个简单的汇总脚本#!/usr/bin/env bash set -euo pipefail SUMMARYtoken_summary.csv echo harness,task,input_tokens,output_tokens,total_tokens,status $SUMMARY for dir in runs/claude_* runs/pi_*; do [ -d $dir ] || continue harness$(basename $dir | cut -d_ -f1) for f in $dir/task_*.json; do [ -f $f ] || continue task$(basename $f .json | sed s/task_//) input$(jq -r .usage.input_tokens // 0 $f 2/dev/null || echo 0) output$(jq -r .usage.output_tokens // 0 $f 2/dev/null || echo 0) total$((input output)) err_file${f%.json}.err if [ -s $err_file ]; then statuserror else statusok fi echo $harness,$task,$input,$output,$total,$status $SUMMARY done done echo written: $SUMMARY如果实际 JSON 字段不是.usage.input_tokens那就先用jq查看一个样本jq paths(scalars) runs/claude_*/task_01.json | head -n 50找到真实字段后再替换脚本。Token 汇总表最终可以整理成harness任务数输入 Token输出 Token总 Token成功数失败数Claude Code30待填待填待填待填待填Pi30待填待填待填待填待填这张表是后续判断“谁在消耗 Token”的基础。Claude Code 和 Pi 对 30 个任务的模型调用都会产生输入和输出 Token但两者的系统提示、工具描述、重试策略不同所以总 Token 可能差异明显。不要只记录最终答案长度要把每次模型调用的用量加总。7. 常见报错与排障401、403、429 与模型名跑 30 个任务时报错比成功更值得记录。下面是最常见的几类问题。401 UnauthorizedKey 没有被正确读取。Claude Code 检查ANTHROPIC_API_KEYPi 检查OPENAI_API_KEY或它自己的 Key 变量。先执行env | grep -E API_KEY|BASE_URL确认变量存在再确认没有多余空格。不要把 Key 写成Bearer YOUR_API_KEY大多数配置只填原始 Key。403 Forbidden通常与模型权限、Base URL 路径或请求头有关。先确认 Base URL 是https://taotoken.net/api不要附带 UTM 参数。再确认当前 Key 是否有权调用目标模型。如果你在模型名里填了不存在的 ID也可能表现为 403 或 404。404 Not Found路径不对或模型名不对。Claude Code 和 Pi 的协议不同端点拼接方式也不同。不要手动猜测/v1/messages或/v1/chat/completions以 TaoToken 文档和客户端默认行为为准。需要确认模型时可以从 TaoToken 模型对话 页面查看。429 Too Many Requests30 个任务不要一次性全部并发。建议串行或者在脚本里加sleep 1到sleep 3。如果必须并发先从 2 并发开始观察错误率和 Token 速率再逐步增加。任务卡死或超时给每个任务加超时控制。例如timeout 300 claude -p $task --output-format json $OUT_DIR/task_${id}.json 2 $OUT_DIR/task_${id}.err || true超时任务要标记为timeout不要当成模型能力失败。后面复盘时超时可能来自 harness 的工具调用循环也可能来自网络或模型响应慢。如果你在配置过程中需要重新生成 Key、检查额度或确认 Base URL可以回到 TaoToken 官网 的控制台处理。记住TaoToken 只提供 Key 和 Base URL不参与任务评测也不会替 harness 决定工具调用策略。评测结果差异应归因于模型、harness、任务集和运行环境而不是把 Key 供应商当成变量。8. 跑完 30 任务的 Token 账本把 harness 差异和模型调用分开当 Claude Code 和 Pi 都跑完 30 个任务后你手里至少有三类数据任务结果、Token 用量、耗时和错误。建议把它们合并成一份复盘表harness, task_id, model, input_tokens, output_tokens, total_tokens, duration_sec, status, retry_count其中retry_count可以从日志里统计。很多 harness 在工具调用失败时会自动重试重试会增加 Token但任务最终可能成功。如果不记录重试你会误以为某个 harness “更省 Token”实际上它只是重试更少或者更早放弃。归因时可以分三层看第一层是模型调用层输入 Token、输出 Token、每次调用的消息数。Claude Code 和 Pi 对 30 个任务的模型调用次数可能不同因为一个 harness 可能把更多上下文塞进单次请求另一个可能拆成多轮。第二层是harness 层工具调用次数、失败重试、上下文压缩策略、停止条件。HarnessTax 研究之所以值得关注就是它提醒我们 harness 不是透明管道。同一个模型换一个执行壳任务轨迹会变。第三层是任务层任务描述是否清晰、仓库状态是否一致、测试命令是否可复现。如果 30 个任务里有 5 个本身就模糊那么两个 harness 的差异可能主要来自任务歧义而不是 harness 能力。最后把 Token 汇总表和任务状态表放在一起你就能回答“谁在消耗 Token”这个问题Claude Code 与 Pi 对 30 个任务的模型调用分别消耗了多少输入和输出 Token哪些任务触发了重试哪些任务因为超时或权限失败没有产生完整用量。这个过程比单纯看通过率更有信息量。如果你准备把这套流程继续扩展到更多 harness 或更多任务建议先把本文的配置模板固定下来Claude Code 用settings.json和ANTHROPIC_*Pi 用 OpenAI 兼容变量Codex CLI 用独立的config.toml。Base URL 始终使用https://taotoken.net/apiKey 使用YOUR_API_KEY占位真实 Key 只放在本地环境变量或密钥管理器中。需要开始准备 Key 时可以从 TaoToken 模型对话 先验证模型连通性如果打算长期跑 coding agent 任务可以查看 Coding Plan 了解适合批跑任务的方案创建和管理 Key 可以进入 API Keys 控制台Claude Code 的具体接入细节可以对照 Claude Code 文档。把 Key 准备好再让 Claude Code 和 Pi 各跑 30 个任务你的 Token 账本和 harness 对比才有可复现的起点。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门