跳到正文

云端实现

本地后端免费且快速。just-bash后台是免费且安全的。云端后端既不是。

云端沙箱是运行在别处的真实虚拟机。它拥有真实的文件系统、真实的 git、真实的npm和真实的网络。它还按分钟收费,每调用开一会儿增加延迟,无论你是否完成,三十分钟后都会失效。

这节课是概念和分析,不是逐步构建。云端沙箱工具(配置、快照、计费)是针对供应商的,变化速度快于课程的跟上。保持稳定的是形状:界面相同,权衡不同,工具也不在意。

学习成果

你可以阅读并推理云沙箱实现,并描述为什么expiresAtsnapshot作为可选字段存在于界面上。

云层沙箱长什么样

ts
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 };
    },
  };
}

形状和localjust-bash一样。这些方法恰好让网络调用。从工具的角度来看,这几乎是看不见的。从挂钟的角度看,那是唯一重要的事。

权衡取舍

地方just-bash克劳德
成本免费免费每分钟
延迟微秒级微秒级每调用有几十到几百毫秒
隔离没有部分(读取实数,写虚拟)完整且独立的虚拟机
持久性永久性垃圾收集快照或恢复
gitnpm你的本地安装模拟真实的,单独安装的
暂停没有没有硬性限制(通常为30到60分钟)

界面能兼容这三种,因为形状保持不变。可选字段(expiresAtsnapshot)之所以有其?,是因为它们不适用于更简单的后端。

何时选择每种

后端最佳
local本地开发、调试、可信环境
just-bash探索、测试、不可信代码审查
cloud生产、配置、多用户、完全沙盒执行

真正的Harness让用户在启动时可以选择。Agent不知道也不在乎。

**注意:为什么云后端在这里只是概念**

我们不会针对实时供应商构建createCloudSandbox,因为配置端的配置、网络细节、快照语义等各API因供应商和频繁变动而异。保留下来的教导点是界面是相同的。如果你想把它连接到Vercel Sandbox,方法可以直接转换。

expiresAtsnapshot给你买什么

expiresAt让Harness知道计时在进行。长期运行的任务可以检查expiresAt,决定是开始新操作还是结束。没有它,Agent会运行直到出现网络错误,然后才得弄清楚发生了什么。

snapshot让Harness在跑动中救状态。云沙箱三十分钟后就会消散。如果你在第28分钟截图,可以从快照中重新开始,重新开始沙箱,从中断处继续。第7模块对此有深入介绍。

两者都是可选的。本地沙箱不该假装有这种病。just-bash 沙箱没有有意义的方式来揭露这些问题。界面允许每个后端选择自己实际能提供的功能。

动手试试

本课没有代码可运行,但有一个概念检查:

  1. 不要回头看表格,写下云后端readFile比本地后端readFile慢的两个原因
  2. 请用一句话解释为什么expiresAt在界面上是可选的
  3. 画出createCloudSandbox和你之前用过的供应商API对比的样子。exec需要做什么而local.exec不需要?

答案的形状告诉你抽象概念是否已经理解。

提交

本课没有代码更改,所以没有提交。如果你画了一个云实现作为思考练习,就把它放在一个临时文件里。

完成标准

  • [ ] 你可以解释为什么云端readFile沙箱会增加延迟
  • [ ] 你可以解释为什么expiresAt存在于界面上
  • [ ] 你可以描述一下你会选择cloud而不是localjust-bash
  • [ ] 如果有人问,你可以API对真正的医生实施createCloudSandbox

**注意:绘制成本意识型Harness**

云端沙箱每分钟收费。在Harness上设计一个护栏,在运行成本超过阈值时提醒你。Agent本身看不到成本,但Harness包裹能看到。支票在循环的哪个位置?当任务中途超过阈值时会发生什么?你是停下来、快照,还是直接问用户?每个答案都指向不同的操作模型。

非官方简体中文翻译 · 原课程来自 Vercel Academy