> ## 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

> Slack, Telegram, WhatsApp, and browser surfaces, all through the AgentOS.

Interfaces plug your agent into Slack, Telegram, WhatsApp, and browser clients.

```python theme={null}
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

```python theme={null}
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.

```python theme={null}
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](/use-cases/product-agents/serve-as-an-api#custom-routes).

## Next steps

| Task                          | Guide                                                                |
| ----------------------------- | -------------------------------------------------------------------- |
| Keep memory coherent per user | [Sessions and memory](/use-cases/product-agents/sessions-and-memory) |

## Developer Resources

* [Interfaces in the runtime](/features/interfaces)
* [Interfaces cookbook](https://github.com/agno-agi/agno/tree/main/cookbook/05_agent_os/interfaces)
* [Slack interface](/agent-os/interfaces/slack/introduction)
* [AG-UI interface](/agent-os/interfaces/ag-ui/introduction)
