您的智慧體需要一台電腦,而不是一個容器——推出 @cloudflare/computer

Matt CareyAron Carroll

閱讀時間:6 分鐘

這篇文章亦提供 EnglishDeutschEspañolEspañol (Latinoamérica)Français日本語한국어简体中文.

最強大的智慧體都有一個簡單的共同點:它們被賦予了一台專屬電腦來工作。

編碼智慧體就是這樣運作的。你給它們一個檔案系統、一個 shell、一些工具和套件,以及執行程式碼的能力。它們會檢查環境、進行修改、測試它們的成果,然後持續推進。這台電腦為模型提供了一種熟悉的方式,來對世界採取行動。在 Cloudflare,我們正全力打造合適的基元,用以建構最強大的智慧體。

今天,我們推出 @cloudflare/computer 的早期預覽版。@cloudflare/computer 套件提供了一個智慧體執行階段環境,其中哪些程式碼在隔離環境 (Isolate) 中執行,哪些程式碼在容器沙箱中執行,其具體細節和機制均由平台負責處理。每個智慧體都擁有一台電腦,而執行環境則針對效率與可擴展性進行最佳化。

我們相信,為了滿足自主式系統對運算資源日益增長的需求,我們需要尋求超越傳統容器化技術的解決方案。 

改變智慧體的建構方式

在過去六個月裡,我們見證了這個領域微妙的演變。今年初,啟動一個容器並在其中執行智慧體還是主流做法。近幾個月來,我們看到智能體框架 (harnesses) 迅速轉向透過工具提供沙箱化的程式碼執行環境。這將「雙手」(執行工作的沙箱)與「大腦」(智慧體迴圈)分離開來。

BLOG-3464_image6.png

無論框架在何處執行,為每個智慧體分配一個容器都面臨著挑戰——縱觀各大雲端廠商和超大規模雲端服務提供者,全球的運算資源遠遠不足以支撐每家公司為每一位使用者的智慧體都提供獨立的容器化運算環境。這種模式無法擴展以支援數億甚至數十億的並行智慧體。正因如此,業界對 CPU 運算資源(而不僅僅是 GPU 運算資源)產生了迫切甚至近乎恐慌的需求。

Cloudflare 長期以來一直致力於解決這個問題,並打造了更有效率的運算基元:Isolate(隔離環境)。早在近十年前推出 Cloudflare Workers 時,我們就做出了這個與主流觀點不同的押注;隨後在近六年前推出 Durable Objects 時,我們再次做出了同樣的決定。我們之所以選擇這條路徑,是因為 Isolate 具備無限水平擴展的能力。它們的啟動和銷毀速度極快,能夠在智慧體空閒時進入休眠狀態儲存智慧體自身的狀態,甚至能再衍生出自己的 Isolate 來執行不受信任的程式碼。Isolate 是水平擴展的最佳途徑,而水平擴展正是智慧體所需要的。

BLOG-3464_image3.png

去年,我們為 Isolate 提供了啟動自身容器沙箱的能力。從一開始,Cloudflare 的架構設計便是將智慧體框架放在 Isolate(也就是 Durable Object)中執行,並視需求呼叫附加的容器作為工具。這讓您可以在必要時才使用較重的運算基元,從而最佳化效能與成本。Durable Objects 可無限水平擴展,而附加的容器則能垂直擴展以執行各類任務。這是我們自己建構智慧體的方式,也看到客戶以此打造出令人驚豔的成果。

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

歡迎查看工作區儲存庫,取得更多關於使用不同後端與工具的範例,其中包含一份從零開始建構智慧體的逐步教學

運作方式

@cloudflare/computer 的核心元件是工作區。它是一個由 SQLite 支援的虛擬檔案系統,可以從各種來源(包括雲端儲存和原始碼控制)填充資料。

BLOG-3464_image7.png

工作區支援可選的執行環境,允許針對檔案系統執行程式碼。所有執行環境皆支援相同的 exec(string, options) 介面,目前提供了兩種內建環境(但您也可以自行編寫):

  • 基於 Isolate 的執行環境:使用 just-bash 將 Shell 程式碼轉譯為 JavaScript,並在動態 Worker 中執行。在此模式下,檔案系統可直接透過 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 應用程式(搭配現代工具鏈)、為每位客戶產生客製化文件,甚至使用 Web 瀏覽器執行複雜任務。

我們推出 @cloudflare/computer 的目標,是為智慧體提供一種執行階段環境,使其僅需在不到 10% 的工作負載中使用容器,而將編碼任務、音訊/影片處理及文件建立等工作完全交由 Isolate 處理。 

今天就來試用早期預覽版吧——我們迫不及待想聽到您的想法。