From 790b41f262ee6d0916587941e1f801a6e7d830b4 Mon Sep 17 00:00:00 2001 From: Daniel Han Date: Mon, 6 Jul 2026 14:52:11 +0000 Subject: [PATCH] Honor the resolved family default when no identifier names a video variant default_video_generation_params fell back to a hardcoded LTX 40/4.0 when no identifier matched. A Wan model loaded from an opaque local path under an explicit family_override (none of gguf_filename / repo_id / base_repo carrying a wan token) then ran 40/4.0 instead of Wan's 50/5.0. Add a fallback param and pass the resolved family's own default_steps/default_guidance from both call sites, so the fallback tracks the actual family. --- studio/backend/core/inference/video.py | 10 ++++++++-- studio/backend/core/inference/video_families.py | 10 +++++++--- studio/backend/tests/test_video_families.py | 12 ++++++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/studio/backend/core/inference/video.py b/studio/backend/core/inference/video.py index 97211baf00..7d7bdf6be6 100644 --- a/studio/backend/core/inference/video.py +++ b/studio/backend/core/inference/video.py @@ -1179,7 +1179,10 @@ class VideoBackend: frames = snap_num_frames(fam, num_frames or fam.default_num_frames) out_fps = int(fps or fam.default_fps) default_steps, default_guidance = default_video_generation_params( - state.gguf_filename, state.repo_id, state.base_repo + state.gguf_filename, + state.repo_id, + state.base_repo, + fallback = (fam.default_steps, fam.default_guidance), ) steps = int(steps or default_steps) guidance = float(default_guidance if guidance is None else guidance) @@ -1384,7 +1387,10 @@ class VideoBackend: } fam = state.family default_steps, default_guidance = default_video_generation_params( - state.gguf_filename, state.repo_id, state.base_repo + state.gguf_filename, + state.repo_id, + state.base_repo, + fallback = (fam.default_steps, fam.default_guidance), ) return { "loaded": True, diff --git a/studio/backend/core/inference/video_families.py b/studio/backend/core/inference/video_families.py index 2ef4a12222..9feccf5100 100644 --- a/studio/backend/core/inference/video_families.py +++ b/studio/backend/core/inference/video_families.py @@ -279,13 +279,17 @@ _VIDEO_GENERATION_DEFAULTS: tuple[tuple[str, int, float], ...] = ( ) -def default_video_generation_params(*identifiers: Optional[str]) -> tuple[int, float]: +def default_video_generation_params( + *identifiers: Optional[str], fallback: tuple[int, float] = (40, 4.0) +) -> tuple[int, float]: """Default ``(steps, guidance)`` for a loaded video model; the first identifier naming a known variant wins, so a GGUF filename ('...distilled...Q4_K_M.gguf') - beats the family base repo.""" + beats the family base repo. ``fallback`` is used when no identifier names a variant -- + callers pass the resolved family's own default so a Wan model loaded from an opaque local + path under an explicit family_override still gets 50/5.0, not the hardcoded LTX 40/4.0.""" for identifier in identifiers: needle = (identifier or "").lower() for key, steps, guidance in _VIDEO_GENERATION_DEFAULTS: if key in needle: return steps, guidance - return 40, 4.0 + return fallback diff --git a/studio/backend/tests/test_video_families.py b/studio/backend/tests/test_video_families.py index c7a6084905..b9ee682209 100644 --- a/studio/backend/tests/test_video_families.py +++ b/studio/backend/tests/test_video_families.py @@ -178,6 +178,18 @@ def test_wan_generation_defaults(): ) == (50, 5.0) +def test_generation_defaults_fallback_honors_family(): + # When no identifier names a known variant (a Wan model loaded from an opaque local path under + # an explicit family_override), the fallback -- the resolved family's own default -- is used, + # not the hardcoded LTX 40/4.0. Without a family fallback a Wan model would wrongly run 40/4.0. + assert default_video_generation_params("/models/my-clip", "/models/my-clip") == (40, 4.0) + assert default_video_generation_params( + "/models/my-clip", "/models/my-clip", fallback = (50, 5.0) + ) == (50, 5.0) + # A recognised token still wins over the fallback. + assert default_video_generation_params("wan2.2-ti2v-5b", fallback = (8, 1.0)) == (50, 5.0) + + def test_wan_size_tables_present(): ti2v = detect_video_family("Wan-AI/Wan2.2-TI2V-5B-Diffusers") a14b = detect_video_family("Wan-AI/Wan2.2-T2V-A14B-Diffusers")