Nodes/LoRA Optimizer/LoRA Stack (Dynamic)
ComfyUI Node

LoRA Stack (Dynamic)

The node the LoRA Optimizer quick-start actually tells you to use

By ethanfel·Created 5 months ago·Updated 23 days ago· 135
LoRA Stack (Dynamic)
  • lora_stack
  • lora_stack
settings_visibility
input_modedropdown
lora_count3
enabled_1true
lora_name_1
lora_name_text_1None
strength_11.00
model_strength_11.00
clip_strength_11.00
conflict_mode_1all
key_filter_1all
preserve_1false
enabled_2true
lora_name_2
lora_name_text_2None
strength_21.00
model_strength_21.00
clip_strength_21.00
conflict_mode_2all
key_filter_2all
preserve_2false
enabled_3true
lora_name_3
lora_name_text_3None
strength_31.00
model_strength_31.00
clip_strength_31.00
conflict_mode_3all
key_filter_3all
preserve_3false
enabled_4true
lora_name_4
lora_name_text_4None
strength_41.00
model_strength_41.00
clip_strength_41.00
conflict_mode_4all
key_filter_4all
preserve_4false
enabled_5true
lora_name_5
lora_name_text_5None
strength_51.00
model_strength_51.00
clip_strength_51.00
conflict_mode_5all
key_filter_5all
preserve_5false
enabled_6true
lora_name_6
lora_name_text_6None
strength_61.00
model_strength_61.00
clip_strength_61.00
conflict_mode_6all
key_filter_6all
preserve_6false
enabled_7true
lora_name_7
lora_name_text_7None
strength_71.00
model_strength_71.00
clip_strength_71.00
conflict_mode_7all
key_filter_7all
preserve_7false
enabled_8true
lora_name_8
lora_name_text_8None
strength_81.00
model_strength_81.00
clip_strength_81.00
conflict_mode_8all
key_filter_8all
preserve_8false
enabled_9true
lora_name_9
lora_name_text_9None
strength_91.00
model_strength_91.00
clip_strength_91.00
conflict_mode_9all
key_filter_9all
preserve_9false
enabled_10true
lora_name_10
lora_name_text_10None
strength_101.00
model_strength_101.00
clip_strength_101.00
conflict_mode_10all
key_filter_10all
preserve_10false
base_model_filterAll

If you've read the LoRA Optimizer README, this is the node its own quick-start tells you to start with: "Add a LoRA Stack (Dynamic) node - pick your LoRAs, set strengths." It's the pack's main entry point - one node with up to 10 adjustable slots, instead of chaining ten separate LoRAStack nodes together by hand.

What it is and why you'd use it

The plain LoRAStack node holds exactly one LoRA per node; you chain several together for a multi-LoRA stack. LoRAStackDynamic collapses that into a single node with a slider for how many slots you want (1–10), each slot getting its own file picker, strength, and - if you flip on advanced mode - the same per-LoRA conflict controls the plain Stack node has. For anyone building a merge with three, five, or eight LoRAs, this is the one you actually drag onto the canvas.

How it works

Set lora_count to however many LoRAs you're stacking, then fill in each slot. settings_visibility switches between two views: simple shows one strength slider per LoRA (fast, and enough for most merges), advanced splits it into separate model/clip strength plus conflict_mode, key_filter, and preserve per slot - identical semantics to LoRAStack, just repeated across all ten. input_mode controls how you pick files: dropdown browses your LoRA folder normally, text lets you type a filename (or wire in a text node) - useful if you're generating LoRA names programmatically or working from a list.

The inputs and outputs that matter

Per slot (_1 through _10, whichever lora_count exposes):

  • enabled_N - toggle a slot off without deleting it, handy for quick A/B tests.
  • lora_name_N (dropdown mode) or lora_name_text_N (text mode) - which file. Text mode accepts a short name, a full relative path, or None to skip the slot.
  • strength_N (simple) or model_strength_N / clip_strength_N (advanced) - how hard it hits image generation vs. text understanding, separately if you need it.
  • conflict_mode_N / key_filter_N / preserve_N (advanced only) - same options as LoRAStack: force this LoRA to dominate or defer in contested regions, filter which keys it contributes, or protect it as a style LoRA. See the LoRAStack article for the full breakdown of what each option does.

Optional: lora_stack to append even more LoRAs from another Stack node beyond the 10-slot cap, and base_model_filter to filter the dropdown by architecture - but that one only does anything if you also have ComfyUI-Lora-Manager installed; without it the option sits there inert.

Output is a single lora_stack - wire it straight into LoRA Optimizer, LoRA AutoTuner, LoRA Conflict Editor, or the Compatibility Analyzer.

How to install it

Via ComfyUI Manager: search "LoRA Optimizer", install, restart. Manually:

cd ComfyUI/custom_nodes/
git clone https://github.com/ethanfel/ComfyUI-LoRA-Optimizer.git

Restart - nodes appear under loaders. Nothing extra to download; it works on your existing LoRA files.

Common issues & troubleshooting

More than 10 LoRAs. lora_count caps at 10 per node. If you're genuinely stacking more than that (rare, but it happens with combo-testing workflows), chain a second LoRAStack or LoRAStackDynamic node into the lora_stack input rather than trying to force the slider past its max.

