IPAdapter Style & Composition SDXL V2
One image for style, one for layout — SDXL only
- model
- ipadapter
- image_style
- image_composition
- image_negative
- attn_mask
- clip_vision
- MODEL
Here's a workflow problem: you want a scene arranged like photo A but painted like photo B, and no amount of prompt engineering gets you both. IPAdapterStyleCompositionV2 is the node built for exactly that. It takes two reference images - one for style, one for composition - encodes them separately, and injects both into the model, each with its own weight. It's the "best of both references" node, and it's the reason the display name is "IPAdapter Style & Composition SDXL V2": this only works on SDXL. Feed it an SD 1.5 model and it throws "Style + Composition transfer is only available for SDXL models at the moment."
The mechanism is the advanced apply pipeline with a split brain. Internally, image_style becomes the primary image and the node switches the weight curve to style and composition (or strong style and composition if expand_style is on), while image_composition rides along as a separate encoding. Two CLIP passes, two embeddings, one combined injection.
The inputs that matter:
image_style- where the look comes from: palette, texture, renderingimage_composition- where the arrangement comes from: subject placement, scene structureweight_style/weight_composition- independent faders for each (default 1.0 each, range −1 to 5). This is the whole appeal - you can run style at 0.8 and composition at 1.2 and not have them fightexpand_style- off by default. On, it picks the strong style-and-composition curve, so the reference pair pushes harder against the promptcombine_embeds- how the two encodings merge, defaultaverage
Plus the usual start_at/end_at, embeds_scaling, and optional image_negative, attn_mask, clip_vision. Output is a patched MODEL.
When you'd reach for it
Art-directing from two photos is the killer use: "keep the composition of the product shot, but render it like this painting." Same for character work - pose and framing from one reference, clothing/texture style from another. It's also a genuinely good fallback when a single reference has a layout you love and a look you hate: split them into two images and dial each independently.
Install
Part of chflame163/ComfyUI_IPAdapter_plus_V2, the V2 fork of cubiq's pack. Manager → search ComfyUI_IPAdapter_plus_V2, or:
cd ComfyUI/custom_nodes
git clone https://github.com/chflame163/ComfyUI_IPAdapter_plus_V2
Restart. No pip requirements.
Gotchas
The SDXL-only restriction is the big one - don't reach for this on SD 1.5 or Pony-for-SD15 workflows; use two separate apply nodes instead. expand_style is a real lever, not a gimmick: with it off the references cooperate with the prompt; with it on they start overriding it, so treat it as "louder" rather than "better." And both images should be prepped to a sensible aspect - see PrepImageForClipVisionV2 if one of them is a weird crop, because the composition reference's framing is exactly what you're asking the model to copy. If your references are a sequence rather than a single pair, the Batch version of this node handles them per-frame instead of averaging them together.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| ipadapter | IPADAPTER | — | |
| image_style | IMAGE | — | |
| image_composition | IMAGE | — | |
| weight_style | FLOAT | 1.00-1–5 | — |
| weight_composition | FLOAT | 1.00-1–5 | — |
| expand_style | BOOLEAN | false | — |
| combine_embeds | COMBO | average | 5 options: concat, add, subtract, average, norm average |
| start_at | FLOAT | 0.0000–1 | — |
| end_at | FLOAT | 1.0000–1 | — |
| embeds_scaling | COMBO | 4 options: V only, K+V, K+V w/ C penalty, K+mean(V) w/ C penalty | |
| image_negativeopt | IMAGE | — | |
| attn_maskopt | MASK | — | |
| clip_visionopt | CLIP_VISION | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |