IO Checkpoint Loader
The escape hatch when a PIPE is too clever for the node you need
- pipe
- model
- clip
- vae
- audio_vae
- latent
- sampler_name
- scheduler
- sigmas
- pipe
- model
- clip
- vae
- audio_vae
- latent
- steps
- cfg
- sampler_name
- scheduler
- flux_guidance
- clip_skip
- width
- height
- batch_size
- model_name
- vae_name
- lora_names
- seed
- denoise
- sigmas
A pipe is great until you hit the one node that wants a plain MODEL socket. IO Checkpoint Loader [SML2] is the adapter: feed it a PIPE, get back every field inside it as an individual output - and, going the other way, push new values in and get an updated pipe out.
Why you'd reach for it
Every pack that invented a context bus had to ship an unpacker, because third-party nodes can't read your dict. rgthree calls it an exploder; here it's this. You'll use it in three situations:
- You need
modelfor a node that predates pipes - a ControlNet applier, a PuLID node,CFGGuiderfor a custom sampler. - You need
sigmasforSamplerCustomAdvanced, which is the only sanctioned way to use an explicit schedule in this pack. - You want to override one value without rebuilding the loader - splice a different latent, force 20 steps, hand-write the seed.
How it works
It's a merge node wearing an unpacker's clothes. The pipe input arrives, then every direct input you connect wins over the pipe's copy of that field, and the result goes out both as a new pipe and as 21 individual outputs. Sockets come in stable order - pipe, model, clip, vae, audio_vae, latent, steps, cfg, sampler_name, scheduler, flux_guidance, clip_skip, width, height, batch_size, model_name, vae_name, lora_names, seed, denoise, and finally sigmas - so existing links don't shuffle when the pack updates. Missing values come out as None rather than blowing up.
Two behaviours worth knowing precisely. When width and height are absent, a latent supplies them using its own spatial downscale ratio (8 by default), so an SDXL latent implies 1024×1024 without you setting anything. And sigmas sits last, after denoise: connect a SIGMAS from the Qwen Image 2.1 Scheduler - or any compatible scheduler - and it overrides the pipe's schedule while being stored in the returned pipe. That ordering is a compatibility promise, not an accident.
Inputs that actually get used
All inputs are optional; that's the point. In practice you connect four things:
pipe- the loader's output (or another IO node's, or the sampler's returned pipe).model- when you're branching to a non-pipe node.sigmas- for the custom-sampler route.latent- when you want to override the loader's latent with something you built elsewhere, e.g. the target latent from Text Encode Qwen Image 2.1.
The typed scalars (steps, cfg, denoise, clip_skip, flux_guidance, seed) are the ones people convert from widgets downstream. Handy wiring: run steps and denoise from here into the Qwen Image 2.1 Scheduler, because that scheduler does not read steps out of an incoming pipe - it only takes them from its own widgets or from a live wire.
Wiring it to a custom sampler
The canonical example from the pack's own guide:
Smart Model Loader PIPE → Qwen Image 2.1 Scheduler PIPE → IO Checkpoint Loader
├─ model → CFGGuider
├─ latent → SamplerCustomAdvanced.latent_image
└─ sigmas → SamplerCustomAdvanced.sigmas
That's how you get Flux guidance applied too, incidentally: flux_guidance lives in the pipe as a number, and KSampler Pipe deliberately does not apply it. Pull it out here, feed a FluxGuidance node, and send that conditioning to the sampler.
Installing it
Same pack, one install. From ComfyUI Manager search Smart Model Loader Nova, or:
cd ComfyUI/custom_nodes
git clone https://github.com/r-vage/ComfyUI_SmartModelLoader_Nova.git
cd ComfyUI_SmartModelLoader_Nova
python -m pip install -r requirements.txt
Use ComfyUI's Python environment and restart afterwards. Everything in this pack shares the optional Nunchaku/PuLID dependencies, but this node needs none of them - plain checkpoint workflows are covered by the base requirements.
Where people get burned
The stale-pipe trap is the real one. Because the returned pipe carries everything, it's easy to unpack a model from a pipe assembled before your LoRA applier ran, and quietly sample the base weights. The wire is connected; the contents are wrong. With a pipe you can't see that by looking, which is exactly the debugging cost the plumbing layer trades for tidiness.
Don't assume the pipe has what you want. Pull sampler_name and scheduler and you get None if the loader's Sampler section was disabled - outputs are * wildcards in the schema, so nothing complains until something downstream fails.
Rename nothing. The node's ID is IO Checkpoint Loader [SML2]; if a workflow references the original pack's IO Checkpoint Loader without the suffix, it belongs to that pack, not this one, and installing Nova won't satisfy it.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| pipeopt | PIPE | Optional input for 'pipe'. | |
| modelopt | MODEL | Optional input for 'model'. | |
| clipopt | CLIP | Optional input for 'clip'. | |
| vaeopt | VAE | Optional input for 'vae'. | |
| audio_vaeopt | VAE | Optional input for 'audio_vae'. | |
| latentopt | LATENT | Optional input for 'latent'. | |
| stepsopt | INT | Optional input for 'steps'. | |
| cfgopt | FLOAT | Optional input for 'cfg'. | |
| sampler_nameopt | * | Optional input for 'sampler_name'. | |
| scheduleropt | * | Optional input for 'scheduler'. | |
| flux_guidanceopt | FLOAT | Optional input for 'flux_guidance'. | |
| clip_skipopt | INT | Optional input for 'clip_skip'. | |
| widthopt | INT | Optional input for 'width'. | |
| heightopt | INT | Optional input for 'height'. | |
| batch_sizeopt | INT | Optional input for 'batch_size'. | |
| model_nameopt | STRING | Optional input for 'model_name'. | |
| vae_nameopt | STRING | Optional input for 'vae_name'. | |
| lora_namesopt | STRING | Optional input for 'lora_names'. | |
| seedopt | INT | Optional input for 'seed'. | |
| denoiseopt | FLOAT | Optional input for 'denoise'. | |
| sigmasopt | SIGMAS | Optional input for 'sigmas'. |
Outputs (21)
| Name | Type | Description |
|---|---|---|
| pipe | PIPE | — |
| model | MODEL | — |
| clip | CLIP | — |
| vae | VAE | — |
| audio_vae | VAE | — |
| latent | LATENT | — |
| steps | INT | — |
| cfg | FLOAT | — |
| sampler_name | * | — |
| scheduler | * | — |
| flux_guidance | FLOAT | — |
| clip_skip | INT | — |
| width | INT | — |
| height | INT | — |
| batch_size | INT | — |
| model_name | STRING | — |
| vae_name | STRING | — |
| lora_names | STRING | — |
| seed | INT | — |
| denoise | FLOAT | — |
| sigmas | SIGMAS | — |