20-Claude Code vs Codex vs OpenCode:真实项目横向评测
Claude Code vs Codex vs OpenCode:真实项目横向评测
前 19 篇文章分别深入了三大工具。但"哪个更好"这个问题,只有放在同一个需求面前才能真实回答。这篇文章用同一个项目需求,分别交给三个工具独立完成,从四个维度做客观对比。
评测方法
测试需求
为了公平对比,选择了一个中等复杂度的真实需求:
"为一个 FastAPI 后端项目添加 API Key 认证功能。要求:
- 支持创建/吊销 API Key
- API Key 用 SHA-256 哈希存储(不存明文)
- 中间件验证 API Key,验证失败返回 401
- 支持 Key 的过期时间
- 写完整测试"
评测环境
项目背景:已有的 FastAPI 后端项目(12 个文件) CLAUDE.md / AGENTS.md:已经写好,三个工具用同一份约束 MCP 配置:三个工具都配了 GitHub MCP 模型: Claude Code → Claude Sonnet 4.6 Codex CLI → GPT-5.3-Codex OpenCode → Claude Sonnet 4.6(和 Claude Code 同模型,对比工具差异)评测维度
| 维度 | 评估方法 |
|---|---|
| 代码质量 | 安全性、正确性、可维护性、测试覆盖 |
| 开发速度 | 从开始到跑通全部测试的时间 |
| 交互体验 | 需要的对话轮数、中断次数、返工次数 |
| Token 成本 | 实际消耗的 Token 量 × 单价 |
实测过程
Claude Code:4 轮对话,22 分钟
第 1 轮(3 分钟): 👤 "帮我添加 API Key 认证功能。要求:创建/吊销 Key, SHA-256 哈希存储,中间件验证,支持过期时间。" 🤖 开始干活: - 直接创建 api_key.py(model + CRUD) - 直接创建 middleware.py(验证中间件) - 注册路由到 main.py → 初版完成,但 API Key 的权限模型没做 第 2 轮(5 分钟): 👤 "不错。但还需要给每个 Key 关联一个 scope(权限范围), 中间件验证时要检查 scope 是否匹配当前路由。" 🤖 修改 model 加 scope 字段 → 修改 middleware 加 scope 检查 → 修改创建/吊销接口支持 scope 参数 → 修改测试覆盖 scope 场景 → 运行测试:3 个 fail → 自动修复:scope 默认值处理不当 → 再跑:全部通过 第 3 轮(8 分钟): 👤 "再加一个功能:管理员可以查看所有 Key 的使用统计—— 每个 Key 被调用了多少次、最后一次调用时间。" 🤖 新增 APIKeyUsage 表 → 新增统计接口 → 修改 middleware 每次验证后记录使用 → 写测试 → 跑测试:1 个 fail(并发记录问题) → 修复:改用异步写入 → 通过 第 4 轮(6 分钟): 👤 "最后加完整测试:happy path + 过期 Key + 错误 scope + 吊销后的 Key" 🤖 写了 12 个测试用例 → 跑测试 → 全部通过 → /review 自查 → 没有安全问题 总计:4 轮对话,22 分钟,22 个测试全部通过。Codex CLI:3 轮对话,31 分钟
第 1 轮(12 分钟): 👤 同样的需求描述 🤖 自动触发 /plan: → 输出 6 步计划 → 我等了 2 分钟读计划 → 确认 计划执行: → 创建 api_key.py → 创建 middleware.py → 注册路由 → 每步执行后自动检查 → 写完就跑测试:全部通过 → 比 Claude Code 慢,但每一步都很稳 第 2 轮(10 分钟): 👤 "加上 scope 权限控制和使用统计" 🤖 再次 /plan → 输出 3 步子计划 → 我确认 → 执行。这次没有 test fail。 → 但多花了时间在"过度谨慎"上—— 改一个字段,Codex 会确认两遍。 第 3 轮(9 分钟): 👤 "加完整测试" 🤖 自动生成 14 个测试 → 跑测试 → 全部通过 → /review 自查 → "建议给统计接口加缓存,避免频繁查询" 总计:3 轮对话,31 分钟,22 个测试全部通过。OpenCode:5 轮对话,28 分钟
第 1 轮(7 分钟): 👤 同样的需求描述 🤖 没有 /plan,直接开始 → 创建 api_key.py(结构有点"教科书",不够贴合项目现有风格) → 创建 middleware.py → 和 Claude Code 输出质量接近但稍微粗糙 第 2 轮(6 分钟): 👤 "model 的风格和项目现有的 models/user.py 不一致, 看看 user.py 然后改一下" 🤖 读 user.py → 调整 api_key.py 的风格 → 这次一致了,但多花了一轮对话来修正风格问题 第 3 轮(6 分钟): 👤 "加 scope 权限控制" → 正常完成 第 4 轮(5 分钟): 👤 "加使用统计" → 正常完成,但 middleware 中记录使用的代码有点重复 第 5 轮(4 分钟): 👤 "加完整测试 + 重构一下 middleware 里重复的代码" → 完成 总计:5 轮对话,28 分钟,22 个测试全部通过。四维对比
一、代码质量
三份最终代码的核心差异:
| 检查项 | Claude Code | Codex CLI | OpenCode |
|---|---|---|---|
| 安全性(SQL 注入/Key 泄露) | ✅ 参数化查询,哈希存储 | ✅ 同左 | ✅ 同左 |
| Key 哈希存储 | ✅ SHA-256 + salt | ✅ SHA-256 + salt | ✅ SHA-256(无 salt) |
| 过期时间处理 | ✅ 时区感知 | ✅ 时区感知 | ⚠️ 用了 UTC now but naive |
| 中间件错误处理 | ✅ 完善的异常处理 | ✅ 更详细的错误码 | ✅ 基本覆盖 |
| 代码风格一致性 | ⚠️ 第 4 轮才完全一致 | ✅ 从开始就一致 | ❌ 需要修正才能一致 |
| 测试覆盖 | 22 个测试 | 22 个测试 | 22 个测试 |
| 代码可读性 | ★★★★☆ | ★★★★★ | ★★★☆☆ |
| 安全性总分 | ★★★★☆ | ★★★★★ | ★★★☆☆ |
结论:Codex CLI 代码质量最高(因为 /plan 先行,每一步都经过审查),Claude Code 紧随其后但需要更多迭代修正,OpenCode 需要更多人工干预来对齐项目风格。
二、开发速度
从需求到全部测试通过: Claude Code ██████████████████░░░░ 22 分钟 OpenCode ██████████████████████ 28 分钟 Codex CLI ████████████████████████████ 31 分钟但只看时间会得出错误结论。更细致的分析:
Claude Code 快在哪? - 不用 /plan,直接动手(省了 3-5 分钟/轮) - 对话更自然,不需要"确认计划"这个步骤 Codex CLI 慢在哪? - /plan 生成需要 1-2 分钟,阅读和确认需要 1-3 分钟 - 每步执行后自动检查,多了一道工序 - 但慢的这 9 分钟换来了更少的返工和更高的代码质量 OpenCode 慢在哪? - 风格对齐多消耗了一轮对话(6 分钟) - 没有自动的风格学习机制结论:快速迭代选 Claude Code,一次做对选 Codex CLI。
三、交互体验
| 维度 | Claude Code | Codex CLI | OpenCode |
|---|---|---|---|
| 对话轮数 | 4 轮 | 3 轮 | 5 轮 |
| 需要我手动纠正次数 | 2 次 | 0 次 | 3 次 |
| 返工次数 | 1 次(scope 默认值) | 0 次 | 1 次(风格对齐) |
| 需要我做的决策 | 4 个 | 7 个(确认计划) | 5 个 |
| "惊喜"次数(AI 主动做了超出预期的好事) | 2 次 | 1 次 | 0 次 |
| "惊吓"次数(AI 做了预料之外的错事) | 1 次 | 0 次 | 1 次 |
交互风格差异:
Claude Code: "你要 X?好,我开干了。" → 速度快,但有时需要你拉住它。 Codex CLI: "你要 X?我先想想怎么做。" → 计划阶段让你安心,但每一步都要你点头。 OpenCode: "你要 X?好的。" → 像 Claude Code,但没有那么精细的"品味"。四、成本对比
| Claude Code | Codex CLI | OpenCode | |
|---|---|---|---|
| 输入 Token | 85K | 120K(/plan 消耗额外上下文) | 78K |
| 输出 Token | 18K | 15K | 20K |
| 模型单价(每 1M Token) | $3 / $15 | $3 / $12 | $3 / $15 |
| 本次任务成本 | ~$0.53 | ~$0.54 | ~$0.53 |
| 月估算(重度使用) | $200-500 | $150-400 | $15-500* |
* OpenCode 如果用 DeepSeek 可低至 $15-30/月。
成本结论:同模型下三者成本几乎一样。真正的成本差异来自"你选什么模型",而不是"你选什么工具"。OpenCode 的成本下限最低(可以用 DeepSeek 等低价模型)。
Benchmark 数据对照
除了自己的实测,还参照了已有的第三方评测:
| Benchmark | Claude Code | Codex CLI | OpenCode |
|---|---|---|---|
| SWE-bench Verified | 72.3% | 68.7% | 65.1%* |
| Terminal-Bench | 58.4% | 62.1% | 51.3%* |
* OpenCode 的成绩取决于所使用的底层模型。这里用的是 Claude Sonnet 的结果。如果用 GPT-5.5 或 DeepSeek,成绩会变。
解读:
- SWE-bench 测试的是"修复真实 GitHub Issue"的能力——Claude Code 领先
- Terminal-Bench 测试的是"终端命令的正确性"——Codex CLI 领先(/plan 的作用)
- OpenCode 作为框架,成绩更依赖底层模型选择
各自的甜区和雷区
Claude Code
甜区: ✅ 前端开发 + 快速迭代(改 UI 看效果 → 改 → 看 → 改) ✅ 日常高频编码(你很清楚要做什么,一小步一小步描述) ✅ 重度 Skills/MCP/Hooks 配置(生态最强) ✅ 单人项目的端到端开发 雷区: ⚠️ 复杂架构重构(没有计划先行,容易跑偏) ⚠️ 长任务自主执行(没有 /goal,需要持续引导) ⚠️ 高安全要求的项目(比 Codex 的 sandbox 模式弱)Codex CLI
甜区: ✅ 复杂任务(先计划再执行,不会跑偏) ✅ 长任务(/goal 挂后台,不用管) ✅ 多方协作(Subagent + Worktree 并行) ✅ 安全敏感项目(三级权限 + sandbox) 雷区: ⚠️ 快速原型(/plan 的 overhead 在这里是累赘) ⚠️ 高频微调(每一步都要确认计划,节奏慢) ⚠️ 生态不如 Claude Code(缺少 Skills 和 Plugin 系统)OpenCode
甜区: ✅ 预算极度敏感(配低价模型,成本降到 1/10) ✅ 私有化部署(数据不能离开内网) ✅ 需要多模型混用(不同的任务用不同模型) ✅ 深度定制需求(开源,可以改代码) 雷区: ⚠️ 开箱体验不如商业产品(需要自己配置和调教) ⚠️ 代码风格适应性较弱(不自动学习项目风格) ⚠️ 社区生态较小(Skill/Plugin 数量不是一个量级)什么时候混用更高效
我实际工作中的混用策略:
需求到来 │ ├─ 需求是否明确? │ ├─ 很明确 → Claude Code 直接执行 │ └─ 比较复杂 → Codex /plan 生成计划 │ ├─ 任务是否可以并行? │ ├─ 可以 → Codex + Subagent 并行 │ └─ 不行 → 单工具串行 │ └─ 成本考量? ├─ 正常预算 → Claude Code / Codex └─ 预算紧张 → OpenCode + DeepSeek实际协同案例
上周做的一个真实功能——"给 CMS 加全文搜索": 1. Codex /plan(5 分钟) → 生成 8 步计划 → 我删掉 2 步不必要的,调整顺序 2. Claude Code 执行步骤 1-4(15 分钟) → 数据库索引 + 搜索接口 + 前端搜索框 → 快速迭代,每做完一步我确认 3. Codex /goal 执行步骤 5-8(后台跑了 40 分钟) → 中文分词集成 + 高亮 + 搜索结果排序 + E2E 测试 → 我去开了个会,回来就做好了 4. Claude Code /review(3 分钟) → 审查全部改动 → 两个小问题 → 修复 → 合并 总耗时:我实际参与 ~20 分钟,AI 自己跑了 ~40 分钟。 如果用单一工具串行做,预计需要 90 分钟以上。混用黄金法则
1. 计划交给 Codex,执行交给 Claude Code → Codex 的 /plan 是三个工具里最好的计划生成器 → Claude Code 是三个工具里最快的执行者 2. 简单 + 快节奏 → Claude Code 复杂 + 需要谨慎 → Codex CLI 省钱 + 私有化 → OpenCode 3. 不要让任何一个工具做它不擅长的事 → 别让 Claude Code 做 30 分钟以上的长任务 → 别让 Codex 做高频的 UI 微调 → 别让 OpenCode 做需要强大生态支撑的事没有"最好的工具",只有"最适合的组合"
经过这次横向评测,最重要的结论是:
单一工具的得分差异很小(都在 70-85 分区间)。但组合使用后,得分可以到 90+。
不要陷入"选哪个"的纠结。三个都装。不同场景切着用。
延伸阅读
- SWE-bench Verified
- Terminal-Bench
