🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
1. 12 个 pytest 红用例:Aider 与 Codex CLI 的同题起跑线
同一批 12 个 pytest 红用例,Aider 与 Codex CLI 各修一遍,模型、Key、diff 基线全不变;TaoToken 只当统一供应商,让两边的 Token 账能放进同一张表。这篇不评谁更“聪明”,只看谁把红用例变绿时,单用例 Token 成本更低。你最后要得到的东西也很具体:一张工具 / 轮次 / 输入输出 Token / 修红用例数的对照表,两条能直接粘贴的启动命令,以及一份能重跑的本地记录。
仓库准备方式不复杂,但必须先把“起跑线”锁死。找一个 Python 项目,或者自己建一个小项目,里面放 12 个确定会失败的 pytest 用例。失败原因可以分散在边界条件、异常分支、空值处理、类型转换、返回值拼装这些常见位置,但不要故意放 12 个完全一样的断言错误,否则两个 CLI 都会用同一种补丁模式,Token 账没有区分度。更稳的做法是让 12 个红用例覆盖 4 到 5 个模块,每个模块 2 到 3 个失败点,这样模型在修复时需要读更多上下文,输入 Token 的差异会显出来。
把这 12 个红用例固定在同一个 git commit 上。先运行一次 python -m pytest -q,确认失败数是 12,而不是 11 或 13。然后执行 git add . && git commit -m "baseline: 12 failing pytest cases",把这个 commit 当作唯一 diff 基线。后面无论跑 Aider 还是 Codex CLI,都从这个 commit 开始;跑完一个工具,执行 git reset --hard <baseline-commit>,再清掉 __pycache__、.pytest_cache 和临时 diff 文件,再跑另一个工具。只要中间换过模型 ID、换过 Key、换过测试命令,这张表就失去横向比较的意义。
为什么选“单测补全”而不是让两个 CLI 从零写功能?因为从零写功能的 Prompt 空间太大,Aider 和 Codex CLI 可能一个先写实现再补测试,另一个先读测试再改源码,轮次定义会变得很模糊。预置 12 个红用例的好处是初始状态明确:失败列表固定,测试文件固定,diff 基线固定,模型每次拿到的任务边界也固定。你唯一要记录的是它花了多少 Token、跑了多少轮、最终让几个红用例变绿。这里的“修红数”不是“测试全绿数”,如果它顺手改了测试断言,或者把 pytest.ini 里的用例排除掉,那不算修红,算无效改动。
两个工具都要接同一个模型。模型 ID 不要凭记忆写,也不要拿旧文章里的 gpt-5、claude-4 之类当正式配置;统一以模型广场展示为准。你可以在落地页里看当前可用模型,再复制对应的 ID。Aider 和 Codex CLI 对模型名的前缀要求不一样,Aider 通常需要带 provider 前缀,Codex CLI 的 config.toml 里则用模型 ID 本身,这部分在第 2 节会拆开写。工具版本也以你本机 aider --version、codex --version 的输出为准,本文不替你编版本号。
Token 账为什么要盯“单用例成本”?因为两个 CLI 都修完 12 个用例时,总分看起来一样,但一个可能只花了 8 万 Token,另一个花了 30 万 Token。总分只告诉你“能做完”,单用例成本才告诉你“做这类小步修复时谁更省”。尤其当你的仓库变大、测试输出变长、上下文被反复塞回对话时,输入 Token 会迅速膨胀。你最后填表时,建议把总 Token 拆成输入和输出两列,再用 总 Token ÷ 修红数 得到单用例成本。如果只修了 8 个,分母就写 8,不要拿 12 当分母,否则成本会被低估。
本文不含排行分数,也不把任何公榜 ELO、SWE-bench 百分比、HF likes 或 OpenRouter 用量拼成“综合实力表”。这里只有本地复现流程和读者自填表。你跑出来的数字属于一次运行,不代表公榜,也不代表模型长期表现。想看公榜就单独查榜名、查阅日期、名次或分数、页面来源,和这张本地表分开放。两个 CLI 的差异可能来自上下文组织、测试输出回传策略、补丁粒度,而不是模型本身突然变强或变弱。
2. Aider 与 Codex CLI 怎么接到 https://taotoken.net/api
两个 CLI 接统一网关时,最容易出错的地方不是 Key,而是 Base URL 和模型 ID 的写法。统一端点就是 https://taotoken.net/api,末尾不带 /v1,也不要往这个地址后面拼 UTM 参数。UTM 只用于网页落地页,不用于 API 请求。Key 在 TaoToken 创建,复制出来先放进环境变量,不要直接写进会提交到 git 的文件。下面两条命令按你本机实际模型 ID 替换 YOUR_MODEL_ID,Key 替换 YOUR_API_KEY。
2.1 Aider 的接法与启动命令
Aider 走 OpenAI 兼容接口时,用环境变量指定 Base URL 和 Key。Base URL 写 https://taotoken.net/api,不要再加 /v1。模型写 openai/YOUR_MODEL_ID,其中 YOUR_MODEL_ID 从模型广场复制。测试命令用 python -m pytest -q,让 Aider 在每次修改后自动跑测试,并把失败输出带回上下文。--no-auto-commits 是为了防止它自动提交,方便你跑完后用 git reset --hard 回到基线。
export OPENAI_API_BASE=https://taotoken.net/api
export OPENAI_API_KEY=YOUR_API_KEY
aider --model openai/YOUR_MODEL_ID \
--no-auto-commits \
--test-cmd "python -m pytest -q" \
--auto-test \
tests/
这条命令里,tests/ 是只读测试目录。你可以在 Aider 里再用 /add 把被测源码目录加进来,但不要让它直接改测试文件。跑起来后,Aider 会在修改后自动执行测试,失败信息会进入下一轮上下文。Token 统计可以用 /tokens 或启动时的 --show-tokens 查看,具体以你本机版本为准。如果 Aider 报模型不存在,先确认模型 ID 是否来自模型广场,再确认前缀 openai/ 有没有写对;如果报 401,检查 OPENAI_API_KEY 是否复制完整;如果报 404,检查 OPENAI_API_BASE 是否被误写成 https://taotoken.net/api/v1。
2.2 Codex CLI 的接法与启动命令
Codex CLI 不走 Anthropic 那套环境变量,所以不要把 ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL 套到 Codex 上。Codex 用 ~/.codex/config.toml 配自定义 provider。下面这份配置把 provider 指到 https://taotoken.net/api,Key 从环境变量 TAOTOKEN_API_KEY 读取,模型 ID 仍然以模型广场为准。wire_api 先按 chat 试,如果模型广场或接入文档标明该模型需要另一种协议,再按文档改。
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"
配置写完后,启动命令可以这样给:
export TAOTOKEN_API_KEY=YOUR_API_KEY
codex exec --config model_provider=taotoken --config model="YOUR_MODEL_ID" \
"仓库里有 12 个失败的 pytest 用例。先运行 python -m pytest -q 获取失败列表,再逐个修复。只改测试涉及的源码,不要修改测试断言。每完成一批修改后重新运行 python -m pytest -q,直到没有红用例或你认为无法继续。最终给出修改摘要和剩余失败用例。"
Codex CLI 的 exec 模式适合这种一次性长任务,但你要注意它内部可能会多次调用工具、多次运行测试。为了和 Aider 对齐,轮次按“模型完成一次代码修改并执行一次 pytest”来数。如果 Codex 的输出没有明确暴露每次测试调用,可以用统一网关控制台的请求数或会话记录辅助判断,但最终表里最好写你人工可验证的轮次。Token 统计优先看 API 返回的 usage;如果只看总 Token,控制台的用量页更方便对账。跑完 Codex 后,同样执行 git reset --hard 回到基线,再跑另一个工具,避免残留 diff 影响下一轮。
两个 CLI 都接好后,先不要急着跑 12 个用例。用一个最小任务验证通路:比如让 Aider 只解释 pytest --collect-only 的结果,让 Codex CLI 只列出失败用例名,不修改代码。确认请求能到达、模型 ID 能识别、Key 能计费,再开始正式跑。这样能把 401、404、模型 ID 错误挡在正式评测之前,不会浪费 Token 在无效轮次上。
3. 跑同一批红用例:轮次、输入输出 Token、修红数怎么记录
正式跑的时候,建议固定一个记录模板,否则两个工具的账很容易记串。每一轮记录四件事:这一轮模型改了哪些文件、这一轮 pytest 失败数从多少变成多少、这一轮输入 Token 和输出 Token 各是多少、这一轮有没有修改测试文件或跳过用例。输入 Token 包括系统提示、仓库上下文、测试失败输出、历史 diff;输出 Token 包括补丁、解释和工具调用参数。如果你的统计工具只能看到总 Token,就先把总 Token 填进表,再在备注里写清楚无法拆分。
轮次定义要提前说死。Aider 的 --auto-test 可能在每次修改后自动跑测试,所以一次模型补丁加一次测试运行算一轮。Codex CLI 的 exec 可能内部连续读文件、改代码、跑测试,如果它一次会话里跑了 3 次 pytest,那轮次至少按 3 次测试运行来记,而不是按“发了一次命令”记成 1 轮。两种口径不能混用:如果你把 Codex 的一次长会话记成 1 轮,却把 Aider 的每次自动测试记成多轮,对照表就会偏向 Codex。最稳的办法是统一按“pytest 被运行一次”算一轮,并在备注里写清楚哪些轮次没有产生代码修改。
Token 记录建议用两层:第一层是 API usage,第二层是控制台用量。API usage 更细,能看到单次请求的输入输出;控制台用量更适合事后对账,确认这一次评测调用是否入账。跑完一个工具后,去 控制台 看用量汇总,再用 API usage 补拆分。如果两个数字差得很多,先检查是否有缓存命中、是否有重试、是否有其他会话也在用同一个 Key。为了让 Aider 和 Codex CLI 的账可比,评测期间最好只用这一把 Key 跑这两个工具,不要同时开其他对话或脚本。
表格先留空,只填你自己跑出来的数字。不要从别人文章里抄 Token 数,也不要凭模型名推测。下面这张表可以直接复制到你的笔记里:
| 工具 | 轮次 | 输入 Token | 输出 Token | 12 个红用例修红数 | 单用例 Token 成本 |
|---|---|---|---|---|---|
| Aider | 待填 | 待填 | 待填 | 待填 / 12 | 待填 |
| Codex CLI | 待填 | 待填 | 待填 | 待填 / 12 | 待填 |
“修红数”只算原始 12 个失败用例中真正变为通过的数量。如果某个用例通过了,但你看 git diff 发现测试文件被改了,这个用例不算修红。如果某个用例被跳过、被 xfail、被从收集列表里排除,也不算修红。检查方法是跑完每个工具后执行 git diff -- tests/,测试目录如果有改动,逐条看是不是单纯格式化;只要涉及断言、跳过标记、收集范围,就应该在表里扣掉对应修红数,并在备注里写明。
跑完 Aider 后,先别急着跑 Codex CLI。把 Aider 的最终 git diff 保存成 patch 文件,例如 git diff > aider-result.patch,再执行 git reset --hard <baseline-commit>,然后清缓存:find . -name "__pycache__" -type d -prune -exec rm -rf {} +、rm -rf .pytest_cache。确认 python -m pytest -q 又回到 12 个失败,再启动 Codex CLI。这样两个工具面对的初始仓库状态完全一致。如果第二次跑之前失败数不是 12,说明基线没清干净,前面的 Token 账也不要用。
记录时还要注意“无效轮次”。比如模型只是解释代码、只输出计划、没有产生补丁,这种轮次可以记,但要在备注里说明没有修改。输入 Token 和输出 Token 仍然算,因为它们真实消耗了额度,也真实影响单用例成本。另一种情况是工具反复重试同一个错误,比如一直改同一个导入语句却修不好,这种轮次更要保留,它正是横向比较里最有信息量的部分。你不需要把每个 Token 都算到小数点,但需要保证两个工具用同一套口径。
4. 单用例成本:为什么 12/12 也可能贵出数倍
单用例成本比总分更值得看,因为两个 CLI 都可能修完 12 个用例,但过程完全不同。一个工具可能每轮只改一个文件,测试输出很短,输入 Token 慢慢涨;另一个工具可能每轮把整个测试失败日志、整个 diff、多个源码文件一起塞回去,输入 Token 很快膨胀。最后两边都是 12/12,但 Token 账可能差好几倍。单用例成本把“做完”和“做省”分开,尤其适合你后续选默认工具:小仓库小修用省 Token 的,复杂重构用能读大上下文的。
计算方式很简单:单用例 Token 成本 =(输入 Token + 输出 Token)÷ 修红数。如果两个工具修红数不同,比如 Aider 修了 12 个,Codex CLI 修了 10 个,那就不能直接比总 Token,要先把分母写对。修 10 个的那个工具,总 Token 再低,也不代表它更省,因为它留下了 2 个红用例。你可以再补一列“达到 10 个修红时的 Token”,但那是事后截取,容易主观,不如先把原始轮次和每轮失败数记全,再回来看。
输入 Token 高通常有几个原因。第一,仓库上下文被重复发送。Aider 会把相关文件加进上下文,Codex CLI 也可能在每轮重新读文件;如果工具不会压缩历史,输入 Token 会随轮次线性增长。第二,测试失败输出太长。pytest 的 traceback 如果包含大量本地路径、依赖栈、重复断言,模型每轮都读一遍,输入 Token 很快上去。第三,diff 历史被反复回传。有些工具会把之前所有补丁都带上,有些只带当前状态;这会让同样修 12 个用例的两个工具,输入 Token 差出数倍。第四,模型输出解释太多。输出 Token 虽然单价通常更高,但很多轮次里输入 Token 才是大头。
轮次多不一定差。一个工具可能跑 8 轮,每轮只改一个小点,输入 Token 控制得很好;另一个工具跑 3 轮,每轮都重新读全仓,输入 Token 反而更高。你要看的是“每轮平均 Token”和“单用例 Token”,不是单纯看轮次。可以把表再拆一列“每轮平均 Token”,尤其当两个工具轮次差距很大时,这一列能解释总账为什么不同。比如 Aider 跑了 9 轮,Codex CLI 跑了 4 轮,但 Codex 每轮输入巨大,最后总账可能反超。
还要把“修红数”和“修红质量”分开。一个工具可能修红 12 个,但补丁很丑,只是把断言条件改成输入,或者加了大量硬编码;另一个工具修红 10 个,但补丁更接近正确逻辑。本文不是代码评审,不把补丁质量当主指标,但你可以加一列“是否改测试”“是否有硬编码嫌疑”,作为备注。单用例成本仍然按修红数算,不因为补丁好看就减免 Token。这样表格才可复现,不会变成主观印象分。
如果你跑了两三次,发现某一次 Aider 明显更省,某一次 Codex CLI 明显更省,不要急着下结论。模型服务可能有波动,网络重试可能增加请求数,测试输出顺序也可能影响上下文。更稳妥的做法是同一 baseline 至少跑两轮,取每轮单用例成本的中位数,并注明跑的时间、模型 ID、工具版本、Key 来源。一次运行不代表公榜,也不代表长期表现。本文不含排行分数,表里的数字只用于你本机选默认 CLI。
5. 复现对照表:同一把 Key、同一模型、同一 diff 基线
复现实验的关键不是“再跑一遍命令”,而是把变量锁住。同一把 Key、同一个模型 ID、同一份 diff 基线、同一套 pytest 命令、同一台机器或同一类环境,缺一个都会让对照表失去可比性。下面这套步骤按顺序执行,不要跳步。第一步,准备仓库并提交 baseline。第二步,从 TaoToken 创建 Key,去模型广场复制模型 ID。第三步,配好 Aider 环境变量,跑 Aider,记录轮次和 Token。第四步,保存 patch,git reset --hard 回 baseline,清缓存,确认 12 个红用例回来。第五步,配好 Codex CLI,跑 Codex,记录轮次和 Token。第六步,填表并检查测试目录有没有被改。
Aider 跑的时候,建议先手动执行一次 python -m pytest -q,确认它看到的失败列表和 baseline 一致。如果 Aider 第一次运行就报模型不存在,先不要继续,回到模型广场核对 ID。Aider 的模型名通常需要 provider 前缀,比如 openai/,但具体前缀取决于你选的模型和 Aider 版本。如果前缀写错,可能不是 401 而是 404,或者被当成另一个 provider。确认通路后,再让它开始修。每轮结束后,用 git diff --stat 看改了哪些文件,如果出现 tests/ 目录,立刻检查。
Codex CLI 跑的时候,先确认 ~/.codex/config.toml 里的 base_url 是 https://taotoken.net/api,不要写成 https://taotoken.net/api/v1,也不要把 UTM 参数加到 API 地址上。env_key 写的是环境变量名,不是 Key 本身。启动前 echo $TAOTOKEN_API_KEY 确认变量有值。exec 模式里给的指令要明确“不要修改测试断言”,否则有些模型会先把断言改松,再声称修好。跑完后,同样执行 git diff -- tests/ 检查测试目录。
对照表可以扩展成下面这样,但第一行和第二行仍然只填你本机跑出的数字。备注列可以写工具版本、模型 ID、运行日期、是否改测试、是否有跳过用例。公榜数字如果以后要补,另开一张表,写清榜名、查阅日期、名次或分数、页面来源,不要和这张本地表混在一起。统一网关在这里只负责让两个 CLI 走同一个端点、同一把 Key、同一个模型,不负责替你做代码评审。
| 工具 | 轮次 | 输入 Token | 输出 Token | 修红数 / 12 | 单用例 Token 成本 | 备注 |
|---|---|---|---|---|---|---|
| Aider | 待填 | 待填 | 待填 | 待填 | 待填 | 工具版本 / 模型 ID / 是否改测试 |
| Codex CLI | 待填 | 待填 | 待填 | 待填 | 待填 | 工具版本 / 模型 ID / 是否改测试 |
想让表更可复现,可以把两条启动命令和 baseline commit 一起写进实验记录。Aider 命令、Codex 命令、git rev-parse HEAD 的输出、python -m pytest -q 的初始失败数,这四项最好固定在同一份笔记里。下次换模型 ID 时,只改模型,不改其他变量,再跑一次就能看出模型变化对单用例成本的影响。换工具时,只改工具,不改 Key 和模型,再跑一次就能看出工具差异。这样这张表才有累积价值,而不是一次性截图。
还要注意:不要把 CLI 指向生产库或生产机执行。Aider 和 Codex CLI 都应该只改本地仓库里的代码。需要生成 SQL、迁移命令、清理脚本时,让模型只输出命令或 SQL,你本地执行后把结果贴回去。尤其不要在 Prompt 里放真实连接串、生产账号、客户数据。评测仓库用假数据或脱敏数据,测试用例也不要依赖外部网络。这样即使模型改错,最多污染本地 diff,不会碰到真实业务。
跑完后,把两个工具的 patch 和表格放在一起。如果 Aider 修红 12 个、Codex CLI 修红 10 个,就如实写 10,不要为了“公平”强行补两个。如果 Codex CLI 修红 12 个但改了测试文件,就把那两个被改测试的用例标成无效修红,并在备注里写清楚。单用例成本按有效修红数算。这样你的结论不是“谁总分高”,而是“在这 12 个 pytest 红用例上,谁每个有效修红花得更少”。
6. 排障只写本篇会遇到的 401、404 和测试命令
401 通常只有三类原因:Key 没填、Key 复制少了、Key 所在环境变量没有被 CLI 读到。Aider 读 OPENAI_API_KEY,Codex CLI 读 ~/.codex/config.toml 里 env_key 指定的变量。先 echo 一下变量,确认不是空字符串。如果是在新的终端窗口跑,之前 export 的变量可能没带过来,重新导出或写进当前 shell 配置。不要在仓库里新建 .env 后直接提交,也不要把 Key 写进 config.toml 的 env_key 字段,那个字段要写变量名。
404 多数是 Base URL 或模型 ID 写错。Base URL 统一写 https://taotoken.net/api,末尾不带 /v1,不要加 UTM。Aider 如果报 model not found,先确认模型 ID 是否从模型广场复制,再确认 provider 前缀。Codex CLI 如果报 404,检查 ~/.codex/config.toml 里的 base_url 是否被误写成别的路径,检查 model 是否和 model_provider 对应。不要把 ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL 写进 Codex 配置,Codex 不走这套变量;Claude Code 才用 Anthropic 那套接入方式。两套配置混用,最常见的结果就是请求发错端点。
测试命令错误也会伪装成模型问题。--test-cmd 如果写成只跑单个文件,Aider 会以为其他用例不关它的事,修红数自然偏低。Codex CLI 的 Prompt 如果只说“修测试”,它可能只跑一次 pytest,然后根据第一次输出改一批,后面不再验证。你要把命令写死:python -m pytest -q,并明确要求每次修改后重新运行。如果仓库需要虚拟环境,把 python 换成虚拟环境里的解释器路径,或者在启动 CLI 前先激活环境,避免 CLI 在一个没有依赖的 shell 里跑测试。
Token 统计异常也要排。输入 Token 突然暴涨,先看是不是测试失败输出被完整回传,尤其 traceback 里有大量重复路径时。输出 Token 暴涨,看模型是不是在每轮写长篇解释,或者反复生成大补丁。轮次异常多,看是不是同一个错误被反复重试,或者测试命令每次都因为环境问题失败。遇到这些情况,不要直接删记录,反而要保留原始轮次,因为它们正是单用例成本的一部分。你可以在备注里写“第 3 到 5 轮为环境错误重试”,但总 Token 仍然计入总账。
如果 Aider 或 Codex CLI 试图修改测试文件,立即停止会话,保存 diff,然后回滚。测试文件是这次评测的标尺,标尺不能被被测工具改。你可以在 Prompt 里写“只允许修改 src/ 下的源码”,但更可靠的是跑完后检查 git diff -- tests/。如果测试目录有改动,把对应修红数扣掉,并在表里备注。不要为了得到漂亮的 12/12 而把测试改动算成修复,那样单用例成本就没有意义了。
最后再核对一次统一网关的用量。打开 模型对话 确认模型 ID 与广场一致,长期两个 CLI 轮着跑可以看 Coding Plan。Key 在 控制台 创建,创建后先跑一条最小请求验证计费,再开始 12 个红用例的正式记录。Claude Code 的 Anthropic 接入文档在 这里,但 Codex CLI 不要套那套变量。完成对照表后,回到 TaoToken 看一次用量汇总,确认这次 Aider 和 Codex CLI 的调用都进了同一把 Key 的账。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度




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



