Claude 4 vs GPT-5 vs Gemini Ultra:Agent 编程能力横评——我们让三个 AI 同时开发同一个 SaaS 项目
以'开发一个带认证的 SaaS 后台'为统一任务,横向评测三大旗舰模型在需求理解、代码质量、工具调用和调试能力的真实表现。
KazK
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 后台管理系统,要求:
- 用户注册/登录(邮箱 + 密码,JWT 认证)
- 项目管理(CRUD,支持标签和状态过滤)
- 团队协作(项目成员管理,角色:Owner/Admin/Member)
- API 文档(自动生成 OpenAPI spec)
- 单元测试(核心功能覆盖率 > 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 4 | 9/10 | 结构清晰,符合 Next.js 15 最佳实践,模块化合理 |
| Gemini Ultra | 8/10 | 结构更复杂,service layer 是好习惯但略过度设计 |
| GPT-5 | 6/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 4 | 9.5/10 | 代码干净、类型安全、错误处理合理,唯一不足是缺少 token refresh |
| Gemini Ultra | 8/10 | 类型系统最完善,但验证函数的耦合度过高(依赖 NextRequest) |
| GPT-5 | 5/10 | 安全问题(硬编码密钥)、类型缺失(any)、框架适配错误(req 对象) |
五、工具调用:谁能正确地操作文件系统?
在开发过程中,三个 Agent 需要执行大量的文件操作和 shell 命令。我记录了它们的工具调用准确率:
| 操作类型 | Claude 4 | GPT-5 | Gemini 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 any、as unknown as Project、修改 tsconfig,最后才正确使用 Prisma Type。 - Gemini Ultra:3 轮。先尝试了泛型约束,然后发现需要用 Prisma 的类型工具。
调试能力评分
| 模型 | Bug 1 | Bug 2 | Bug 3 | 平均修复时间 | 评分 |
|---|---|---|---|---|---|
| Claude 4 | 2轮 | 1轮 | 2轮 | 5 分钟 | 9.5/10 |
| Gemini Ultra | 3轮 | 2轮 | 3轮 | 8 分钟 | 8/10 |
| GPT-5 | 5轮 | 4轮 | 6轮 | 18 分钟 | 5.5/10 |
七、完成度:最终成果对比
50 轮对话/操作后,三个 Agent 的完成情况:
| 功能 | Claude 4 | GPT-5 | Gemini Ultra |
|---|---|---|---|
| 用户注册/登录 | ✅ 完整 | ✅ 完整 | ✅ 完整 |
| JWT 认证中间件 | ✅ 完整 | ⚠️ 有安全漏洞 | ✅ 完整 |
| 项目 CRUD | ✅ 完整 | ✅ 完整 | ✅ 完整 |
| 项目标签和过滤 | ✅ 完整 | ⚠️ 部分实现 | ✅ 完整 |
| 团队角色管理 | ✅ 完整 | ⚠️ 部分实现 | ✅ 完整 |
| OpenAPI 文档 | ✅ 自动生成 | ❌ 未实现 | ⚠️ 手动编写 |
| 单元测试 | ✅ 85% 覆盖 | ✅ 72% 覆盖 | ✅ 78% 覆盖 |
| E2E 测试 | ✅ 2 个关键流程 | ❌ 未实现 | ⚠️ 1 个流程 |
| 代码可运行 | ✅ | ⚠️ 有 3 个编译警告 | ✅ |
总体评分
| 维度 | Claude 4 | GPT-5 | Gemini Ultra |
|---|---|---|---|
| 需求理解 | 9/10 | 7/10 | 8/10 |
| 架构设计 | 9/10 | 6/10 | 8/10 |
| 代码质量 | 9.5/10 | 5/10 | 8/10 |
| 工具调用 | 96% | 88% | 93% |
| 调试能力 | 9.5/10 | 5.5/10 | 8/10 |
| 完成度 | 9/10 | 6/10 | 8/10 |
| 加权总分 | 9.2/10 | 6.1/10 | 8.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 成本、集成便利性和团队偏好。