Skip to main content
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

InterfaceUse case
SlackTeam chat, DMs, channel mentions, thread sessions
TelegramPersonal assistants, mobile chat
WhatsAppCustomer support, mobile chat
AG-UIBrowser clients consuming SSE streams
A2AOther 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.
Interfacesession_iduser_id
SlackThread timestampSlack user ID
TelegramChat IDTelegram user ID
WhatsAppPhone numberPhone number
AG-UIBrowser sessionJWT 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

TaskGuide
Keep memory coherent per userSessions and memory

Developer Resources