431847a8b73287c79fda3b47852fc7d5f08c0ea6
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
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).
Languages
Python
90.9%
Jinja
4.5%
JavaScript
2.6%
CSS
1.7%
Dockerfile
0.3%