Nodes/ComfyForEach/Load Pre ControlNet Model
ComfyUI Node

Load Pre ControlNet Model

A pass-through that just tells you your ControlNet loaded

By pupba·Created about a year ago·Updated about a year ago· 4
Load Pre ControlNet Model
  • 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 - from ControlNetLoader → 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 ControlNetLoader into 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 StringViewer is 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.

CategoryComfyForEach/PreLoad

Inputs (1)

NameTypeDefaultDescription
CONTROLNETCONTROL_NET

Outputs (1)

NameTypeDescription
STRINGSTRING