From 5761c5f6b9d48f58bc41f41be6cd5f25c36eef5b Mon Sep 17 00:00:00 2001 From: duffyduck Date: Fri, 2 Oct 2026 01:33:22 +0200 Subject: [PATCH] =?UTF-8?q?fix(xtts):=20Worker-Neustartschleife=20?= =?UTF-8?q?=E2=80=94=20max=5Fsize=20an=20den=20RVS=20angleichen=20(50MB=20?= =?UTF-8?q?->=201500MB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ursache der staendigen whisper/f5tts-Neustarts, direkt aus dem Box-Log: sent 1009 (message too big) frame with 209221780 bytes exceeds limit of 52428800 bytes Der RVS ist ein BROADCAST-Relay: eine grosse Nachricht (Datei-Transfer, Voice-Upload, APK-Update) geht an JEDEN Client im Raum. Die aria-bridge nutzt deshalb max_size=1500MB — die Worker standen auf 50MB (llm-adapter sogar 16MB). Ein 209-MB-Frame liess sie die Verbindung mit Code 1009 schliessen; danach TLS-Fallback auf ws:// (scheitert an Caddy), Reconnect, naechster Frame, von vorn. Ergebnis: Neustart im Minutentakt, und jede laufende Aufnahme war weg — das ist die eigentliche Ursache fuer 'erste Sprachnachricht kommt nicht durch'. Alle vier Worker nutzen jetzt RVS_MAX_SIZE_MB (Default 1500), passend zu RVS/Bridge. Die GPU war NICHT das Problem (4,3 von 8 GB belegt, zweite Karte leer). Co-Authored-By: Claude Opus 4.8 --- xtts/f5tts/bridge.py | 9 ++++++++- xtts/llm-adapter/adapter.py | 9 ++++++++- xtts/voxtral/bridge.py | 9 ++++++++- xtts/whisper/bridge.py | 9 ++++++++- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/xtts/f5tts/bridge.py b/xtts/f5tts/bridge.py index 66338a2..474eddd 100644 --- a/xtts/f5tts/bridge.py +++ b/xtts/f5tts/bridge.py @@ -896,7 +896,14 @@ async def run_loop(runner: F5Runner) -> None: url = f"{scheme}://{uri_host}:{RVS_PORT}?token={RVS_TOKEN}" masked = url.replace(RVS_TOKEN, "***") if RVS_TOKEN else url - connect_kwargs = {"ping_interval": 20, "ping_timeout": 10, "max_size": 50 * 1024 * 1024} + # max_size MUSS zum RVS/zur Bridge passen (1500 MB). Der RVS ist ein + # BROADCAST-Relay: eine grosse Nachricht (Datei-Transfer, Voice-Upload, + # APK-Update) geht an JEDEN Client im Raum. Wer ein kleineres Limit hat, + # schliesst die Verbindung mit Code 1009 ("message too big") und landet in + # einer Reconnect-Schleife — real gesehen mit einem 209-MB-Frame, der + # whisper und f5tts im Minutentakt neu starten liess. + _MAX_WS_BYTES = int(os.getenv("RVS_MAX_SIZE_MB", "1500")) * 1024 * 1024 + connect_kwargs = {"ping_interval": 20, "ping_timeout": 10, "max_size": _MAX_WS_BYTES} try: logger.info("Verbinde zu RVS: %s%s", masked, f" (TCP {RVS_HOST})" if (use_tls and RVS_SNI) else "") async with websockets.connect(url, **connect_kwargs) as ws: diff --git a/xtts/llm-adapter/adapter.py b/xtts/llm-adapter/adapter.py index b4c4b42..6aedc5a 100644 --- a/xtts/llm-adapter/adapter.py +++ b/xtts/llm-adapter/adapter.py @@ -534,7 +534,14 @@ async def _run() -> None: uri_host = RVS_SNI if (use_tls and RVS_SNI) else RVS_HOST url = f"{scheme}://{uri_host}:{RVS_PORT}?token={RVS_TOKEN}" masked = url.replace(RVS_TOKEN, "***") if RVS_TOKEN else url - connect_kwargs = {"ping_interval": 20, "ping_timeout": 10, "max_size": 16 * 1024 * 1024} + # max_size MUSS zum RVS/zur Bridge passen (1500 MB). Der RVS ist ein + # BROADCAST-Relay: eine grosse Nachricht (Datei-Transfer, Voice-Upload, + # APK-Update) geht an JEDEN Client im Raum. Wer ein kleineres Limit hat, + # schliesst die Verbindung mit Code 1009 ("message too big") und landet in + # einer Reconnect-Schleife — real gesehen mit einem 209-MB-Frame, der + # whisper und f5tts im Minutentakt neu starten liess. + _MAX_WS_BYTES = int(os.getenv("RVS_MAX_SIZE_MB", "1500")) * 1024 * 1024 + connect_kwargs = {"ping_interval": 20, "ping_timeout": 10, "max_size": _MAX_WS_BYTES} try: logger.info("Verbinde zu RVS: %s%s (llama=%s)", masked, f" (TCP {RVS_HOST})" if (use_tls and RVS_SNI) else "", LLAMA_URL) diff --git a/xtts/voxtral/bridge.py b/xtts/voxtral/bridge.py index d824166..f01d012 100644 --- a/xtts/voxtral/bridge.py +++ b/xtts/voxtral/bridge.py @@ -760,7 +760,14 @@ async def run_loop(sessions: SessionManager) -> None: uri_host = RVS_SNI if (use_tls and RVS_SNI) else RVS_HOST url = f"{scheme}://{uri_host}:{RVS_PORT}?token={RVS_TOKEN}" masked = url.replace(RVS_TOKEN, "***") if RVS_TOKEN else url - connect_kwargs = {"ping_interval": 20, "ping_timeout": 10, "max_size": 50 * 1024 * 1024} + # max_size MUSS zum RVS/zur Bridge passen (1500 MB). Der RVS ist ein + # BROADCAST-Relay: eine grosse Nachricht (Datei-Transfer, Voice-Upload, + # APK-Update) geht an JEDEN Client im Raum. Wer ein kleineres Limit hat, + # schliesst die Verbindung mit Code 1009 ("message too big") und landet in + # einer Reconnect-Schleife — real gesehen mit einem 209-MB-Frame, der + # whisper und f5tts im Minutentakt neu starten liess. + _MAX_WS_BYTES = int(os.getenv("RVS_MAX_SIZE_MB", "1500")) * 1024 * 1024 + connect_kwargs = {"ping_interval": 20, "ping_timeout": 10, "max_size": _MAX_WS_BYTES} try: logger.info("Verbinde zu RVS: %s%s", masked, f" (TCP {RVS_HOST})" if (use_tls and RVS_SNI) else "") async with websockets.connect(url, **connect_kwargs) as ws: diff --git a/xtts/whisper/bridge.py b/xtts/whisper/bridge.py index 1db3d6c..e1c9d9d 100644 --- a/xtts/whisper/bridge.py +++ b/xtts/whisper/bridge.py @@ -898,7 +898,14 @@ async def run_loop(runner: WhisperRunner, sessions: SessionManager) -> None: uri_host = RVS_SNI if (use_tls and RVS_SNI) else RVS_HOST url = f"{scheme}://{uri_host}:{RVS_PORT}?token={RVS_TOKEN}" masked = url.replace(RVS_TOKEN, "***") if RVS_TOKEN else url - connect_kwargs = {"ping_interval": 20, "ping_timeout": 10, "max_size": 50 * 1024 * 1024} + # max_size MUSS zum RVS/zur Bridge passen (1500 MB). Der RVS ist ein + # BROADCAST-Relay: eine grosse Nachricht (Datei-Transfer, Voice-Upload, + # APK-Update) geht an JEDEN Client im Raum. Wer ein kleineres Limit hat, + # schliesst die Verbindung mit Code 1009 ("message too big") und landet in + # einer Reconnect-Schleife — real gesehen mit einem 209-MB-Frame, der + # whisper und f5tts im Minutentakt neu starten liess. + _MAX_WS_BYTES = int(os.getenv("RVS_MAX_SIZE_MB", "1500")) * 1024 * 1024 + connect_kwargs = {"ping_interval": 20, "ping_timeout": 10, "max_size": _MAX_WS_BYTES} try: logger.info("Verbinde zu RVS: %s%s", masked, f" (TCP {RVS_HOST})" if (use_tls and RVS_SNI) else "") async with websockets.connect(url, **connect_kwargs) as ws: