Phase 2: wire Wan 2.1-1.3B into small lane, Wan 2.2 A14B into production lane
Browse files
spi/renderers/registry.py
CHANGED
|
@@ -1,11 +1,13 @@
|
|
| 1 |
"""ModelRouter (§13): chooses a renderer by capability/quality/cost/VRAM, respecting SPI_MODE.
|
| 2 |
-
|
|
|
|
| 3 |
from __future__ import annotations
|
| 4 |
|
| 5 |
from typing import Any
|
| 6 |
|
| 7 |
from spi.renderers.base import Renderer, RendererError
|
| 8 |
from spi.renderers.mock import MockAudioRenderer, MockImageRenderer, MockVideoRenderer
|
|
|
|
| 9 |
|
| 10 |
DEFAULT_REGISTRIES: dict[str, dict[str, Renderer]] = {
|
| 11 |
"mock": {
|
|
@@ -14,12 +16,14 @@ DEFAULT_REGISTRIES: dict[str, dict[str, Renderer]] = {
|
|
| 14 |
"audio": MockAudioRenderer(),
|
| 15 |
},
|
| 16 |
"small": {
|
| 17 |
-
|
|
|
|
| 18 |
"image": MockImageRenderer(),
|
| 19 |
"audio": MockAudioRenderer(),
|
| 20 |
},
|
| 21 |
"production": {
|
| 22 |
-
|
|
|
|
| 23 |
"image": MockImageRenderer(),
|
| 24 |
"audio": MockAudioRenderer(),
|
| 25 |
},
|
|
@@ -61,7 +65,7 @@ class ModelRouter:
|
|
| 61 |
elif req_key not in caps:
|
| 62 |
score += 10 # cannot satisfy: deprioritize hard
|
| 63 |
vram = caps.get("vram_gb", 999)
|
| 64 |
-
score += 0 if vram == 0 else min(vram, 20) # cheap-first bias
|
| 65 |
scored.append((score, renderer))
|
| 66 |
scored.sort(key=lambda pair: (pair[0], pair[1].name))
|
| 67 |
return scored[0][1]
|
|
|
|
| 1 |
"""ModelRouter (§13): chooses a renderer by capability/quality/cost/VRAM, respecting SPI_MODE.
|
| 2 |
+
Renderer construction is lazy (models load on first generate), so registering the real
|
| 3 |
+
Wan adapters here costs nothing on CPU-only test environments."""
|
| 4 |
from __future__ import annotations
|
| 5 |
|
| 6 |
from typing import Any
|
| 7 |
|
| 8 |
from spi.renderers.base import Renderer, RendererError
|
| 9 |
from spi.renderers.mock import MockAudioRenderer, MockImageRenderer, MockVideoRenderer
|
| 10 |
+
from spi.renderers.wan import WanRenderer
|
| 11 |
|
| 12 |
DEFAULT_REGISTRIES: dict[str, dict[str, Renderer]] = {
|
| 13 |
"mock": {
|
|
|
|
| 16 |
"audio": MockAudioRenderer(),
|
| 17 |
},
|
| 18 |
"small": {
|
| 19 |
+
# real backend: Wan 2.1 T2V 1.3B (Apache-2.0, ~8.2 GB VRAM) — Phase 2 deliverable
|
| 20 |
+
"video": WanRenderer("Wan-AI/Wan2.1-T2V-1.3B-Diffusers"),
|
| 21 |
"image": MockImageRenderer(),
|
| 22 |
"audio": MockAudioRenderer(),
|
| 23 |
},
|
| 24 |
"production": {
|
| 25 |
+
# placeholder quality lane: loads on first use, needs ~80 GB VRAM (Phase 10 hardware)
|
| 26 |
+
"video": WanRenderer("Wan-AI/Wan2.2-T2V-A14B-Diffusers"),
|
| 27 |
"image": MockImageRenderer(),
|
| 28 |
"audio": MockAudioRenderer(),
|
| 29 |
},
|
|
|
|
| 65 |
elif req_key not in caps:
|
| 66 |
score += 10 # cannot satisfy: deprioritize hard
|
| 67 |
vram = caps.get("vram_gb", 999)
|
| 68 |
+
score += 0 if vram == 0 else min(int(vram), 20) # cheap-first bias
|
| 69 |
scored.append((score, renderer))
|
| 70 |
scored.sort(key=lambda pair: (pair[0], pair[1].name))
|
| 71 |
return scored[0][1]
|