diff --git a/python_bridge/.tts_state.json b/python_bridge/.tts_state.json new file mode 100644 index 0000000..06c1f8c --- /dev/null +++ b/python_bridge/.tts_state.json @@ -0,0 +1,3 @@ +{ + "53884f57-43ed-4047-a32d-429cf976d2d0": "claude_msg_39" +} \ No newline at end of file diff --git a/python_bridge/chat_audio_bridge.py b/python_bridge/chat_audio_bridge.py index 6dfa245..d513980 100755 --- a/python_bridge/chat_audio_bridge.py +++ b/python_bridge/chat_audio_bridge.py @@ -740,7 +740,12 @@ Erst dann starten die automatischen TICKs mit Bildern!""" while self.running: try: # Hole neue Nachrichten - messages = self.chat.get_new_messages(since_id=self.last_assistant_message_id) + current_since_id = self.last_assistant_message_id + messages = self.chat.get_new_messages(since_id=current_since_id) + + # Debug: Zeige was wir suchen und was wir finden + if messages: + logger.info(f"TTS: {len(messages)} neue Nachrichten (since={current_since_id})") # ════════════════════════════════════════════════════════════════ # Bei leerem Ergebnis: Prüfe ob wir die ID synchronisieren müssen @@ -763,10 +768,12 @@ Erst dann starten die automatischen TICKs mit Bildern!""" 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]}...") + logger.debug(f"TTS: Nachricht - assistant={msg.is_from_assistant}, id={msg.id}, text={msg.text[:50]}...") if msg.is_from_assistant: + old_id = self.last_assistant_message_id self.last_assistant_message_id = msg.id + logger.info(f"TTS: ID aktualisiert: {old_id} -> {msg.id}") # State speichern (persistent) if self._current_chat_id: diff --git a/python_bridge/chat_web_interface.py b/python_bridge/chat_web_interface.py index 7e9e3d6..0fc1642 100644 --- a/python_bridge/chat_web_interface.py +++ b/python_bridge/chat_web_interface.py @@ -513,7 +513,38 @@ class ClaudeChatInterface: if since_id is None: return all_messages - # Filtere nur neue + # ════════════════════════════════════════════════════════════════ + # STRATEGIE: Nutze immer den Index aus claude_msg_X + # Die IDs werden bei jedem Aufruf neu generiert, daher können wir + # nicht auf exakte ID-Übereinstimmung vertrauen. + # Stattdessen extrahieren wir den Index und geben alle Nachrichten + # NACH diesem Index zurück. + # ════════════════════════════════════════════════════════════════ + if since_id and since_id.startswith("claude_msg_"): + try: + last_index = int(since_id.split("_")[-1]) + # Zähle Claude-Nachrichten und gib nur die nach dem Index zurück + claude_msgs = [m for m in all_messages if m.is_from_assistant] + total_claude = len(claude_msgs) + + if last_index < total_claude - 1: + # Es gibt neue Nachrichten! + new_claude_msgs = claude_msgs[last_index + 1:] + logger.debug(f"Index-basiert: {len(new_claude_msgs)} neue Claude-Nachrichten (Index {last_index + 1} bis {total_claude - 1})") + return new_claude_msgs + else: + # Keine neuen Nachrichten (last_index ist der letzte oder darüber) + logger.debug(f"Index-basiert: Keine neuen Nachrichten (last={last_index}, total={total_claude})") + return [] + except (ValueError, IndexError) as e: + logger.warning(f"Fehler beim Parsen von since_id '{since_id}': {e}") + + # Alte Hash-basierte IDs oder ungültiges Format + if since_id and since_id.startswith("claude_"): + logger.debug(f"since_id '{since_id[:30]}...' hat altes Format - überspringe alle") + return [] + + # Fallback: Exakte ID-Suche (für Nicht-Claude-IDs) new_messages = [] found_marker = False @@ -523,33 +554,6 @@ class ClaudeChatInterface: elif msg.id == since_id: found_marker = True - # WICHTIG: Wenn since_id nicht gefunden wurde, versuche eine Fallback-Logik - if not found_marker and all_messages: - # Neue IDs haben Format "claude_msg_X" wobei X ein Zähler ist - # Alte IDs haben Format "claude_HASH" - diese sind nicht mehr gültig - if since_id and since_id.startswith("claude_msg_"): - # Extrahiere den Zähler und gib alle Nachrichten NACH diesem Index zurück - try: - last_index = int(since_id.split("_")[-1]) - # Zähle Claude-Nachrichten und gib nur die nach dem Index zurück - claude_msgs = [m for m in all_messages if m.is_from_assistant] - if last_index < len(claude_msgs): - # Es gibt neue Nachrichten! - new_claude_msgs = claude_msgs[last_index + 1:] - logger.debug(f"Fallback: {len(new_claude_msgs)} neue Claude-Nachrichten ab Index {last_index + 1}") - return new_claude_msgs - else: - # Keine neuen Nachrichten - return [] - except (ValueError, IndexError): - pass - - # Alte Hash-basierte IDs oder ungültiges Format - if since_id and since_id.startswith("claude_"): - logger.debug(f"since_id '{since_id[:30]}...' hat altes Format oder nicht gefunden - überspringe alle (Neustart-Schutz)") - return [] - return [] - return new_messages def _get_all_messages(self) -> List[ChatMessage]: