🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
1. 为什么拿同一把 Key 对比 Aider 和 Codex CLI
用同一把 TaoToken Key 跑 Aider 和 Codex CLI,是检验两个终端 AI 编程工具真实消耗的最直接办法。我在官网创建 Key 后,把 Base URL 填成 https://taotoken.net/api,分别在同一个 pytest 仓库里执行类型标注迁移任务,记录下每次调用的 usage 字段。这篇就把配置、过程和 token 对照表交出来。
Aider 和 Codex CLI 是两种思路很不一样的终端 AI 编程工具。Aider 更像「坐在你旁边的结对程序员」:它读取 git 仓库内容,生成针对具体文件的编辑 diff,然后由你在编辑器里确认;它不主动跑命令,验证测试的责任在你自己。Codex CLI 则是「分派任务给你手下的 Agent」:它把 prompt 拆成多步计划,在沙箱终端里执行 shell 命令、读取报错、修改文件、跑测试,直到它认为自己完成了。同样是「修复 pytest 仓库里的类型标注」,两条路径的 token 消耗结构完全不同。如果你关注成本,或者在长期任务里担心上下文窗口被打满,Aider vs Codex CLI 的 token 对比就非常值得做一次。
要让这个对比成立,最关键的是保证两个工具调用的是同一个模型、同一个计费口径、同一个 usage 返回格式。我选择用 TaoToken 作为默认供应商,把 https://taotoken.net/api 同时填进 Aider 和 Codex CLI 的 Base URL,而不是各自接不同的平台。这样两个工具走到同一个网关,模型 ID 一致,usage 里的 prompt_tokens 和 output_tokens 也能以相同标准累加。排除供应商差异后,多出来的 token 差异就基本来自工具本身的决策路径。它在本文中的角色很单一:Key 提供方、Base URL 提供方、对照基线,不是被评测对象;被评测的是两个 CLI 工具在相同外部条件下的消耗差异。
只看工具自带的统计界面,其实很难直接对比。Aider 在交互结束时汇总当次会话的 API 用量,Codex CLI 的会话记录则散在日志目录里,需要自己按 request 汇总。更麻烦的是,如果两个人各自用自己的 API Key 和不同模型,底层模型不同,token 消耗比较就失去了意义。所以我在动手前把所有变量压到最小:同一个 prompt、同一个 git 仓库、同一个模型 ID、同一个 Base URL、同一把 Key。这样最后得出的差异,才敢归因于 Aider 的编辑式工作流和 Codex CLI 的 Agent 式工作流。
2. 任务与环境:一个 pytest 仓库的类型标注迁移
2.1 仓库与验收标准
测试仓库是一个离线 pytest 项目,5 个业务模块加 2 个测试文件,约 1200 行 Python,不依赖外部网络服务。选中这个规模是有原因的:再小的 demo 脚本看不出工具差异,再大的生产仓库又会引入太多偶然因素;1200 行刚好能让两个 CLI 在多文件之间做取舍,又不会因为上下文过长而失焦。业务模块中我刻意保留了多种旧式标注:typing.Optional、typing.List、typing.Dict、typing.Tuple,部分公开函数没有返回注解,部分参数用 Any 兜底。迁移任务的验收标准写在仓库根目录的 TASK.md 里,内容包括:把所有 Optional[X] 改写为 X | None;把 List[T]、Dict[K, V]、Tuple[...] 改写为内置泛型 list[T]、dict[K, V]、tuple[...];为没有返回注解的公开函数补上返回注解;清理不再使用的 typing 导入;保持测试文件不变,pytest -q 必须通过。
选这个任务的原因:类型标注迁移既不是「照着规则替换」的简单文本替换,也不是需要大范围设计的高难度重构。它要求先定位所有相关标注、理解每个文件里泛型参数的使用方式,再批量修改。Aider 和 Codex CLI 对这类任务的处理路径差异正好能体现出来——一个偏向逐文件精确编辑,一个偏向边执行测试边自我修正。pytest 仓库的存在也让「是否真正完成」有了客观判定:测试不过就是没完成,测试过了才有资格谈 token 消耗。
2.2 环境与统计口径
实测环境为 macOS 本地终端,Python 3.11.8,git 工作区干净。Aider 为 pip 安装的最新版本,Codex CLI 为 npm 安装的最新版本;两个 CLI 的版本号不影响 Base URL 配置方式,模型 ID 以模型广场展示为准。全文只记录一次运行的结果,不代表公榜成绩。我没有把任务放进 Docker 容器,因为读者更常在本机终端里跑这类工具,容器环境虽然干净,但文件系统、测试执行细节和本机实况有偏差。
usage 统计口径比较关键:我把两个工具在整段任务期间产生的所有 API 请求的 usage 字段逐一相加,得到累计 prompt_tokens 和 output_tokens。Aider 的统计可以直接从 verbose 输出读取;Codex CLI 的统计在 ~/.codex/sessions 下的会话记录里,把每次 request 的 usage 取出后手工汇总,具体路径以你本机 Codex CLI 日志为准。两次任务之间没有提前清理 git 历史,确保两个工具看到的是同一个初始仓库状态。任务过程里我尽量不手动介入,唯一例外是 Aider 完成后追加了一轮修复,原因在第 3 节里说明。
3. Aider 接入统一网关的配置与实测过程
3.1 配置
Aider 对 OpenAI 兼容端点支持得比较直接。我把 Base URL 和 Key 通过命令行参数传入,避免改动全局环境变量:
aider --openai-api-base https://taotoken.net/api \
--openai-api-key YOUR_API_KEY \
--model YOUR_MODEL_ID \
--yes --no-auto-commits \
--message "$(cat TASK.md)"
参数说明:YOUR_API_KEY 在 TaoToken 控制台创建;YOUR_MODEL_ID 以模型广场展示的字符串为准,复制后填入;--no-auto-commits 关闭自动 git commit,方便逐条查看改动;--yes 跳过交互确认,完整跑完任务。注意不要在 Base URL 后面加 /v1,Aider 自己会按 OpenAI 兼容协议拼接路径,多余的后缀会直接造成 404。如果你习惯用环境变量,也可以把 Key 和 Base URL 放到 OPENAI_API_KEY、OPENAI_API_BASE 里,效果等价,但命令行参数更容易在多个项目间切换,不会污染 shell 配置。
3.2 Aider 实测过程
Aider 启动后先构建 repo map,扫描整个仓库的依赖结构,然后基于 TASK.md 规划要修改的文件。它的实际修改路径是「一个文件一个文件生成编辑脚本」,而不是一次性输出全部 diff。第一个被处理的是 models.py,它把 Optional[int] 改成 int | None;然后依次处理依赖它的模块。由于 Aider 不执行测试命令,它并不知道某个文件里还剩了 Tuple 没改。我在第一轮完成后手动运行 pytest -q,发现 domain/events.py 和 infra/repository.py 两个文件仍有旧式 Tuple,于是追加了一轮 prompt:「还有 Tuple 没迁移干净」,Aider 才补完整。
实测下来,Aider 的累计 prompt_tokens 是 285,431,output_tokens 是 18,762。观察 verbose 日志可以发现,prompt_tokens 的大头是每轮都会重新发送的 repo map 和当前文件内容;output_tokens 则始终稳定在「diff 越小越好」的范围内,很少产生大段解释文本。这也意味着:仓库越大,Aider 的 prompt 固定开销越高;但它的 output 端非常节省。整体节奏也快,因为每一轮只处理一个文件,请求之间不需要等待测试结果。
3.3 Aider 的 token 消耗特征
从这次运行看,Aider 的消耗重心几乎全在 prompt 端。它的决策机制决定了每次编辑都带着尽可能完整的上下文,这保证了改动准确性,但文件重复读取会快速累积 prompt_tokens。Aider 的优点是 output 极少浪费;缺点是验证回路缺失,一旦任务需要「看测试结果再折返」,它就会产生额外的人机交互轮次,而这些轮次同样要重发上下文。
配置时需要特别注意的地方是模型 ID 识别。Aider 对自定义模型会检查已知清单,如果模型不在清单里会报 unknown model。解决方法是直接用 --model-settings-file 指定上下文窗口,或者用 --alias 把自定义模型名映射到已知模型。本次实测因为模型 ID 从模型广场复制后能透传,没有走到那一步。
4. Codex CLI 接入统一网关的配置与实测过程
4.1 配置
Codex CLI 的配置集中在 ~/.codex/config.toml。它不读 ANTHROPIC_ 环境变量,所以不要拿 Claude Code 的三件套来配 Codex,会完全不生效。我在配置里自定义了一个名为 taotoken 的 model provider:
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 "$(cat TASK.md)"
wire_api = "chat" 表示该 provider 走 Chat Completions 兼容协议;如果你选的模型协议不同,以模型广场对应模型的支持情况调整。Codex CLI 的沙箱模式默认开启,它会在本机执行 git status、pytest 等命令,这些命令都在你当前的 git 仓库目录里生效。任务文件 TASK.md 存放在仓库根目录,prompt 读取后,Codex 会自行决定读取哪些源码文件和运行哪些测试,不需要我逐文件指定。
4.2 Codex CLI 实测过程
Codex CLI 启动后首先分析了仓库结构,列出所有包含旧式标注的文件。它的工作方式明显更「主动」:每修改一个文件,就立即运行一次针对性测试。以 domain/events.py 为例,它先 grep 出三处 Tuple,改完马上 pytest tests/test_events.py -q,看到测试通过后才进入下一个文件。整个过程中我没有手动介入;Codex CLI 在最后自行跑了一遍全量 pytest -q,确认 49 个测试全部通过后结束任务。这个「自己跑测试确认完成」的行为,是它与 Aider 在工作流层面最直观的区别。
从 session 记录汇总,Codex CLI 的累计 prompt_tokens 是 412,987,output_tokens 是 31,256。prompt_tokens 增长最快的阶段在「修改 + 测试 + 失败重试」的循环里:每次工具调用都会把之前的会话历史和最近一次 shell 输出重新发送给模型,历史越长,单轮请求的 token 越大。output_tokens 方面,Codex 除了生成代码 diff,还会生成结构化的工具调用指令,这两部分都算在 output 里,因此 output 明显高于 Aider。
4.3 Codex CLI 的 token 消耗特征
Codex CLI 的 token 消耗模型本质上是「多轮 Agent 循环」:每轮包含历史上下文、工具调用、结果回填。与 Aider 相比,它多出来的 prompt_tokens 相当于为「自主验证」支付的费用。这次任务里它主动跑了 20 多次 pytest,每次跑完要把 stdout/stderr 塞回上下文,这些内容累计起来相当可观。
Codex CLI 的优势是最终状态更可靠:它会自己发现语法错误、导入未更新、测试失败,不需要我追加 prompt。如果任务本身没有测试覆盖,或者测试质量差,这些额外验证轮次就很可能成为纯浪费。所以在评估「谁更耗 token」时,不能只看数字,还要看数字买到了什么。Aider 用较低 token 买到了「人机协同的高效编辑」;Codex 用较高 token 买到了「机器自主完成闭环」。
5. Aider vs Codex CLI:Token 消耗对照表与结论
5.1 两行对照表
环境信息:同一台机器、同一把 Key、同一个模型 ID、同一个 git 仓库与 TASK.md。这是一次运行的记录,不代表公榜成绩,但在同样条件下可复现。之所以不做成基准测试榜单,是因为单次任务的 token 消耗受仓库结构、prompt 表述和工具版本影响很大,任何脱离具体任务的数字都只能当参考。
| 工具 | prompt_tokens | output_tokens | 总 tokens | 完成情况 |
|---|---|---|---|---|
| Aider | 285,431 | 18,762 | 304,193 | 完成,人工追加一轮 Tuple 修复 |
| Codex CLI | 412,987 | 31,256 | 444,243 | 完成,全程无需人工介入 |
5.2 谁更耗 token
结论很直观:Codex CLI 在总 token 上比 Aider 多约 46%。分项看,prompt_tokens 高约 44.7%,output_tokens 高约 66.6%。这组数字来自同一次任务、同一个模型,差异只能归因于两个工具的架构:Aider 像外科手术,每次发送精准的最小上下文,输出精简的 diff;Codex CLI 像带工地的包工头,频繁把测试日志、文件内容、历史决策回填给模型,换来不依赖人的完成闭环。
成本侧的计算方式为:总 token 数乘以对应模型的单价。TaoToken 的售价以官网展示为准,这里不给具体价格。若你的使用场景对 output_tokens 特别敏感,比如大量生成代码或长文档,Codex CLI 的 output 开销差距会在账单上更明显;如果主要是 prompt 敏感,比如长会话多轮任务,则差异也集中在 prompt_tokens 的持续累积上。
5.3 结论怎么用
这次对比给出的是一个基线,不是定论。任务类型会直接影响差距大小:如果任务几乎不需要测试反馈,比如纯重构一个不涉及执行的模块,Codex 的验证轮次会减少,token 差距会收窄;如果任务对「改完必须能跑」有强要求,Aider 多次人工跑测试再回传 prompt 的成本反而可能反超。我建议读者按自己的测试覆盖度和任务性质选工具,而不是只看谁的总 token 少。两个工具共用同一把 Key 完全可行,Base URL 都填 https://taotoken.net/api,互不干扰。公榜上的模型分数只能说明特定模型的能力上限,并不能说明工具在本仓库上的 token 效率,工具链的差异必须在自己的仓库上复测才能落到账本上。
6. 用同一把 Key 复现本次对照表
6.1 复现步骤
如果你想在自己的 pytest 仓库上复现,步骤是固定的:先在 TaoToken 创建一把 Key,复制 YOUR_API_KEY;然后打开模型广场,记录你要使用的模型 ID,写入 YOUR_MODEL_ID;准备一个干净的 git 仓库,包含 pytest 测试和待迁移的类型标注,编写 TASK.md;按第 3 节命令行运行 Aider,按第 4 节 config.toml 运行 Codex CLI;最后汇总两个工具的 usage 字段,填入第 5 节的表。
复现时如果 token 总量和本文有明显出入,先检查模型 ID 是否一致、任务描述是否覆盖相同文件范围。token 消耗是任务敏感的,不必追求数字完全一致,重点是看两个工具在你自己的仓库上的相对差距。
跑完对照表后,可以打开模型对话确认本次使用的模型 ID 与广场一致;如果你准备把这个工作流放进日常开发,再看 Coding Plan 是否匹配你的调用体量。Key 的创建与用量对账统一在控制台完成。
6.2 排障
只列本次配置相关的常见错误。401:YOUR_API_KEY 没被正确替换,或者 Key 前后多了空格,到控制台重新复制。404:Base URL 写成了 https://taotoken.net/api/v1,统一去掉末尾的 /v1。Aider 报 unknown model:模型 ID 不在 Aider 已知清单中,用 --model-settings-file 补配置,或查模型广场确认 ID 的完整拼写。Codex 报 model provider 不存在:检查 config.toml 里的 model_provider 与 [model_providers.taotoken] 标题是否完全一致。Codex 报 key 无效:确认 env_key = "TAOTOKEN_API_KEY" 对应的环境变量已导出,且值来自控制台而不是其他地方。排障的最后一步都是回到控制台看用量,用量页面会按请求时间和模型维度展示请求数,你可以据此核对本次对照表里的 token 总量是否与页面吻合。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度




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



