Files
XLor e45a67f491 feat: add adpater disconnect hook (#219)
* feat: add adpater disconnect hook

* fix: use Promise.allSettled for resilient shutdown, add docs and changeset

- Use Promise.allSettled so one failing adapter doesn't prevent others from disconnecting
- Add test for error resilience during shutdown
- Remove unnecessary type guards in tests
- Fix lint: sort interface members, format test file
- Add changeset (minor bump for chat)
- Document disconnect hook in API docs and adapter building guide

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Hayden Bleasel <hello@haydenbleasel.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 12:17:37 -07:00
..
2026-03-16 03:57:36 -04:00
2026-03-16 03:57:36 -04:00
2026-03-05 16:13:33 -08:00

chat

npm version npm downloads

Core SDK for building multi-platform chat bots. Provides the Chat class, event handlers, JSX card runtime, emoji helpers, and type-safe message formatting.

Installation

npm install chat

Usage

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! }),
  dedupeTtlMs: 600_000, // 10 minutes (default: 5 min)
});

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}`);
});

Tip: PostgreSQL and ioredis adapters are also available for production. See State Adapters for all options.

Configuration

Option Type Default Description
userName string required Default bot username across all adapters
adapters Record<string, Adapter> required Map of adapter name to adapter instance
state StateAdapter required State adapter for subscriptions, locking, and dedup
logger Logger | LogLevel "info" Logger instance or log level ("silent" to disable)
streamingUpdateIntervalMs number 500 Update interval for fallback streaming (post + edit) in ms
dedupeTtlMs number 300000 TTL for message deduplication entries in ms. Increase if webhook cold starts cause platform retries (e.g., Slack's http_timeout retry) that arrive after the default window

AI coding agent support

If you use an AI coding agent like Claude Code, you can teach it about Chat SDK:

npx skills add vercel/chat

Documentation

Full documentation is available at chat-sdk.dev/docs.

  • Usage — event handlers, threads, messages, channels
  • Chat API — full Chat class reference
  • Cards — JSX-based interactive cards
  • Streaming — AI SDK integration
  • Emoji — cross-platform emoji helpers

License

MIT