Channels — Technical Reference
This page describes how channels work beneath the UI, in technical terms, for developers and technically-inclined users. It focuses on the model and observable behavior, not implementation internals.
Architecture model
A channel is the surface where an agent receives messages and sends replies. The same agent logic runs across every channel — what changes is the input shape (how a message arrives) and the output shape (what the agent can render in reply).
Two kinds of channels exist:
- Web app — the in-product chat. Full output options: rich displays, file viewers, downloadable datasets, interactive components.
- External channels — WhatsApp, Instagram, Messenger, Telegram, Slack, Discord, Teams, web embed, chatbot widget, API. Output is restricted to what each platform supports (typically: text, images, files).
How an inbound message reaches the agent
External channels deliver messages through an automatic alert (webhook) — the channel calls a URL on the platform with each new message. Each agent that's connected to that channel has its own incoming address; the address is protected by a secret key so other people can't post fake messages.
- Each external channel has its own send actions — sending a message on Telegram is a different operation than sending a message on Slack, even when the agent's intent is the same. The platform exposes the right send actions to the agent based on which channel triggered the turn.
- Web embed and API channels still go through this loop but use a simpler authenticated request shape.
Per-session execution serialization
In the web app, the UI prevents the user from sending a second message until the agent has finished its reply. External channels don't have that affordance — users can (and do) send several messages in a row while the agent is still working.
To keep a conversation from corrupting itself, one message runs at a time per conversation. Messages that arrive while the agent is busy are queued and processed after the current turn finishes.
- The serialization is per conversation, not per agent — two different conversations on the same agent still run in parallel.
- A stale lock (e.g., the previous turn was interrupted) is released automatically after a bounded timeout so the next message isn't stuck waiting.
File uploads on external channels
When a user attaches a file in an external channel, the file is uploaded as a normal message — there is no separate "uploaded ✓" confirmation reply. The agent sees the file alongside any caption the user wrote (or a placeholder caption if none) and decides what to do with it as part of its normal reasoning.
This makes the conversation feel natural — the user just sends a photo, the agent looks at it and responds.
Output rules per channel
The agent's reply is filtered to what the channel supports:
| Channel | Text | Images | Files | Rich components |
|---|---|---|---|---|
| Web app | ✓ | ✓ | ✓ | ✓ (apps, file viewers, datasets) |
| WhatsApp / Instagram / Messenger | ✓ | ✓ | ✓ | — (sent as text or media) |
| Telegram / Slack / Discord / Teams | ✓ | ✓ | ✓ | — |
| Web embed / chatbot widget | ✓ | ✓ | ✓ | — |
| API | ✓ | ✓ | ✓ | — |
When the agent tries to render something the channel can't show, the platform downgrades it gracefully (e.g., a rich data card becomes a compact text summary), so the agent's logic doesn't have to know which channel it's running on.
Meta channels — one-per-agent rule
WhatsApp, Instagram, and Messenger share a single Meta sign-in per number/account/Page. As a result:
- One WhatsApp business number can be connected to one agent at a time.
- One Instagram account can be connected to one agent at a time.
- One Messenger Page can be connected to one agent at a time.
Reassigning one of these channels to a different agent disconnects it from the previous one.
Other channels (Telegram, Slack, Discord, Teams) follow each platform's own rules; in practice each bot/app credential is also dedicated to one agent.
Channel selection at agent runtime
When an agent runs, it sees:
- The channel-specific send actions for the channel that delivered the message.
- A platform-aware output rule that constrains what it should try to render.
- The same tools, knowledge, and skills as on every other channel — channel choice never changes the agent's core capabilities.
This is how a single agent definition produces consistent behavior across many surfaces without needing per-channel logic.
Limits and guarantees
- The agent never sees a credential's secret value — only the credential ID it should use.
- Inbound webhooks are rejected if the secret key is missing or wrong.
- Messages within one conversation are serialized; messages across conversations on the same agent are processed in parallel.
- One Meta channel (WhatsApp number, Instagram account, Messenger Page) ↔ one agent.
- Usage is metered as credits per turn, the same way it is in the web app.
What's next
- Channels overview — the full list and what each one is good for
- Web embed — the in-page widget
- API — the programmatic channel