Linear_Combine_IP_Embeds
Morph Two IP-Adapter Styles With One Slider
- a_embeds
- b_embeds
- embeds
You've got two style references - say, a film-still vibe and a watercolor look - and you want something in between, not either one alone. IP-Adapter already lets you blend reference images, but the results are chunky and hard to tune. This node skips the images and blends at the source: the image embeddings themselves.
Linear_Combine_IP_Embeds takes two EMBEDS tensors - the actual vector representations an IP-Adapter encoder produces from reference images - and does a weighted linear mix: a_strength * a + (1 - a_strength) * b. That's it. No API, no model download, no heavy math. It's pure vector arithmetic, and it's a much finer-grained way to crossfade two styles than averaging whole images or juggling two IP-Adapter applications with different weights.
Where it fits
This is part of Eden.art's style-mixing ("moodmix") family of nodes. The ecosystem around it is easy to spot in the pack: Load_Embeddings_From_Folder turns a folder of saved .pth embeddings into one EMBEDS stack, and Random_Style_Mixture generates random blends from that stack. This node is the deterministic middle child - you pick exactly two styles and dial the mix yourself, which makes it great for finding a sweet spot you then bake into a workflow.
On the mechanism side, worth knowing what you're actually blending: an IP-Adapter embeds a reference image through a CLIP-style image encoder into a direction in embedding space. IP-Adapter's decoupled cross-attention path injects that direction without touching your text prompt. Blend two directions in embedding space and you get a direction that's "between" them - which is exactly why interpolation here feels smooth while mixing reference pixels often doesn't. That decoupling is the whole trick of IP-Adapter, per the KB panel on it.
Inputs and outputs
a_embeds,b_embeds- two EMBEDS inputs. Feed each from whatever produces an IP-Adapter embedding (or fromLoad_Embeddings_From_Folder).a_strength- the slider that matters. 0.5 is a 50/50 mix; 1.0 gives you purea; 0.0 gives you pureb. It's clamped 0β1.optional_target_norm- set it to a positive number and the output gets re-normalized to that length. Default is -1, meaning "leave it alone." You'll rarely need this unless you're hand-tuning embedding norms for the sampler.- Output: a single
embeds(EMBEDS) - wire it into an IP-Adapter node's embedding input.
Installing it
It ships in edenartlab/eden_comfy_pipelines. Via ComfyUI Manager, search "Eden" and install; or manually:
cd ComfyUI/custom_nodes/
git clone https://github.com/edenartlab/eden_comfy_pipelines.git
cd eden_comfy_pipelines
pip install -r requirements.txt
Restart ComfyUI and it shows up under Eden π±. The requirements file pulls in a fair amount (scikit-learn, transformers, opencv-python, clip-interrogator), most of which you don't need for this node alone - so if you only want the embedding utilities, expect to install the whole pack and its deps regardless.
Common issues
The classic gotcha is feeding it two embeddings from different encoders or different sizes - the tensors must be shape-compatible for the addition, so keep both sides on the same IP-Adapter/CLIP vision model. There's no validation, and a shape mismatch fails with an opaque tensor error. Other than that it's about as failure-proof as nodes get.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| a_embeds | EMBEDS | β | |
| b_embeds | EMBEDS | β | |
| a_strength | FLOAT | 0.500β1 | β |
| optional_target_normopt | FLOAT | -1.00 | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| embeds | EMBEDS | β |