Nodes/radiance/Regional Prompt
ComfyUI Node

Regional Prompt

Boxes, masks and prompts that stay where you put them

By FXTD-Studios·Created 8 months ago·Updated about 18 hours ago· 246
Regional Prompt
  • base_cond
  • region_cond
  • mask
  • ip_image
  • conditioning
  • region_info
◄region_labelregion_1►
◄x0.00►
◄y0.00►
◄w0.50►
◄h0.50►
◄region_strength1.00►
◄global_strength0.50►
◄merge_modeAdditive►
◄ip_weight0.60►

Regional Prompt gives a chunk of the canvas its own text prompt. One node, one region: you set the box, you set the strength, and that prompt stops bleeding into everything else. Chain several and you've built a regional composition out of reusable pieces - a red-haired character on the left, a blue-haired one on the right, a background prompt underneath both.

If you've used Forge Couple or A1111's Regional Prompter, this is the native-ComfyUI equivalent, and the underlying mechanism is the same one every implementation uses: ComfyUI's area conditioning, which restricts a conditioning tensor to a spatial window. The KB's regional-prompting panel is blunt about why this keeps getting rebuilt for every new architecture - the need is structural, because a single prompt describing two subjects smears their attributes together, and no wording fix cures it.

The inputs that matter

You need two CONDITIONING inputs, and the distinction is the whole design:

  • base_cond - the global positive conditioning for the whole frame. It's passed through at global_strength (default 0.5).
  • region_cond - the encoded prompt for this region. Encode it with a CLIP Text Encode node and wire it in; the node restricts it to the box.

The box is fractional, which is the right choice because it survives a resolution change: x and y are the left/top edge as a fraction of width/height (both 0–1), and w and h are size as a fraction (0.01–1). Defaults give you the top-left quarter. region_label is just a human-readable name used in the JSON output - call it hair_left, not region_1, and your region_info strings will actually mean something six nodes later.

region_strength (default 1) weights this region against the global. global_strength (default 0.5) weights the base conditioning. Both go to 2, and going much past 1 is how people get burned - conditioning magnitude above the model's training distribution produces saturated mush, not obedience.

merge_mode is the interesting one. Additive (the default, and the safe one) adds the region on top of the global. Replace swaps the global out inside that region while the global still applies outside it, masked. Replace is what you want when the global prompt is actively fighting you inside a box - say the global says "wide shot of a forest" and you need one region to be a face. Additive is what you want the rest of the time, because Replace can leave visible seams where the conditionings swap.

Chaining is the workflow

base_cond and the conditioning output are the same type, and the node's own description tells you the behaviour when you chain: regions from earlier nodes keep their own strength and area as they pass through. So the pattern is: encode global → Regional Prompt (region A) → Regional Prompt (region B, feeding the first node's output into base_cond) → sampler positive. Each node adds one region and passes everything through. That's a much more pleasant graph to edit than a grid node's JSON array, and it's why I'd reach for this one over Regional Grid for anything that isn't genuinely a uniform grid.

The mask input is optional and worth knowing about: when connected, it overrides x/y/w/h with the mask's bounding box. So you can pull a real matte - from a segmentation pass, a depth-derived mask, a hand-painted one - and let the geometry come from the image instead of typed numbers. Note that it's the bounding box, not the mask shape, so a diagonal mask becomes a rectangle.

And the input that does nothing

ip_image and ip_weight are both marked IGNORED in the schema, and the tooltip is refreshingly direct about it: IP-Adapter is a model-side attention patch, not a conditioning key, so it can't be enabled from a conditioning node. They exist only so old graphs still load, connecting them logs a warning, and nothing changes. The fix is to apply an IPAdapter node to the MODEL before the sampler. If you're following an old tutorial that wires an image into this node, that's why it isn't doing anything.

Outputs and install

conditioning goes to the sampler's positive input. region_info is a STRING describing the region - the label, and what it resolved to.

Install via ComfyUI Manager (search Radiance, install, restart, refresh) or:

cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
python -m pip install -r requirements.txt

Same pack, same dependencies as everything else here - you're pulling a large HDR/colour node set along with it. No models needed for this node; the conditioning work is arithmetic on tensors.

Quick sanity checklist

  • Regions do nothing? Check base_cond is actually connected and you're not feeding the sampler the un-regionalised conditioning by mistake.
  • Attributes still bleeding? region_strength up a notch, global_strength down - and check your box actually covers the subject.
  • Hard edge down the middle of a face? You're on Replace. Try Additive.
  • Model ignores the region entirely and just follows the global? Your region_cond is probably encoded with a prompt too short to have any weight. Give it a subject, not a word.
CategoryFXTD STUDIOS/Radiance/Generate

Inputs (13)

NameTypeDefaultDescription
base_condCONDITIONINGGlobal positive conditioning, passed through with its strength set to global_strength. When chaining, regions from earlier nodes keep their own strength and area.
region_condCONDITIONINGEncoded prompt for this region, restricted to the x/y/w/h box (or the mask's bounding box) via ComfyUI area conditioning.
region_labelSTRINGregion_1Human-readable label for this region (used in JSON output).
xFLOAT0.000–1Left edge of region as fraction of image width.
yFLOAT0.000–1Top edge of region as fraction of image height.
wFLOAT0.500.01–1Width of region as fraction of image width.
hFLOAT0.500.01–1Height of region as fraction of image height.
region_strengthFLOAT1.000–2Conditioning weight for this region vs global.
global_strengthFLOAT0.500–2Weight of the global base conditioning passed through.
merge_modeCOMBOAdditiveAdditive: region added on top of global (default, safe). Replace: region replaces global in its area; the global still applies outside it (masked).
maskoptMASKOptional. When connected, overrides x/y/w/h with the mask's bounding box.
ip_imageoptIMAGEIGNORED. Kept so existing graphs still load. IP-Adapter is a model-side attention patch, not a conditioning key, so it cannot be enabled from this node. Apply an IPAdapter loader/apply node to the MODEL before the sampler instead. Connecting this logs a warning and changes nothing.
ip_weightoptFLOAT0.600–1.5IGNORED. See ip_image. Set the weight on the IPAdapter node that patches the MODEL.

Outputs (2)

NameTypeDescription
conditioningCONDITIONING—
region_infoSTRING—