Skip to content

Deploy an eve project

Run an agent built with the eve framework on Zavu — no code changes, one command.

View .md

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

eveZavu
agent/instructions.mdThe 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/*.tsTools, named by filename — get_weather.ts becomes get_weather. Each file must export default defineTool({ ... })
Zod inputSchemaConverted to JSON Schema automatically
package.json dependenciesInstalled server-side, exactly like a native function
A tool's ctx.sessionid, 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:

terminal
npx 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 into instructions.md or 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 approval gates and toModelOutput — ignored, with a warning per tool.

  • A file under agent/tools/ that does not export 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 voice block in agent/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:

Code
agent 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

terminal
npx 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

terminal
npx 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).