diff --git a/app/services/semantic_analyzer.py b/app/services/semantic_analyzer.py index 87dd28b..4d19170 100644 --- a/app/services/semantic_analyzer.py +++ b/app/services/semantic_analyzer.py @@ -1,7 +1,6 @@ """ app/services/semantic_analyzer.py Kapselt die LLM-Strategie für Chunking und Kanten-Extraktion. -Nutzt die Matrix-Logik aus DiscoveryService für konsistente Kanten-Typen. """ import json @@ -59,14 +58,17 @@ class SemanticAnalyzer: clean_json = response_json.replace("```json", "").replace("```", "").strip() data = json.loads(clean_json) - # 3a. Typsicherheit des äußeren Arrays - if not isinstance(data, list): - logger.error("SemanticAnalyzer: JSON root ist kein Array. Fehlerhafte LLM-Antwort.") - raise ValueError("Root element is not a list.") + # FIX: Typsicherheit auf der Wurzel + if isinstance(data, dict): + # LLM hat ein Einzelobjekt geliefert -> wandle es in ein Array + data = [data] + elif not isinstance(data, list): + logger.error("SemanticAnalyzer: JSON root ist weder Array noch Objekt. Fehlerhafte LLM-Antwort.") + raise ValueError("Root element is not a list or dictionary.") results = [] for item in data: - # FIX: Typsicherheit auf Item-Ebene + # Typsicherheit auf Item-Ebene if not isinstance(item, dict): logger.warning(f"SemanticAnalyzer: Ungültiges Chunk-Element ignoriert: {item}") continue @@ -109,7 +111,6 @@ class SemanticAnalyzer: logger.error("SemanticAnalyzer: LLM lieferte KEIN valides JSON. Fallback auf Raw Text.") return [SemanticChunkResult(content=text, suggested_edges=[])] except Exception as e: - # Wichtig: Wir fangen alle anderen Fehler, um den Prozess nicht abzubrechen. logger.error(f"SemanticAnalyzer Unbehandelter Fehler: {e}") return [SemanticChunkResult(content=text, suggested_edges=[])]