Conditioning Merge (List)
Turning a whole list of conditionings into one sampler input
- conditioning
- conditioning
Here's the problem this node solves, and it's a plumbing problem rather than a modelling one. A sampler takes one conditioning. But the nodes that do multi-reference work - this pack's Qwen VL List Encode Rebalance, its Krea 2 Edit Rebalance - output a list of conditionings, one per prompt or per reference frame. Something has to fold that list back down. That's Conditioning Merge (List).
It's the list-sized sibling of the pack's Conditioning Merge (two inputs) and Conditioning Merge (Multi) (five), and it shipped in the pack's 26/09 update alongside "new conditioning merge methods" - which is why there's almost nothing written about it yet.
What merging conditioning even means
A conditioning is a tensor of per-token embeddings plus a dict of extras like start_percent/end_percent. Merging two of them means aligning their batch dimensions, padding the shorter token sequence, and combining element-wise. Which element-wise rule you pick is the whole game, and this node gives you twelve of them.
Multi-reference workflows have been built on exactly this trick for a while - stacking several images into one conditioning is how the multi-image pipelines from the Flux 2 era work - but most packs only expose one or two flavours of the arithmetic.
The modes, and the two widgets that matter
The first structure in your list is the anchor for every asymmetric mode. Order matters more than any slider here.
top_match(the default, usesmatch_percent): pairs of elements that share a sign and sit in the top slice of the anchor by magnitude get averaged; everywhere the inputs disagree, the loudest one wins. Blend where they agree, don't dilute where they don't.match_percentis how much of the anchor counts as "matching" - 0.5 is the shipped default, and it's the dial to move first.average/norm_average: a plain mean, versus a mean that first energy-matches the rest of the list to the anchor. Usenorm_averagewhen your prompts differ in length, because plain averaging quietly shrinks the result toward nothing.weighted/norm_weighted(usestrength):anchor × (1 − strength) + mean(rest) × strength. This is the intuitive blend dial, and 0.5 is a sane start.add,subtract: sum everything, or subtract the rest from the anchor.subtractis the one people reach for when they want negate-something behaviour inside conditioning space.max_magnitude/min_magnitude: per element, take the biggest or smallest contributor.difference(strength):anchor + (anchor − mean(rest)) × strength. Pushes away from whatever the other conditionings have in common - contrastive steering by another name.orthogonal(strength): subtract only the anchor's projection onto the rest. This removes a direction rather than an image, which is what you want when four references share one attribute you'd rather drop.concat(strength,metric,target_tokens,distribute): glues token sequences end to end. Withtarget_tokensset it prunes down to that budget; withtarget_tokensat 0,strengthbelow 1 keeps only the top fraction of the later inputs' tokens bymetric(magnitude,variance, ordistinctiveness), anddistributeapplies that pruning to every input including the anchor. This is "more prompt" without paying the full token bill.
A frontend script ships with the pack that hides the widgets a mode doesn't use. If match_percent vanishes when you pick average, that's the feature working, not a bug.
Output and install
One output, conditioning, wired into your model's positive input. Install is the pack's usual:
cd ComfyUI/custom_nodes
git clone https://github.com/nova452/Rebalance-Pack.git
# restart
Or search Rebalance Pack in ComfyUI Manager. No dependencies, no model downloads, no requirements.txt - just ComfyUI's own torch. Do a hard browser refresh after restarting, since the pack ships frontend JS.
Where people get caught
"I connected it and nothing changed." A single conditioning wired into a list input gets wrapped into a one-element list, and the node returns it untouched. If nothing happened, your list had one item - check that the upstream node is actually list-producing.
"At least one conditioning is required." Every element was empty. Usually one of your image slots was never wired on the upstream encode node.
List order drifts and your results drift with it. For weighted, difference, orthogonal, subtract and top_match, swapping which conditioning lands first changes the output. If the upstream list order isn't stable, that's your bug, not the node's.
Worth knowing what good looks like: the pack's own Krea 2 edit nodes use this same merge internally when you feed them a batch of images - one encoding pass per frame, merged back together with top_match at a match_percent of 0.8. If you're building the equivalent by hand, that's the setting to start from.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| conditioning | CONDITIONING | — | |
| mode | COMBO | top_match | 12 options: top_match, average, norm_average, weighted, norm_weighted, add, +6 |
| match_percent | FLOAT | 0.500–1 | — |
| strength | FLOAT | 0.500–2 | — |
| metric | COMBO | magnitude | 3 options: magnitude, variance, distinctiveness |
| target_tokens | INT | 00–4096 | — |
| distribute | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| conditioning | CONDITIONING | — |