From 18dc24e86bd93e285e883d2e17b8de842b77cecc Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 27 Dec 2025 21:02:07 +0100 Subject: [PATCH] =?UTF-8?q?TTS=20startet,=20l=C3=A4dt=20gespeicherte=20ID?= =?UTF-8?q?=20(falls=20vorhanden)=20Sucht=20nach=20neuen=20Nachrichten=20-?= =?UTF-8?q?=20ID=20nicht=20gefunden=20=E2=86=92=20leere=20Liste=20Synchron?= =?UTF-8?q?isiert=20ID=20auf=20letzte=20aktuelle=20Nachricht=20(ohne=20vor?= =?UTF-8?q?zulesen)=20Ab=20jetzt=20werden=20nur=20wirklich=20NEUE=20Nachri?= =?UTF-8?q?chten=20vorgelesen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python_bridge/chat_audio_bridge.py | 20 ++++++++++++++++++++ python_bridge/chat_web_interface.py | 20 +++++++++----------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/python_bridge/chat_audio_bridge.py b/python_bridge/chat_audio_bridge.py index 91eb522..6dfa245 100755 --- a/python_bridge/chat_audio_bridge.py +++ b/python_bridge/chat_audio_bridge.py @@ -734,13 +734,33 @@ Erst dann starten die automatischen TICKs mit Bildern!""" self._tts_active.wait() logger.info("TTS aktiviert - beginne mit Vorlesen neuer Nachrichten") + # Marker ob wir die ID beim ersten Durchlauf synchronisieren müssen + needs_id_sync = True + while self.running: try: # Hole neue Nachrichten messages = self.chat.get_new_messages(since_id=self.last_assistant_message_id) + # ════════════════════════════════════════════════════════════════ + # Bei leerem Ergebnis: Prüfe ob wir die ID synchronisieren müssen + # Das passiert wenn die gespeicherte ID nicht mehr existiert + # (z.B. nach Neustart, Chat-Änderungen, etc.) + # ════════════════════════════════════════════════════════════════ + if not messages and needs_id_sync: + last_msg = self.chat.get_last_assistant_message() + if last_msg: + old_id = self.last_assistant_message_id + self.last_assistant_message_id = last_msg.id + if self._current_chat_id: + self._save_tts_state(self._current_chat_id, last_msg.id) + logger.info(f"TTS: ID synchronisiert (alt: {old_id[:20] if old_id else 'None'}... -> neu: {last_msg.id[:20]}...)") + console.print("[dim]TTS: Position synchronisiert, warte auf neue Nachrichten[/dim]") + needs_id_sync = False # Nur einmal pro Session + if messages: logger.debug(f"TTS: {len(messages)} neue Nachrichten gefunden") + needs_id_sync = False # Erfolgreich gefunden, kein Sync nötig for msg in messages: logger.debug(f"TTS: Nachricht - assistant={msg.is_from_assistant}, id={msg.id[:20]}..., text={msg.text[:50]}...") diff --git a/python_bridge/chat_web_interface.py b/python_bridge/chat_web_interface.py index bb739ea..87ef78b 100644 --- a/python_bridge/chat_web_interface.py +++ b/python_bridge/chat_web_interface.py @@ -526,19 +526,17 @@ class ClaudeChatInterface: # WICHTIG: Wenn since_id nicht gefunden wurde, könnte es sein dass: # 1. Der Chat gewechselt wurde # 2. Die Seite neu geladen wurde - # 3. Die ID-Generierung sich geändert hat - # In diesem Fall: Gib die LETZTE Nachricht zurück (nicht alle!) - # So wird nur die neueste vorgelesen statt alles nochmal + # 3. Die ID-Generierung sich geändert hat (Hashes sind nicht 100% stabil) + # + # LÖSUNG: Gib KEINE Nachrichten zurück um Wiederholungen zu vermeiden! + # Bei Neustart würden sonst alle alten Nachrichten nochmal vorgelesen. + # Der TTS-State sollte bei echtem Chat-Wechsel manuell gelöscht werden. if not found_marker and all_messages: - # Prüfe ob since_id ein altes Format hat (mit Index) - # z.B. "claude_0_123456" vs neues Format "claude_123456" if since_id and since_id.startswith("claude_"): - logger.debug(f"since_id '{since_id[:30]}...' nicht gefunden, gebe nur letzte Nachricht zurück") - # Nur die letzte Assistant-Nachricht zurückgeben - for msg in reversed(all_messages): - if msg.is_from_assistant: - return [msg] - # Wenn keine Assistant-Nachricht, gib leere Liste zurück + logger.debug(f"since_id '{since_id[:30]}...' nicht gefunden in {len(all_messages)} Nachrichten - überspringe alle (Neustart-Schutz)") + # Aktualisiere intern auf die letzte bekannte Nachricht + # damit zukünftige NEUE Nachrichten erkannt werden + return [] return [] return new_messages