Turbo Seed Variance
The Cure for 'Every Seed Looks the Same'
- conditioning
- conditioning
If you've generated with Z-Image Turbo, Krea 2 Turbo, or Flux 2 Klein and thought "I changed the seed and it's... the same picture," congratulations - you hit the distilled-model wall. It's not you, it's the architecture. Distilled low-step models trade away seed diversity for speed, and the community spent the back half of 2025 inventing workarounds. This node is one of the best: it jitters the text conditioning - not the sampler, not the latent - with seed-dependent noise, so different seeds produce visibly different images even at 8 steps or 4 steps.
The lineage is worth knowing: the source says it's based on SeedVarianceEnhancer v2.2 and the Krea 2 adaptation, both MIT-0. SeedVarianceEnhancer was the fix people actually reached for during the Z-Image Turbo seed-diversity complaints in late 2025 - the ones where Z-Image Turbo got panned for producing "near-identical outputs across different seeds" while the Base model got celebrated for restoring the variety last seen with SDXL. This node is that trick, adapted per-model.
How it works
The mechanism is subtle but learnable. Text conditioning in modern models is an embedding tensor. The node:
- Picks the conditioning entry it will noise (first or second, depending on
noise_insert), and measures the embedding's standard deviation over its real token region. - Computes a strength - by default, the measured std ×
auto_strength_factor× a per-mode scale (0.1 for z-image-turbo, 0.01 for flux2-klein, which also uses layer-coherent noise across the Qwen text encoder's 3 layers). Setauto_strength_factorto 0 and it falls back to the absolutestrengthvalue instead. - Rolls seeded noise - uniform noise in [−strength, +strength], generated from your
seed, and a separate Bernoulli mask fromseed + 1that decides which ~randomize_percent% of embedding values get touched. Same seed = same jitter, which is what makes the result reproducible. - Protects your prompt -
mask_percentof tokens (from themask_starts_atend) are shielded, so the noise can't destroy the subject-matter tokens your prompt is built on. - Outputs two conditioning entries - a noised one marked active from 0% to
steps_switchover_percentof the sampling schedule, and the clean one from there to 100%. ComfyUI's sampler honors thosestart_percent/end_percentranges, so the noised prompt drives the early steps and the real prompt finishes the job.
The result: seed-dependent conditioning perturbation that survives the tiny step counts distilled models demand. It also preserves the global torch RNG state while generating, so it doesn't corrupt your sampler's randomness.
Inputs that matter
- mode - z-image-turbo, krea2-turbo, or flux2-klein. Pick the model you're running; each has its own profile.
- randomize_percent - % of embedding values noised (default 50).
- steps_switchover_percent - when the noised conditioning hands off to clean. The tooltips suggest ~20 for Z-Image Turbo, ~25 for Krea 2 Turbo 8-step. Default 25.
- seed - the variance seed, with
control_after_generate, so it shuffles each run like a normal seed. - noise_insert - beginning/ending/all steps, or disabled to pass conditioning through untouched.
- mask_percent / mask_starts_at - how much of the prompt to shield from noise, and from which end.
- auto_strength_factor / strength - leave auto on (default 1) for sensible per-mode behavior; go manual only when you know why.
- log_to_console - prints embedding stats and effective noise info to the console. Turn it on once to see what's actually happening.
Output: conditioning, wired straight into your sampler like any other conditioning.
Install
Part of geocine-comfyui - one install, all eleven nodes, no model downloads:
- ComfyUI Manager → search geocine-comfyui → install → restart
- or Comfy CLI:
comfy node install geocine-comfyui - or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/geocine/geocine-comfyui
then restart ComfyUI.
What to know before you trust it
This isn't a free lunch. It trades prompt adherence for variety - that's the entire mechanism - which is why the prompt-mask exists. If your subject tokens are getting mangled, raise mask_percent. If images still look identical, your auto_strength_factor may be too low or your model mode is wrong (running the krea2 profile on Z-Image gets you nonsense scales). And remember the distilled-model rules this builds on: CFG near 1, exact step counts, the right scheduler. No amount of conditioning jitter fixes a turbo model fed CFG 7 at 20 steps - that's a different failure entirely.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| conditioning | CONDITIONING | — | |
| mode | COMBO | z-image-turbo | Use z-image-turbo for Z-Image Turbo, krea2-turbo for Krea 2 Turbo, or flux2-klein for Flux2 Klein distilled workflows. |
| randomize_percent | FLOAT | 501–100 | Percentage of embedding values that receive noise. |
| auto_strength_factor | FLOAT | 1.000–100 | If greater than 0, noise scale is measured embedding std times this factor and the selected mode profile. Set to 0 to use strength. |
| strength | FLOAT | 20.00000–4294967295 | Absolute fallback noise scale used when auto_strength_factor is 0. |
| noise_insert | COMBO | noise on beginning steps | Where the noised conditioning is active during generation. |
| steps_switchover_percent | FLOAT | 251–99 | Percent of sampling steps before switching between noised and clean conditioning. Try 20 for z-image-turbo, 25 for krea2-turbo 8-step workflows. |
| seed | INT | 00–18446744073709550000 | Seed used to choose noised embedding values and noise amounts. |
| mask_starts_at | COMBO | Which end of the prompt is protected from noise. | |
| mask_percent | FLOAT | 00–99 | Percentage of prompt tokens protected from noise. |
| log_to_console | BOOLEAN | false | Print embedding statistics and effective noise information to the ComfyUI console. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| conditioning | CONDITIONING | — |