chat-sdk について
複数のチャットプラットフォーム向けボットを構築する TypeScript SDK です。プラットフォームアダプターでメッセージ、イベント、状態を扱い、スレッド返信やインタラクティブカード、ストリーミング出力にも対応します。
主な機能
- 01複数のチャットプラットフォームに対応
- 02メッセージとイベントを共通処理
- 03スレッドとチャンネルの操作
- 04状態ストレージを差し替え可能
- 05JSX のインタラクティブカード
- 06非同期ストリームをスレッドに投稿
活用シーン
- 01複数のチャット環境への共通ボットロジックの展開
- 02メンション、コマンド、メッセージへの応答
- 03ボタンやフォーム付きカードの送信
- 04AI のストリーミング出力を会話スレッドに投稿
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ lobehub/ lobehub --skill chat-sdkインストール後、Claude Code で/chat-sdkを入力して読み込まれたか確認します。
詳細
チャット SDK
Slack、Teams、Google Chat、Discord、GitHub、Linear 向けのチャットボットを構築するための、統一された TypeScript SDK です。ボットのロジックを一度書けば、あらゆるプラットフォームにデプロイできます。
重要:同梱ドキュメントを読む
chat パッケージには、node_modules/chat/docs/ に完全なドキュメントと TypeScript ソース型が含まれています。コードを書く前に、必ずこれらを読んでください:
node_modules/chat/docs/ # Full documentation (MDX files)
node_modules/chat/dist/ # Built types (.d.ts files)
タスクに応じて読むべき主なドキュメント:
docs/getting-started.mdx— セットアップガイドdocs/usage.mdx— イベントハンドラー、スレッド、メッセージ、チャンネルdocs/streaming.mdx— AI SDK を使用した AI ストリーミングdocs/cards.mdx— JSX インタラクティブカードdocs/actions.mdx— ボタン/ドロップダウンのハンドラーdocs/modals.mdx— フォームダイアログ(Slack のみ)docs/adapters.mdx、docs/platform-adapters.mdx— アダプターの概要とプラットフォーム固有のセットアップdocs/state-adapters.mdx— 状態アダプターの設定(Redis、ioredis、memory)
完全な API の範囲を理解するために、node_modules/chat/dist/ にある TypeScript 型も読んでください。
クイックスタート
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({
botToken: process.env.SLACK_BOT_TOKEN!,
signingSecret: process.env.SLACK_SIGNING_SECRET!,
}),
},
state: createRedisState({ url: process.env.REDIS_URL! }),
});
bot.onNewMention(async (thread) => {
await thread.subscribe();
await thread.post("Hello! I'm listening to this thread.");
});
bot.onSubscribedMessage(async (thread, message) => {
await thread.post(`You said: ${message.text}`);
});
主な概念
- Chat — 主なエントリーポイントで、アダプターを調整し、イベントをルーティングします
- アダプター — プラットフォーム固有のアダプター(Slack、Teams、GChat、Discord、GitHub、Linear)
- 状態 — 差し替え可能な永続化機能(本番環境では Redis、開発環境では memory)
- スレッド —
post()、subscribe()、startTyping()を備えた会話スレッド - メッセージ —
text、formatted(mdast AST)、rawを含む正規化された形式 - チャンネル — スレッドのコンテナーで、一覧表示と投稿に対応します
イベントハンドラー
| ハンドラー | トリガー |
|---|---|
onNewMention | 購読されていないスレッドでボットが @ メンションされたとき |
onSubscribedMessage | 購読中のスレッド内のすべてのメッセージ |
onNewMessage(regex) | 購読されていないスレッド内でパターンに一致するメッセージ |
onSlashCommand("/cmd") | スラッシュコマンドの呼び出し |
onReaction(emojis) | 絵文字リアクションが追加/削除されたとき |
onAction(actionId) | ボタンのクリックとドロップダウンの選択 |
onAssistantThreadStarted | Slack Assistants API のスレッドが開かれたとき |
onAppHomeOpened | Slack App Home タブが開かれたとき |
ストリーミング
任意の AsyncIterable<string> を thread.post() に渡します。AI SDK の textStream で動作します:
import { ToolLoopAgent } from 'ai';
const agent = new ToolLoopAgent({ model: 'anthropic/claude-sonnet-5' });
bot.onNewMention(async (thread, message) => {
const result = await agent.stream({ prompt: message.text });
await thread.post(result.textStream);
});
カード(JSX)
tsconfig で jsxImportSource: "chat" を設定します。コンポーネント:Card、CardText、Button、Actions、Fields、Field、Select、SelectOption、Image、Divider、LinkButton、Section、RadioSelect。
await thread.post(
<Card title="Order #1234">
<CardText>Your order has been received!</CardText>
<Actions>
<Button id="approve" style="primary">
Approve
</Button>
<Button id="reject" style="danger">
Reject
</Button>
</Actions>
</Card>,
);
パッケージ
chat と @chat-adapter/* パッケージは、このリポジトリが利用する外部 SDK です(package.json の semver 範囲でバージョンを固定しています)。このリポジトリでビルドやバージョン管理を行うものではないため、これらのパッケージについて記載する Changesets/リリースフローはありません。
| パッケージ | 用途 |
|---|---|
chat | コア SDK |
@chat-adapter/discord | Discord |
@chat-adapter/slack | Slack |
@chat-adapter/telegram | Telegram |
@chat-adapter/state-ioredis | ioredis の状態 |
@lobechat/chat-adapter-feishu | Lark/Feishu — リポジトリ内でビルド(packages/chat-adapter-feishu)。@chat-adapter/ からのものではありません |
@lobechat/chat-adapter-imessage | BlueBubbles 経由の iMessage — リポジトリ内でビルド |
@lobechat/chat-adapter-line | LINE Messaging API — リポジトリ内でビルド |
@lobechat/chat-adapter-qq | QQ Bot — リポジトリ内でビルド |
@lobechat/chat-adapter-wechat | WeChat(iLink)— リポジトリ内でビルド |
Webhook の設定
各アダプターは bot.webhooks.{platform} を通じて Webhook ハンドラーを公開します。これらを HTTP フレームワークのルート(例:Next.js API ルート、Hono、Express)に接続してください。