Deploy an eve project
Run an agent built with the eve framework on Zavu — no code changes, one command.
Deploy an eve project
eve is Vercel's open-source agent framework. If you built an
agent with eve's filesystem layout, Zavu deploys it as a first-class Zavu
agent — same inbox, same executions log, same billing as an agent written with
@zavudev/functions — without editing a single file of your project.
Two ways in:
terminal# From GitHub, in one command: npx zavudev import acme/support-bot --sender sndr_123 # Or from a local checkout: cd my-eve-agent npx zavudev deploy --sender sndr_123
deploy recognizes the eve layout by agent/instructions.md. import
downloads the repo, detects the framework (eve or Zavu native), registers the
function, installs dependencies, and deploys.
What maps to what
| eve | Zavu |
|---|---|
agent/instructions.md | The agent's system prompt |
agent/agent.ts (model: "...") | The agent's model (string models only) |
agent/agent.ts (name: "...") | The agent's name. Without it, the package.json name is used |
agent/tools/*.ts | Tools, named by filename — get_weather.ts becomes get_weather. Each file must export default defineTool({ ... }) |
Zod inputSchema | Converted to JSON Schema automatically |
package.json dependencies | Installed server-side, exactly like a native function |
A tool's ctx.session | id, messageId and contactPhone: the number of the person writing, in a live conversation. Empty on a dry run. The model never sees the number, so read it here. |
Your tool handlers run unmodified inside the function. The eve package
itself is compiled away — it is not installed or executed on Zavu.
The sender
An eve project has no concept of a sender, and the agent needs one to answer messages. Provide it either way:
terminalnpx zavudev deploy --sender sndr_123 # inlined at compile time # or npx zavudev fn secrets set SENDER_ID sndr_123 # resolved at runtime
Without either, the deploy succeeds and the agent stays disconnected until you connect a sender from the dashboard.
What does not run on Zavu
The deploy prints a compatibility report before anything ships. Every eve capability without a Zavu equivalent is listed there — nothing is dropped silently:
-
agent/channels/— not needed: your Zavu senders are the channels. Messages arrive without any channel file. -
agent/schedules/— use a Zavu cron trigger instead:npx zavudev fn triggers add --events cron --cron '0 9 * * 1-5'. -
agent/skills/— skill files are not loaded at runtime. Fold critical content intoinstructions.mdor a knowledge base. -
agent/subagents/,agent/sandbox/— not supported. If your agent depends on them, run it on eve's own runtime and connect Zavu as a channel instead. -
evals/— keep running them locally with eve; they do not run on Zavu. -
Tool
approvalgates andtoModelOutput— ignored, with a warning per tool. -
A file under
agent/tools/that does notexport default defineTool(...)— it is not a tool and is reported by name. The tool count in the report is always the number of tools that will actually be created:TypeScript// Not a tool: nothing registers it, and the agent's prompt will reference // something that does not exist. export default { description: "...", execute: async () => ({}) } // A tool. import { defineTool } from "eve/tools" export default defineTool({ description: "...", execute: async () => ({}) }) -
A
voiceblock inagent/agent.ts— not translated. The agent deploys as text only and will not answer phone calls. To give it a voice, declare it on a Zavu-native agent (defineAgent({ voice: { ... } })) or turn voice on from the dashboard.
agent/agent.ts is read against a fixed list of keys: model and name.
Every other key it declares is reported by name, whether or not Zavu has
heard of it, so a capability eve adds tomorrow cannot slip through unmentioned:
Codeagent config 'reasoning' is not translated to Zavu and will be ignored agent config 'voice' is not translated to Zavu and will be ignored — this agent deploys as TEXT ONLY and will not answer phone calls
Tools run on every channel — plain text, voice, and flow tool steps — with up to 5 tool rounds per reply, exactly as an eve agent expects.
Importing from GitHub
terminalnpx zavudev import owner/repo # default branch npx zavudev import owner/repo#staging # branch, tag, or commit npx zavudev import owner/repo --root apps/agent # monorepo subdirectory
Private repositories work by setting a GITHUB_TOKEN environment variable.
The token is sent only to GitHub to download the archive — never to Zavu.
import works for Zavu-native projects too: a repo with a root index.ts is
registered and deployed exactly like npx zavudev init + deploy would.
After the first deploy
terminalnpx zavudev agents list # find the agent id npx zavudev agents test --agent <agentId> --message "hi" # dry run, nothing delivered
Redeploys are just npx zavudev deploy from the project directory — edit your
eve files, deploy, and the reconcile summary shows exactly what changed
(+ created, ~ updated, = unchanged, - deleted).