跳到主要内容

传统 VM 部署 vs CloudBase AI 开发:同一 Todo 应用的实测对比

基于 CloudBase AI Coding Evaluation Set 的双桶对照评测
评测日期:2026-04-24 ~ 2026-04-26 | 模型:GLM-5 | 框架:codebuddy-code


评测方式说明:本报告所有数据来自给 AI Agent 一个自然语言 Prompt,让它自主完成整个开发任务的自动化评测。Agent 在运行时会反复进行「思考 → 调用工具 → 观察结果」的内部循环,每次循环计为 1 轮。文中的「工具调用」涵盖所有 Agent 与外部环境交互的动作——包括但不限于读写文件(Read/Write/Edit)、执行命令(Bash)、创建子任务(TaskCreate)、调用云 API(MCP)等。对 Agent 来说,一次 ssh、一次 npm install、一次保存文件,都是一次独立的工具调用。

Executive Summary

维度传统 VM 部署 (atomic-web-vm-todo)CloudBase AI 开发 (atomic-web-cloudbase-todo)倍率优势
完成时长990s (16min)260s (4min)3.8x 更快
工具调用次数79362.2x 更少
Agent 内部循环次数189892.1x 更少
Token 用量2,788,2911,323,4312.1x 更省
代码变更文件1917持平
公网攻击面SSH 22 + HTTP 80 暴露仅 HTTPS API,无 SSH消除 SSH 攻击面

核心结论:在功能等价(匿名会话 + Todo CRUD + 数据隔离)的前提下,CloudBase AI 开发路径比传统 VM 部署快 3.8 倍,Token 消耗降低 52%,且彻底消除了 SSH 暴露带来的安全风险


一、问题背景

当 AI 编程 Agent 面对一个"从零搭建后端服务并部署"的任务时,它需要完成的不只是写代码:

  1. 理解需求 → 设计技术方案
  2. 编写代码 → 实现业务逻辑
  3. 配置环境 → 安装运行时、依赖
  4. 部署上线 → 传输文件、配置进程守护、验证可达性
  5. 调试排错 → 处理网络中断、端口冲突、权限问题

传统 VM 路径要求 Agent 承担步骤 3~5 的全部工作——这些恰恰是 AI Agent 最不擅长的事:长时间等待、处理基础设施故障、在不可控环境中反复试探

CloudBase AI 开发(Serverless + BaaS)将步骤 35 缩减为 几次 MCP 工具调用,让 Agent 聚焦于真正有价值的步骤 12。


二、评测方法论

Case 设计

两个 case 使用 完全相同的业务需求、相同的前端脚手架和相同的 Agent Prompt,唯一区别是后端实现路径。原始项目地址:

GitHub 脚手架: https://github.com/TencentCloudBase/awesome-cloudbase-examples/tree/master/web/evaluation/todo-scaffold

该脚手架提供:

  • 完整的 React + Vite Todo 列表页(路由、表单、按钮位置、data-testid 均已固定,Agent 不可修改)
  • 预留的 src/lib/backend.tssrc/lib/session.tssrc/lib/todo-service.ts(TODO 状态)
  • 页面加载时自动调用 ensureSession()

核心任务 Prompt(两个 case 完全一致):

我想用一个简单的待办事项网站:打开就能用,不需要注册登录。每个浏览器窗口自动拥有独立的匿名会话,可以创建/查看/勾选完成/删除自己的待办。不同窗口(不同会话)的人看不到彼此的待办,数据完全隔离。

分歧点仅在后端技术约束

# 共同需求
- 匿名会话:页面加载自动建立,每窗口独立 sessionId
- Todo CRUD:创建 / 查看 / 勾选完成 / 删除
- 数据隔离:不同会话互不可见
- 前端壳子:React + Vite Todo 列表页(固定不动)

# 分歧点
VM 桶:
- 后端自建 → SSH 到 Ubuntu VM → 安装 Node.js → 写 Express + SQLite
- 部署方式 → rsync 上传 → pm2 守护进程 → 端口探测验证
- 环境变量 → SSH_HOST, SSH_USER, SSH_KEY_PATH, ALLOCATED_PORT

CloudBase 桶:
- 后端即服务 → @cloudbase/js-sdk → Auth 匿名登录 + 云数据库
- 部署方式 → npm install 即可(SDK 直连云资源)
- 环境变量 → CLOUDBASE_ENV_ID, TENCENTCLOUD_SECRETID/KEY

Grader 验证标准

两个 grader 使用 共享的 runTodoBlackbox 黑盒测试框架

验证项VM graderCloudBase grader
技术路线检查SSH 连通性 + 远程目录存在 + 端口 HTTP 可达package.json 声明 @cloudbase/js-sdk
功能黑盒测试Browser A/B 双窗口 UI 流程Browser A/B 双窗口 UI 流程 (同一套)
会话隔离验证新 session GET /api/todos 返回空新 session 查询返回空 (同一套)

运行环境

参数
Agent 框架codebuddy-code
LLMGLM-5 (glm-5.0-ioa)
VM 规格Ubuntu, 49.235.162.196, port 80
CloudBase 环境booker-eval-8g4tmfro (上海)
Max turnsVM: 无限制 / CB: 150
TimeoutVM: 2400s / CB: 1200s

三、结果对比

3.1 效率指标

┌──────────────────────────────────────────────────────────────┐
│ 完成时间对比 │
│ │
│ Traditional VM ████████████████████████████████████ 990s │
│ (16 min) │
│ │
│ CloudBase AI ████████ 260s │
│ (4 min) ← 快 3.8 倍 │
└──────────────────────────────────────────────────────────────┘

3.2 Token 效率分析(三层归因)

层级CloudBaseVM Traditional差异解释
总量1,323,4312,788,291CB 仅需 47% 的 Token 就完成任务
Input (上下文)1,319,9292,776,268VM 的 SSH 输出/错误日志/安装进度大量涌入上下文
Output (生成)3,50212,023VM Agent 需要生成更多命令、重试逻辑、调试脚本

关键洞察:Token 差异不是来自"代码写得更好",而是来自 基础设施交互的开销

  • VM 路径中,Agent 发出的 60 次 Bash 调用里有 35+ 次ssh/curl/apt/npm install/pm2 等运维操作
  • 这些操作的输出(安装进度、SSH banner、系统日志、错误堆栈)全部作为 Input token 进入上下文
  • CloudBase 路径中,仅 5 次 MCP 调用 就完成了同等的基础设施工作(auth 配置、集合创建、安全规则写入),且每次返回的是结构化 JSON

3.3 工具调用结构对比

CloudBase 路径的工具调用分布 (36次):

TaskCreate ████████████████████ 6 (16.7%)
TaskUpdate ██████████████████████████████ 12 (33.3%)
Read ██████ 6 (16.7%)
Bash ███ 3 (8.3%)
Write ███ 3 (8.3%)
Glob █ 1 (2.8%)
MCP(auth) █ 1 (2.8%) ← 基础设施
MCP(queryAppAuth) █ 1 (2.8%) ← 基础设施
MCP(createColl) █ 1 (2.8%) ← 基础设施
MCP(permissions) █ 1 (2.8%) ← 基础设施
MCP(envQuery) █ 1 (2.8%) ← 基础设施

VM 路径的工具调用分布 (79次):

Bash ██████████████████████████████████████████████████ 60 (75.9%)
Read ████████████████ 9 (11.4%)
TaskUpdate ██████ 7 (8.9%)
Write ███ 3 (3.8%)
Edit ███ 3 (3.8%)
Agent(sub) █ 1 (1.3%)
TaskList █ 1 (1.3%)
TaskCreate █ 1 (1.3%)
Glob █ 1 (1.3%)

核心差异:CloudBase 路径中 75% 的工具调用是代码编写类(Read/Write/Edit/TaskUpdate);VM 路径中 76% 是 Bash 运维操作


四、Deep Dive:执行流程时序对比

CloudBase AI 路径 (4 min, 89 轮循环)

09:48:15 ┬─ TaskCreate ×6 (探索→认证→backend→session→todos→安全规则)
09:48:21 ├─ Glob + Read ×7 (读取项目结构和 TODO 文件)

09:48:43 ├─ [MCP] auth status → 已登录 ✅
09:48:55 ├─ [MCP] queryAppAuth → 获取登录配置 ✅

09:49:05 ├─ Bash: npm install @cloudbase/js-sdk → 安装 SDK
09:49:27 │
09:49:41 ├─ Write: src/lib/backend.ts → SDK 初始化 (app/db/auth 导出)
09:50:10 ├─ Write: src/lib/session.ts → signInAnonymously() + 内存缓存
09:50:45 ├─ Write: src/lib/todo-service.ts → CRUD (create/list/toggle/delete)

