AI AinoCode AI 工具与基础设施
AI 模型 11 分钟

Claude 4 vs GPT-5 vs Gemini Ultra:Agent 编程能力横评——我们让三个 AI 同时开发同一个 SaaS 项目

以'开发一个带认证的 SaaS 后台'为统一任务,横向评测三大旗舰模型在需求理解、代码质量、工具调用和调试能力的真实表现。

KazK

Claude 4 vs GPT-5 vs Gemini Ultra Agent 编程能力横评

2026 年 6 月,三大 AI 厂商的旗舰模型全部就位:

  • Anthropic Claude 4(Opus):3 月发布,主打”超长上下文 + 深度推理”
  • OpenAI GPT-5:4 月发布,主打”Agent 原生 + 多模态推理”
  • Google Gemini Ultra 2.0:5 月更新,主打”代码 + 工具链深度集成”

市面上已经有很多关于这三个模型的基准测试——MMLU、GPQA、SWE-bench、Aider Leaderboard。但这些 benchmark 有一个共同的问题:它们测的是”能不能通过考试”,不是”能不能干活”。

通过 SWE-bench 的模型,不一定能在真实项目中写出可维护的代码。Aider 排行榜上第一的模型,不一定能理解你模糊的需求描述。

所以这次,我换了一个完全不同的评测方法。

任务:开发一个完整的 SaaS 后台系统。

不是 LeetCode 题目,不是代码片段补全,不是一个 API 接口的实现——是一个完整的、可运行的、带认证的项目。

然后,让 Claude 4、GPT-5、Gemini Ultra 三个 Agent 各自从零开始,独立完成开发。我记录每一步:需求理解、架构设计、代码实现、调试修复。

最后给出结论:如果你今天需要选一个 AI 编程 Agent,应该选谁?


一、测试设计

统一任务描述

给三个 Agent 的需求文档完全一致:

开发一个 SaaS 后台管理系统,要求:

  1. 用户注册/登录(邮箱 + 密码,JWT 认证)
  2. 项目管理(CRUD,支持标签和状态过滤)
  3. 团队协作(项目成员管理,角色:Owner/Admin/Member)
  4. API 文档(自动生成 OpenAPI spec)
  5. 单元测试(核心功能覆盖率 > 80%)

技术栈:Next.js 15 (App Router) + TypeScript + PostgreSQL + Prisma

要求:代码可运行,通过所有测试,遵循最佳实践。

评分维度

维度权重说明
需求理解15%是否理解隐含需求,是否需要多次澄清
架构设计15%项目结构是否合理,模块划分是否清晰
代码质量25%可读性、可维护性、错误处理、类型安全
工具调用15%文件操作、shell 命令、API 调用的准确性
调试能力15%遇到错误时的定位和修复效率
完成度15%功能完整性和测试覆盖率

测试环境

配置参数
Agent 模式Claude Code (Claude 4) / Cursor Agent (GPT-5) / Gemini CLI (Gemini Ultra)
初始条件空目录,只有 package.json
允许操作文件读写、shell 命令、npm 安装、数据库操作
迭代轮次最多 50 轮对话/操作
评测方式人工 code review + 自动化测试验证

二、需求理解:谁听得懂人话?

Claude 4

Claude 4 在收到需求后,做的第一件事是确认理解

我理解您的需求。在开始之前,我想确认几个隐含需求:

1. 用户注册需要邮箱验证吗?
2. 项目标签是预定义的还是用户自定义的?
3. API 文档是否需要 Swagger UI?
4. 测试是只需要单元测试,还是也需要 E2E 测试?

如果没有特别说明,我将按以下默认方案执行:
- 邮箱验证:暂不实现(后续可扩展)
- 标签:用户自定义
- API 文档:使用 next-openapi 自动生成 + Swagger UI
- 测试:核心 API 路由的单元测试 + 2 个关键 E2E 测试

评分:9/10

Claude 4 的需求理解能力是三个模型中最强的。它不仅能识别隐含需求,还能给出合理的默认方案。这种”先确认再动手”的工作方式,大幅减少了返工。

GPT-5

GPT-5 直接开始干活:

好的,我来帮你开发这个 SaaS 后台。首先初始化项目结构:

1. 创建 Next.js 15 项目
2. 配置 Prisma + PostgreSQL
3. 实现用户认证模块
4. 实现项目管理模块
...

它没有主动询问隐含需求,而是自己假设了一套方案。在后续开发中,有几个假设与预期不符(比如它默认使用了 bcrypt 而不是 Argon2,默认没有实现邮箱验证),导致在 code review 阶段需要返工。

评分:7/10

GPT-5 的执行速度最快,但”想当然”的假设导致了后续返工。它的行为模式更像是一个”急着写代码的初级开发者”。

Gemini Ultra

Gemini Ultra 的表现介于两者之间:

我将按照以下步骤开发这个 SaaS 后台:

1. 初始化 Next.js 15 + TypeScript 项目
2. 设置 Prisma schema(用户、项目、团队、角色)
3. 实现 JWT 认证中间件
4. 实现项目 CRUD API
5. 实现团队成员管理
6. 配置 OpenAPI 文档生成
7. 编写单元测试

技术选择说明:
- 认证:使用 jose 库处理 JWT(比 jsonwebtoken 更现代,支持 Edge Runtime)
- 数据库:Prisma + PostgreSQL(使用 connection pooling)
- 测试:Vitest + @testing-library/react

是否需要在开始前调整技术选型?

它在最后才问了一句”是否需要调整”,但没有像 Claude 4 那样主动列出隐含需求。

评分:8/10


三、架构设计:项目结构大比拼

Claude 4 的项目结构

src/
├── app/
│   ├── (auth)/
│   │   ├── login/page.tsx
│   │   ├── register/page.tsx
│   │   └── layout.tsx
│   ├── (dashboard)/
│   │   ├── projects/
│   │   │   ├── page.tsx          # 项目列表
│   │   │   ├── [id]/page.tsx     # 项目详情
│   │   │   └── [id]/edit/page.tsx
│   │   ├── team/page.tsx         # 团队管理
│   │   └── layout.tsx
│   ├── api/
│   │   ├── auth/
│   │   │   ├── login/route.ts
│   │   │   └── register/route.ts
│   │   ├── projects/
│   │   │   ├── route.ts
│   │   │   └── [id]/route.ts
│   │   └── team/
│   │       └── [projectId]/route.ts
│   └── layout.tsx
├── lib/
│   ├── auth.ts                   # JWT 工具函数
│   ├── prisma.ts                 # Prisma 客户端
│   ├── middleware.ts             # 认证中间件
│   └── validation.ts             # Zod schema
├── components/
│   ├── ui/                       # 基础 UI 组件
│   └── projects/                 # 项目相关组件
├── hooks/
│   └── use-auth.ts
└── tests/
    ├── api/                      # API 测试
    └── components/               # 组件测试

评价:结构清晰,路由分组 (auth)(dashboard) 的使用很专业。lib/ 层的职责分离做得好。唯一的不足是把 tests 放在了 src 目录外(Next.js 社区更倾向于放在 src/ 内)。

GPT-5 的项目结构

src/
├── app/
│   ├── api/
│   │   ├── auth/route.ts         # 所有认证 API 在一个文件
│   │   ├── projects/route.ts     # 所有项目 API 在一个文件
│   │   └── team/route.ts
│   ├── login/page.tsx
│   ├── register/page.tsx
│   ├── dashboard/page.tsx
│   ├── projects/page.tsx
│   └── page.tsx
├── utils/
│   ├── auth.ts
│   ├── db.ts
│   └── helpers.ts                # 各种工具函数混在一起
├── components/
│   ├── LoginForm.tsx
│   ├── RegisterForm.tsx
│   ├── Dashboard.tsx
│   ├── ProjectList.tsx
│   ├── ProjectDetail.tsx
│   └── TeamManagement.tsx
└── __tests__/
    ├── auth.test.ts
    └── projects.test.ts

评价:结构更扁平,组件颗粒度粗。最大问题:api/auth/route.ts 把登录和注册放在同一个文件里——这不是 Next.js App Router 的最佳实践。utils/helpers.ts 是个”杂物抽屉”,放了一些本不应该在一起的工具函数。整体感觉更像 React 17 时代的结构,而不是 Next.js 15。

Gemini Ultra 的项目结构

src/
├── app/
│   ├── (auth)/
│   │   ├── login/page.tsx
│   │   └── register/page.tsx
│   ├── (app)/
│   │   ├── projects/
│   │   │   ├── page.tsx
│   │   │   └── [id]/
│   │   │       ├── page.tsx
│   │   │       └── edit/page.tsx
│   │   ├── team/
│   │   │   └── page.tsx
│   │   └── layout.tsx
│   └── api/
│       ├── auth/
│       │   ├── [...route]/handler.ts
│       │   └── route.ts          # 使用 Hono 风格的路由
│       └── projects/
│           ├── [...route]/handler.ts
│           └── route.ts
├── server/
│   ├── auth/
│   │   ├── jwt.ts
│   │   └── session.ts
│   ├── projects/
│   │   ├── service.ts
│   │   └── validator.ts
│   └── team/
│       └── service.ts
├── db/
│   ├── schema.prisma
│   └── seed.ts
├── ui/
│   ├── components/
│   └── hooks/
└── tests/
    └── integration/

评价:结构最复杂,引入了”service layer”模式(把业务逻辑从 API route 中抽离)。这在大项目中是好习惯,但对于这个规模的 SaaS 后台来说有些过度设计。使用 hono 风格的路由处理([...route]/handler.ts)也很新颖,但与 Next.js 原生的 App Router 风格不够一致。

架构设计评分

模型评分核心理由
Claude 49/10结构清晰,符合 Next.js 15 最佳实践,模块化合理
Gemini Ultra8/10结构更复杂,service layer 是好习惯但略过度设计
GPT-56/10结构过时,不符合 App Router 最佳实践,文件组织混乱

四、代码质量:逐行 review

我随机抽取了每个模型的认证模块(login API route + JWT middleware)进行 code review。

Claude 4 的代码

// src/lib/auth.ts
import { SignJWT, jwtVerify } from "jose";
import { cookies } from "next/headers";

const JWT_SECRET = new TextEncoder().encode(
  process.env.JWT_SECRET ?? ""
);

if (!process.env.JWT_SECRET) {
  throw new Error("JWT_SECRET is not defined");
}

export async function createToken(payload: {
  userId: string;
  email: string;
  role: string;
}) {
  return new SignJWT({ ...payload })
    .setProtectedHeader({ alg: "HS256" })
    .setIssuedAt()
    .setExpirationTime("7d")
    .sign(JWT_SECRET);
}

export async function verifyToken() {
  const cookieStore = await cookies();
  const token = cookieStore.get("auth_token")?.value;

  if (!token) {
    return null;
  }

  try {
    const { payload } = await jwtVerify(token, JWT_SECRET);
    return payload as {
      userId: string;
      email: string;
      role: string;
    };
  } catch {
    return null;
  }
}

Code Review

  • ✅ 环境变量校验在模块加载时就执行(fail fast)
  • ✅ JWT 验证失败返回 null 而不是抛异常(让调用方决定如何处理)
  • ✅ 使用了 jose 库而非 jsonwebtoken(支持 Edge Runtime)
  • ✅ TypeScript 类型定义精确
  • ⚠️ 没有实现 token refresh 机制(但作为 MVP 可接受)

GPT-5 的代码

// src/utils/auth.ts
import jwt from "jsonwebtoken";

const SECRET = process.env.JWT_SECRET || "fallback-secret-key";

export function generateToken(user: any) {
  return jwt.sign(
    { id: user.id, email: user.email },
    SECRET,
    { expiresIn: "7d" }
  );
}

export function verifyToken(req: any) {
  const token = req.headers.authorization?.split(" ")[1];
  if (!token) return null;
  
  try {
    return jwt.verify(token, SECRET);
  } catch (err) {
    return null;
  }
}

Code Review

  • fallback-secret-key —— 硬编码的 fallback 密钥是严重的安全问题
  • ❌ 使用 any 类型 —— TypeScript 的类型安全完全没用上
  • ❌ 使用 jsonwebtoken 而不是 jose —— 不支持 Edge Runtime
  • ❌ 验证函数依赖 req 对象 —— 在 Next.js App Router 的 server component 中不可用
  • ❌ 密钥应该在模块加载时校验,而不是运行时才发现

Gemini Ultra 的代码

// src/server/auth/jwt.ts
import { SignJWT, jwtVerify } from "jose";
import type { NextRequest } from "next/server";

const encoder = new TextEncoder();
const secret = encoder.encode(
  process.env.JWT_SECRET ?? ""
);

if (!process.env.JWT_SECRET) {
  throw new Error("Missing JWT_SECRET environment variable");
}

interface JWTPayload {
  sub: string;
  email: string;
  role: "owner" | "admin" | "member";
  iat?: number;
  exp?: number;
}

export async function createJWT(payload: Omit<JWTPayload, "iat" | "exp">) {
  return new SignJWT(payload as JWTPayload)
    .setProtectedHeader({ alg: "HS256" })
    .setIssuedAt()
    .setExpirationTime("7d")
    .sign(secret);
}

export async function verifyJWT(request: NextRequest): Promise<JWTPayload | null> {
  const authHeader = request.headers.get("Authorization");
  const token = authHeader?.startsWith("Bearer ") ? authHeader.slice(7) : null;

  if (!token) return null;

  try {
    const { payload } = await jwtVerify(token, secret);
    return payload as JWTPayload;
  } catch {
    return null;
  }
}

Code Review

  • ✅ 类型定义精确(JWTPayload 接口、角色枚举)
  • ✅ 使用 jose
  • ✅ 环境变量校验
  • ⚠️ 验证函数依赖 NextRequest 对象 —— 在 server component 中不可用,只能在 route handler 中使用
  • ✅ 角色使用 TypeScript 枚举,类型安全

代码质量评分

模型评分核心理由
Claude 49.5/10代码干净、类型安全、错误处理合理,唯一不足是缺少 token refresh
Gemini Ultra8/10类型系统最完善,但验证函数的耦合度过高(依赖 NextRequest)
GPT-55/10安全问题(硬编码密钥)、类型缺失(any)、框架适配错误(req 对象)

五、工具调用:谁能正确地操作文件系统?

在开发过程中,三个 Agent 需要执行大量的文件操作和 shell 命令。我记录了它们的工具调用准确率:

操作类型Claude 4GPT-5Gemini Ultra
文件创建(正确路径+内容)96%88%93%
文件修改(精确定位+保留上下文)94%76%91%
shell 命令(npm install/migrate)98%92%95%
错误日志读取+定位95%82%90%

GPT-5 在文件修改上的表现最差——它经常”忘记”文件的前后文,导致修改后的代码出现语法错误。Claude 4 在文件操作上最稳定,几乎每次都正确。

一个典型的失败案例:GPT-5 在修改 Prisma schema 后,忘记运行 prisma generate,导致后续代码中使用 prisma.user 时报 Property 'user' does not exist on type 'PrismaClient'。它花了 3 轮对话才定位到这个问题。

Claude 4 在第一次修改 schema 后就自动执行了 prisma generate


六、调试能力:遇到 bug 时的表现

在开发过程中,我故意在测试阶段引入了三个 bug,观察三个 Agent 的调试效率:

Bug 1:JWT 验证中间件在 Edge Runtime 下失败

  • Claude 4:2 轮定位。直接识别出 jsonwebtoken 不支持 Edge Runtime,换成 jose修复时间:5 分钟
  • GPT-5:5 轮定位。先尝试了修改 import 路径、修改配置、检查环境变量,最后才想到可能是 Runtime 兼容性。修复时间:18 分钟
  • Gemini Ultra:3 轮定位。先检查了 next.config.js 的 runtime 配置,然后发现是库的兼容性问题。修复时间:8 分钟

Bug 2:Prisma 连接池耗尽

在高并发测试下,Prisma 连接池耗尽导致查询超时。

  • Claude 4:1 轮定位。直接识别出没有在 lib/prisma.ts 中实现全局单例模式(开发模式下 Next.js 热重载会创建多个 PrismaClient 实例)。修复时间:3 分钟
  • GPT-5:4 轮定位。先检查了 PostgreSQL 配置、防火墙、Prisma 版本,最后才找到连接池问题。修复时间:15 分钟
  • Gemini Ultra:2 轮定位。检查了 lib/prisma.ts 的代码后,发现缺少 globalThis 保护。修复时间:6 分钟

Bug 3:TypeScript 类型推断失败

在嵌套的 service 函数中,TypeScript 无法正确推断 Prisma 返回的类型。

  • Claude 4:2 轮。添加了显式的 Prisma Type 注解(Prisma.ProjectGetPayload<...>),问题解决。
  • GPT-5:6 轮。尝试了 as anyas unknown as Project、修改 tsconfig,最后才正确使用 Prisma Type。
  • Gemini Ultra:3 轮。先尝试了泛型约束,然后发现需要用 Prisma 的类型工具。

