perf(startup): lokale Modelle beim Start vorladen (Warm-up)
Lifespan-Hintergrundtask laedt profilabhaengig piper-Stimme + faster-whisper-Modell vor (nur was die aktive Konfiguration nutzt; Cloud-Profile = No-op). Server ist sofort verfuegbar; der erste Nutzer zahlt nicht mehr den Kaltstart. Messung: erster Turn direkt nach Start first_audio 1,62 s (statt ~4,5 s mit Kaltstart). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
7ca69e1049
commit
111ecd8edf
3 changed files with 84 additions and 1 deletions
25
tests/test_warmup.py
Normal file
25
tests/test_warmup.py
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import asyncio
|
||||
|
||||
from app.core.warmup import warmup_local_models
|
||||
|
||||
|
||||
def test_warmup_is_noop_for_cloud_defaults():
|
||||
# Mit den Test-Defaults (openrouter-Provider) lädt warmup nichts und wirft nicht.
|
||||
asyncio.run(warmup_local_models())
|
||||
|
||||
|
||||
def test_warmup_loads_piper(monkeypatch):
|
||||
calls = {}
|
||||
|
||||
class FakePiperTTSProvider: # Name muss zur Typpruefung im warmup passen
|
||||
async def synthesize(self, text, voice=None, audio_format="pcm"):
|
||||
calls["tts"] = text
|
||||
return b"AUDIO"
|
||||
|
||||
import app.dependencies as deps
|
||||
monkeypatch.setattr(deps, "get_tts_provider", lambda *a, **k: FakePiperTTSProvider())
|
||||
# Klassennamen auf den vom warmup geprueften Namen setzen.
|
||||
FakePiperTTSProvider.__name__ = "PiperTTSProvider"
|
||||
|
||||
asyncio.run(warmup_local_models())
|
||||
assert calls.get("tts") # synthesize wurde aufgerufen
|
||||
Loading…
Add table
Add a link
Reference in a new issue