fix: HF-Cache zurueck + Banner-Bug + config_request Pattern

Vier Bugs in einem Aufwasch:

1. HF-Cache als Bind-Mount zurueck
   xtts/hf-cache:/root/.cache/huggingface fuer beide Bridges. War vorher
   raus, dadurch jedes Container-Restart = ~3GB Whisper-Download +
   ~1GB F5-TTS-Download. User dachte 5min ist einmalig — ist aber bei
   jedem Restart. Jetzt: einmal pro Maschine geladen, fertig.

2. Banner zeigte stale "ready"
   whisper-bridge sendete beim Connect nur dann Status wenn Modell schon
   geladen war. Sonst blieb der App/Diagnostic Banner auf dem alten
   "ready" State von vor dem Restart haengen — User sah "bereit" obwohl
   gerade gar nichts geladen war. Jetzt wird IMMER ein Status broadcast:
   ready oder loading.

3. config_request Pattern
   aria-bridge wusste nicht wann Gamebox-Bridges sich (re)connecten.
   Wenn die nach aria-bridge kamen, verpassten sie den Config-Broadcast
   und blieben mit Hard-Defaults stehen.
   Jetzt: whisper- und f5tts-bridge senden beim Connect ein
   config_request, aria-bridge antwortet mit der persistierten Config
   (whisperModel, xttsVoice, f5tts*-Felder).

4. RVS ALLOWED_TYPES um config_request erweitert.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-24 17:46:47 +02:00
parent 37c5f6c368
commit 744a27cfd1
6 changed files with 52 additions and 25 deletions
+14 -9
View File
@@ -220,15 +220,20 @@ async def run_loop(runner: WhisperRunner) -> None:
retry_s = 2
tls_fallback_tried = False
# KEIN initialer Preload. Der aria-bridge broadcastet kurz nach
# RVS-Connect die persistierte Config (whisperModel) — wir laden
# erst wenn der drinsteht, sonst wuerde 2x geladen werden
# (small als ENV-Default + dann das echte Modell).
# Wenn ein stt_request schneller kommt als die Config: ensure_loaded
# im Handler greift dann ein und laedt das angeforderte Modell.
if runner.model is not None:
# Wir sind reconnectet — Modell schon im RAM, einfach 'ready'
asyncio.create_task(_broadcast_status(ws, "ready", model=runner.model_size))
# Initialer Status-Broadcast — uebertont alten "ready"-State
# im App/Diagnostic Banner (sonst denkt der User noch alles ist
# gut von vorher). Wenn Modell schon geladen → ready, sonst
# loading mit aktuellem (Default-)Namen.
# Plus: config_request an aria-bridge — wir wissen nicht ob
# sie auch grad reconnected hat oder schon laenger online ist.
async def _initial_handshake():
if runner.model is not None:
await _broadcast_status(ws, "ready", model=runner.model_size)
else:
await _broadcast_status(ws, "loading", model=runner.model_size or WHISPER_MODEL)
# aria-bridge soll uns die persistierte Voice-Config schicken
await _send(ws, "config_request", {"service": "whisper"})
asyncio.create_task(_initial_handshake())
async for raw in ws:
try: