Load Pre ControlNet Model
A pass-through that just tells you your ControlNet loaded
- CONTROLNET
- STRING
Same story as its sibling LoadPreCheckpointModel, with one input instead of three: LoadPreControlNetModel (display name "Load Pre ControlNet Model") does not load a ControlNet. It takes the CONTROL_NET object that your normal ControlNetLoader already produced, checks it isn't empty, and returns a STRING saying "ControlNet Model loaded successfully." That's the entire transaction. It's a sanity check that belongs to the pack's ComfyForEach/PreLoad category, whose whole idea is "verify your foundation loads before you commit to a long batch run."
And there's a real reason a batch pipeline wants this specific check. ControlNet adds a whole second model and a preprocessor to your graph, and it's one of the most failure-prone parts of any workflow: wrong architecture (an SD 1.5 ControlNet will not load on Flux - each model family needs its own weights trained for it), a corrupt .safetensors, a missing file, a path typo. When that happens interactively, you notice immediately. When it happens on an unattended EC2 worker an hour into a 500-image job, you notice at 2am. This node is designed to make the failure surface early and loud: it raises the moment it sees an empty ControlNet object, so the batch dies before it starts, not mid-sampling.
How it works
One input, one check. It takes CONTROLNET (typed CONTROL_NET in the source) from your ControlNetLoader and runs if CONTROLNET is None: raise ValueError. Pass, and it returns ControlNet Model loaded successfully. Fail, and - like the checkpoint twin - it returns an [Error] ... string instead of raising, so the rest of the graph can keep running and the message survives to the end of the run as a value. No re-emission of the model: the ControlNet still flows through your normal conditioning path, untouched.
The honest framing matters here. This node doesn't verify that your ControlNet works - it verifies that a non-empty object exists at that wire. It won't catch a wrong-architecture file that loads but steers the image into noise. What it catches is the "nothing loaded at all" class of failure, which is the common one.
Input and output
CONTROLNET- fromControlNetLoader→ CONTROL_NET.
Output: a single STRING with the success or error message. Informational only; the actual ControlNet continues along your usual route into the conditioning stack.
Install
Standard for the pack:
cd ComfyUI/custom_nodes
git clone https://github.com/pupba/Comfy_ForEach
cd Comfy_ForEach
pip install -r requirements.txt
Or ComfyUI Manager → ComfyForEach → install, restart. Dependencies: pillow, boto3, opencv-python-headless, numpy, torch. No model downloads - your ControlNet files come from the usual places (ControlNetLoader picks them up from models/controlnet), not from this pack.
Where people get burned
- Thinking it loads the model. It doesn't. Wire
ControlNetLoaderinto it, not the other way around. - Expecting it to validate your weights. It only checks "object exists." A wrong-family ControlNet that loads successfully but produces garbage will sail right through this node and fail aesthetically downstream.
- The string is a value, not a gate. Because errors come back as strings rather than raised exceptions, this node can't hard-stop a workflow by itself. In a headless run you need to actually look at the output string for it to be useful - which is exactly what the pack's
StringVieweris for.
Verdict: a one-input insurance node for unattended batch runs, from the same author who built the Rabbit-Hole pipeline tool. Interactive users can skip it. If you run long automated jobs with ControlNet in the graph, the "did it load?" question is cheap to answer early - and this is the cheapest way this pack gives you to ask it.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| CONTROLNET | CONTROL_NET | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |