Available surfaces
| Interface | Use case |
|---|---|
| Slack | Team chat, DMs, channel mentions, thread sessions |
| Telegram | Personal assistants, mobile chat |
| 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 |
| Phone number | Phone number | |
| AG-UI | Browser session | JWT subject |
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
Conditional registration
Register only the interfaces you have credentials for, so a dev run without secrets does not crash.Resolving Slack names
Slack hands you opaque IDs likeU07ABCXYZ. 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 |