pre_qwenModelPatch_CN
Stack up to three ControlNets on Qwen-Image in one node
- context
- image1
- image2
- image3
- latent_image
- latent_mask
- context
- model
- positive
- negative
- latent
Its internal display name is pre_qwenModelPatch_CN, which is the more honest description: this is a Qwen-Image ControlNet loader-and-stacker rolled into one node, patching your model with up to three ControlNet conditions at once instead of you wiring three separate ControlNetApply chains by hand. Qwen-Image got a union ControlNet fast by community standards - InstantX shipped theirs (canny, soft edge, depth, pose) just 16 days after the base model released - and this node is built around stacking conditions from that kind of union checkpoint, or any Qwen-compatible ControlNet you point it at.
Multi-ControlNet stacking is a real, common pattern: canny plus depth for structure and spatial arrangement together, or lineart plus a reference-style condition. Each unit in a proper multi-ControlNet setup gets its own weight and step range, and this node gives you three independent image/model/strength triplets to do exactly that, in one place, feeding a single patched model out.
The inputs and outputs that matter
context(required) - the pack's run-context bundle; the model this node patches comes from here.image1/image2/image3(optional) - the conditioning image for each ControlNet slot (a canny map, a depth map, whatever your preprocessor produced).controlnet1/controlnet2/controlnet3(optional, dropdown) - which ControlNet checkpoint each slot loads. Populated from whatever's in yourmodels/controlnetfolder.strength1/strength2/strength3(default 0.8, range 0–2) - per-condition control weight. That 0.8 default lands right in the range the InstantX Qwen-Image union itself recommends (0.8–1.0) - don't reflexively push these to 1.5 or 2 the way you might have on an old SD 1.5 ControlNet; modern unions are tuned to need less.latent_image/latent_mask(optional) - feed these if you're combining the ControlNet pass with an inpaint-style masked region.- Outputs:
contextpassthrough,model(the patched model),positive/negative(CONDITIONING), andlatent- everything you need to wire straight into a KSampler.
You don't have to use all three slots - leave image2/image3 disconnected and only the first condition applies.
How to install it
Search ComfyUI-Apt_Preset in ComfyUI Manager, or clone it directly:
cd ComfyUI/custom_nodes
git clone https://github.com/cardenluo/ComfyUI-Apt_Preset.git
install.bat covers dependencies on Windows; on Linux or Mac, read what it runs and pip-install those yourself, or let Manager fill gaps on first load. This node needs the actual Qwen-Image ControlNet checkpoint(s) downloaded separately and dropped in ComfyUI/models/controlnet - the node loads whatever's there, it doesn't fetch anything itself. InstantX's Qwen-Image-ControlNet-Union on HuggingFace is the standard choice if you don't already have one.
Common issues & troubleshooting
A controlnet dropdown only shows "None." That means ComfyUI didn't find any Qwen-compatible ControlNet checkpoint in models/controlnet. Download one and restart - the dropdown populates from disk at startup, not live.
Stacking two or three conditions and results look overcooked. This is the same trap as the old SD 1.5/SDXL habit of running ControlNet at 1.0+ by default. Modern union checkpoints publish lower recommended weights for a reason - start around 0.6–0.8 per slot when stacking more than one condition, since their effects compound.
You only need one condition, not three. Just wire image1/controlnet1/strength1 and leave the other two slots empty - the node handles a partially-filled stack fine.
latent_mask seems to do nothing without latent_image. Both are meant to be used together for a masked/inpaint-style pass; wiring only one leaves the node with an incomplete picture of what to protect versus regenerate.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| context | RUN_CONTEXT | — | |
| image1opt | IMAGE | — | |
| controlnet1opt | COMBO | 1 options: None | |
| strength1opt | FLOAT | 0.800–2 | — |
| image2opt | IMAGE | — | |
| controlnet2opt | COMBO | 1 options: None | |
| strength2opt | FLOAT | 0.800–2 | — |
| image3opt | IMAGE | — | |
| controlnet3opt | COMBO | 1 options: None | |
| strength3opt | FLOAT | 0.800–2 | — |
| latent_imageopt | IMAGE | — | |
| latent_maskopt | MASK | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| context | RUN_CONTEXT | — |
| model | MODEL | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |