Nodes/comfyui-character-suite/LoRA Stacker (CharacterSuite)
ComfyUI Node

LoRA Stacker (CharacterSuite)

Ten LoRAs, One Node, and It Tells You the Trigger Words

By DrkSun81·Created 2 months ago·Updated 27 days ago· 0
LoRA Stacker (CharacterSuite)
  • model
  • clip
  • model
  • clip
  • trigger_prompt
opt_prompt
lora_1None
strength_model_11.00
strength_clip_11.00
bypass_1false
force_fetch_1false
lora_2None
strength_model_21.00
strength_clip_21.00
bypass_2false
force_fetch_2false
lora_3None
strength_model_31.00
strength_clip_31.00
bypass_3false
force_fetch_3false
lora_4None
strength_model_41.00
strength_clip_41.00
bypass_4false
force_fetch_4false
lora_5None
strength_model_51.00
strength_clip_51.00
bypass_5false
force_fetch_5false
lora_6None
strength_model_61.00
strength_clip_61.00
bypass_6false
force_fetch_6false
lora_7None
strength_model_71.00
strength_clip_71.00
bypass_7false
force_fetch_7false
lora_8None
strength_model_81.00
strength_clip_81.00
bypass_8false
force_fetch_8false
lora_9None
strength_model_91.00
strength_clip_91.00
bypass_9false
force_fetch_9false
lora_10None
strength_model_101.00
strength_clip_101.00
bypass_10false
force_fetch_10false
selected_tags

The LoRA Stacker (CharacterSuite) is the most ambitious node in the comfyui-character-suite pack, because it's the only one that reaches outside your machine. The rest of the suite is pure local text juggling; this one talks to CivitAI to fetch the trigger words for each LoRA you stack, caches them, and shows them to you as clickable chips. Ten LoRA slots in a single node, per-slot bypass, separate model and clip strengths - the whole package.

If you've used rgthree's Power Lora Loader, you know the shape of the thing (the KB's ecosystem material calls it the LoRA-stacking benchmark). The difference here is the trigger-word picker being built in rather than an afterthought in a right-click menu.

Why you'd stack LoRAs at all

Character consistency is a LoRA problem (the KB's character-consistency work is clear: LoRA is the gold standard for a character you'll reuse), but nobody runs just a character LoRA. You want the character LoRA plus a style LoRA plus a detail enhancer, and suddenly you're chaining three loader nodes into each other. This node collapses that into one place with a bypass toggle per slot, so you can A/B whether style_lora is helping by flipping one checkbox instead of rewiring.

How it works

Each lora_N dropdown is populated from your ComfyUI/models/loras folder. Pick one and the node SHA256-hashes the file and queries CivitAI's model-versions/by-hash endpoint for the model's trained trigger words, then caches them in data/loras_tags.json inside the pack folder. A background scan at startup warms the cache for your whole library so the picker doesn't stall the first time you use it. The companion JS widget renders the tags as chips you click to add to your prompt; the selected set lands in selected_tags, which merges with opt_prompt into the trigger_prompt output - wire that into your prompt encoder and your LoRA's trigger word is never forgotten again.

The inputs that matter:

  • model / clip - required, from your checkpoint loader. Feed them in, get them back with LoRAs applied.
  • lora_1lora_10, each with strength_model_N and strength_clip_N (default 1, range −10 to 10) - the model strength bends the diffusion UNet, the clip strength bends the text encoder. Separating them is the whole reason people stack instead of using one combined value: some style LoRAs want clip strength ~0.5 with model strength at 1.
  • bypass_N - flip to skip a slot without deleting your settings.
  • force_fetch_N - force a fresh CivitAI lookup for that slot (the cache normally refreshes on a schedule).

Outputs: model and clip (looped through as many slots as you populated) plus trigger_prompt (STRING).

Installing it

cd ComfyUI/custom_nodes/
git clone https://github.com/DrkSun81/comfyui-character-suite

Restart and it's under CharacterSuite (or ComfyUI Manager → search "character suite"). No pip requirements - stdlib only, and requests is optional; without it the CivitAI call falls back to urllib. Python 3.9+.

Where it gets you

  • Trigger words depend on the hash matching CivitAI. A locally-trained LoRA, or one you renamed, will fetch nothing - the cache then records "we know there are no tags" and won't hammer the API again for days, so you'll be typing those trigger words by hand into selected_tags. That's fine, just know the picker isn't magic.
  • First run per LoRA hits the network. New files trigger a fetch with retries and a 3-day cooldown on failures. If you're offline, it degrades gracefully and keeps whatever's cached - but the tag picker will be empty for anything never fetched before.
  • This is the one network-facing node in the pack. Everything else is local. It only talks to CivitAI's public API for tag lookups, but it's worth knowing which of your nodes phones home, especially if you're the suspicious type about arbitrary Python (and you should be, per the KB's security notes on the ecosystem).
  • The 1.1.1 changelog fixed "None" landing in strength fields - the old build could desync its widgets. If you see a slot refusing to apply, make sure you're on the latest revision.

It's a young node in a young pack (mid-2026, no community track record yet), so treat it as the tool it is: a tidy way to stack a character LoRA, a style LoRA, and a detail LoRA without a wall of nodes - with a built-in cheat sheet for the trigger words you always forget.

CategoryCharacterSuite

Inputs (54)

NameTypeDefaultDescription
modelMODEL
clipCLIP
opt_promptoptSTRING
lora_1optCOMBONone1 options: None
strength_model_1optFLOAT1.00-10–10
strength_clip_1optFLOAT1.00-10–10
bypass_1optBOOLEANfalse
force_fetch_1optBOOLEANfalse
lora_2optCOMBONone1 options: None
strength_model_2optFLOAT1.00-10–10
strength_clip_2optFLOAT1.00-10–10
bypass_2optBOOLEANfalse
force_fetch_2optBOOLEANfalse
lora_3optCOMBONone1 options: None
strength_model_3optFLOAT1.00-10–10
strength_clip_3optFLOAT1.00-10–10
bypass_3optBOOLEANfalse
force_fetch_3optBOOLEANfalse
lora_4optCOMBONone1 options: None
strength_model_4optFLOAT1.00-10–10
strength_clip_4optFLOAT1.00-10–10
bypass_4optBOOLEANfalse
force_fetch_4optBOOLEANfalse
lora_5optCOMBONone1 options: None
strength_model_5optFLOAT1.00-10–10
strength_clip_5optFLOAT1.00-10–10
bypass_5optBOOLEANfalse
force_fetch_5optBOOLEANfalse
lora_6optCOMBONone1 options: None
strength_model_6optFLOAT1.00-10–10
strength_clip_6optFLOAT1.00-10–10
bypass_6optBOOLEANfalse
force_fetch_6optBOOLEANfalse
lora_7optCOMBONone1 options: None
strength_model_7optFLOAT1.00-10–10
strength_clip_7optFLOAT1.00-10–10
bypass_7optBOOLEANfalse
force_fetch_7optBOOLEANfalse
lora_8optCOMBONone1 options: None
strength_model_8optFLOAT1.00-10–10
strength_clip_8optFLOAT1.00-10–10
bypass_8optBOOLEANfalse
force_fetch_8optBOOLEANfalse
lora_9optCOMBONone1 options: None
strength_model_9optFLOAT1.00-10–10
strength_clip_9optFLOAT1.00-10–10
bypass_9optBOOLEANfalse
force_fetch_9optBOOLEANfalse
lora_10optCOMBONone1 options: None
strength_model_10optFLOAT1.00-10–10
strength_clip_10optFLOAT1.00-10–10
bypass_10optBOOLEANfalse
force_fetch_10optBOOLEANfalse
selected_tagsoptSTRING

Outputs (3)

NameTypeDescription
modelMODEL
clipCLIP
trigger_promptSTRING