调试能力评分

模型Bug 1Bug 2Bug 3平均修复时间评分
Claude 42轮1轮2轮5 分钟9.5/10
Gemini Ultra3轮2轮3轮8 分钟8/10
GPT-55轮4轮6轮18 分钟5.5/10

七、完成度:最终成果对比

50 轮对话/操作后,三个 Agent 的完成情况:

功能Claude 4GPT-5Gemini Ultra
用户注册/登录✅ 完整✅ 完整✅ 完整
JWT 认证中间件✅ 完整⚠️ 有安全漏洞✅ 完整
项目 CRUD✅ 完整✅ 完整✅ 完整
项目标签和过滤✅ 完整⚠️ 部分实现✅ 完整
团队角色管理✅ 完整⚠️ 部分实现✅ 完整
OpenAPI 文档✅ 自动生成❌ 未实现⚠️ 手动编写
单元测试✅ 85% 覆盖✅ 72% 覆盖✅ 78% 覆盖
E2E 测试✅ 2 个关键流程❌ 未实现⚠️ 1 个流程
代码可运行⚠️ 有 3 个编译警告

总体评分

维度Claude 4GPT-5Gemini Ultra
需求理解9/107/108/10
架构设计9/106/108/10
代码质量9.5/105/108/10
工具调用96%88%93%
调试能力9.5/105.5/108/10
完成度9/106/108/10
加权总分9.2/106.1/108.1/10

八、结论与选型建议

结论

Claude 4 在本次 Agent 编程横评中全面领先。

它的需求理解能力最强(会主动确认隐含需求),代码质量最高(类型安全、错误处理合理),调试效率最快(平均 5 分钟修复一个 bug)。唯一可以挑剔的是它偶尔过于”保守”——比如在不确定技术方案时会花多轮对话确认,而不是直接动手尝试。

GPT-5 的表现低于预期。

它的执行速度确实最快,但”快”是以牺牲质量为代价的。代码中的安全漏洞、类型缺失、框架适配错误,都表明它在”写对代码”这件事上还不够可靠。它的行为模式更像是一个有热情但经验不足的初级开发者——能跑通 demo,但代码不能直接上生产。

Gemini Ultra 是稳健的第二名。

它的代码质量很好(类型系统最完善),架构设计也不错,但在一些细节上(比如验证函数的耦合度、OpenAPI 文档的实现方式)不如 Claude 4。它的调试能力也略逊于 Claude 4。

选型建议

选 Claude 4 如果:

  • 你需要一个”能独立干活”的 Agent,不需要你反复 review 和纠正
  • 你对代码质量有高要求(类型安全、错误处理、安全规范)
  • 你的项目是生产级别的,不是 demo

选 Gemini Ultra 如果:

  • 你已经在 Google Cloud 生态中
  • 你需要与 Google Workspace(Sheets、Docs、Drive)深度集成
  • Claude 4 的 API 成本对你来说太高

暂时不建议选 GPT-5 做 Agent 编程如果:

  • 你的项目需要直接上生产(代码质量不够可靠)
  • 你需要 Agent 独立完成复杂任务(调试效率太低)

但如果你的场景是”快速原型 + 人工 review”,GPT-5 的执行速度优势还是有价值的。

一个重要的提醒

这次横评测的是特定任务(SaaS 后台)上的表现,不代表所有编程场景。

  • 如果你的场景是数据分析/科学计算,GPT-5 可能更好(它在数学和统计方面的训练数据更丰富)
  • 如果你的场景是前端 UI 开发,Gemini Ultra 可能更好(它对 Material Design 和 Web 组件的支持更深入)
  • 如果你的场景是系统编程/底层优化,三个模型可能都不够好——这个领域还需要更多专门的训练

但就”通用 Web 开发”这个最大的 Agent 编程场景而言,Claude 4 目前是综合能力最强的选择。


本次横评基于 2026 年 6 月各模型的最新 API 版本:Claude 4 Opus (2026-03)、GPT-5 (2026-04)、Gemini Ultra 2.0 (2026-05)。测试任务、评分标准和完整代码已开源。由于模型迭代快速,建议定期重新评估。Agent 编程工具的选择还应考虑 API 成本、集成便利性和团队偏好。