09:50:56 ├─ [MCP] createCollection(todos) → 创建数据库集合
09:51:06 ├─ [MCP] managePermissions → 写入安全规则 (ownerId 隔离)
09:51:13 ├─ [MCP] envQuery(domains) → 检查域名白名单

09:51:29 ├─ Bash: npm install → 安装依赖
09:51:38 └─ 全部 Task completed ✅

Total: 243 秒 | 36 tool calls | 5 次 MCP 操作替代了全部运维工作

VM Traditional 路径 (16 min, 189 轮循环)

13:26:28 ┬─ Agent(sub): 探索项目结构
13:26:37 ├─ Bash: find / ls / Glob / Read ×16 (读取全量文件)
13:26:56 │
13:27:02 ├─ Write: backend/package.json
13:27:08 ├─ Write: backend/server.js (Express + SQLite)
13:27:30 ├─ Edit: src/lib/backend.ts (HTTP fetch client)
13:27:42 ├─ Edit: src/lib/session.ts (ensureSession → POST /api/session)
13:28:00 ├─ Edit: src/lib/todo-service.ts (CRUD)
13:28:12 ├─ Edit: vite.config.ts (proxy → VM IP:port)

├── ⚡ 代码编写完成 (~2 min),但真正的挑战才刚开始...

13:28:30 ├─ Bash: echo $SSH_HOST ... → 检查环境变量
13:28:36 ├─ Bash: ssh ... "uname -a" → 探测 VM ✅
13:28:42 ├─ Bash: ssh ... "node --version" → Node not installed ❌

13:28:48 ├─ Bash: ssh ... "curl -fsSL ..." → 安装 Node.js 20.x
13:29:00 ├─ Bash: ssh ... "node --version" → v20.x ✅
13:29:30 ├─ Bash: ssh ... "npm init -y" → 后端目录初始化
13:29:45 ├─ Bash: scp ... server.js package.json → 上传代码
13:30:00 ├─ Bash: ssh ... "npm install" → 远程安装依赖
13:30:20 ├─ Bash: ssh ... "npx pm2 start ..." → 启动服务
13:30:35 ├─ Bash: curl http://49.235.162.196/health → 502! ❌
13:30:50 ├─ Bash: ssh ... "pm2 logs" → 排查错误
13:31:00 ├─ Bash: ssh ... "npx pm2 restart ..."→ 重启
13:31:15 ├─ Bash: curl .../health → 200! ✅

├── ⚡ 服务启动成功,但还有前端构建和验证...

13:32:00 ├─ Bash: npm install → 本地安装前端依赖
13:33:00 ├─ Bash: npm run dev & → 启动 Vite dev server
13:34:00 ├─ Bash: curl -c cookie /api/session → Session 测试 ✅
13:34:30 ├─ Bash: curl /api/todos → Create/List ✅
13:35:00 ├─ Bash: curl -X PATCH /api/todos/:id → Toggle ✅
13:35:30 ├─ Bash: curl -X DELETE /api/todos/:id → Delete ✅ (edge case fail)
13:36:00 ├─ Bash: curl (新 session) /api/todos → [] 隔离验证 ✅

13:37:00 ├─ Bash: npm run build → 生产构建
13:38:00 ├─ scp ... dist/ → 部署静态文件到 VM
13:40:00 └─ 最终验证... → Score: 0.919

Total: 990 秒 | 79 tool calls | 60 次 Bash (其中 35+ 次为运维操作)

关键差异可视化

┌─────────────────────────────────────────────────────────────────────┐
│ Agent 注意力分配对比 │
│ │
│ CloudBase Path: │
│ ┌──────────────────────────────────────────────────┐ │
│ │ ████ CODE ████ | █ MCP infra █ | ▓ npm (1x) │ 100% │
│ │ 78% | 14% | 8% │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ VM Traditional Path: │
│ ┌──────────────────────────────────────────────────┐ │
│ │ ██ Code █ | ░░░░░░░░░░░░░░░░░░░░ Bash ops ░░░░░░░ │ 100% │
│ │ 24% │ 76% (SSH/curl/pm2/apt) │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ → VM 路径 3/4 的时间花在了"让代码跑起来",而不是"写代码" │
└─────────────────────────────────────────────────────────────────────┘

五、失败模式与鲁棒性对比

VM 路径的失败面

本次评测中,VM 路线经历了 两次运行,暴露出两类失败:

