摘要: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 };
  }
}

注意到什么没?

  1. 它把 JWT_ACCESS_SECRET 简化成了 JWT_SECRET——环境变量名不一致,跟项目其他部分对接时会炸
  2. 没有注入 ConfigService,直接用了 process.env——这在 NestJS 里是不推荐的写法
  3. 没有做 token 黑名单检查——功能缺了一块
  4. 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 翻车实录",欢迎提供素材。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