Smart Load Double LoRA
Two LoRAs, two models, one shared CLIP — in a single node
- model1
- model2
- clip
- model1
- model2
- clip
- lora_string
Smart Load Double LoRA exists for the weird-but-real workflow where two different diffusion models each need their own LoRA, while sharing one CLIP. LoRA 1 patches model1 and the CLIP; LoRA 2 patches model2 and the CLIP again, sequentially. Two LoRAs, two models, one text encoder, one node.
The "both LoRAs hit the same CLIP" bit is the part that's easy to get wrong by hand. Doing it with two stock LoRA loaders means the CLIP gets patched by the first loader, then the second loader needs the already-patched CLIP wired into it, and if you forget, one LoRA's text-side effects silently vanish. This node handles the sequencing for you - and it caches the LoRA files it loads, so reusing the same LoRAs doesn't re-read them from disk every run.
How it works
Under the hood it's two standard load_lora_for_models calls in order. First: model1 + clip ← lora1. Second: model2 + the patched clip ← lora2. If either LoRA's model and clip strengths are both 0, that LoRA is skipped entirely - no wasted patching. The loaded LoRA weights are cached per file path, which is a genuinely nice touch for repeat runs.
Like the other loaders in this pack, it also produces a human-readable receipt. The lora_string output lists both LoRAs with their strengths, one per line:
char_lora, model_str:0.8, clip_str:0.9
style_lora, model_str:0.6, clip_str:0.5
Route that into SmartSaveText and your render log tells future-you exactly what was loaded.
The inputs that matter
model1,model2- the two diffusion models.clip- the single CLIP both LoRAs patch, in sequence.lora_name_1/lora_name_2- the two LoRAs (dropdowns frommodels/loras).strength_model_1/2andstrength_clip_1/2- per-LoRA strengths, −100 to 100; negative values genuinely work as un-merging.lora_string- optional input to append onto an existing receipt.
Outputs: model1, model2 (both MODEL), clip (CLIP), and lora_string (STRING).
Where it shines
Wan 2.2 again: two noise models, and it's common to want a different style LoRA on the high-noise pass than on the low-noise pass while sharing prompt conditioning. This is the node that makes that a single clean block instead of a patching chain. If you only ever have one model, the pack's SmartLoadLoRA is simpler - this one is specifically for the dual-model case.
Installing it
Part of SmartHelperNodes, one install:
cd ComfyUI/custom_nodes
git clone https://github.com/slvslvslv/ComfyUI-SmartHelperNodes
Restart ComfyUI, or ComfyUI Manager → "SmartHelperNodes". No pip dependencies, no model downloads.
Common issues
The lora_string input exists so you can chain receipts across nodes, but it's optional - leave it unconnected and the node still works. The one thing to watch is strength semantics: because both LoRAs share the CLIP, raising both clip_str values stacks text-side effects on one encoder, which can oversaturate prompt adherence. If your output suddenly ignores the prompt, that's the first place to look.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| model1 | MODEL | First diffusion model. | |
| model2 | MODEL | Second diffusion model. | |
| clip | CLIP | The CLIP model both LoRAs will be applied to. | |
| lora_name_1 | COMBO | LoRA applied to model1 and CLIP. | |
| strength_model_1 | FLOAT | 1.00-100–100 | — |
| strength_clip_1 | FLOAT | 1.00-100–100 | — |
| lora_name_2 | COMBO | LoRA applied to model2 and CLIP. | |
| strength_model_2 | FLOAT | 1.00-100–100 | — |
| strength_clip_2 | FLOAT | 1.00-100–100 | — |
| lora_stringopt | STRING | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| model1 | MODEL | — |
| model2 | MODEL | — |
| clip | CLIP | — |
| lora_string | STRING | — |