* Lazy-load the step-voice service + scene-wire it into ai-studio
Make the premium-voice lane "just work" in the studio without pre-pinning
GPU1: the step-voice container is now part of the ai-studio scene, but the
~14 GB Step-Audio-EditX model loads on first use instead of at boot, and is
evicted before a video render so it never OOMs against the LTX/Wan DiT
(both want GPU1, the DisTorch donor is ~21.9 GB).
server.py — lazy lifecycle (STEP_VOICE_LAZY=1, default):
- model loads on the FIRST /clone or /edit (lock-guarded), not at import →
the container boots at ~0 GB GPU, so the OWUI voice lane appears as soon
as ai-studio starts it (the pipe gates the lane on :8193 reachability).
- new POST /unload frees the model from GPU; an idle-unload timer
(STEP_VOICE_IDLE_UNLOAD_S, default 300 s) reclaims GPU1 automatically.
- /health reports {ready, loaded, lazy}; transcribe+clone moved off the
event loop into the worker. STEP_VOICE_LAZY=0 restores eager boot.
build_studio_pipe.py / studio_pipe.py — deterministic voice⊕video mutex:
- video lanes (ltx/sulphur/10eros/wan) POST /unload before submitting the
render, so a freshly-used voice model can't collide with the video DiT.
gpu-mode.sh — scene wiring:
- start_step_voice in mode_ai_studio (lazy → cheap); stop_step_voice
wherever stop_comfyui is called (every LLM scene + mode_off) so GPU1 is
freed for a dual-card model. ai-studio --list-modes row + helpers added.
docker-compose.yml — STEP_VOICE_LAZY + STEP_VOICE_IDLE_UNLOAD_S env,
restart policy note (scene-managed), header rewritten for lazy behaviour.
Live-validated via the real compose (--build bakes server.py): lazy boot
loaded:false @ ~4 MiB GPU1, first /clone loads (~13 GB) + clean audio,
POST /unload frees back to ~0, reload clean; gemma12b on GPU0 untouched.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
* ai-studio scene: start qdrant (OWUI's vector DB) + list it
Every model scene starts qdrant (start_service qdrant) but mode_ai_studio
didn't — it predates OWUI's Qdrant vector-DB wiring. So in ai-studio OWUI
ran without its vector store started by the scene (document RAG / web-search
embeddings would have no backend on a clean ai-studio launch from mode_off).
Add start_service qdrant to mode_ai_studio and qdrant:6333 to its
--list-modes service/port row, so it actually starts AND shows up in c3's
ai-studio scene preview alongside studio-step-voice.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
---------
Co-authored-by: noonghunna <[email protected]>
Co-authored-by: Claude Opus 4.8 <[email protected]>