Files
loyal_companion/CLAUDE.md
latte 6a9b6fdda2 Add SearXNG web search for current information
- 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
2026-01-11 20:49:20 +01:00

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.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.

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.