运行时长结果根因
04-24 首次2044s (34min)超时 FAILVM SSH 持续 30min 不可达 (502 Bad Gateway)
04-26 重跑990s (16min)FAIL (score 0.919)Delete edge case bug + 多次 SSH 重试

首次运行的灾难场景

10:53:22 SSH 执行 apt-get install nodejs ...
10:53:50 Connection closed by 49.235.162.196 port 22 💥
10:53:55 Retry #1 → Fail
10:54:10 Retry #2 → Fail
10:55:30 Retry #3 → Fail
... (连续 17 次重试,全部失败)
11:23:06 Retry #17 → Fail (距首次失败已过 29 分钟)
11:24:24 Timeout 结束,任务未完成

Agent 在 SSH 不可达后没有 fail-fast 机制,反复重试浪费了 20+ 分钟 的循环时间。这是传统 VM 部署的固有风险——Agent 对基础设施故障几乎没有容错能力

CloudBase 路径的优势

CloudBase 路径不存在上述风险:

  • 无 SSH 依赖 — MCP 工具通过 HTTPS API 与云端通信,不经过 22 端口
  • 无运行时安装 — 云数据库和 Auth 服务始终在线可用
  • 无进程管理 — 不需要 pm2/systemd/nginx,Serverless 自动扩缩
  • 结构化错误 — MCP 返回 JSON error 而非 raw stderr,Agent 更容易理解和恢复

六、安全面暴露对比

这是 VM 路径最隐蔽但最致命的短板:为了评测不得不开通 SSH 22 端口 + HTTP 80 端口 的公网访问。

VM 路径的公网攻击面

┌────────────────────────────────────────────────────────────────┐
│ Internet │
│ │ │
│ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ SSH :22 │ │ HTTP :80 │ ← 两个端口暴露给公网 │
│ │ (密钥认证) │ │ (应用服务) │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌────────────────────────────────────┐ │
│ │ Ubuntu VM (49.235.162.196) │ │
│ │ ├─ sshd (持续监听 22) │ │
│ │ ├─ Node.js + Express (监听 80) │ │
│ │ ├─ pm2 进程守护 │ │
│ │ └─ SQLite 文件 (本地存储) │ │
│ └────────────────────────────────────┘ │
│ │
│ 风险: 22/80 端口暴露后,自动化安全扫描 (Shodan/Masscan) │
│ 会在数小时内发现该 IP,触发暴力破解、漏洞扫描、 │
│ DDoS 放大等攻击面探测。 │
└────────────────────────────────────────────────────────────────┘

本次评测中的实际风险

  • SSH 密钥泄露风险cloudbase_eval.pem 私钥文件在 CI/本地环境中流转,任何有仓库权限的人都可以 ssh root@49.235.162.196
  • 22 端口持续暴露:即使评测结束,VM 的 22 端口仍保持开放,直到手动关闭安全组
  • 80 端口无 WAF:Express 应用直接暴露在公网,缺少 DDoS 防护、SQL 注入过滤、Rate Limiting
  • 自动化扫描命中率高49.235.162.196 属于腾讯云上海数据中心 IP 段,Shodan 等扫描器对云厂商 IP 段有专门的高频探测策略

CloudBase 路径的安全模型

┌────────────────────────────────────────────────────────────────┐
│ Internet │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────┐ │
│ │ CloudBase 云开发平台 (BaaS) │ │
│ │ ├─ Auth 服务 (微信/匿名/自定义) │ ← 无 SSH 端口 │
│ │ ├─ 云数据库 (NoSQL/SQL) │ ← 无公网 IP │
│ │ ├─ 云存储 (COS) │ ← SDK 内网通道 │
│ │ └─ 云函数/云托管 (Serverless) │ ← 平台级安全隔离 │
│ └────────────────────────────────────┘ │
│ ▲ │
│ │ HTTPS (TLS 1.3) + 平台签名验证 │
│ │ │
│ ┌──────┴─────────────────────────────┐ │
│ │ 前端应用 (localhost / 静态托管) │ │
│ │ @cloudbase/js-sdk (npm) │ │
│ └────────────────────────────────────┘ │
│ │
│ 特点: 无 SSH 端口、无公网 IP、数据在平台 VPC 内隔离 │
│ Agent 通过 MCP → HTTPS API 操作资源,流量经过 TLS │
└────────────────────────────────────────────────────────────────┘

CloudBase 的安全优势

安全维度VM TraditionalCloudBase AI
SSH 暴露22 端口公网可达无 SSH,零暴露
应用端口暴露80/443 公网可达仅前端域名,后端无公网入口
认证方式密钥文件 (PEM)平台签名 + 临时 Token
数据存储位置VM 本地磁盘 (可物理访问)云端 VPC 隔离 (不可物理访问)
DDoS 防护自建或无平台级默认防护
安全扫描风险高 (IP 段被 Shodan 重点扫描)零 (无公网可扫描端口)
密钥轮换手动管理 PEM 文件平台自动管理,无需人工介入

一个被低估的成本

在评测和实际开发中,VM 路径为了"让 Agent 能连上"而开通的公网端口,本质上是用 长期安全风险 换取 短期调试便利。当 Agent 反复 SSH 失败时,开发者的第一反应往往是"放宽安全组规则"或"把端口范围开大一点"——这种惯性在无人值守的 AI Agent 场景中尤为危险。

CloudBase 路径从根本上消除了这个两难:Agent 不需要 SSH,就不需要开 22 端口;Agent 不需要自建服务器,就不需要暴露应用端口。 安全不是事后加固,而是架构层面的默认状态。


七、代码产出质量对比

CloudBase 版本的核心代码

// src/lib/backend.ts — 仅 25 行,声明式初始化
import cloudbase from '@cloudbase/js-sdk';
const app = cloudbase.init({ env: import.meta.env.VITE_CLOUDBASE_ENV });
export const { db, auth } = app;

// src/lib/session.ts — 匿名会话,3 行核心逻辑
export async function ensureSession(): Promise<string> {
const loginRes = await auth.signInAnonymously();
const uid = loginRes.user.uid;
sessionStorage.setItem('sessionId', uid);
return uid;
}

// 安全规则 — 通过 MCP 一步写入
// read/write 仅限 auth.uid == doc.ownerId 的记录

VM 版本的核心代码

// backend/server.js — Express + better-sqlite3, 120+ 行
// 需要自己处理: 路由定义 / 数据库连接 / SQL 编写 / 错误处理
// CORS 配置 / 端口监听 / UUID 生成 / session 存储

// deploy 相关 — 至少 3 个额外文件
// backend/deploy.sh (rsync + pm2 restart)
// deploy-to-vm.sh (完整一键部署脚本)
// vite.config.ts proxy 配置 (/api → http://VM_IP:port)
维度CloudBaseVM Traditional
后端代码量~80 行 (3 个 TS 文件)~350 行 (server.js + 部署脚本 + config)
运维代码量0 行~120 行 (deploy.sh × 2 + proxy 配置)
需要维护的组件前端 + SDK 调用前端 + Express 服务 + SQLite 文件 + pm2 进程 + nginx/Caddy
数据隔离机制云数据库安全规则 (声明式)应用层 ownerId 过滤 (需手动保证正确性)

八、成本分析

Token 成本(单次运行)

路径Input TokensOutput Tokens总量相对成本
CloudBase AI1,319,9293,5021,323,4311x (基准)
VM Traditional2,776,26812,0232,788,2912.1x

按 GPT-4o class 定价 ($2.5/M input, $10/M output) 估算:

CloudBaseVM差额
单次运行 Token 成本~$3.33~$7.06节省 $3.73
月度 100 次迭代~$333~$706节省 $373

隐性成本(更关键)

成本项CloudBaseVM Traditional
Agent 等待时间 (apt/npm install)~15s (本地 npm i)~180s (远程安装 + 传输)
调试循环长度1 turn (改代码 → 刷新页面)3-5 turns (改代码 → scp → ssh restart → curl 验证 → 读 log)
基础设施故障率~0% (云 SLA 99.9%)非零 (本次评测 50% 失败率)
开发者认知负荷学 SDK API (5 个方法)学 Express + SQLite + PM2 + SSH + Linux sysadmin

九、结论

数据总结

┌────────────────────┬──────────────┬──────────────┬────────────┐
│ 指标 │ CloudBase AI │ VM Traditional│ 优势倍率 │
├────────────────────┼──────────────┼──────────────┼────────────┤
│ 完成时间 │ 4 min │ 16 min │ 3.8x faster│
│ Tool Calls │ 36 │ 79 │ 2.2x fewer │
│ Agent 内部循环次数 │ 89 │ 189 │ 2.1x fewer │
│ Token 消耗 │ 1,323,431 │ 2,788,291 │ 2.1x saved │
│ 运维操作占比 │ 14% │ 76% │ 5.4x less │
│ 基础设施故障影响 │ 无 │ 50% 运行失败 │ N/A │
│ 后端代码量 │ ~80 行 │ ~350 行 │ 4.4x less │
│ 部署产物数 │ 0 (无需部署) │ 3+ 个脚本 │ N/A │
└────────────────────┴──────────────┴──────────────┴────────────┘

