Platform Adapters
Platform adapters handle webhook verification, message parsing, and API calls for each messaging platform. Install only the adapters you need. Browse every available adapter, including community-built ones, on the Adapters page.
Need a browser chat UI? See the Web adapter. It speaks the AI SDK UI stream protocol and works with React (@ai-sdk/react), Vue (@ai-sdk/vue), and Svelte (@ai-sdk/svelte), so one bot can serve Slack, Teams, and a browser chat UI.
Feature matrix
This matrix covers Vercel-maintained official adapters only. For vendor-official and community adapters, see each adapter's page.
Messaging
| Feature | Discord | Google Chat | GitHub | Gmail | Linear | Messenger | Notion | Slack | Microsoft Teams | Telegram | Twilio | Twitch | Web | WhatsApp Business Cloud | X | XChat | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Post message | |||||||||||||||||
| Message replies | Outbound only | ||||||||||||||||
| Edit message | Partial | Posts only | Own text messages, age-gated | ||||||||||||||
| Delete message | Partial | Chat, as a moderator | Own messages | ||||||||||||||
| File uploads | Uploads and HTTPS URLs | Up to 3 native attachments | Public media URLs | Images, audio, docs | |||||||||||||
| Streaming | Post+Edit | Post+Edit | Buffered | Buffered email | Buffered | Agent sessions / Post+Edit | Buffered | Post+Edit | Native | Native (DMs) / Buffered | Post+Edit / Opt-in rich drafts | Buffered | Buffered | Native (SSE) | Buffered | Buffered | Age-gated edits |
| Scheduled messages | Native |
Rich content
| Feature | Discord | Google Chat | GitHub | Gmail | Linear | Messenger | Notion | Slack | Microsoft Teams | Telegram | Twilio | Twitch | Web | WhatsApp Business Cloud | X | XChat | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Card format | Embeds / Components | Google Chat Cards | GFM Markdown | Plain text | Generic / Button Templates | Markdown | Generic / Button Templates | Markdown fallback | Block Kit | Adaptive Cards | MarkdownV2 + inline keyboard | RCS rich cards + SMS text fallback | Plain text | Markdown only (v1) | Interactive messages | Plain text | Plain text + URL preview |
| Buttons | Quick replies / postbacks | Max 3, postback | Inline keyboard | RCS quick-replies | Interactive replies | ||||||||||||
| Link buttons | Text links | web_url | web_url | Inline keyboard URLs | RCS call-to-action | Rendered as text | Single CTA URL | Rendered as text | Tappable URLs | ||||||||
| Select menus | Components | ||||||||||||||||
| Tables | GFM | ASCII | GFM | Plain text | GFM | ASCII | Flattened markdown | Block Kit | Adaptive Card Table | Native messages / ASCII cards | ASCII | One line of text | GFM | ASCII | ASCII | ||
| Charts | Block Kit | ||||||||||||||||
| Fields | Plain text | ASCII | Plain text | Formatted text | Plain text | Plain text | |||||||||||
| Images in cards | RCS only | ||||||||||||||||
| Modals |
Conversations
| Feature | Discord | Google Chat | GitHub | Gmail | Linear | Messenger | Notion | Slack | Microsoft Teams | Telegram | Twilio | Twitch | Web | WhatsApp Business Cloud | X | XChat | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Slash commands | |||||||||||||||||
| Mentions | Label-based intake | ||||||||||||||||
| Add reactions | Workspace Events | Likes only | |||||||||||||||
| Remove reactions | Workspace Events | Partial | Partial | Likes only | |||||||||||||
| Typing indicator | Agent sessions | ||||||||||||||||
| Mark as read | |||||||||||||||||
| Message edit events | |||||||||||||||||
| Message delete events | |||||||||||||||||
| DMs | Requires delegation | Email to recipient | Whispers | ||||||||||||||
| Ephemeral messages | Native | Permanent private email | Native | Targeted messages | |||||||||||||
| User lookup | Cached | Cached | Seen users | ||||||||||||||
| Parent subject | |||||||||||||||||
| Native client | |||||||||||||||||
| Custom API endpoint | Media REST calls |
Message history
| Feature | Discord | Google Chat | GitHub | Gmail | Linear | Messenger | Notion | Slack | Microsoft Teams | Telegram | Twilio | Twitch | Web | WhatsApp Business Cloud | X | XChat | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Fetch messages | Requires delegation | Cached sent only | Cached sent only | Requires Graph permissions | Cached | Messages API | Persisted history | State cache | Cached sent only | DMs via API, posts cached | |||||||
| Fetch single message | Cached | Cached | Cached | Posts via API, DMs cached | |||||||||||||
| Fetch thread info | Synthesized | ||||||||||||||||
| Fetch channel messages | Cached | Cached | Requires Graph permissions | Cached | State cache | ||||||||||||
| List threads | Requires Graph permissions | ||||||||||||||||
| Fetch channel info | Requires Graph permissions | ||||||||||||||||
| Post channel message |
Partial support means the feature works with limitations. See individual adapter pages for details.
How adapters work
Each adapter implements the Adapter interface, which the Chat class uses to route events and send messages. When a webhook arrives, the adapter:
- Verifies the request signature.
- Parses the platform-specific payload into a normalized
Message. - Passes the message to the
Chatclass, which routes it to your handlers.
When your handler posts a reply, the adapter converts it from markdown, an AST, or a card into the platform's native format.
Using multiple adapters
Register multiple adapters and your event handlers work across all of them:
Each adapter reads its credentials from environment variables, so you only pass config to override them.
This example uses Redis for state. See State Adapters for all available options.
Each adapter gets a webhook handler at bot.webhooks.<name>, keyed by the name you registered it under.
Customizing an adapter via subclassing
Official adapters expose their extension points as protected members, so you can subclass an adapter to override or extend its behavior without forking the package. Use this to handle a payload type the built-in adapter doesn't cover, intercept verification, or wrap an existing handler.
Construct your subclass anywhere you'd construct the base adapter, for example adapters: { telegram: new CustomTelegramAdapter({ ... }) }. Members marked private stay inaccessible. If you need a hook that isn't protected, open an issue.
protected members are broader than the public API and are not yet stable. Their signatures may change in minor releases. Pin the adapter version you build against, watch that adapter's changelog, and override the smallest hook that solves your problem so upgrades stay manageable. If you rely on a particular hook, open an issue so we can consider making it a stable, documented extension point.
Build an adapter
Implement the Adapter interface for any messaging platform.
List a vendor-official adapter
How platform vendors qualify and list a maintained adapter in the Vendor Official tier.
Read more
Getting Started
Pick a guide to start building with Chat SDK.
Overview
Overview of Chat SDK adapters, adapter tiers, and where to find platform, state, and catalog guides.
State Adapters
State adapters store thread subscriptions, distributed locks, and cached data for your bot.
Adapter Catalog
Use @chat-adapter/catalog to list Chat SDK adapters, check their capabilities, and read setup requirements without importing adapter packages.