Conditioning Noise Injection
Your Z-Image Turbo keeps drawing the same image no matter the seed — this fixes that
- conditioning
- CONDITIONING
Z-Image Turbo is a fantastic little model until you try to explore with it. Change the seed, keep the prompt, and you get back basically the same picture. The community hammered this from day one - "basically all the generations are the same" was the standard complaint, and it's a real property of the distilled, CFG-1 model, not your setup. Conditioning Noise Injection is one of the workarounds people built for exactly that. It's a single node from BigStationW that perturbs your prompt's conditioning at the start of denoising, giving each seed a genuinely different starting point, then restores the clean conditioning so prompt adherence survives.
How it works
Instead of adding noise to the latent (the usual trick, which tends to smear structure), this node adds it to the conditioning embeddings themselves. It takes your conditioning and splits it into two time ranges using ComfyUI's start_percent/end_percent mechanism:
- a noisy segment from
0.0tothreshold, where the conditioning tensor getstorch.randn(shape) * strengthadded on top - a clean segment from
thresholdto1.0, which is your untouched prompt conditioning
The sampler applies the noisy prompt for the first chunk of denoising - that's what lets different seeds diverge into different compositions - then switches to the clean one for the rest, which is what keeps the result reading like your prompt instead of static.
The clever bit is reproducibility. The noise is generated from a CPU torch generator seeded from your sampler's seed, which a bundled JS extension picks out of the graph (it scans for your KSampler/RandomNoise seed and your latent's batch size and injects them when you queue). Same seed, same noise, same image. Different seed, different noise, different image. That's the whole point.
The inputs that matter
There are only three, and two of them do all the work:
- conditioning - your prompt conditioning, straight from the CLIP/Flux/Qwen text encoder.
- threshold (0–1, default 0.2) - the fraction of denoising that runs with noisy conditioning. 0.2 on an 8-step Turbo run means roughly the first 1–2 steps are noisy.
0disables noise entirely;1keeps noise for the whole run. - strength (0–100, default 10) - how loud the noise is. This is the diversity dial.
The single CONDITIONING output goes right back into your KSampler (or SamplerCustomAdvanced, which the bundled Z-Image Turbo workflow uses). No other wiring needed.
Install
Dead simple, and it's the whole pack - no model downloads, no torch version requirements, no hidden dependencies. Through ComfyUI Manager, search "ConditioningNoiseInjection", or:
cd ComfyUI/custom_nodes
git clone https://github.com/BigStationW/ComfyUi-ConditioningNoiseInjection
Restart ComfyUI, and you're done. There's an example workflow_Z-image_turbo.json in the repo if you want a working starting point.
Where people get burned
The big one: this thing trades diversity for adherence, and you can push it too far. Community testing of the same conditioning-perturbation trick (Forge's SeedVarianceEnhancer, which this node is essentially the Comfy port of) found that heavy conditioning noise "kinda messes with my prompts and loras." If strength is cranked high or threshold runs late, expect prompt drift and characters whose identity wanders. Start at the defaults, then only nudge strength up if a seed change still isn't moving the needle.
Also remember that changing the seed is what triggers a different noise draw. Keep the seed fixed and you've effectively disabled the node. And note that threshold is a fraction of total denoising, not a step count - account for how many steps your sampler is running.
One honest caveat: this is a band-aid on a distilled model's weakness. When Z-Image Base landed, it restored real seed variance natively - no workaround needed. But Base is slower and needs CFG 3–5, so if you're staying on Turbo for speed, this node is the cheapest way to make it feel creative again.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| conditioning | CONDITIONING | — | |
| threshold | FLOAT | 0.200–1 | — |
| strength | FLOAT | 100–100 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | — |