CrossMultiStepKSampler
Three Different Models, One Generation
- model1
- positive1
- negative1
- vae1
- model2
- positive2
- negative2
- vae2
- model3
- positive3
- negative3
- vae3
- latent_image
- LATENT
If CrossStepSwitchKSampler is the two-stage cross-model node, CrossMultiStepKSampler is the three-model kitchen sink. The README's example pipeline tells you everything: SDXL for base composition → Flux for style transfer → Qwen Image for final polish. Three architectures, three VAEs, three conditioning pairs, one generation.
It's the answer to a question people have been asking since early 2024 - "is there a node that lets you schedule different models mid-generation?" - for the case where those models aren't even the same family. The author tested it against Flux, Qwen Image and Wan models, and it shows in the code.
How it works
Three chained KSampler calls. Each stage has its own model, VAE, positive/negative conditioning, step count, sampler, scheduler, CFG and denoise. Between stages, if the VAE changes, it decodes the previous latent to pixels and re-encodes it with the next stage's VAE (the latent bridge); same VAE, the latent flows straight through. The bridge snaps dimensions to multiples of 8 and has video-tensor handling for Wan-style models. Seed ticks up per stage - seed, seed + 1, seed + 2.
Because the conditioning is per-stage, each stage gets text from the right encoder for its model - SDXL's CLIP, Flux's CLIP-L + T5, Qwen's own stack. That's the thing that makes three architectures in one run actually work.
The inputs that matter
There are a lot of inputs. Buckets, not a shopping list:
- model1/2/3, vae1/2/3, positive1/2/3, negative1/2/3 - three full stacks. This is the whole point and the whole cost.
- steps_stage1/2/3 - how long each model works. All three stages always run (min 1 step each); you can't skip one from the UI.
- sampler_stage1/2/3, scheduler_stage1/2/3, cfg_stage1/2/3, denoise_stage1/2/3 - per-stage recipes, and yes, the denoise rule applies again: later stages at 1.0 restart instead of refining. Keep stage 2 and 3 below 1.0 for a real progressive pipeline.
- seed and latent_image - the usual.
Output: one LATENT, into a VAE Decode like any sampler.
Installing it
Same one-line install as the rest of the pack, and it's dependency-free - no requirements.txt, no model downloads, just ComfyUI core:
cd ComfyUI/custom_nodes
git clone https://github.com/azazeal04/comfyui-switch-samplers.git
Restart ComfyUI, or search comfyui-switch-samplers in ComfyUI Manager. It lives under Azazeal / Switch Samplers.
The honest takes
- This node is a lot. A huge schema, a huge wiring job, and if you don't have a real three-model recipe you're paying the complexity tax for nothing. Start with CrossStepSwitchKSampler; graduate here when the workflow actually needs a third model.
- VRAM is the real limit. Three architectures, three VAEs, three text encoders, all resident. On consumer cards you'll want fp8 weights and to accept some offloading. This is a slow, hungry pipeline by construction - three sampling runs plus two VAE bridges.
- Two bridges, two lossy round trips. Every VAE encode/decode costs detail, and this node does two of them per generation. The final stage does the visible work, so put the detail-oriented model last - which is presumably why "Qwen for final polish" works as a recipe (its decoder is tuned for crisp text).
- Same seed behavior as the whole pack - each stage increments the seed, so the split points are part of your reproducibility equation.
Reach for this when you genuinely want three models collaborating - SDXL structure, Flux texture, Qwen finish, or a video pipeline ending in Wan. It's not subtle and it's not cheap, but it's the one node that keeps a three-architecture generation in a single box.
Inputs (29)
| Name | Type | Default | Description |
|---|---|---|---|
| model1 | MODEL | — | |
| positive1 | CONDITIONING | — | |
| negative1 | CONDITIONING | — | |
| vae1 | VAE | — | |
| model2 | MODEL | — | |
| positive2 | CONDITIONING | — | |
| negative2 | CONDITIONING | — | |
| vae2 | VAE | — | |
| model3 | MODEL | — | |
| positive3 | CONDITIONING | — | |
| negative3 | CONDITIONING | — | |
| vae3 | VAE | — | |
| seed | INT | 00–18446744073709550000 | — |
| steps_stage1 | INT | 10 | — |
| steps_stage2 | INT | 10 | — |
| steps_stage3 | INT | 10 | — |
| sampler_stage1 | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| sampler_stage2 | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| sampler_stage3 | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler_stage1 | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| scheduler_stage2 | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| scheduler_stage3 | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| cfg_stage1 | FLOAT | 7.50–100 | — |
| cfg_stage2 | FLOAT | 7.50–100 | — |
| cfg_stage3 | FLOAT | 7.50–100 | — |
| denoise_stage1 | FLOAT | 1.000–1 | — |
| denoise_stage2 | FLOAT | 1.000–1 | — |
| denoise_stage3 | FLOAT | 1.000–1 | — |
| latent_image | LATENT | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |