# 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 ```bash git clone https://github.com/your-username/discord-ai-bot.git cd discord-ai-bot ``` ### 2. Configure the bot ```bash cp .env.example .env ``` Edit `.env` with your settings (see [Configuration](#configuration) below). ### 3. Run with Docker ```bash docker compose up -d ``` This starts both the bot and PostgreSQL database. Run migrations on first start: ```bash docker compose exec daemon-boyfriend alembic upgrade head ``` Or run locally: ```bash 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:** ```env 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:** ```env 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:** ```env 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 1. Go to [Discord Developer Portal](https://discord.com/developers/applications) 2. Create a new application 3. Go to **Bot** and create a bot 4. Enable these **Privileged Gateway Intents**: - Server Members Intent - Message Content Intent 5. Copy the bot token to your `.env` file 6. Go to **OAuth2** → **URL Generator**: - Select scope: `bot` - Select permissions: `Send Messages`, `Read Message History`, `View Channels` 7. 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 ` | Set your preferred name | | `!clearname` | Reset to Discord display name | | `!remember ` | Tell the bot something about you | | `!whatdoyouknow` | See what the bot remembers | | `!forgetme` | Clear all facts about you | Admin commands: | Command | Description | |---------|-------------| | `!setusername @user ` | Set name for another user | | `!teachbot @user ` | 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 ` | 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