septiembre de 2026 (hace 1 día)

Run your eve agents in microVMs: the native sandbox backend for Vercel's eve

E

Easybits Team


6 min de lectura


eve

eve is Vercel's open-source agent framework: an agent is a directory (instructions, tools, channels, schedules) and every session is a durable Workflow SDK run. When the agent needs to execute code, eve asks a SandboxBackend for a box. It ships several (Docker, just-bash, microsandbox, Vercel Sandbox) and keeps the interface public so anyone can write their own.

@easybits.cloud/eve-sandbox is that backend for EasyBits: it covers the full contract, and every session of your agent runs in its own Firecracker microVM, in your account, billed on your plan in Mexican pesos. Change one line; the agent never notices.

1. Install and point the sandbox at it

bash
ts

2. eve start: your bootstrap becomes a snapshot

A mold and the boxes cast from it

eve build only compiles (~10 s). It is on the first eve start that eve calls prewarm(): we boot a node box, write your seed files, run your bootstrap() and freeze the result as a copy-on-write snapshot named eve:<templateKey>:<hash> (log: easybits: snapshot snap_… listo). The next start finds it and rebuilds nothing (reusado): measured, ~3 s versus ~11 s the first time.

When the first message arrives, create() forks that snapshot (~7 s). Between turns the box sleeps with a full-VM snapshot and wakes in ~1 s; eve reopens it by sandboxId with the disk exactly as it left it. stop() and shutdown() are suspend; delete() destroys. run() and spawn() execute in a login shell with stdout and stderr as streams, and kill() signals the whole process group.

3. Per-box network policy

A gate that lets only some beams through

ts

Only the domains you authorize for that box, or none ("deny-all"). Change it live over the API, it survives sleep and wake, and if a domain is not on the list the connection simply does not leave the VM. It is the same shape eve uses on Vercel Sandbox, so your agent code does not change. The one thing we do not do is transform (header injection at the firewall): it throws a clear error instead of pretending.

4. The eve server fits in a box too

Six steps: create the box, create the app inside it with eve init (or clone yours) and install the packages, pick a model, set auth, start the server, expose the port. First the base URL and headers:

bash

The eve init scaffold targets Vercel's AI Gateway (model: "anthropic/claude-sonnet-5" as a string) and without AI_GATEWAY_API_KEY it fails with "AI Gateway received no credentials". Outside Vercel the model goes in as an object from any AI SDK provider, in agent/agent.ts:

ts

And in production eve requires auth on its HTTP API: with the scaffold (vercelOidc()/localDev()/placeholderAuth()) the public URL answers 401 Authorization is required for this route. Edit agent/channels/eve.ts:

ts

Now start and expose:

bash

EASYBITS_DB_URL is already in the environment of a box created with POST /sandboxes; no need to pass it in env. The eve-nitro template ships Node 24, pnpm and the eve CLI; /data is persistent and the public URL proxies /eve/ and /.well-known/workflow/ with no configuration — but eve enforces the auth you declared, so every call goes with -u eve:$EVE_PASSWORD. The server runs there; every agent it serves gets its own microVM through the backend above.

Talking to it is three calls: creating a session returns { sessionId }, the stream is NDJSON of events (message.completed carries the reply) and the same id accepts further messages:

bash

5. The run survives the machine

By default eve keeps each run's state on the server's disk. With @easybits.cloud/eve-world that state (runs, steps, hooks, streams and the delivery queue) lives in EasyBits DB:

bash
ts

An eve-nitro box created with POST /sandboxes is born with EASYBITS_DB_URL already set: no token to paste (a box made by forking a snapshot does not get it: pass it in env, with the same value if you want to resume runs). We measured it in production with an 8-step run: we destroyed the box halfway through step 2; a fresh box on the same database started, resumed at step 3 without repeating the earlier ones — 59 seconds after the first box died — and finished the run. The chat session survives too: server destroyed at 21:05:07, another one from the snapshot answering at 21:06:22 with the whole conversation's memory. It is a port of the official Postgres world to libSQL, on the same version line as eve.

Start today

Install the package, change agent/sandbox.ts and run eve build then eve start. The product page is at /eve, the reference at /en/docs/eve.md, and your own agent can set it up with npx skills add https://www.easybits.cloud --skill easybits-eve. The free plan includes one box.

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