La proliferación de agentes de IA en entornos de producción ha expuesto desafíos fundamentales de sistemas distribuidos que van más allá de la lógica del agente o el 'harness'. Problemas como la resiliencia ante interrupciones, la ejecución segura de código generado por modelos y la persistencia de estado en entornos efímeros son inherentes a la infraestructura subyacente. El Cloudflare Agents SDK emerge como una respuesta a esta necesidad, proporcionando primitivas de plataforma que desacoplan estas preocupaciones de la lógica del agente, permitiendo a los desarrolladores construir agentes robustos y escalables sin reinventar soluciones para la durabilidad y la seguridad.

Históricamente, la ejecución de tareas de larga duración en entornos serverless ha sido un desafío debido a la naturaleza efímera de las instancias de cómputo. La gestión del estado y la capacidad de reanudar el trabajo desde un punto de fallo son críticas para cualquier sistema distribuido que maneje procesos complejos. Los agentes de IA, con sus interacciones multi-paso y dependencias externas, exacerban estos problemas, requiriendo una capa de plataforma que abstraiga la complejidad de la durabilidad y la ejecución segura.

Arquitectura del Sistema

El stack propuesto para agentes de IA se compone de tres capas: Framework (ej. Flue), Harness (ej. Pi, Project Think) y Runtime/Platform (Cloudflare Agents SDK). El Agents SDK, la capa inferior, expone primitivas clave para la durabilidad y la ejecución segura. La ejecución duradera se logra mediante 'Fibers', un mecanismo de checkpointing nativo dentro de los Durable Objects de Cloudflare. 'runFiber()' registra el progreso en el almacenamiento SQLite del Durable Object y 'stash()' realiza checkpoints a medida que avanza la tarea. En caso de interrupción, 'onFiberRecovered()' entrega el último checkpoint, permitiendo al agente reanudar su ejecución.

Para la ejecución segura de código generado por LLM, el SDK utiliza '@cloudflare/codemode', que envuelve 'Dynamic Workers'. Cada snippet de código se ejecuta en un 'Worker isolate' fresco y efímero, con un tiempo de arranque de milisegundos y un modelo de costos eficiente, eliminando la necesidad de contenedores completos para cada llamada a herramienta. La persistencia del sistema de archivos se aborda con '@cloudflare/shell', que proporciona un sistema de archivos virtual duradero dentro del Durable Object, respaldado por SQLite. Esto permite operaciones de archivo tipadas (read, write, edit, search, grep, diff) sin el overhead de un sistema operativo completo. Finalmente, '@cloudflare/dynamic-workflows' permite a los agentes generar y ejecutar flujos de trabajo multi-paso duraderos en tiempo de ejecución, con persistencia de estado, reintentos automáticos y capacidad de esperar eventos externos, conectando el agente al motor de Workflows a través de RPC.

Flujo de Ejecución Duradera de Agente (Fiber)

  1. 1 Agente Inicia Tarea Llama a runFiber('my-task', async (ctx) => { ... })
  2. 2 Ejecuta Paso 1 await expensiveOperation()
  3. 3 Checkpoint ctx.stash({ step1 }) - Guarda estado en Durable Object SQLite
  4. 4 Ejecuta Paso 2 await anotherExpensiveOperation(step1)
  5. 5 Fallo/Interrupción Proceso del agente termina inesperadamente
  6. 6 Nueva Instancia Agente Se inicia una nueva instancia del agente
  7. 7 Recuperación onFiberRecovered(ctx) es invocado con el último snapshot
  8. 8 Reanudar Tarea Agente decide cómo continuar, posiblemente reejecutando desde el último check...
CapaTecnologíaJustificación
compute Cloudflare Durable Objects Provee cómputo con estado persistente y aislamiento para cada agente, sirviendo como la base para la ejecución duradera y el almacenamiento. vs Contenedores (Kubernetes, Fargate), Funciones Serverless sin estado (Lambda, Cloud Functions)
compute Cloudflare Workers / Dynamic Workers Ejecución de código generado por LLM en sandboxes ligeros y efímeros (isolates) para seguridad y eficiencia. vs Contenedores con sandboxing (gVisor, Firecracker), WebAssembly runtimes
storage SQLite (interno a Durable Objects) Almacenamiento persistente para el estado de los Fibers y el sistema de archivos virtual de los agentes. vs KV stores externos, Bases de datos relacionales externas
orchestration @cloudflare/dynamic-workflows Permite a los agentes generar y ejecutar flujos de trabajo multi-paso duraderos, con persistencia, reintentos y capacidad de esperar eventos externos. vs Orquestadores de flujos de trabajo externos (Cadence, Temporal), Lógica de reintentos y estado manual en el agente
security @cloudflare/codemode Proporciona un entorno de sandbox seguro para ejecutar código generado por LLM, utilizando Dynamic Workers para aislamiento. vs Contenedores con políticas de seguridad estrictas, Intérpretes de código con restricciones de seguridad
storage @cloudflare/shell Ofrece un sistema de archivos virtual duradero dentro del Durable Object, respaldado por SQLite, para operaciones de archivo ligeras.
import { Agent } from "agents";
import type { FiberRecoveryContext } from "agents";

class MyAgent extends Agent {
  async doWork() {
    await this.runFiber("my-task", async (ctx) => {
      const step1 = await expensiveOperation();
      ctx.stash({ step1 });
      const step2 = await anotherExpensiveOperation(step1);
      this.setState({ ...this.state, result: step2 });
    });
  }

  async onFiberRecovered(ctx: FiberRecoveryContext) {
    if (ctx.name !== "my-task") return;
    const { step1 } = (ctx.snapshot ?? {}) as { step1?: unknown };
    if (step1) {
      const step2 = await anotherExpensiveOperation(step1);
      this.setState({ ...this.state, result: step2 });
    }
  }
}
Demuestra cómo un agente utiliza runFiber para ejecutar una tarea con checkpoints y onFiberRecovered para reanudar la ejecución desde el último estado guardado tras una interrupción.
async () => {
  const files = await state.glob("src/**/*.ts");
  const results = [];
  for (const file of files) {
    const content = await state.readFile(file);
    const todos = content.match(/\/\/ TODO:.*/g);
    if (todos) results.push({ file, todos });
  }
  return results;
}
Ejemplo de cómo un agente interactúa con el sistema de archivos virtual proporcionado por @cloudflare/shell para realizar operaciones como buscar archivos y leer su contenido.

Fundamentos Teóricos

La necesidad de ejecución duradera y reanudable en sistemas distribuidos se remonta a los principios de tolerancia a fallos y recuperación. Conceptos como los 'logs de escritura anticipada' (Write-Ahead Logs - WAL) y los 'checkpointing' son fundamentales en sistemas de bases de datos y transaccionales para garantizar la atomicidad y la durabilidad frente a fallos. El uso de un log 'append-only' para la historia de ejecución del agente, como se describe en 'Durable Streams' de Flue, es una aplicación directa de estos principios, asegurando que el estado del agente no sea volátil y pueda reconstruirse o reanudarse desde cualquier punto. Esto resuena con los trabajos seminales sobre sistemas transaccionales y recuperación de fallos, como los descritos por Jim Gray en su 'The Transaction Concept: Virtues and Limitations' (1981).

La ejecución de código en un entorno aislado y seguro, como los 'Worker isolates' de Cloudflare, se alinea con los principios de 'sandboxing' y 'virtualización ligera' para la seguridad y el aislamiento de procesos. Aunque no es un concepto puramente académico, la evolución de las máquinas virtuales y los contenedores hacia entornos de ejecución más ligeros y efímeros, como los 'isolates', es una respuesta práctica a la necesidad de ejecutar código no confiable de manera eficiente, un problema que ha sido estudiado en el contexto de la seguridad de sistemas operativos y la ejecución de código de terceros en navegadores web.