Eve is a filesystem-first framework for durable backend agents on Vercel.
You author an agent as a directory on disk. The directory is the contract:
instructions.mddefines the always-on instructions promptskills/define optional procedurestools/define typed executable integrationsconnections/define external MCP server connectionssandbox/overrides the agent's single sandbox (optional) and seeds workspace fileschannels/define message ingress and deliverysubagents/define specialist child agentsschedules/define recurring jobslib/holds shared authored codeagent.tsholds additive runtime config such as model, metadata, build, compaction, and workspace settings
The framework package is eve. The CLI binary is eve.
- Markdown-first authoring for instructions and procedures
- TypeScript where typed runtime behavior matters
- Durable message runs and follow-up turns
- Inspectable compiled artifacts under
.eve/ - Per-agent sandbox with optional authored overrides
- A stable HTTP protocol with explicit
continuationTokenandsessionIdcontracts - A runtime model that keeps channels, harnesses, and workflow execution separate
Eve’s internal split is:
- the channel normalizes inbound transport, applies auth and delivery policy, and owns
continuationToken - the harness does one unit of AI work and returns
{ session, next } - the runtime persists state, follows
next, streams events, and owns workflow primitives
That split is why the public HTTP protocol separates:
continuationTokenfor the next user messagesessionIdfor streaming and inspection
my-agent/
├── package.json
├── tsconfig.json
└── agent/
├── agent.ts
├── instructions.md
├── skills/
├── tools/
├── connections/
├── sandbox/
├── channels/
├── subagents/
├── schedules/
└── lib/
agent/instructions.md
You are a weather-focused assistant. Be concise, accurate, and explicit when you use a tool.agent/tools/get_weather.ts
import { defineTool } from "eve/tools";
import { z } from "zod";
export default defineTool({
description: "Get the current weather for a city.",
inputSchema: z.object({
city: z.string(),
}),
async execute(input) {
return {
city: input.city,
condition: "Sunny",
temperatureF: 72,
};
},
});agent/agent.ts
import { defineAgent } from "eve";
export default defineAgent({
model: "openai/gpt-5.4-mini",
name: "weather-agent",
});npx eve@latest init my-agentThe command creates the project, installs its dependencies, initializes Git,
and starts the development server. Add --channel-web-nextjs to scaffold the Web Chat
application. If you already created an empty directory, run eve init,
eve init ., or eve init ./ from inside it to run the same full scaffold there,
including package.json. In a non-empty existing app, eve init . adds the
agent files and missing dependencies instead; that add-agent flow requires an
existing package.json. eve init does not create or link a Vercel project.
Useful commands:
eve infoshows discovery results and compiled artifactseve init [name]creates a new agenteve buildcompiles.eve/and builds the host outputeve startserves the built.output/appeve devstarts the local runtime and interactive terminal UI
Start here:
docs/README.mddocs/getting-started.mdxdocs/reference/project-layout.mddocs/agent-config.mddocs/reference/typescript-api.mddocs/connections.mdx
packages/eve/README.mdis the package-facing overviewapps/fixtures/weather-agentis the weather-focused fixture used by local dev, smokes, and bundle analysispackages/eve/src/public/index.tsis the public API source of truth