Z-Image KSampler ⚡
Defaults already right, plus the one switch stock KSampler doesn't have
- model
- positive
- negative
- latent_image
- LATENT
Z-Image Turbo is a guidance-distilled flow model, which is a polite way of saying "everything your SDXL muscle memory tells you is wrong." Twenty steps? Burned. CFG 7? Burned and twice as slow. Karras scheduler? It actively fights the model. If you've ever copy-pasted a Z-Image workflow from a blog and kept the sampler settings at whatever they were - this node exists for exactly you.
Z-Image KSampler ⚡ is a drop-in replacement for the stock KSampler, shipped inside the CCTech fork of city96's ComfyUI-GGUF pack (under 🤖 CCTech/Z-Image). It's the same sampler with Z-Image Turbo's settled settings baked in as defaults: 9 steps, CFG 1.0, euler, simple. The community's 62-sampler × 16-scheduler sweep settled on euler / euler_a / dpmpp_sde with beta, simple, or linear_quadratic at 8–9 steps and CFG 1 - and this node just has those defaults, so a fresh node doesn't let you stumble.
The one knob KSampler doesn't have
denoise_mode is the entire reason this node exists, and it defaults to "comfy" for a good reason: in that mode the node literally calls ComfyUI's own common_ksampler - it is not a reimplementation, so it stays identical to stock KSampler forever.
Flip it to "diffusers" and the behavior changes. ComfyUI and the diffusers pipeline slice the img2img denoising schedule differently. ComfyUI re-expands to int(steps/denoise) steps and takes the tail; diffusers computes the full steps-long schedule and starts at steps - round(steps*denoise). Measured on Z-Image at 9 steps, denoise 0.9: comfy starts at sigma 0.9643, diffusers at 0.9567. Small - but it's exactly why an img2img you run in ComfyUI can come out subtly different from the same run in a diffusers-based tool. Set "diffusers" for parity with a reference pipeline. It's a compatibility switch, not a quality fix; don't expect magic.
The inputs that actually matter
Same shape as KSampler - model, positive, negative, latent_image in, one LATENT out, wired straight into VAE Decode. The few you'll touch:
cfg(default 1.0) - the tooltip says it plainly: 1.0 disables CFG, correct for Turbo. Z-Image Base wants 3–5. Above ~3 on Turbo, images burn and render time roughly doubles, because CFG >1 forces an extra unconditional pass per step.steps(default 9) - Turbo lives at 8–9. If you're on Z-Image Base, bump this to 25–50 andcfgto 3–5; the defaults are deliberately Turbo's.sampler_name/scheduler- the two things to avoid arekarrasandexponential, which redistribute denoising effort the straight flow-matching trajectory hates.denoise- your img2img strength.denoise_mode- comfy (default) or diffusers, as above.
Where it fits
This pack also ships ZImageLoader (MODEL/CLIP/VAE, GGUF stays quantized) and ZImageImg2Img (prompt + init latent + optional ControlNet prep), whose outputs are built to feed "straight into a stock KSampler" - this node is the version of that sampler that carries the right defaults. Minimal graph: ZImageLoader → CLIPTextEncode (or ZImageImg2Img) → Z-Image KSampler → VAE Decode.
Install
Same as the rest of the pack - ComfyUI Manager (search "ComfyUI-GGUF-Loader"), or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/ChrisColeTech/ComfyUI-GGUF-Loader
pip install --upgrade gguf
Restart ComfyUI. The only inference dependency is gguf. Make sure ComfyUI is recent enough for custom ops when loading UNET-only - that's the README's own [!IMPORTANT]. Put Z-Image .gguf files in models/unet (or diffusion_models); the text-only Qwen3-4B encoder GGUF goes in models/text_encoders. If you use the Windows portable build, run the python_embeded pip command from the README inside ComfyUI_windows_portable instead.
Gotchas
- Wrong text encoder quietly degrades output.
ZImageLoaderwarns (andZImageImg2Imgrefuses) if you load a Qwen3-VL encoder instead of the text-only Qwen3-4B Z-Image expects. If your images look subtly "off" and you can't say why, check the clip you loaded. - Negative prompt does nothing at CFG 1. That's normal on Turbo, not a bug - guidance is baked in during distillation.
- Sage Attention breaks Z-Image Base (patchy, matrix-code lines, sometimes black). Turbo is fine; Base isn't. Disable it if you're on Base.
- macOS Sequoia: torch 2.4.1 seems required, or you hit the "M1 buffer is not large enough" error - see upstream issue #107.
The pack itself is the "CCTech" fork of city96's ComfyUI-GGUF, maintained by ChrisColeTech, which backports open upstream PRs - that's why it carries Z-Image, LTX-2.3, Krea2 and the rest of the modern arch support the stock GGUF pack doesn't. Worth knowing when you're deciding which fork is in your custom_nodes.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| latent_image | LATENT | — | |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 91–10000 | — |
| cfg | FLOAT | 1.00–100 | 1.0 disables CFG - correct for Turbo. Z-Image Base wants 3-5. |
| sampler_name | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler | COMBO | simple | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| denoise | FLOAT | 1.000–1 | — |
| denoise_mode | COMBO | comfy | 2 options: comfy, diffusers |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |