Skip to content

Channels overview

What this is for. Channels are how people outside this machine message an EYAS agent: Telegram, Slack, email, and the rest of the catalogue. Each instance has its own secrets and a bound agent. This is not Connections (Odoo, GitHub, MCP inventory) and not Hands (a local device that offers OS/CLI tools). MCP and A2A are integrations of a different shape and live on their own pages.

Route: /communication → tabs Channels · Inbound Queue · Pairing. Subtitle: Connect messaging channels and bind them to your primary agent.

  • You want to talk to your primary agent from Telegram (or another catalogue type) without opening the web UI.
  • You run two bots of the same type (work + personal) and need a second instance.
  • Inbound messages are stuck and you need the durable queue (retry a dead row).
  • A Telegram DM is waiting on a pairing code.
  1. Open Communication (/communication) on the Channels tab.
  2. Expand a catalogue card, or Add instance for another account of the same type.
  3. Paste the secrets, pick Agent for inbound messages, press Save & connect.
  4. Choose Autonomous (unattended, still gated by the autonomy ladder) or Managed (security gate on every tool call).
  5. For Telegram DMs: message the bot, then approve the code on Pairing. Watch Inbound Queue if deliveries fail.

You can run several accounts of the same type (e.g. two Telegram bots), each with its own credentials and agent. Use Add instance or per-card Add … instance.

These are the messaging types EYAS lists. MCP / A2A are not chat channels.

TypeWhat you connectPairingExtra
TelegramBotFather HTTP API tokenYes — unknown DMsFirst-class; see Telegram
DiscordApplication bot tokenNoNeeds discord.js at runtime
SlackBot token (xoxb-) + app-level token (xapp-)NoSocket Mode — no public webhook
Email (SMTP/IMAP)SMTP (required) + optional IMAPNoAny mailbox
Gmail (API)OAuth client id/secret, refresh token, mailboxNoGmail API
Microsoft 365 (Graph)Tenant, client id/secret, mailbox UPNNoGraph app credentials
WhatsApp BusinessPhone number id, access token, verify token, app secretNoWebhook /api/v1/webhooks/whatsapp
SignalBot E.164 number + signal-cli HTTP bridge URLNoEYAS does not embed Signal
Google ChatProject/app id, optional send token and default spaceNoWebhook /api/v1/channels/googlechat/webhook
Microsoft TeamsApp id, app password, optional tenantNoWebhook /api/v1/channels/teams/webhook

Each card expands How to set this up with numbered steps before the credential form. Webhook types also list Webhook paths to expose.

FieldMeaning
Channel typeTemplate from the catalogue
Display namee.g. Work Signal, Personal Telegram
Create & connectCreate instance and start connect flow
Delete instanceRemove instance + its credentials (confirm)
StatusMeaning
ConnectedLive connection
DisconnectedNot connected
Credentials setSecrets stored, may need Connect
Not configuredMissing secrets
ErrorLast error
Health Conflict / Auth error / DegradedOperational health
ModeMeaning
AutonomousRuns unattended; graduated-autonomy ladder still gates actions
ManagedSecurity gate governs every tool call

Click toggles between modes (tooltips explain each).

A reply spoken in the owner’s internal voice gets the same recalled-memory block, with the current date and time, as a chat turn (see Memory — How recall reaches the model). A reply whose voice scope is External — Force External set on the conversation, or a temporary override — gets the date and time only: no recalled owner memory is pushed to an outside reader. If EYAS cannot determine a reply’s voice scope, the reply also goes out without recalled memory. The memory tools are unchanged and stay governed by the security gate.

The bound agent’s Tools list applies to channel replies as on every other path, plus memory_search and memory_expand (Configure — Tools). What channel senders write is remembered as peer text, not as yours.

Memory capture on channel replies. Each channel reply now also runs EYAS’s durable-memory capture, under the same memory.capture.* settings as a chat turn. The sender’s message is read as a third party’s words: it can never create a note about who you are or a rule for how EYAS should work, it can produce only reference, project or domain notes, which carry trust: peer and are stored at peer trust, and such a note never adds to one of your own notes. The length gate counts only the sender’s words, so a short “ok” buys no model call, and a channel conversation shares one maxPerConversation ceiling across all its messages. See Memory — Capture is on by default.

Model and effort. A channel conversation follows the bound agent’s model; if the agent has none, the install default is fixed on the conversation with its first reply. The agent’s own reasoning effort applies too. Each channel reply records the provider and model that answered, and the effort it ran with.

A channel always counts as a remote destination. An inbound message that carries a value the privacy policy sets to block — by default an IBAN, bank account number, tax number, personal ID card number, card number or US SSN, plus any custom pattern set to block — is refused before anything is stored:

  • The sender gets an automatic reply in the language they wrote in (English, Hungarian, German, Spanish, French or Klingon; English if unclear). It names the types, never the values, and asks them to resend without those values.
  • No conversation, message or agent run is created. In the Inbound Queue the event shows status skipped with error privacy_blocked, and only its masked text is kept. If sending the notice fails, the event is retried like any delivery.
  • Messages already stored before a policy change are not refused later. E-mail addresses and phone numbers (mask class) and warn-class values are never refused.

Every refusal is audited as privacy.inbound_refused (types and the inbound event id, never a value). See Security & privacy — Refused messages.

FieldMeaning
Secret fieldsChannel-specific (see the card / Telegram chapter)
Leave blank to keep current valuePlaceholder when editing
set badgeSecret already stored
Agent for inbound messagesWhich agent answers; default primary assistant
— none (messages stored, no auto-reply) —Store only
Bound agentCurrently bound agent
Save & connectPersist secrets and connect
Test / Connect / Disconnect / Reconnect / ConfigureLifecycle actions

Durable at-least-once queue of inbound channel messages. Failed deliveries back off and dead-letter; dead rows can be re-queued.

ColumnMeaning
SourceChannel instance
SenderSender id / name
MessageBody
AttemptsDelivery tries
ReceivedAge (Ns/Nm/Nh ago)

The Status column shows pending, delivered, dead or skipped; the reason of a failed or skipped row appears under the message (for example privacy_blocked, see above). Retry on a dead row queues it again; Refresh reloads the list.

Unknown senders get a pairing code and wait here. Approving grants the channel access to its bound agent; pairings survive restarts. Telegram is the catalogue type with supportsPairing.

ControlMeaning
Pairing badgeOn the channel card when pairing is required
Approve / RejectDecision for a pending request
ColumnsSource, Sender, Code, Requested

Empty: No pending pairing requests.