You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Ein Telegram-Bot, über den man unterwegs eine Eingangsrechnung abfotografiert oder als PDF hochlädt, der daraus eine Buchung vorschlägt, Rückfragen stellt und nach Bestätigung direkt in Collmex einbucht.
Im Nachbar-Repo newsroom unter bot/telegram_bot.py läuft bereits ein funktionierender Telegram-Bot (Long-Polling, systemd auf Hetzner-VPS, single-file Python ohne python-telegram-bot). Der dient als Architektur-Blaupause. Zwei Dinge fehlen dort aber, die wir hier brauchen:
1. Datei-Upload (Photo + Document)
Der Wire-Bot verarbeitet nur message.text und ignoriert message.photo und message.document still. Für Collmex brauchen wir:
Erkennung von photo/document in Telegram-Updates
Download via Telegram getFile + file_path
Ablage im GoBD-Belegarchiv (.collmex/belege/<jahr>/<monat>/) mit Hash-basiertem Dateinamen
Weitergabe an einen LLM-Agent für Belegerkennung (Lieferant, Datum, Netto, USt, Positionen)
Unterstützung für gängige Formate: JPG, PNG, HEIC, PDF
2. Conversation Context über mehrere Messages
Der Wire-Bot ist stateless. Jede Message öffnet eine frische LLM-Session ohne Erinnerung an vorherige. Für die typische Beleg-Flow brauchen wir das Gegenteil:
User: [sendet Foto]
Bot: Ich erkenne: Shell, 47,50 EUR brutto, 19% USt.
Lieferant Shell (70034)? Konto 4510 (Kfz-Kosten)?
Bestätigen mit "ja", sonst korrigieren.
User: ja, aber Konto 4520
Bot: Gebucht: 4510 -> 4520, 47,50 EUR brutto auf Kfz-Reparaturen.
Belegnummer 2026-04-0891.
Dafür brauchen wir pro Chat-ID eine Session:
Letzte N Messages (User + Bot) als Kontext
Pending Action: "wartet auf Bestätigung der Buchung X"
TTL pro Session (z.B. 30 Min Inaktivität, danach Reset)
Persistenz auf Platte (JSON-Datei oder SQLite), damit Neustarts Sessions nicht verlieren
Technische Skizze
Telegram Update
|
+-- Text?
| |
| +-- Befehl (/status, /hilfe)? -> direkte Antwort
| |
| +-- Antwort auf pending Action? -> Session laden, weiterverarbeiten
| |
| +-- Freitext ohne Kontext? -> LLM mit System-Prompt + Collmex-CLI
|
+-- Photo/Document?
|
+-- Download + Hash + Ablage in .collmex/belege/
+-- OCR/Extraction via LLM (Anthropic Messages API mit Vision/PDF)
+-- Vorschlag erzeugen (Lieferant, Konto, USt)
+-- Session auf "pending_booking" setzen
+-- Rückfrage an User senden
Ziel
Ein Telegram-Bot, über den man unterwegs eine Eingangsrechnung abfotografiert oder als PDF hochlädt, der daraus eine Buchung vorschlägt, Rückfragen stellt und nach Bestätigung direkt in Collmex einbucht.
Anwendungsfall: Tankstelle, Restaurant, Hotel. Bon rausnehmen, Foto, Bot fragt "Lieferant Shell, 47,50 EUR, 19% VSt, Konto 4510 (Kfz-Kosten)? Bestätigen mit Ja". Einmal antippen, fertig.
Ausgangsbasis
Im Nachbar-Repo
newsroomunterbot/telegram_bot.pyläuft bereits ein funktionierender Telegram-Bot (Long-Polling, systemd auf Hetzner-VPS, single-file Python ohne python-telegram-bot). Der dient als Architektur-Blaupause. Zwei Dinge fehlen dort aber, die wir hier brauchen:1. Datei-Upload (Photo + Document)
Der Wire-Bot verarbeitet nur
message.textund ignoriertmessage.photoundmessage.documentstill. Für Collmex brauchen wir:photo/documentin Telegram-UpdatesgetFile+file_path.collmex/belege/<jahr>/<monat>/) mit Hash-basiertem Dateinamen2. Conversation Context über mehrere Messages
Der Wire-Bot ist stateless. Jede Message öffnet eine frische LLM-Session ohne Erinnerung an vorherige. Für die typische Beleg-Flow brauchen wir das Gegenteil:
Dafür brauchen wir pro Chat-ID eine Session:
Technische Skizze
Datei-Layout (Vorschlag)
Abhängigkeiten
collmex buchen --dry-runsollte keine Collmex-Credentials brauchen #4 (buchen --dry-runohne Credentials): der Bot muss den Booking-Vorschlag trocken rechnen können, bevor er echte Credentials an Collmex schickt.collmex/gobd.pyhat das schon)..envauf dem VPS), nicht die Dev-Credentials.Sicherheit
BOT_ALLOWED_CHATS-Allowlist wie im Wire-Bot (kein offener Chat)--dry-runpräsentieren, erst auf "ja" echte BuchungOffene Punkte
wissen/routinen.md— kann der Bot den Mahnlauf anstoßen, die OPOS-Liste ausgeben?MVP-Scope
Für den ersten Wurf reicht:
collmex buchenKontext-Persistenz nur für den aktiven Flow (Pending-Booking), keine Chat-History. Die volle History kommt in Iteration zwei.