Conditioning Timestep Switch
Getting sick of Z-Image Turbo spitting out the same image? Start the prompt late
- conditioning_1
- conditioning_2
- CONDITIONING
Conditioning Timestep Switch exists for one very specific pain: models like Z-Image Turbo have famously low seed variance, so you can queue twenty generations at twenty different seeds and get back twenty images that are basically the same picture with slightly different grain. This node's answer is elegant and a little counterintuitive - don't tell the model your prompt until the denoising is already underway.
The idea comes straight from how diffusion actually works. The first few percent of denoising are where the broad composition gets roughed in - the "noise" stage that still holds most of the randomness. If you feed the model a prompt immediately, those early steps lock the layout in early, and everything downstream just fills in details, which is exactly why Turbo converges on the same composition regardless of seed. BigStationW's trick: start with an empty prompt for the first ~10% of the denoising, let the sampler wander a bit, then switch to your real prompt once the noise floor has had room to do its thing. More variety early in, more variety out.
How it actually works
The name is accurate, and unlike a lot of utility nodes this one isn't doing anything magical at runtime. Open the source and you'll see it does one thing: it rewrites the start_percent / end_percent values baked into each CONDITIONING, the same fields the core "ConditioningSetTimestepRange" node touches. Your first conditioning gets clamped to [0.0, threshold + 1e-3), your second to [threshold + 1e-3, 1.0), and both are returned as one combined CONDITIONING. The sampler reads those windows and applies each prompt only during its slice of the denoising timeline. It's pure dict manipulation - no sampler hooks, no torch calls, no GPU work.
The inputs that matter
Only three, and honestly only two you'll touch:
- conditioning_1 (required) - the prompt active before the threshold. For the seed-diversity trick this is your empty (or alternate) prompt.
- threshold (required, float, default 0.1, range 0–1) - the switching point as a fraction of denoising. 0.1 means "switch after the first 10%."
- conditioning_2 (optional) - the prompt active after the threshold. This is the one that matters, and here's the trap: the tooltip says plainly that if you leave it unconnected, "nothing happens after the threshold." Your conditioning_1 just gets narrowed to the first slice and the rest of denoising runs unguided. Hook this up. It isn't optional in spirit.
The single CONDITIONING output plugs straight into whatever you'd normally feed a prompt into - in the bundled Z-Image workflow it goes into a BasicGuider (Z-Image Turbo is CFG-1 flow matching, so you're on SamplerCustomAdvanced territory anyway, not a plain KSampler).
Installing it
The pack is one file, zero dependencies, no model downloads, no pip installs. Either use ComfyUI Manager (search "Conditioning Timestep Switch") or the README's way:
cd ComfyUI/custom_nodes
git clone https://github.com/BigStationW/ComfyUi-ConditioningTimestepSwitch
Then restart ComfyUI. It'll appear under advanced/conditioning in the node menu.
Where people get burned
The edge cases in the code are worth knowing. Set threshold to 0 and conditioning_1 is silenced entirely - your real prompt never applies. Set it to 1 and conditioning_2 never runs. Neither is a bug, but both are easy ways to get blank or wrong-looking output and wonder what broke. Also keep expectations honest: this is a diversity hack, not a free lunch. An unguided first 10% means you're trading prompt adherence and composition stability for variation, and it won't fix Turbo's adherence quirks. If you've moved to Z-Image Base, the native seed diversity is back and you can skip this node entirely. And if you want the same idea with more dials, the community's SeedVarianceEnhancer perturbs the embedding itself instead of swapping prompts - same tradeoff, different knob.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| conditioning_1 | CONDITIONING | Conditioning active BEFORE the threshold (Start) | |
| threshold | FLOAT | 0.100–1 | The switching point (0.0 to 1.0) |
| conditioning_2opt | CONDITIONING | Conditioning active AFTER the threshold (End). If not provided, nothing happens after the threshold. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | — |