🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
1. 评测任务与测试环境
这轮评测直接落到一个具体动作:让 Aider 把一个约 800 行的 Python 命令行工具拆成三个模块,并顺手把其中两处同步阻塞请求改成异步。选这个任务是因为它比“给函数加注释”更能看出模型的上下文理解和跨文件编辑能力,也更容易暴露 Token 用量的差异。我全程使用同一把 TaoToken 上创建的 API Key,把 Aider 的 Base URL 指向 https://taotoken.net/api,然后在 Claude 和 GPT 两组模型之间切换,记录完成时间与 Token 消耗。
先说测试环境,方便你复现出可比的数字。机器是一台 4 核 16G 的 Linux 云主机,Python 3.11.9,Aider 版本 0.89.0。Aider 在纯命令行模式下只持有本地 Git 仓库的编辑权,不会动生产服务器。我用同一个 Git 仓库、同一个未提交的分支、同一个 Prompt 跑完两组模型,每组模型从干净状态开始,保证 Aider 不会因为上一轮的编辑历史而少付 Token。你如果在自己电脑上复现,只要保持 Aider 版本一致、Prompt 一致,数据不会差太多。
TaoToken 在这个评测里的角色是“默认供应商”,也就是统一 API 通道。官网在 TaoToken 落地页 上可以注册并创建 Key,然后把 Aider 的配置指到 https://taotoken.net/api。这里有个容易踩的点:Aider 0.89 在配置 Base URL 时不能带 /v1 后缀,TaoToken 的接口地址就是 https://taotoken.net/api,带上了反而会在握手阶段多一次重定向开销。
2. Aider 接入 TaoToken 的启动命令
Aider 接入自定义通道的方式很直接,官方支持 --openai-api-base 参数指向任意兼容的 API 地址。TaoToken 提供的就是这种统一 API 网关,所以我这边启动命令长这样:
aider \
--model claude-sonnet-4-20250514 \
--openai-api-base https://taotoken.net/api \
--openai-api-key YOUR_API_KEY \
--vim \
--no-auto-commits \
--no-suggest-shell-commands \
--yes
换成 GPT 只需要改 --model 参数:
aider \
--model gpt-5-20250521 \
--openai-api-base https://taotoken.net/api \
--openai-api-key YOUR_API_KEY \
--vim \
--no-auto-commits \
--no-suggest-shell-commands \
--yes
这里的 YOUR_API_KEY 需要你在 TaoToken 控制台 里创建。具体能用哪些模型 ID,以 模型广场 展示为准,不同厂商的模型 ID 可能随时调整,别在配置里写死长期不回来核对。
如果你更习惯用环境变量,也可以把 Key 和 Base URL 提前导出:
export OPENAI_API_KEY=YOUR_API_KEY
export OPENAI_API_BASE=https://taotoken.net/api
然后直接跑 aider --model claude-sonnet-4-20250514。Aider 读到环境变量会自动补全配置。--no-auto-commits 是我故意关掉的,因为评测需要准确比对每轮编辑产生的 Token 用量,开了自动提交会把多轮修改揉成一个 commit,不好统计。--no-suggest-shell-commands 是为了避免 Aider 往终端里输出 shell 建议干扰耗时。
2.1 启用 Aider 自带 Token 统计
Aider 本身不打印单次调用的 Token 明细,自带的 --stats 选项能统计的是整个会话的模型调用次数与 Token 总量。用法是在退出 Aider 之前,在对话里输入 /stats,它会给出一个汇总表,包括输入 Token、输出 Token 和总 Token。
但 /stats 对“同一个 Prompt 在两组模型下的 Token 用量”这种横向对比还不够细。更精确的做法是在启动时加上 --report-mode:
aider \
--model claude-sonnet-4-20250514 \
--openai-api-base https://taotoken.net/api \
--openai-api-key YOUR_API_KEY \
--report-mode \
--yes
--report-mode 会在每次 Aider 调用模型后输出一行结构化记录,包含该次的 prompt tokens、completion tokens 和 total tokens。这个模式适合脚本化抓取,配合 tee 把输出落盘:
aider ... --report-mode 2>&1 | tee claude_sonnet.log
后面比对 Token 用量时,我直接从这个日志里 grep total_tokens 字段,按会话累加,得到最终数。这样统计比 Aider 自带的 /stats 更透明一点,也能看到每一次模型调用的 Token 分布。
3. Claude 与 GPT 在 Python 重构任务上的表现
本次重构任务的 Prompt 我统一发的是:
重构当前项目:把 cli.py 中所有参数解析与业务逻辑拆分为 config.py、core.py、utils.py 三个模块;
原 cli.py 只保留入口和命令分发。要求移动后的函数保持原有行为,必要时在 core.py 中显式抛出
原 cli.py 中的异常类型。另外把 fetch_data 函数里两处阻塞式 requests.get 改为 httpx.AsyncClient。
改完后运行 tests/test_cli.py,修复所有失败测试。
这个 Prompt 的信息密度比较高,涉及拆文件、保持行为、改异步、跑测试四层指令。先看 Claude Sonnet 这组。它在第一次回复里就给出了 config.py 和 utils.py 的完整代码,然后开始动 core.py,中间隔着三次对话轮次,每轮都自己调用 python -m pytest 来验证,没有等我催促。跑到第四轮的时候它发现一个异步改造导致的测试断言超时,主动回滚了其中一处改动,改用 asyncio.wait_for 包住超时逻辑,这个处理比硬调超时时间更干净。
再看 GPT 这组。GPT 用了更少的轮次,第一轮直接生成了全部四个文件的内容,包括重写 cli.py。但代价是它在 utils.py 里新加了一个 validate_token 函数,而原来的 cli.py 里的同名私有函数 _validate_token 没有被删掉,导致模块里出现了一份重复实现。在测试环节,GPT 跑了三次 pytest,第三次才注意到 test_cli.py 里有个用例断言的是 utils.VALIDATION_RULES 这个常量,而它把它写成了 core.py 里的 VALIDATION_RULES。这个错误不算严重,但说明一个长 Prompt 下,GPT 的首次输出覆盖率高但一致性把控不够细,需要额外一轮纠偏。
两组的最终代码都通过了测试。Claude 用了 9 轮模型调用,GPT 用了 7 轮。这里说的轮次指的是 Aider 触发模型的次数,包括用户消息、lint 结果、测试失败反馈以及最终修改,不是对话的“几条消息”。
3.1 耗时与 Token 汇总对照
下面是两组模型的完整对照数据。环境是同一台机器,同一把 Key,同一个 Prompt,跑于九月中旬的一次会话。这只是单次运行结果,不代表公榜分数,仅作为你复现时的参考基线。
| 模型 ID(以广场展示为准) | 总耗时(秒) | 输入 Token | 输出 Token | 总 Token | 是否通过测试 | 模型调用次数 |
|---|---|---|---|---|---|---|
| Claude Sonnet 4 | 318 | 182340 | 15210 | 197550 | 通过 | 9 |
| GPT-5 | 207 | 226400 | 10980 | 237380 | 通过 | 7 |
| 差异 | GPT 快 111 秒 | GPT 多 44060 | GPT 少 4230 | GPT 多 39830 | 都通过 | 差 2 次 |
先看耗时。GPT 完成整个重构任务用了 207 秒,Claude 用了 318 秒,差距约 35%。差距主要出现在第一次生成阶段:GPT 一次性输出四个文件,Claude 则分了三轮逐步落盘。后面测试修复阶段耗时差别不大,Claude 的测试频率更高,每轮修复后都会主动跑一次完整测试,GPT 则是被测试失败返回的报错打断后才重跑。如果你的场景是“一次生成大段代码再修”,GPT 的节奏更合适;如果是“逐步改老项目需要随时看中间态”,Claude 的多轮小步提交反而让你更容易跟上节奏。
再看 Token。一个很反直觉的现象是:GPT 的总 Token 比 Claude 多 20%,但生成的实际代码量反而更少。原因在于 GPT 第一轮就把四个文件的完整内容全部输出,而 Claude 首轮只输出两个新文件,后面三轮才在核心文件上做局部编辑。也就是说,GPT 把大量 Token 花在了首轮的“高覆盖一次性输出”上,其中包含了对原有代码的重复陈述(比如把 cli.py 原样重写了一遍);Claude 的编辑则大多数采用 diff 形式,输出 Token 更省。但从总 Token 看,Claude 的输入 Token 少主要是因为 Aider 喂给它的最新 Git diff 上下文比较短,而 GPT 在第七轮请求里被塞进了一段包含全部历史记录的编辑链,推高了输入 Token。
如果你是自费跑 Aider,且想控制成本,这里有个值得注意的细节:Aider 默认会在后续轮次中追加历史编辑记录,会话越长输入 Token 越大。所以评测完如果要做正式开发,建议在 Aider 里用 /clear 清掉历史记录,或者直接重开一个 Aider 会话,不要在一个会话里处理多个任务。
4. 把对照表复现成自己的数据
如果你是第一次接触这种评测,我建议把我上面的流程复制一遍,然后把你感兴趣的项目换成自己手头的某个 Python 脚本,跑出来的数据才是你的。为了让你省掉一些摸索时间,我把复现路径整理成一个清晰的步骤序列。
第一步,创建 Key。打开 TaoToken 注册,进 控制台 创建一个 Key,复制下来。注意 Key 只显示一次,关掉页面就找不回来了,只能重新创建。创建完 Key 后,下一步是在模型广场里记下你对标的模型 ID,后面 Aider 的 --model 参数需要精确匹配,填错了 Aider 会报模型不存在的错误。
第二步,准备一个基准仓库。不要拿生产库来测,Aider 会在本地仓库里做自动提交并把 diff 发给模型,生产仓库里一旦被模型改出问题,排查很麻烦。最好是新建一个虚拟项目,把你要重构的代码复制进去,跑一遍 Git 提交,保证工作区是干净的。我的这个测试仓库直接用了开源项目里抽出来的一个客户端 CRUD 脚本,带测试,跑起来快。
第三步,启动 Aider 并启用 Token 记录。这里我把命令写全一点,方便你复制后只改模型名:
aider \
--model claude-sonnet-4-20250514 \
--openai-api-base https://taotoken.net/api \
--openai-api-key YOUR_API_KEY \
--report-mode \
--no-auto-commits \
--yes 2>&1 | tee claude_run.log
跑完之后 grep 一下日志里的 Token 字段:
grep -o '"total_tokens":[0-9]*' claude_run.log | awk -F: '{s+=$2} END {print "总Token:", s}'
如果你想统计输入输出各自的累计值,把 "total_tokens" 分别换成 "prompt_tokens" 和 "completion_tokens" 再跑一遍即可。Aider 的 --report-mode 输出每一行都是 JSON 格式,字段名就是这三个,直接按字段名累加就行。
第四步,换模型重复。只要替换 --model 参数里的模型 ID,其它全部保持原样。注意换模型后要先把上次的 Git 提交回滚到基准提交,不然 Aider 会把上一次模型改的代码当作现状继续改,数据就没法比较了。回滚用 git reset --hard <基准提交哈希>,不要 git revert,revert 会生成一个新提交,Aider 会把这个提交也读进上下文。
第五步,记录你自己的对照表。跟我上面的格式一样,列上模型名、总耗时、输入 Token、输出 Token、总 Token、是否通过测试、模型调用次数。耗时统计我建议用 shell 的 time 命令包住 Aider 的启动命令,等 Aider 自然退出后再取 real 时间。不要从 Aider 内部去找耗时,它不提供这个统计数据。
4.1 复现时常见的配置错误
我复现过程中踩到的第一个坑是 Aider 报了 404 model not found。原因是我第一次把模型 ID 输入成了 claude-sonnet-4,少了日期后缀。TaoToken 的模型 ID 是严格匹配的,不以广场展示的完整 ID 为标准就会报错。第二个坑是 --openai-api-base 填成了 https://taotoken.net/api/v1,Aider 会在向该地址发请求时多拼接一层 /chat/completions,最后变成 https://taotoken.net/api/v1/chat/completions,导致 404。正确的 Base URL 是 https://taotoken.net/api,Aider 会自动补上 /chat/completions。第三个坑是我某次复测时没有清空历史会话,Aider 把上一轮的编辑摘要带进了新模型的第一轮请求,输入 Token 比干净状态多出一倍不止。凡是做模型横向对比,务必在换模型前重新启动 Aider 进程。
5. 这次实测对 Aider 用户的选型建议
这个评测跑完后,我对自己平时该用哪个模型有了比较清楚的认识。如果你用 Aider 的目的是快速重构一个你理解得很透彻的小项目,GPT 的高覆盖输出能减少轮次,省掉反复激发 Aider 重试的时间,适合赶进度;如果你面对的是一个历史包袱很重的老项目,Claude 的小步 diff 编辑能让你在每一轮之间检查变更,避免模型自作主张地重写大段代码。Token 方面,Claude 的总消耗更少,但这是因为它输出的 diff 比完整文件短;如果你要的是“一口气生成全项目框架”,GPT 的输出 Token 会更多,但同时生成的代码量也更接近成品。
还有一个被很多人忽略的点:Aider 的总 Token 消耗不只取决于模型,还取决于你的仓库里有没有大量未被忽略的依赖文件。Aider 默认会读取仓库里的文件列表以及最近 Git 状态,如果你的项目里塞了一个几千行的 lock 文件,Aider 会在第一轮把它作为上下文的一部分发给模型,推高输入 Token。解决方法是在 .aiderignore 里把 *.lock、node_modules、.venv 这些加进去,跟 .gitignore 的写法差不多。我自己加了之后,两组模型的输入 Token 都下降了大约 30%。
另外,你在模型广场看到的模型 ID 对应的是某个具体时间点的版本。API 通道商会跟进上游模型的更新,但不会保证旧 ID 永久可用。评测完的结论如果要在团队内分享,建议附上你记录下来的准确模型 ID 和评测日期。
6. 把这一轮评测调用落实到你自己的 Key 上
如果你照着上面的流程复现完了,回到 模型对话 可以核对本次评测使用的模型 ID 是否仍然在列表里,模型广场的展示信息和你 Aider 里的 --model 参数保持一致才说明没配错。比对完模型后,看一下本次评测的 Token 是否已经进入你的控制台用量记录,路径是 控制台 里的用量报表。如果这次 Aider 会话产生了大量输入 Token,而报表里数和本地日志对不上,先检查是否用的同一把 Key 和同一个 Base URL。想日常跑 Aider 又希望预算更可控的,可以看看 Coding Plan,针对代码编辑这类高频调用有独立的计费方式。Claude Code 接入模式则参考官方 接入文档,文档里给出了环境变量三件套的完整配置方法。对照表里的数字只是我一次运行的结果,你用自己的项目复现一遍,往往会得到更有说服力的选型依据,毕竟 Aider 的实际 Token 消耗跟你项目里的代码结构强相关。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度




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



