LoRA Suggester
It picks your LoRAs for you — teaching it what they do is the hard part
- sections
- suggestions
- triggers
- prompt_with_triggers
- report
- lora_text
You have a thousand LoRAs and you use nine, because the rest are named v4_final_fix_02 and you have no idea what they do.
EricLoRASuggester goes further: it decides which LoRAs belong in this prompt and hands your loader a stack.
The catch comes first, because it's the whole story: the node calls no AI. No API, no key, no latency. The thinking happened earlier, in the rest of the pack - a local vision model wrote a card for every LoRA (what it does, its role, triggers, good weights, NSFW level) and you correct the wrong ones in a browser editor. No cards, no suggestions: it can't pick a LoRA you never cataloged. Cards get written once.
How it actually decides
Every carded LoRA is scored for the role it plays, and that list is the genuinely useful part: style (the base look), treatment (linework, halftone, grain, colour grade - layered on a style), transform, detailer, environment, lighting, subject, layout, utility (speed LoRAs), slider.
Scoring is plain text matching, not vibes: prompt words against the card's facets, weighted per role, plus similarity against the card's name and triggers, squashed so the threshold means something. Then your own signals multiply in - stars, LoRA Manager favourites, card confidence, a Civitai popularity nudge weaker than one star. Your taste wins.
Winners get per-stage weights (S1 composition / S2 refine / S3 detail): detailers sit at zero early and full late, environments the reverse. Two picks both claiming composition or faces, and the weaker drops.
Sliders are never scored on text, because they're dials: the prompt is read for its position on axes ("wasp waist" lands near the negative end of a waist axis) and the slider is set to match. slider_min_strength decides how loudly it must be asked for before a dial moves; leave that at 2.
The inputs you'll actually touch
- platform - the gate. Only LoRAs on that platform's shelf (or matching its Civitai base model) count; default
krea2. Pick an unshelved platform and the report is full of nothing - which looks like a broken node, but isn't. - mode -
suggestby default: nothing loads, you just read the report. It's the best design call in here, so live with it for a week before switching toapply. - max_loras (4) and the per-role caps (
style_maxthroughslider_max). Set a cap to 0 and that role never loads - the cheapest way to stop a detailer sneaking into a clean illustration. apply_threshold (0.35) is how adventurous you are; weight_budget (2.5) caps total Stage-1 weight, scaling the accents down to fit. - nsfw is a cap, not a switch: NSFW LoRAs load only when the prompt itself asks, and
offstill allows suggestive styles. variety + seed let close runners-up trade places as the seed moves. - exclude / pin - one entry per line, with
folder:,role:andaxis:prefixes. Pins skip the threshold, role caps and NSFW gate, which is how you stop arguing with it about your favourite LoRA.
Outputs: suggestions (picks with stage weights; empty in suggest mode) goes to the Eric Krea2 Multi-LoRA Stack's suggestions input. report tells you what won, why, the runner-up per role, and what an exclude entry killed - the thing that makes this usable. triggers and prompt_with_triggers cover the trigger step (skip the latter if a rewriter runs after). lora_text emits <lora:name:weight> for loaders outside the Eric_Krea2 family.
Installing it
You're installing a catalog pipeline that contains a node. Manager finds it under the pack title, or:
cd ComfyUI/custom_nodes
git clone https://github.com/EricRollei/Eric_LoRA_Catalog
# ComfyUI portable: ..\..\python_embeded\python.exe -m pip install -r Eric_LoRA_Catalog\requirements.txt
The Python deps are trivial (requests, pyyaml, Pillow), so the real prerequisites are elsewhere: Python 3.12+ (the pack declines to load on older ones rather than half-working), and an OpenAI-compatible local server - LM Studio or Ollama - with a vision model for the cards, e.g. Qwen3-VL 8B at Q4 for 6–8 GB of VRAM. A Qwen3 text encoder file in your workflows is not a chat server and won't work here. Then sidebar → Settings: LoRA folders, server, models, optional Civitai key, Save, Test LLM, Refresh catalog. Data goes to ComfyUI/user/lora_catalog/, so updating the pack won't eat your card edits.
Where people get burned
Test LLM passes and every card times out. The README flags it because everyone hits it: the test sends one tiny image, while a real card carries two previews, 7,000 characters of evidence and needs ~8,192 tokens of context. Either ComfyUI is holding the GPU so the server spills to CPU (unload its models, or refresh with ComfyUI closed), or the context is too small - set OLLAMA_CONTEXT_LENGTH=16384 and restart Ollama, or load at --context-length 16384 in LM Studio.
Also: the first card pass is thousands of vision-model captions, so run it overnight. And the node is new - it moved here from EricRollei's video_prompter on 2026-10-11, same node id and input order so saved workflows load unchanged, but there's essentially no field experience with it yet. License is CC BY-NC 4.0: free locally, commercial use needs a license.
Inputs (25)
| Name | Type | Default | Description |
|---|---|---|---|
| platform | COMBO | krea2 | Target model: only LoRAs for it are considered (its LoRA shelf folder / Civitai base model). |
| mode | COMBO | suggest | suggest: report only, nothing loads. apply: send the picks to the loader. |
| nsfw | COMBO | off | Highest NSFW level a LoRA may have. NSFW LoRAs are used only when the prompt itself asks for that content. off still allows suggestive styles, and styles that can paint nudes (turned down a little). |
| max_loras | INT | 40–10 | Most LoRAs in the stack, all roles together. |
| style_max | INT | 20–4 | Most style LoRAs (base look: artist, movement, illustration or photo style). 0 = never. |
| treatment_max | INT | 20–4 | Most treatment LoRAs (layered on a style: linework, halftone, paper, grain, colour grade, material looks). 0 = never. |
| detailer_max | INT | 10–4 | Most detailer LoRAs (detail, sharpness, skin, hands, anatomy). 0 = never. |
| environment_max | INT | 10–4 | Most environment LoRAs (location or background). 0 = never. |
| lighting_max | INT | 10–4 | Most lighting LoRAs (light and colour mood). 0 = never. |
| subject_max | INT | 10–4 | Most subject LoRAs (character, person, creature, object, clothing, pose). 0 = never. |
| layout_max | INT | 10–4 | Most layout LoRAs (composition, page layout, framing). 0 = never. |
| utility_max | INT | 10–4 | Most utility LoRAs (speed LoRAs, nudity enablers - only when clearly asked for). 0 = never. |
| apply_threshold | FLOAT | 0.350–1 | How good a match must be before a LoRA is used. Lower = adventurous stacks, higher = only clear matches. |
| weight_budget | FLOAT | 2.50–10 | Most total Stage-1 weight. The strongest pick keeps its weight, the others are scaled down to fit. 0 = no limit. |
| stage_profile | COMBO | role | role: each role gets its own S1/S2/S3 shape (detailers late, environments early). flat: the same weight in every stage. |
| variety | FLOAT | 0.200–1 | 0 = always the best match. Higher = with a new seed, close runners-up can win instead. |
| seed | INT | 00–2147483647 | Seed for variety. Connect the Composer's seed to re-roll LoRAs with the prompt. |
| sectionsopt | PROMPT_SECTIONS | From a Wildcard Composer: each section feeds its roles (style -> style and treatment, setting -> environment, ...). | |
| textopt | STRING | Plain prompt text, when there are no sections (or in addition to them). | |
| excludeopt | STRING | Never use these LoRAs. One entry per line or comma separated; case does not matter. Whole words only: 'age' matches 'Age Slider' but not 'image' or 'vintage'; 'hair' does not match 'chair'. Several words must appear together: 'waist slider'. plain words - the LoRA's name or file name (vallejo, hair, waist slider) folder:<words> - its folder below the LoRA root (folder:sliders, folder:art-style) role:<role> - a Suggester role (role:treatment, role:detailer, role:slider) axis:<axis> - sliders on that axes.yaml axis (axis:age, axis:body weight) The report shows how many LoRAs each entry excluded. | |
| pinopt | STRING | Always use these LoRAs, whatever their score (they skip the threshold, role limits and NSFW gate, and count toward max_loras). One entry per line or comma separated; whole words. a name - ONE LoRA: the best match (your stars, favourite, card confidence). If the words match several, the report lists the others - add more of the name to pick a different one. name=weight - that LoRA at this weight (all stages; a slider keeps its stage shape): 'waist slider=-8', 'vallejo=0.7' axis:<axis>=weight - the best slider on that axis at this weight: 'axis:age=+3' Give sliders a weight; without one they run at their card's typical weight. folder: and role: work in exclude only. | |
| transform_maxopt | INT | 10–4 | Most transform LoRAs (changes content and composition but stacks on a style: surreal, dreamlike, glitch). 0 = never. |
| slider_maxopt | INT | 20–6 | Most slider LoRAs (dials (age, body, shot size, saturation ...), set from what the prompt asks for on that axis). They do not count toward max_loras or the weight budget. 0 = never. |
| slider_rangeopt | FLOAT | 3.00.1–15 | For a slider whose card has no believable range: it dials within -range..+range (a strongest-cue prompt gets the full range). Ranges set in the card editor, or found by the slider card pass, are used instead. |
| slider_min_strengthopt | INT | 21–3 | How clearly the prompt must ask before a slider is used, by the cue's position on its axis (axes.yaml ladder, -1..1). 1 = any cue; 2 = 0.35 or more (everyday words stay off); 3 = 0.65 or more, only strong asks ('wasp waist', 'ancient'). |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| suggestions | LORA_SUGGESTIONS | The picked LoRAs with stage weights. Connect to the Eric Krea2 Multi-LoRA Stack's `suggestions` input. Empty in suggest mode. |
| triggers | STRING | Trigger words of the picks, comma separated. |
| prompt_with_triggers | STRING | The prompt with the triggers added (for workflows without a rewriter; with a rewriter, let the Multi-LoRA's add_triggers merge them after the rewrite instead). |
| report | STRING | What was picked and why, the runner-up per role, and what was excluded. |
| lora_text | STRING | The picks as <lora:name:weight> tags, one weight per LoRA (the strongest of its three stage weights), for loaders outside Eric_Krea2 that read this format (e.g. LoRA Manager's text loader). Empty in suggest mode. |