From 7a3327eb908ef01b1d5081895d7c203f982de041 Mon Sep 17 00:00:00 2001 From: Homelab Cursor Date: Fri, 20 Mar 2026 21:47:33 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20deep=5Fresearch=20Tool=20=E2=80=94=20Log?= =?UTF-8?q?ging=20+=20allow=5Fclarification=3DFalse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ausfuehrliches Logging fuer Debugging - allow_clarification deaktiviert (verhindert Rueckfrage-Deadlock) - Ergebnis-Schwelle auf 100 Zeichen gesenkt --- homelab-ai-bot/tools/deep_research.py | 70 +++++++++++++++++---------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/homelab-ai-bot/tools/deep_research.py b/homelab-ai-bot/tools/deep_research.py index 43306660..fec5d34c 100644 --- a/homelab-ai-bot/tools/deep_research.py +++ b/homelab-ai-bot/tools/deep_research.py @@ -1,12 +1,10 @@ -"""Deep Research Tool — Open Deep Research (CT 121) via LangGraph API. - -Ermoeglicht dem Hausmeister-Bot tiefe Web-Recherchen zu starten. -Ergebnisse kommen als ausfuehrlicher Report zurueck. -""" +"""Deep Research Tool — Open Deep Research (CT 121) via LangGraph API.""" import requests import time -import json +import logging + +log = logging.getLogger("deep_research") DEEP_RESEARCH_URL = "http://10.10.10.121:2024" ASSISTANT_ID = "e9a5370f-7a53-55a8-ada8-6ab9ef15bb5b" @@ -16,18 +14,17 @@ MAX_WAIT = 600 SYSTEM_PROMPT_EXTRA = """DEEP RESEARCH: Du hast Zugriff auf deep_research — eine KI-gestuetzte Tiefenrecherche die 20-30 Quellen durchsucht. -Nutze es wenn der User eine komplexe Frage stellt die gruendliche Recherche erfordert. -Beispiele: "Recherchiere X", "Finde heraus...", "Vergleiche A und B", "Was gibt es Neues zu...". -NICHT fuer einfache Fakten oder Homelab-Fragen — dafuer reichen die anderen Tools. -Das Ergebnis ist ein ausfuehrlicher Report. Fasse ihn fuer Telegram zusammen (max ~3000 Zeichen). -deep_research dauert 2-10 Minuten. Sage dem User dass es laeuft.""" +Nutze es wenn der User explizit "recherchiere", "finde heraus", "vergleiche" sagt oder eine komplexe Frage hat. +NICHT fuer einfache Fakten oder Homelab-Fragen. +WICHTIG: deep_research dauert 2-5 Minuten. Das ist normal. Warte auf das Ergebnis. +Das Ergebnis ist ein ausfuehrlicher Report. Fasse ihn fuer Telegram zusammen (max ~3000 Zeichen).""" TOOLS = [ { "type": "function", "function": { "name": "deep_research", - "description": "Startet eine tiefe Web-Recherche zu einem Thema. Durchsucht 20-30 Quellen und erstellt einen ausfuehrlichen Report. Dauert 2-10 Minuten.", + "description": "Startet eine tiefe Web-Recherche zu einem Thema. Durchsucht 20-30 Quellen und erstellt einen ausfuehrlichen Report. Dauert 2-5 Minuten — das ist normal, warte auf das Ergebnis.", "parameters": { "type": "object", "properties": { @@ -62,6 +59,7 @@ def _start_run(thread_id, query): "research_model": f"openai:{RESEARCH_MODEL}", "compression_model": f"openai:{RESEARCH_MODEL}", "final_report_model": f"openai:{RESEARCH_MODEL}", + "allow_clarification": False, } } } @@ -76,18 +74,24 @@ def _poll_run(thread_id, run_id): while elapsed < MAX_WAIT: time.sleep(POLL_INTERVAL) elapsed += POLL_INTERVAL - r = requests.get( - f"{DEEP_RESEARCH_URL}/threads/{thread_id}/runs/{run_id}", - timeout=10) - r.raise_for_status() - data = r.json() - status = data.get("status", "unknown") - if status == "success": - return True, None - if status in ("error", "failed"): - return False, data.get("error", "Unbekannter Fehler") - if status == "interrupted": - return False, "Research wurde unterbrochen" + try: + r = requests.get( + f"{DEEP_RESEARCH_URL}/threads/{thread_id}/runs/{run_id}", + timeout=10) + r.raise_for_status() + data = r.json() + status = data.get("status", "unknown") + log.info("Poll %ds: status=%s", elapsed, status) + if status == "success": + return True, None + if status in ("error", "failed"): + err = data.get("error", "Unbekannter Fehler") + log.error("Run failed: %s", err) + return False, err + if status == "interrupted": + return False, "Research wurde unterbrochen" + except Exception as e: + log.warning("Poll error at %ds: %s", elapsed, e) return False, f"Timeout nach {MAX_WAIT}s" @@ -100,33 +104,47 @@ def _get_result(thread_id): values = state.get("values", {}) messages = values.get("messages", []) + log.info("Messages in result: %d", len(messages)) + for i, msg in enumerate(messages): + content = msg.get("content", "") + clen = len(content) if isinstance(content, str) else 0 + log.info(" msg[%d] type=%s len=%d", i, msg.get("type", "?"), clen) + for msg in reversed(messages): content = msg.get("content", "") - if isinstance(content, str) and len(content) > 200: + if isinstance(content, str) and len(content) > 100: return content return "Kein Report generiert." def handle_deep_research(query: str, **kw): + log.info("deep_research gestartet: %s", query[:100]) try: thread_id = _create_thread() + log.info("Thread erstellt: %s", thread_id) + run_id = _start_run(thread_id, query) + log.info("Run gestartet: %s", run_id) ok, error = _poll_run(thread_id, run_id) if not ok: + log.error("Research fehlgeschlagen: %s", error) return f"Deep Research fehlgeschlagen: {error}" report = _get_result(thread_id) + log.info("Report erhalten: %d Zeichen", len(report)) if len(report) > 6000: - report = report[:6000] + "\n\n[... Report gekuerzt, Original war laenger]" + report = report[:6000] + "\n\n[... Report gekuerzt]" return report except requests.ConnectionError: + log.error("CT 121 nicht erreichbar") return "Deep Research (CT 121) nicht erreichbar. Service laeuft moeglicherweise nicht." except Exception as e: + log.exception("Deep Research Fehler") return f"Deep Research Fehler: {e}"