septiembre de 2026 (hace 1 día)

Corre tus agentes eve en microVMs: el backend nativo para Vercel eve

E

Equipo Easybits


6 min de lectura


eve

eve es el framework open-source de agentes de Vercel: un agente es un directorio (instrucciones, tools, canales, schedules) y cada sesión es un run durable del Workflow SDK. Cuando el agente necesita ejecutar código, eve le pide una caja a un SandboxBackend. Trae varios (Docker, just-bash, microsandbox, Vercel Sandbox) y deja la interfaz pública para que alguien más escriba el suyo.

@easybits.cloud/eve-sandbox es ese backend para EasyBits: cubre el contrato completo y cada sesión de tu agente corre en su propia microVM Firecracker, en tu cuenta, cobrada con tu plan en pesos. Cambias una línea y el agente no se entera.

1. Instala y apunta el sandbox

bash
ts

2. eve start: el bootstrap se vuelve un snapshot

Un molde y las cajas que salen de él

eve build sólo compila (~10 s). Es en el primer eve start cuando eve llama prewarm(): levantamos una caja node, escribimos tus seed files, corremos tu bootstrap() y congelamos el resultado como snapshot copy-on-write con nombre eve:<templateKey>:<hash> (log: easybits: snapshot snap_… listo). El siguiente arranque lo encuentra y no reconstruye nada (reusado): medido, ~3 s contra ~11 s la primera vez.

Cuando llega el primer mensaje, create() hace un fork de ese snapshot (~7 s). Entre turnos la caja duerme con snapshot de la VM completa y despierta en ~1 s; eve la reabre por sandboxId con el disco tal cual lo dejó. stop() y shutdown() son suspend; delete() destruye. run() y spawn() corren en login shell con stdout y stderr en streams, y kill() señala al grupo de procesos entero.

3. Política de red por caja

Una compuerta que deja pasar sólo algunos haces

ts

Sólo a los dominios que tú autorices para esa caja, o a ninguno ("deny-all"). Lo cambias en caliente por API, se conserva al dormir y despertar, y si un dominio no está en la lista la conexión simplemente no sale. Es el mismo shape que usa eve en Vercel Sandbox, así que el código de tu agente no cambia. Lo único que no hacemos es transform (inyectar headers en el firewall): lanza un error claro en vez de fingir.

4. El servidor eve también cabe en una caja

Seis pasos: crear la caja, crear la app dentro con eve init (o clonar la tuya) e instalar los paquetes, elegir modelo, poner auth, arrancar el servidor, exponer el puerto. Primero la base y los headers:

bash

El scaffold de eve init apunta al AI Gateway de Vercel (model: "anthropic/claude-sonnet-5" como string) y sin AI_GATEWAY_API_KEY falla con "AI Gateway received no credentials". Fuera de Vercel el modelo va como objeto de cualquier proveedor del AI SDK, en agent/agent.ts:

ts

Y en producción eve exige auth en su API HTTP: con el scaffold (vercelOidc()/localDev()/placeholderAuth()) la URL pública responde 401 Authorization is required for this route. Edita agent/channels/eve.ts:

ts

Ahora sí, arrancar y exponer:

bash

EASYBITS_DB_URL ya viene en el entorno de la caja creada con POST /sandboxes; no hay que pasarlo en env. El template eve-nitro trae Node 24, pnpm y el CLI de eve; /data es persistente y la URL pública proxea /eve/ y /.well-known/workflow/ sin configurar nada — pero eve pide la auth que declaraste, así que cada llamada va con -u eve:$EVE_PASSWORD. El servidor corre ahí; cada agente que atiende recibe su propia microVM por el backend de arriba.

Hablarle son tres llamadas: crear la sesión devuelve { sessionId }, el stream es NDJSON de eventos (message.completed trae la respuesta) y el mismo id acepta más mensajes:

bash

5. El run sobrevive a la máquina

Por default eve guarda el estado de cada run en el disco del servidor. Con @easybits.cloud/eve-world ese estado (runs, pasos, hooks, streams y la cola de entregas) vive en EasyBits DB:

bash
ts

La máquina eve-nitro creada con POST /sandboxes nace con EASYBITS_DB_URL ya puesto: no hay token que pegar (una caja hecha por fork de snapshot no lo trae: pásalo en env, con el mismo valor si quieres retomar runs). Lo medimos en producción con un run de 8 pasos: destruimos la máquina a mitad del paso 2; una máquina nueva con la misma base arrancó, retomó en el paso 3 sin repetir los anteriores —59 segundos después de la muerte de la primera— y terminó el run. La sesión de chat también sobrevive: servidor destruido a las 21:05:07, otro desde snapshot respondiendo a las 21:06:22 con toda la memoria de la conversación. Es un port del world oficial de Postgres a libSQL, en la misma línea de versiones que eve.

Empieza hoy

Instala el paquete, cambia agent/sandbox.ts y corre eve build y eve start. La página del producto está en /eve, la referencia en /docs/eve.md y tu propio agente puede configurarlo con npx skills add https://www.easybits.cloud --skill easybits-eve. El plan gratuito incluye una caja.

Suscríbete a nuestro newsletter creando una cuenta

Recibe un resumen mensual de las mejores consejos de marketing y business para creadores, o de las actualizaciones de EasyBits.

Suscríbete  para recibir consejos  de marketing   y negocios   para creadores

Síguenos