Channels

Overview

How users reach your agent: the channel contract, the base eve HTTP channel, and authoring custom channels.

A channel is the edge adapter between a platform and your agent. It does three things:

  • Normalizes platform input into a user message.
  • Owns the channel-local address that maps a platform conversation to its current durable session.
  • Decides delivery, meaning how, where, and whether a response goes back.

eve ships a base HTTP channel plus first-class platform channels, and you can author your own. Browse the full set in the Integrations gallery and choose the Channels filter.

After a channel normalizes input, eve runs the same agent runtime regardless of where the message came from. Tools and instructions do not need channel-specific logic.

Overlapping messages

Channels default to turnPolicy: "steer". When an accepted message arrives while a turn is active, eve first durably buffers the message, then cooperatively cancels the active turn and starts a replacement turn. The cancelled turn emits turn.cancelled followed by session.waiting; the replacement starts with a new turn ID. Output already streamed and completed side effects are not rolled back.

Set turnPolicy: "queue" on any built-in or custom channel when each turn must finish before the next message starts:

export default defineChannel({
  turnPolicy: "queue",
  routes: [
    // ...
  ],
});

from(address).send(...), fixed Session.send(...), cross-channel sends, and Chat SDK bridge sends also accept a per-send turnPolicy override. Pure inputResponses deliveries answer their pending request without steering. Explicit cancel() remains the stop-without-replacement operation.

Channel admission still runs first. Ignored mentions, rejected signatures, duplicates, and any other dropped platform events never affect the active turn.

Each channel has its own provider terms, data flow, auth model, and user-consent expectations. Before sending non-public, sensitive, regulated, or production data through a channel, confirm that the channel provider and your configured scopes, signature checks, route auth, and delivery behavior are appropriate for your use case.

Where channels live

Channel files live under agent/channels/ in the root agent or come from an extension mounted there. The file stem is the channel id: agent/channels/intake.ts is addressed as intake. An extension mount prefixes its contributed channel IDs but does not change their route paths. Local subagents do not declare channels.

agent/
  agent.ts
  channels/
    eve.ts
    slack.ts
    intake.ts

Install a channel from the registry with eve add channel/<name>, such as eve add channel/slack or eve add channel/web. You can also author the file by hand.

The eve HTTP channel (default)

The eve channel is the framework's default HTTP session API, the routes the terminal UI, useEveAgent, and curl all talk to. Its selected channels/eve.ts source owns health, inspection, callbacks, task input, and the session protocol as one replaceable surface. eve supplies the source when no agent/channels/eve.ts file exists; author that file to replace it, most often to change route auth. See HTTP channel for routes, auth, replacement, and disablement.

Custom channels

When eve doesn't ship a channel for your surface, build one with defineChannel from eve/channels. A custom channel declares route handlers (GET, POST, PUT, PATCH, DELETE, WS), an events map, and uses send(address, input) to start or resume a session. See Custom channels for the full walkthrough, including WebSocket routes, cross-channel agent hand-off, channel metadata, address tokens, and file uploads.

A cross-channel send(...) supplies input to the agent and invokes the model on the destination channel. eve does not currently provide a direct cross-channel provider-message queue. To post without starting a turn, use the provider API. See Durable cross-channel notifications when delivery also needs application-managed retries and deduplication.

Relationship to the Chat SDK

eve uses the Chat SDK's card-builder components (Cards, Buttons, Actions, etc.) for composing rich Slack messages. When you build a card with the Slack channel, the underlying primitives come from the Chat SDK and get converted to Slack Block Kit at post time.

eve's first-class channels use eve-owned runtimes for webhook handling, verification, event parsing, and thread management. The optional Chat SDK channel is the exception: it accepts a Chat SDK adapter and exposes its Chat and Thread primitives. Use slackChannel for eve's first-class Slack integration, defineChannel(...) for an eve-native custom channel, or chatSdkChannel when you intentionally want a Chat SDK adapter and runtime.

Which channel?

You want…Use
A web app / browser chat UIeve channel + useEveAgent
Local tooling, SDK clients, curleve HTTP channel (default)
MCP clients delegating durable workMCP
Slack mentions, DMs, buttonsSlack
iMessage and SMSLinq
iMessagePhoton
Discord slash commands, componentsDiscord
Microsoft Teams messages + Adaptive CardsTeams
Telegram bot messagesTelegram
SMS or speech-transcribed phone callsTwilio
GitHub @mentions, PR review with checkoutGitHub
Linear issue delegation and Agent SessionsLinear
Another Chat SDK-supported serviceChat SDK adapters
Anything else (internal webhook, WebSocket)Custom channel (defineChannel, above)

Disclaimer

As the deployer, it is your responsibility to ensure your agent complies with applicable laws.

Where an eve agent communicates with people, you may be required to disclose that they are interacting with an automated AI system where law requires it. eve does not add this disclosure automatically; configure it in your instructions and/or channel responses. See Responsible use for the full deployer responsibilities.