> ## Documentation Index
> Fetch the complete documentation index at: https://resend.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Eve

> Connect to your Eve agent over email.

[Eve](https://eve.dev/) is an open-source framework for building agents created by Vercel. It's filesystem-first, inspired by Next.js, and provides tools, workflows, connections, hooks, and channels for you to build long-running, durable agents.

Using the [Resend adapter for the Vercel Chat SDK](/docs/chat-sdk) you can plug in email as a channel to your eve agent.

## Prerequisites

To get started, you'll need to:

* [Create an API key](https://resend.com/api-keys)
* [Verify your domain](https://resend.com/domains)
* [Set up webhooks](/docs/webhooks/introduction) for `email.received` events
* [Enable receiving](/docs/dashboard/receiving/introduction) on your domain

## Guide

**1. Install**

Create a new project with eve and then install the Chat SDK, the Resend adapter, and the development state adapter.

```bash npm theme={"theme":{"light":"github-light","dark":"vesper"}}
npx eve@latest init my-agent
cd my-agent
npm install @resend/chat-sdk-adapter chat @chat-adapter/state-memory
```

```bash yarn theme={"theme":{"light":"github-light","dark":"vesper"}}
yarn dlx eve@latest init my-agent
cd my-agent
yarn add @resend/chat-sdk-adapter chat @chat-adapter/state-memory
```

```bash pnpm theme={"theme":{"light":"github-light","dark":"vesper"}}
pnpm dlx eve@latest init my-agent
cd my-agent
pnpm add @resend/chat-sdk-adapter chat @chat-adapter/state-memory
```

```bash bun theme={"theme":{"light":"github-light","dark":"vesper"}}
bunx eve@latest init my-agent
cd my-agent
bun add @resend/chat-sdk-adapter chat @chat-adapter/state-memory
```

**2. Configure the adapter**

Create the Resend adapter with the [adapter configuration options](#configuration-options). Then create a Chat SDK channel with the adapter, a username for the bot, and an adapter state. `streaming` should be set to false as emails can only deliver one message per turn.

Export the `channel` object and the framework will integrate it automatically.

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
import { createResendAdapter } from '@resend/chat-sdk-adapter';
import { chatSdkChannel } from 'eve/channels/chat-sdk';
import { createMemoryState } from '@chat-adapter/state-memory';

export const resendAdapter = createResendAdapter({
  fromAddress: 'bot@example.com',
  fromName: 'My Bot',
});

export const { bot, channel, send } = chatSdkChannel({
  adapters: { resend: resendAdapter },
  userName: 'My Bot',
  state: createMemoryState(),
  streaming: false,
});

export default channel;
```

> [!NOTE]
>
> Set `RESEND_API_KEY` and `RESEND_WEBHOOK_SECRET` as environment variables. You can also pass `apiKey` and `webhookSecret` directly in the config passed to `createResendAdapter` — explicit values take precedence over env vars.

**3. Handle new messages**

Register handlers for incoming messages. `onNewMention` event fires when a new thread starts and `onSubscribedMessage` fires for follow-up emails in threads you are already subscribed to.

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
bot.onNewMention(async (thread, message) => {
  await thread.subscribe();
  await send(message.text, { thread });
});
bot.onSubscribedMessage(async (thread, message) => {
  await send(message.text, { thread });
});
```

Threading is handled by the [Chat SDK adapter](/docs/chat-sdk#how-threading-works).

**4. Configure webhooks**

Eve registers adapter endpoints at `/eve/v1/resend`. [Edit your webhook](/docs/webhooks/introduction) for `email.received` events to point to this endpoint.

## Configuration options

| Parameter | Type | Required | Description |
| - | - | - | - |
| `fromAddress` | `string` | Yes | Sender email address |
| `fromName` | `string` | No | Display name for the From header |
| `apiKey` | `string` | No | Resend API key. Falls back to `RESEND_API_KEY` env var |
| `webhookSecret` | `string` | No | Webhook signing secret. Falls back to `RESEND_WEBHOOK_SECRET` env var |
