Skip to main content

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:
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

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:
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:
  • 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:
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

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

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