Files
loyal_companion/CLAUDE.md
latte b05fa034a6 Refactor: remove unused cogs and services, simplify architecture
- Remove admin.py and search.py cogs
- Remove searxng.py service and rate_limiter.py utility
- Update bot.py, ai_chat.py, config.py, and ai_service.py
- Update documentation and docker-compose.yml
2026-01-11 18:41:23 +01:00

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

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.

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

Environment Variables

Required: DISCORD_TOKEN, plus one of OPENAI_API_KEY, OPENROUTER_API_KEY, or ANTHROPIC_API_KEY depending on AI_PROVIDER setting.