Nodes/Seed Variance Enhancer - Krea 2 Turbo/Seed Variance Enhancer - Krea 2 Turbo
ComfyUI Node

Seed Variance Enhancer - Krea 2 Turbo

Your Krea 2 Turbo keeps drawing the same picture. This node fixes that.

By harukimix·Created 2 months ago·Updated 2 months ago· 16
Seed Variance Enhancer - Krea 2 Turbo
  • conditioning
  • conditioning
  • diagnostics
randomize_percent50
auto_strength_factor1.00
strength20.0000
noise_insert
steps_switchover_percent25
seed0
mask_starts_at
mask_percent0
log_to_consolefalse
noise_distribution
granularity

"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 left fixed, you get the same noise every run, which defeats the whole point. Set it to randomize or increment via the control_after_generate dropdown. This is the #1 cause of "it's not working."
  • auto_strength_factor - 1.0 balanced, 0.5 subtle, 3–5 strong. 0 falls back to the manual strength widget.
  • 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 steps is the recommended default; noise on all steps is 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 (uniform default / gaussian - gentler, fewer broken outputs, power-matched so same strength = same perturbation) and granularity (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.

Categoryadvanced/conditioning

Inputs (12)

NameTypeDefaultDescription
conditioningCONDITIONING
randomize_percentFLOAT501–100Percentage of embedding values (or tokens, see granularity) that receive noise. Higher = more diversity, less prompt adherence.
auto_strength_factorFLOAT1.000–100If > 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.
strengthFLOAT20.0000-4294967295–4294967295Absolute noise scale. Only used when auto_strength_factor is 0.
noise_insertCOMBOWhere 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_percentFLOAT251–99Where noisy/clean conditioning switch. Formula: (100/TOTAL_STEPS)*SWITCH_STEP. For 8-step Krea 2 Turbo: 25 ~ first 2 steps, 38 ~ first 3 steps.
seedINT00–18446744073709550000IMPORTANT: 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_atCOMBOWhich end of the prompt is protected from noise.
mask_percentFLOAT00–99Percentage of the prompt protected from noise. 'beginning'+'50' protects the first half.
log_to_consoleBOOLEANfalseAlso 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_distributionCOMBOShape 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.
granularityCOMBO'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)

NameTypeDescription
conditioningCONDITIONING
diagnosticsSTRING