# eve

> Run an agent written with eve, Vercel's agent framework, without changing a file.

## The eve layout

[eve](https://eve.dev) keeps an agent on the filesystem: a markdown file for the
instructions, an optional config file, and one file per tool.

```
my-agent/
  agent/
    instructions.md   <- required. This is what identifies the project.
    agent.ts          <- optional. `model` and `name` are read.
    tools/
      get_weather.ts  <- one tool per file, default-exporting defineTool(...)
  package.json
```

`agent/instructions.md` is the whole detection rule. Zavu compiles the project
at deploy time into the same registry a native project declares directly, so
what runs afterwards is an ordinary Zavu agent. **No file of yours is edited.**

## What carries over

| In eve | On Zavu |
| --- | --- |
| `agent/instructions.md` | the agent's prompt |
| `model` in `agent.ts` | the agent's model |
| `name` in `agent.ts` | the agent's name, over the one in `package.json` |
| `agent/tools/*.ts` | one Zavu tool each, Zod schemas converted to JSON Schema |
| `execute(input, ctx)` | the tool's handler |

A file under `agent/tools/` counts as a tool only when it default-exports
`defineTool(...)`. One that does not is named in the report before the deploy
starts, so the tool count is always the number of tools actually created.

## What does not

Every eve capability without an equivalent is listed explicitly before the
deploy runs, one line each — nothing is dropped in silence. Today that includes
channels, schedules, subagents, the sandbox, connections, evals, and approval
gates. A `voice` block in `agent.ts` is not translated either: the agent deploys
as text only. To give it a voice, configure it on the Zavu side.

Every key `agent.ts` declares that Zavu does not read is reported by name,
including keys we have never heard of, so a config that quietly does nothing is
visible rather than assumed.

## Deploying

```bash
npx zavudev deploy
```

```bash
npx zavudev import acme/my-eve-agent
```

```bash
npx zavudev fn git link acme/my-eve-agent
```

Compiling locally needs `esbuild` in the project (`npm install -D esbuild`);
`zavudev import` installs it for you, and deploying through a GitHub link needs
nothing at all, because that build happens on Zavu.

The agent reads `SENDER_ID` at runtime, or takes `--sender` at deploy time:

```bash
npx zavudev fn secrets set SENDER_ID <id from `npx zavudev senders list`>
```

## One thing worth knowing

An eve project declares no HTTP handler and no event handler, only an agent and
its tools. Its public URL answers 404, and an
[event trigger](https://www.zavu.dev/docs/guides/functions/triggers) on it invokes a function with
nothing to run. That is expected: the agent replies because it is attached to a
sender, and its tools run when the agent calls them.

For the deeper walkthrough, see
[Deploy an eve project](https://www.zavu.dev/docs/guides/functions/deploy-eve-project).
