LoRA Preset Loader & Encoder
Five LoRAs, Your Prompt, and the Conditioning — All From One Node
- input_dictionary
- model
- clip
- vae
- basic_pipe
- dict_bus
- input_dict
- model
- clip
- vae
- positive_conditioning
- negative_conditioning
- basic_pipe
- positive_prompt
- negative_prompt
If you run more than two LoRAs together, you know the pain this node exists to remove: the wall of LoraLoader nodes, each with its own strength slider, plus the CLIP encoding you still have to do afterward. The LoRA Preset Loader & Encoder from Eugene's pack collapses that whole pile into one node. Pick up to five saved presets, set a strength per slot, and it applies the LoRAs, assembles the full prompt out of fragments each preset carries, encodes it into conditioning, and hands you everything downstream needs in one go. It's the most useful node in this pack, and the reason most people install it.
How it works
The heart of it is the "preset" - a small JSON file living in your loras model folder. Each one stores a LoRA file path, a strength, and positive/negative prompt text. When you select a preset in a slot, the loader reads that JSON, applies the LoRA to the model and CLIP, and appends the preset's prompt fragment to the prompt it's building for you.
Your positive_prefix goes first, then each applied preset's prompt, then positive_suffix. The same happens for the negative side. The joined text runs through a cleaner that squashes newlines into spaces and dedupes commas, then gets encoded by the CLIP - after stop_at_clip_layer (CLIP skip) is applied to it. So this one node is a LoRA stacker and a prompt composer and a text encoder, all at once.
The inputs that actually matter
- lora_1_preset … lora_5_preset - which saved preset each slot applies. "none" skips the slot.
- lora_1_strength … lora_5_strength - per-slot override, −100 to 100. One quirk worth knowing: on this node the CLIP strength is forced to match the model strength, ignoring whatever
clip_strengththe preset file stores. The list-based sibling node does not do this. - positive_prefix / positive_suffix, negative_prefix / negative_suffix - prompt text that wraps the preset fragments. Any
{key}placeholders in them get filled from the optionalinput_dictionary, which is how Eugene's dictionary nodes feed prompts here. - stop_at_clip_layer - CLIP skip, default −1. Anime LoRAs (Illustrious/Pony/NoobAI) often want −2.
Model, CLIP, and VAE can come in three ways: direct wires, a basic_pipe, or a dict_bus. If more than one is connected, priority is direct input first, then basic_pipe, then dict_bus - so a wire straight into the node always wins.
What comes out
The outputs are the payoff. You get model and clip with everything baked in, the vae, ready-to-wire positive_conditioning and negative_conditioning for your sampler, and a basic_pipe output that bundles model/clip/vae/both-conditionings into a single connection for the rest of the graph. There's also input_dict (passed through untouched) and the assembled positive_prompt / negative_prompt strings - hook those into a ShowText node and you can see exactly what prompt it composed, which is great for debugging.
Installing it
No requirements to pip, no models to download - the pack only uses ComfyUI's own built-ins. Either use ComfyUI Manager (search "Eugene Nodes") or:
cd ComfyUI/custom_nodes
git clone https://github.com/JEONG-JIWOO/ComfyUI_Eugene_Nodes
Then restart ComfyUI.
Where people get burned
The preset dropdown is built when the node is created, so a preset you just saved with the Saver won't show up until you reload the workflow (or restart). This node has no refresh toggle - that's the Selector's job.
If you get a "Model, CLIP, and VAE are required" assertion, something resolved to nothing: check that a direct wire, basic_pipe, or dict_bus actually reaches the node, and remember a direct wire beats the bus.
And the classic: LoRA loads, image doesn't change. That usually means the preset's own prompt fragment isn't carrying the trigger word the LoRA was trained on - pop the assembled positive_prompt into ShowText and check.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| positive_prefix | STRING | — | |
| positive_suffix | STRING | — | |
| negative_prefix | STRING | — | |
| negative_suffix | STRING | — | |
| stop_at_clip_layer | INT | -1-24–-1 | — |
| input_dictionaryopt | DICT | — | |
| modelopt | MODEL | — | |
| clipopt | CLIP | — | |
| vaeopt | VAE | — | |
| basic_pipeopt | BASIC_PIPE | — | |
| dict_busopt | DICT_BUS | — | |
| lora_1_presetopt | COMBO | 1 options: none | |
| lora_1_strengthopt | FLOAT | 1.00-100–100 | — |
| lora_2_presetopt | COMBO | 1 options: none | |
| lora_2_strengthopt | FLOAT | 1.00-100–100 | — |
| lora_3_presetopt | COMBO | 1 options: none | |
| lora_3_strengthopt | FLOAT | 1.00-100–100 | — |
| lora_4_presetopt | COMBO | 1 options: none | |
| lora_4_strengthopt | FLOAT | 1.00-100–100 | — |
| lora_5_presetopt | COMBO | 1 options: none | |
| lora_5_strengthopt | FLOAT | 1.00-100–100 | — |
Outputs (9)
| Name | Type | Description |
|---|---|---|
| input_dict | DICT | — |
| model | MODEL | — |
| clip | CLIP | — |
| vae | VAE | — |
| positive_conditioning | CONDITIONING | — |
| negative_conditioning | CONDITIONING | — |
| basic_pipe | BASIC_PIPE | — |
| positive_prompt | STRING | — |
| negative_prompt | STRING | — |