Universal MODEL Loader
The Universal MODEL Loader does what the name promises
- model
- clip
- vae
- loaded_info
- clip2
- vae2
You know the drill: a Flux workflow needs a UNET loader, a CLIP loader, a VAE loader, and then the video workflow needs a different combo, and the diffusers experiment needs yet another. The Universal MODEL Loader is Zoltar358's attempt to replace that pile with one node and a single dropdown up top. Pick the model type and the frontend collapses every widget that doesn't apply - a checkpoint, a diffusers folder, a diffusion model, or a GGUF UNet all load through the same door. It's not a new backend, it's a cleaner front door to the loaders you already run.
Worth knowing before you get attached to the name: "Universal Model Loader" also floats around as a core ComfyUI roadmap item from mid-2025. That's a different thing. This is a standalone custom node pack, and right now it's new enough that you won't find much community chatter about it - judge it on whether the single-loader flow suits you.
How it works
Under the hood it's a thin wrapper over ComfyUI's own loaders. It imports core's nodes.py (carefully aliased so this pack's own nodes.py doesn't collide with ComfyUI's - that was literally a version 1.0.3 bug fix), then calls UNETLoader.load_unet, CLIPLoader.load_clip, VAELoader.load_vae, and comfy.sd.load_checkpoint_guess_config for checkpoints. GGUF mode is the interesting one: it finds your custom_nodes/ComfyUI-GGUF at runtime, builds a GGMLOps with your chosen dequant/patch dtypes, and hands the weights to load_diffusion_model_state_dict. No extra Python dependencies - pyproject.toml lists none, so this is the rare pack that's pure UI plus glue.
The real magic is the frontend. A web/universal_model_loader.js extension hides irrelevant widgets the moment you change model_type, and the CLIP-type logic reads your model's filename and guesses which text encoder it needs - Krea2/KR2, Qwen, Flux.2/FK9, Wan, HiDream, LTXV, SD3, Stable Audio, and a couple dozen more. That auto-guess is the single biggest reason to use this over three hand-wired loaders.
The inputs that matter
model_type- the whole point.checkpoint(frommodels/checkpoints),diffusers(a folder withmodel_index.json),diffusion_model/unet(frommodels/unetormodels/diffusion_models), orgguf_unet. Everything else reshuffles around this.clip_type- defaults toauto, which reads the model filename and picks the right encoder type. Leave it alone unless the guess is wrong.clip2_name/vae2_name- both default tonone. Set them only if your model family genuinely needs a second text encoder or VAE.clip2_typeandclip2_devicestay hidden until you pick a real second CLIP.
The rest you'll meet when you need them: weight_dtype (fp8 options for diffusion/unet loads), the three gguf_* knobs (dequant dtype, patch dtype, patch-on-device - standard city96 controls), and clip_device if you want the text encoder parked on CPU.
Outputs: model (MODEL), clip (CLIP), vae (VAE), then loaded_info - a STRING that summarizes what actually loaded, wire it to a text-display node when something's ambiguous - and optional clip2 and vae2.
Installing it
Via ComfyUI Manager: search ComfyUI-Universal-Model-Loader under Install Custom Nodes, install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Zoltar358-ComfyUI/ComfyUI-Universal-Model-Loader.git
Restart ComfyUI and hard-refresh the browser. No model downloads beyond the checkpoints you already have. GGUF mode needs one extra:
cd ComfyUI/custom_nodes
git clone https://github.com/city96/ComfyUI-GGUF.git
Common gotchas
- A
- none found -in any dropdown means that model folder is empty (or the browser list is stale). The node's own error spells it out: put the file inComfyUI/models/<type>and refresh. - For
diffusion_model,unet, andgguf_unetmodes you must pick the CLIP and VAE here - they don't come baked into the file like a checkpoint does. gguf_unetthrows aRuntimeErrornaming ComfyUI-GGUF if that pack isn't installed. It's an easy miss since the other four modes don't need it.
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 (6)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| clip | CLIP | — |
| vae | VAE | — |
| loaded_info | STRING | — |
| clip2 | CLIP | — |
| vae2 | VAE | — |