LTX-2.3 Two-Stage Sampler (base + refine) ⚡
Base pass, upscale, refine — the official LTX-2.3 two-stage, one node
- model
- positive
- negative
- latent_image
- upscale_model
- vae
- LATENT
The single-pass distilled sampler is fast and the two-stage recipe is the quality path: sample at base resolution, spatially ×2 upscale the latent, then run a short refine pass to rebuild the detail the upscale blurred. That's LTX-2.3's official workflow, and doing it by hand means threading the joint audio-video latent through an upscale model that only understands video-shaped tensors - call it on the concatenated AV tensor and it silently treats part of the audio latent as video channels. LTX-2.3 Two-Stage Sampler does the whole dance in one node: base pass, split the joint latent, upscale only the video branch, rejoin, refine. This is the node you reach for when "good enough, fast" isn't good enough.
The inputs that matter
model,positive,negative,latent_image- from the loader and prep node as usual.upscale_model- the ×2 latent upscaler, from coreLatentUpscaleModelLoader(the model's output, not the file path).vae- the video VAE, used to normalize the latent around the upscale model (the upscale model expects normalized latent statistics; the node handles un-normalize/normalize around it).base_schedule/base_steps- the first pass, defaultdmd (8 steps)/ 8.refine_schedule/refine_steps- the refine pass, defaultrefine (3 steps)/ 3.seed/refine_seed- separate seeds for the two passes.cfg(1.0) andsampler_name(euler) - the trained defaults, same story as the single-pass sampler.
One output, LATENT - into LTXV23AVDecode.
How it works
It's a port of core's LTXVLatentUpsampler logic, restricted to the video branch. The node splits the joint AV latent, runs the base pass, splits again for the upscale - sending only the video tensor through the upscale model with the audio held aside - then normalizes around the upscale model, rejoins both branches, and runs the refine pass. That split-and-rejoin is the part you'd get wrong by hand, and the reason this node exists rather than "just chain two KSamplers around an upscale." The refined latent has no held frames left (the upscale consumes the noise mask), which the node handles for you.
Installing it
Same pack as the whole LTX-2.3 line:
cd ComfyUI/custom_nodes
git clone https://github.com/ChrisColeTech/ComfyUI-GGUF-Loader
cd ComfyUI-GGUF-Loader
pip install --upgrade gguf
Restart; under 🤖 CCTech/LTX-2.3. No extra dependencies - the upscale model itself comes from ComfyUI core's LatentUpscaleModelLoader, and you still need the kit's upscale checkpoint on disk for that node.
Choosing between the samplers
The pack gives you two samplers because LTX-2.3 has two official paths: LTXV23KSampler for the single distilled pass (fast, the daily driver), this node for base + ×2 upscale + refine (the quality path, roughly the "official recipe" people cite). If your clip is going to be watched, do the two-stage; if you're iterating on a caption or a reference photo, iterate on the single pass and commit to two-stage when the idea is right. Both pass the exact trained schedules, so the difference is resolution and refinement, not "correctness."
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| latent_image | LATENT | — | |
| upscale_model | LATENT_UPSCALE_MODEL | — | |
| vae | VAE | Video VAE - normalizes the latent around the upscale model. | |
| seed | INT | 00–18446744073709550000 | — |
| base_schedule | COMBO | dmd (8 steps) | 5 options: dmd (8 steps), dmd card (9 steps), dmd upscale (4 steps), distilled (8 steps), refine (3 steps) |
| base_steps | INT | 81–10000 | — |
| refine_seed | INT | 00–18446744073709550000 | — |
| refine_schedule | COMBO | refine (3 steps) | 5 options: dmd (8 steps), dmd card (9 steps), dmd upscale (4 steps), distilled (8 steps), refine (3 steps) |
| refine_steps | INT | 31–10000 | — |
| cfg | FLOAT | 1.00–100 | — |
| sampler_name | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |