SIGMAS Router
Swap sigma curves without re-dragging a wire
- SIGMAS
What it is
A manually switched selector for SIGMAS: N inputs, one output, and an integer saying which input wins. No auto-detection, no "best schedule" logic, no cleverness.
Which sounds pointless until you've spent an evening swapping scheduler nodes in and out of a SamplerCustomAdvanced graph. The noise schedule is the fastest-moving variable in a 2026 workflow - stock BasicScheduler, the simple preset, a RES4LYF curve, an 8-step Sigmaboy profile, a 16-step one - and each swap is the same chore: delete a wire here, drag one there, hope you didn't reconnect the guider to the wrong socket. The router turns that into one number. Wire every candidate curve into a port, park the router between them and the sampler, then flip active_channel from 1 to 3 and hit queue.
This is the A/B switch shape from the plumbing layer of ComfyUI, the same idea as rgthree's Any Switch, with two differences worth knowing: it's strictly typed SIGMAS (so you can't accidentally route a MODEL through it), and its port count is dynamic instead of fixed at two.
How it works
The schema only declares two widgets: inputcount and active_channel. Everything else is built in the browser.
web/sigmas_router.js adds input sockets named sigmas_1, sigmas_2, … up to the count you asked for, plus an "Update inputs" button. On the backend, the node's execute doesn't declare those sockets at all - it sweeps the runtime keyword arguments for anything starting with sigmas_, parses the trailing integer, and looks up whichever index matches active_channel. If there's a value there, it passes it straight through. If there isn't, it prints [SigmasRouter] Channel 3 has no SIGMAS connected! to the console and returns None.
Two consequences follow from that design, and both are the sort of thing you learn by being bitten:
- Lowering
inputcountremoves ports from the end of the node, and any wires on those ports go with them. Bump the count back up and you're reconnecting by hand. Decide your port count before you patch. active_channelis validated as 1–30 against the schema, not againstinputcount. So you can absolutely set channel 12 on a six-port node; you just get the empty-channel message and a dead sampler downstream.
Inputs and output
inputcount (6–30) sets how many ports you get. Change it, then click Update inputs - the tooltip says so plainly because the rebuild doesn't always fire on its own, especially when you type the value instead of clicking the arrows.
active_channel (1–30) is the selector. It's a plain integer widget, so it can be converted to an input and driven from a PrimitiveInt if you want one authoritative switch fanned across several routers.
The output is one SIGMAS socket. Wire it into SamplerCustom or SamplerCustomAdvanced - the same place you'd normally put BasicScheduler. Note that it passes schedules, not steps: the step count still comes from the length of the array that wins, so routing between an 8-value and a 17-value curve changes the number of steps your sampler runs. That's a feature for A/B testing and a foot-gun for anything you queue on autopilot.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Rimor-dev/ComfyUI-Sigmaboy
Restart ComfyUI. Or search Sigmaboy in ComfyUI Manager - the router ships in the same pack as the two Sigmaboy nodes, so installing them gets you this anyway. No requirements.txt, no pip dependencies, no models. It lands under Rimor_dev/utilities.
Where it bites
You only see the two widgets, no ports. The ports are frontend JavaScript, so if web/sigmas_router.js didn't load - stale browser cache, ComfyUI updated under you, or you copy-pasted the .py file out of the repo instead of cloning it - you get an empty node. Hard-refresh, then restart.
The sampler errors right after the router. The router itself returns None quietly; it's the downstream consumer that complains. Check the console for the "has no SIGMAS connected" line before troubleshooting anything else - nine times out of ten the selector points at a port you left empty.
It works on your machine and breaks on a friend's. The dynamic ports aren't in the node's declared schema, so an API-format prompt has to reference them by name (sigmas_1, sigmas_2, …) explicitly. A graph saved from the UI is fine; anything you generate headlessly against this node needs to know the naming convention.
You flipped the channel and the image changed more than expected. You also changed step count, if the two curves had different lengths. Two schedules of the same length compare cleanly; two different lengths compare samplers, step budgets and schedules all at once.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| inputcount | INT | 66–30 | Number of input ports (6-30). Click 'Update inputs' to apply. |
| active_channel | INT | 11–30 | Which input to pass through (1-N) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SIGMAS | SIGMAS | — |