Character Emotion · ComfyUI Emotional Gallery
A LoRA loader that hands you the prompt already written
- model
- clip
- model
- clip
- positive_prompt
Most LoRA loader nodes give you a patched MODEL and CLIP and leave the prompting to you. EGCharacterEmotion - Character Emotion · ComfyUI Emotional Gallery - gives you those two plus a third wire: a finished positive prompt string, assembled from your character trigger words, your base portrait prompt, and the expression you picked from a dropdown.
That third output is the whole point. It's a LoRA loader fused with a prompt book.
Why you'd want that
Character LoRAs live or die on the prompt: the trigger word, a framing that puts a face in the frame, and expression tags the model actually understands. On Illustrious and NoobAI that last part is Danbooru vocabulary - furrowed brows, half-lidded eyes, blush - and it's fussy. angry and furious produce visibly different faces because the training data treated them as different tags.
The pack ships 131 built-in expressions written in exactly that style, exposed here as one dropdown. Pick one and the string arrives composed correctly - no more hand-merging an expression phrase for the fiftieth time.
How it works
Mechanically it's a subclass of ComfyUI's LoraLoader, so the loading half is unchanged: same load_lora call, same model/clip patching. It does one thing above that, and one thing around it.
The one thing above: it builds the prompt as trigger_words, base_prompt, expression_prompt, joined with commas after trimming stray separators, skipping anything empty. Order is fixed - character first, framing second, face last. That ordering matters, because the expression tags are the most volatile part and you want them adjacent to the end where models weight them strongly.
The one thing around: the node caches the loaded LoRA across calls and tags it with the LoRA file's identity - resolved path, size, mtime in nanoseconds, ctime. If you overwrite a LoRA at the same filename mid-session, the cached weights are dropped and reloaded instead of silently serving the old file. Its IS_CHANGED uses the same identity, so ComfyUI's execution cache invalidates too.
It does not encode anything. The CLIP output is unmodified and the string just sits there as text. You wire positive_prompt into a CLIPTextEncode and feed that node the clip output - that's the "connect positive_prompt to the positive text encoder" line in the author's own description. Miss that and you'll get a portrait with no expression, because your expression lived in a string nobody read.
Inputs and outputs that matter
- model / clip - the diffusion model and CLIP the LoRA gets applied to. From a checkpoint loader for SDXL-family models, or from the split loaders for Flux/Z-Image/Anima.
- lora_name - your character LoRA. It must match the model architecture; an SDXL character LoRA does nothing useful on Flux, and Pony/Illustrious/SDXL cross over unreliably even though they share a code base.
- strength_model / strength_clip - both default to 1.0 and both accept negatives. The gallery's own defaults are 0.8/0.8 on checkpoint profiles, and CLIP strength 0.0 on the Anima and Flux profiles, where the LoRA never touched the text encoder.
- trigger_words - free text, put in front of everything. The character's activation token goes here.
- base_prompt - defaults to
portrait, close-up face, looking at viewer, simple background, a sensible face-preview framing. Change it for a different composition. - emotion - the expression id. Defaults to
neutral. There's acustomoption at the end of the list. - custom_expression (optional) - only read when
emotioniscustom; the text you put here is the expression phrase verbatim.
Outputs are model, clip, positive_prompt. Wire model to the sampler, clip to your text encoders, and positive_prompt into the positive CLIPTextEncode's text input.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/nikminer/ComfyUI-Emotional-Gallery.git comfyui_emotional_gallery
Restart ComfyUI, then Ctrl+F5. No pip packages, no model downloads - the pack drives models you already have, and it insists your character LoRA already be in ComfyUI/models/loras.
One catch you'll hit immediately: you can't find this node in the Add Node search. The pack's frontend deliberately hides all nine of its nodes from the node library and the LiteGraph registry so the gallery panel stays the interface. They stay registered for execution, so a workflow JSON that already contains EGCharacterEmotion opens and runs normally - that's the practical way to get one on your canvas.
Common issues
The face never changes. The positive_prompt isn't connected, or you connected it to the negative encoder. It's a plain STRING; nothing warns you.
The character looks wrong / half-baked. Check that the LoRA architecture matches the base model, then the trigger words. A missing trigger word is the single most common LoRA failure and it looks like "the LoRA doesn't work." Also check strength_clip: dropping it to 0 on a model whose profile expects 0 is fine, doing it on SDXL usually hurts likeness.
You overwrote a LoRA and nothing changed. The node's identity check should catch it. If it doesn't, re-adding it to the graph is a clean reset - and remember the gallery keys its sets separately, so old previews stay attached to the old file identity.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | The diffusion model the LoRA will be applied to. | |
| clip | CLIP | The CLIP model the LoRA will be applied to. | |
| lora_name | COMBO | The name of the LoRA. | |
| strength_model | FLOAT | 1.00-100–100 | How strongly to modify the diffusion model. This value can be negative. |
| strength_clip | FLOAT | 1.00-100–100 | How strongly to modify the CLIP model. This value can be negative. |
| trigger_words | STRING | — | |
| base_prompt | STRING | portrait, close-up face, looking at viewer, simple background | — |
| emotion | COMBO | neutral | 199 options: neutral, smile, joy, laugh, sad, cry, +193 |
| custom_expressionopt | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| model | MODEL | The modified diffusion model. |
| clip | CLIP | The modified CLIP model. |
| positive_prompt | STRING | — |