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

无论 harness 运行在哪里,给每个智能体一个容器都会带来挑战:放眼所有云、所有超大规模云厂商,世界上的算力远远不足以让每家公司为其用户的每个智能体都提供独立的容器化计算环境。这无法扩展到数亿乃至数十亿个并发智能体。这也是业界对 CPU 算力(而不仅是 GPU 算力)有着迫切、恐慌般需求的原因。
在 Cloudflare,我们长期以来一直在研究这个问题,创造了一种更高效的计算原语:isolate。将近 10 年前我们推出 Cloudflare Workers 时,就下了这个非主流的赌注。将近六年前我们推出 Durable Objects 时,又下了一次。我们之所以下这个赌注,是因为 isolate 可以无限水平扩展。它们的启动和销毁都极其迅速。当智能体空闲时,它们可以休眠,可以存储智能体自身的状态,甚至可以启动自己的 isolate 来运行不受信任的代码。isolate 是水平扩展的最佳方式,而水平扩展正是智能体所需要的。

去年,我们赋予 isolate 启动自己的容器沙箱的能力。从第一天起,Cloudflare 的架构就被设计为在 isolate(Durable Object)中运行智能体 harness,并按需把附属的容器当作工具来调用。这让你只在必要时才使用更重的计算原语,从而优化性能和成本。Durable Objects 可以无限水平扩展,而附属容器则让它能够垂直扩展以完成任何任务。这就是我们自己构建智能体的方式,我们也看到客户用这种方式构建出了令人惊叹的成果。

但是,当我们审视构建智能体需要多种底层计算原语(isolate 和容器),而客户和开发者又需要在用户空间自行组合它们这一现状时,我们认为可以做得更好。我们认为可以提供一个更简单的抽象。
因此,我们以开源库的形式发布 @cloudflare/computer,开启这项实验,与那些正在突破大规模运行智能体边界的客户一起学习。
跨 isolate 与容器的共享文件系统
@cloudflare/computer 包从一个简单的前提出发:如果我们给智能体一个预先准备好的、以声明方式定义的文件系统,其中包含手头任务所需的一切,再配上若干可对这些文件进行操作的执行环境,每种环境在速度、能力和成本上各有利弊,会怎么样?
事实证明,如今的智能体出人意料地擅长为手头的任务选择合适的环境。只需要操作文件、处理数据或管理 git 仓库的任务,可以在 isolate 中运行。需要 Linux、npm 或原生二进制文件的命令,可以在容器中运行。两者操作的都是同一批文件,这些文件与源文件系统保持同步。

@cloudflare/computer 包提供了一个持久化的文件系统,你可以将它用于 git 仓库、存储桶或你选择的任何文件。它提供的工具让你可以使用 Code Mode 或 bash 命令来读取、写入和编辑文件。所有操作都经过把关、审计和观测,让你既能对智能体被允许执行的变更进行细粒度控制,也能留下清晰的记录,说明智能体做了什么。
如何使用
@cloudflare/computer 工作空间的实例可以在任何 Durable Object 上创建,以提供虚拟文件系统和执行运行时。
通过 npm 安装:
npm install @cloudflare/computer
主要用例是为智能体提供该文件系统和工具。例如,下面展示了如何在一个由 @cloudflare/think 驱动、用于分诊缺陷报告的智能体上创建工作空间。
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 支撑的虚拟文件系统,可以从云存储和源代码管理等多种来源填充内容。

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

针对智能体,我们提供了一套兼容 AI SDK 的工具包,包含最常用的工具:read、write、edit、ls 和 exec。其中 exec 工具有些特别,它可以跨运行时工作,接受一个 backend 参数。工具描述会引导智能体为手头的任务选择正确的运行时:要么是快速、廉价的 worker 后端,要么是功能完备的容器。在我们的测试中,前沿模型很擅长做出正确的决定,只在需要时才退回到使用容器。
下一步
在 Cloudflare,我们已经看到智能体完全使用 isolate,借助现代工具链来构建、测试和部署 JavaScript 应用,为每位客户生成定制文档,并使用网页浏览器执行复杂任务。
我们为 @cloudflare/computer 设定的目标是,为智能体提供这样一种运行时:其工作中只有不到 10% 需要容器,而编码任务、音视频处理和文档创建都可以由 isolate 来处理。
欢迎立即试用早期预览版,我们迫不及待想听听你的想法。
