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.
eve start: el bootstrap se vuelve un snapshot
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.

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.
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:
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:
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:
Ahora sí, arrancar y exponer:
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:
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:
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.
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.