Nodes/TBG’s ComfyUI Development Takeaways/TBG Dual Model KSampler (Inpaint Split Aware)
ComfyUI Node

TBG Dual Model KSampler (Inpaint Split Aware)

TBG's dual-model trick for Flux + Z-Image

By Ltamann·Created about a year ago·Updated 7 months ago· 20
TBG Dual Model KSampler (Inpaint Split Aware)
  • model_high
  • model_low
  • positive_high
  • negative_high
  • positive_low
  • negative_low
  • latent_image
  • output
noise_seed0
cfg_high1.0
cfg_low1.0
sampler_name
scheduler
steps_high20
steps_low9
denoise1.00
model_crossover_sigma_strength0.50
low_sigma_alignment1.00
inpaint_end0
smoother_sharper0.00
detail_enhancer0.00

This is the headliner of the TBG Takeaways pack, and it's genuinely a different idea from the usual ComfyUI sampler: instead of one model denoising all the way down, it runs two models in a single sampling pass, splitting the sigma schedule at a crossover point. The big model handles the high-sigma "shape the picture" phase, and a second, usually cheaper model handles the low-sigma "paint the details" phase. Each phase gets its own prompt, its own CFG, and its own step count.

Why would you bother? Think about how a normal Flux generation spends its steps: the first third roughly composes the image, the last two thirds refine it. That refinement is where a fast, low-step model like Z-Image Turbo or Wan 2.1-low does most of the work far cheaper. If the two models share a latent space - same VAE, same latent dimensions - you can hand the latent from one to the other mid-sampling without ever decoding to pixels. The shared-VAE trick is the underrated payoff here: "if two models use the same VAE, you can use them even after each other without decoding the latents." That's exactly what this node automates.

The inputs that matter

The two model inputs are non-negotiable and the docs hammer one warning: model_high and model_low must be latent-compatible. Flux + Z-Image works, Chroma + Flux works, Qwen + WAN works. Mix Flux with an SD1.5 model and you'll get corrupted output, not a subtle difference - the latent channels don't even line up. The author's tooltips call this out explicitly, and it's the #1 way people burn an hour on this node.

  • positive_high / negative_high - the prompt that guides structure. This is your real prompt.
  • positive_low / negative_low - the prompt that guides detail. You can tell a different story here, e.g. "fine textures, film grain" while the high phase does composition.
  • model_crossover_sigma_strength - where the baton passes. 0.5 means high model takes sigmas above the midpoint, low model takes the rest. Default is fine to start.
  • steps_high / steps_low - these are total schedule steps per model, not executed steps. With split at 0.5, a Flux 20-step schedule executes roughly the high half. The tooltip explains this; read it twice because it trips everyone up.
  • low_sigma_alignment - nudges the low model's sigma values up or down so the two schedules line up. Leave at 1 until something looks off.
  • smoother_sharper and detail_enhancer - the same dual-stage sharpening / substep lookahead pair the pack's other samplers share. Zero disables both; positive sharpens.
  • inpaint_end - negative step count from the end after which inpainting stops. For inpainting only the early part of the run.

Output is a single LATENT; it wires straight into whatever decodes or chains next.

Install and what to expect

ComfyUI Manager → search "TBG Takeaways" → install, restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/Ltamann/ComfyUI-TBG-Takeaways

Then restart ComfyUI. The node appears under TBG/Sampler. No extra Python dependencies beyond core ComfyUI and no model downloads - it uses whatever checkpoints you already have loaded.

Honest takes: this is an experimental, Patreon-backed power-user node (author Tobias Laarmann, TGB, ships these as "sidecodes" from his TBG ETUR upscaler). There's no example workflow in the repo, so budget real experimentation time. Expect the dual-model runs to be slower than a single-model run - you're loading two models. And if output looks like static, your pair isn't latent-compatible, full stop. But when the pair clicks, the "structure from one model, detail from another" split is a real trick that one-model workflows can't reach.

CategoryTBG/Sampler

Inputs (20)

NameTypeDefaultDescription
model_highMODELFirst model for high sigma phase. IMPORTANT: Both model_high and model_low must use the same or compatible latent spaces and VAE models. Compatible pairs: Flux + ZImages, Qwen + WAN. Incompatible models will produce corrupted outputs due to latent space mismatch.
model_lowMODELSecond model for low sigma phase. IMPORTANT: Must be latent space compatible with model_high (same VAE, same latent dimensions). Compatible pairs: Flux + ZImages, Qwen + WAN. Using incompatible models will fail or produce artifacts.
noise_seedINT00–18446744073709550000
cfg_highFLOAT1.00–100
cfg_lowFLOAT1.00–100
positive_highCONDITIONING
negative_highCONDITIONING
positive_lowCONDITIONING
negative_lowCONDITIONING
sampler_nameCOMBO44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBO9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
steps_highINT201–2048Total steps used to generate the high model's sigma schedule. This is the full step count for a typical generation, not the actual steps executed. The sigma_split_value determines which portion of this schedule is used. Example: FLUX 20 steps with split=0.5 might execute ~10 high-sigma steps.
steps_lowINT91–2048Total steps used to generate the low model's sigma schedule. This is the full step count for a typical generation, not the actual steps executed. The sigma_split_value determines which portion of this schedule is used. Example: Z-image 10 steps with split=0.5 might execute ~5 low-sigma steps.
denoiseFLOAT1.000–1
model_crossover_sigma_strengthFLOAT0.500–1Controls the sigma strength where sampling switches from the high model to the low model.”
low_sigma_alignmentFLOAT1.000–5Shifts the lower sigma values up or down to better synchronize sampling between models. Default is 1, which works best in most cases.
inpaint_endINT0-50–0Step number from the end after which inpainting is skipped. For example, with 20 total steps, setting -10 means inpainting runs only from step 1 to 10.
smoother_sharperFLOAT0.00-1–1Dual-stage adaptive sharpening. At high sigma (early steps), adds structured noise for detail invention. At low sigma (late steps), applies high-pass edge sharpening. Positive values sharpen and add details. Negative values soften and blur. Zero disables sharpening. Higher absolute values create stronger effects.
detail_enhancerFLOAT0.00-1–1Substep evaluation for detail control. Positive values (0.1-1.0): lookahead to next sigma, adds coherent details and refinement, reduces variation. Negative values (-0.1 to -1.0): lookback to previous sigma, adds creative variation and texture complexity. Zero = disabled (single pass, fastest). Performance cost: 2x slower on affected steps.
latent_imageoptLATENT

Outputs (1)

NameTypeDescription
outputLATENT