fix extractrating claude sagt:

This commit is contained in:
duffyduck 2025-12-27 20:28:49 +01:00
parent 992f6f9d05
commit 9145ac2cc0
1 changed files with 23 additions and 20 deletions

View File

@ -613,6 +613,7 @@ class ClaudeChatInterface:
if not claude_elements: if not claude_elements:
try: try:
# Claude.ai 2024/2025 nutzt oft conversation-turn Divs # Claude.ai 2024/2025 nutzt oft conversation-turn Divs
# WICHTIG: Wir suchen die ÄUSSERSTEN Elemente die "Claude sagt:" enthalten
found = self.driver.execute_script(""" found = self.driver.execute_script("""
const msgs = []; const msgs = [];
@ -627,29 +628,20 @@ class ClaudeChatInterface:
// Suche nach Elementen die typische Claude-Antwort-Merkmale haben // Suche nach Elementen die typische Claude-Antwort-Merkmale haben
const text = div.innerText || ''; const text = div.innerText || '';
// Claude-Antworten haben oft "Claude sagt:" oder sind länger als TICKs // Claude-Antworten müssen "Claude sagt:" enthalten
if (text.includes('Claude sagt:') || // UND der Text muss lang genug sein (mindestens 20 Zeichen)
(text.length > 50 && !text.startsWith('[TICK]') && !text.startsWith('[START]'))) { if (text.includes('Claude sagt:') && text.length > 20) {
// 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); 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 => { const filtered = msgs.filter(div => {
// Behalte dieses Element nur wenn kein anderes Element es enthält
for (const other of msgs) { 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; return false;
} }
} }
@ -766,8 +758,14 @@ class ClaudeChatInterface:
for i, elem in enumerate(claude_elements): for i, elem in enumerate(claude_elements):
try: try:
# 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() text = elem.text.strip()
if not text or len(text) < 5: 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 continue
# Filtere User-Befehle (diese sind KEINE Claude-Nachrichten) # Filtere User-Befehle (diese sind KEINE Claude-Nachrichten)
@ -781,6 +779,11 @@ class ClaudeChatInterface:
logger.debug(f"Überspringe User-Befehl (normalized): {text}") logger.debug(f"Überspringe User-Befehl (normalized): {text}")
continue 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") msg_id = elem.get_attribute("data-message-id")
if not msg_id: if not msg_id:
msg_id = f"claude_{i}_{hash(text[:100])}" msg_id = f"claude_{i}_{hash(text[:100])}"
@ -791,7 +794,7 @@ class ClaudeChatInterface:
is_from_assistant=True, is_from_assistant=True,
timestamp=time.time() 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: except Exception as e:
logger.debug(f"Fehler bei Claude-Nachricht {i}: {e}") logger.debug(f"Fehler bei Claude-Nachricht {i}: {e}")