Claude Code vs Codex CLI:两周深度实测,差距比想象的大
摘要:2026 年,AI 编程已从 IDE 插件进化到终端原生 Agent。本文用同一个全栈任务实测 Anthropic Claude Code(Opus 4.7)和 OpenAI Codex CLI(GPT-5.3-Codex),从安装配置到任务执行,对比代码质量、Token 消耗、Agent 可靠性三个维度。结论:两者都能干活,但"靠谱程度"差了一个量级。
1. 背景与痛点
事情是这样的。
上个月我把一个 NestJS 后端项目的重构任务交给 AI Agent,三天后回来一看——数据库 schema 改了、API 路由乱了、测试全红。肇事者是某款 IDE 插件型 AI 助手,它在跨文件重构时"忘了"更新 TypeORM 的 entity 定义。
问题出在哪?
IDE 插件型 AI 助手有个先天缺陷:它的"视野"受限于你打开的文件。当你让它"把用户模块从 REST 改到 GraphQL",它可能改了 controller 却漏了 service,改了 service 又忘了 DTO。跨文件一致性靠的是运气,不是机制。
这正是终端原生 AI Agent 崛起的原因。2026 年上半年,两大阵营的代表选手已经明朗:
- Claude Code(Anthropic):基于 Claude Opus 4.7/Sonnet 4.6,以"一次性生成正确率"著称
- Codex CLI(OpenAI):基于 GPT-5.3-Codex,主打"多模型自动调度"——重活上 GPT-5.5,轻活用 5.4-Mini,琐事用 5.5-nano
这两个我都用了两周以上,跑了同一个全栈任务(创建一个带 JWT 认证 + Redis 缓存的 REST API)。这篇文章是实测记录。
2. 技术原理
先搞清楚两者的架构差异——这决定了它们在不同场景下的表现。
flowchart TD
subgraph Claude["Claude Code 工作流"]
A1[用户输入任务] --> A2[读取项目文件树]
A2 --> A3[Opus 4.7 全局规划]
A3 --> A4[Sonnet 4.6 执行编码]
A4 --> A5[自动运行测试]
A5 --> A6{测试通过?}
| A6 -->|否| A7[Sonnet 自修复] |
A7 --> A5
| A6 -->|是| A8[提交 PR 描述] |
end
subgraph Codex["Codex CLI 工作流"]
B1[用户输入任务] --> B2[读取项目文件树]
B2 --> B3[模型路由器决策]
B3 --> B4[GPT-5.5 规划]
B4 --> B5[GPT-5.3-Codex 编码]
B5 --> B6[GPT-5.4-Mini 轻量检查]
B6 --> B7[自动运行测试]
B7 --> B8{测试通过?}
| B8 -->|否| B9[5.5-nano 诊断+5.3-Codex 修复] |
B9 --> B7
| B8 -->|是| B10[提交 PR 描述] |
end
核心差异:
| 维度 | Claude Code | Codex CLI |
|---|---|---|
| 模型策略 | Opus 规划 + Sonnet 执行,双模型固定分工 | 5 层模型自动调度(5.5→5.3-Codex→5.4-Mini→5.5-nano) |
| 上下文窗口 | 200K tokens(Opus 4.7) | 128K tokens(GPT-5.3-Codex) |
| Agent 工具 | Bash、文件读写、Git、Web 搜索 | Bash、文件读写、Git、Web 搜索、MCP 服务器 |
| 跨文件一致性 | 先全局规划再局部执行 | 分层执行,模型降级可能丢失上下文 |
| 自修复循环 | 3 次重试上限 | 无明确上限,但降级模型可能修不好 |
说白了,Claude Code 的策略是"找个最聪明的人把活干了",Codex 的策略是"派不同级别的人干不同的事,省成本"。
3. 环境准备
测试环境
| 项 | 配置 |
|---|---|
| OS | Ubuntu 22.04 (WSL2) |
| Node.js | v20.11.0 |
| npm | 10.2.4 |
| NestJS CLI | 10.3.2 |
| Redis | 7.0.15 |
| PostgreSQL | 16.1 |
Claude Code 安装(v1.2.7)
# 通过 npm 安装
npm install -g @anthropic-ai/claude-code
# 验证安装
claude --version
# Claude Code v1.2.7 (Claude Opus 4.7 / Sonnet 4.6)
# 初始化项目
claude init
# 提示:选择 Anthropic API Key 或 OAuth 登录
Codex CLI 安装(v2.1.0)
# 通过 npm 安装
npm install -g @openai/codex
# 验证安装
codex --version
# Codex CLI v2.1.0 (GPT-5.3-Codex)
# 初始化
codex init
# 提示:需要 OpenAI API Key(推荐用项目级 key,别用个人账号 key)
注意:两个工具都需要 API Key。Claude Code 支持 Anthropic Console 的 API Key,Codex CLI 用 OpenAI Platform 的 Key。费用都是按 token 计,后文会对比具体成本。
4. 实战实现
4.1 测试任务定义
给两个 Agent 一样的 prompt:
Create a NestJS REST API module for user management with:
1. JWT authentication (access + refresh token)
2. Redis-based token blacklist
3. PostgreSQL with TypeORM
4. CRUD endpoints for users
5. Input validation with class-validator
6. Unit tests for auth service
7. Integration tests for user controller
Use the existing NestJS project structure. Don't create a new project.
4.2 Claude Code 执行记录
$ claude "Create a NestJS REST API module for user management..."
# Claude Code 输出(节选)
[Planning] Analyzing existing project structure...
[Planning] Found NestJS project with TypeORM and PostgreSQL config
[Planning] Will create:
- src/auth/ (JWT auth module)
- src/users/ (User CRUD module)
- src/common/guards/ (JWT guard)
- src/common/decorators/ (CurrentUser decorator)
[Execute] Creating auth module...
[Execute] Created src/auth/auth.module.ts
[Execute] Created src/auth/auth.service.ts
[Execute] Created src/auth/auth.controller.ts
[Execute] Created src/auth/dto/login.dto.ts
[Execute] Created src/auth/dto/register.dto.ts
[Execute] Created src/auth/strategies/jwt.strategy.ts
[Execute] Creating user module...
[Execute] Created src/users/user.entity.ts
[Execute] Created src/users/users.service.ts
[Execute] Created src/users/users.controller.ts
[Execute] Creating Redis token blacklist service...
[Execute] Created src/common/services/token-blacklist.service.ts
[Execute] Running tests...
[Test] AuthService: 6/6 passed
[Test] UsersController: 4/4 passed
[Test] TokenBlacklistService: 3/3 passed
[Execute] All tests passing ✓
代码质量抽样——这是它生成的 JWT 策略:
// src/auth/strategies/jwt.strategy.ts
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { ConfigService } from '@nestjs/config';
import { TokenBlacklistService } from '../../common/services/token-blacklist.service';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(
private configService: ConfigService,
private tokenBlacklistService: TokenBlacklistService,
) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: configService.get<string>('JWT_ACCESS_SECRET'),
passReqToCallback: true,
});
}
async validate(req: Request, payload: { sub: string; email: string }) {
const token = ExtractJwt.fromAuthHeaderAsBearerToken()(req);
// Check if token is blacklisted
const isBlacklisted = await this.tokenBlacklistService.isBlacklisted(token);
if (isBlacklisted) {
throw new UnauthorizedException('Token has been revoked');
}
return { userId: payload.sub, email: payload.email };
}
}
这段代码能跑,而且还处理了 token 黑名单——它在验证时没有只依赖 JWT 过期时间,而是主动查了 Redis。这点细节让我有点意外。
4.3 Codex CLI 执行记录
$ codex "Create a NestJS REST API module for user management..."
# Codex CLI 输出(节选)
[Model Router] Task complexity: HIGH → routing to GPT-5.5
[GPT-5.5] Planning...
[GPT-5.5] Scope: auth module + user module + Redis integration
[GPT-5.3-Codex] Generating code...
[GPT-5.3-Codex] Created src/auth/auth.module.ts
[GPT-5.4-Mini] Checking dependencies...
[GPT-5.4-Mini] Missing: @nestjs/jwt, passport, passport-jwt
[GPT-5.3-Codex] Installing dependencies...
[GPT-5.3-Codex] Created src/auth/auth.service.ts
... (省略中间输出)
[GPT-5.4-Mini] Running tests...
[Test] AuthService: 4/6 passed ❌
[GPT-5.5-nano] Diagnosing failures...
[GPT-5.5-nano] Issue: mock not configured for TokenBlacklistService
[GPT-5.3-Codex] Fixing...
[GPT-5.3-Codex] Test fix applied
[Test] AuthService: 6/6 passed ✓
代码质量抽样——Codex 生成的同一文件:
// src/auth/strategies/jwt.strategy.ts
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: process.env.JWT_SECRET,
});
}
async validate(payload: any) {
return { userId: payload.sub, username: payload.username };
}
}
注意到什么没?
- 它把
JWT_ACCESS_SECRET简化成了JWT_SECRET——环境变量名不一致,跟项目其他部分对接时会炸 - 没有注入
ConfigService,直接用了process.env——这在 NestJS 里是不推荐的写法 - 没有做 token 黑名单检查——功能缺了一块
payload类型是any,TypeScript 严格模式直接报 warning
5. 效果验证
同一任务——耗时与成本
| 指标 | Claude Code | Codex CLI | 差距 |
|---|---|---|---|
| 总耗时 | 4 分 32 秒 | 6 分 18 秒 | Codex 慢 39% |
| 首次测试通过率 | 100%(13/13) | 69%(9/13) | — |
| 自修复轮次 | 0 | 2 | — |
| 生成文件数 | 11 | 13 | Codex 多了 2 个无用 helper |
| Token 消耗 | 127K | 186K | Codex 多 46% |
| 费用(API 定价) | $0.38 | $0.21 | Codex 便宜 45% |
| 最终代码可运行 | ✅ 直接可跑 | ⚠️ 需手动调环境变量 | — |
这里有个反直觉的地方:Codex 虽然单 token 价格更低(GPT-5.4-Mini 便宜),但因为模型降级导致反复修 bug,总 token 消耗反而比 Claude Code 高 46%,把价格优势吃掉了一大半。
Token 消耗分布
pie title Claude Code Token 消耗分布
"规划阶段" : 28
"代码生成" : 45
"测试运行" : 18
"其他" : 9
pie title Codex CLI Token 消耗分布
"规划阶段" : 22
"代码生成" : 35
"模型路由开销" : 12
"自修复循环" : 25
"其他" : 6
Codex 那 25% 的"自修复循环"token,本质上是在为"第一遍没写对"买单。
6. 踩坑记录
坑 1:Codex 的模型降级在复杂任务上是双刃剑
GPT-5.5-nano 诊断 bug 时定位对了问题(mock 没配),但给的修复方案里漏了一个 import。GPT-5.3-Codex 接手后补上了代码,但环境变量名还是没改对。最终是 GPT-5.5 第二轮介入才修好。
教训:复杂任务别指望 nano 兜底,它只能处理"少了个分号"级别的 bug。
坑 2:Claude Code 的 200K 上下文在超大项目上也不够用
我有个 30 万行代码的 monorepo,Claude Code 读到一半就开始"忘记"最开始读的文件。200K 上下文看似大,但对于 monorepo 来说也就是冰山一角。
临时方案:用 .claude/context.md 手动指定关键文件范围,避免它把所有文件都吞进去。
坑 3:两个工具都会"过度自信"
第三轮测试我故意在 prompt 里不提 Redis 的端口号。Claude Code 默认用了 6379——刚好是标准端口,蒙对了。Codex 也用了 6379,但生成的连接字符串里没有 password 参数,而我的 Redis 是配了密码的。
结论:别指望 AI Agent 会在不确定时问你,它倾向于"猜一个"。涉及基础设施配置时,显式指定参数。
坑 4:Codex 自动安装依赖时用了最新版
Codex 自动跑了 npm install @nestjs/jwt passport passport-jwt,没指定版本号。装的是 passport-jwt 5.0.0,跟我项目中 passport 0.7.0 的 API 不完全兼容,导致类型报错。
教训:AI Agent 跑安装命令前,最好在 .codex/config.yaml 里预设版本约束。
7. 总结与展望
两周下来的核心感受:Claude Code 贵但省心,Codex 便宜但费劲。
具体来说:
- Claude Code 适合你"不想动脑子"的场景。把任务丢过去,回来看到代码能跑、测试全绿。适合复杂重构、跨模块开发。
- Codex CLI 适合你有时间盯着它、愿意手动修修补补的场景。它的模型调度在"重活 + 轻活混合"的项目里确实能省钱,但前提是你要检查它的每一步输出。
- 如果预算有限,DeepSeek V4 接入 Cline 或 Continue 是第三个选项——性能接近 Sonnet 4.6,成本只有 1/400。但这个方案需要自己搭桥接层,不在本文范围。
2026 年下半年的趋势已经很明显了:终端 Agent 正在吃掉 IDE 插件的份额。Claude Code 的 Star 数半年内翻了 3 倍,Codex CLI 开源仅 2 个月就 15K Star。开发者对"AI 助手能独立干完一个活"的期望,正在变成基线要求。
两个工具都在快速迭代。Claude Code v1.3 据说会引入 MCP 服务器市场,Codex v2.2 计划支持本地模型。这些更新出来后我会再跑一次对比。
你用哪个终端 AI 编程工具?有没有被它坑过或者惊艳到?评论区聊聊——我打算在后续文章里整理一份"AI Agent 翻车实录",欢迎提供素材。
更多推荐


所有评论(0)