Seed Variance Enhancer - Krea 2 Turbo
Your Krea 2 Turbo keeps drawing the same picture. This node fixes that.
- conditioning
- conditioning
- diagnostics
"Every seed looks the same" is not your imagination
Roll the seed on Krea 2 Turbo three times and you get three nearly identical frames. That's not bad luck and it's not you - it's what 8-step distillation does. Turbo is guidance-distilled (CFG runs at 0.0, so the positive conditioning alone drives the whole image), and distilled models famously lose the seed-dependent variety you used to get free from SDXL. Z-Image Turbo had exactly the same reputation; Krea 2 Turbo inherits it. The community noticed fast enough that other packs shipped their own "variety" dials. This node is the Krea-specific one, and it's the one I'd grab.
Seed Variance Enhancer - Krea 2 Turbo (class KreaSeedVarianceEnhancer, under advanced/conditioning) sits between your CLIPTextEncode and the KSampler, adds seed-dependent noise to the positive embedding, and hands you back genuinely different compositions across seeds without wrecking prompt adherence. It's a retune of ChangeTheConstants' SeedVarianceEnhancer v2.2 (MIT-0) for Krea 2's Qwen3-VL 4B encoder. Pure Python, zero pip dependencies, no model downloads.
How it works
The node measures the standard deviation of your real (non-padding) embedding tokens, then generates noise keyed to its own seed widget - not the KSampler seed. auto_strength_factor scales that noise to the measured std (effective_strength = std × factor), so a strength of 1.0 means "one standard deviation of perturbation" and transfers cleanly across text encoders. That auto-calibration is the big change from the Z-Image build: Krea and Z-Image embeddings have different scales, and a hand-tuned absolute value doesn't travel.
The noisy embedding is spliced in using ComfyUI's built-in start_percent/end_percent conditioning ranges. With noise on beginning steps (the default behavior you want), the noisy conditioning drives the first ~25% of steps - where structure and composition get decided - then swaps back to the clean prompt for the rest, so detail and text stay faithful. RNG state is saved and restored around noise generation, so it never disturbs the sampler's own noise.
The inputs that actually matter
The defaults are sane for Krea 2 Turbo at 8 steps. Start here, then tune:
seed- the trap. If it's leftfixed, you get the same noise every run, which defeats the whole point. Set it torandomizeorincrementvia thecontrol_after_generatedropdown. This is the #1 cause of "it's not working."auto_strength_factor- 1.0 balanced, 0.5 subtle, 3–5 strong.0falls back to the manualstrengthwidget.randomize_percent- 50 default. Percentage of embedding values (or tokens, see below) that receive noise; higher = more diversity, less adherence.noise_insert-noise on beginning stepsis the recommended default;noise on all stepsis strongest but worst for adherence and text.mask_percent(+mask_starts_at) - protect the first (or last) portion of the prompt, handy for keeping rendered text or a subject locked.- Newer options:
noise_distribution(uniformdefault /gaussian- gentler, fewer broken outputs, power-matched so same strength = same perturbation) andgranularity(values/tokens- tokens perturbs whole words, producing more "semantic" shifts).
Two outputs: conditioning goes into the KSampler's positive input, and diagnostics is a STRING you can wire into a Show Text node to see embedding_std, effective_strength, and L2_perturbation without reading the console.
Wiring
[Prompt] -> [CLIPTextEncode (krea2)] -> [Seed Variance Enhancer - Krea 2 Turbo] -> KSampler (positive)
Leave the negative path untouched - with CFG off, it isn't doing anything anyway.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/harukimix/KreaSeedVarianceEnhancer.git
Restart ComfyUI, and it shows up as "Seed Variance Enhancer - Krea 2 Turbo". ComfyUI Manager can grab it too. No extra pip packages, no weights to download - it only touches the conditioning tensor, so it's cheap.
When outputs barely change
Work the README's checklist in order: check seed is randomizing; confirm the noised conditioning actually feeds the sampler (a quick test - set auto_strength_factor to 5–10; if the image breaks apart, wiring is correct, just dial back); then read the numbers on the diagnostics output. L2_perturbation under ~1% means raise strength; 30%+ with no visible change means wiring, not strength. Counter-intuitively, longer prompts give more to perturb and thus more diversity, so encode the Prompt Enhancer's output and place the node after it. And if structure stays locked at 8 steps, nudge steps_switchover_percent from 25 toward 38 so noise covers the first three steps instead of two.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| conditioning | CONDITIONING | — | |
| randomize_percent | FLOAT | 501–100 | Percentage of embedding values (or tokens, see granularity) that receive noise. Higher = more diversity, less prompt adherence. |
| auto_strength_factor | FLOAT | 1.000–100 | If > 0, noise scale = measured embedding std * factor (recommended for Krea 2 Turbo). Try 0.5 subtle / 1.0 balanced / 3+ strong. Set to 0 to use the manual 'strength' field instead. |
| strength | FLOAT | 20.0000-4294967295–4294967295 | Absolute noise scale. Only used when auto_strength_factor is 0. |
| noise_insert | COMBO | Where the noisy embedding is used. 'beginning steps' perturbs the structure-deciding early steps, then restores the clean prompt. 'all steps' is strongest but worst for adherence/text. | |
| steps_switchover_percent | FLOAT | 251–99 | Where noisy/clean conditioning switch. Formula: (100/TOTAL_STEPS)*SWITCH_STEP. For 8-step Krea 2 Turbo: 25 ~ first 2 steps, 38 ~ first 3 steps. |
| seed | INT | 00–18446744073709550000 | IMPORTANT: set this to 'randomize' or 'increment' to get DIFFERENT variations each run. If left 'fixed', every generation gets the SAME embedding noise and outputs stay similar. |
| mask_starts_at | COMBO | Which end of the prompt is protected from noise. | |
| mask_percent | FLOAT | 00–99 | Percentage of the prompt protected from noise. 'beginning'+'50' protects the first half. |
| log_to_console | BOOLEAN | false | Also print the diagnostics to the ComfyUI console. The same text is always available on the 'diagnostics' STRING output. Version k2-1.2.0 (base: SVE 2.2). |
| noise_distribution | COMBO | Shape of the random noise. 'uniform' is the original behavior. 'gaussian' matches the bell-curve statistics of the embedding itself and tends to produce fewer broken outputs at the same strength. Both are power-matched: the same strength gives the same overall perturbation. | |
| granularity | COMBO | 'values' scatters noise across individual embedding values (original behavior). 'tokens' perturbs whole tokens at once, producing more semantic variations (subjects/props/composition shift together). randomize_percent then selects tokens instead of values. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| conditioning | CONDITIONING | — |
| diagnostics | STRING | — |