El problema fundamental que Cloudflare Computer aborda es la escalabilidad y eficiencia de los sistemas de agentes distribuidos. A medida que la demanda de agentes de IA crece exponencialmente, la práctica común de asignar un contenedor completo a cada agente se vuelve insostenible debido a la escasez de recursos computacionales y los altos costos operativos. La tesis es que una abstracción de 'computadora' que orquesta dinámicamente entornos de ejecución ligeros (isolates) y pesados (contenedores) sobre un sistema de archivos compartido puede proporcionar la escalabilidad horizontal necesaria para millones de agentes, optimizando el rendimiento y el costo.
Históricamente, la virtualización ha evolucionado desde máquinas virtuales completas hasta contenedores ligeros para mejorar la densidad y el aislamiento. Sin embargo, incluso los contenedores tienen una sobrecarga de inicio y recursos que no escala para la granularidad de 'un contenedor por agente'. Cloudflare, con su experiencia en Workers y Durable Objects, ha apostado por los isolates como una primitiva de computación más eficiente, que ahora se extiende para integrar contenedores de forma selectiva, ofreciendo un modelo de computación híbrido que se adapta a las necesidades de los agentes modernos.
Arquitectura del Sistema
La arquitectura de Cloudflare Computer se centra en el concepto de un 'Workspace', que es un sistema de archivos virtual persistente respaldado por SQLite. Este Workspace puede ser poblado desde diversas fuentes, como repositorios Git o buckets de almacenamiento. La clave es que este sistema de archivos es compartido y sincronizado entre los diferentes entornos de ejecución.
El Workspace soporta múltiples 'backends' de ejecución, cada uno con sus propias características de velocidad, capacidad y costo. Actualmente, se proporcionan dos tipos principales: un entorno basado en isolates y un entorno basado en contenedores. El backend basado en isolates utiliza 'just-bash' para traducir comandos de shell a JavaScript, ejecutándolos en un Worker dinámico. Aquí, el sistema de archivos está directamente disponible a través de los bindings del Worker. El backend basado en contenedores utiliza Cloudflare Containers para proporcionar un entorno Linux completo. En este caso, el sistema de archivos se expone al contenedor a través de un montaje FUSE (Filesystem in Userspace), asegurando que los archivos estén disponibles para el contenedor y que los cambios se sincronicen de vuelta al Workspace.
El componente Workspace proporciona una API para manipular el sistema de archivos directamente y un wrapper compatible con node:fs. Para la integración con agentes de IA, se ofrece un toolkit compatible con AI SDK que expone herramientas como read, write, edit, ls y exec. La herramienta exec es particularmente importante, ya que puede dirigir la ejecución a un backend específico (isolate o contenedor) basándose en un argumento backend, permitiendo que el modelo de IA elija el entorno más adecuado para la tarea.
Flujo de Ejecución de Tareas del Agente
- 1 Agente (Durable Object) Instancia del agente recibe una tarea.
- 2 Workspace (SQLite) El agente interactúa con el sistema de archivos virtual del Workspace.
- 3 Modelo de IA El modelo de IA decide qué herramienta y backend usar para la tarea.
- 4 Herramienta 'exec' La herramienta 'exec' del Workspace recibe el comando y el backend elegido.
- 5 Backend Isolate Si es ligero, se ejecuta en un Worker (just-bash, JS).
- 6 Backend Contenedor Si es pesado, se ejecuta en un Cloudflare Container (Linux, FUSE).
- 7 Sistema de Archivos El backend opera sobre los archivos del Workspace, sincronizando cambios.
- 8 Agente (Durable Object) El agente recibe el resultado y continúa el ciclo.
| Capa | Tecnología | Justificación |
|---|---|---|
| compute | Cloudflare Workers (Isolates) | Entorno de ejecución ligero y de bajo costo para tareas que no requieren un sistema operativo completo. Proporciona escalabilidad horizontal masiva y arranque rápido. vs AWS Lambda, Google Cloud Functions, Azure Functions |
| compute | Cloudflare Durable Objects | Proporciona una instancia única y con estado garantizado de un objeto distribuido, esencial para mantener el estado del agente y el Workspace. Actúa como el 'cerebro' del agente. vs Bases de datos distribuidas con transacciones ACID, Servicios de coordinación como ZooKeeper/etcd |
| compute | Cloudflare Containers | Entorno de ejecución pesado con un sistema operativo Linux completo, utilizado para tareas que requieren herramientas nativas, gestores de paquetes o binarios específicos. Se invoca bajo demanda. vs Docker containers, Kubernetes Pods, AWS Fargate |
| storage | SQLite | Backend para el sistema de archivos virtual del Workspace, proporcionando persistencia y consistencia para los datos del agente. vs RocksDB, LevelDB, otros motores de base de datos embebidos |
| networking | FUSE (Filesystem in Userspace) | Permite que el sistema de archivos virtual del Workspace sea montado y accedido como un sistema de archivos local dentro del entorno del contenedor, facilitando la sincronización de archivos. vs NFS, SMB, otros protocolos de sistemas de archivos distribuidos |
| data-processing | just-bash | Traductor de comandos de shell a JavaScript, permitiendo la ejecución de scripts bash básicos dentro del entorno de isolate. vs Implementaciones de shell en JS, WebAssembly para shell |
Trade-offs
Ganancias
- ▲▲ Escalabilidad horizontal de agentes
- ▲ Eficiencia de costos
- ▲ Latencia de inicio de tareas ligeras
- ▲ Flexibilidad de entornos de ejecución
Costes
- △ Complejidad de la abstracción subyacente
- △ Overhead de FUSE para contenedores
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,
backends: [
new CloudflareContainerBackend({
container: () => this,
workspace: {
binding: "Agent",
id: this.ctx.id.toString(),
},
}),
],
});
}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"),
},
],
},
]);
}
}Fundamentos Teóricos
Este enfoque resuena con principios de sistemas operativos distribuidos y virtualización. La idea de un sistema de archivos virtual compartido que abstrae la complejidad del almacenamiento subyacente y permite el acceso desde diferentes entornos de ejecución se alinea con conceptos de sistemas de archivos distribuidos como NFS o AFS, aunque implementado a una escala y granularidad mucho mayores. La persistencia del estado del agente a través de Durable Objects, que son objetos distribuidos con estado garantizado, se basa en principios de consenso distribuido y replicación, similares a los que se encuentran en algoritmos como Paxos o Raft, aunque Cloudflare ha desarrollado su propia implementación de consenso para Durable Objects.
La distinción entre entornos de ejecución ligeros (isolates) y pesados (contenedores) para optimizar el uso de recursos es una aplicación práctica del principio de 'granularidad de computación' y 'elasticidad elástica'. Los isolates, que son esencialmente sandboxes de JavaScript o WebAssembly, ofrecen un aislamiento de procesos más ligero que los contenedores, similar a la ejecución de funciones serverless, pero con la capacidad de mantener estado a través de Durable Objects. Esto permite un escalado horizontal masivo y un inicio casi instantáneo, un concepto explorado en papers sobre 'cold start' y 'resource pooling' en arquitecturas serverless. La combinación de ambos optimiza el trade-off entre latencia de inicio, aislamiento y capacidad computacional, un desafío constante en la arquitectura de sistemas distribuidos.