A Telegram bot that manages my personal Google Calendar through natural language, built on top of DeepSeek's function calling. This writeup focuses on the operational loop wrapped around the LLM: prompt versioning, tracing, evaluation, guardrails and CI/CD.
LLMOps in practice:
The system prompt is a versioned MLflow Prompt, not hardcoded. Edits publish to
a challenger alias and must clear a tool-selection accuracy harness
before a separate, deliberate step promotes them to champion.
Every turn is logged to MLflow: params, tokens, latency, and the full tool-call
trace as a JSON artifact. The LLM never writes to the calendar directly, only propose an action,
gated by an idempotency check, explicit human confirmation, and a dry_run safety net.
GitHub Actions runs the test suite on every push and, only if it passes, deploys the Flask webhook container to Cloud Run. A single instance, single authorized Telegram user, no agent framework. GitHub: Calendar_Tools .
Architecture Overview:
A message from the authorized Telegram user hits a Flask webhook on Cloud Run, which runs the tool-calling loop against DeepSeek and, for writes, waits on human confirmation before touching Google Calendar. The MLflow server (shared with my other ML projects) sits alongside as the LLMOps layer: it's where the system prompt is versioned, where every turn is traced, and where the eval harness reports back before a prompt edit is trusted in production.