Votre agent a besoin d’un ordinateur, pas d’un conteneur — découvrez @cloudflare/computer

Matt Carey et Aron Carroll

Lecture : 8 min.

Cet article est également disponible en English, Deutsch, Español, Español (Latinoamérica), 日本語, 한국어, 繁體中文 et 简体中文.

Les agents les plus performants ont tous un point commun très simple : ils disposent d’un ordinateur sur lequel s’exécuter.

Voici comment fonctionnent les agents de codage : vous leur fournissez un système de fichiers, un shell, des outils, des packages et la capacité d’exécuter du code. Ils inspectent l’environnement, effectuent des modifications, testent leur travail et poursuivent l’exécution de leur tâche. L’ordinateur offre au modèle un moyen familier d’interagir avec le monde. Chez Cloudflare, nous nous engageons à fournir les composantes fondamentales indispensables au développement des agents les plus performants.

Aujourd’hui, nous proposons un premier aperçu de @cloudflare/computer. Le package @cloudflare/computer fournit un environnement d’exécution d’agents dans lequel les détails et les mécanismes du code exécuté dans un isolat et du code exécuté dans une sandbox de conteneur sont gérés par la plateforme. Chaque agent dispose d’un ordinateur et l’environnement d’exécution est optimisé pour garantir l’efficacité et l’évolutivité.

Nous pensons que, pour répondre à la demande croissante de puissance de calcul des systèmes agentiques, nous devons réfléchir à des solutions qui vont au-delà de la conteneurisation traditionnelle. 

Transformer l’approche du développement d’agents

Au cours des six derniers mois, nous avons assisté à une évolution subtile de cet aspect. Au début de l’année, la pratique courante consistait à créer un conteneur et à exécuter un agent dans celui-ci. Ces derniers mois, nous avons assisté à une évolution rapide des cadres d’exécution (« harness ») d’agents, qui permettent désormais l’exécution de code en sandbox via différents outils. Cette approche permet de séparer les « mains » (l’environnement de test où est effectué le travail) du « cerveau » (la boucle de l’agent).

BLOG-3464_image6.png

Quel que soit l’environnement où cadre d’exécution est déployé, fournir un conteneur à chaque agent constitue un défi : entre tous les clouds et tous les hyperscalers, il n’y a, et de loin, pas assez de puissance de calcul dans le monde pour que chaque entreprise puisse fournir à chacun des agents de ses utilisateurs son propre environnement de calcul conteneurisé. Cette approche ne pourra simplement pas être adaptée à des centaines de millions, puis à des milliards d’agents déployés simultanément. C’est pourquoi le secteur manifeste un besoin urgent et pressant de puissance de calcul de processeurs (CPU), et pas uniquement de puissance de calcul de cartes graphiques (GPU).

Chez Cloudflare, nous nous employons depuis longtemps à résoudre ce problème, et nous avons élaboré une composante fondamentale de calcul plus efficace : les isolats. Nous avons fait ce pari, qui allait à l’encontre du consensus, il y a près de 10 ans, lorsque nous avons lancé Cloudflare Workers. Nous avons ensuite recommencé lorsque nous avons lancé Durable Objects, il y a près de six ans. Si nous avons fait ce pari, c’est parce que les isolats offrent une extensibilité horizontale illimitée. Ils peuvent être lancés et arrêtés avec une rapidité incroyable. Ils peuvent hiberner lorsque l’agent est inactif, stocker l’état de l’agent lui-même et même lancer leurs propres isolats pour exécuter du code non fiable. Les isolats incarnent la meilleure solution pour l’évolutivité horizontale, et c’est précisément cette évolutivité horizontale que nécessitent les agents.

BLOG-3464_image3.png

L’année dernière, nous avons donné aux isolats la capacité de créer leurs propres sandboxes en conteneur. Dès le départ, l’architecture de Cloudflare a été conçue pour déployer le cadre d’exécution d’agents dans l’isolat (dans une instance Durable Objects) et invoquer, à la demande, un conteneur associé en tant qu’outil. Cette approche vous permet d’exécuter des composantes fondamentales de calcul plus exigeantes en ressources uniquement en cas de nécessités seulement, et ainsi, d’optimiser à la fois les performances et les coûts. Les instances Durable Objects sont extensibles à l’infini horizontalement, et le conteneur associé leur permet de s’étendre verticalement afin d’accomplir n’importe quelle tâche. C’est ainsi que nous développons nous-mêmes nos agents, et nous voyons également nos clients réaliser des choses incroyables avec cette approche.

BLOG-3464_image8.png

Toutefois, nous avons examiné la nécessité de disposer d’une multitude de composantes fondamentales de calcul sous-jacentes pour développer des agents (isolats et conteneurs), ainsi que le besoin pour nos clients et nos développeurs de les associer eux-mêmes dans l’espace utilisateur, et nous pensons pouvoir faire mieux. Nous pensons pouvoir proposer une abstraction plus simple.

C’est pourquoi nous lançons cette expérience en proposant @cloudflare/computer sous forme de bibliothèque open source, afin d’apprendre aux côtés de nos clients qui repoussent les limites de l’exécution d’agents à grande échelle.

Un système de fichiers partagé entre isolats et conteneurs

Le package @cloudflare/computer part d’un postulat simple : et si nous fournissions à un agent un système de fichiers préconfiguré, défini de manière déclarative, contenant toutes les ressources nécessaires pour accomplir la tâche demandée, ainsi qu’un choix d’environnements d’exécution permettant de traiter ces fichiers, chacun présentant ses propres avantages et inconvénients en termes de rapidité de capacité et de coût ?

Il s’avère qu’aujourd’hui, les agents sont étonnamment capables de choisir l’environnement le mieux adapté à la tâche à accomplir. Une tâche consistant uniquement à manipuler des fichiers, à traiter des données ou à gérer un référentiel Git peut être exécutée dans un isolat. Une commande nécessitant Linux, npm ou un binaire natif peut être exécutée un conteneur. Les deux tâches sont exécutées sur les mêmes fichiers, qui sont synchronisés avec le système de fichiers source.

BLOG-3464_image2.png

Le package @cloudflare/computer fournit un système de fichiers durable que vous pouvez utiliser avec des référentiels Git, des compartiments de stockage ou tout autre fichier de votre choix. Il fournit des outils qui vous permettent de lire, d’écrire et de modifier des fichiers via Code Mode ou avec des commandes bash. Toutes les opérations comportent des contrôles d’accès et sont auditées et surveillées, offrant ainsi un contrôle extrêmement précis des modifications que l’agent est autorisé à effectuer et un historique écrit clair, détaillant les actions effectuées par l’agent.

Comment l’utiliser

Une instance d’espace de travail @cloudflare/computer peut être créée dans n’importe quelle instance Durable Objects pour fournir un système de fichiers virtuel et un environnement d’exécution.

Son installation se déroule via npm :

npm install @cloudflare/computer

Le scénario d’utilisation principal est la fourniture de ce système de fichiers et de ces outils à un agent. Par exemple, voici comment instancier l’espace de travail sur un agent utilisant @cloudflare/think, destiné à trier des rapports d’erreurs.

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.`;
  }
}

Plusieurs backends d’exécution sont fournis dans le package @cloudflare/computer, mais vous pouvez également créer le vôtre. Ici, nous connectons une instance de 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... */
}

Nous mettons à disposition les outils de gestion de fichiers, Git et de shell, ainsi que les outils spécifiques au produit, afin de traiter les problèmes signalés.

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,
    };
  }
}

Le modèle peut utiliser des outils pendant la boucle de l’agent, mais vous pouvez également utiliser directement l’API de l’espace de travail, par exemple, pour préparer l’environnement avant de saisir un prompt pour l’agent.

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

Consultez le référentiel de l’espace de travail pour découvrir d’autres exemples d’utilisation des différents backends et outils, notamment un tutoriel étape par étape de création d’un agent.

Comment cela fonctionne

L’élément central de @cloudflare/computer est l’espace de travail. Il s’agit d’un système de fichiers virtuel reposant sur SQLite, qui peut être alimenté depuis différentes sources, notamment un stockage cloud et un système de contrôle de version.

BLOG-3464_image7.png

L’espace de travail prend en charge des environnements d’exécution optionnels qui permettent d’exécuter du code sur le système de fichiers. Tous les environnements d’exécution prennent en charge la même interface exec(string, options) et, à l’heure actuelle, deux environnements sont fournis prêts à l’emploi (toutefois, vous pouvez créer le vôtre) :

  • Un environnement d’exécution basé sur des isolats, qui utilise just-bash pour traduire le code shell en code JavaScript, s’exécute dans une instance Workers dynamique. Ici, le système de fichiers est accessible directement via les liaisons Workers.
  • Un environnement d’exécution de conteneurs qui utilise Cloudflare Containers pour fournir un environnement Linux complet. Ici, le système de fichiers est mis à disposition via un montage FUSE (Filesystem in Userspace), qui garantit que les fichiers sont accessibles au conteneur et que les modifications sont synchronisées en retour.

La classe Workspace fournit une interface API permettant de manipuler directement le système de fichiers, ainsi qu’un wrapper compatible avec node:fs, afin de faciliter son utilisation avec des bibliothèques JavaScript tierces.

image4.png

Pour une utilisation avec les agents, nous proposons une boîte à outils compatible avec le SDK IA, comprenant les outils les plus courants : read, write, edit, ls et exec. L’outil exec est un peu particulier : il fonctionne avec l’ensemble des environnements d’exécution en acceptant un argument backend. La description de l’outil aide l’agent à choisir l’environnement d’exécution adapté à la tâche à accomplir : un backend Workers, rapide et économique, ou le conteneur, doté de fonctionnalités complètes. Lors de nos tests, les modèles les plus performants se sont révélés très efficaces pour prendre la décision pertinente et ne recourir aux conteneurs qu’en cas de nécessité.

Et maintenant ?

Chez Cloudflare, nous voyons déjà des agents qui utilisent exclusivement des isolats pour développer, tester et déployer des applications JavaScript avec des outils modernes, générer une documentation sur mesure pour chacun de nos clients, et accéder à des navigateurs web pour exécuter des tâches complexes.

Notre objectif avec @cloudflare/computer est de proposer un agent avec un environnement d’exécution dans lequel un conteneur n’est nécessaire que pour moins de 10 % de son travail, et dans lequel les tâches de programmation, le traitement audio/vidéo et la création de documents peuvent toutes être gérées par des isolats. 

Découvrez dès aujourd’hui la version en avant-première. Nous sommes impatients de lire vos commentaires.