⟳ Triple-Pass Sampler
A three-stage sampler in one node
- model
- positive
- negative
- latent_image
- composition_latent
- structure_latent
- final_latent
The open secret about the Illustrious gallery images that look far better than your own generations: they're almost never a single sampling pass. Ask around and the recipe people actually use is generate, then upscale, then inpaint at a higher effective resolution to fix detail the base pass couldn't resolve. IllustriousTriplePassSampler tries to bake a version of that workflow into one node - composition, then structure, then detail, each as its own sampling stage with its own settings - instead of you hand-building three KSamplers and the latent scaling between them.
The three stages
Standard KSampler inputs up front - model, seed, positive, negative, latent_image - plus roughly thirty optional parameters split across three named stages. comp (composition) runs first: loose layout, low step count (comp_steps, default 8), higher CFG (comp_cfg, default 7), and a high denoise (comp_denoise, default 0.9) so it's basically starting from scratch, using comp_sampler (default dpm_2) and comp_scheduler (default karras). struct (structure) refines coarse forms with more steps (struct_steps, 12), a lower CFG (struct_cfg, 5.5), and a mid denoise (struct_denoise, 0.7). detail does the fine work - most steps (detail_steps, 16), lowest CFG (detail_cfg, 4.5), and a small denoise (detail_denoise, 0.35) so it's touching up rather than repainting. CFG and denoise stepping down stage over stage mirrors Illustrious's own settings guidance - moderate CFG, more steps only where the content actually needs it.
A handful of toggles manage the handoff between stages: progressive_cfg_decay gently lowers CFG across the three passes automatically; adaptive_steps/adaptive_refinement adjust step counts and detail-stage behavior based on what the previous stage produced; preserve_composition keeps the first stage's layout locked in if a later stage's denoise is pushed high enough that it might otherwise redraw the scene. separate_noises plus three *_seed_offset fields let each stage roll its own seed off the base one instead of reusing it, and reuse_comp_noise_for_struct/reuse_struct_noise_for_detail are the override if you'd rather stages share noise. nan_guard and stability_clamp are pure defensive plumbing - scrub NaN/Inf and clamp latent magnitude if a stage goes numerically unstable. model_version and Version Preset Override (force EPS or VPred-tuned presets) tune the whole pipeline for the specific Illustrious release you're running, which matters more than it sounds - eps and vpred checkpoints in this family want genuinely different CFG and scheduler behavior, not just different defaults.
Outputs
All three stage latents - composition_latent, structure_latent, final_latent - not just the last one. VAE-decode any of them to see what each pass actually contributed, or just take final_latent and treat the node like a drop-in KSampler replacement.
Installing it
ComfyUI Manager: search "EasyIllustrious," install, restart. Manual: cd ComfyUI/custom_nodes && git clone https://github.com/regiellis/ComfyUI-EasyIllustrious, then pip install -r ComfyUI-EasyIllustrious/requirements.txt inside your ComfyUI environment, then restart.
A dose of honesty before you commit to this
Not everyone who's tried it is convinced it beats the simpler approach. On the pack's own Reddit launch thread, one experienced user compared this node's multi-pass output directly against a plain dual-KSampler setup on the same prompt and reported the same image quality either way - same anatomy quirks, no clear win from the extra stages. That's not a reason to skip the node, but it is a reason to A/B it against your own vanilla setup before assuming more stages automatically means a better image; with thirty-plus parameters to tune, it's easy to convince yourself a change helped when a side-by-side comparison would say otherwise. Start from the defaults, change one stage at a time, and keep a plain KSampler workflow around to compare against.
Inputs (34)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | UNet diffusion model to sample with (SDXL / Illustrious). | |
| seed | INT | 00–18446744073709550000 | Base random seed; use different seeds for different outputs. |
| positive | CONDITIONING | Positive prompt conditioning (what you want to see). | |
| negative | CONDITIONING | Negative prompt conditioning (what to avoid). | |
| latent_image | LATENT | Starting latent tensor (shape [B,4,H/8,W/8]). | |
| comp_stepsopt | INT | 85–50 | Steps for composition (global layout). |
| comp_cfgopt | FLOAT | 7.03–10 | CFG for composition stage. |
| comp_denoiseopt | FLOAT | 0.900.5–1 | Denoise strength for composition. |
| comp_sampleropt | COMBO | dpm_2 | Sampler for composition pass. |
| comp_scheduleropt | COMBO | karras | Scheduler for composition pass. |
| struct_stepsopt | INT | 125–50 | Steps for structure (coarse forms). |
| struct_cfgopt | FLOAT | 5.53–8 | CFG for structure stage. |
| struct_denoiseopt | FLOAT | 0.700.4–1 | Denoise strength for structure pass. |
| struct_sampleropt | COMBO | euler | Sampler for structure pass. |
| struct_scheduleropt | COMBO | normal | Scheduler for structure pass. |
| detail_stepsopt | INT | 165–50 | Steps for detail (fine features). |
| detail_cfgopt | FLOAT | 4.52.5–7 | CFG for detail stage. |
| detail_denoiseopt | FLOAT | 0.350.05–0.8 | Denoise strength for detail pass. |
| detail_sampleropt | COMBO | euler | Sampler for detail pass. |
| detail_scheduleropt | COMBO | normal | Scheduler for detail pass. |
| progressive_cfg_decayopt | BOOLEAN | true | Gently lower CFG across stages to stabilize. |
| adaptive_stepsopt | BOOLEAN | true | Adapt steps based on latent complexity. |
| adaptive_refinementopt | BOOLEAN | true | Refine detail settings based on structure output. |
| preserve_compositionopt | BOOLEAN | true | Keep base composition stable if denoise is high. |
| separate_noisesopt | BOOLEAN | true | Use different seeds per stage. |
| reuse_comp_noise_for_structopt | BOOLEAN | false | Force structure to reuse composition seed. |
| reuse_struct_noise_for_detailopt | BOOLEAN | false | Force detail to reuse structure seed. |
| comp_seed_offsetopt | INT | 00–10000 | Seed offset for composition pass. |
| struct_seed_offsetopt | INT | 10–10000 | Seed offset for structure pass. |
| detail_seed_offsetopt | INT | 20–10000 | Seed offset for detail pass. |
| nan_guardopt | BOOLEAN | true | Scrub NaN/Inf and clamp extreme values defensively. |
| stability_clampopt | FLOAT | 20.05–50 | Clamp magnitude of latents to this bound if unstable. |
| model_versionopt | COMBO | auto | Explicit version to nudge behavior; leave auto for neutrality. |
| Version Preset Overrideopt | COMBO | disabled | Force EPS or VPred-optimized presets regardless of detection. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| composition_latent | LATENT | — |
| structure_latent | LATENT | — |
| final_latent | LATENT | — |