IPAdapter Embeds Batch
Apply a precomputed reference, skip the encode
- model
- ipadapter
- pos_embed
- neg_embed
- attn_mask
- clip_vision
- MODEL
Most IPAdapter apply nodes take an image and encode it on the spot. This one takes an already-encoded embedding instead. It's the apply node for the precompute workflow: you turned a reference into embeds earlier (with an encoder node, and maybe saved them to disk with Save Embeds), and now you want to apply those embeds directly without re-running CLIP vision. The "Batch" variant is the one for batched/animation contexts, where re-encoding the same reference over and over would be wasted work.
Two situations make this worth using. One, speed and repeatability - feed the same cached embed every run and you skip the encode each time, and you know the conditioning is byte-for-byte identical. Two, control - because you're passing pos_embed and neg_embed as separate wires, you can build, blend, or hand-craft embeddings upstream in ways the image-in nodes don't expose. It's a more advanced entry point into the same machinery.
How it works
It takes your model, the loaded ipadapter, and a pos_embed (the positive reference embedding), and injects that embedding straight into the model's cross-attention - no image, no encoder pass - returning a patched MODEL. An optional neg_embed supplies a negative reference embedding for pushing away from a look. Everything else is the standard apply surface.
The inputs that matter
pos_embed- the encoded reference, typeEMBEDS. This is the whole point of the node; it comes from an encoder node or an IPAdapter Load Embeds node.neg_embed(optional) - an embedding to steer away from, same type.weight- strength, default 1.0. The usual "ease down if the prompt stops mattering" applies.weight_type- the profile enum (linear, ease curves,style transfer,composition, and so on).
start_at / end_at gate when the adapter is active, and embeds_scaling is the injection math - both safe at defaults. Optional attn_mask and clip_vision cover masking and feeding the encoder explicitly. Output is a single MODEL into your sampler.
Installing the pack
ComfyUI Manager: search ComfyUI IPAdapter plus, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/cubiq/ComfyUI_IPAdapter_plus
then restart and keep ComfyUI updated. The adapter weights still need to be in ComfyUI/models/ipadapter. Interestingly, this node doesn't touch a CLIP vision encoder at apply time - the encoding already happened upstream - but whatever produced your embeds did, so you'll have needed the encoders in ComfyUI/models/clip_vision at that point.
Where people get burned
The one rule that matters: an embedding carries the fingerprint of the exact encoder and adapter that made it. Hand this node an embed that was encoded for a different family (SD 1.5 ViT-H vs SDXL bigG) and it'll throw a shape mismatch - the same class of error as the classic ClipVision/IPAdapter mismatch, just arriving through the embeds door. Keep your embeds and your adapter in the same family and it's clean.
The other trip-up is simply not having a valid embed to feed it. If pos_embed is empty or you wired an image where an EMBEDS was expected, the node has nothing to apply. You need an encoder or a Load Embeds node upstream. And as always with this pack: SD 1.5 / SDXL only, maintenance mode, nothing for Flux.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| ipadapter | IPADAPTER | — | |
| pos_embed | EMBEDS | — | |
| weight | FLOAT | 1.00-1–3 | — |
| weight_type | COMBO | 15 options: linear, ease in, ease out, ease in-out, reverse in-out, weak input, +9 | |
| 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 | |
| neg_embedopt | EMBEDS | — | |
| attn_maskopt | MASK | — | |
| clip_visionopt | CLIP_VISION | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |