P2: Vision im Stream (C2), TTS-Warmup-Retry (L2), parallel-2-Config vorbereitet

- voice.py: Bildschirm-Sicht laeuft IM SSE-Stream (+hermes.vision.progress-Event fuer
  Warte-Ansage), Vision-Timeout 120->45s (MC_VISION_TIMEOUT); deployt + Smoke-Test ok
- useVoiceAgent: Warm-Gate mit Retry/Backoff + sichtbarer Meldung statt stummem Fake-ready
- deploy-Config: hermes -c 131072 --parallel 2 (+KV Q8_0) — Mem0-Extraktion blockiert
  Voice-Turns nicht mehr; speicherneutral. Live-Schaltung: User
- Report: P2-Nachtrag; C5 (pricing/token_stats) war Fehlalarm — in Benutzung

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-02 11:07:00 +02:00
parent e08d812598
commit 68ad291a8f
4 changed files with 50 additions and 24 deletions
@@ -148,8 +148,20 @@ export function useVoiceAgent() {
useEffect(() => {
let cancelled = false
;(async () => {
await tts.waitReady(120_000)
// Geduldiger Retry mit Backoff statt einmaligem 120s-Warten: crasht der pocket_server
// (oder braucht er länger), bleibt die App in 'warming' MIT sichtbarer Meldung — vorher
// schaltete sie nach dem Timeout stumm auf 'ready' und die Stimme fehlte einfach.
let attempt = 0
while (!cancelled) {
const ok = await tts.waitReady(attempt === 0 ? 45_000 : 20_000)
if (cancelled) return
if (ok) break
attempt++
setError(`Stimme startet nicht (Versuch ${attempt}) — pocket_server prüfen, ich versuche es weiter …`)
await new Promise((r) => setTimeout(r, Math.min(5_000 * attempt, 30_000)))
}
if (cancelled) return
setError(null)
// ein Aufwaerm-Satz (primt alle lazy Pfade); Audio verwerfen
try { await tts.synthesize("Alles bereit, Commander.") } catch { /* */ }
if (cancelled) return