⬡ Polyhedron Switch
The switch that keeps the expensive branch cold until you pick it
- input_1
- value
- index
- label
Most switches in ComfyUI only route data; they still execute everything upstream of them. ⬡ Polyhedron Switch is the version that doesn't. It takes several any-type inputs, routes one to the output, and leaves the rest genuinely cold - the branch you didn't select never runs, so an expensive path can sit in the graph costing exactly nothing until you flip to it.
That's the feature that matters here. Keep two model loaders, two ControlNet chains, or two upscale pipelines parked in one workflow and use the switch's select widget as a radio button. The loser isn't just ignored, it's never evaluated at all, which on a heavy graph is the difference between "flip a number and wait" and "flip a number and wait for the same 40-second pre-pass every time."
How it works
The node leans on two engine mechanics under the hood. First, its inputs are declared with the * wildcard type, so it routes a MODEL, a LATENT, a STRING or anything else without caring what it is. Second, they're lazy: before evaluation ComfyUI asks the node which inputs it actually needs, the node answers "just the one I'm selecting," and the engine only computes that branch. That's the entire trick - cheap on paper, but it's what makes the "unselected branches never execute" promise real instead of decorative.
Two details keep it friendly. The select widget caps itself at the number of inputs you've actually connected, so you can't point it at empty air. And when you fill an input slot, a fresh spare appears, so the node grows to fit the job and no further.
The inputs and outputs that matter
select- which input to route. The widget's the one you'll touch.on_missing- what happens when the selected input is gone (its branch was bypassed or muted). On (default): fall back to the next connected input. Off: emit nothing, so downstream stays cold too. Either way it never errors - handy when you're muting branches to A/B test.input_1,input_2, … - the any-type candidates. Connect one and a new slot appears.value(out) - the selected input, passed through untouched.index(out, INT) - which input was actually used, after any fallback. Wire this to a note or filename if you want to know what won.label(out, STRING) - the slot's label, honoring custom labels you've set on the socket.
Installing it
It ships in the ⬡ Polyhedron Suite pack. Easiest via ComfyUI Manager: search for "Polyhedron Suite" and install. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/PolyhedronAI/ComfyUI-PolyhedronLoRAStack.git
# restart ComfyUI
No extra Python dependencies - the pack runs on what ComfyUI already ships. ComfyUI Manager's "Install Missing Custom Nodes" will also pull it in when a shared workflow references it.
Where people get burned
The usual trap is expecting the unselected branch to error - it never does. If your selected input is bypassed and on_missing is off, the switch silently emits a blocker and the downstream just doesn't run, with a note in the console (⛔ input_2 missing (branch bypassed?) -- blocked). That's a feature, but it reads as "nothing happened" the first time. If the graph goes quiet, check the switch's status line before hunting for a broken node. And if you're using ComfyUI's new Nodes 2.0 (Modern Node Design) renderer and a Polyhedron node looks blank, that's the renderer, not the switch - disable it in Settings; the node's data is unaffected.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| select | INT | 11–999 | Which input to route. The UI caps this at the number of connected inputs. |
| on_missing | BOOLEAN | true | Selected input gone (branch bypassed/muted)? ON: fall back to the next connected input. OFF: emit nothing -- downstream stays cold. Never errors either way. |
| input_1opt | * | Any input. Connect it and a fresh spare slot appears. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| value | * | The selected input, passed through untouched. |
| index | INT | The input index that was actually used (after any fallback). |
| label | STRING | Slot label of the used input (honors custom labels). |