pipeKSamplerSDXL
Base and refiner in one node, the SDXL way
- sdxl_pipe
- optional_model
- optional_positive
- optional_negative
- optional_latent
- optional_vae
- optional_refiner_model
- optional_refiner_positive
- optional_refiner_negative
- optional_clip
- input_image_override
- adv_xyPlot
- sdxl_pipe
- pipe
- model
- positive
- negative
- refiner_model
- refiner_positive
- refiner_negative
- latent
- vae
- clip
- images
- seed
- plot_image
pipeKSamplerSDXL is the SDXL specialist of the tinyterra pipe family: one node that runs the base model and the refiner in sequence, with separate step/CFG/denoise controls for each, then hands you the result and an updated sdxl_pipe. It's for the classic two-stage SDXL setup where the base does the composition and the refiner polishes - without building two sampler chains and manually wiring the latent between them.
SDXL workflows have this awkward shape: a base model that generates the image and a refiner model that takes the base's latent and denoises it further for detail. Normally that's base sampler β latent β refiner sampler, twice the nodes, twice the wiring, and a seed that needs to stay in sync. This node collapses it. The README's tagline is "SDXL Sampler (base and refiner in one)," and that's exactly the deal.
How it works
You feed it an sdxl_pipe from pipeLoaderSDXL (which loads the base and refiner checkpoints plus their prompt encodings). The sampler runs the base model for base_steps, then hands the latent to the refiner for refiner_steps, with separate cfg / denoise for each stage. Set refiner_steps to 0 to skip the refiner entirely if you don't have one loaded.
The same built-ins as the regular pipeKSampler appear here: a quick lora_name / lora_strength apply, the [latent] / [hiresFix] upscale block with factor/rescale options, and inline image_output / save_prefix / file_type / embed_workflow for previewing or saving. Optional overrides cover every piece of the pipeline, including optional_refiner_model, optional_refiner_positive, optional_refiner_negative - so you can run a single checkpoint as base and skip the refiner without a separate branch.
Inputs you'll actually set
sdxl_pipe- from pipeLoaderSDXL_v2 (or the legacy SDXL loader).base_steps/refiner_steps- the two stage counts.cfg/denoisefor the base;refiner_cfg/refiner_denoisefor the refiner. Refiner denoise is usually lower than the base's.sampler_name/scheduler- shared across both stages.
Outputs: the sdxl_pipe (updated), a standard pipe for downstream non-SDXL nodes, model, positive, negative, refiner_model, refiner_positive, refiner_negative, latent, vae, clip, images, seed, plot_image.
Installing it
Part of tinyterraNodes:
cd ComfyUI/custom_nodes
git clone https://github.com/TinyTerra/ComfyUI_tinyterraNodes.git
or ComfyUI Manager β tinyterraNodes. No extra dependencies.
Gotchas
The pipe type is the trap: this node speaks PIPE_LINE_SDXL, a different type from the regular pipe, so wiring a standard pipeLoader output in here does nothing until you convert. Community reports (people trying to jam a Comfyroll lora stack between an SDXL loader and this sampler) also hit the fact that the v2 SDXL loader takes LoRAs through its text box rather than a stack slot - use optional_lora_stack where available, or the in-node lora_name. And the refiner only runs when both refiner_steps is above 0 and a refiner model is actually loaded - leave the default 20 with no refiner installed and the node quietly skips to a base-only run, which is convenient but easy to mistake for a refiner actually running. Set refiner_steps to 0 to make it explicit.
Inputs (36)
| Name | Type | Default | Description |
|---|---|---|---|
| sdxl_pipe | PIPE_LINE_SDXL | β | |
| lora_name | COMBO | 1 options: None | |
| lora_strength | FLOAT | 1.00-10β10 | β |
| upscale_method | COMBO | None | 13 options: None, [latent] nearest-exact, [latent] bilinear, [latent] area, [latent] bicubic, [latent] lanczos, +7 |
| upscale_model_name | COMBO | 1 options: None | |
| factor | FLOAT | 2.000β10 | β |
| rescale | COMBO | 4 options: by percentage, to Width/Height, to longer side - maintain aspect, None | |
| percent | INT | 500β1000 | β |
| width | INT | 102464β16384 | β |
| height | INT | 102464β16384 | β |
| longer_side | INT | 102464β16384 | β |
| crop | COMBO | 2 options: disabled, center | |
| base_steps | INT | 201β10000 | β |
| cfg | FLOAT | 8.000β100 | β |
| denoise | FLOAT | 1.000β1 | β |
| refiner_steps | INT | 200β10000 | β |
| refiner_cfg | FLOAT | 8.000β100 | β |
| refiner_denoise | FLOAT | 1.000β1 | β |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 13 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +7 | |
| image_output | COMBO | 5 options: Hide, Preview, Save, Hide/Save, Disabled | |
| save_prefix | STRING | ComfyUI | β |
| file_type | COMBO | png | 7 options: png, jpg, jpeg, tiff, tif, webp, +1 |
| embed_workflow | BOOLEAN | true | β |
| seedopt | INT | 00β18446744073709550000 | β |
| optional_modelopt | MODEL | β | |
| optional_positiveopt | CONDITIONING | β | |
| optional_negativeopt | CONDITIONING | β | |
| optional_latentopt | LATENT | β | |
| optional_vaeopt | VAE | β | |
| optional_refiner_modelopt | MODEL | β | |
| optional_refiner_positiveopt | CONDITIONING | β | |
| optional_refiner_negativeopt | CONDITIONING | β | |
| optional_clipopt | CLIP | β | |
| input_image_overrideopt | IMAGE | β | |
| adv_xyPlotopt | ADV_XYPLOT | β |
Outputs (14)
| Name | Type | Description |
|---|---|---|
| sdxl_pipe | PIPE_LINE_SDXL | β |
| pipe | PIPE_LINE | β |
| model | MODEL | β |
| positive | CONDITIONING | β |
| negative | CONDITIONING | β |
| refiner_model | MODEL | β |
| refiner_positive | CONDITIONING | β |
| refiner_negative | CONDITIONING | β |
| latent | LATENT | β |
| vae | VAE | β |
| clip | CLIP | β |
| images | IMAGE | β |
| seed | INT | β |
| plot_image | IMAGE | β |