에이전트에는 컨테이너가 아니라 컴퓨터가 필요합니다 — @cloudflare/computer를 소개합니다

Matt Carey 및 Aron Carroll

8분 읽기

이 포스트는 다음 언어로도 제공됩니다 English, Deutsch, Español, Español (Latinoamérica), Français, 日本語, 繁體中文 및 简体中文.

가장 뛰어난 에이전트에는 한 가지 공통점이 있습니다. 바로 각각에게 전용 컴퓨터가 제공된다는 점입니다.

코딩 에이전트는 이러한 방식으로 동작합니다. 파일 시스템, 셸, 도구, 패키지, 그리고 코드를 실행할 수 있는 기능을 제공하면 에이전트는 환경을 검사하고, 변경 사항을 적용하며, 작업 결과를 테스트한 뒤 계속해서 작업을 수행합니다. 컴퓨터는 모델이 현실 세계에서 작업을 수행할 수 있는 익숙한 환경을 제공합니다. Cloudflare는 가장 뛰어난 에이전트를 구축할 수 있는 올바른 기반 요소를 제공하기 위해 노력하고 있습니다.

오늘 우리는 @cloudflare/computer의 초기 프리뷰를 공개합니다. @cloudflare/computer 패키지는 어떤 코드를 Isolate에서 실행하고 어떤 코드를 컨테이너 샌드박스에서 실행할지에 대한 세부 사항과 실행 메커니즘을 플랫폼이 처리하는 에이전트 런타임을 제공합니다. 각 에이전트에는 전용 컴퓨터가 제공되며, 런타임은 효율성과 확장성을 최적화합니다.

우리는 에이전트 시스템이 요구하는 컴퓨팅 수요가 계속 증가하는 상황에서, 기존의 컨테이너화 방식을 넘어서는 새로운 접근 방식이 필요하다고 믿습니다. 

에이전트를 구축하는 방식의 변화

지난 6개월 동안 우리는 이러한 흐름이 조금씩 변화하는 모습을 목격했습니다. 올해 초만 해도 컨테이너를 생성하고 그 안에서 에이전트를 실행하는 것이 일반적인 방식이었습니다. 그러나 최근 몇 달 사이에는 에이전트 하네스가 도구를 통해 샌드박스 환경에서 코드를 실행하는 방식으로 빠르게 전환되고 있습니다. 이를 통해 손(작업이 수행되는 샌드박스)과 두뇌(에이전트 루프)를 분리할 수 있게 되었습니다.

BLOG-3464_image6.png

에이전트 하네스가 어디에서 실행되든, 모든 에이전트에 컨테이너를 하나씩 제공하는 방식에는 근본적인 문제가 있습니다. 어떤 클라우드나 하이퍼스케일러를 보더라도, 모든 기업이 모든 사용자의 에이전트에 각각 전용 컨테이너 기반 컴퓨팅 환경을 제공할 만큼 충분한 컴퓨팅 리소스는 존재하지 않습니다. 이러한 방식으로는 수억, 나아가 수십억 개의 에이전트가 동시에 실행되는 환경을 감당할 수 없습니다. 이것이 업계에서 GPU 컴퓨팅뿐 아니라 CPU 컴퓨팅에 대해서도 절박한 수요가 발생하는 이유입니다.

Cloudflare는 이 문제를 오랫동안 해결하기 위해 더 효율적인 컴퓨팅 기반 요소인 Isolate를 개발해 왔습니다. 우리는 약 10년 전 Cloudflare Workers를 출시하면서 이러한 '합의 밖의 선택'을 했습니다. 약 6년 전 Durable Objects를 출시했을 때도 같은 선택을 했습니다. 우리가 이러한 선택을 한 이유는 Isolate가 수평 확장을 사실상 무한대로 지원하기 때문입니다. Isolate는 매우 빠르게 생성되고 종료됩니다. 에이전트가 유휴 상태일 때는 최대 절전 상태로 전환할 수 있고, 에이전트 자체의 상태를 저장할 수 있으며, 신뢰할 수 없는 코드를 실행하기 위해 자체적으로 새로운 Isolate를 생성할 수도 있습니다. Isolate는 수평 확장을 위한 최적의 방식이며, 바로 이러한 수평 확장성이 에이전트에 반드시 필요한 요소입니다.

BLOG-3464_image3.png

지난해 우리는 Isolate가 자체적으로 컨테이너 샌드박스를 생성할 수 있는 기능을 추가했습니다. 처음부터 Cloudflare의 아키텍처는 에이전트 아네스를 Isolate(즉, Durable Object)에서 실행하고, 필요할 때만 연결된 컨테이너를 도구로 호출하도록 설계되었습니다. 이를 통해 더 높은 컴퓨팅 성능이 필요한 리소스는 필요한 경우에만 사용할 수 있으므로 성능과 비용을 모두 최적화할 수 있습니다. Durable Objects는 사실상 무한한 수평 확장을 지원하며, 연결된 컨테이너는 이를 수직으로 확장해 어떤 작업이든 수행할 수 있도록 합니다. 이것이 Cloudflare가 직접 에이전트를 구축하는 방식이며, 고객들 역시 이러한 방식으로 놀라운 서비스를 구축하는 모습을 확인하고 있습니다.

BLOG-3464_image8.png

하지만 에이전트를 구축하려면 Isolate와 컨테이너처럼 여러 컴퓨팅 기반 요소가 필요하고, 고객과 개발자가 이를 사용자 공간에서 직접 조합해야 하는 현재 방식을 살펴보면서, 우리는 더 나은 방법이 있다고 생각했습니다. 우리는 더 단순한 추상화 계층을 제공할 수 있다고 믿습니다.

그래서 규모에 맞게 에이전트를 실행하는 한계를 넓혀 가고 있는 고객들과 함께 배우기 위해, @cloudflare/computer를 오픈 소스 라이브러리로 공개하는 실험을 시작합니다.

Isolate와 컨테이너가 공유하는 파일 시스템

@cloudflare/computer 패키지는 단순한 아이디어에서 출발합니다. 작업에 필요한 모든 요소가 포함된 파일 시스템을 선언적으로 정의해 에이전트에 제공하고, 그 파일을 처리할 수 있는 여러 실행 환경을 함께 제공한다면 어떨까요? 각 실행 환경은 속도, 기능, 비용 측면에서 저마다의 장단점을 가집니다.

흥미롭게도 오늘날의 에이전트는 작업에 가장 적합한 실행 환경을 선택하는 데 예상보다 뛰어난 능력을 보여줍니다. 파일을 조작하거나 데이터를 처리하거나 Git 저장소를 관리하는 작업은 Isolate에서 실행할 수 있습니다. 반면 Linux, npm, 또는 네이티브 바이너리가 필요한 명령은 컨테이너에서 실행할 수 있습니다. 두 환경 모두 원본 파일 시스템과 동기화되는 동일한 파일을 기반으로 작업합니다.

BLOG-3464_image2.png

@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, 셸 도구를 제품별 도구와 함께 제공하세요.

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"),
          },
        ],
      },
    ]);
  }
}

다양한 백엔드와 도구를 사용하는 방법에 대한 더 많은 예시와 에이전트를 처음부터 구축하는 과정을 안내하는 단계별 튜토리얼 워크스페이스 저장소에서 확인하세요.

작동 방식

@cloudflare/computer의 핵심 구성 요소는 워크스페이스입니다. 워크스페이스는 SQLite를 기반으로 하는 가상 파일 시스템으로, 클라우드 스토리지와 소스 제어 시스템을 비롯한 다양한 소스에서 데이터를 가져와 구성할 수 있습니다.

BLOG-3464_image7.png

워크스페이스는 선택적으로 사용할 수 있는 실행 런타임을 지원하며, 이를 통해 파일 시스템을 대상으로 코드를 실행할 수 있습니다. 모든 런타임은 동일한 exec(string, options) 인터페이스를 지원하며, 현재는 기본적으로 다음 두 가지 런타임이 제공됩니다(직접 구현할 수도 있습니다).

  • 동적 Worker에서 실행되는, just-bash를 사용해 셸 코드를 JavaScript로 변환하는 Isolate 기반 실행 런타임 환경입니다. 여기에서는 파일 시스템을 Worker 바인딩을 통해 직접 사용할 수 있습니다.
  • Cloudflare Containers를 사용해 완전한 Linux 환경을 제공하는 컨테이너 런타임입니다. 여기에서는 Filesystem in Userspace(FUSE) 마운트를 통해 파일 시스템이 제공되며, 이를 통해 컨테이너에서 파일에 액세스할 수 있고 변경 사항도 원본 파일 시스템에 다시 동기화됩니다.

Workspace 클래스는 파일 시스템을 직접 조작할 수 있는 API 인터페이스를 제공하며, node:fs와 호환되는 래퍼도 함께 제공하므로 서드파티 JavaScript 라이브러리와도 쉽게 사용할 수 있습니다.

image4.png

에이전트에서 사용할 수 있도록 AI SDK와 호환되는 툴킷도 제공합니다. 이 툴킷에는 read, write, edit, ls, exec 등 가장 일반적으로 사용되는 도구가 포함되어 있습니다. exec 도구는 backend 인수를 사용해 여러 실행 런타임에서 동작한다는 점에서 조금 특별합니다. 도구 설명은 에이전트가 현재 작업에 적합한 실행 환경을 선택할 수 있도록 안내합니다. 즉, 빠르고 비용 효율적인 Worker 백엔드를 사용할지, 아니면 모든 기능을 갖춘 컨테이너를 사용할지를 결정하도록 합니다. 테스트 결과, 프런티어 모델들은 이러한 판단을 매우 정확하게 수행하며, 컨테이너가 필요한 경우에만 이를 사용하는 것으로 확인되었습니다.

다음 단계

Cloudflare에서는 이미 에이전트가 Isolate만 사용해 최신 도구로 JavaScript 애플리케이션을 빌드, 테스트 및 배포하고, 고객별 맞춤 문서를 생성하며, 웹 브라우저를 사용해 복잡한 작업을 수행하는 모습을 확인하고 있습니다.

@cloudflare/computer를 통해 우리의 목표는 에이전트가 작업의 10% 미만에서만 컨테이너를 필요로 하는 런타임을 제공하는 것입니다. 이를 통해 코딩 작업은 물론 오디오·비디오 처리와 문서 작성까지 모두 Isolate에서 수행할 수 있도록 하는 것을 목표로 합니다. 

지금 바로 초기 프리뷰를 사용해 보세요. 여러분의 의견을 들려주시기를 기대합니다.