Generated reference · ComfyUI workflow · Composition & editing

Regional Composition

Multi-region prompt composition on SDXL: a base scene prompt plus up to two independently prompted regions placed by area (core percentage-area conditioning), for controllable subject placement without masks

Composition & editing16nodesGPU A5000out image~55sv1.0.0

On this page
16Graph nodes
10Node classes
16Inputs
2Models

Tags: compositionregionalarea conditioningmulti-promptplacement

Inputs (16)#

The typed parameter surface callers bind when they request this workflow. Enum options and numeric bounds are the values the workflow document declares.

base_promptstringrequired
Overall scene prompt applied to the whole canvas
region_1_promptstringrequired
What appears inside region 1
region_1_areaenumdefault left_half
Where region 1 sits on the canvas
options: left_halfright_halftop_halfbottom_halfcentertop_lefttop_rightbottom_leftbottom_right
region_1_strengthfloatdefault 1.1min 0.1max 3.0
Conditioning strength of region 1 relative to the base prompt
region_2_enabledbooleandefault false
Add a second prompted region
region_2_promptstringdefault
What appears inside region 2
region_2_areaenumdefault right_half
Where region 2 sits on the canvas
options: left_halfright_halftop_halfbottom_halfcentertop_lefttop_rightbottom_leftbottom_right
region_2_strengthfloatdefault 1.1min 0.1max 3.0
Conditioning strength of region 2 relative to the base prompt
seedintegerdefault -1
Random seed (-1 for random)
widthintegerdefault 1024min 768max 1536
Output width
heightintegerdefault 1024min 768max 1536
Output height
stepsintegerdefault 34min 15max 60
Sampling steps
cfg_scalefloatdefault 7.5min 1.0max 15.0
Prompt adherence strength
hires_fixbooleandefault true
Two-pass hires refinement (1.5x latent upscale + low-denoise second pass)
freeubooleandefault true
FreeU v2 feature re-weighting
checkpointenumdefault sdxl_base
SDXL checkpoint
options: realvis_xl_v5sdxl_base

ComfyUI node graph (16)#

The executable ComfyUI prompt graph: 16 nodes across 10 distinct node classes, wired by 23 data dependencies. Nodes tinted green come from a custom node pack this workflow declares; the rest are ComfyUI core / baked-community classes.

flowchart TD n0["1: CheckpointLoaderSimple"] n1["2: CLIPTextEncode"] n2["3: CLIPTextEncode"] n3["4: CLIPTextEncode"] n4["5: ConditioningSetAreaPercentage"] n5["6: ConditioningCombine"] n6["7: EmptyLatentImage"] n7["8: KSampler"] n8["9: VAEDecode"] n9["10: SaveImage"] n10["r2_encode: CLIPTextEncode"] n11["r2_area: ConditioningSetAreaPercentage"] n12["r2_combine: ConditioningCombine"] n13["freeu: FreeU_V2"] n14["hires_upscale: LatentUpscaleBy"] n15["hires_sampler: KSampler"] n0 -->|clip| n1 n0 -->|clip| n2 n0 -->|clip| n3 n3 -->|conditioning| n4 n1 -->|conditioning_1| n5 n4 -->|conditioning_2| n5 n13 -->|model| n7 n12 -->|positive| n7 n2 -->|negative| n7 n6 -->|latent_image| n7 n15 -->|samples| n8 n0 -->|vae| n8 n8 -->|images| n9 n0 -->|clip| n10 n10 -->|conditioning| n11 n5 -->|conditioning_1| n12 n11 -->|conditioning_2| n12 n0 -->|model| n13 n7 -->|samples| n14 n13 -->|model| n15 n12 -->|positive| n15 n2 -->|negative| n15 n14 -->|latent_image| n15
Data-flow DAG — scroll to zoom, drag to pan.

Nodes (16)#

