diff --git a/config_builder_node.py b/config_builder_node.py index 60000be..782ffee 100644 --- a/config_builder_node.py +++ b/config_builder_node.py @@ -1173,6 +1173,13 @@ async def get_model_lists_endpoint(request): except (KeyError, Exception): upscale_models = [] + # Latent upscale model list (separate folder; used by LatentUpscaleModelLoader, + # e.g. LTX 2.3 spatial upscaler) + try: + latent_upscale_models = folder_paths.get_filename_list("latent_upscale_models") + except (KeyError, Exception): + latent_upscale_models = [] + # VAE list vae_list = folder_paths.get_filename_list("vae") @@ -1191,6 +1198,7 @@ async def get_model_lists_endpoint(request): "dual_clip_types": dual_clip_types, "vae": vae_list, "upscale_models": upscale_models, + "latent_upscale_models": latent_upscale_models, "samplers": sampler_names, "schedulers": scheduler_names }) diff --git a/ltx_video_generation.py b/ltx_video_generation.py index 6e3f914..867f31f 100644 --- a/ltx_video_generation.py +++ b/ltx_video_generation.py @@ -153,13 +153,15 @@ def preflight_ltx(config): ) # 3. Model files exist? + # Note: latent_upscaler lives in `latent_upscale_models/` (consumed by + # LatentUpscaleModelLoader), NOT `upscale_models/` (which is for image upscalers). checks = [ ("diffusion_models", config["model"]), ("text_encoders", config["clip_models"][0]), ("text_encoders", config["clip_models"][1]), ("vae", config["vae_video"]), ("vae", config["vae_audio"]), - ("upscale_models", config["latent_upscaler"]), + ("latent_upscale_models", config["latent_upscaler"]), ] missing_files = [] for folder_key, name in checks: diff --git a/web/conf_builder/conf-builder-config-management.js b/web/conf_builder/conf-builder-config-management.js index 7649772..27329ef 100644 --- a/web/conf_builder/conf-builder-config-management.js +++ b/web/conf_builder/conf-builder-config-management.js @@ -16,6 +16,7 @@ import { getVAEFolders, getAvailableTextEncoders, getAvailableUpscaleModels, + getAvailableLatentUpscaleModels, getAvailableSamplers } from './conf-builder-utilities.js'; @@ -3854,7 +3855,7 @@ function renderLTXModelFiles(node, configArray) { const textEncoders = getAvailableTextEncoders(); const vaeList = getAvailableVAEs(); - const upscaleModels = getAvailableUpscaleModels(); + const latentUpscaleModels = getAvailableLatentUpscaleModels(); const fields = [ {label: "Dual CLIP 1 (gemma):", optionsList: textEncoders, @@ -3881,8 +3882,8 @@ function renderLTXModelFiles(node, configArray) { placeholder: "Search VAEs...", getter: () => ltx.vae_audio || "", setter: (v) => { ltx.vae_audio = v; node.saveState(); }}, - {label: "Latent Upscaler:", optionsList: upscaleModels, - placeholder: "Search upscale models...", + {label: "Latent Upscaler:", optionsList: latentUpscaleModels, + placeholder: "Search latent upscalers...", getter: () => ltx.latent_upscaler || "", setter: (v) => { ltx.latent_upscaler = v; node.saveState(); }}, ]; diff --git a/web/conf_builder/conf-builder-utilities.js b/web/conf_builder/conf-builder-utilities.js index 9165915..43cf956 100644 --- a/web/conf_builder/conf-builder-utilities.js +++ b/web/conf_builder/conf-builder-utilities.js @@ -18,6 +18,8 @@ let availableVAEs = null; let vaeFolders = null; let availableUpscaleModels = []; let upscaleModelFolders = ["/"]; +let availableLatentUpscaleModels = []; +let latentUpscaleModelFolders = ["/"]; let clipTypes = []; let dualClipTypes = []; let availableSamplers = []; @@ -311,6 +313,10 @@ export async function getModelLists() { availableUpscaleModels = (data.upscale_models || []).map(normalizePath); upscaleModelFolders = extractFolders(availableUpscaleModels); + // Latent upscale model list (separate folder; LTX 2.3 spatial upscaler etc.) + availableLatentUpscaleModels = (data.latent_upscale_models || []).map(normalizePath); + latentUpscaleModelFolders = extractFolders(availableLatentUpscaleModels); + console.log(`[ConfigBuilder] Model lists loaded: ${availableModels?.length || 0} checkpoints, ` + `${availableDiffusionModels.length} diffusion models, ${availableGGUFModels.length} GGUFs, ` + `${availableTextEncoders.length} text encoders, ${availableVAEs.length} VAEs, ` + @@ -346,6 +352,8 @@ export function getAvailableSamplers() { return availableSamplers || []; } export function getAvailableSchedulers() { return availableSchedulers || []; } export function getAvailableUpscaleModels() { return availableUpscaleModels || []; } export function getUpscaleModelFolders() { return upscaleModelFolders || ["/"]; } +export function getAvailableLatentUpscaleModels() { return availableLatentUpscaleModels || []; } +export function getLatentUpscaleModelFolders() { return latentUpscaleModelFolders || ["/"]; } export async function getAvailableSessions() { // Return cached sessions if already loaded (cleared by clearAllCaches on explicit refresh)