Model Parameters Pipe
One node that is your whole checkpoint + sampler setup
- vae_override
- MODEL
- CLIP
- VAE
- steps
- cfg
- sampler_name
- scheduler
- positive_tag
- negative_tag
- params_pipe
In a stock ComfyUI txt2img you build your scene from three or four nodes: a checkpoint loader, a KSampler with steps/CFG/sampler widgets, a text encoder. MultiModel's whole argument is that you can pack all of that into one node and then hand it around as a single wire. ModelParamsPipe is that node - the "Model Parameters Pipe" that gives the pack its name.
It loads a checkpoint and bundles it together with every sampling parameter you'd normally set on a KSampler - steps, CFG, sampler, scheduler - plus your prompt tags, into one PARAMS_PIPE. You build several of these, switch between them, and let the pack's sampler read whichever pipe is live. That's the multi-model workflow in a nutshell: the checkpoint and its settings travel together, so "swap the model" also swaps the sampler preset it shipped with.
The inputs that actually matter
- ckpt_name - dropdown populated from your
ComfyUI/models/checkpointsfolder. No typing, just pick. - steps, cfg, sampler_name, scheduler - these come straight from ComfyUI's own
KSampler.SAMPLERSandSCHEDULERSlists, so the 44 sampler choices and 9 schedulers match exactly what you'd see on the core node. Same names, same behavior. - clip_skip - defaults to -2, which is the setting most SD1.5 users reach for. It's applied to the pipe's CLIP when the node runs, so you don't need a separate ClipSkip node in the chain.
- positive_tag / negative_tag - multiline strings that ride along inside the pipe for the pack's prompt builder to use.
- vae_override (optional) - plug in a VAE and it replaces the checkpoint's baked-in one.
The node also exposes all of that as individual outputs (MODEL, CLIP, VAE, steps, cfg, sampler_name, scheduler, tags) plus the combined params_pipe. So even if you only want the model, you don't need a pipe-and-unpack round trip.
How it works
Under the hood it calls ComfyUI's load_checkpoint_guess_config, clones the CLIP and applies your clip_skip to the clone, swaps in the VAE override if you gave one, then packs everything into a 4-element tuple: (model, clip, vae, params_dict). That tuple is the pipe. It's not some special object you can't inspect - ParamsPipeUnpack exists to pull it apart again.
Why you'd reach for it
Two reasons. First, decluttering: one node replaces a loader plus a pile of sampler widgets, which is the same "Efficiency Nodes" consolidation philosophy the community already loves. Second, A/B testing: build several of these, switch between them with MySwitchIndex or ActiveModel, and the sampler downstream just renders whatever pipe you routed to it. Lock the seed, flip pipes, compare - that's the whole workflow.
One trap: the settings live inside the pipe. If you wire that pipe into a node that isn't from this pack, you'll get a type error. Use ParamsPipeUnpack to get plain values out if you need to feed a stock KSampler instead.
Installing
Search MultiModel in ComfyUI Manager and install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/FaberVS/MultiModel
Then restart ComfyUI. No extra Python dependencies beyond what ComfyUI already ships (the pack imports ComfyUI's own modules plus PyYAML), and no model files to download - it reads whatever's already in your checkpoints folder.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| positive_tag | STRING | — | |
| negative_tag | STRING | — | |
| ckpt_name | COMBO | 0 options: | |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 7.00–100 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| clip_skip | INT | -2-12–0 | — |
| vae_overrideopt | VAE | — |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |
| CLIP | CLIP | — |
| VAE | VAE | — |
| steps | INT | — |
| cfg | FLOAT | — |
| sampler_name | euler,euler_cfg_pp,euler_ancestral,euler_ancestral_cfg_pp,heun,heunpp2,exp_heun_2_x0,exp_heun_2_x0_sde,dpm_2,dpm_2_ancestral,lms,dpm_fast,dpm_adaptive,dpmpp_2s_ancestral,dpmpp_2s_ancestral_cfg_pp,dpmpp_sde,dpmpp_sde_gpu,dpmpp_2m,dpmpp_2m_cfg_pp,dpmpp_2m_sde,dpmpp_2m_sde_gpu,dpmpp_2m_sde_heun,dpmpp_2m_sde_heun_gpu,dpmpp_3m_sde,dpmpp_3m_sde_gpu,ddpm,lcm,ipndm,ipndm_v,deis,res_multistep,res_multistep_cfg_pp,res_multistep_ancestral,res_multistep_ancestral_cfg_pp,gradient_estimation,gradient_estimation_cfg_pp,er_sde,seeds_2,seeds_3,sa_solver,sa_solver_pece,ddim,uni_pc,uni_pc_bh2 | — |
| scheduler | simple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal | — |
| positive_tag | STRING | — |
| negative_tag | STRING | — |
| params_pipe | PARAMS_PIPE | — |