ComfyUI Node

SamplerLtxv23

The two-pass LTX 2.3 sampler that does hires-fix in one node

By Rogala·Created 6 months ago·Updated 4 months ago· 19
SamplerLtxv23
  • model
  • video_vae
  • positive
  • negative
  • video_latent
  • audio_latent
  • start_image
  • end_image
  • upscale_model
  • video_latent
  • audio_latent
add_noise_1enable
noise_seed_10
steps_18
cfg_11.0
sampler_name_1euler
scheduler_1linear_quadratic
denoise_11.00
add_noise_2enable
noise_seed_20
steps_23
cfg_21.0
sampler_name_2euler
scheduler_2linear_quadratic
denoise_20.40

LTX 2.3's best-looking output doesn't come from rendering at target resolution. It comes from a two-stage trick: denoise a low-res latent, upscale it, then run a short refinement pass at the new size. SamplerLTXV_2.3 packages that whole thing into one sampler node, which is why it's the second half of the pack's flagship LTX pipeline alongside FMLFLTX_2.3. The code is essentially a distillation of WhatDreamsCost's PainterLTX nodes and princepainter's LTX2 workflows - so if you've used either of those, you already know what this is trying to do.

How it works

Pass 1 - full denoise. It takes the video_latent and audio_latent from FMLFLTX, merges them into a NestedTensor, and runs a complete denoise with its own sampler settings. This is the "generate the whole clip at low resolution" step, and it behaves like PainterSamplerLTXV.

Pass 2 - upscale + refine. Three things happen: the latent gets spatially upscaled through the optional upscale_model (a latent upscale model, loaded like any other); your start_image and end_image get re-embedded at the upscaled resolution so the anchors stay sharp; then a short refinement denoise runs with independent sampler settings. denoise_2 controls how much the refinement is allowed to change the upscaled latent - the README's guidance is the lower the better, since the whole point is sharpening, not re-generating.

Every parameter comes in a pass-1 and pass-2 variant - steps_1/steps_2, cfg_1/cfg_2, sampler_name_1/sampler_name_2, scheduler_1/scheduler_2, noise_seed_1/noise_seed_2, add_noise_1/add_noise_2, denoise_1/denoise_2. Defaults are euler / linear_quadratic / CFG 1, which is the right ballpark for a distilled 2.3 model - distilled checkpoints want 8 steps at CFG 1, and 2.3's CFG is a "1.0 baseline, nudge to 1.1–2.0 only if lights blow out" sort of dial.

The README's recommended settings by resolution target:

| Target | steps_1 | steps_2 | denoise_2 | |---|---|---|---| | up to 960×544 | 8 | 3–4 | 0.4 | | 1280×720 | 8–12 | 4–6 | 0.4 | | 1920×1080 | 12 | 6 | 0.4 |

Inputs and outputs

Required pins: model, video_vae (needed for image encoding and upscale statistics), positive, negative, plus video_latent and audio_latent straight from FMLFLTX. Optional: start_image / end_image (re-embedded after upscale) and upscale_model. Outputs are video_latent - upscaled and refined, ready for VAE Decode - and audio_latent for the audio VAE decode.

Installing it

Part of ComfyUI-rogala:

cd ComfyUI/custom_nodes
git clone https://github.com/rogala/ComfyUI-rogala

Restart, find it under rogala → Video → SamplerLTXV_2.3. ComfyUI Manager works too - search "rogala". It's a pure-python node; no downloads beyond the LTX 2.3 models your workflow already loads.

Where people get burned

Two things, both worth flagging. First, if you're running the distilled 2.3 checkpoint, make sure you're on the distilled LoRA 1.1, not 1.0 - the 1.0 release produced mumbling audio out of the first sampler stage, and this node does have two passes that audio runs through. Second, the two-pass design means your output resolution is a product of the upscaler and the input size, not something you type in. Feed it a video_latent whose dimensions came from LTX Resolution Selector in the matching distilled mode, or the upscale target silently disagrees with what you think you're rendering. Get those two right and this node is about the most reliable way to make LTX 2.3 look like it belongs on the "best locally runnable video model" list the community keeps putting it on.

Categoryrogala/Video

Inputs (23)

NameTypeDefaultDescription
modelMODEL
video_vaeVAE
positiveCONDITIONING
negativeCONDITIONING
video_latentLATENT
audio_latentLATENT
add_noise_1COMBOenable2 options: enable, disable
noise_seed_1INT00–18446744073709550000Noise seed for pass 1.
steps_1INT81–10000Denoising steps for pass 1.
cfg_1FLOAT1.00–100CFG scale for pass 1.
sampler_name_1COMBOeuler44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
scheduler_1COMBOlinear_quadratic9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
denoise_1FLOAT1.000–1Denoise strength for pass 1.
add_noise_2COMBOenable2 options: enable, disable
noise_seed_2INT00–18446744073709550000Noise seed for pass 2.
steps_2INT31–10000Denoising steps for pass 2 (refinement after upscale).
cfg_2FLOAT1.00–100CFG scale for pass 2.
sampler_name_2COMBOeuler44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
scheduler_2COMBOlinear_quadratic9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
denoise_2FLOAT0.400–1Denoise strength for pass 2. Lower = less change to upscaled latent.
start_imageoptIMAGE
end_imageoptIMAGE
upscale_modeloptLATENT_UPSCALE_MODEL

Outputs (2)

NameTypeDescription
video_latentLATENT
audio_latentLATENT