突破容器限制:为 Agent 设计专用运行时
Cloudflare 发布 @cloudflare/computer,一个动态在快速隔离环境和完整 Linux 容器间切换的 agent 运行时,解决大规模 agent 并发的资源和性能问题。
完整中文译文
能力最强的 Agent 往往有一个简单的共同点:它们都有一台属于自己的计算机来工作。
Coding Agent 正是以这种方式工作的。你为它们提供文件系统、shell、工具、软件包,以及运行代码的能力。它们会检查环境、进行修改、测试自己的工作,然后继续推进。计算机为模型提供了一种熟悉的方式,让它能够对现实世界采取行动。在 Cloudflare,我们正努力提供合适的基础原语,用于构建能力最强的 Agent。
今天,我们发布 @cloudflare/computer 的早期预览版。@cloudflare/computer 软件包提供了一套 Agent runtime,由平台负责处理代码究竟运行在 isolate、容器 sandbox,还是 Web 浏览器中的具体细节与运行机制。每个 Agent 都会获得一台计算机,而 runtime 则会针对效率和可扩展性进行优化。
我们认为,为了满足 Agent 系统日益增长的计算需求,我们需要寻找传统容器化之外的解决方案。
改变 Agent 的构建方式
在过去六个月里,我们见证了这条发展路线的一次微妙演进。今年年初,启动一个容器并在其中运行 Agent 还是主流做法。最近几个月,我们看到 Agent harness 迅速转向通过工具提供 sandbox 化的代码执行能力。这种方式将双手——完成工作的 sandbox——与大脑——Agent loop——分离开来。

无论 harness 运行在哪里,为每个 Agent 分配一个容器都会带来一项挑战:纵观所有云平台和超大规模云服务商,全世界的计算资源远远不足以让每家公司都为每位用户的每个 Agent 提供独立的容器化计算环境。这种方式无法扩展到数亿、乃至数十亿个并发 Agent。这也正是整个行业不顾一切、近乎恐慌地争抢 CPU 计算资源,而不仅仅是 GPU 计算资源的原因。
Cloudflare 长期以来一直致力于解决这个问题,并为此打造了一种效率更高的计算原语:isolate。差不多十年前,我们推出 Cloudflare Workers 时,就在行业尚未形成共识的情况下押注了这条路线。将近六年前推出 Durable Objects 时,我们又做出了同样的选择。我们之所以押注 isolate,是因为它们能够近乎无限地水平扩展。它们可以极快地启动和销毁;可以在 Agent 空闲时进入休眠状态;可以保存 Agent 自身的状态;甚至能够启动自己的 isolate 来运行不受信任的代码。isolate 是实现水平扩展的最佳方式,而 Agent 恰恰需要水平扩展。

去年,我们赋予了 isolate 启动自身容器 sandbox 的能力。从第一天起,Cloudflare 的架构设计就是让 Agent harness 运行在 isolate 中——也就是 Durable Object 中——并根据需要将挂载的容器作为工具调用。这样一来,只有在必要时才会使用更重型的计算原语,从而优化性能和成本。Durable Objects 可以近乎无限地水平扩展,而挂载的容器则让它能够通过垂直扩展执行任何任务。我们自己就是这样构建 Agent 的,也看到客户通过这种方式打造出了令人惊叹的产品。

但当我们审视构建 Agent 时必须使用多种底层计算原语——isolate 和容器——以及客户和开发者不得不在用户空间中自行组合它们的现状时,我们认为还可以做得更好。我们相信,可以提供一种更简单的抽象。
因此,我们首先将 @cloudflare/computer 作为开源库发布并启动这项实验,希望与那些不断突破大规模 Agent 运行边界的客户共同探索和学习。
跨 isolate 与容器的共享文件系统
@cloudflare/computer 软件包从一个简单的设想出发:如果我们为 Agent 提供一个预先准备好的文件系统,通过声明式方式定义其中的内容,包含当前任务所需的一切;同时再提供一组可以操作这些文件的执行环境,而每种环境在速度、能力和成本方面各有优劣,结果会怎样?
事实证明,如今的 Agent 在为当前任务选择合适环境方面,能力强得出人意料。只需要操作文件、处理数据或管理 git 仓库的任务,可以在 isolate 内运行。需要 Linux、npm 或原生二进制文件的命令,则可以在容器中运行。两者操作的都是同一批文件,并且这些文件会与源文件系统保持同步。

@cloudflare/computer 软件包提供了一个持久化文件系统,可用于 git 仓库、存储桶或你选择的任何文件。它提供了一组工具,让你能够通过 Code Mode 或 bash 命令读取、写入和编辑文件。所有操作都会受到权限控制,并接受审计和观测,让你既能精细控制允许 Agent 执行哪些更改,也能获得一条清晰的操作记录,了解 Agent 做过什么。
你可以在任意 Durable Object 上实例化一个 @cloudflare/computer workspace,为其提供虚拟文件系统和执行 runtime。
通过 npm 安装:
npm install @cloudflare/computer
它的主要使用场景,是将这套文件系统和工具提供给 Agent。例如,下面展示了如何在由 @cloudflare/think 驱动、用于分类处理 bug 报告的 Agent 上实例化 workspace。
import { Think } from "@cloudflare/think";
import { Workspace, type DurableObjectStorageLike } from "@cloudflare/computer";
import { createWorkersAI } from "workers-ai-provider";
export class Agent extends Think {
override workspaceBash = false;
override workspace = new Workspace({
storage: this.ctx.storage,
useThink: true, // soon will not be needed
});
override getModel() {
return createWorkersAI({ binding: this.env.AI })("@cf/zai-org/glm-5.2");
}
override getSystemPrompt() {
return `
You are a bug triage agent.
Use the project in /workspace/repo to reproduce the bug, inspect the
code, make a focused fix when it is safe, and run verification. In your
final answer, include what you changed, which commands you ran, and
whether verification passed.`;
}
}
@cloudflare/computer 软件包内置了多种执行 backend,你也可以编写自己的 backend。下面的示例接入了一个 Cloudflare Container。
import { Think } from "@cloudflare/think";
import { Workspace, WorkspaceProxy } from "@cloudflare/computer";
import {
CloudflareContainerBackend,
withWorkspaceContainer,
} from "@cloudflare/computer/backends/container";
export { WorkspaceProxy };
export class Agent extends withWorkspaceContainer(Think) {
override workspaceBash = false;
override workspace = new Workspace({
storage: this.ctx.storage,
useThink: true, // soon will not be needed
backends: [
new CloudflareContainerBackend({
container: () => this,
workspace: {
binding: "Agent",
id: this.ctx.id.toString(),
},
}),
],
});
/* Example code truncated for readability... */
}
将文件、git 和 shell 工具与产品专用工具一同暴露出来,以便回复已报告的 issue。
import { createAITools } from "@cloudflare/computer/tools";
import type { ToolSet } from "ai";
import { replyToIssue } from "./tools/github";
export class Agent extends withWorkspaceContainer(Think) {
override workspaceBash = false;
/* Example code truncated for readability... */
override getTools(): ToolSet {
return {
...createAITools({
workspace: this.workspace,
shell: {
defaultBackend: "container",
backends: {
container: {
description:
"Cloudflare Container with a full Linux userland: " +
"npm, node, package managers, test runners, and real " +
"binaries on $PATH. Use it when a task needs more than " +
"file manipulation.",
},
},
},
}),
replyToIssue,
};
}
}
模型可以在 Agent loop 中使用工具,但你也可以直接使用 workspace API,例如在向 Agent 提交 prompt 之前准备好运行环境。
export class Agent extends withWorkspaceContainer(Think) {
override workspaceBash = false;
/* Example code truncated for readability... */
async startTriage(report: { title: string; body: string; repoUrl: string }) {
await this.workspace.fs.mkdir("/workspace", { recursive: true });
await this.workspace.fs.writeFile(
"/workspace/BUG_REPORT.md",
`# ${report.title}\n\n${report.body}\n`,
);
await this.workspace.git.clone({
url: report.repoUrl,
dir: "/workspace/repo",
});
return this.submitMessages([
{
id: crypto.randomUUID(),
role: "user",
parts: [
{
type: "text",
text: [
`Triage this bug: ${report.title}`,
"The bug report is in /workspace/BUG_REPORT.md.",
"The repository is checked out at /workspace/repo.",
].join("\n"),
},
],
},
]);
}
}
你可以查看 workspace 仓库,了解如何使用不同 backend 和工具的更多示例,其中还包括一份从零开始构建 Agent 的分步教程。
@cloudflare/computer 的核心组件是 workspace。它是一个以 SQLite 为底层支撑的虚拟文件系统,可以从云存储、版本控制系统等多种来源填充内容。

workspace 支持可选的执行 runtime,允许代码针对该文件系统运行。所有 runtime 都支持同一个 exec(string, options) 接口。目前开箱即用地提供了两种 runtime,你也可以编写自己的实现:
-
基于 isolate 的 runtime 环境,使用
just-bash将 shell 代码转换成 JavaScript,并在 dynamic worker 中运行。在这里,文件系统可以直接通过 worker bindings 访问。 -
容器 runtime,使用 Cloudflare Containers 提供完整的 Linux 环境。在这里,文件系统通过用户空间文件系统(Filesystem in Userspace,FUSE)进行挂载,确保文件可供容器访问,同时将更改同步回去。
Workspace 类提供了直接操作文件系统的 API 接口,同时还提供了与 node:fs 兼容的封装,因此可以轻松地与第三方 JavaScript 库配合使用。

为了与 Agent 配合使用,我们提供了一套兼容 AI SDK 的工具集,其中包含最常用的工具:read、write、edit、ls 和 exec。exec 工具有些特殊,因为它可以跨多个 runtime 工作,并接受一个 backend 参数。工具描述会引导 Agent 为当前任务选择正确的 runtime:要么使用快速、低成本的 worker backend,要么使用功能完整的容器。在我们的测试中,frontier model 非常擅长做出正确选择,并且只在确有必要时才回退到使用容器。
在 Cloudflare,我们已经看到 Agent 完全依靠 isolate,使用现代工具构建、测试和部署 JavaScript 应用;为每一位客户生成量身定制的文档;以及使用 Web 浏览器执行复杂任务。
我们对 @cloudflare/computer 的目标,是为 Agent 提供这样一套 runtime:容器只需要承担不到 10% 的工作,而编码任务、音视频处理和文档创建都可以由 isolate 完成。
现在就来试用早期预览版吧——我们迫不及待想听到你的反馈。