chat-sdk
Skill1 starsChanged 8 months agoApache-2.0View on GitHub
Build multi-platform chat bots with Chat SDK (`chat` npm package). Use when building Slack, Teams, Google Chat, Discord, Telegram, GitHub, Linear, or WhatsApp bots, handling mentions, DMs, threads, reactions, slash commands, cards, modals, files, or AI streaming, setting up webhook routes or multi-adapter bots, or building custom adapters. Triggers on "chat sdk", "chat bot", "slack bot", "teams bot", "@chat-adapter", and cross-platform bot development.
13 other projects use a version of this, 7 of them edited.
Adopted by
Most recently taken up by
- lobehub/lobehubedited, first seen Nov 5, 2026
- mongodb/agentstheir own version, first seen Nov 1, 2026
- vercel/chattheir own version, first seen Oct 13, 2026
- anthropics/claude-quickstartstheir own version, first seen Oct 13, 2026
- openai/pluginsedited, first seen Oct 13, 2026
- BuFi007/open-agentsedited, first seen Oct 13, 2026
Used with
Projects with it also use linear.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
OpenAISkilllinear
Manage issues, projects & team workflows in Linear. Use when the user wants to read, create or updates tickets in Linear.
Also in 3 projects that use this
Other versions13 projects use a version of this.
Word for word · 1
- vercel-labs/chat-sdk-form-bot★ 3100% same
Edited · 7
- lobehub/lobe-chat★ 84k23% same
- lobehub/lobehub★ 84k23% same
- openai/plugins★ 7.8k65% same
- vercel-labs/open-agents★ 5.8k80% same
- databuddy-analytics/Databuddy★ 1.2k63% same
- vercel-labs/workflow-workshop★ 679% same
- BuFi007/open-agents★ 180% same
Wrote their own version · 5
- anthropics/claude-quickstarts★ 19ksame name
- vercel/chat★ 2.5ksame name
- microsoft/skills-for-copilot-studio★ 486same name
- vercel/vercel-plugin★ 328same name
- mongodb/agents★ 11same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository7 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- slack-agentSkill
- workflowSkill
- chat-sdkSkill
- slack-agentSkill
- workflowSkill
The file
We split this skill into the rules it gives an agent
5 rules. 0 are common, 3 are distinctive, and 2 are very specific to this project.
0
Common
Most of the 9 edited versions we read keep these.
3
Distinctive
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 12
When Chat SDK is installed in a user project, inspect the published files that ship in node_modules:
- Distinctive: line 22
If one of the paths below does not exist, that package is not installed in the project yet.
- Distinctive: line 24
Read these before writing code:
- Very specific: line 100
Read node_modules/chat/docs/handling-events.mdx, node_modules/chat/docs/actions.mdx, node_modules/chat/docs/modals.mdx, and …
- Distinctive: line 157
Read these published docs first:
“Common” is measured: kept by at least 6 in 10 of the 9 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Chat SDK
Unified TypeScript SDK for building chat bots across Slack, Teams, Google Chat, Discord, Telegram, GitHub, Linear, and WhatsApp. Write bot logic once, deploy everywhere.
Start with published sources
When Chat SDK is installed in a user project, inspect the published files that ship in node_modules:
node_modules/chat/docs/ # bundled docs
node_modules/chat/dist/index.d.ts # core API types
node_modules/chat/dist/jsx-runtime.d.ts # JSX runtime types
node_modules/chat/docs/contributing/ # adapter-authoring docs
node_modules/chat/docs/guides/ # framework/platform guidesIf one of the paths below does not exist, that package is not installed in the project yet.
Read these before writing code:
node_modules/chat/docs/getting-started.mdx— install and setupnode_modules/chat/docs/usage.mdx—Chatconfig and lifecyclenode_modules/chat/docs/handling-events.mdx— event routing and handlersnode_modules/chat/docs/threads-messages-channels.mdx— thread/channel/message modelnode_modules/chat/docs/posting-messages.mdx— post, edit, delete, schedulenode_modules/chat/docs/streaming.mdx— AI SDK integration and streaming semanticsnode_modules/chat/docs/cards.mdx— JSX cardsnode_modules/chat/docs/actions.mdx— button/select interactionsnode_modules/chat/docs/modals.mdx— modal submit/close flowsnode_modules/chat/docs/slash-commands.mdx— slash command routingnode_modules/chat/docs/direct-messages.mdx— DM behavior andopenDM()node_modules/chat/docs/files.mdx— attachments/uploadsnode_modules/chat/docs/state.mdx— persistence, locking, dedupenode_modules/chat/docs/adapters.mdx— cross-platform feature matrixnode_modules/chat/docs/api/chat.mdx— exactChatAPInode_modules/chat/docs/api/thread.mdx— exactThreadAPInode_modules/chat/docs/api/message.mdx— exactMessageAPInode_modules/chat/docs/api/modals.mdx— modal element and event details
For the specific adapter or state package you are using, inspect that installed package's dist/index.d.ts export surface in node_modules.
Quick start
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(),
dedupeTtlMs: 600_000,
});
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}`);
});Core concepts
- Chat — main entry point; coordinates adapters, routing, locks, and state
- Adapters — platform-specific integrations for Slack, Teams, Google Chat, Discord, Telegram, GitHub, Linear, and WhatsApp
- State adapters — persistence for subscriptions, locks, dedupe, and thread state
- Thread — conversation context with
post(),stream(),subscribe(),setState(),startTyping() - Message — normalized content with
text,formatted, attachments, author info, and platformraw - Channel — container for threads and top-level posts
Event handlers
| Handler | Trigger |
onNewMention | Bot @-mentioned in an unsubscribed thread |
onDirectMessage | New DM in an unsubscribed DM thread |
onSubscribedMessage | Any message in a subscribed thread |
onNewMessage(regex) | Regex match in an unsubscribed thread |
onReaction(emojis?) | Emoji added or removed |
onAction(actionIds?) | Button clicks and select/radio interactions |
onModalSubmit(callbackId?) | Modal form submitted |
onModalClose(callbackId?) | Modal dismissed/cancelled |
onSlashCommand(commands?) | Slash command invocation |
onAssistantThreadStarted | Slack assistant thread opened |
onAssistantContextChanged | Slack assistant context changed |
onAppHomeOpened | Slack App Home opened |
onMemberJoinedChannel | Slack member joined channel event |
Read node_modules/chat/docs/handling-events.mdx, node_modules/chat/docs/actions.mdx, node_modules/chat/docs/modals.mdx, and node_modules/chat/docs/slash-commands.mdx before wiring handlers. onDirectMessage behavior is documented in node_modules/chat/docs/direct-messages.mdx.
Streaming
Pass any AsyncIterable<string> to thread.post() or thread.stream(). For AI SDK, prefer result.fullStream over result.textStream when available so step boundaries are preserved.
import { ToolLoopAgent } from "ai";
const agent = new ToolLoopAgent({ model: "anthropic/claude-4.5-sonnet" });
bot.onNewMention(async (thread, message) => {
const result = await agent.stream({ prompt: message.text });
await thread.post(result.fullStream);
});Key details:
streamingUpdateIntervalMscontrols post+edit fallback cadencefallbackStreamingPlaceholderTextdefaults to"..."; setnullto disable- Structured
StreamChunksupport is Slack-only; other adapters ignore non-text chunks
Cards and modals (JSX)
Set jsxImportSource: "chat" in tsconfig.json.
Card components:
Card,CardText,Section,Fields,Field,Button,CardLink,LinkButton,Actions,Select,SelectOption,RadioSelect,Table,Image,Divider
Modal components:
Modal,TextInput,Select,SelectOption,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>
);Adapters
For the latest platform adapters, state adapters, and community adapters, see chat-sdk.dev/adapters.
Building a custom adapter
Read these published docs first:
node_modules/chat/docs/contributing/building.mdxnode_modules/chat/docs/contributing/testing.mdxnode_modules/chat/docs/contributing/publishing.mdx
Also inspect:
node_modules/chat/dist/index.d.ts—Adapterand related interfacesnode_modules/@chat-adapter/shared/dist/index.d.ts— shared errors and utilities- Installed official adapter
dist/index.d.tsfiles — reference implementations for config and APIs
A custom adapter needs request verification, webhook parsing, message/thread/channel operations, ID encoding/decoding, and a format converter. Use BaseFormatConverter from chat and shared utilities from @chat-adapter/shared.
Webhook setup
Each registered adapter exposes bot.webhooks.<name>. Wire those directly to your HTTP framework routes. See node_modules/chat/docs/guides/slack-nextjs.mdx and node_modules/chat/docs/guides/discord-nuxt.mdx for framework-specific route patterns.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

