Claude 431847a8b7 Replace custom provider abstraction with litellm
Drops the src/providers/ package (base class, AnthropicProvider,
OpenAIProvider, factory) in favour of a single src/llm.py that calls
litellm.completion() directly. litellm handles provider routing,
authentication, and SDK differences for 100+ providers without any
code we need to maintain.

Changes:
- Delete src/providers/ entirely
- Add src/llm.py — one complete() function wrapping litellm
- src/agent/core.py: EmailAgent takes model: str instead of LLMProvider
- src/config.py: ai_provider + api key fields → single ai_model string
  in litellm format (e.g. "anthropic/claude-opus-4-6")
- main.py: remove provider factory wiring; pass config.ai_model to agent
- .env.example: simplify AI section, show litellm model string examples
- pyproject.toml: replace anthropic + openai deps with litellm>=1.0.0
- uv.lock: regenerated

https://claude.ai/code/session_01HaUFs7SaLD5SoiuGCY27Tw
2026-02-21 07:35:37 +00:00
2026-02-20 22:30:43 +00:00
2026-02-20 14:12:45 +01:00

Meister-Eder

Running the Email Agent

The email agent is a plain script invoked periodically via cron — no long-running daemon needed.

Scheduling with cron

*/5 * * * * flock -n /tmp/meister-eder-email.lock python /path/to/check_email.py

flock -n acquires an exclusive lock before running the script. If a previous run is still in progress when the next cron tick fires, the new invocation exits immediately (non-blocking). The lock is released automatically by the kernel when the process ends — even on crash — so stuck locks are not a concern.

Adjust */5 to whatever polling interval makes sense (e.g. */2 for every 2 minutes).

S
Description
AI-powered conversational registration agent for a play group.
Readme MIT
786 KiB
Languages
Python 90.9%
Jinja 4.5%
JavaScript 2.6%
CSS 1.7%
Dockerfile 0.3%