- Add searxng.py service for web queries via SearXNG API - Integrate search into ai_chat.py with AI-driven search decisions - AI determines if query needs current info, then searches automatically - Add SEARXNG_URL, SEARXNG_ENABLED, SEARXNG_MAX_RESULTS config options - Update documentation in README.md, CLAUDE.md, and .env.example
2.4 KiB
2.4 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Build & Run Commands
# Install dependencies
pip install -r requirements.txt
# Run the bot (requires .env with DISCORD_TOKEN and AI provider key)
python -m daemon_boyfriend
# Run with Docker
docker-compose up -d
# Syntax check all Python files
python -m py_compile src/daemon_boyfriend/**/*.py
Architecture
This is a Discord bot that responds to @mentions with AI-generated responses (multi-provider support).
Provider Pattern
The AI system uses a provider abstraction pattern:
services/providers/base.pydefinesAIProviderabstract class withgenerate()methodservices/providers/openai.py,openrouter.py,anthropic.py,gemini.pyimplement the interfaceservices/ai_service.pyis the factory that creates the correct provider based onAI_PROVIDERenv var- OpenRouter uses OpenAI's client with a different base URL
- Gemini uses the
google-genaiSDK
Cog System
Discord functionality is in cogs/:
ai_chat.py-@mentionhandler (responds when bot is mentioned)
Cogs are auto-loaded by bot.py from the cogs/ directory.
Configuration
All config flows through config.py using pydantic-settings. The settings singleton is created at module load, so env vars must be set before importing.
Web Search
The bot can search the web for current information via SearXNG:
services/searxng.pyprovidesSearXNGServicefor web queriesai_chat.pyuses a two-step approach: first asks AI if search is needed, then provides results as context- Search is triggered automatically when the AI determines the query needs current information
- Configured via
SEARXNG_URL,SEARXNG_ENABLED, andSEARXNG_MAX_RESULTSenv vars
Key Design Decisions
ConversationManagerstores per-user chat history in memory with configurable max length- Long AI responses are split via
split_message()inai_chat.pyto respect Discord's 2000 char limit - The bot responds only to @mentions via
on_messagelistener - Web search uses AI to decide when to search, avoiding unnecessary API calls for general knowledge questions
Environment Variables
Required: DISCORD_TOKEN, plus one of OPENAI_API_KEY, OPENROUTER_API_KEY, ANTHROPIC_API_KEY, or GEMINI_API_KEY depending on AI_PROVIDER setting.
Optional: SEARXNG_URL for web search capability.