Cond Pair Set Props Combine
Two LoRAs in one image, each locked to its own side
- positive
- negative
- positive_NEW
- negative_NEW
- mask
- hooks
- timesteps
- positive
- negative
You want character A on the left half and character B on the right half, each with their own LoRA, no attribute bleeding. A normal LoRA loader applies one LoRA to the whole model for the whole run, so that's off the table. PairConditioningSetPropertiesAndCombine (display name "Cond Pair Set Props Combine") is the node that makes it work: it takes your existing positive/negative pair, takes a new positive/negative pair, applies whatever region or scheduling you want to the new one, and merges them - all in one node that hands you back a combined pos/neg pair.
What it's actually doing
This is ComfyUI's native hooks system doing the heavy lifting, and it landed in core around December 2024 (kosinkadink, the AnimateDiff-Evolved author, is the one who wired model-patching into core). Hooks are weight patches - LoRAs, or even a whole checkpoint - that ride along on the conditioning. When the sampler runs, each conditioning that carries a different hook gets its own model pass, so the left region genuinely runs with character A's weights and the right with character B's. That's a real difference from prompt-level regional conditioning (ConditioningSetArea etc.): this is regional weights, not regional text.
So the typical flow is: wire one CreateHookLora into this node's hooks input along with a mask that covers the left half, another into a second instance with the right-half mask, and keep one branch plain. Three cond pairs, three regions, one image.
The inputs that matter
Four conditioning inputs, two of them you care about:
positive/negative- your existing conditioning, the thing you're layering on top of.positive_NEW/negative_NEW- the new conditioning that gets the treatment. This is where the hooked/region LoRA prompt goes.
Then the dials:
hooks- the HOOKS group (aCreateHookLoraoutput) that adds the weight patch to the_NEWconds.mask- the region. White = where the new conditioning acts.strength- this only does anything when a mask is connected. It's the mask strength, the blend amount of the masked region. No mask, no effect; a lot of people set it and wonder why nothing changed.set_cond_area- "default" or "mask bounds". Use mask bounds. That's the setting that keeps the masked region's influence from spilling past its edges, and it's the difference between a clean split and the boxy seams people post about.timesteps- aTIMESTEPS_RANGEto limit the new conditioning to part of the sampling run (e.g. only the early composition phase).
Outputs: a combined positive and negative, ready for the sampler.
The gotchas, from people who've run it
This is where the community reports get real. First: expect a slowdown. Each hooked region is a separate model forward pass, so a two-region run can be several times slower than a plain one - one user on a 4070 Ti reported roughly 6x and called it unusable. Budget for it.
Second: regions that never talk to each other look stitched. If your output has a hard split down the middle with two differently-scaled subjects, you need a third, global conditioning that fills the space the masks don't cover - that's exactly what the "Set Default Combine" sibling nodes are for. Add one prompt describing the whole scene and the seams mostly vanish.
Third: GGUF. The hook system's LoRA loading didn't support GGUF-format LoRAs early on, and Flux users hit errors; if you're on GGUF Flux you may need the .safetensors LoRA instead.
How you get it
It ships with ComfyUI core - no install, no Manager. It's marked experimental, so expect occasional changes as the hooks API settles. You'll find it under advanced → hooks → cond pair in the node menu.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| positive_NEW | CONDITIONING | — | |
| negative_NEW | CONDITIONING | — | |
| strength | FLOAT | 1.000–10 | — |
| set_cond_area | COMBO | 2 options: default, mask bounds | |
| maskopt | MASK | — | |
| hooksopt | HOOKS | — | |
| timestepsopt | TIMESTEPS_RANGE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |