Random LoRA Selector
Re-roll your LoRA picks until one lands
- lora_stack
- lora_stack
- trigger_words
- help_text
This is the flagship node of the Santodan pack, and the thing most people land here for: pick up to ten LoRAs from dropdowns, and it randomly decides which of them actually get applied and at what strength, every run. It's the difference between manually toggling weights on a test and saying "surprise me" until one combination looks right.
The name on comfy.icu is "Random LoRA Selector" - don't confuse it with the "to Model Selector" twin (RandomLoRACustomModel). Same idea, one key difference: this one outputs a lora_stack, it does not apply the LoRAs itself. That's a deliberate design, and it matters for your wiring.
How it works
The node seeds Python's RNG from a hash of your parameters. With refresh_loras off, the same exclusive_mode + stride + lora_count combo reproduces the same selection run after run - good when you want a stable starting point. Flip refresh_loras on and it reseeds from the system clock, so every queue run re-rolls the dice. An IS_CHANGED hook forces the node to actually re-execute rather than skip on cached output.
For each picked LoRA, the strength is drawn uniformly between that slot's min_strength and max_strength. Trigger words are read from your LoRA files' CivitAI metadata (sha256 lookup, cached to a db.json in the pack folder), so the trigger_words output hands you the trained words to append to your prompt - no more wondering why the LoRA "isn't working" because its trigger word was never in the prompt.
The inputs that matter
You don't need to touch all forty. Realistically:
lora_name_1…lora_name_10- the pool. Set the ones you want in the gamble.min_strength_x/max_strength_x- the range each LoRA's strength rolls within (default 0.6–1.0).exclusive_mode-Onpicks exactly one LoRA;Offpicks a random number of them.lora_count- how many to pick when not exclusive.0means "random count."refresh_loras- set True when you actually want a new roll.stride- read the fine print: the help text literally says "currently ignored." The README calls it "not currently enforced." Don't set expectations on it.
Outputs: lora_stack (list of (name, strength, strength) tuples), trigger_words, and help_text (a built-in explainer of every setting - wire it to a text viewer and keep it as a cheat sheet).
The wiring gotcha
lora_stack is the LoRA-stack format, which ComfyUI's built-in LoraLoader doesn't consume. You need CR Apply LoRA Stack from Suzie1's Comfyroll pack (ComfyUI_Comfyroll_CustomNodes) to actually apply the stack to your model - the README says so explicitly and the author repeats it in his announcement thread. The optional lora_stack input is there so you can chain several selector nodes together into one bigger stack.
One honest warning from the author himself: in the original announcement thread he admitted the node "is adding all the node's entries instead of only the one that was selected" in its output - the applied list can show slots you didn't win. The folder-based selector behaves correctly; treat this one's listing with a little suspicion and check trigger_words against what you actually rolled.
Install
ComfyUI Manager (search "Santodan" or "Randomize LoRAs"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/Santodan/santodan-custom-nodes-comfyui
Then restart. Zero Python dependencies (the pack's requirements.txt is all comments) and no model downloads - it reads whatever's already in your models/loras folder. First run after adding a LoRA will hit the CivitAI API once per file to grab trigger words, so expect a brief stall if your library is huge and uncached.
Inputs (36)
| Name | Type | Default | Description |
|---|---|---|---|
| refresh_loras | BOOLEAN | false | — |
| exclusive_mode | COMBO | 2 options: Off, On | |
| stride | INT | 11–1000 | — |
| lora_count | INT | 00–10 | — |
| lora_name_1 | COMBO | 1 options: None | |
| min_strength_1 | FLOAT | 0.60-10–10 | — |
| max_strength_1 | FLOAT | 1.00-10–10 | — |
| lora_name_2 | COMBO | 1 options: None | |
| min_strength_2 | FLOAT | 0.60-10–10 | — |
| max_strength_2 | FLOAT | 1.00-10–10 | — |
| lora_name_3 | COMBO | 1 options: None | |
| min_strength_3 | FLOAT | 0.60-10–10 | — |
| max_strength_3 | FLOAT | 1.00-10–10 | — |
| lora_name_4 | COMBO | 1 options: None | |
| min_strength_4 | FLOAT | 0.60-10–10 | — |
| max_strength_4 | FLOAT | 1.00-10–10 | — |
| lora_name_5 | COMBO | 1 options: None | |
| min_strength_5 | FLOAT | 0.60-10–10 | — |
| max_strength_5 | FLOAT | 1.00-10–10 | — |
| lora_name_6 | COMBO | 1 options: None | |
| min_strength_6 | FLOAT | 0.60-10–10 | — |
| max_strength_6 | FLOAT | 1.00-10–10 | — |
| lora_name_7 | COMBO | 1 options: None | |
| min_strength_7 | FLOAT | 0.60-10–10 | — |
| max_strength_7 | FLOAT | 1.00-10–10 | — |
| lora_name_8 | COMBO | 1 options: None | |
| min_strength_8 | FLOAT | 0.60-10–10 | — |
| max_strength_8 | FLOAT | 1.00-10–10 | — |
| lora_name_9 | COMBO | 1 options: None | |
| min_strength_9 | FLOAT | 0.60-10–10 | — |
| max_strength_9 | FLOAT | 1.00-10–10 | — |
| lora_name_10 | COMBO | 1 options: None | |
| min_strength_10 | FLOAT | 0.60-10–10 | — |
| max_strength_10 | FLOAT | 1.00-10–10 | — |
| lora_stackopt | LORA_STACK | — | |
| extra_trigger_wordsopt | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| lora_stack | LORA_STACK | — |
| trigger_words | STRING | — |
| help_text | STRING | — |