Nodes//Nougan Regional Character LoRA πŸ‘₯
ComfyUI Node

Nougan Regional Character LoRA πŸ‘₯

The Nougan Regional Character LoRA

By WinnouganΒ·Created 2 months agoΒ·Updated about a month agoΒ· 4
Nougan Regional Character LoRA πŸ‘₯
  • model
  • clip
  • MODEL
  • CONDITIONING
  • NEGATIVE
β—„lora_aβ–Ύβ–Ί
β—„strength_a1.00β–Ί
β—„lora_bβ–Ύβ–Ί
β—„strength_b1.00β–Ί
β—„feather0.06β–Ί
β—„regions{}β–Ί

If you've ever stacked two character LoRAs hoping to get two characters in one frame, you know the result: they merge. Identity A borrows B's hair, B borrows A's jacket, and you're left with one confused mashup. Putting two specific characters in the same image is one of the least-solved problems in local generation, and the Nougan Regional Character LoRA (RegionalCharacterLora, from Winnougan's Nougan_Nodes pack) is one of the more serious attempts at cracking it - two character LoRAs, one image, each confined to its own region of the canvas, no compositing and no inpaint pass.

Regional prompting itself is old news - Latent Couple, Regional Prompter, Forge Couple - rebuilt for every architecture since 2023. The catch with most of them is that they mask the prompt conditioning, which is leaky. This node gates the LoRA deltas themselves, in the forward pass, per region.

How it works

A LoRA is a small low-rank delta. Load it normally and it's applied everywhere at once - W_eff = W + strength Γ— (up @ down) - so every pixel carries both identities. That's the blend. This node never merges. It reads both .safetensors files straight from models/loras, normalizes the key names (strips lora_unet_ / diffusion_model. prefixes, collapses dots and underscores), matches them to the model's Linear layers, and registers forward hooks. Each hook computes that layer's LoRA delta, then multiplies it by a mask built on the token grid. Tokens inside A's box get A's delta only, B's box gets B's only, and the text tokens get nothing. Base weights are never touched, and the hooks are removed after every forward call.

It's built and documented around the Flux 2 / Krea 2 line, where attention projections are separate wq/wk/wv/wo Linears, but it isn't hardcoded to them - it patches whatever Linears your LoRA targets. That cuts both ways: a LoRA trained for a different base architecture simply won't match, and the node will say so.

The conditioning side is more conventional. It encodes your global prompt plus each region's prompt, masks each with the same boxes, and hands you a soft CONDITIONING. The NEGATIVE output is that conditioning zeroed out - the standard regional-conditioning trick so the negative doesn't fight the region masks. Note there's no separate negative-prompt field: your scene and style go in the global bar.

Inputs and outputs

The inputs that actually matter:

  • model (MODEL) - from your checkpoint loader, after any global style/turbo LoRAs.
  • clip (CLIP) - the text encoder used to encode the region prompts.
  • lora_a / lora_b with strength_a / strength_b - the two characters. Strengths run -4 to 4, default 1.0; nudge up if a character feels weak.
  • feather - seam softness, 0 to 0.3, default 0.06; the knob for the visible-line problem.
  • regions - hidden JSON, managed by the node's own editor. Don't hand-edit it.

The node draws its UI right in the graph: two draggable, resizable boxes (A blue, B pink), a textarea inside each for that character's prompt, a global prompt bar, a feather field, and one-click split tiles (50/50, 33/67, top/bottom). All of it serializes into regions; the footer shows A/B coverage, overlap, and gap.

Outputs: MODEL (patched) into your guider/sampler, CONDITIONING into the positive slot, NEGATIVE into the negative.

Install

ComfyUI Manager, search Nougan, or:

cd ComfyUI/custom_nodes
git clone https://github.com/Winnougan/Nougan_Nodes
# restart ComfyUI

No model downloads and no extra Python dependencies - it only reads your existing models/loras. The pack loads each family in its own try/except, so a failure elsewhere won't take this node down.

Common issues

  • !! 0 layers matched in the console - the LoRA's key stems don't match your model's module names. Wrong base model; nothing will happen and the node prints the first few mismatched stems to prove it.
  • Needs a recent ComfyUI. The shipped code requires model-wrapper support (comfy.patcher_extension); older builds fail with "This ComfyUI build lacks model wrapper support." Update ComfyUI first.
  • The docs lie a little. The pack's own docs describe split_mode, blend_override, compute_precision, painted-mask inputs - the shipped node has none of those. It's exactly two regions, boxes plus feather. The frontend ships self-heal code that scrubs stale "manual" values out of old widget slots, so old graphs survive.
  • Hard seam down the middle - raise feather toward 0.1. And remember it's strictly two characters; there's no N-region mode.
  • LoHa / LyCORIS-style LoRAs won't load - the parser only knows standard lora_down/lora_up (and lora_A/lora_B) naming.

It's niche - you won't find a Reddit thread for it - but if "two clean characters, one render" is your exact problem, this is one of the few nodes that attacks it instead of papering over it.

Categoryconditioning/regional

Inputs (8)

NameTypeDefaultDescription
modelMODELβ€”
clipCLIPβ€”
lora_aCOMBO0 options:
strength_aFLOAT1.00-4–4β€”
lora_bCOMBO0 options:
strength_bFLOAT1.00-4–4β€”
featherFLOAT0.060–0.3β€”
regionsSTRING{}β€”

Outputs (3)

NameTypeDescription
MODELMODELβ€”
CONDITIONINGCONDITIONINGβ€”
NEGATIVECONDITIONINGβ€”