Claude Code 干了我三天的活,Codex 半小时翻车——两个AI编码CLI的真刀真枪对比

Claude Code 干了我三天的活,Codex 半小时翻车——两个AI编码CLI的真刀真枪对比

上周五下午四点,产品经理甩过来一个需求:把旧项目的Express路由全部迁移到FastAPI,37个接口,带参数校验和Swagger文档。我看了眼代码仓库,800多个文件,光路由定义就散落在14个文件里。

手动改?估计得干到下周二。

那就让AI来。我手头有两个AI编码CLI工具——Claude Code和Codex CLI。想着先各试一个接口,看看谁靠谱,再决定主力用哪个。

结果这一试,试出一堆故事。


两个工具,装法完全不同

先说装环境。

Claude Code是Anthropic出的,一行搞定:

npm install -g @anthropic-ai/claude-code

装完跑claude,弹浏览器让你OAuth登录。有API Key的可以直接设环境变量,跳过浏览器。

Codex CLI是OpenAI的,同样一行:

npm install -g @openai/codex

但有个坑——Codex必须在git仓库里才能跑。我第一次在空目录里试,直接报错退出。得先git init,或者在已有仓库里用。

关键区别在这:Claude Code可以读写当前目录的任何文件,权限控制靠--allowedTools参数。Codex默认把自己关在沙箱里,改文件得加--full-auto,连网络都得加--yolo才放开。

对,你没看错,参数名就叫--yolo。OpenAI的工程师取名确实有性格。


️ 第一个任务:迁移一个接口

我拿了一个最简单的GET接口试水——/api/users/:id,从Express的写法改成FastAPI。

Claude Code怎么干的

claude -p "把 src/routes/users.js 里的 GET /users/:id 迁移到 FastAPI,
放到 src/api/users.py,用Pydantic做参数校验,自动生成Swagger文档注释。
参考项目里已有的 src/api/items.py 的代码风格。" \
--allowedTools "Read,Edit,Write,Bash" \
--max-turns 10

Claude Code先读了users.js,又读了items.py(让它参考风格),然后直接生成了新的users.py。整个过程47秒,消耗$0.12。

生成的代码质量出乎意料——Pydantic模型、路径参数类型标注、404异常处理、甚至response_model都写好了。注释风格跟我项目里已有的保持一致。

# Claude Code生成的代码(精简版)
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel

router = APIRouter(prefix="/api/users", tags=["users"])

class UserResponse(BaseModel):
    id: int
    name: str
    email: str

@router.get("/{user_id}", response_model=UserResponse)
async def get_user(user_id: int):
    """获取指定用户信息,用户不存在返回404"""
    user = await db.users.find_one({"id": user_id})
    if not user:
        raise HTTPException(status_code=404, detail="用户不存在")
    return UserResponse(**user)

Codex怎么干的

codex exec "把 src/routes/users.js 里的 GET /users/:id 迁移到 FastAPI,
放到 src/api/users.py,用Pydantic做参数校验"

Codex也读了源文件,但它有个习惯——先跑一堆shell命令探测环境。which python3pip listls src/api/,光探测就花了20多秒。

然后它生成的代码……怎么说呢,能跑,但风格跟项目完全不搭。注释是英文的,变量命名用了驼峰(项目用蛇形),连import顺序都没按isort排。

而且Codex有个让我抓狂的行为——它自己跑了个python -c "import fastapi"来验证FastAPI装没装。验证失败后,它试图pip install fastapi,被沙箱拦住了,然后输出了一大段"建议安装FastAPI"的提示。

整个过程3分12秒,大部分时间花在了"探索环境"上。


拿真实数据说话

我用同样的10个接口做了对比测试。项目是Node.js Express → Python FastAPI迁移,代码仓库847个文件。

指标Claude CodeCodex CLI 10个接口总耗时8分42秒23分17秒 生成代码能直接跑的比例9/106/10 跟项目风格一致的比例8/103/10 单次调用平均成本$0.15$0.08 自动跑测试验证会,如果项目有test命令不会,除非明确要求 遇到错误的自愈能力强,会读报错信息自动修正一般,经常需要人工干预

成本上Codex便宜将近一半,但你得算上人工修正的时间。我修Codex生成的代码花了大概40分钟,Claude Code的只花了10分钟。


⚡ 批量任务:差距更大

37个接口,我不可能一个一个手动调用。两个工具都支持批量,但方式不同。

Claude Code的批量方案

Claude Code有个--continue参数,能接着上一次的会话继续干活。我这么用的:

# 第一轮:迁移前20个接口
claude -p "继续迁移 src/routes/ 下剩余的路由文件到 src/api/,
每迁移完一个文件就跑一次 pytest tests/ 验证" \
--continue --max-turns 30

它会自己按文件顺序一个一个迁移,每改完一个就跑测试。测试挂了就自己修。20个接口,一轮搞定,中间只挂了2次,都自己修好了。

Codex的批量方案

Codex没有--continue,但可以用exec一次塞多个任务:

codex --full-auto exec "迁移以下路由文件到FastAPI:
src/routes/orders.js → src/api/orders.py
src/routes/products.js → src/api/products.py
...(一口气列了15个)"

结果第4个文件就翻车了。Codex在写orders.py的时候引用了一个不存在的工具函数,它没报错,静默通过了。后面的文件全都基于这个错误的假设继续写,15个文件里有8个有同样的问题。

一个错误像多米诺骨牌一样传播,这是Codex最大的隐患。


️ 真正让我选定Claude Code的场景

迁移做到第30个接口的时候,遇到了一个复杂情况:原项目的认证中间件用了passport.js的自定义策略,里面嵌套了3层回调,还连着Redis session。

我试着让Codex处理:

codex exec "分析 src/middleware/auth.js 的认证逻辑,迁移到FastAPI的依赖注入系统"

Codex读完文件后,输出了一段分析,然后生成了代码。但它完全搞错了passport策略的执行顺序,把session验证和token验证的优先级搞反了。更离谱的是,它生成了一个不存在的passport.strategy()方法调用。

同样的任务给Claude Code:

claude -p "分析 src/middleware/auth.js 的完整认证流程,
包括passport策略的执行顺序和Redis session的读写时机,
然后迁移到FastAPI的Depends依赖注入系统。
特别注意策略优先级和session过期处理。" \
--max-turns 15

Claude Code花了2分多钟,中间读了5个相关文件(不只是auth.js,还有session配置、Redis连接、策略定义),然后生成的代码把认证流程理得清清楚楚。依赖注入的层次关系、session过期的自动续期、甚至Redis连接池的复用都考虑到了。

这个差距不是技术能力的问题,是上下文理解深度的差距。Claude Code会主动去读相关文件建立完整的心智模型,Codex倾向于只看你指定的那个文件。


成本账:便宜不等于划算

一天下来的数据:

Claude CodeCodex CLI API调用费用$4.83$2.17 人工修正时间约1.5小时约4小时 最终可用代码行数2,847行2,103行(含修正后的) 需要返工的接口数3个11个

按我每小时的时间成本算,Codex"省"下来的$2.66,我多花了2.5小时去修正。怎么算都是亏的。


我的选择标准

用了整整一周,我总结出来的判断框架:

用Claude Code的场景

  • 复杂重构,需要理解多个文件的关联
  • 代码风格要求高,要跟项目保持一致
  • 需要自动验证(改完跑测试,失败自动修)
  • 长任务,30+文件的批量操作
  • 用Codex的场景

  • 简单的单文件修改
  • 快速原型,不在乎代码风格
  • 预算敏感,任务简单
  • 已经有明确的代码模板可以参考
  • 都别用的场景

  • 涉及数据库schema变更的(两个都会搞出migration顺序问题)
  • 需要理解业务逻辑的(AI不懂你的业务规则)
  • 安全相关的代码(认证、加密、权限控制,必须人工review)

  • 一句话建议

    如果你只能选一个,选Claude Code。贵是贵了点,但它省的是你的时间。时间这玩意儿,花出去就回不来了。

    如果你两个都想用,记住一个原则:简单任务给Codex省成本,复杂任务给Claude Code省脑子。别反过来,否则你会花更多时间在"教AI怎么写代码"上,那还不如自己写。

    对了,最后那个37个接口的迁移项目,用Claude Code从头到尾花了6小时,API费用$4.83。如果手动写,我估计得3天。

    这笔账,怎么算都值。



    关注「安全值班室」公众号

    每天一篇AI安全早报 + 实战攻防案例

    关注安全值班室

    posted on 2026-05-21 09:01  明.Sir  阅读(66)  评论(0)    收藏  举报

    导航