能力最强的智能体有一个简单的共同点:它们都拥有一台供自己工作的计算机。
编程智能体就是这样工作的。你为它们提供文件系统、Shell、工具、软件包,以及运行代码的能力。它们会检查环境、进行修改、测试成果,然后继续推进。计算机给了模型一种熟悉的方式来作用于现实世界。在 Cloudflare,我们正努力提供构建最强智能体所需的合适原语。
今天,我们发布 @cloudflare/computer 的早期预览版。 @cloudflare/computer 包提供了一个智能体运行时:代码究竟在隔离实例、容器沙箱还是 Web 浏览器中运行,其细节与机制均由平台处理。每个智能体都会获得一台计算机,运行时则针对效率和可扩展性进行优化。
我们相信,要满足智能体系统不断增长的算力需求,必须把目光投向传统容器化以外的解决方案。
改变构建智能体的方式
过去六个月里,我们看到这一叙事发生了微妙演变。年初时,启动一个容器并在其中运行智能体还是常态。最近几个月,智能体运行框架迅速转向通过工具提供沙箱化的代码执行。这将双手(完成工作的沙箱)与大脑(智能体循环)分离开来。

无论运行框架部署在哪里,为每个智能体配备一个容器都是一项挑战——纵观所有云厂商和超大规模云服务商,全球都远没有足够的算力,让每家公司都能为其每位用户的每个智能体提供独立的容器化计算环境。这无法扩展到数亿、继而数十亿个并发智能体。因此,行业对 CPU 算力的需求急迫到近乎恐慌,而不仅仅是对 GPU 算力的需求。
Cloudflare 长期以来一直在解决这个问题,并创造出一种效率更高的计算原语:隔离实例(isolate)。近 10 年前,我们推出 Cloudflare Workers 时,就曾作出这项有别于主流观点的押注;近 6 年前,我们推出 Durable Objects 时,又作出了同样的选择。我们之所以押注隔离实例,是因为它们可实现无限的水平扩展。它们启动和销毁的速度都极快;智能体闲置时可以休眠,可以存储智能体自身状态,甚至可以启动自己的隔离实例来运行不受信任的代码。隔离实例是实现水平扩展的最佳方式,而这正是智能体所需要的。

去年,我们赋予隔离实例启动自身容器沙箱的能力。从第一天起,Cloudflare 的架构就被设计为:在隔离实例(一个 Durable Object)中运行智能体框架,并按需将附属容器作为工具调用。这样一来,只有在需要时才会动用更重型的计算原语,从而优化性能与成本。Durable Objects 可无限水平扩展,附属容器则让它能够垂直扩展以完成任何任务。这也是我们构建智能体的方式,我们也看到客户正在用它打造出令人惊叹的东西。

不过,当我们看到构建智能体需要多种底层计算原语(隔离实例和容器),而客户和开发者又必须在用户空间自行组合它们时,我们认为可以做得更好。我们相信可以提供一种更简单的抽象。
因此,我们以开源库的形式发布 @cloudflare/computer,启动这项实验,并与那些不断突破大规模运行智能体边界的客户一起学习。
跨隔离实例与容器共享的文件系统
@cloudflare/computer 包从一个简单前提出发:如果我们向智能体提供一个已就绪、以声明式方式定义的文件系统,其中包含当前任务所需的一切,以及一组可操作这些文件的执行环境;每种环境在速度、能力和成本上各有优劣,会怎样?
事实证明,如今的智能体非常善于为当前任务选择正确的环境。只需操作文件、处理数据或管理 git 仓库的工作可以在隔离实例中运行;需要 Linux、npm 或原生二进制文件的命令则可以在容器中运行。两者操作的都是同一组与源文件系统保持同步的文件。

@cloudflare/computer 包提供了一个持久化文件系统,可用于 git 仓库、存储桶或任意你选择的文件。它提供的工具允许你通过 Code Mode 或 bash 命令读取、写入和编辑文件。所有操作都经过权限门控、审计和观测:你可以精细控制智能体被允许执行的变更,并获得一条清晰的审计轨迹,展示智能体实际做了什么。
如何使用
@cloudflare/computer 工作区的一个实例可以在任何 Durable Object 上实例化,提供虚拟文件系统和执行运行时。
可通过 npm 安装:
npm install @cloudflare/computer
它的主要用途是向智能体提供该文件系统和工具链。举例来说,下面展示如何在一个由 @cloudflare/think 驱动、用于分诊 Bug 报告的智能体上实例化工作区。
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 包内置了多个执行后端,你也可以自行编写。这里我们接入一个 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 工具与产品专用工具一同暴露出来,以便回复已报告的问题。
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,
};
}
}
模型可以在智能体循环中使用工具,但你也可以直接使用工作区 API,例如在提示智能体之前预先准备环境。
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 仓库,了解使用不同后端和工具的更多示例,其中包括一份从零构建智能体的分步教程。
工作原理
@cloudflare/computer 的核心是 workspace:一个由 SQLite 支撑的虚拟文件系统,可从云存储、源代码管理等多种来源填充内容。

workspace 支持可选的执行运行时,可让代码针对该文件系统运行。所有运行时都支持相同的接口 exec(string, options);目前开箱即用提供两种(但你也可以自行编写):
- 一个基于隔离实例的运行时环境:它使用 just-bash 将 Shell 代码转换为在 dynamic worker 中运行的 JavaScript。在这里,文件系统可通过 worker bindings 直接使用。
- 一个容器运行时:它使用 Cloudflare Containers 提供完整的 Linux 环境。在这里,文件系统通过 Filesystem in Userspace(FUSE)挂载提供,确保文件可供容器使用,且变更会同步回去。
Workspace 类提供了直接操作文件系统的 API 接口,以及一个兼容 node:fs 的包装器,因此可轻松与第三方 JavaScript 库一起使用。

面向智能体,我们提供了兼容 AI SDK 的工具包,包含最常用的 read、write、edit、ls 和 exec 工具。exec 工具有些特别:它能跨运行时工作,并接受 backend 参数。工具描述会引导智能体为当前任务选择正确的运行时——要么是快速、低成本的 worker 后端,要么是功能完整的容器。在我们的测试中,前沿模型很擅长作出正确决定,只在必要时才回退到使用容器。
接下来
在 Cloudflare,我们已经看到智能体仅使用隔离实例,便可借助现代工具链构建、测试和部署 JavaScript 应用,为每位客户生成量身定制的文档,并利用 Web 浏览器完成复杂任务。
我们对 @cloudflare/computer 的目标,是为智能体提供一种运行时:其工作中只有不到 10% 需要容器,而编码任务、音视频处理和文档创建都能由隔离实例完成。
现在就试用早期预览版吧——我们迫不及待想听到你的看法。