pre_controlnet_union
One checkpoint, multiple condition types, up to three slots
- context
- image1
- image2
- dual_image
- context
- positive
- negative
Modern ControlNet checkpoints mostly aren't one-condition-per-file anymore - the standard pattern since 2024 is a single "union" checkpoint that switches between canny, depth, pose, and a handful of other condition types via a mode selector, rather than making you download and swap a separate file for each. pre_controlnet_union is Apt_Preset's node for that pattern: one controlNet checkpoint, up to three condition slots each with its own type dropdown.
Sibling to pre_controlnet, which is for the older per-condition-per-checkpoint style. Same chx_tool/controlnet category, same RUN_CONTEXT chain integration.
How it works
Three slots, but they're not identical. Slots 1 and 2 each take an image plus a type dropdown (openpose, depth, a softedge group, a line/edge group, normal, segment, tile, or repaint) and their own strength and start/end percent. The third slot is different: it takes a single dual_image plus two type selectors, dual_type_1 and dual_type_2, sharing one strength - this is for a reference image that already carries two condition types baked into it at once, the node's own description gives lineart+depth or pose+depth as the common combinations, which matches how people pair complementary structure conditions in practice. All three slots feed into the same controlNet checkpoint; you're not loading three separate files, just telling the one union model which condition each image represents.
Default strength on every slot is 0.8, not the old 1.0 you'd see on SD 1.5-era single-condition ControlNets - that's deliberately in line with where 2025–26 union checkpoints actually want to sit (most publish recommended strengths somewhere in the 0.65–0.9 band rather than the flat 1.0 default of the SD era), so leaving it at default is a reasonable starting point rather than something to immediately second-guess.
Inputs and outputs
- context (optional) - the running
RUN_CONTEXT. - controlNet - the single union checkpoint dropdown all three slots share.
- image1 / type1 / strength1 / start_percent1 / end_percent1 - first slot.
- image2 / type2 / strength2 / start_percent2 / end_percent2 - second slot.
- dual_image / dual_type_1 / dual_type_2 / strength3 / start_percent3 / end_percent3 - third slot, one image carrying two condition types at once.
type1/type2/dual_type_1/dual_type_2 all draw from the same nine-option list: none, openpose, depth, a hed/pidi/scribble/ted group, a canny/lineart/anime_lineart/mlsd group, normal, segment, tile, repaint.
Outputs: context, positive, negative - same shape as pre_controlnet.
Installing it
ComfyUI Manager: search "ComfyUI-Apt_Preset", install, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/cardenluo/ComfyUI-Apt_Preset.git
Restart afterward. install.bat for Windows; on Linux/Mac, install from the requirements file inside your ComfyUI venv. You need the actual union ControlNet checkpoint for your base model sitting in your ControlNet folder - this node doesn't fetch one for you, and which union you need depends entirely on your base model (Flux, Qwen-Image, Z-Image, and SDXL each have their own union checkpoints, and they are not interchangeable). If you want scheduled/timed control beyond the static start/end percent here, the README points at installing ComfyUI-Advanced-ControlNet first.
Common issues
Picked a type that doesn't seem to be supported. Not every union checkpoint covers every condition in the dropdown - the menu here is a fixed list of possibilities across union models generally, but any individual union checkpoint (especially anything post-Flux) typically covers six or seven of them, not all nine. Segmentation and normal maps in particular have no post-Flux union coverage as of mid-2026; if you need those, you're better off on an SDXL union.
Result looks over-controlled or artificial with default settings. Check what base model your union checkpoint targets - 0.8 is a reasonable default in the 0.65–0.9 range most modern unions publish, but if you're running an unusual combination, drop strength before assuming the node is misbehaving.
dual_image slot isn't doing what you expect. Confirm both dual_type_1 and dual_type_2 are set to something other than none - this slot needs both to know what two conditions are baked into that single image; with only one type set, it behaves like a single-condition slot instead of the combined one it's meant for.
Wrong checkpoint loaded for your base model. Union checkpoints are architecture-specific - a Flux union will not run correctly against an SDXL model or vice versa. Match controlNet to your actual base before troubleshooting anything else.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| contextopt | RUN_CONTEXT | — | |
| image1opt | IMAGE | — | |
| image2opt | IMAGE | — | |
| dual_imageopt | IMAGE | — | |
| controlNetopt | COMBO | 1 options: None | |
| type1opt | COMBO | 9 options: None, openpose, depth, hed/pidi/scribble/ted, canny/lineart/anime_lineart/mlsd, normal, +3 | |
| strength1opt | FLOAT | 0.800–10 | — |
| start_percent1opt | FLOAT | 0.000–1 | — |
| end_percent1opt | FLOAT | 1.000–1 | — |
| type2opt | COMBO | 9 options: None, openpose, depth, hed/pidi/scribble/ted, canny/lineart/anime_lineart/mlsd, normal, +3 | |
| strength2opt | FLOAT | 0.800–10 | — |
| start_percent2opt | FLOAT | 0.000–1 | — |
| end_percent2opt | FLOAT | 1.000–1 | — |
| dual_type_1opt | COMBO | 9 options: None, openpose, depth, hed/pidi/scribble/ted, canny/lineart/anime_lineart/mlsd, normal, +3 | |
| dual_type_2opt | COMBO | 9 options: None, openpose, depth, hed/pidi/scribble/ted, canny/lineart/anime_lineart/mlsd, normal, +3 | |
| strength3opt | FLOAT | 0.800–10 | — |
| start_percent3opt | FLOAT | 0.000–1 | — |
| end_percent3opt | FLOAT | 1.000–1 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| context | RUN_CONTEXT | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |