云端实现
本地后端免费且快速。just-bash后台是免费且安全的。云端后端既不是。
云端沙箱是运行在别处的真实虚拟机。它拥有真实的文件系统、真实的 git、真实的npm和真实的网络。它还按分钟收费,每调用开一会儿增加延迟,无论你是否完成,三十分钟后都会失效。
这节课是概念和分析,不是逐步构建。云端沙箱工具(配置、快照、计费)是针对供应商的,变化速度快于课程的跟上。保持稳定的是形状:界面相同,权衡不同,工具也不在意。
学习成果
你可以阅读并推理云沙箱实现,并描述为什么expiresAt和snapshot作为可选字段存在于界面上。
云层沙箱长什么样
import type { Sandbox } from "./sandbox";
export async function createCloudSandbox(config: {
template?: string;
snapshotId?: string;
}): Promise<Sandbox> {
const vm = await VercelSandbox.create(config);
return {
type: "cloud",
workingDirectory: "/workspace",
expiresAt: Date.now() + 30 * 60 * 1000,
readFile: async (p) => {
return vm.files.read(resolve("/workspace", p));
},
exec: async (command) => {
const result = await vm.commands.run(command, { cwd: "/workspace" });
return {
stdout: result.stdout + result.stderr,
exitCode: result.exitCode,
};
},
stop: async () => {
await vm.close();
},
snapshot: async () => {
const snap = await vm.snapshot();
return { snapshotId: snap.id };
},
};
}形状和local、just-bash一样。这些方法恰好让网络调用。从工具的角度来看,这几乎是看不见的。从挂钟的角度看,那是唯一重要的事。
权衡取舍
| 地方 | just-bash | 克劳德 | |
|---|---|---|---|
| 成本 | 免费 | 免费 | 每分钟 |
| 延迟 | 微秒级 | 微秒级 | 每调用有几十到几百毫秒 |
| 隔离 | 没有 | 部分(读取实数,写虚拟) | 完整且独立的虚拟机 |
| 持久性 | 永久性 | 垃圾收集 | 快照或恢复 |
git,npm | 你的本地安装 | 模拟 | 真实的,单独安装的 |
| 暂停 | 没有 | 没有 | 硬性限制(通常为30到60分钟) |
界面能兼容这三种,因为形状保持不变。可选字段(expiresAt、snapshot)之所以有其?,是因为它们不适用于更简单的后端。
何时选择每种
| 后端 | 最佳 |
|---|---|
local | 本地开发、调试、可信环境 |
just-bash | 探索、测试、不可信代码审查 |
cloud | 生产、配置、多用户、完全沙盒执行 |
真正的Harness让用户在启动时可以选择。Agent不知道也不在乎。
**注意:为什么云后端在这里只是概念**
我们不会针对实时供应商构建createCloudSandbox,因为配置端的配置、网络细节、快照语义等各API因供应商和频繁变动而异。保留下来的教导点是界面是相同的。如果你想把它连接到Vercel Sandbox,方法可以直接转换。
expiresAt和snapshot给你买什么
expiresAt让Harness知道计时在进行。长期运行的任务可以检查expiresAt,决定是开始新操作还是结束。没有它,Agent会运行直到出现网络错误,然后才得弄清楚发生了什么。
snapshot让Harness在跑动中救状态。云沙箱三十分钟后就会消散。如果你在第28分钟截图,可以从快照中重新开始,重新开始沙箱,从中断处继续。第7模块对此有深入介绍。
两者都是可选的。本地沙箱不该假装有这种病。just-bash 沙箱没有有意义的方式来揭露这些问题。界面允许每个后端选择自己实际能提供的功能。
动手试试
本课没有代码可运行,但有一个概念检查:
- 不要回头看表格,写下云后端
readFile比本地后端readFile慢的两个原因 - 请用一句话解释为什么
expiresAt在界面上是可选的 - 画出
createCloudSandbox和你之前用过的供应商API对比的样子。exec需要做什么而local.exec不需要?
答案的形状告诉你抽象概念是否已经理解。
提交
本课没有代码更改,所以没有提交。如果你画了一个云实现作为思考练习,就把它放在一个临时文件里。
完成标准
- [ ] 你可以解释为什么云端
readFile沙箱会增加延迟 - [ ] 你可以解释为什么
expiresAt存在于界面上 - [ ] 你可以描述一下你会选择
cloud而不是local或just-bash - [ ] 如果有人问,你可以API对真正的医生实施
createCloudSandbox
**注意:绘制成本意识型Harness**
云端沙箱每分钟收费。在Harness上设计一个护栏,在运行成本超过阈值时提醒你。Agent本身看不到成本,但Harness包裹能看到。支票在循环的哪个位置?当任务中途超过阈值时会发生什么?你是停下来、快照,还是直接问用户?每个答案都指向不同的操作模型。