Universal MODEL Loader
One Node Instead of Five Loaders — and the Filename You Keep Retyping
- model
- model_name
- clip
- vae
- loaded_info
- clip2
- vae2
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.
checkpointgoes through core'sload_checkpoint_guess_config, so MODEL, CLIP and VAE all come out of one file.diffuserswalksmodels/diffusersfor folders holding amodel_index.json.diffusion_model/unetcalls the coreUNETLoaderwith yourweight_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_unetimportscustom_nodes/ComfyUI-GGUF's node module by file path and uses that pack'sGGMLOpsandgguf_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/unetonly. Leave itdefaultunless 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. Leaveclip_typeonauto.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;defaultsuits almost everyone.clip2_name/vae2_name- defaultnone. 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.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| model_type | COMBO | checkpoint | Choose which backend to load. The browser extension hides irrelevant fields after this selection. |
| checkpoint_name | COMBO | Used when model_type = checkpoint. Returns MODEL, CLIP and VAE. | |
| diffusion_model_name | COMBO | Used when model_type = diffusion_model or unet. Returns MODEL, CLIP and VAE. | |
| diffusers_model_path | COMBO | Used when model_type = diffusers. Folder under models/diffusers containing model_index.json. | |
| gguf_unet_name | COMBO | Used when model_type = gguf_unet. Requires ComfyUI-GGUF. | |
| weight_dtype | COMBO | default | Only used for diffusion_model/unet loading. |
| gguf_dequant_dtype | COMBO | default | Only used for gguf_unet. |
| gguf_patch_dtype | COMBO | default | Only used for gguf_unet. |
| gguf_patch_on_device | BOOLEAN | false | Only used for gguf_unet. |
| clip_name | COMBO | CLIP/text encoder loaded for diffusion_model, unet, and gguf_unet. | |
| clip_type | COMBO | auto | 29 options: auto, stable_diffusion, stable_cascade, sd3, stable_audio, mochi, +23 |
| clip_device | COMBO | default | Device for the loaded CLIP/text encoder. |
| vae_name | COMBO | 1 options: pixel_space | |
| clip2_name | COMBO | none | Optional second CLIP/text encoder output. Select none when only one CLIP is needed. |
| vae2_name | COMBO | none | Optional second VAE output. Select none when only one VAE is needed. |
| clip2_type | COMBO | auto | 29 options: auto, stable_diffusion, stable_cascade, sd3, stable_audio, mochi, +23 |
| clip2_device | COMBO | default | Device for the optional second CLIP/text encoder. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| model_name | STRING | — |
| clip | CLIP | — |
| vae | VAE | — |
| loaded_info | STRING | — |
| clip2 | CLIP | — |
| vae2 | VAE | — |