eve is a filesystem-first framework for durable agents. You write capabilities underDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/vercel/eve/llms.txt
Use this file to discover all available pages before exploring further.
agent/, and eve runs the model loop, persists every session, and serves the agent over HTTP and platform channels. This guide walks you from zero to a working, tool-calling agent that you can talk to through the terminal UI and query over HTTP.
engines.node to the lowest major the release supports.You also need a model credential. The scaffold’s default model is
anthropic/claude-sonnet-4.6, routed through the Vercel AI Gateway. Set one of the following before you run the agent:If you skip the credential, the dev TUI flags the missing key and its
/model
command walks you through pasting a key or linking a project.my-agent/ directory using the current package manager.eve, ai, and zod as dependencies.Stop the server with Ctrl+C before making the edits below. The command does not create a Vercel project or deploy.
Pass
--channel-web-nextjs to also scaffold a Next.js Web Chat application.
Every app ships the built-in HTTP channel (agent/channels/eve.ts) regardless
of which flags you use.agent/instructions.md is the always-on system prompt. Replace the starter text with something specific to your agent’s identity:You are a concise weather demo assistant. Tell users that the weather data is mocked.
- Answer only weather-related questions.
- Always call get_weather before giving a forecast.
Instructions are identity and standing rules. On-demand procedures belong in skills, and actions belong in tools.
The filename becomes the tool name the model sees and must be snake_case ASCII. Create
agent/tools/get_weather.ts:import { defineTool } from "eve/tools";
import { z } from "zod";
// The model sees this tool as `get_weather`, from the filename.
export default defineTool({
description: "Get the current weather for a city.",
inputSchema: z.object({ city: z.string().min(1) }),
async execute({ city }) {
return { city, condition: "Sunny", temperatureF: 72 };
},
});
Tools run in your app runtime with full
process.env, not inside a sandbox. The inputSchema both validates the call and types the input you receive inside execute.agent/agent.ts holds the model and runtime config. The scaffold writes a sensible default — review it and change the model if needed:import { defineAgent } from "eve";
export default defineAgent({
model: "anthropic/claude-sonnet-4.6",
});
get_weather tool call with { city: "Brooklyn" }.{ city: "Brooklyn", condition: "Sunny", temperatureF: 72 }.curl -X POST http://127.0.0.1:3000/eve/v1/session \
-H 'content-type: application/json' \
-d '{"message":"What is the weather in Brooklyn?"}'
continuationToken in the JSON body — reuse it to resume the conversation.x-eve-session-id header — use it to attach to the stream.session.startedactions.requestedget_weather.action.resultmessage.completedsession.completedreasoning.appended and message.appended are optional live-streaming events. Clients that cannot surface incremental output can ignore them and rely on reasoning.completed and message.completed.When the session is waiting for the next user message, post a follow-up using the
continuationToken:curl -X POST http://127.0.0.1:3000/eve/v1/session/<sessionId> \
-H 'content-type: application/json' \
-d '{"continuationToken":"<token>","message":"Now do Queens."}'
What to read next
Tools
Full
defineTool API: output bounding, authorization, and the toModelOutput hook.Instructions
Shape behaviour with the always-on system prompt and on-demand skills.
Channels
Connect the agent to Slack, Discord, or a custom web UI.
Sessions & Streaming
The full event contract, continuation tokens, and durable state.