Required Model (obvpm)
The node that refuses to queue instead of failing quietly
- input
- model
ComfyUI's failure modes come in two flavours, and the worse one is the delayed error. You queue, wait ninety seconds, and then get a message from a node forty links downstream that a MODEL was None, or (equally annoying) no message at all and a workflow that runs to completion having generated nothing. Model loaders are the most common source, because a checkpoint you forgot to wire up is invisible on a canvas that's already busy.
Required Model (obvpm) is the smallest node in the pack, and it exists purely to move that error earlier. It takes a MODEL and passes it through. The input is required, so the graph refuses to queue with nothing connected - the error lands on this node, at the top of the graph, where you can see the empty socket.
Inputs and output
input- required MODEL. The model to pass through.model- the model passed through.
That's it. No settings, no boolean, no outputs to think about. If you've been around other gate nodes you're looking for the on_empty toggle - there isn't one, because the whole design is that an empty input is a queue-time error rather than something to route around.
It's the deliberate counterpart to the pack's Optional family (Optional Image / Audio / Latent / Any), which all take an optional input and offer a mute-or-bypass decision for missing values. This one is the "no, really, this must exist" version.
Where it belongs
At the head of the model chain. Checkpoint Loader → Required Model → everything else. Now the checkpoint is a named, visible step instead of a wire you can miss.
On the join between two pipelines. The Lazy Switch family and the optional gates can route None around a graph quite happily. If the thing arriving downstream is supposed to be a real model, put this node on the wire and let it be strict: values that should never be absent become loud failures at a place you can reason about.
As documentation. Two of these on a graph say "these two inputs are mandatory" faster and more honestly than a group title does. When a fan of optional branches feeds one consumer, this node is the line between "might not be there" and "must be".
There's one behavioural subtlety from the source: if the node is handed a None at runtime, it returns an ExecutionBlocker, which skips everything downstream silently rather than raising a stack trace mid-run. So the "loud" part is the queue-time check on the missing socket; the runtime path stays consistent with the rest of the pack's gating behaviour.
Install
ComfyUI Manager → search comfyui-obvpm, or:
cd ComfyUI/custom_nodes
git clone https://github.com/chanon/comfyui-obvpm
Restart ComfyUI. It appears under obvpm/gates; a node-menu search for obvpm lists the whole pack, which is quicker than remembering the category. No Python dependencies, nothing to download - the pack declares none on purpose. All class ids picked up the (obvpm) suffix in 0.2.0 after a collision with another pack's Bundle node, and pre-0.2.0 workflows migrate automatically when opened.
Is it worth a node?
Honestly? For a two-node test workflow, this is overkill - you'd see the empty socket. It earns its place in the graphs people actually run: big reference-image pipelines, LoRA stacks, video workflows with three model loaders, or anything assembled from someone else's template where you can't see the far end of the wire. A model that fails to load is one of the most expensive classes of mistake in terms of wall-clock time, and this is a two-second node that makes it a two-second mistake instead.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| input | MODEL | The model to pass through. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | The model passed through. |