适用场景建议

选择适合场景不适合场景
CloudBase AIWeb/小程序快速原型、内部工具、SaaS MVP、团队无 DevOps 能力需要深度定制 OS/网络/底层依赖的场景
VM Traditional有成熟 CI/CD 流水线的遗留系统、需要 root 权限的系统级编程、合规要求私有部署快速迭代验证想法、小团队/个人开发者

最终判断

CloudBase AI 开发的本质价值不是"写代码更快",而是消除了 AI 编程中最脆弱的环节——基础设施运维。

传统路径下,AI Agent 将 60%~75% 的精力消耗在非创造性工作上(装环境、传文件、查日志、重启服务)。CloudBase 通过 BaaS + MCP 将这些工作压缩为 5 次声明式 API 调用,让 Agent 回归本质——理解需求、写出正确的代码

这不是框架优劣之争,而是 Serverless 时代的开发范式转移 在 AI Agent 领域的自然延伸。


附录

A. 运行元信息

字段CloudBase RunVM Run (04-26)
Case IDatomic-web-cloudbase-todoatomic-web-vm-todo
Run ID2026-04-24T09-47-40-kr4e082026-04-26T13-26-03-f4y35b
Statuspass (score 0.935)fail (score 0.919)
Duration260s990s
Modelglm-5.0-ioaglm-5.0-ioa
Agentcodebuddy-codecodebuddy-code
MCPCloudBase (5 tools used)None (纯 Bash)

B. CloudBase MCP 工具调用明细

序列工具action目的耗时
1authstatus检查登录状态~8s
2queryAppAuthgetLoginConfig获取匿名登录配置~10s
3writeNoSqlDatabaseStructurecreateCollection创建 todos 集合~10s
4managePermissionsupdateResourcePermission写入安全规则 (ownerId 隔离)~7s
5envQuerydomains检查域名白名单~7s

C. VM Bash 运维操作分类

类别次数占比典型命令
SSH 连接/探测2236.7%ssh ... "uname -a" / "node -v" / "pm2 logs"
远程软件安装813.3%ssh ... "apt-get install" / "npm install"
文件传输46.7%scp ... server.js / rsync ... dist/
进程管理610.0%pm2 start/restart/reload/delete
健康检查/调试1220.0%curl /health / 日志查看 / 端口检查
本地开发操作813.3%npm install/run dev/build

注:以上 60 次 Bash 中,纯代码相关的仅 ~8 次(本地 npm install/run dev/build 等),其余均为基础设施运维。

E. 原始脚手架项目地址

两个 case 使用完全相同的 React + Vite 前端脚手架,源码托管在:

  • GitHub: https://github.com/TencentCloudBase/awesome-cloudbase-examples/tree/master/web/evaluation/todo-scaffold

该脚手架包含:

  • 固定的 Todo 列表页结构(路由、表单、按钮位置、data-testid)
  • 预留的 src/lib/backend.tssrc/lib/session.tssrc/lib/todo-service.ts(TODO 状态)
  • 页面加载时自动调用 ensureSession()

Agent 的任务是填充这三个文件并接入后端,不允许修改页面结构。

F. 完整任务 Prompt(CloudBase 桶)

我想用一个简单的待办事项网站:打开就能用,不需要注册登录。
每个浏览器窗口自动拥有独立的匿名会话,可以创建/查看/勾选完成/删除自己的待办。
不同窗口(不同会话)的人看不到彼此的待办,数据完全隔离。

项目现状:
- 已有完整的 React + Vite 前端壳子(Todo 列表页)
- 页面路由、表单字段、按钮位置已经固定,请不要修改页面结构或 data-testid
- 所有与后端交互的函数都在 src/lib/ 下,当前是 TODO 状态:
* backend.ts — 后端客户端初始化
* session.ts — 匿名会话管理(ensureSession / getCurrentSession)
* todo-service.ts — Todo CRUD
- 页面加载时会自动调用 ensureSession(),你只需实现这个函数

必须实现的功能:
1. 匿名会话:页面加载时自动建立,每个浏览器窗口得到不同的 sessionId
2. Todo CRUD:创建、查看列表、勾选完成/取消、删除
3. 数据隔离:后端只返回当前会话创建的 Todo,不同会话互不可见

技术约束:
- 必须使用 CloudBase 云开发能力(CloudBase Auth 匿名登录 + 云数据库)
- 必须使用 npm 安装 @cloudbase/js-sdk,不能使用 CDN
- 必须配置数据库安全规则实现数据隔离,不能仅靠前端过滤

重要约束:
- 不要修改页面结构和 data-testid
- 不要只做静态页面或 mock 数据,必须接真实 CloudBase 后端
- 优先保证功能闭环可用

G. 完整任务 Prompt(VM 桶)

我想用一个简单的待办事项网站:打开就能用,不需要注册登录。
每个浏览器窗口自动拥有独立的匿名会话,可以创建/查看/勾选完成/删除自己的待办。
不同窗口(不同会话)的人看不到彼此的待办,数据完全隔离。

项目现状:
- 已有完整的 React + Vite 前端壳子(Todo 列表页)
- 页面路由、表单字段、按钮位置已经固定,请不要修改页面结构或 data-testid
- 所有与后端交互的函数都在 src/lib/ 下,当前是 TODO 状态:
* backend.ts — 后端客户端初始化
* session.ts — 匿名会话管理(ensureSession / getCurrentSession)
* todo-service.ts — Todo CRUD
- 页面加载时会自动调用 ensureSession(),你只需实现这个函数

必须实现的功能:
1. 匿名会话:页面加载时自动建立,每个浏览器窗口得到不同的 sessionId
2. Todo CRUD:创建、查看列表、勾选完成/取消、删除
3. 数据隔离:后端只返回当前会话创建的 Todo,不同会话互不可见

技术约束:
- 必须自建后端服务(Node.js / Go / Python / 任意语言均可)
- 不允许使用 CloudBase、Supabase、Firebase 等 BaaS 服务
- 数据隔离必须在后端接口层面实现,不能仅靠前端过滤

目标 VM 环境:
- 一台干净的 Ubuntu 24.04 云主机,预装 python3 和 rsync,其余都需要你自己安装
- 没有预装 node/npm/pm2/mysql/sqlite,你可以用 apt 或其他方式安装需要的工具
- 可以通过 SSH 免密登录(sudo 免密),命令示例:
ssh -i "$SSH_KEY_PATH" -o StrictHostKeyChecking=no "$SSH_USER@$SSH_HOST" "<command>"
- 也可以通过 scp/rsync 把代码传上去

部署约束(已为你分配好资源):
- 凭证见环境变量:
* SSH_HOST:VM 公网地址
* SSH_USER:SSH 用户名
* SSH_KEY_PATH:SSH 私钥文件绝对路径
- 后端服务必须 listen 环境变量 ALLOCATED_PORT 指定的端口(一期固定为 80)
- 因为 80 是受保护端口(<1024),进程必须通过 sudo 启动,或使用
`setcap 'cap_net_bind_service=+ep'` 给 node 二进制授权,或把 80 端口代理到
高端口再起服务。ssh 用户 sudo 免密,任选一种方式
- 后端代码必须部署到环境变量 ALLOCATED_REMOTE_DIR 指定的远程目录
- 前端 Vite 在本地 127.0.0.1 访问,前端到后端的请求通过 vite proxy 或 CORS 解决
(建议:在 vite.config.ts 里配置 proxy 指向 http://${SSH_HOST}:${ALLOCATED_PORT})
- 使用 pm2、systemd、nohup 或等价方式让后端进程常驻

重要约束:
- 不要修改页面结构和 data-testid
- 不要只做静态页面或 mock 数据,必须接真实后端
- 优先保证功能闭环可用

H. 参考链接

  • CloudBase AI Coding Evaluation Set: 本仓库 (cases/, case-graders/)
  • Case YAML (CB): cases/atomic-web-cloudbase-todo.yaml
  • Case YAML (VM): cases/atomic-web-vm-todo.yaml
  • Trace Data (CB): trajectories/atomic-web-cloudbase-todo/2026-04-24T09-47-40-kr4e08/trace.json
  • Trace Data (VM): trajectories/atomic-web-vm-todo/2026-04-26T13-26-03-f4y35b/trace.json