가장 유능한 에이전트들에게는 한 가지 공통점이 있다: 각자 자신만의 컴퓨터를 가지고 일한다는 것이다.
코딩 에이전트들이 이런 방식으로 동작한다. 파일시스템, 셸, 도구, 패키지, 그리고 코드를 실행할 수 있는 능력을 제공하면, 에이전트는 환경을 살펴보고, 변경하고, 작업 결과를 테스트하며 계속 진행한다. 컴퓨터는 모델에게 세상에 개입할 수 있는 익숙한 방법을 제공한다. Cloudflare에서는 가장 유능한 에이전트를 만들 수 있는 올바른 기본 요소(primitive)를 제공하기 위해 힘쓰고 있다.
오늘 우리는 @cloudflare/computer의 얼리 프리뷰를 소개한다. @cloudflare/computer 패키지는 코드가 아이솔레이트(isolate), 컨테이너 샌드박스, 웹 브라우저 중 어디서 실행될지에 대한 세부사항과 메커니즘을 플랫폼이 알아서 처리해주는 에이전트 런타임을 제공한다. 각 에이전트는 컴퓨터를 하나씩 받고, 런타임은 효율성과 확장성을 최적화한다.
우리는 에이전틱 시스템에 필요한 컴퓨팅 수요 증가에 대응하려면 전통적인 컨테이너화를 넘어서는 솔루션을 찾아야 한다고 믿는다.
에이전트를 만드는 방식의 변화
지난 6개월 동안 이 이야기는 미묘하게 진화해왔다. 연초에는 컨테이너를 띄우고 그 안에서 에이전트를 실행하는 것이 표준이었다. 최근 몇 달 사이에는 에이전트 하네스(harness)가 도구를 통해 샌드박스 코드 실행을 제공하는 방향으로 빠르게 이동하는 것을 목격했다. 이는 손(작업이 이뤄지는 샌드박스)과 뇌(에이전트 루프)를 분리한다.
하네스가 어디서 실행되든, 모든 에이전트에게 컨테이너를 제공하는 것은 하나의 도전 과제를 낳는다 — 모든 클라우드, 모든 하이퍼스케일러를 통틀어도 각 회사가 자사의 모든 사용자 에이전트에게 각자의 컨테이너화된 컴퓨팅 환경을 제공할 만큼의 컴퓨팅 자원은 세상에 존재하지 않는다. 이는 수억, 나아가 수십억에 달하는 동시 에이전트 규모로는 확장될 수 없다. 이것이 바로 GPU 컴퓨팅뿐 아니라 CPU 컴퓨팅에 대한 절박하고 다급한 업계 수요가 존재하는 이유다.
Cloudflare는 오랫동안 이 문제를 고민하며 더 효율적인 컴퓨팅 기본 요소인 아이솔레이트를 만들어왔다. 우리는 거의 10년 전 Cloudflare Workers를 소개하면서 이 파격적인 베팅을 했다. 그리고 거의 6년 전 Durable Objects를 소개하면서 다시 한번 같은 베팅을 했다. 이런 베팅을 한 이유는 아이솔레이트가 무한히 수평 확장 가능하기 때문이다. 아이솔레이트는 매우 빠르게 뜨고 사라지며, 에이전트가 유휴 상태일 때 하이버네이션할 수 있고, 에이전트 자신의 상태를 저장할 수 있으며, 신뢰할 수 없는 코드를 실행하기 위해 자기 자신의 아이솔레이트를 스핀업할 수도 있다. 아이솔레이트는 수평 확장을 위한 최선의 방법이며, 에이전트가 요구하는 것이 바로 수평 확장이다.
작년 우리는 아이솔레이트에게 자체 컨테이너 샌드박스를 스핀업할 수 있는 능력을 부여했다. 처음부터 Cloudflare의 아키텍처는 (Durable Object 안의) 아이솔레이트에서 에이전트 하네스를 실행하고, 필요할 때 도구로서 연결된 컨테이너를 호출하도록 설계되었다. 이를 통해 무거운 컴퓨팅 기본 요소는 정말 필요할 때만 활용해 성능과 비용을 최적화할 수 있다. Durable Objects는 무한히 수평 확장되고, 연결된 컨테이너는 어떤 작업이든 수행할 수 있도록 수직으로 확장한다. 우리가 직접 에이전트를 만드는 방식이 바로 이것이며, 고객들도 이런 방식으로 놀라운 것들을 만들어내고 있다.
하지만 에이전트를 만들기 위해 여러 개의 기반 컴퓨팅 기본 요소(아이솔레이트와 컨테이너)가 필요하고, 고객과 개발자들이 유저스페이스에서 이들을 직접 조합해야 한다는 필요성을 살펴보면서, 우리는 더 잘할 수 있다고 생각했다. 우리는 더 단순한 추상화를 제공할 수 있다고 본다.
이것이 바로 우리가 @cloudflare/computer를 오픈소스 라이브러리로 출시하며 이 실험을 시작하는 이유다 — 대규모로 에이전트를 실행하는 한계를 밀어붙이고 있는 고객들과 함께 배우기 위해서다.
아이솔레이트와 컨테이너가 공유하는 파일시스템
@cloudflare/computer 패키지는 단순한 전제에서 출발한다: 만약 에이전트에게 해당 작업에 필요한 모든 것을 선언적으로 정의해 미리 채워넣은 파일시스템과, 속도·기능·비용 면에서 각각 장단점을 가진 여러 실행 환경 중에서 선택할 수 있는 능력을 준다면 어떨까?
알고보니 오늘날 에이전트들은 주어진 작업에 맞는 올바른 환경을 놀라울 만큼 잘 선택해낸다. 파일 조작, 데이터 처리, git 저장소 관리만 필요한 작업은 아이솔레이트 안에서 실행할 수 있다. Linux, npm, 네이티브 바이너리가 필요한 명령은 컨테이너 안에서 실행할 수 있다. 두 환경 모두 원본 파일시스템과 동기화된 동일한 파일들을 대상으로 작동한다.
@cloudflare/computer 패키지는 git 저장소, 스토리지 버킷, 혹은 원하는 어떤 파일과도 함께 사용할 수 있는 durable(영속적인) 파일시스템을 제공한다. Code Mode나 bash 명령을 사용해 파일을 읽고, 쓰고, 편집할 수 있는 도구를 제공한다. 모든 작업은 게이트(gate)를 거치고, 감사(audit)되고, 관찰(observe)되어, 에이전트가 수행할 수 있는 변경 사항에 대한 세밀한 통제권과 에이전트가 무엇을 했는지 보여주는 명확한 기록을 제공한다.
사용 방법
@cloudflare/computer 워크스페이스의 인스턴스는 어떤 Durable Object 위에서도 인스턴스화되어 가상 파일시스템과 실행 런타임을 제공할 수 있다.
npm을 통해 설치한다:
npm install @cloudflare/computer
주된 사용 사례는 에이전트에게 이 파일시스템과 도구를 제공하는 것이다. 예를 들어, 버그 리포트를 트리아지(triage)하기 위한 @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, 셸 도구를 제품 특화 도구와 함께 노출해 신고된 이슈에 답변하도록 한다.
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의 핵심은 워크스페이스다. 클라우드 스토리지와 소스 컨트롤을 비롯한 다양한 소스로부터 채워질 수 있는, SQLite 기반의 가상 파일시스템이다.
워크스페이스는 파일시스템에 대해 코드를 실행할 수 있는 선택적 실행 런타임을 지원한다. 모든 런타임은 동일한 exec(string, options) 인터페이스를 지원하며, 현재 두 가지가 기본 제공된다(직접 작성할 수도 있다):
- just-bash를 사용해 셸 코드를 JavaScript로 변환하고 dynamic worker 안에서 실행하는 아이솔레이트 기반 실행 환경. 여기서는 파일시스템이 워커 바인딩을 통해 직접 사용 가능하다.
- Cloudflare Containers를 사용해 완전한 Linux 환경을 제공하는 컨테이너 런타임. 여기서는 파일시스템이 FUSE(Filesystem in Userspace) 마운트를 통해 제공되어, 컨테이너에서 파일을 사용할 수 있고 변경 사항이 다시 동기화된다.
Workspace 클래스는 파일시스템을 직접 조작할 수 있는 API 인터페이스뿐 아니라, 서드파티 JavaScript 라이브러리와 쉽게 사용할 수 있도록 node:fs 호환 래퍼도 제공한다.
에이전트와 함께 사용하기 위해, 가장 흔히 쓰이는 도구들 — read, write, edit, ls, exec — 을 제공하는 AI SDK 호환 툴킷을 제공한다. exec 도구는 backend 인자를 받아 여러 런타임을 넘나들며 작동한다는 점에서 조금 특별하다. 도구 설명은 에이전트가 작업에 맞는 올바른 런타임 — 빠르고 저렴한 워커 백엔드인지, 완전한 기능을 갖춘 컨테이너인지 — 을 선택하도록 유도한다. 우리 테스트에서, 프론티어 모델들은 올바른 판단을 매우 잘 내렸고 필요할 때만 컨테이너로 폴백했다.
다음 단계
Cloudflare에서는 이미 에이전트들이 아이솔레이트만을 사용해 최신 툴링으로 JavaScript 애플리케이션을 빌드, 테스트, 배포하고, 각 고객에 맞춘 문서를 생성하고, 웹 브라우저를 사용해 복잡한 작업을 수행하는 모습을 목격하고 있다.
@cloudflare/computer의 목표는 에이전트에게, 컨테이너가 필요한 작업이 전체의 10% 미만이고 코딩 작업, 오디오/비디오 조작, 문서 생성 등은 모두 아이솔레이트로 처리할 수 있는 런타임을 제공하는 것이다.
오늘 얼리 프리뷰를 사용해보라 — 여러분의 의견을 기다리고 있다.
작성: Matt Carey, Aron Carroll (Cloudflare)
핵심 요약 (20줄)
- Cloudflare가 에이전트 전용 런타임 오픈소스 패키지 @cloudflare/computer의 얼리 프리뷰를 공개했다.
- 가장 유능한 에이전트는 자신만의 컴퓨터를 갖는다는 공통점이 있으며, 이는 파일시스템·셸·도구·코드 실행 능력을 뜻한다.
- @cloudflare/computer는 코드가 아이솔레이트, 컨테이너 샌드박스, 웹 브라우저 중 어디서 실행될지를 플랫폼이 자동으로 결정해준다.
- 모든 에이전트에게 컨테이너를 하나씩 배정하는 방식은 하이퍼스케일러 전체를 합쳐도 수십억 규모 동시 에이전트를 감당할 컴퓨팅 자원이 없어 확장 불가능하다.
- Cloudflare는 거의 10년 전 Workers, 6년 전 Durable Objects를 통해 무한 수평 확장이 가능한 아이솔레이트에 베팅해왔다.
- 아이솔레이트는 빠르게 뜨고 사라지며, 유휴 시 하이버네이션하고, 자체 상태를 저장하며, 필요시 자체 아이솔레이트를 스핀업할 수 있다.
- 작년부터 Cloudflare는 아이솔레이트(Durable Object 내부)에서 에이전트 하네스를 실행하고 필요할 때만 컨테이너를 도구로 호출하는 구조를 사용해왔다.
- @cloudflare/computer는 이 조합을 유저스페이스에서 직접 구현할 필요 없이 더 단순한 추상화로 제공한다.
- 핵심은 durable 파일시스템으로, git 저장소·스토리지 버킷 등 다양한 소스로 채울 수 있고 SQLite 기반으로 Durable Object 안에 저장된다.
- 파일 조작이나 git 작업처럼 가벼운 작업은 아이솔레이트에서, npm이나 네이티브 바이너리가 필요한 작업은 컨테이너에서 실행되며 두 환경은 같은 파일을 동기화해 공유한다.
- 아이솔레이트 런타임은 just-bash로 셸 명령을 JavaScript로 변환해 dynamic worker에서 실행하고, 워커 바인딩으로 파일시스템에 직접 접근한다.
- 컨테이너 런타임은 Cloudflare Containers 기반 완전한 Linux 환경을 제공하며, FUSE 마운트로 파일시스템을 동기화한다.
- read, write, edit, ls, exec 등 AI SDK 호환 툴킷이 기본 제공되며, exec는 backend 인자로 아이솔레이트/컨테이너를 선택할 수 있다.
- Cloudflare 테스트에서 프론티어 모델들은 작업에 맞는 런타임(빠른 워커 vs 완전한 컨테이너)을 스스로 잘 선택했다.
- 모든 파일 작업은 게이트·감사·관찰되어 에이전트가 수행한 변경을 세밀하게 통제하고 추적할 수 있다.
- npm install @cloudflare/computer로 설치하며, @cloudflare/think 기반 에이전트에 워크스페이스를 붙이는 예제 코드가 공개되어 있다.
- Cloudflare는 이미 아이솔레이트만으로 JS 앱 빌드·테스트·배포, 고객별 문서 생성, 브라우저 기반 복잡 작업을 수행하는 에이전트들을 운영 중이다.
- 목표는 전체 작업 중 컨테이너가 필요한 비중을 10% 미만으로 낮추고, 코딩·오디오/비디오 조작·문서 생성 등은 아이솔레이트로 처리하는 것이다.
- 패키지는 GitHub(cloudflare/computer)에서 오픈소스로 공개되어 있으며 처음부터 에이전트를 만드는 단계별 튜토리얼도 제공된다.
- 이번 발표는 Cloudflare의 "Agents Week" 콘텐츠 중 하나로, Matt Carey와 Aron Carroll이 작성했다.