Model Passthrough
The node that does nothing, on purpose (and why you'll want it)
- model
- model
Model Passthrough takes a MODEL in one side and hands you the exact same MODEL out the other. No quantization, no copy, no transformation - it's a relay. And before you ask "why does that exist," yes, it's a real tool with a real job, and it's one of twelve siblings in this pack that all do the same nothing for different data types (IMAGE, MASK, LATENT, CLIP, VAE, text, ints, floats, booleans, audio). The family is generated from one template, which is why they all behave identically.
So why does a wire-through-a-node earn a place in a practical-tools pack? Because ComfyUI graphs get big, and a plain wire from your checkpoint loader to a distant sampler is a spaghetti noodle you'll spend real time tracing. A passthrough node breaks that wire into two segments and gives the long one a place to turn - exactly like a reroute, but as a typed node you can see and name in the node list. It also gives you a tap point: want to branch your model to a second sampler or an inspector mid-route without dragging a wire across the whole canvas? Run it through a passthrough and branch there.
There's a second, sneakier use. Some downstream nodes are picky about where a value comes from - a forced-input socket, a list wrapper, a stale connection you want to refresh without rebuilding. Sticking a passthrough in the middle forces a clean new connection and, because the passthrough is optional-input driven, it behaves as a documented "this is where the model enters this subgraph" boundary. In the plumbing taxonomy, it's the simplest member of the legibility family: it exists to fight the "can't read my own graph" problem, not to process anything.
How it works
Mechanically there's nothing to it. The model input is MODEL, optional, marked forceInput. The node returns whatever it received, or None if nothing was wired in. One implementation detail that matters: it's declared optional rather than required, so an unwired passthrough won't error - it just passes None downstream. That's the standard first-non-null convention you see across the whole plumbing layer, and it means you can leave a passthrough unhooked while you build without breaking the graph.
The one input, the one output
- model - the only input, type MODEL. Wire it to any checkpoint or model loader, or to a chain of LoRA/model modifications.
- model - the only output, same type. Goes into a KSampler's
modelsocket, an unload node, a model inspection node, anywhere a MODEL is accepted.
How to install it
Part of ComfyUI-Practical-Tools by wenchengxiang. In ComfyUI Manager, search ComfyUI-Practical-Tools, install, restart - or:
cd ComfyUI/custom_nodes
git clone https://github.com/wenchengxiang/ComfyUI-Practical-Tools
No extra dependencies, no model downloads, no keys. The pack is pure Python over torch/Pillow, all of which you already run.
Common issues
The only real footgun is using a passthrough when you needed a switch. A passthrough has no selector - it can't choose between two models, it can only relay the one it's given. If you find yourself wanting "model A or model B," you want an A/B switch node, not this. And if you leave the input unwired, remember the output is None; a sampler fed None will fail loudly downstream, which is ComfyUI's way of telling you the wire was never actually connected.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| modelopt | MODEL | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |