Nodes/ComfyUI-RBG-SmartSeedVariance/RBG Smart Seed Variance ๐ŸŒฑ
ComfyUI Node

RBG Smart Seed Variance ๐ŸŒฑ

Same prompt, same seed, same castle every time โ€” the fix for Turbo-model seed lock

By RamonGuthrieยทCreated 9 months agoยทUpdated 12 days agoยท 65
RBG Smart Seed Variance ๐ŸŒฑ
  • conditioning
  • target_vibe
  • conditioning
  • variance_heatmap
โ—„variance_preset๐ŸŒฟ Balancedโ–บ
โ—„fine_tune_variance50โ–บ
โ—„model_typeโšก Z-Image Turboโ–บ
โ—„fade_curveInstantโ–บ
โ—„noise_injectionBeginning Stepsโ–บ
โ—„protect_mode๐Ÿšซ Noneโ–บ
โ—„protect_regionsโ–บ
โ—„direction_shift๐Ÿšซ Noneโ–บ
โ—„shift_strength100โ–บ
โ—„variance_scheduleconstantโ–บ
โ—„cutoff_step8โ–บ
โ—„total_steps20โ–บ
โ—„cutoff_strength0.0โ–บ
โ—„seed0โ–บ
โ—„vibe_blend0.50โ–บ

If you've run Z-Image Turbo or Qwen-Image for more than an hour, you've hit the wall: reroll the seed ten times and you get ten nearly identical images. Same castle in the background, same pose, same everything. It's not you. Distilled Turbo-style models bake guidance into the checkpoint, and one side effect is that seed barely moves the needle - the community calls it "seed lock." This node is the workaround: instead of praying a new seed does something, it injects structured noise directly into your text embeddings so the model actually sees a different starting point.

What it actually does

RBG Smart Seed Variance is a pure CONDITIONING โ†’ CONDITIONING node. It sits between your CLIP Text Encode and the KSampler's positive input - you don't touch the sampler or the seed at all. On each run it clones your conditioning tensor, adds seeded noise scaled to the embedding's own standard deviation, then hands the perturbed version to the sampler. Because the noise is calibrated to the embedding's variance and clamped (no single token can get yanked past ~1.5ร— the embedding's std), you get diversity without the prompt collapsing into noise soup.

Two details make it smarter than a random fuzz node. First, it also perturbs the pooled output vector, which is what drives global composition in models like SDXL. Second, it uses ComfyUI's start_percent/end_percent conditioning fields to control when the noisy embedding is active - noise only during the early steps shifts composition, only during late steps shifts fine detail.

The inputs that matter

You'll set four things and mostly leave the rest alone:

  • variance_preset - the intensity knob, from Disabled through Subtle, Balanced, Creative, Bold, up to Wild. The tooltip's honest: higher = more diverse but less prompt adherence.
  • model_type - pick your actual model (Z-Image Turbo, Krea 2, Qwen-Image, Flux, Chroma HD, ERNIE-Image, SDXL, Wan 2.2, Other). This is a quiet killer: the multipliers are wildly different, and the default is Z-Image Turbo. If you're on SDXL and forget to change it, you'll get way more noise than you bargained for. Flux gets its strength halved because its dual encoder is hypersensitive.
  • noise_injection - Beginning Steps (composition variety), Ending Steps (detail variety), All Steps, or None.
  • seed - the node's own seed. Vary this to get different variance patterns even with the same preset.

The genuinely advanced stuff - direction_shift (two dozen-plus artistic bias patterns like "Vibrant" or "Dynamic Pose" instead of random noise), fade_curve, variance_schedule + cutoff_step for locking composition, and protect_mode to keep prompt-critical tokens untouched - is where the power lives once you've got the basics working. There's also an optional target_vibe conditioning input that steers the noise direction toward a second conditioning, with vibe_blend controlling how hard it pulls. And you get two outputs: the modified conditioning (wire that into your sampler) and a variance_heatmap image showing which tokens got perturbed - handy for debugging why your prompt went sideways.

Installing it

The pack shows up in ComfyUI Manager under "ComfyUI-RBG-SmartSeedVariance" (it's a single-node suite, listed under RBG Suite/Advanced). Or:

cd ComfyUI/custom_nodes
git clone https://github.com/RamonGuthrie/ComfyUI-RBG-SmartSeedVariance.git

Then restart ComfyUI. Good news on dependencies: the requirements file is empty and the pyproject only lists numpy and Pillow - both ship with ComfyUI already. No model downloads, no torch extra. The one real dependency is node_helpers, a module that ships inside ComfyUI itself; if the node throws "node_helpers could not be imported," it means your ComfyUI install is broken, not the node.

Where people get burned

The README's troubleshooting is decent, so the short version: output looks identical โ†’ raise the preset, confirm model_type matches your actual model, and vary the node's seed. Quality degraded โ†’ drop to Subtle, enable prompt protection, or set direction_shift to None for pure random. If your prompt's key concept is getting overridden, First Half protection keeps the leading tokens clean.

One honest caveat from the field: this node is genuinely useful on Z-Image (one r/comfyui user calls it "does what it says on the box"), but it's not magic. Distilled models are fundamentally low-variance, and noise injection gives you variety within the model's stylistic lane - expect different subjects, angles, and details, not a different genre of image. If you want full composition freedom, that's what the non-distilled Z-Image Base (real seed diversity, more steps) is for. Use this node to make the fast model feel less repetitive, and treat Wild + high shift strength as "exploration mode," not a daily setting.

CategoryRBG Suite/Advanced

Inputs (17)

NameTypeDefaultDescription
conditioningCONDITIONINGโ€”
variance_presetCOMBO๐ŸŒฟ BalancedSelect variance intensity level. Higher = more diverse outputs but less prompt adherence.
fine_tune_varianceINT500โ€“100Fine-tune variance (0-100%). Only used when preset is 'Custom'.
model_typeCOMBOโšก Z-Image TurboSelect your model for optimized settings.
fade_curveCOMBOInstantHow noise fades spatially across the embedding.
noise_injectionCOMBOBeginning StepsWhen to apply noise during generation. Beginning Steps = more composition variety, Ending Steps = more detail variety.
protect_modeCOMBO๐Ÿšซ NoneProtection mode: use preset regions, define custom token ranges, or protect random tokens.
protect_regionsSTRINGCustom protection regions (e.g., '0-5,15-20'). Only used when mode is 'Custom Regions'. Format: single tokens (5) or ranges (0-5), comma-separated.
direction_shiftCOMBO๐Ÿšซ NoneApply directional bias to embeddings instead of pure random noise. Creates predictable artistic shifts.
shift_strengthINT1000โ€“200Strength of the direction shift effect (0-200%). 100% = default, 0% = disabled, 200% = double strength.
variance_scheduleCOMBOconstantComposition Lock ๐Ÿ”’: Control how variance changes over time. 'constant'=standard, 'decreasing'=fade out, 'step_cutoff'=block switch, 'tiered_release'=multi-phase unlock, 'hard_lock'=zero variance until step.
cutoff_stepINT80โ€“100The step number where the cutoff or fade ends. (e.g. if you like composition at step 8, set this to 8).
total_stepsINT201โ€“100Estimate of total sampling steps. Required to map 'cutoff_step' to a timeline percentage.
cutoff_strengthFLOAT0.00โ€“1The noise intensity multiplier after the cutoff step. 0.0 = no noise (lock), 1.0 = full noise.
seedINT00โ€“18446744073709550000Seed for noise generation. Different seeds = different variance patterns.
target_vibeoptCONDITIONINGOptional: Connect a conditioning to steer variance direction. The node computes a normalised per-token direction vector from source โ†’ target, then blends it with your chosen direction_shift pattern. Both work together โ€” the vibe sets the direction, the pattern adds texture. Multi-chunk targets are matched chunk-for-chunk with the source. Use vibe_blend to control how strongly the target steers the output.
vibe_blendoptFLOAT0.500โ€“1Controls the mix between target_vibe direction and your direction_shift pattern. 0.0 โ€” direction_shift pattern only, target_vibe has no influence 0.5 โ€” equal blend of vibe direction and pattern (default) 1.0 โ€” pure vibe steering, direction_shift pattern silent Has no effect when target_vibe is not connected.

Outputs (2)

NameTypeDescription
conditioningCONDITIONINGโ€”
variance_heatmapIMAGEโ€”