fix(downloads): close routing gaps and map CivitAI ModelType.UNet to the checkpoint branch

Cross-checked both baseModel lists against CivitAI's official
baseModelRecords (packages/civitai-shared src/basemodel.constants.ts):

- CHECKPOINT_BASE_MODELS gains SD 2.0/2.1 768, SD 2.1 Unclip, SDXL 0.9 /
  1.0 LCM / Turbo / Distilled, Playground v2 and Stable Cascade
  (unCLIP-style but CheckpointLoader-loaded).
- DIFFUSION_MODEL_BASE_MODELS gains SVD XT, LTXV 2.5, Flux 3 Video,
  Wan Image 2.7, Wan Video 2.7 / 3.0, HiDream-O1, Boogu and the Ming
  Image Design families. API-only (Kling/Sora/Veo/Imagen...), 3D and
  audio baseModels are intentionally skipped.
- Pony V7 exclusion now backed by live-API evidence (model 1901521 is
  AuraFlow-architecture shipping .gguf variants).

CivitAI has no model-level diffusion ModelType: DiT models are uploaded
as "Checkpoint" or "UNet", with only uploader-chosen file types to tell
them apart. model.type "unet" previously fell through type derivation
and failed with 'not supported for download'; it now goes through the
checkpoint branch in both the download manager and the download routing
endpoint, so the standard chain (file type -> baseModel lists -> unknown
default) applies.
This commit is contained in:
Will Miao
2026-10-02 10:34:59 +08:00
parent 3aa32120df
commit 7b2a108596
6 changed files with 122 additions and 5 deletions
@@ -55,6 +55,11 @@ class DownloadRoutingHandler:
status=400,
)
# CivitAI ModelType.UNet downloads go through the checkpoint branch,
# same as in the download manager.
if model_type.lower() == "unet":
model_type = "checkpoint"
if model_type.lower() in VALID_OTHER_CIVITAI_TYPES:
from ...services.settings_manager import get_settings_manager
+5 -1
View File
@@ -1523,7 +1523,11 @@ class DownloadManager:
return {"success": False, "error": "Failed to fetch model metadata"}
model_type_from_info = version_info.get("model", {}).get("type", "").lower()
if model_type_from_info == "checkpoint":
# CivitAI ModelType has no model-level diffusion variant: DiT
# models are uploaded as "Checkpoint" or "UNet". Both go through
# the checkpoint branch so the standard diffusion routing chain
# (file type -> baseModel lists -> unknown default) applies.
if model_type_from_info in ("checkpoint", "unet"):
model_type = "checkpoint"
elif model_type_from_info in VALID_LORA_TYPES:
model_type = "lora"
+27 -3
View File
@@ -352,12 +352,15 @@ DIFFUSION_MODEL_BASE_MODELS = frozenset(
"PixArt E",
# Video diffusion models
"CogVideoX",
"Flux 3 Video",
"Hunyuan Video",
"LTXV",
"LTXV2",
"LTXV 2.3",
"LTXV 2.5",
"Mochi",
"SVD",
"SVD XT",
"Wan Video",
"Wan Video 1.3B t2v",
"Wan Video 14B t2v",
@@ -368,12 +371,19 @@ DIFFUSION_MODEL_BASE_MODELS = frozenset(
"Wan Video 2.2 T2V-A14B",
"Wan Video 2.5 T2V",
"Wan Video 2.5 I2V",
"Wan Video 2.7",
"Wan Video 3.0",
# Other diffusion models
"Boogu",
"Ernie",
"Ernie Turbo",
"HiDream-O1",
"Ming Image Design 0.1",
"Ming Image Design Layer 0.1",
"MiniMax H3",
"Nucleus",
"Qwen",
"Wan Image 2.7",
"ZImageBase",
"ZImageTurbo",
# Krea 2 — loaded via UNETLoader in ComfyUI
@@ -385,9 +395,12 @@ DIFFUSION_MODEL_BASE_MODELS = frozenset(
# CheckpointLoaderSimple in ComfyUI). New DiT families appear on CivitAI all
# the time, so download routing inverts the fallback: anything NOT in this
# closed set (and not a known diffusion model) is treated as a diffusion
# model by default (see py/services/download_routing.py).
# "Pony V7" is deliberately excluded: it is not an SDXL-derivative full
# checkpoint, so it follows the unknown-base-model default (diffusion).
# model by default (see py/services/download_routing.py). Cross-checked
# against CivitAI's official baseModelRecords (packages/civitai-shared
# src/basemodel.constants.ts), not only the download skip list.
# "Pony V7" is deliberately excluded: verified via the live API (model
# 1901521) to be AuraFlow-architecture shipping .gguf variants (UNETLoader),
# so it follows the unknown-base-model default (diffusion).
CHECKPOINT_BASE_MODELS = frozenset(
[
# Stable Diffusion 1.x
@@ -397,7 +410,10 @@ CHECKPOINT_BASE_MODELS = frozenset(
"SD 1.5 Hyper",
# Stable Diffusion 2.x
"SD 2.0",
"SD 2.0 768",
"SD 2.1",
"SD 2.1 768",
"SD 2.1 Unclip",
# Stable Diffusion 3.x
"SD 3",
"SD 3.5",
@@ -405,12 +421,20 @@ CHECKPOINT_BASE_MODELS = frozenset(
"SD 3.5 Large",
"SD 3.5 Large Turbo",
# SDXL and its full-checkpoint derivatives
"SDXL 0.9",
"SDXL 1.0",
"SDXL 1.0 LCM",
"SDXL Lightning",
"SDXL Hyper",
"SDXL Turbo",
"SDXL Distilled",
"Pony",
"Illustrious",
"NoobAI",
# Other full-checkpoint families
"Playground v2",
# Stable Cascade is unCLIP-style but loads via CheckpointLoader
"Stable Cascade",
]
)