🎨 Easy LoRA Merger
Merge Up to Three LoRAs in One Go
- model
- clip
- lora_data_a
- lora_data_b
- lora_data_c
- lora
- model
- clip
- output_path
- forensic_report
This is the flagship - the display name, "Easy LoRA Merger," is the pack's name, and it's the node the author built the whole thing around. It merges two or three LoRAs into one and applies the result to a model in a single node. Instead of the usual "stack three LoRA Loaders at different weights and hope" approach, you get a merged adapter that behaves like one LoRA.
The origin story explains why it exists. The author (Terpentinas) built it after failing to merge a Musubi-tuner LoRA with an AI-Toolkit one for Flux Klein 4B - every existing merger choked on the trainer mismatch. So the whole pack is built around one hard problem: merging LoRAs that don't share a trainer, a rank, or even an architecture.
How it works
At the base, it's the same weighted-combination math as any merger - method defaults to linear, and for LoRAs the weights are genuinely independent (they're tiny deltas, not absolute weights, so 1.0 + 1.0 is fine). The difference is everything layered on top to make mismatched LoRAs play nice:
balancing_mode- the equalization brain.safe(default) hard-matches energy on shared layers only;creativeis looser;intensityuses peak-energy detection for cross-concept merges;impactadds sparsity correction for sparse-vs-dense cases like Anima. This is why the weights don't behave like a simple 70/30 mix.magnitude_scaling- scales LoRAs B and C to match A's energy using RMS or a top-X% percentile, so one loud LoRA doesn't drown the others.energy_preservation- on by default; keep it that way. It stops the merge from pumping up overall magnitude.active_threshold- only merges the "active" non-zero regions of each tensor.
The honest caveat, straight from the author's beta post: cross-trainer merges aren't 1:1. You may need 2–4x weight on one side to get the balance you want. That's the price of the compatibility.
Inputs that matter
model/clip- required; the merge is applied straight onto them. Wire the outputs into a sampler to see the result.lora_a/lora_b/lora_c- dropdowns, orlora_data_a/b/cchained from another merge.weight_a/weight_b/weight_c- start all at 1.0, then treat them as "loudness," not ratio. Tune in 0.1 steps.method-linearfirst. Trymagnitudeorfeature_mixlater; the DARE/TIES family is mostly for when you know what you're doing.save_trigger- off = preview through the livemodel/clipoutputs; on = write the merged.safetensorsto your loras folder.
Outputs: lora (the merged adapter - chain it into the Easy LoRA Baker to permanently bake it), model and clip (the applied result), output_path, and forensic_report.
Installing it
Manager (search "Easy LoRA Merger") or:
cd ComfyUI/custom_nodes
git clone https://github.com/Terpentinas/EasyLoRAMerger
Restart ComfyUI. No model downloads.
Gotchas
Community feedback on the beta: one tester got a genuinely nice stable blend of two character LoRAs but found it fiddly compared to stacking LoRAs in rgthree's Power Lora Loader - "body horror material" before it clicked. That's real: this node is more powerful than a simple mixer and less predictable. If you just want a 70/30 of two same-trainer LoRAs, a plain weighted stack is simpler. If your LoRAs come from different trainers or you want them as one permanent file, this is the tool. And if you merge a 9B and a 4B Klein LoRA together, the results are... an experience, per the author. Don't say you weren't warned.
Inputs (29)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| method | COMBO | linear | 15 options: linear, ties_strict, ties_gentle, dare_lite, dare_rescale, subtract, +9 |
| density | FLOAT | 1.000.1–1 | — |
| lora_aopt | COMBO | 1 options: None | |
| lora_bopt | COMBO | 1 options: None | |
| lora_copt | COMBO | 1 options: None | |
| lora_data_aopt | LORA | — | |
| lora_data_bopt | LORA | — | |
| lora_data_copt | LORA | — | |
| weight_aopt | FLOAT | 1.00-5–5 | Strength of first LoRA |
| weight_bopt | FLOAT | 1.00-5–5 | Strength of second LoRA |
| weight_copt | FLOAT | 1.00-5–5 | Strength of third LoRA |
| blend_modeopt | COMBO | auto | auto: Smart choice based on trainer metadata (match → dense, mismatch → active) | dense: Traditional weighted sum |
| energy_preservationopt | BOOLEAN | true | Preserve energy distribution during merge (recommended). Disable for raw weighted sum. |
| balancing_modeopt | COMBO | safe | Auto-weight-balancing: safe (hard-match energy on shared layers only, rank-independent), creative (preserve ratio with reduced magnitude), intensity (peak-energy detection for cross-concept merges), impact (intensity + sparsity correction for sparse-vs-dense merges like Anima), disabled (no adjustment). |
| magnitude_scalingopt | COMBO | none | Signal magnitude scaling before merging – scales LoRA B and C to match LoRA A's energy using RMS or top‑X% percentile. |
| active_thresholdopt | BOOLEAN | true | Enable active region detection (threshold value from config.py). Disable for dense-style behavior. |
| uniquenessopt | FLOAT | 0.700.1–1 | For feature_mix: higher = preserve more unique features |
| thresholdopt | FLOAT | 0.000–1 | For subtract: minimum magnitude to subtract |
| blendopt | FLOAT | 0.500–1 | For magnitude: 0=strict, 1=blended |
| deviceopt | COMBO | auto | 3 options: auto, cuda, cpu |
| precisionopt | COMBO | auto | 4 options: auto, float32, bfloat16, float16 |
| batch_sizeopt | INT | 321–256 | Number of keys to process per batch. DeviceManager.suggest_batch_size() can auto-tune based on VRAM. |
| streamingopt | BOOLEAN | true | Stream tensors to save VRAM |
| save_triggeropt | BOOLEAN | false | — |
| filenameopt | STRING | triple_merged | — |
| save_folderopt | STRING | /tmp/ComfyUI/models/loras | — |
| metadata_modeopt | COMBO | merge_basic | How to handle metadata from source LoRAs |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| lora | LORA | — |
| model | MODEL | — |
| clip | CLIP | — |
| output_path | STRING | — |
| forensic_report | STRING | — |