Manual Combine Cond ππ π
Merge two masked conditioning branches into one
- cond_A
- cond_B
- CONDITIONING
If you've been building conditioning by hand for an AnimateDiff run - masking one prompt to a region with Set Props on Cond, filling the rest with Set Unmasked Cond, maybe scoping a LoRA hook to a specific timestep window - at some point you end up with two separate CONDITIONING objects that both need to reach the sampler. Manual Combine Cond is the node that stitches them back into one. It's plumbing, not a creative control, but it's the plumbing the rest of AnimateDiff-Evolved's conditioning nodes assume exists.
What it does
Two inputs, cond_A and cond_B, one output. Wire in two conditioning branches and it hands back a single CONDITIONING carrying both. Under the hood, ComfyUI conditioning is just a list of entries - an embedding plus a dict of extras like area, mask, or strength - and combining two conditionings is literally concatenating those lists. Nothing gets blended or averaged; both branches apply in full, side by side. That matters: this node overlays two conditioning signals, it doesn't mix them. If what you actually want is to average two prompts into a single in-between result, you want ComfyUI's stock Conditioning (Average) node, not this one.
Where it earns a place in an AnimateDiff graph specifically: the pack's "single cond ops" family - this node, Set Props on Cond, Set Unmasked Cond - all work on one conditioning branch at a time, adding a mask, a strength, a LoRA hook, or a timestep window to it. Once you've built two or three of those branches - say, a masked regional prompt for the left half of the frame and another for the right, each carrying its own scoping - Manual Combine Cond is what merges them into the single conditioning your KSampler actually wants.
Named A and B on purpose
Most ComfyUI conditioning-combine nodes take an arbitrary-length list. This one is locked to exactly two, explicitly named. In a small graph that's a minor inconvenience - chain two of these if you need three or more branches. In a large, already-tangled AnimateDiff graph with masks and LoRA hooks flying everywhere, being able to look at a node and know exactly which two branches it's merging, rather than tracing an arbitrary-length list backward, is worth the extra clicks.
Installing it
Through ComfyUI Manager: search AnimateDiff Evolved, confirm the author is Kosinkadink, install, restart. Manually: cd ComfyUI/custom_nodes && git clone https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved, then restart. This particular node doesn't touch models - it's pure graph logic - but the AnimateDiff workflow it lives inside needs at least one motion module downloaded (mm_sd_v15_v2 and friends, from the pack's HuggingFace/CivitAI links) before anything upstream of it produces a real animation.
Where people get tripped up
The main trap is conceptual, not technical: combining two unmasked, full-frame conditionings with this node doesn't create a blend - it stacks them, and stacking two strong, competing prompts over the same pixels usually just fights itself and muddies the output. This node is built to combine conditioning that's already been scoped - by a mask, an area, a timestep range - so each branch owns a different piece of the frame or the sampling process. If your two conditionings don't have a mask or a timestep range differentiating them, ask whether you actually want Combine at all, or whether you'd be better off with a single prompt.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| cond_A | CONDITIONING | β | |
| cond_B | CONDITIONING | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | β |