Dragos Character Selector
A checkpoint switch wearing a character-builder name
- model_1
- clip_1
- model_base
- clip_base
- model
- clip
The rest of the Dragos Scene Builder pack builds JSON scene descriptions and hands them to an LLM to turn into a prompt. This node does none of that. Despite the name, Dragos Character Selector doesn't select characters - it selects a checkpoint. Feed it several MODEL/CLIP pairs, tick one boolean, and the ticked pair comes out the other side - no re-dragging your sampler cable to swap between two checkpoints.
Why you'd want this
Every workflow carries an implicit assumption: the checkpoint, the VAE, the prompt style and the negative all belong together. Prompting the wrong encoder is the single largest source of bad results in 2026 - sentences on Illustrious, SDXL tag habits on a Qwen-encoded model (prompt-engineering.md § Common mistakes). So with two checkpoints loaded, what you want is to flip the whole branch at once.
This node covers the model-and-text-encoder half of that flip. In the plumbing taxonomy it's an A/B switch: an explicit selector picks a branch, unlike a fallback switch that takes the first non-empty input (comfyui-node-plumbing.md § Any-type, switch, and logic nodes). Unlike a generic switch it's typed - MODEL in one socket, CLIP in the other - so you can't route a latent into a sampler by accident.
How it works, per the source
The class declares model_1, clip_1 and bool_1 as optional inputs, then model_base and clip_base deliberately last so the fallback pair stays at the bottom of the node. The frontend creates further model_N / clip_N / bool_N triples as you fill them, compacts finished pairs toward slot 1, and leaves exactly one spare pair at the end. It hand-builds the boolean widgets too, since ComfyUI won't make one for an input added after registration.
At execution, select() walks slots in strict numerical order and returns the first pair where the boolean is true and both the model and the clip are connected. If nothing qualifies, it returns model_base and clip_base.
Two consequences. First true wins - tick two booleans and slot 1 wins silently. And a half-wired pair is skipped: a ticked boolean over a pair with only one socket connected falls through to the base as if the tick weren't there. Neither throws an error; you just get the wrong checkpoint, which is the kind of bug you chase through your prompt for twenty minutes.
Inputs, outputs, what to wire where
The only things you set are the booleans.
model_1/clip_1- the first switchable pair. Later pairs appear as you connect them.model_base/clip_base- the fallback. Wire this. If no boolean is true and the base is empty, both outputs are empty and the sampler fails downstream in the usual unhelpful way.- Outputs
modelandclip.modelgoes to your sampler (or a model-patching chain in front of it);clipgoes to bothCLIPTextEncodenodes.
Two things it can't do for you. It checks "not None", not "these belong together", so a model from checkpoint A with a clip from checkpoint B is a mismatched pair it passes through happily - give each slot both sockets from the same loader. And it won't keep a checkpoint off your card: both loaders still execute, because the switch changes what feeds the sampler, not what loads. Bypassing the unused branch's loader does work - an absent output means that slot gets skipped.
Installing it
No dependencies worth mentioning: there's no requirements.txt, and the backend is stdlib json/os/re plus a few JS files.
Via ComfyUI Manager, search for Dragos Scene Builder. By hand:
cd ComfyUI/custom_nodes
git clone https://github.com/drago87/Dragos-SceneBuilder
Restart ComfyUI, then hard-refresh the browser tab - the dynamic sockets live in frontend JS, and a stale cache is the classic reason a fresh install shows up with only its first pair.
The selector downloads no models. For the rest of the pack's JSON-to-prompt step the README suggests a small local GGUF chat model over a hosted API, since those prompts permit NSFW (llm-in-comfyui.md § The local-vs-API decision).
Traps and troubleshooting
The half-wired pair gets eaten. A pair only counts as complete when both sockets are linked, so the normaliser disconnects half-connected slots and compacts the rest. Wire a slot's model and clip together in one go.
Nothing happens when you tick the box. Check the pair's other socket, then check whether a boolean higher up is already true.
The extra pairs aren't there, or don't stay. These sockets are managed by the pack's JS, so a cached frontend gets you only the sockets in the class definition. This is also the category of pack most exposed to ComfyUI's Nodes 2.0 rewrite, which broke widely-installed packs that manipulate sockets in JavaScript (comfyui-ecosystem.md § Nodes 2.0). Resizing the node, or reloading on the legacy canvas, is the usual workaround.
Expect no support net. This is a single-author hobby pack with essentially no Reddit footprint, so there's no thread to search when something misbehaves. The source is one Python file and one JS file, and it outranks the README where they disagree - worth skimming, since custom nodes execute on import with no sandbox (comfyui-ecosystem.md § The Security Incident).
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| model_1opt | MODEL | — | |
| clip_1opt | CLIP | — | |
| bool_1opt | BOOLEAN | false | — |
| model_baseopt | MODEL | — | |
| clip_baseopt | CLIP | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| clip | CLIP | — |