SN1000 Lora Theme
SN1000 Lora Theme pairs prompts with their LoRAs
- model
- clip
- MODEL
- CLIP
- prompt
Here's the workflow problem nobody ships a fix for: your character LoRA needs its trigger word, a strength that works, and a prompt fragment that makes it actually look like the character. You keep all of that in your head, retype it into a CLIP Text Encode every time, and one day you load the crying LoRA with the smiling prompt and wonder why the render is wrong. SN1000 Lora Theme (class SN1000LoraTheme, from the SmartNode1000 pack) is the fix: a preset library where a prompt and its LoRA stack live together as one saved unit, shared across every workflow you own.
The README calls the pair the whole idea, and it's right. A crying LoRA + a crying prompt is one preset; a smiling LoRA + a smiling prompt is another. Switch the preset and both swap at once. You never load the wrong LoRA for the wrong prompt again.
How it works
Themes are just folders, and presets are JSON files: presets/<theme>/<name>.json, each holding a prompt plus a LoRA list. The theme dropdown is built from the subfolders of presets/; pick a preset and its prompt and LoRA list load in. Edit the prompt right on the node, save, and the change is live everywhere that preset is used - that's the "shared JSON" storage model, the permanent library, versus the checklist node's per-workflow storage.
At run time it's the same machinery as its checklist sibling: each enabled LoRA is loaded through ComfyUI's load_lora_for_models with the same strength on model and clip, prompt_in from a previous node gets prepended if connected, and __wildcard__ / {a|b|c} syntax expands using wildcard_seed. prompt_enabled and loras_enabled bypass prompt and LoRAs independently, so A/B testing is one toggle each.
The inputs that matter
theme- pick the folder of presets.preset- which saved prompt+LoRA set to load.prompt_enabled/loras_enabled- master switches for prompt and LoRAs, independent.wildcard_seed- makes wildcard picks reproducible; the same seed, the same result.
model and clip are optional - connect them to apply LoRAs, or leave them unconnected and the node becomes a pure prompt composer. That's the documented usage: model and clip from your checkpoint loader, prompt into the text encoder.
Outputs
MODEL, CLIP, and prompt (STRING). model/clip carry the LoRA-loaded weights downstream; prompt feeds your text encoder.
Chaining and storage
Wire several theme nodes in a row - model, clip and prompt flow through, each node adding its own layer - and you can stack themes horizontally without merging anything. Storage is all on disk, shared across workflows: presets/<theme>/<name>.json, with a plain JSON structure a text editor can read. Nothing else to install: the pack reads standard sidecar files for previews and metadata, and fetchable from Civitai by hash from the pack's panels.
Install
Same for every SmartNode1000 node. Search SmartNode1000 in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/1000Pro-1997/SmartNode1000.git
Restart ComfyUI. No extra dependencies - no pip install, no model files.
Where people get tripped up
- The theme dropdown starts empty. Presets begin empty - you build the library yourself, and the dropdown only lists folders that exist under
presets/. Create one first. - New themes can lag behind. The
themelist is built when the node's inputs are constructed, so a theme created elsewhere may need the node refreshed (or the workflow reloaded) before it appears. - LoRAs silently skipped. No
model/clipconnected means no LoRAs - check the console for[FLM]lines if a run "forgets" your LoRA. - Missing LoRA files are logged and skipped, not fatal - a broken path shows up as a console note, so check there before blaming the prompt.
If you juggle a handful of recurring styles and characters, this is the node that retires the text file next to your monitor.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| theme | COMBO | Theme to use. Each sub-folder of presets/ is a theme. | |
| preset | STRING | Selected preset name. Filled in by the UI. | |
| prompt | STRING | Prompt text of this preset. | |
| lora_data | STRING | [] | LoRA list as JSON. Managed by the UI. |
| prompt_enabled | BOOLEAN | true | Off drops this node's prompt and passes through the incoming one. LoRAs still apply. |
| loras_enabled | BOOLEAN | true | Off skips every LoRA. Each LoRA keeps its own on/off state. |
| wildcard_seed | INT | 00–18446744073709550000 | Seed for picking wildcard values. The same seed gives the same result. |
| modelopt | MODEL | Connect to apply LoRAs. Without it LoRAs are skipped. | |
| clipopt | CLIP | Connect to apply LoRAs. Without it LoRAs are skipped. | |
| prompt_inopt | STRING | Prompt from a previous node. Prepended when connected. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |
| CLIP | CLIP | — |
| prompt | STRING | — |