persona-bot
v1.0.0
Published
Multi-persona AI chat bot framework built on Chat SDK
Maintainers
Readme
persona-bot
Multi-persona AI chat bot framework built on Chat SDK. One Slack app, multiple AI personalities.
Users @mention your bot, pick a persona from a card, and chat — each thread remembers which persona is active. Switch mid-conversation with a button click.
Quick Start
npm install persona-bot chat @chat-adapter/slack @chat-adapter/state-redis @anthropic-ai/sdkimport { createMultiBot, defaultPersonas, createAnthropicProvider } from "persona-bot";
import { createSlackAdapter } from "@chat-adapter/slack";
import { createRedisState } from "@chat-adapter/state-redis";
const bot = createMultiBot({
personas: defaultPersonas,
ai: createAnthropicProvider(),
adapters: { slack: createSlackAdapter() },
state: createRedisState(),
});
await bot.listen(3100);Set environment variables:
SLACK_BOT_TOKEN=xoxb-...
SLACK_SIGNING_SECRET=...
ANTHROPIC_API_KEY=sk-ant-...
REDIS_URL=redis://localhost:6379Default Personas
| Persona | Description | |---------|-------------| | Code Bot | Senior engineer. Production-ready code. | | Writer Bot | Professional copywriter. Crisp content. | | Research Bot | Deep analyst. Structured breakdowns. | | Creative Bot | Wild brainstormer. Unconventional ideas. | | DevOps Bot | Infrastructure, Docker, CI/CD expert. |
Custom Personas
const bot = createMultiBot({
personas: [
{
id: "support",
name: "Support Bot",
emoji: ":headphones:",
tagline: "Customer support specialist.",
systemPrompt: "You are a friendly customer support agent...",
color: "primary",
},
{
id: "sales",
name: "Sales Bot",
emoji: ":chart_with_upwards_trend:",
tagline: "Revenue-focused advisor.",
systemPrompt: "You are a sales strategist...",
},
],
ai: createAnthropicProvider({ model: "claude-sonnet-4-20250514" }),
adapters: { slack: createSlackAdapter() },
state: createRedisState(),
});Custom AI Provider
Bring any LLM — just implement the AIProvider interface:
import type { AIProvider } from "persona-bot";
const openaiProvider: AIProvider = {
async *streamResponse(persona, history) {
const stream = await openai.chat.completions.create({
model: "gpt-4o",
stream: true,
messages: [
{ role: "system", content: persona.systemPrompt },
...history,
],
});
for await (const chunk of stream) {
const text = chunk.choices[0]?.delta?.content;
if (text) yield text;
}
},
};
const bot = createMultiBot({
personas: [...],
ai: openaiProvider,
adapters: { slack: createSlackAdapter() },
state: createRedisState(),
});Slash Commands
| Command | Description |
|---------|-------------|
| /switch | Show persona picker in the channel |
| /bots | List all available personas |
Customize or disable:
createMultiBot({
// ...
commands: {
switch: "/pick", // rename
list: false, // disable
},
});Configuration
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| personas | Persona[] | required | At least one persona |
| ai | AIProvider | required | AI streaming provider |
| adapters | Record<string, Adapter> | required | Chat SDK platform adapters |
| state | StateAdapter | required | Chat SDK state adapter |
| userName | string | "multibot" | Bot display name |
| defaultPersona | string | first persona | Fallback persona ID |
| historyLimit | number | 30 | Max messages in conversation context |
| logger | LogLevel \| Logger | "info" | Logging level |
| ui | Partial<UIConfig> | - | Customize card text |
| commands | CommandsConfig | - | Customize slash commands |
Multi-Platform
Chat SDK supports Slack, Teams, Discord, Google Chat, GitHub, and Linear. Add more adapters:
import { createSlackAdapter } from "@chat-adapter/slack";
import { createDiscordAdapter } from "@chat-adapter/discord";
const bot = createMultiBot({
// ...
adapters: {
slack: createSlackAdapter(),
discord: createDiscordAdapter(),
},
});License
MIT
