- 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
60 lines
2.4 KiB
Markdown
60 lines
2.4 KiB
Markdown
# CLAUDE.md
|
|
|
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
|
|
## Build & Run Commands
|
|
|
|
```bash
|
|
# 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.py` defines `AIProvider` abstract class with `generate()` method
|
|
- `services/providers/openai.py`, `openrouter.py`, `anthropic.py`, `gemini.py` implement the interface
|
|
- `services/ai_service.py` is the factory that creates the correct provider based on `AI_PROVIDER` env var
|
|
- OpenRouter uses OpenAI's client with a different base URL
|
|
- Gemini uses the `google-genai` SDK
|
|
|
|
### Cog System
|
|
Discord functionality is in `cogs/`:
|
|
- `ai_chat.py` - `@mention` handler (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.py` provides `SearXNGService` for web queries
|
|
- `ai_chat.py` uses 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`, and `SEARXNG_MAX_RESULTS` env vars
|
|
|
|
### Key Design Decisions
|
|
- `ConversationManager` stores per-user chat history in memory with configurable max length
|
|
- Long AI responses are split via `split_message()` in `ai_chat.py` to respect Discord's 2000 char limit
|
|
- The bot responds only to @mentions via `on_message` listener
|
|
- 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.
|