Nodes/ComfyUI-Universal-Model-Loader/Universal MODEL Loader
ComfyUI Node

Universal MODEL Loader

One Node Instead of Five Loaders — and the Filename You Keep Retyping

By Zoltar358-ComfyUI·Created 3 months ago·Updated 2 days ago· 3
Universal MODEL Loader
    • model
    • model_name
    • clip
    • vae
    • loaded_info
    • clip2
    • vae2
    ◄model_typecheckpoint►
    ◄checkpoint_name▾►
    ◄diffusion_model_name▾►
    ◄diffusers_model_path▾►
    ◄gguf_unet_name▾►
    ◄weight_dtypedefault►
    ◄gguf_dequant_dtypedefault►
    ◄gguf_patch_dtypedefault►
    ◄gguf_patch_on_devicefalse►
    ◄clip_name▾►
    ◄clip_typeauto►
    ◄clip_devicedefault►
    ◄vae_name▾►
    ◄clip2_namenone►
    ◄vae2_namenone►
    ◄clip2_typeauto►
    ◄clip2_devicedefault►

    Every graph starts with the same ritual. Add Load Checkpoint. Or, if your model arrived as loose parts, add UNETLoader, then CLIPLoader, then VAELoader - three nodes, three wires that all mean the same thing. And because you want the model's name in your Save Image prefix, you retype the filename into a string node and forget to update it the day you switch models.

    Universal MODEL Loader (UniversalModelLoaderV2) collapses that. Five backends behind one model_type dropdown, and a model_name output that reads the filename for you.

    What it actually is

    A community pack node by Zoltar358, sitting in model/loaders next to the core loaders. The design is a first choice that gates everything after it: pick checkpoint, diffusers, diffusion_model, unet or gguf_unet, and a frontend extension hides every widget that doesn't apply - a two-or-three-field node instead of a wall of dropdowns.

    Two naming traps. Search "universal model loader" and you'll also hit ComfyUI's own long-discussed core loader plans - unrelated. And there are two nodes with nearly the same name here: you want Universal MODEL Loader, not Universal MODEL Loader (legacy API), the old six-output class kept registered so ancient API prompts don't break.

    How the five modes work

    It's pure glue over core ComfyUI. The pack ships zero pip dependencies - dependencies = [] in pyproject.toml - which is rare here and means installing it can't break your transformers version.

    • checkpoint goes through core's load_checkpoint_guess_config, so MODEL, CLIP and VAE all come out of one file.
    • diffusers walks models/diffusers for folders holding a model_index.json.
    • diffusion_model / unet calls the core UNETLoader with your weight_dtype, then loads CLIP and VAE itself from the selectors in the same node. That's the real win: the three-node UNET dance becomes one.
    • gguf_unet imports custom_nodes/ComfyUI-GGUF's node module by file path and uses that pack's GGMLOps and gguf_sd_loader. No ComfyUI-GGUF, no gguf mode.

    The widgets that matter

    model_type, then whichever picker it exposes - checkpoint_name, diffusion_model_name, diffusers_model_path or gguf_unet_name. Then:

    • weight_dtype - diffusion_model/unet only. Leave it default unless you're squeezing a big model onto a card with fp8 acceleration.
    • clip_name + clip_type - the CLIP picker appears for MODEL-only modes, which carry no encoder. Leave clip_type on auto.
    • vae_name - and this is the author's stated position: VAE selection is strictly explicit, and automatic VAE picking was deliberately removed in 1.2.0. On Qwen Image 2.1 you select its matching 2.1 VAE yourself. The node will let you pair the wrong one.
    • gguf_dequant_dtype, gguf_patch_dtype, gguf_patch_on_device - gguf mode only; default suits almost everyone.
    • clip2_name / vae2_name - default none. Second encoder, second VAE, for families that need two.

    auto CLIP type resolves from an encoder-name hint, then the model's own config class, then the filename - and re-resolves every execution, so switching models never leaves a stale type. A bare Qwen encoder errors instead of guessing.

    Outputs

    Seven, in order: model, model_name, clip, vae, loaded_info, clip2, vae2. Wire model to your sampler, clip to CLIP Text Encode, vae to VAE Decode. model_name is the filename minus its final extension, with no file reads or hashing - ideal for a filename prefix. loaded_info logs what actually loaded, including the CLIP type auto landed on.

    One trap: clip2 is an independent CLIP socket, not a combined encoder. If a model wants CLIP-L and T5 fused into one input, that's core's DualCLIPLoader.

    Install

    Manager listing was still pending at 1.3.1, so manual is the reliable path:

    cd ComfyUI/custom_nodes
    git clone https://github.com/Zoltar358-ComfyUI/ComfyUI-Universal-Model-Loader.git
    

    Restart ComfyUI and hard-refresh the browser - the widget-hiding is frontend JS, so a stale page shows the old layout. For GGUF mode, also clone city96/ComfyUI-GGUF.

    Troubleshooting

    The dropdown says "- none found -". That's the pack's sentinel for an empty folder. Your models aren't where the node is looking - check models/checkpoints, diffusion_models, text_encoders - then refresh the browser; those lists build at page load.

    "Ambiguous Qwen encoder." auto refuses to guess between families sharing Qwen encoders. Set clip_type explicitly.

    An old workflow behaves oddly after upgrading. Pre-1.2 versions could save a concrete CLIP type after auto selection, and concrete values count as manual. Set clip_type back to auto.

    You're driving it from the API. model_name sits at index 1, so everything shifts: 0=model, 1=model_name, 2=clip, 3=vae, 4=loaded_info, 5=clip2, 6=vae2.

    A MOSS-Image file is rejected before loading. Intentional - those components aren't core MODEL/CLIP/VAE objects. Right-click the node → Add MOSS-Image loader (typed).

    Should you reach for it

    If you rotate between families - Flux GGUF one week, a Qwen diffusion model the next, an SDXL checkpoint when a LoRA demands it - this is the loader you want. If you load the same SDXL checkpoint daily, core's Load Checkpoint has fewer moving parts, and that's fine.

    Categorymodel/loaders

    Inputs (17)

    NameTypeDefaultDescription
    model_typeCOMBOcheckpointChoose which backend to load. The browser extension hides irrelevant fields after this selection.
    checkpoint_nameCOMBOUsed when model_type = checkpoint. Returns MODEL, CLIP and VAE.
    diffusion_model_nameCOMBOUsed when model_type = diffusion_model or unet. Returns MODEL, CLIP and VAE.
    diffusers_model_pathCOMBOUsed when model_type = diffusers. Folder under models/diffusers containing model_index.json.
    gguf_unet_nameCOMBOUsed when model_type = gguf_unet. Requires ComfyUI-GGUF.
    weight_dtypeCOMBOdefaultOnly used for diffusion_model/unet loading.
    gguf_dequant_dtypeCOMBOdefaultOnly used for gguf_unet.
    gguf_patch_dtypeCOMBOdefaultOnly used for gguf_unet.
    gguf_patch_on_deviceBOOLEANfalseOnly used for gguf_unet.
    clip_nameCOMBOCLIP/text encoder loaded for diffusion_model, unet, and gguf_unet.
    clip_typeCOMBOauto29 options: auto, stable_diffusion, stable_cascade, sd3, stable_audio, mochi, +23
    clip_deviceCOMBOdefaultDevice for the loaded CLIP/text encoder.
    vae_nameCOMBO1 options: pixel_space
    clip2_nameCOMBOnoneOptional second CLIP/text encoder output. Select none when only one CLIP is needed.
    vae2_nameCOMBOnoneOptional second VAE output. Select none when only one VAE is needed.
    clip2_typeCOMBOauto29 options: auto, stable_diffusion, stable_cascade, sd3, stable_audio, mochi, +23
    clip2_deviceCOMBOdefaultDevice for the optional second CLIP/text encoder.

    Outputs (7)

    NameTypeDescription
    modelMODEL—
    model_nameSTRING—
    clipCLIP—
    vaeVAE—
    loaded_infoSTRING—
    clip2CLIP—
    vae2VAE—