Slack用、Teams用、Discord用とプラットフォームごとにボットのコードを書き分けていませんか。APIの仕様が違い、ストリーミングの実装方法も異なり、同じ機能を何度も作り直す作業は開発者の時間を奪います。
Vercelが公開したオープンソースの「Chat SDK」は、この問題を解決するTypeScriptライブラリです。1つのコードベースでSlack、Microsoft Teams、Discord、Google Chat、Telegram、GitHub、Linear、WhatsAppに対応するボットを構築できます。
この記事でわかること
- Chat SDKが解決する課題と基本的な仕組み
- getUser・Socket Mode・Teamsネイティブストリーミングなど最新機能の内容
- AI SDKとの連携によるLLMストリーミングの実装方法
- 導入手順と対応プラットフォームの機能差
Chat SDKとは何か
Chat SDKは、Vercelが開発したチャットボット構築用のTypeScriptライブラリです。npm install chat でインストールでき、2026年5月時点で週間ダウンロード数は51万件を超えています。MITライセンスで公開されており、GitHubでは1,900以上のスターを獲得しています。
このSDKの核となるのは「アダプター」という設計です。ボットのロジック(メンション時の応答、リアクションへの反応など)は共通コードとして1回だけ書きます。プラットフォーム固有の処理はアダプターが吸収するため、SlackからDiscordに展開先を変えてもハンドラーの書き換えは不要です。
import { Chat } from "chat";
import { createSlackAdapter } from "@chat-adapter/slack";
import { createRedisState } from "@chat-adapter/state-redis";
const bot = new Chat({
userName: "mybot",
adapters: {
slack: createSlackAdapter(),
},
state: createRedisState(),
});
bot.onNewMention(async (thread) => {
await thread.subscribe();
await thread.post("Hello!");
});
各アダプターは環境変数から認証情報を自動検出します。SLACK_BOT_TOKENとSLACK_SIGNING_SECRETを設定するだけで、追加の設定なしにSlackボットが動きます。
最新リリースの注目機能
2026年5月1日に公開された最新版では、4つの機能が追加されました。
getUser()でユーザー情報を取得
chat.getUser() メソッドにより、ユーザーIDから名前・メールアドレス・アバター・ボットかどうかの情報を取得できるようになりました。Slack、Microsoft Teams、Discord、Google Chat、GitHub、Linear、Telegramの7プラットフォームに対応しています。
const user = await bot.getUser("U123456");
console.log(user?.fullName); // "Alice Smith"
console.log(user?.email); // "alice@contoso.com"
複数のアダプターを登録している場合、ユーザーIDのフォーマットからプラットフォームを自動判定します。判定できない場合はAMBIGUOUS_USER_IDエラーが返るため、message.authorを直接渡すか、アダプター経由で呼び出す方法に切り替えます。
Microsoft Teamsのネイティブストリーミング
Teamsアダプターが、DM(ダイレクトメッセージ)でネイティブストリーミングに対応しました。Teams SDKのstream.emit()を直接使い、AIの応答をリアルタイムに表示します。グループチャットでは従来どおり「投稿→編集」のフォールバック方式が使われます。
Slackは以前からネイティブストリーミングAPIに対応していたため、これでSlackとTeamsの両方でネイティブな速度感のあるAI応答が実現します。
SlackのSocket Mode対応
企業のファイアウォール内で動作するボット向けに、Slack Socket Modeがサポートされました。通常のWebhook方式では外部からアクセス可能なエンドポイントが必要ですが、Socket ModeはWebSocket経由でSlackに接続するため、公開URLが不要です。
const bot = new Chat({
userName: "mybot",
adapters: {
slack: createSlackAdapter({
mode: "socket",
appToken: process.env.SLACK_APP_TOKEN!,
botToken: process.env.SLACK_BOT_TOKEN!,
}),
},
});
Vercelのようなサーバーレス環境でも、cronジョブで定期的にSocket接続を起動し、受信したイベントをWebhookエンドポイントに転送する仕組みが用意されています。
アダプターごとのカスタムAPIエンドポイント
TeamsアダプターではapiUrlオプションにより、APIのベースURLを上書きできるようになりました。GCC-Highやソブリンクラウドなど、標準とは異なるTeams環境に接続する場合に使います。
AI SDKとの連携
Chat SDKはVercelのAI SDKと直接連携します。thread.post()にAI SDKのストリームをそのまま渡すだけで、LLMの応答をリアルタイムにチャットプラットフォームへ配信できます。
import { streamText } from "ai";
bot.onNewMention(async (thread, message) => {
await thread.subscribe();
const result = await streamText({
model: "anthropic/claude-sonnet-4",
prompt: message.text,
});
await thread.post(result.fullStream);
});
textStreamではなくfullStreamを使う理由があります。AIエージェントがツール呼び出しを挟んで複数ステップのテキストを生成する場合、textStreamはすべてのテキストを区切りなしで結合します。fullStreamにはfinish-stepイベントが含まれるため、Chat SDKがステップ間に段落区切りを自動挿入します。
ストリーミング中のMarkdown表示にも工夫があります。チャンクが**boldのように途中で切れた状態で届いても、SDKが自動的にMarkdownを補完して正しく表示します。最終メッセージでは元のMarkdownがそのまま保持されます。
プラットフォーム間の機能差
すべてのプラットフォームが同じ機能をサポートしているわけではありません。主な違いを整理します。
ストリーミングは、Slackがネイティブ対応、TeamsがDMのみネイティブ対応、その他は「投稿→編集」のフォールバック方式です。カードのフォーマットも、SlackはBlock Kit、TeamsはAdaptive Cards、DiscordはEmbed、TelegramはインラインキーボードとMarkdownの組み合わせと、各プラットフォームのネイティブフォーマットに自動変換されます。
テーブル表示も同様です。JSXベースのTableコンポーネントで記述すると、Slackでは Block Kitテーブル、TeamsとDiscordではGFM Markdownテーブル、Google ChatではASCIIテーブルとして表示されます。
モーダル(フォームダイアログ)はSlackとTeamsが対応しており、スラッシュコマンドは現時点ではSlackのみの対応です。
導入方法
Chat SDKの導入は3ステップで完了します。
まずコアパッケージと使用するアダプターをインストールします。
npm install chat @chat-adapter/slack @chat-adapter/state-redis
次に、Slackアプリの設定でBot User OAuth TokenとSigning Secretを取得し、環境変数として設定します。
SLACK_BOT_TOKEN=xoxb-...
SLACK_SIGNING_SECRET=...
REDIS_URL=redis://localhost:6379
最後に、ボットのロジックを書いてWebhookルートに接続します。Next.jsの場合は以下のようになります。
// app/api/webhooks/slack/route.ts
import { bot } from "@/lib/bot";
export const POST = bot.webhooks.slack;
状態管理にはRedis、ioredis、PostgreSQLの3つのアダプターが用意されています。すでにPostgreSQLを運用しているチームは、Redisを追加せずにボットの状態を永続化できます。
AIコーディングエージェントを使っている場合は、npx skills add vercel/chatでSDKのドキュメントとベストプラクティスをエージェントに読み込ませることも可能です。
まとめ
Chat SDKの価値は、プラットフォームごとの差異をアダプター層に閉じ込める設計にあります。ボットのコアロジックは1回だけ書き、展開先を増やすにはアダプターを追加するだけです。AI SDKとの統合により、LLMストリーミングの実装もthread.post(result.fullStream)の1行で済みます。
Chat SDKはパブリックベータとして公開中で、15以上のアダプターが利用可能です。社内ツールとしてのAIボットや、複数チャネルに展開するカスタマーサポートボットなど、マルチプラットフォーム対応が求められる場面で検討する価値があります。