fix: ltx latent_upscaler reads from latent_upscale_models/ folder, not upscale_models/

This commit is contained in:
Jason Hoku
2026-04-25 19:43:10 -07:00
parent 655816c9c9
commit a3478c01cb
4 changed files with 23 additions and 4 deletions
+8
View File
@@ -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
})
+3 -1
View File
@@ -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:
@@ -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(); }},
];
@@ -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)