CLIPTextEncodeSDXLRefiner (RE)
Conditioning for the SDXL refiner stage
- clip
- CONDITIONING
This one's for SDXL's refiner stage specifically - the optional second pass that most of the community quietly stopped using once fine-tuned checkpoints got good enough on their own. If you're chasing that stock two-stage base-then-refiner pipeline, or reproducing an older workflow that leans on it, this is the conditioning node that feeds it. It's this pack's copy of ComfyUI's native CLIPTextEncodeSDXLRefiner node, same four fields.
Worth saying up front: SDXL shipped with a refiner model meant to add a final pass of fine detail - skin texture, that kind of thing - on top of the base model's output. The community tried it, decided the quality bump wasn't worth the extra step once decent fine-tuned checkpoints existed, and mostly moved on; it survives today more in the odd hi-res-fix workflow than as a standard part of anyone's pipeline. So if you landed on this node because a downloaded workflow includes it, know you're looking at a part of SDXL most people have quietly opted out of, not a step you're missing by skipping it.
The refiner only uses one text encoder - CLIP-G, not the CLIP-L/CLIP-G pair the base model's SDXL node uses - which is why this node has a single text field instead of a text_g/text_l split. The other distinctive field is ascore, aesthetic score: a conditioning value pulled from how the refiner's training data was labeled for aesthetic quality. Nudging it up pushes the conditioning toward "more aesthetic," in the same spirit as the size fields nudging toward a particular resolution. In practice most people leave it near the default and don't fuss over it - it's a soft nudge, not a strong lever.
The inputs and outputs that matter
- text - your prompt. One field, goes to CLIP-G only.
- clip - this needs to be the refiner checkpoint's own CLIP output, not the base model's. They're trained differently; wiring the base model's CLIP in here technically connects, since it's the same ComfyUI type, but it won't give you what the refiner actually expects.
- ascore - the aesthetic-score nudge, defaults to 6. Leave it unless you're deliberately experimenting; a pattern you'll see in workflows that do tune it is setting it slightly higher on the positive prompt than the negative.
- width / height - the same size-conditioning idea as the base SDXL node: tells the refiner roughly what resolution to expect, not necessarily your literal output size. Defaults ship at 4096, well above SDXL's usual 1024 - set to match your actual run.
- CONDITIONING - wire into the refiner-stage KSampler's positive or negative input.
How to install it
Same repo, same one-time install as the rest of the pack. ComfyUI Manager: search ComfyUI_RErouter_CustomNodes. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/an90ray/ComfyUI_RErouter_CustomNodes.git
Restart ComfyUI. No models bundled with the pack itself - you still need to separately download the actual SDXL refiner checkpoint (stable-diffusion-xl-refiner-1.0) if you don't already have it, same as you would for the native refiner workflow.
Common issues & troubleshooting
Results don't look meaningfully different with the refiner in the loop. That tracks with the wider community experience - plenty of people run the refiner stage and can't tell the difference from skipping it, especially against a strong fine-tuned base checkpoint. It's not a sign this node is broken; it's the well-known reason the refiner fell out of favor in the first place.
Wrong CLIP wired in. The most common actual mistake: reusing the base model's CLIP output here instead of loading the refiner checkpoint separately and pulling its CLIP. You won't get an error, just conditioning that doesn't match what the refiner was trained on, which shows up as weak or inconsistent results rather than a crash.
Not sure what ascore should be set to. There's no hard rule - it's a soft aesthetic nudge, not a resolution or a seed. If you're unsure, the default is a reasonable place to leave it rather than hunting for a "correct" number that doesn't really exist.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| ascore | FLOAT | 6.000–1000 | — |
| width | INT | 40960–16384 | — |
| height | INT | 40960–16384 | — |
| text | STRING | — | |
| clip | CLIP | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | — |