Channels let an agent receive and send messages outside the web UI. Connect Telegram, SMS, or other supported providers, and the agent can reply to incoming messages just like it does in chat, with tools, memory, delegation, and signals all working the same way.
Spaces and agents
Each channel belongs to a space and is bound to a single agent. Conversations on the channel live inside that space, so the agent has access to the same memory and context it would have in the web UI for that space.
You can connect multiple channels to the same agent (for example, your personal assistant on both Telegram and SMS). You can also split channels by space: a finance space with its own SMS channel for bank alerts, a personal space with Telegram for everyday chat.
Dispatch modes
A channel can run in one of two modes:
| Mode | What it does | When to use |
|---|---|---|
| Message (default) | Inbound messages run full inference. The agent reads, replies, and uses tools. | Normal conversation channels. |
| Signal | Inbound messages do tag-only inference and feed the signal matcher. The agent doesn't reply. | Channels for ingesting alerts, 2FA codes, or events that other agents are waiting on. |
A channel can be flipped from one mode to the other in its settings. The two-tier authorization (see below) lets you mix the behaviors per sender.
Pairing and self-source
Some channels (notably SMS) require pairing before they accept inbound messages. The flow is:
- After connecting, the channel goes to Pairing state and shows a one-time code.
- You text the code from the address you want to use to the channel's number (or send the code from the linked account, depending on the provider).
- The platform records that address as a paired address on the channel.
- From then on, messages from any paired address are treated as you (self-source) and pass the default
receive_messagepolicy.
Messages from non-paired addresses are dropped by default. If you want the agent to talk to other people on the channel, you add a policy that allows specific contacts or addresses.
Authorization
Two policy actions gate every inbound:
| Action | Effect |
|---|---|
receive_message | Allows the agent to read and reply to the message |
receive_signal | Allows the message to be evaluated against active signal watches |
The dispatcher evaluates both:
- Both allowed → full inference. The agent replies and may use tools.
receive_signalallowed butreceive_messagedenied → tag-only inference. The agent annotates the message for signal matching but cannot reply or use general tools.- Both denied → the message is discarded. No DB record, no broadcast.
This is how you get behaviors like "the finance agent never sees SMS at all" or "this channel is for ingesting bank 2FA codes only".
See Policies for the full action reference.
Available adapters
| Channel | Inbound | Outbound | Best for |
|---|---|---|---|
| Telegram | Webhook from Telegram | Bot messages | Personal assistants, group bots |
| SMS | Twilio webhook | Twilio message | Mobile assistants, 2FA capture, notifications |
More adapters are on the way.
Channel statuses
| Status | Meaning |
|---|---|
| Setup | The channel is created but missing required configuration |
| Pairing | Waiting for the user to complete address pairing (e.g., text the pairing code to the bot) |
| Connecting | The adapter is starting and registering with the provider |
| Connected | The channel is live and receiving messages |
| Disconnected | The channel is stopped (you turned it off) |
| Failed | The adapter could not start. See the error message on the channel page. |
Tips
- Start in Message mode. Switch to Signal mode only when you specifically want passive watching, not conversation.
- Pair from the address you'll use. The pairing code locks the channel to that wire address. If you want to add another, repeat pairing.
- Use a separate agent per channel if the channels have different audiences. The agent's specialty is what people on the other end interact with.
- Use spaces to scope memory. A channel for work and a channel for personal life should live in different spaces so memory doesn't leak between them.
- Watch the status. A channel stuck in
Failedwon't receive anything. Check the error message before debugging at the provider.