Nodes/ComfyUI_Eugene_Nodes/LoRA Preset Saver
ComfyUI Node

LoRA Preset Saver

Save a LoRA Stack — and Its Prompts — as a Reusable Preset

By JEONG-JIWOO·Created 2 years ago·Updated 8 months ago· 2
LoRA Preset Saver
    • STRING
    triggeredfalse
    suffix
    lora_1_name
    lora_1_nickname
    lora_1_strength1.00
    lora_1_clip_strength1.00
    lora_1_prompt_positive
    lora_1_prompt_negative
    lora_2_name
    lora_2_nickname
    lora_2_strength1.00
    lora_2_clip_strength1.00
    lora_2_prompt_positive
    lora_2_prompt_negative
    lora_3_name
    lora_3_nickname
    lora_3_strength1.00
    lora_3_clip_strength1.00
    lora_3_prompt_positive
    lora_3_prompt_negative
    lora_4_name
    lora_4_nickname
    lora_4_strength1.00
    lora_4_clip_strength1.00
    lora_4_prompt_positive
    lora_4_prompt_negative
    lora_5_name
    lora_5_nickname
    lora_5_strength1.00
    lora_5_clip_strength1.00
    lora_5_prompt_positive
    lora_5_prompt_negative

    Every LoRA preset in this pack has to come from somewhere, and the LoRA Preset Saver is the somewhere. You've dialed in a stack - a LoRA, its strength, the exact prompt fragment that makes it work - and you don't want to remember all of it next time. This node writes it down for you as a JSON file that the Loader and Selector nodes read back.

    How it works

    The Saver is a configuration node with five slots, each holding six fields: lora_X_name (the model dropdown), lora_X_nickname (the friendly display name), lora_X_strength, lora_X_clip_strength, and the prompt_positive / prompt_negative text for that LoRA. There's also a suffix string you can use to version presets - a suffix of _v2 turns a file into mypreset_v2_preset.json.

    Here's the part that trips people up: the Saver only writes when the triggered boolean is on. It's a widget, not a wire - set it to True, queue a run, and it writes one JSON file per filled slot into your loras model folder, then returns a status string telling you where the files landed. Flip it back to False and rerun if you want it to stop re-saving every queue. It ignores slots whose name is "none", so you can reuse one Saver for stacks of different sizes.

    Two structural things worth knowing:

    • One preset file per LoRA, not per stack. A preset is a single LoRA plus its prompt fragment. The stack is assembled by the Loader or Selector from several preset files. That matches the file naming - the preset name is derived from the LoRA file name, not from a stack name you invent.
    • The files land inside your models/loras folder, with the same directory structure you use there. Each file is plain JSON: lora_name, lora_path, strength, clip_strength, prompt_positive, prompt_negative, and nickname.

    After you save

    The saved presets show up in the dropdowns of the LoRA Preset Loader & Encoder and the LoRA Preset Selector once they reload (reload the workflow or hit the selector's refresh). Since the Selector supports subfolders, organizing presets into loras/category/… keeps long lists manageable. You can also manage the whole thing over HTTP: the pack registers /lora_presets and /lora_presets/refresh endpoints on your ComfyUI instance.

    Installing it

    Same pack, no special dependencies:

    cd ComfyUI/custom_nodes
    git clone https://github.com/JEONG-JIWOO/ComfyUI_Eugene_Nodes
    

    Restart ComfyUI, or install via ComfyUI Manager (search "Eugene Nodes").

    Where people get burned

    The number one "bug" report for this node is that it does nothing - because triggered was left off. Toggle it on, run once, toggle it back off.

    The second is expecting a new preset to appear instantly. Node dropdowns are built when the node loads, so save a preset and you'll need to reload the workflow (or hit the Selector's refresh) before it shows up in a Loader.

    And a tip if your presets look generic in dropdowns: fill in the nickname. The preset list is sorted by display name, and nicknames make a folder full of files you don't remember readable again.

    Categorylora/preset

    Inputs (32)

    NameTypeDefaultDescription
    triggeredBOOLEANfalse
    suffixSTRING
    lora_1_nameoptCOMBO1 options: none
    lora_1_nicknameoptSTRING
    lora_1_strengthoptFLOAT1.00-100–100
    lora_1_clip_strengthoptFLOAT1.00-100–100
    lora_1_prompt_positiveoptSTRING
    lora_1_prompt_negativeoptSTRING
    lora_2_nameoptCOMBO1 options: none
    lora_2_nicknameoptSTRING
    lora_2_strengthoptFLOAT1.00-100–100
    lora_2_clip_strengthoptFLOAT1.00-100–100
    lora_2_prompt_positiveoptSTRING
    lora_2_prompt_negativeoptSTRING
    lora_3_nameoptCOMBO1 options: none
    lora_3_nicknameoptSTRING
    lora_3_strengthoptFLOAT1.00-100–100
    lora_3_clip_strengthoptFLOAT1.00-100–100
    lora_3_prompt_positiveoptSTRING
    lora_3_prompt_negativeoptSTRING
    lora_4_nameoptCOMBO1 options: none
    lora_4_nicknameoptSTRING
    lora_4_strengthoptFLOAT1.00-100–100
    lora_4_clip_strengthoptFLOAT1.00-100–100
    lora_4_prompt_positiveoptSTRING
    lora_4_prompt_negativeoptSTRING
    lora_5_nameoptCOMBO1 options: none
    lora_5_nicknameoptSTRING
    lora_5_strengthoptFLOAT1.00-100–100
    lora_5_clip_strengthoptFLOAT1.00-100–100
    lora_5_prompt_positiveoptSTRING
    lora_5_prompt_negativeoptSTRING

    Outputs (1)

    NameTypeDescription
    STRINGSTRING