Documentation Index
Fetch the complete documentation index at: https://docs.agno.com/llms.txt
Use this file to discover all available pages before exploring further.
Interfaces plug your agent into Slack, Telegram, WhatsApp, and browser clients.
from agno.os import AgentOS
from agno.os.interfaces.slack import Slack
from agno.os.interfaces.telegram import Telegram
agent_os = AgentOS(
agents=[agent],
db=db,
interfaces=[
Slack(agent=agent, token="xoxb-...", signing_secret="..."),
Telegram(agent=agent, token="bot-token"),
],
)
Available surfaces
| Interface | Use case |
|---|
| Slack | Team chat, DMs, channel mentions, thread sessions |
| Telegram | Personal assistants, mobile chat |
| WhatsApp | Customer support, mobile chat |
| AG-UI | Browser clients consuming SSE streams |
| A2A | Other agents calling yours over a standard protocol |
Sessions carry across surfaces
Each interface maps surface state onto AgentOS sessions, so a conversation continues without the user re-mentioning the bot.
| Interface | session_id | user_id |
|---|
| Slack | Thread timestamp | Slack user ID |
| Telegram | Chat ID | Telegram user ID |
| WhatsApp | Phone number | Phone number |
| AG-UI | Browser session | JWT subject |
Map a user’s Slack ID to the same user_id your browser widget passes and memory follows them between surfaces. The agent only ever sees a user_id, a session_id, and a message. It does not know which surface a request came from.
One agent, every surface
agent_os = AgentOS(
agents=[support_agent],
db=db,
interfaces=[
Slack(agent=support_agent, token=..., signing_secret=...),
Telegram(agent=support_agent, token=...),
Whatsapp(agent=support_agent, token=..., verify_token=...),
AGUI(agent=support_agent),
],
)
Conditional registration
Register only the interfaces you have credentials for, so a dev run without secrets does not crash.
interfaces = []
if SLACK_TOKEN and SLACK_SIGNING_SECRET:
interfaces.append(Slack(agent=agent, token=SLACK_TOKEN, signing_secret=SLACK_SIGNING_SECRET))
if TELEGRAM_TOKEN:
interfaces.append(Telegram(agent=agent, token=TELEGRAM_TOKEN))
agent_os = AgentOS(agents=[agent], db=db, interfaces=interfaces)
Resolving Slack names
Slack hands you opaque IDs like U07ABCXYZ. Set resolve_user_identity=True on the Slack interface and it resolves IDs to names before the agent sees them. Off by default because it costs an extra Slack API call per message.
One-off webhooks
For a one-off integration, a custom FastAPI route that calls the agent is enough. See Serve as an API.
Next steps
| Task | Guide |
|---|
| Keep memory coherent per user | Sessions and memory |
Developer Resources