Nodes/OmniNodes/ControlNet Loader πŸ•ΉοΈ
ComfyUI Node

ControlNet Loader πŸ•ΉοΈ

The ControlNet Loader that is really just ComfyUI's, with a summary bolted on

By TensorVizionΒ·Created 3 months agoΒ·Updated about 8 hours agoΒ· 0
ControlNet Loader πŸ•ΉοΈ
    • control_net
    • summary
    β—„control_net_nameβ–Ύβ–Ί

    Before a ControlNet can guide your generation, something has to load the .safetensors file out of models/controlnet/ and hand you a CONTROL_NET object. That's the whole job of this node. It's part of the OmniNodes pack, but here's the honest thing up front: underneath, it is ComfyUI's own core ControlNetLoader with a string output taped onto the side. The source is literally from nodes import ControlNetLoader and a delegation call. It loads ControlNet files using ComfyUI's own logic, so anything ComfyUI supports - including the modern union/multi-type ControlNets - works identically here.

    So why would you use it instead of the core node? Two reasons, neither of them earth-shattering. First, if you've standardized on OmniNodes for the rest of your graph, this keeps your loader naming consistent with the pack's other loaders (VAE Loader, Upscale Model Loader, all of which share the same "loader + summary" shape). Second, it gives you that extra summary STRING output - a human-readable line saying which file was loaded - which is nice for logging or for feeding a text-display node, but doesn't change any behavior.

    The inputs are what you'd expect: control_net_name, a dropdown populated from whatever ControlNet files ComfyUI can see in its controlnet/ search paths. Note the dropdown will look empty in the raw schema - that's because it's populated dynamically from your model folder at load time, not a fixed enum. The outputs are control_net (CONTROL_NET) and summary (STRING).

    Where it sits in a workflow is the part that matters more than the node itself. Loaded control_net is only half the equation - you still need a conditioning image (an edge map, depth map, pose skeleton) and an Apply ControlNet node to inject the condition into your conditioning. ControlNet conditions generation on spatial structure extracted from a reference image - edges, depth, pose - without overwriting what the prompt says. This node only loads the model; it doesn't apply it.

    The pack knows it left a gap there, which is why OmniNodes also ships a ControlNet Preprocessor (the node that turns your source image into the conditioning image - canny edges, lineart, or a light depth estimate) and why that preprocessor exists at all. The README is candid: the loader had nothing upstream to build its conditioning image from, so they added the preprocessor to fill the biggest gap in the pack.

    One genuinely useful thing: because this delegates to core, you're not locked into old formats. ControlNet files are architecture-bound - an SD-era ControlNet won't load on a modern base, and every architecture (SDXL, Flux, Qwen, Z-Image) needs its own - but whatever file does match your base will load through this node the same way it would through core.

    Install

    Part of the OmniNodes pack:

    cd ComfyUI/custom_nodes
    git clone https://github.com/TensorVizion/OmniNodes
    

    Restart ComfyUI (or search "OmniNodes" in ComfyUI Manager). No extra pip dependencies - Model Utilities nodes use ComfyUI's own folder_paths and comfy.sd modules.

    Troubleshooting

    • Dropdown shows no ControlNets - your files aren't where ComfyUI looks. They belong in ComfyUI/models/controlnet/ (or a registered subfolder), not anywhere on disk.
    • Loaded but no effect on output - you're missing the Apply ControlNet step. Loader β†’ Preprocessor β†’ Apply ControlNet β†’ your conditioning, or you've just moved a file into memory for nothing.
    CategoryTensorVizion/Model Utilities

    Inputs (1)

    NameTypeDefaultDescription
    control_net_nameCOMBO0 options:

    Outputs (2)

    NameTypeDescription
    control_netCONTROL_NETβ€”
    summarySTRINGβ€”