feat: OpenRouter-Backend + Modell-Dropdown im Leitstand, Live-Log fuer Dauer/Tokens/Kosten

Zweites Kategorisierungs-Backend neben Ollama (pipe/categorize.py), fuer
Vergleichstests mit staerkeren Cloud-Modellen. Umschaltbar per Dropdown oben
rechts im Leitstand (pipe/modellwahl.py, geteilte telefon/modell.json) - der
laufende Watcher braucht dafuer keinen Neustart, die Auswahl wird bei jedem
Anruf frisch gelesen.

Jede Kategorisierung loggt jetzt Backend/Modell/Dauer/Tokens/Kosten mit ins
Leitstand-Verlauf (protokoll.schreibe), nicht nur versteckt in meta.json.

Testergebnis (Nemotron ueber OpenRouter, :free-Tier): stark schwankende
Latenz (8,5s bis 80s je nach Modell/Auslastung), einmal 502 "temporarily
overloaded" - :free-Modelle sind fuer spaeter geplanten Echtzeit-Dialog
ungeeignet, dafuer braucht es ein bezahltes/dediziertes Tier.

telefon/modell.json ist Laufzeit-Zustand, kein Quellcode - neu ignoriert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015vtvcyNkapuDh583643hNs
This commit is contained in:
Jeuner 2026-08-24 21:43:30 +02:00
parent 4109aee1bb
commit 3e2d829542
7 changed files with 230 additions and 18 deletions

View file

@ -29,7 +29,7 @@ def verarbeite(audio: str, anrufer_nummer: str | None = None,
print("▸ Kategorisiere …")
if t.text.strip():
auswertung = categorize.kategorisiere(t.text)
auswertung, meta = categorize.kategorisiere(t.text)
else:
# Kein Text erkannt: Anrufer hat nach dem Signalton nicht gesprochen
# oder sofort aufgelegt (oder eine bekannte Whisper-Halluzination
@ -46,13 +46,26 @@ def verarbeite(audio: str, anrufer_nummer: str | None = None,
"aufgelegt.",
"stichworte": [],
}
print(f" Kategorie: {auswertung['kategorie']} · Dringlichkeit: {auswertung['dringlichkeit']}")
meta = {"backend": "-", "modell": "-", "dauer_s": 0.0, "tokens": None, "kosten_usd": None}
print(f" Kategorie: {auswertung['kategorie']} · Dringlichkeit: {auswertung['dringlichkeit']}"
f" ({meta['modell']}, {meta['dauer_s']}s)")
# Dauer/Tokens/Kosten mit ins Live-Log (Leitstand-Verlauf), nicht nur in
# den JSON-Feldern versteckt - fuer den Modell-Vergleich (Dropdown oben
# rechts) muss man das sofort sehen, ohne meta.json aufzuklappen.
zusatz = f"{meta['dauer_s']}s"
if meta.get("tokens"):
zusatz += f" · {meta['tokens']} Tok"
if meta.get("kosten_usd"):
zusatz += f" · ${meta['kosten_usd']:.4f}"
protokoll.schreibe(
"notfall" if auswertung["dringlichkeit"] == "notfall" else "anruf",
f"{auswertung['kategorie']} · {auswertung['dringlichkeit']}"
+ (f" · {auswertung['anrufer_name']}" if auswertung.get("anrufer_name") else ""),
+ (f" · {auswertung['anrufer_name']}" if auswertung.get("anrufer_name") else "")
+ f" ({meta['modell']}, {zusatz})",
nummer=anrufer_nummer, kategorie=auswertung["kategorie"],
dringlichkeit=auswertung["dringlichkeit"])
dringlichkeit=auswertung["dringlichkeit"], modell=meta["modell"],
dauer_s=meta["dauer_s"], tokens=meta.get("tokens"), kosten_usd=meta.get("kosten_usd"))
bekannter_kontakt = kontakte.nachschlagen(anrufer_nummer)
if bekannter_kontakt: