From d771a330c7141a5b77d8ba5b5a969eb8c83ac3b2 Mon Sep 17 00:00:00 2001 From: Homelab Cursor Date: Thu, 26 Mar 2026 17:01:43 +0100 Subject: [PATCH] fix(routing): yearly costs to local RAG, not Sonar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove standalone "kosten" from WEB_TRIGGERS (matched "jährlichen kosten" and sent Perplexity without tools). - Add LOCAL_OVERRIDES for jahreskosten/jaehrlich/beitragsrechnung phrases. - Extend forced-RAG keywords and enrich ES query with Beitrag/Beitragsrechnung for cost questions. - System hint: extract amounts and periods per hit when possible. --- homelab-ai-bot/llm.py | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/homelab-ai-bot/llm.py b/homelab-ai-bot/llm.py index ac20d084..8fd6367d 100644 --- a/homelab-ai-bot/llm.py +++ b/homelab-ai-bot/llm.py @@ -56,10 +56,12 @@ _LOCAL_OVERRIDES = [ "familienbuch", "urkunde", "bescheid", "police", "beitrag", "meine unterlagen", "meine dokumente", "meine dateien", "habe ich", "welche habe", "was habe ich", + "jahreskosten", "jährlichen", "jährliche", "jaehrlichen", "jaehrliche", + "monatliche kosten", "versicherungskosten", "beitragsrechnung", ] _WEB_TRIGGERS = [ "recherche", "recherchiere", "suche im internet", "web search", - "preis", "preise", "kostet", "kosten", "price", + "preis", "preise", "kostet", "price", "news", "nachrichten", "aktuell", "aktuelle", "google", "finde heraus", "finde raus", "gold", "silber", "kurs", "kurse", @@ -420,6 +422,8 @@ def ask_with_tools(question: str, tool_handlers: dict, session_id: str = None) - "kindergeld", "rechnung", "haftpflicht", "rechtsschutz", "lebensversicherung", "bauspar", "reisepass", "personalausweis", "lvm", "allianz", "ergo", "huk", "nuernberger", + "jahreskosten", "jährlichen", "jährliche", "jaehrlichen", "jaehrliche", + "monatliche kosten", "versicherungskosten", "beitragsrechnung", ] _q_low = question.lower() if route == MODEL_LOCAL and any(k in _q_low for k in _DOC_KW): @@ -427,7 +431,22 @@ def ask_with_tools(question: str, tool_handlers: dict, session_id: str = None) - if _rag_fn: try: log.info("RAG-Pflicht: forciere rag_search fuer: %s", question[:80]) - _rag_res = _rag_fn(query=question, top_k=10) + _rag_q = question + if any( + x in _q_low + for x in ( + "kosten", + "jähr", + "jaehr", + "jahreskosten", + "monatliche kosten", + ) + ): + _rag_q = ( + question + + " Versicherung Beitrag Beitragsrechnung Jahresbetrag" + ) + _rag_res = _rag_fn(query=_rag_q, top_k=10) if _rag_res and not _rag_res.startswith("Keine"): log.info("RAG-Pflicht: %d Zeichen — loesche Session-History", len(str(_rag_res))) messages = [ @@ -439,11 +458,12 @@ def ask_with_tools(question: str, tool_handlers: dict, session_id: str = None) - + "liste jede erkannte Sparte bzw. jeden Dokumenttyp separat " + "(z.B. Kfz/Auto, Rechtsschutz, Haftpflicht, Sach, Ausland, Kranken) " + "mit kurzem Beleg (Dateiname oder Ordner aus den Treffern). " - + "Nicht nur den ersten Treffer nennen."}, + + "Nicht nur den ersten Treffer nennen. " + + "Bei Kosten/Beitraegen: je Treffer Betrag und Zeitraum nennen wenn im Snippet erkennbar; sonst kurz nicht eindeutig."}, {"role": "assistant", "content": None, "tool_calls": [{"id": "forced_rag", "type": "function", "function": {"name": "rag_search", - "arguments": json.dumps({"query": question, "top_k": 10})}}]}, + "arguments": json.dumps({"query": _rag_q, "top_k": 10})}}]}, {"role": "tool", "tool_call_id": "forced_rag", "content": str(_rag_res)[:12000]}, {"role": "user", "content": question},