diff --git a/python_bridge/chat_web_interface.py b/python_bridge/chat_web_interface.py index 0648454..0ff324f 100644 --- a/python_bridge/chat_web_interface.py +++ b/python_bridge/chat_web_interface.py @@ -613,6 +613,7 @@ class ClaudeChatInterface: if not claude_elements: try: # Claude.ai 2024/2025 nutzt oft conversation-turn Divs + # WICHTIG: Wir suchen die ÄUSSERSTEN Elemente die "Claude sagt:" enthalten found = self.driver.execute_script(""" const msgs = []; @@ -627,29 +628,20 @@ class ClaudeChatInterface: // Suche nach Elementen die typische Claude-Antwort-Merkmale haben const text = div.innerText || ''; - // Claude-Antworten haben oft "Claude sagt:" oder sind länger als TICKs - if (text.includes('Claude sagt:') || - (text.length > 50 && !text.startsWith('[TICK]') && !text.startsWith('[START]'))) { - - // Prüfe ob dieses Element nicht schon ein Elternteil eines gefundenen ist - let dominated = false; - for (const existing of msgs) { - if (existing.contains(div) || div.contains(existing)) { - dominated = true; - break; - } - } - if (!dominated && !msgs.includes(div)) { - // Nimm das kleinste Element das den Text enthält - msgs.push(div); - } + // Claude-Antworten müssen "Claude sagt:" enthalten + // UND der Text muss lang genug sein (mindestens 20 Zeichen) + if (text.includes('Claude sagt:') && text.length > 20) { + msgs.push(div); } } - // Dedupliziere: Behalte nur die innersten Elemente + // Dedupliziere: Behalte nur die ÄUSSERSTEN Elemente (Container) + // Nicht die innersten - wir wollen den vollständigen Text! const filtered = msgs.filter(div => { + // Behalte dieses Element nur wenn kein anderes Element es enthält for (const other of msgs) { - if (other !== div && div.contains(other)) { + if (other !== div && other.contains(div)) { + // Ein anderes Element enthält dieses -> verwerfen return false; } } @@ -766,8 +758,14 @@ class ClaudeChatInterface: for i, elem in enumerate(claude_elements): try: - text = elem.text.strip() + # Versuche zuerst innerText via JavaScript zu bekommen (zuverlässiger) + try: + text = self.driver.execute_script("return arguments[0].innerText || '';", elem).strip() + except: + text = elem.text.strip() + if not text or len(text) < 5: + logger.debug(f"Claude-Element {i} übersprungen: Text zu kurz ({len(text) if text else 0} Zeichen)") continue # Filtere User-Befehle (diese sind KEINE Claude-Nachrichten) @@ -781,6 +779,11 @@ class ClaudeChatInterface: logger.debug(f"Überspringe User-Befehl (normalized): {text}") continue + # Prüfe ob es wirklich eine Claude-Nachricht ist (muss "Claude sagt:" enthalten) + if "Claude sagt:" not in text: + logger.debug(f"Claude-Element {i} übersprungen: Kein 'Claude sagt:' gefunden") + continue + msg_id = elem.get_attribute("data-message-id") if not msg_id: msg_id = f"claude_{i}_{hash(text[:100])}" @@ -791,7 +794,7 @@ class ClaudeChatInterface: is_from_assistant=True, timestamp=time.time() )) - logger.debug(f"Claude-Nachricht {i}: '{text[:50]}...'") + logger.debug(f"Claude-Nachricht {i}: '{text[:80]}...' ({len(text)} Zeichen)") except Exception as e: logger.debug(f"Fehler bei Claude-Nachricht {i}: {e}")