Apply Multi-Control Net Adv JK๐
Pose and depth at once โ multiple ControlNets on one conditioning
- base_positive
- base_negative
- mask
- vae
- controlnet_stack
- base_pos
- base_neg
Single ControlNet gets you one spatial condition. Real images often need two or three pulling at once - pose from OpenPose, structure from canny, maybe depth - and that's what "multi-ControlNet" is for. CR Apply Multi-ControlNet Adv JK is the JakeUpgrade node that consumes a CONTROL_NET_STACK and applies every condition in it to the same conditioning, each with its own strength and denoising window, plus the same effective-mask support as its single-ControlNet sibling.
How it works
The node takes the classic three inputs - base_positive, base_negative, and an optional mask / vae - plus the controlnet_stack wire. That stack is built upstream by the pack's Multi-ControlNet Param Stack JK (or ControlNet Loader JK + stacking), where each entry bundles a ControlNet model, an image, a strength, and start/end percents. Applying is a loop: each tuple gets loaded, its image split via SplitImageWithAlpha (so alpha-channel masks work), and run through the core ControlNetApplyAdvanced. Because the previous pass's conditioning feeds into the next, conditions compose rather than overwrite - pose plus canny can coexist, each biting in its own percent window.
The effective_mask toggle works like the single-apply version: when on, the conditioning is split so the stack's effect applies inside the mask and plain base conditioning carries the rest. Handy when you want, say, pose control on the figure but a clean background the conditions can't touch.
Outputs are base_pos and base_neg - the fully stacked conditioning pair for your sampler.
One honest caveat: more conditions isn't automatically better. Each additional ControlNet is another constraint pulling against the prompt, and the community consensus (check the controlnet knowledge in the KB) is that stacking works best when conditions are disjoint - different modalities, different regions - and when each has a modest strength. Four maxed-out controls produce mush, not fidelity.
Installing it
This is one node in ComfyUI-JakeUpgrade:
cd ComfyUI/custom_nodes
git clone https://github.com/jakechai/ComfyUI-JakeUpgrade
cd ComfyUI-JakeUpgrade
# Windows standalone: install.bat
# or: python_embeded\python.exe -s -m pip install -r requirements.txt
pip install -r requirements.txt # non-Windows
ComfyUI Manager works too (search "JakeUpgrade"). ControlNet files live in ComfyUI/models/controlnet; nothing downloads automatically.
Troubleshooting
- An empty or ignored condition. Check that condition's own strength in the stack node - a 0-strength entry is still passed but does nothing. Also confirm the image is attached to that stack entry, not just to the apply node.
- Import / load errors on startup. JakeUpgrade v2.1.5+ needs ComfyUI v0.3.64+ because of the
SplitImageWithAlpharename. Old ComfyUI, old behavior. - The whole ControlNet feature set depends on preprocessors. If your workflow expects a canny or depth map, that's a separate step (ComfyUI's own preprocessors or ControlNet-Aux). This node only applies ready-made conditions.
- Manager shows a JakeUpgrade / IPAdapter_plus conflict. That's the pack's
replacement/folder tripping Manager's conflict check - the README confirms it's a false positive. - CUDA errors after adding the pack. If you run ComfyUI-MultiGPU, the README says to disable it; it conflicts with recent ComfyUI.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| base_positive | CONDITIONING | Positive conditioning input | |
| base_negative | CONDITIONING | Negative conditioning input | |
| effective_mask | BOOLEAN | false | Apply mask to ControlNet effects |
| maskopt | MASK | Mask for selective application | |
| vaeopt | VAE | VAE for image encoding | |
| controlnet_stackopt | CONTROL_NET_STACK | Stack of ControlNet parameters |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| base_pos | CONDITIONING | โ |
| base_neg | CONDITIONING | โ |