chat-sdk by lobehub/lobehub
npx skills add https://github.com/lobehub/lobehub --skill chat-sdk用于构建跨 Slack、Teams、Google Chat、Discord、GitHub 和 Linear 的聊天机器人的统一 TypeScript SDK。一次编写机器人逻辑,随处部署。
chat 包在 node_modules/chat/docs/ 中附带了完整的文档和 TypeScript 源类型。在编写代码之前,请务必阅读这些内容:
node_modules/chat/docs/ # 完整文档 (MDX 文件)
node_modules/chat/dist/ # 构建的类型文件 (.d.ts 文件)
根据任务需要阅读的关键文档:
docs/getting-started.mdx — 设置指南docs/usage.mdx — 事件处理器、线程、消息、频道docs/streaming.mdx — 使用 AI SDK 进行 AI 流式传输docs/cards.mdx — JSX 交互式卡片广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
docs/actions.mdx — 按钮/下拉菜单处理器docs/modals.mdx — 表单对话框 (仅限 Slack)docs/adapters/*.mdx — 平台特定的适配器设置docs/state/*.mdx — 状态适配器配置 (Redis, ioredis, memory)同时阅读 node_modules/chat/dist/ 中的 TypeScript 类型以了解完整的 API 接口。
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}`);
});
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-4.5-sonnet' });
bot.onNewMention(async (thread, message) => {
const result = await agent.stream({ prompt: message.text });
await thread.post(result.textStream);
});
在 tsconfig 中设置 jsxImportSource: "chat"。组件包括:Card, CardText, Button, Actions, Fields, Field, Select, SelectOption, Image, Divider, LinkButton, Section, RadioSelect。
await thread.post(
<Card title="Order #1234">
<CardText>您的订单已收到!</CardText>
<Actions>
<Button id="approve" style="primary">
批准
</Button>
<Button id="reject" style="danger">
拒绝
</Button>
</Actions>
</Card>,
);
| 包 | 用途 |
|---|---|
chat | 核心 SDK |
@chat-adapter/slack | Slack |
@chat-adapter/teams | Microsoft Teams |
@chat-adapter/gchat | Google Chat |
@chat-adapter/discord | Discord |
@chat-adapter/github | GitHub Issues |
@chat-adapter/linear | Linear Issues |
@chat-adapter/state-redis | Redis 状态 (生产环境) |
@chat-adapter/state-ioredis | ioredis 状态 (替代方案) |
@chat-adapter/state-memory | 内存状态 (开发环境) |
此 monorepo 使用 Changesets 进行版本控制和变更日志管理。每个更改包行为的 PR 都必须包含一个 changeset。
pnpm changeset
# → 选择受影响的包 (例如 @chat-adapter/slack, chat)
# → 选择更新类型:patch (修复), minor (功能), major (破坏性变更)
# → 为 CHANGELOG 写一个简短的摘要
这会在 .changeset/ 中创建一个文件 — 将其与 PR 一起提交。当合并到 main 分支时,Changesets GitHub Action 会打开一个 "Version Packages" PR 来更新版本和 CHANGELOG。合并该 PR 会发布到 npm。
每个适配器都通过 bot.webhooks.{platform} 公开一个 webhook 处理器。将这些连接到你的 HTTP 框架的路由(例如 Next.js API 路由、Hono、Express)。
每周安装量
82
代码仓库
GitHub 星标
74.5K
首次出现
2026年3月1日
安全审计
安装于
kimi-cli82
gemini-cli82
amp82
cline82
github-copilot82
codex82
Unified TypeScript SDK for building chat bots across Slack, Teams, Google Chat, Discord, GitHub, and Linear. Write bot logic once, deploy everywhere.
The chat package ships with full documentation in node_modules/chat/docs/ and TypeScript source types. Always read these before writing code:
node_modules/chat/docs/ # Full documentation (MDX files)
node_modules/chat/dist/ # Built types (.d.ts files)
Key docs to read based on task:
docs/getting-started.mdx — setup guidesdocs/usage.mdx — event handlers, threads, messages, channelsdocs/streaming.mdx — AI streaming with AI SDKdocs/cards.mdx — JSX interactive cardsdocs/actions.mdx — button/dropdown handlersdocs/modals.mdx — form dialogs (Slack only)docs/adapters/*.mdx — platform-specific adapter setupdocs/state/*.mdx — state adapter config (Redis, ioredis, memory)Also read the TypeScript types from node_modules/chat/dist/ to understand the full API surface.
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}`);
});
post(), subscribe(), startTyping()text, formatted (mdast AST), raw| Handler | Trigger |
|---|---|
onNewMention | Bot @-mentioned in unsubscribed thread |
onSubscribedMessage | Any message in subscribed thread |
onNewMessage(regex) | Messages matching pattern in unsubscribed threads |
onSlashCommand("/cmd") | Slash command invocations |
onReaction(emojis) | Emoji reactions added/removed |
onAction(actionId) |
Pass any AsyncIterable<string> to thread.post(). Works with AI SDK's textStream:
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.textStream);
});
Set jsxImportSource: "chat" in tsconfig. Components: Card, CardText, Button, Actions, Fields, Field, Select, SelectOption, Image, Divider, LinkButton, , .
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>,
);
| Package | Purpose |
|---|---|
chat | Core SDK |
@chat-adapter/slack | Slack |
@chat-adapter/teams | Microsoft Teams |
@chat-adapter/gchat | Google Chat |
@chat-adapter/discord | Discord |
@chat-adapter/github | GitHub Issues |
This monorepo uses Changesets for versioning and changelogs. Every PR that changes a package's behavior must include a changeset.
pnpm changeset
# → select affected package(s) (e.g. @chat-adapter/slack, chat)
# → choose bump type: patch (fixes), minor (features), major (breaking)
# → write a short summary for the CHANGELOG
This creates a file in .changeset/ — commit it with the PR. When merged to main, the Changesets GitHub Action opens a "Version Packages" PR to bump versions and update CHANGELOGs. Merging that PR publishes to npm.
Each adapter exposes a webhook handler via bot.webhooks.{platform}. Wire these to your HTTP framework's routes (e.g. Next.js API routes, Hono, Express).
Weekly Installs
82
Repository
GitHub Stars
74.5K
First Seen
Mar 1, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
kimi-cli82
gemini-cli82
amp82
cline82
github-copilot82
codex82
Angular开发者指南:从项目创建到组件与信号式状态管理的最佳实践
598 周安装
| Button clicks and dropdown selections |
onAssistantThreadStarted | Slack Assistants API thread opened |
onAppHomeOpened | Slack App Home tab opened |
SectionRadioSelect@chat-adapter/linear | Linear Issues |
@chat-adapter/state-redis | Redis state (production) |
@chat-adapter/state-ioredis | ioredis state (alternative) |
@chat-adapter/state-memory | In-memory state (development) |