base_model_filter does nothing. This is a real dependency gap, not a bug: the filter only works with ComfyUI-Lora-Manager installed alongside this pack. Without it, leave it on All - it won't error, it just won't filter.

A stray enabled toggle is an easy miss. With ten slots' worth of enabled_N checkboxes on one node, it's easy to leave a slot on that you meant to disable for a test - the effect (a style you thought you removed still faintly bleeding through) can be subtle enough to miss on a quick look. Worth a second glance before you conclude the optimizer "isn't listening" to a change you made.

Advanced mode is a lot of widgets. If your canvas is getting cluttered with ten slots' worth of advanced fields, drop back to simple mode for the LoRAs where you're not overriding conflict behavior, and only expand advanced settings on the one or two LoRAs actually causing trouble.

CategoryLoRA Optimizer

Inputs (95)

NameTypeDefaultDescription
settings_visibilityCOMBOSimple: one strength slider per LoRA. Advanced: separate model/clip strength, conflict mode, and key filter per LoRA.
input_modeCOMBOdropdownDropdown: pick LoRAs from a list. Text: type LoRA names or connect text nodes (short names are auto-resolved).
lora_countINT31–10How many LoRA slots to show. Increase to add more LoRAs.
enabled_1BOOLEANtrueEnable or disable LoRA #1 without removing it from the list.
lora_name_1COMBOLoRA #1 — pick a LoRA file or leave as 'None' to skip this slot.
lora_name_text_1STRINGNoneLoRA #1 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections.
strength_1FLOAT1.00-10–10How strongly LoRA #1 affects the output. 1.0 = full effect.
model_strength_1FLOAT1.00-10–10How strongly LoRA #1 affects image generation (visual style, composition).
clip_strength_1FLOAT1.00-10–10How strongly LoRA #1 affects text understanding (prompt interpretation).
conflict_mode_1COMBOallLoRA #1 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees.
key_filter_1COMBOallLoRA #1 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers.
preserve_1BOOLEANfalseMark LoRA #1 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA.
enabled_2BOOLEANtrueEnable or disable LoRA #2 without removing it from the list.
lora_name_2COMBOLoRA #2 — pick a LoRA file or leave as 'None' to skip this slot.
lora_name_text_2STRINGNoneLoRA #2 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections.
strength_2FLOAT1.00-10–10How strongly LoRA #2 affects the output. 1.0 = full effect.
model_strength_2FLOAT1.00-10–10How strongly LoRA #2 affects image generation (visual style, composition).
clip_strength_2FLOAT1.00-10–10How strongly LoRA #2 affects text understanding (prompt interpretation).
conflict_mode_2COMBOallLoRA #2 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees.
key_filter_2COMBOallLoRA #2 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers.
preserve_2BOOLEANfalseMark LoRA #2 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA.
enabled_3BOOLEANtrueEnable or disable LoRA #3 without removing it from the list.
lora_name_3COMBOLoRA #3 — pick a LoRA file or leave as 'None' to skip this slot.
lora_name_text_3STRINGNoneLoRA #3 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections.
strength_3FLOAT1.00-10–10How strongly LoRA #3 affects the output. 1.0 = full effect.
model_strength_3FLOAT1.00-10–10How strongly LoRA #3 affects image generation (visual style, composition).
clip_strength_3FLOAT1.00-10–10How strongly LoRA #3 affects text understanding (prompt interpretation).
conflict_mode_3COMBOallLoRA #3 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees.
key_filter_3COMBOallLoRA #3 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers.
preserve_3BOOLEANfalseMark LoRA #3 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA.
enabled_4BOOLEANtrueEnable or disable LoRA #4 without removing it from the list.
lora_name_4COMBOLoRA #4 — pick a LoRA file or leave as 'None' to skip this slot.
lora_name_text_4STRINGNoneLoRA #4 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections.
strength_4FLOAT1.00-10–10How strongly LoRA #4 affects the output. 1.0 = full effect.
model_strength_4FLOAT1.00-10–10How strongly LoRA #4 affects image generation (visual style, composition).
clip_strength_4FLOAT1.00-10–10How strongly LoRA #4 affects text understanding (prompt interpretation).
conflict_mode_4COMBOallLoRA #4 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees.
key_filter_4COMBOallLoRA #4 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers.
preserve_4BOOLEANfalseMark LoRA #4 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA.
enabled_5BOOLEANtrueEnable or disable LoRA #5 without removing it from the list.
lora_name_5COMBOLoRA #5 — pick a LoRA file or leave as 'None' to skip this slot.
lora_name_text_5STRINGNoneLoRA #5 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections.
strength_5FLOAT1.00-10–10How strongly LoRA #5 affects the output. 1.0 = full effect.
model_strength_5FLOAT1.00-10–10How strongly LoRA #5 affects image generation (visual style, composition).
clip_strength_5FLOAT1.00-10–10How strongly LoRA #5 affects text understanding (prompt interpretation).
conflict_mode_5COMBOallLoRA #5 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees.
key_filter_5COMBOallLoRA #5 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers.
preserve_5BOOLEANfalseMark LoRA #5 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA.
enabled_6BOOLEANtrueEnable or disable LoRA #6 without removing it from the list.
lora_name_6COMBOLoRA #6 — pick a LoRA file or leave as 'None' to skip this slot.
lora_name_text_6STRINGNoneLoRA #6 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections.
strength_6FLOAT1.00-10–10How strongly LoRA #6 affects the output. 1.0 = full effect.
model_strength_6FLOAT1.00-10–10How strongly LoRA #6 affects image generation (visual style, composition).
clip_strength_6FLOAT1.00-10–10How strongly LoRA #6 affects text understanding (prompt interpretation).
conflict_mode_6COMBOallLoRA #6 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees.
key_filter_6COMBOallLoRA #6 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers.
preserve_6BOOLEANfalseMark LoRA #6 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA.
enabled_7BOOLEANtrueEnable or disable LoRA #7 without removing it from the list.
lora_name_7COMBOLoRA #7 — pick a LoRA file or leave as 'None' to skip this slot.
lora_name_text_7STRINGNoneLoRA #7 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections.
strength_7FLOAT1.00-10–10How strongly LoRA #7 affects the output. 1.0 = full effect.
model_strength_7FLOAT1.00-10–10How strongly LoRA #7 affects image generation (visual style, composition).
clip_strength_7FLOAT1.00-10–10How strongly LoRA #7 affects text understanding (prompt interpretation).
conflict_mode_7COMBOallLoRA #7 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees.
key_filter_7COMBOallLoRA #7 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers.
preserve_7BOOLEANfalseMark LoRA #7 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA.
enabled_8BOOLEANtrueEnable or disable LoRA #8 without removing it from the list.
lora_name_8COMBOLoRA #8 — pick a LoRA file or leave as 'None' to skip this slot.
lora_name_text_8STRINGNoneLoRA #8 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections.
strength_8FLOAT1.00-10–10How strongly LoRA #8 affects the output. 1.0 = full effect.
model_strength_8FLOAT1.00-10–10How strongly LoRA #8 affects image generation (visual style, composition).
clip_strength_8FLOAT1.00-10–10How strongly LoRA #8 affects text understanding (prompt interpretation).
conflict_mode_8COMBOallLoRA #8 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees.
key_filter_8COMBOallLoRA #8 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers.
preserve_8BOOLEANfalseMark LoRA #8 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA.
enabled_9BOOLEANtrueEnable or disable LoRA #9 without removing it from the list.
lora_name_9COMBOLoRA #9 — pick a LoRA file or leave as 'None' to skip this slot.
lora_name_text_9STRINGNoneLoRA #9 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections.
strength_9FLOAT1.00-10–10How strongly LoRA #9 affects the output. 1.0 = full effect.
model_strength_9FLOAT1.00-10–10How strongly LoRA #9 affects image generation (visual style, composition).
clip_strength_9FLOAT1.00-10–10How strongly LoRA #9 affects text understanding (prompt interpretation).
conflict_mode_9COMBOallLoRA #9 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees.
key_filter_9COMBOallLoRA #9 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers.
preserve_9BOOLEANfalseMark LoRA #9 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA.
enabled_10BOOLEANtrueEnable or disable LoRA #10 without removing it from the list.
lora_name_10COMBOLoRA #10 — pick a LoRA file or leave as 'None' to skip this slot.
lora_name_text_10STRINGNoneLoRA #10 — type a LoRA filename (without extension or path), a full relative path, or 'None' to skip. Accepts text node connections.
strength_10FLOAT1.00-10–10How strongly LoRA #10 affects the output. 1.0 = full effect.
model_strength_10FLOAT1.00-10–10How strongly LoRA #10 affects image generation (visual style, composition).
clip_strength_10FLOAT1.00-10–10How strongly LoRA #10 affects text understanding (prompt interpretation).
conflict_mode_10COMBOallLoRA #10 conflict filter. 'all': apply everywhere (default). 'low_conflict': only where this LoRA agrees with the majority. 'high_conflict': only where this LoRA disagrees.
key_filter_10COMBOallLoRA #10 key filter. 'all': contribute all keys (default). 'shared_only': only keys present in 2+ LoRAs. 'unique_only': only keys present in exactly 1 LoRA. 'audio_only': only audio layers (LTX-2 / ACE-Step). 'no_audio': only non-audio (video) layers.
preserve_10BOOLEANfalseMark LoRA #10 as a STYLE LoRA to protect it in conflict merges. When on, it is never trimmed by sparsification and is exempt from TIES sign-election (which deletes a style's minority-sign direction) — its full contribution is added on top of the conflict-resolved merge. Use when a style LoRA keeps disappearing when merged with a content LoRA.
lora_stackoptLORA_STACKConnect another LoRA Stack node here to add even more LoRAs to the list.
base_model_filteroptCOMBOAllFilter LoRA dropdowns by base model type (dropdown mode only). Requires ComfyUI-Lora-Manager installed.

Outputs (1)

NameTypeDescription
lora_stackLORA_STACK