惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Last Week in AI
Last Week in AI
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
WordPress大学
WordPress大学
T
The Blog of Author Tim Ferriss
V
Visual Studio Blog
小众软件
小众软件
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
IT之家
IT之家
Vercel News
Vercel News
C
Check Point Blog
Google DeepMind News
Google DeepMind News
月光博客
月光博客
D
DataBreaches.Net
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog

Chat SDK Documentation

History | Chat SDK History | Chat SDK List a vendor-official adapter | Chat SDK Approvals | Chat SDK Vercel Connect | Chat SDK Teams Low-Level APIs | Chat SDK CLI | Chat SDK State Adapters | Chat SDK Cards | Chat SDK Getting Started | Chat SDK Introduction | Chat SDK Modals | Chat SDK Slack Low-Level APIs | Chat SDK Streaming | Chat SDK Testing | Chat SDK Overview | Chat SDK toAiMessages | Chat SDK Cards | Chat SDK Overview | Chat SDK Markdown | Chat SDK Modals | Chat SDK AI SDK Tools | Chat SDK Types | Chat SDK Message Subject | Chat SDK Conversation History | Chat SDK Transcripts | Chat SDK Slack bot with Next.js and Redis Actions | Chat SDK Direct Messages | Chat SDK Emoji | Chat SDK
Platform Adapters | Chat SDK
Vercel · 2026-06-16 · via Chat SDK Documentation

Platform-specific adapters that connect your bot to any messaging platform.

Platform adapters handle webhook verification, message parsing, and API calls for each messaging platform. Install only the adapters you need. Browse all available adapters, 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 the same bot serves Slack, Teams, and any browser framework out of the box.

Ready to build your own? Follow the building guide.

Messaging

Rich content

FeatureDiscordGoogle ChatGitHubLinearMessengerSlackMicrosoft TeamsTelegramTwilioWebWhatsApp Business Cloud
Card formatEmbedsGoogle Chat CardsGFM MarkdownMarkdownGeneric / Button TemplatesBlock KitAdaptive CardsMarkdownV2 + inline keyboardPlain text fallbackMarkdown only (v1)WhatsApp templates
ButtonsMax 3, postbackInline keyboardInteractive replies
Link buttonsweb_urlInline keyboard URLs
Select menus
TablesGFMASCIIGFMGFMASCIIBlock KitGFMNative messages / ASCII cardsASCIIGFM
FieldsASCIITemplate variables
Images in cards
Modals

Conversations

Message history

Messaging

FeatureSlackTeamsGoogle ChatDiscordTelegramGitHubLinearWhatsAppMessenger
Post message
Edit message Partial
Delete message Partial
File uploads Single file/media Images, audio, docs
Streaming Native Native (DMs) / Buffered Post+Edit Post+Edit Rich drafts / Post+Edit Buffered Agent sessions / Post+Edit Buffered Buffered
Scheduled messages Native

Rich content

FeatureSlackTeamsGoogle ChatDiscordTelegramGitHubLinearWhatsAppMessenger
Card formatBlock KitAdaptive CardsGoogle Chat CardsEmbedsMarkdown + inline keyboard buttonsGFM MarkdownMarkdownWhatsApp templatesGeneric/Button Templates
Buttons Inline keyboard callbacks Interactive replies Max 3, postback
Link buttons Inline keyboard URLs
Select menus
Tables Block Kit GFM ASCII GFM Native messages / ASCII cards GFM GFM ASCII
Fields Template variables ASCII
Images in cards
Modals

Conversations

FeatureSlackTeamsGoogle ChatDiscordTelegramGitHubLinearWhatsAppMessenger
Slash commands
Mentions
Add reactions
Remove reactions
Typing indicator Agent sessions
DMs
Ephemeral messages Native Native
User lookup (getUser) Cached Cached Seen users
Parent subject (message.subject)
Native client (.webClient / .octokit / .linearClient)
Custom API endpoint (apiUrl)

Message history

FeatureSlackTeamsGoogle ChatDiscordTelegramGitHubLinearWhatsAppMessenger
Fetch messages Cached Cached sent messages only Cached sent messages only
Fetch single message Cached Cached
Fetch thread info
Fetch channel messages Cached Cached
List threads
Fetch channel info
Post channel message

indicates partial support. The feature works with limitations. See individual adapter pages for details.

Each adapter implements a standard interface that the Chat class uses to route events and send messages. When a webhook arrives:

  1. The adapter verifies the request signature
  2. Parses the platform-specific payload into a normalized Message
  3. Routes to your handlers via the Chat class
  4. Converts outgoing messages from markdown/AST/cards to the platform's native format

Register multiple adapters and your event handlers work across all of them:

import { Chat } from "chat";
import { createSlackAdapter } from "@chat-adapter/slack";
import { createTeamsAdapter } from "@chat-adapter/teams";
import { createGoogleChatAdapter } from "@chat-adapter/gchat";
import { createRedisState } from "@chat-adapter/state-redis";

const bot = new Chat({
  userName: "mybot",
  adapters: {
    slack: createSlackAdapter(),
    teams: createTeamsAdapter(),
    gchat: createGoogleChatAdapter(),
  },
  state: createRedisState(),
});

// This handler fires for mentions on any platform
bot.onNewMention(async (thread) => {
  await thread.subscribe();
  await thread.post("Hello!");
});

Each adapter auto-detects credentials from environment variables, so you only need to pass config when overriding defaults.

The examples above use Redis for state. See State Adapters for all available options.

Each adapter creates a webhook handler accessible via bot.webhooks.<name>.

Each official adapter exposes its extension surface as protected members so you can subclass it to override or extend platform-specific behavior without forking the package. Use this when you need to handle a payload type the built-in adapter doesn't cover, intercept verification, or wrap an existing handler.

import { TelegramAdapter, type TelegramUpdate } from "@chat-adapter/telegram";
import type { WebhookOptions } from "chat";

export class CustomTelegramAdapter extends TelegramAdapter {
  protected override processUpdate(
    update: TelegramUpdate,
    options?: WebhookOptions
  ): void {
    // Handle a payload type the base adapter doesn't, e.g. chat_join_request.
    if ("chat_join_request" in update) {
      this.logger.info("Received chat_join_request", { update });
      return;
    }
    super.processUpdate(update, options);
  }
}

Construct your subclass anywhere you'd construct the base adapter, for example, adapters: { telegram: new CustomTelegramAdapter({ ... }) }. Members marked private intentionally remain inaccessible. If you find a hook you need that isn't protected, please open an issue.

The protected extension surface is intentionally broader than the public API but is not yet considered fully stable. Method signatures may evolve in minor releases as we learn from real-world subclasses. Pin the adapter version you build against, watch the changelog for the affected adapter, and prefer overriding the smallest hook that solves your problem so upgrades stay easy. If you rely on a particular hook, please open an issue so we can promote it to a stable, documented extension point.