1CheckpointLoaderSimplecore
ckpt_name = {{checkpoint_files[checkpoint]}} tmpl
outputs: MODELCLIPVAE
2CLIPTextEncodecore
text = {{base_prompt}} tmplclip = ◂ node 1 · out[1]
outputs: CONDITIONING
3CLIPTextEncodecore
text = ugly, deformed, blurry, low quality, watermark, text, signature, duplicated subject, merged figuresclip = ◂ node 1 · out[1]
outputs: CONDITIONING
4CLIPTextEncodecore
text = {{region_1_prompt}} tmplclip = ◂ node 1 · out[1]
outputs: CONDITIONING
5ConditioningSetAreaPercentagecore
conditioning = ◂ node 4 · out[0]width = {{area_configs[region_1_area].width}} tmplheight = {{area_configs[region_1_area].height}} tmplx = {{area_configs[region_1_area].x}} tmply = {{area_configs[region_1_area].y}} tmplstrength = {{region_1_strength}} tmpl
outputs: CONDITIONING
6ConditioningCombinecore
conditioning_1 = ◂ node 2 · out[0]conditioning_2 = ◂ node 5 · out[0]
outputs: CONDITIONING
7EmptyLatentImagecore
width = {{width}} tmplheight = {{height}} tmplbatch_size = 1
outputs: LATENT
8KSamplercore
model = ◂ node freeu · out[0]positive = ◂ node r2_combine · out[0]negative = ◂ node 3 · out[0]latent_image = ◂ node 7 · out[0]seed = {{seed}} tmplsteps = {{steps}} tmplcfg = {{cfg_scale}} tmplsampler_name = dpmpp_2m_sdescheduler = karrasdenoise = 1.0
outputs: LATENT
9VAEDecodecore
samples = ◂ node hires_sampler · out[0]vae = ◂ node 1 · out[2]
outputs: IMAGE
10SaveImagecore
images = ◂ node 9 · out[0]filename_prefix = regional_composition
r2_encodeCLIPTextEncodecore
text = {{region_2_prompt}} tmplclip = ◂ node 1 · out[1]
outputs: CONDITIONING
r2_areaConditioningSetAreaPercentagecore
conditioning = ◂ node r2_encode · out[0]width = {{area_configs[region_2_area].width}} tmplheight = {{area_configs[region_2_area].height}} tmplx = {{area_configs[region_2_area].x}} tmply = {{area_configs[region_2_area].y}} tmplstrength = {{region_2_strength}} tmpl
outputs: CONDITIONING
r2_combineConditioningCombinecore
conditioning_1 = ◂ node 6 · out[0]conditioning_2 = ◂ node r2_area · out[0]
outputs: CONDITIONING
freeuFreeU_V2core
model = ◂ node 1 · out[0]b1 = 1.1b2 = 1.2s1 = 0.6s2 = 0.4
outputs: MODEL
hires_upscaleLatentUpscaleBycore
samples = ◂ node 8 · out[0]upscale_method = bislerpscale_by = 1.5
outputs: LATENT
hires_samplerKSamplercore
model = ◂ node freeu · out[0]positive = ◂ node r2_combine · out[0]negative = ◂ node 3 · out[0]latent_image = ◂ node hires_upscale · out[0]seed = {{seed}} tmplsteps = 14cfg = {{cfg_scale}} tmplsampler_name = dpmpp_2mscheduler = karrasdenoise = 0.45
outputs: LATENT

Parameter banks (1)#

The prompt / configuration lookup tables this workflow keys into from its inputs — the vocabulary that turns a style / palette / preset selection into graph parameters.

area_configs (9)#

left_half
{"x": 0.0, "y": 0.0, "width": 0.5, "height": 1.0}
right_half
{"x": 0.5, "y": 0.0, "width": 0.5, "height": 1.0}
top_half
{"x": 0.0, "y": 0.0, "width": 1.0, "height": 0.5}
bottom_half
{"x": 0.0, "y": 0.5, "width": 1.0, "height": 0.5}
center
{"x": 0.25, "y": 0.25, "width": 0.5, "height": 0.5}
top_left
{"x": 0.0, "y": 0.0, "width": 0.5, "height": 0.5}
top_right
{"x": 0.5, "y": 0.0, "width": 0.5, "height": 0.5}
bottom_left
{"x": 0.0, "y": 0.5, "width": 0.5, "height": 0.5}
bottom_right
{"x": 0.5, "y": 0.5, "width": 0.5, "height": 0.5}

Models & dependencies#

Checkpoint aliases (2)#

realvis_xl_v5
RealVisXL_V5.0_fp16.safetensors
sdxl_base
sd_xl_base_1.0.safetensors

Models required (2)#

RealVisXL_V5.0_fp16.safetensors
sd_xl_base_1.0.safetensors

Output contract#

What a successful run of this workflow returns.

type
image
format
png
channels
4

Taxonomy & routing#

How the control plane classifies this workflow — from the committed workflow-taxonomy-registry.json. It drives the consistency / control surface the agentic director can exercise over the workflow.

assetFamily
multi-region-composed-still
outputPackageProfile
image-single-profile
controlModalities
prompt-template-lockmodel-locksampler-scheduler-lockseed-lock
consistencyDimensions
environment
notes
Core percentage-area conditioning: base scene plus up to two placed regions with independent prompts and strengths.