Unified Conditioning Merge (with timestep ranges)
Timestep ranges that quietly get eaten
- conditioning_1
- CONDITIONING
Stock ConditioningConcat and ConditioningAverage have a bug you can hit for weeks without noticing, because nothing screams at you: they silently drop the start_percent / end_percent metadata from the from-side input. Wire a ConditioningSetTimestepRange in front of one - "this prompt only matters in the first 40% of denoising steps" - and the merge quietly ignores it. The to side keeps its range, the from side loses it. Your carefully staged workflow runs like the knob never existed.
This node is the fix, plus a load of ergonomics on top. It's the flagship of the unified-conditioning-merge pack from RandyHaylor, and it's the node the whole pack is named after.
What it actually is
One node that replaces Concat, Combine, and Average with a merge_mode dropdown, 1..N dynamic input slots, per-slot weights and timestep windows, and - the headline - full metadata carry-through on both sides. It's a drop-in swap for your existing merge nodes; same kind of output, none of the data loss.
The four modes:
concat- glues prompts end-to-end into one longer conditioning per timestep segment.combine- hands prompts to the sampler as separate parallel branches, one model pass per active branch per step, results blended.average_additive- blends embeddings by raw weight, not normalized. Can boost or suppress overall magnitude.average_normalized- same blend, but divides by the sum of active weights so output stays comparable to a single prompt.
Default weight = 1.0 in every mode reproduces stock behavior, so you're never forced to change semantics to get the fix.
How it works
When your inputs carry different effective timestep ranges, the node breaks the [0, 1] span at every range endpoint and emits one CONDITIONING entry per sub-interval. Only inputs whose range covers a sub-interval contribute to it. concat/average modes produce sequential time segments (the sampler picks one per step); combine produces parallel branches that may overlap in time. That distinction is the whole game, and it's why the node has hard rules about chaining.
The important inputs are merge_mode and the conditioning_N slots (connect one and a fresh empty slot appears; disconnect and it collapses). Each slot carries a start/end widget (FLOAT 0..1) and a weight (FLOAT 0..10, default 1.0), plus an SDXL-only clip routing dropdown (Pass L+G / Pass L / Pass G) that lets you zero out one half of a token's embedding per input. Note the widget ranges can only narrow whatever upstream start_percent/end_percent already say - [0,1] is a true pass-through, never a widening.
Where people get burned: combine → concat
Here's the design choice that makes this pack worth knowing about. Combining parallel branches, then feeding them into a concat-mode merge, is silently destructive - the concat glues the parallel branches into one prompt and your upstream combine stops doing anything to the image. The old way, you'd discover that after an hour of turning knobs with zero visible effect.
As of this release, the node refuses to run in that configuration and raises a clear error naming the offending slot and its two overlapping ranges. The fix is one of: switch this node to combine, switch the upstream node to a flat mode, or keep combine all the way to the sampler. Annoying at first, but it beats silent failure.
Install
ComfyUI Manager → search "Unified Conditioning" or "timestep range", install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/RandyHaylor/unified-conditioning-combine-with-timestep-range.git unified-conditioning-merge
Restart ComfyUI. The nodes land under the unified-conditioning-merge category. No model downloads, no pip dependencies beyond what ComfyUI already ships - the pack is self-contained and MIT-licensed.
Troubleshooting
- The combine→concat error above is by far the most common run-time failure. Read the message, it names the slot.
- No special sampler integration needed:
comfy/samplers.pycomputes sigma windows from each entry'sstart_percent/end_percentnatively, so KSampler, KSamplerAdvanced, and friends all honor per-entry ranges out of the box. - If your staged prompt "stops working" after switching from stock nodes, check the
start/endwidgets are at[0,1]- that's the pass-through position.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| merge_mode | COMBO | concat | 4 options: concat, combine, average_additive, average_normalized |
| conditioning_1 | CONDITIONING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | — |