Universal chat layer for
building bots and agents
A unified TypeScript SDK for building chat bots with type-safe handlers, JSX cards, and multi-platform support—powered by Vercel
Deploy to production?
PR #103 passed every check.
Same code on every platform. See all adapters
- Weekly downloads
- 5.1M
- GitHub stars
- 2.4K
- Contributors
- 132+
- Adapters
- 15+
The platform agnostic chat toolkit
The open-source chat toolkit designed to help developers build chat bots that run on Slack, Teams, Google Chat, Discord, WhatsApp, and more.
Multi-platform support
Ship to every chat platform from one codebase, without per-platform rewrites.
Event-driven by design
React to mentions, reactions, and replies with handlers scoped to each thread.
Type-safe by default
Strict types for adapters, handlers, and JSX cards, checked at build time.
Explore Chat SDK
bot.ts
Scale with confidence
Plug Chat SDK into an entire ecosystem designed for AI-native chat experiences that scale.
Build with Chat SDK today
Start from a template, or follow a guide to use Chat SDK with Vercel Connect and eve.
Vercel Connect Guide
Authenticate a Slack bot with Vercel Connect instead of stored secrets.
const slack = createSlackAdapter({ // Credentials come from Vercel Connect // instead of stored secrets ...connectSlackAdapter("slack/acme-slack"),});
export const bot = new Chat({ userName: "mybot", adapters: { slack }, state: createRedisState(),});Knowledge Agent Template
Answer questions from synced docs and repos with file-system search.
// Search synced docs and reposconst savoir = createSavoir({ apiUrl: process.env.SAVOIR_URL, apiKey: process.env.SAVOIR_API_KEY,});
const { text } = await generateText({ model, tools: savoir.tools, prompt: "How do I configure auth?",});eve Integration Guide
Send Chat SDK messages to an eve agent and stream its replies back to the thread.
const { bot, send } = chatSdkChannel({ userName: "my-agent", adapters: { slack }, state: createRedisState(),});
bot.onNewMention(async (thread, message) => { await thread.subscribe(); await send(message.text, { thread });});