IO Checkpoint Loader
Unpack, override, and merge the pipe
- pipe
- model
- clip
- vae
- audio_vae
- latent
- sampler_name
- scheduler
- 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
The pipe-first style is great until you need a value out of the pipe - or you need to change one thing mid-chain without rebuilding the whole bundle. IO Checkpoint Loader [Eclipse] is the valve that sits on that pipe. It takes an incoming PIPE plus a pile of optional direct inputs, merges them, and pushes the result back out in two forms: a new merged PIPE, and every field on its own individual socket.
It's the unpacker and the overrider in one. The merge rule is simple and worth internalizing: direct inputs win; the pipe fills in anything you didn't connect. Wire a model in and it replaces the pipe's model; leave it unwired and the pipe's value flows through. If a value is missing from both, that output is None - the node doesn't invent anything. One detail from the source: if width/height are absent but a latent is present, it derives dimensions from the latent's spatial downscale ratio (8 by default), so you don't need dimension wires for simple resolution math.
The inputs
The pipe input plus up to 19 optional direct values: model, clip, vae, audio_vae (the LTXV/LTX2 extra, slotted right after vae), latent, steps, cfg, sampler_name, scheduler, flux_guidance, clip_skip, width, height, batch_size, model_name, vae_name, lora_names, seed, denoise. sampler_name and scheduler are * (any-type) sockets so they'll accept a string from anywhere.
The outputs
All twenty, in stable order: the merged pipe first, then model, clip, vae, audio_vae, latent, the sampler fields (steps, cfg, sampler_name, scheduler, flux_guidance, clip_skip), the dimensions (width, height, batch_size), the names (model_name, vae_name, lora_names), and seed/denoise. Socket order is locked for workflow compatibility - saved graphs reload with the same layout, no re-wiring.
That flat mirror of every pipe key is the real feature. Wire the pipe from your Smart Model Loader in here, then drag individual outputs to a KSampler, a CLIP Text Encode, a VAE Decode, and a Save Image metadata field - without ever pulling the bundle apart manually. Or use it mid-graph to override one field (say, steps from a UI control) while the rest of the pipe flows through untouched.
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/r-vage/ComfyUI_SmartModelLoader.git
cd ComfyUI_SmartModelLoader
python -m pip install -r requirements.txt
or ComfyUI Manager → ComfyUI Smart Model Loader, restart. It's part of the pack, so no separate install.
Common issues
- Output is None when you expected a value - you didn't connect that input and the pipe didn't carry it. Check the upstream loader actually emitted it (e.g.
vaeis only in the pipe if a VAE chip/source was active). - "Why did my override not stick?" - the override only applies if the direct input is actually connected. An unwired socket silently passes the pipe value through.
- Video pipeline missing audio - you need the
audio_vaeoutput specifically; it's the LTXV/LTX2 socket, and it only carries a value if the pipe has one.
Inputs (20)
| 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'. |
Outputs (20)
| 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 | — |