ZImage Turbo Two Pass Refiner
Upscale and refine in one node — the Z-Image second pass, automated
- model
- positive
- negative
- vae
- image
- image
Z-Image's native ceiling is around 2MP, and beyond that quality starts falling apart. So how do people get big, clean images out of it? They generate at a comfortable size, then run the result through a second pass: upscale it, re-encode, and let the model refine at low denoise. That whole second pass is what this node does, end to end, in one box. Give it an image, get a bigger, sharper image back.
How it works, step by step:
- It takes your
image, upscales it byupscale_bywith a Lanczos resize. - Encodes the upscaled pixels to latent with your
vae. - Runs a partial-denoise sampling pass - CFG 1, using the pack's
euler_flow/capitanZiTpair - at a denoise chosen bystrength:subtle0.25,normal0.32,strong0.40. - Decodes back to an IMAGE and hands it to you.
The low denoise is the whole trick. A full-denoise pass would redraw the image and fight your composition; a 0.25–0.40 pass only replaces a fraction of the noise, which is exactly enough for the model to add real detail to the upscaled texture without wrecking what's there. It's the same "Z-Image as universal second-pass enhancer" pattern the community uses to push up images from Flux, Qwen, even Wan - here it's packaged with the tuned sampling profile built in.
Inputs that matter:
- model / positive / negative / vae - your Z-Image Turbo UNet, the conditioning from the pack's conditioning node, and the Z-Image VAE. The negative is the usual zeroed formality at CFG 1.
- image - feed it the VAEDecode output of your base pass.
- seed - pair it with ZImageTurboSeedControl's
refine_seedso the refine pass doesn't reuse the base seed. - upscale_by - 1.0 to 4.0, default 1.5. 1.5 is the "nice bump in detail" sweet spot; 2.0+ gets aggressive and can start inventing texture.
- strength -
subtle/normal/strong. Start atnormal; drop tosubtleif the refiner is changing your image's character, gostrongif it's not doing enough.
Output: one image (IMAGE), ready for SaveImage or another pass. Note it decodes through the VAE, so this node hands you pixels, not a latent - if you want to keep refining, feed the output back into this node's image input and let it upscale again.
Install is pack-level: ComfyUI Manager → "ZImageTurboHQNodes", or
cd ComfyUI/custom_nodes
git clone https://github.com/marduk191/ComfyUI-ZImageTurboHQNodes
restart. No pip deps. Models come from Tongyi-MAI's Z-Image-Turbo HF repo, not the pack.
The thing that bites people: refining is not a free lunch. At strong with a high upscale_by you can over-crisp, and the low denoise means your conditioning still shapes the pass - a vague prompt gives you a vague sharpen. Also remember this runs a full sampler pass, so on a 3060 you're not saving time, you're buying detail. That's the deal.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| image | IMAGE | — | |
| seed | INT | 133714380–18446744073709550000 | — |
| upscale_by | FLOAT | 1.501–4 | — |
| strength | COMBO | normal | 3 options: subtle, normal, strong |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |