RBG Smart Seed Variance ๐ฑ
Same prompt, same seed, same castle every time โ the fix for Turbo-model seed lock
- conditioning
- target_vibe
- conditioning
- variance_heatmap
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.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| conditioning | CONDITIONING | โ | |
| variance_preset | COMBO | ๐ฟ Balanced | Select variance intensity level. Higher = more diverse outputs but less prompt adherence. |
| fine_tune_variance | INT | 500โ100 | Fine-tune variance (0-100%). Only used when preset is 'Custom'. |
| model_type | COMBO | โก Z-Image Turbo | Select your model for optimized settings. |
| fade_curve | COMBO | Instant | How noise fades spatially across the embedding. |
| noise_injection | COMBO | Beginning Steps | When to apply noise during generation. Beginning Steps = more composition variety, Ending Steps = more detail variety. |
| protect_mode | COMBO | ๐ซ None | Protection mode: use preset regions, define custom token ranges, or protect random tokens. |
| protect_regions | STRING | Custom 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_shift | COMBO | ๐ซ None | Apply directional bias to embeddings instead of pure random noise. Creates predictable artistic shifts. |
| shift_strength | INT | 1000โ200 | Strength of the direction shift effect (0-200%). 100% = default, 0% = disabled, 200% = double strength. |
| variance_schedule | COMBO | constant | Composition 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_step | INT | 80โ100 | The step number where the cutoff or fade ends. (e.g. if you like composition at step 8, set this to 8). |
| total_steps | INT | 201โ100 | Estimate of total sampling steps. Required to map 'cutoff_step' to a timeline percentage. |
| cutoff_strength | FLOAT | 0.00โ1 | The noise intensity multiplier after the cutoff step. 0.0 = no noise (lock), 1.0 = full noise. |
| seed | INT | 00โ18446744073709550000 | Seed for noise generation. Different seeds = different variance patterns. |
| target_vibeopt | CONDITIONING | Optional: 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_blendopt | FLOAT | 0.500โ1 | Controls 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)
| Name | Type | Description |
|---|---|---|
| conditioning | CONDITIONING | โ |
| variance_heatmap | IMAGE | โ |