GRLoraLoader
A LoRA stack that grows as you add entries
- model
- clip
- model
- clip
Most LoRA loader nodes give you one fixed set of slots - pick a LoRA, set a strength, and if you want a second one you either chain another loader node or you're stuck. The author's own description of this one is that it "dynamically updates as LoRAs are added to the node," which is the more convenient pattern: rather than wiring loader after loader, you add entries directly on the node itself and the widget list grows to fit. It's the same job rgthree's Power Lora Loader does - arguably the single most-borrowed node in that pack, named in hundreds of community threads - done GraftingRayman's way.
How it works
The typed sockets you see in the node's schema are deliberately minimal: a model in, an optional clip in, a toggle for whether the LoRA also gets applied to CLIP, and matching model/clip outputs. That's the plumbing. The actual LoRA management - adding entries, picking files, setting per-entry strengths, toggling entries on and off, and (per the README) randomizing selections or weights instead of setting them by hand - lives in widgets that appear on the node face as you use it, the same way rgthree's loader adds rows as you click "+ Add Lora." That's worth knowing going in: don't go looking for a lora_name socket in the node's static inputs, because there isn't one - the LoRA picker is part of the interactive node UI, not a wired connection.
The inputs and outputs that matter
model(MODEL, required) - the model your LoRAs get applied to.apply_to_clip(BOOLEAN, defaulttrue) - whether the LoRA weights also patch your CLIP encoder, not just the diffusion model. Leave this on for the normal case (most LoRAs expect both); turn it off if you're deliberately keeping your text encoder untouched.clip(CLIP, optional) - wire this in if you want the node's CLIP output too. If you skip it, you'll only get a patched model back.modelandclip(outputs) - feed these into your sampler and text encoder respectively, same as any other LoRA loader.
Everything else - which LoRA files are actually loaded, at what strength, and whether they're randomized - is set through the node's own on-canvas widgets rather than a typed input.
How to install it
Via ComfyUI Manager: search "GraftingRayman", install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/GraftingRayman/ComfyUI_GraftingRayman
then restart. This pack has one hard dependency shared by every node, including this one - OpenAI's CLIP package (not to be confused with the clip socket above, which is ComfyUI's own text encoder type):
# portable build
.\python_embeded\python.exe -m pip install git+https://github.com/openai/CLIP.git
# system python
pip install git+https://github.com/openai/CLIP.git
Miss that step and the pack fails to import entirely.
Common issues & troubleshooting
Node missing from search. That's the CLIP install above - a pack-wide requirement, not something specific to LoRA loading.
No visible field to pick a LoRA file. You need to interact with the node on the canvas to add an entry first - the picker widgets aren't present until you add one, since this is a dynamically-growing node rather than a fixed set of sockets.
LoRA has no visible effect. Check apply_to_clip first - a LoRA that's supposed to touch text-conditioning as well as the model won't behave right if that toggle is off and your clip output isn't feeding anything. Beyond that, the usual LoRA culprit applies regardless of which loader you use: check the strength on the entry itself, and confirm the LoRA was actually trained for the base model you're running it against.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| apply_to_clip | BOOLEAN | true | — |
| clipopt | CLIP | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| clip | CLIP | — |