Reviewed-on: MSC/Daemon-Boyfriend#17
Discord AI Bot
A customizable Discord bot that responds to @mentions with AI-generated responses. Supports multiple AI providers.
Features
- Multi-Provider AI: Supports OpenAI, OpenRouter, Anthropic (Claude), and Google Gemini
- Persistent Memory: PostgreSQL database for user and conversation storage
- User Recognition: Set custom names so the bot knows "who is who"
- User Facts: Bot remembers things about users (hobbies, preferences, etc.)
- Web Search: Access current information via SearXNG integration
- Fully Customizable: Configure bot name, personality, and behavior
- Easy Deployment: Docker support with PostgreSQL included
Living AI Features
- Autonomous Learning: Bot automatically extracts and remembers facts from conversations
- Mood System: Bot has emotional states that affect its responses naturally
- Relationship Tracking: Bot builds relationships from Stranger to Close Friend
- Communication Style Learning: Bot adapts to each user's preferred style
- Opinion Formation: Bot develops genuine preferences on topics
- Proactive Behavior: Birthday wishes, follow-ups on mentioned events
- Self-Awareness: Bot knows its age, statistics, and history with users
- Cross-User Connections: Bot can identify shared interests between users
Quick Start
1. Clone the repository
git clone https://github.com/your-username/discord-ai-bot.git
cd discord-ai-bot
2. Configure the bot
cp .env.example .env
Edit .env with your settings (see Configuration below).
3. Run with Docker
docker compose up -d
This starts both the bot and PostgreSQL database. Run migrations on first start:
docker compose exec daemon-boyfriend alembic upgrade head
Or run locally:
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python -m daemon_boyfriend
Configuration
All configuration is done via environment variables in .env.
Required Settings
| Variable | Description |
|---|---|
DISCORD_TOKEN |
Your Discord bot token |
AI_PROVIDER |
openai, openrouter, anthropic, or gemini |
OPENAI_API_KEY |
OpenAI API key (if using OpenAI) |
OPENROUTER_API_KEY |
OpenRouter API key (if using OpenRouter) |
ANTHROPIC_API_KEY |
Anthropic API key (if using Anthropic) |
GEMINI_API_KEY |
Google Gemini API key (if using Gemini) |
Bot Identity
| Variable | Default | Description |
|---|---|---|
BOT_NAME |
AI Bot |
The bot's display name (used in responses) |
BOT_PERSONALITY |
helpful and friendly |
Personality traits for the AI |
BOT_DESCRIPTION |
I'm an AI assistant... |
Shown when mentioned without a message |
BOT_STATUS |
for mentions |
Status message (shown as "Watching ...") |
SYSTEM_PROMPT |
(auto-generated) | Custom system prompt (overrides default) |
AI Settings
| Variable | Default | Description |
|---|---|---|
AI_MODEL |
gpt-4o |
Model to use |
AI_MAX_TOKENS |
1024 |
Maximum response length |
AI_TEMPERATURE |
0.7 |
Response creativity (0.0-2.0) |
MAX_CONVERSATION_HISTORY |
20 |
Messages to remember per user |
Database (PostgreSQL)
| Variable | Default | Description |
|---|---|---|
DATABASE_URL |
(none) | PostgreSQL connection string |
POSTGRES_PASSWORD |
daemon |
Password for docker-compose PostgreSQL |
CONVERSATION_TIMEOUT_MINUTES |
60 |
Minutes before starting new conversation |
When DATABASE_URL is set, the bot uses PostgreSQL for persistent storage. Without it, the bot falls back to in-memory storage (data lost on restart).
Web Search (SearXNG)
| Variable | Default | Description |
|---|---|---|
SEARXNG_URL |
(none) | SearXNG instance URL |
SEARXNG_ENABLED |
true |
Enable/disable web search |
SEARXNG_MAX_RESULTS |
5 |
Max search results to fetch |
When configured, the bot automatically searches the web for queries that need current information (news, weather, etc.).
Living AI Settings
| Variable | Default | Description |
|---|---|---|
LIVING_AI_ENABLED |
true |
Master switch for all Living AI features |
MOOD_ENABLED |
true |
Enable mood system |
RELATIONSHIP_ENABLED |
true |
Enable relationship tracking |
FACT_EXTRACTION_ENABLED |
true |
Enable autonomous fact extraction |
FACT_EXTRACTION_RATE |
0.3 |
Probability of extracting facts (0.0-1.0) |
PROACTIVE_ENABLED |
true |
Enable proactive messages (birthdays, follow-ups) |
CROSS_USER_ENABLED |
false |
Enable cross-user associations (privacy-sensitive) |
OPINION_FORMATION_ENABLED |
true |
Enable bot opinion formation |
STYLE_LEARNING_ENABLED |
true |
Enable communication style learning |
MOOD_DECAY_RATE |
0.1 |
How fast mood returns to neutral per hour |
Command Toggles
All commands can be individually enabled/disabled. When disabled, the bot handles these functions naturally through conversation.
| Variable | Default | Description |
|---|---|---|
COMMANDS_ENABLED |
true |
Master switch for all commands |
CMD_RELATIONSHIP_ENABLED |
true |
Enable !relationship command |
CMD_MOOD_ENABLED |
true |
Enable !mood command |
CMD_BOTSTATS_ENABLED |
true |
Enable !botstats command |
CMD_OURHISTORY_ENABLED |
true |
Enable !ourhistory command |
CMD_BIRTHDAY_ENABLED |
true |
Enable !birthday command |
CMD_REMEMBER_ENABLED |
true |
Enable !remember command |
CMD_SETNAME_ENABLED |
true |
Enable !setname command |
CMD_WHATDOYOUKNOW_ENABLED |
true |
Enable !whatdoyouknow command |
CMD_FORGETME_ENABLED |
true |
Enable !forgetme command |
Example Configurations
Friendly Assistant:
BOT_NAME=Helper Bot
BOT_PERSONALITY=friendly, helpful, and encouraging
BOT_DESCRIPTION=I'm here to help! Ask me anything.
BOT_STATUS=ready to help
Technical Expert:
BOT_NAME=TechBot
BOT_PERSONALITY=knowledgeable, precise, and technical
BOT_DESCRIPTION=I'm a technical assistant. Ask me about programming, DevOps, or technology.
BOT_STATUS=for tech questions
Custom System Prompt:
BOT_NAME=GameMaster
SYSTEM_PROMPT=You are GameMaster, a Dungeon Master for text-based RPG adventures. Stay in character, describe scenes vividly, and guide players through exciting quests. Use Discord markdown for emphasis.
Discord Setup
- Go to Discord Developer Portal
- Create a new application
- Go to Bot and create a bot
- Enable these Privileged Gateway Intents:
- Server Members Intent
- Message Content Intent
- Copy the bot token to your
.envfile - Go to OAuth2 → URL Generator:
- Select scope:
bot - Select permissions:
Send Messages,Read Message History,View Channels
- Select scope:
- Use the generated URL to invite the bot to your server
Usage
Mention the bot in any channel:
@YourBot what's the weather like?
@YourBot explain quantum computing
@YourBot help me write a poem
Memory Commands
Users can manage what the bot remembers about them:
| Command | Description |
|---|---|
!setname <name> |
Set your preferred name |
!clearname |
Reset to Discord display name |
!remember <fact> |
Tell the bot something about you |
!whatdoyouknow |
See what the bot remembers |
!forgetme |
Clear all facts about you |
Admin commands:
| Command | Description |
|---|---|
!setusername @user <name> |
Set name for another user |
!teachbot @user <fact> |
Add a fact about a user |
Living AI Commands
| Command | Description |
|---|---|
!relationship |
See your relationship level with the bot |
!mood |
See the bot's current emotional state |
!botstats |
Bot shares its self-awareness statistics |
!ourhistory |
See your history with the bot |
!birthday <date> |
Set your birthday for the bot to remember |
Note: When commands are disabled, the bot handles these naturally through conversation:
- Ask "what do you know about me?" instead of
!whatdoyouknow - Say "call me Alex" instead of
!setname Alex - Ask "how are you feeling?" instead of
!mood - Say "my birthday is March 15th" instead of
!birthday
AI Providers
| Provider | Models | Notes |
|---|---|---|
| OpenAI | gpt-4o, gpt-4-turbo, gpt-3.5-turbo | Official OpenAI API |
| OpenRouter | 100+ models | Access to Llama, Mistral, Claude, etc. |
| Anthropic | claude-3-5-sonnet, claude-3-opus | Direct Claude API |
| Gemini | gemini-2.0-flash, gemini-1.5-pro | Google AI API |
Project Structure
src/daemon_boyfriend/
├── bot.py # Main bot class
├── config.py # Configuration
├── cogs/
│ ├── ai_chat.py # Mention handler
│ ├── memory.py # Memory commands
│ └── status.py # Health/status commands
├── models/
│ ├── user.py # User, UserFact, UserPreference
│ ├── conversation.py # Conversation, Message
│ ├── guild.py # Guild, GuildMember
│ └── living_ai.py # BotState, UserRelationship, etc.
└── services/
├── ai_service.py # AI provider factory
├── database.py # PostgreSQL connection
├── user_service.py # User management
├── persistent_conversation.py # DB-backed history
├── providers/ # AI providers
├── searxng.py # Web search service
├── mood_service.py # Mood system
├── relationship_service.py # Relationship tracking
├── fact_extraction_service.py # Autonomous learning
├── communication_style_service.py # Style learning
├── opinion_service.py # Opinion formation
├── proactive_service.py # Scheduled events
├── self_awareness_service.py # Bot self-reflection
└── association_service.py # Cross-user connections
schema.sql # Database schema
project-vision.md # Living AI design document
License
MIT