Nodes/EmbeddingsCurveEditor_ComfyUI/Embeddings Curve Editor
ComfyUI Node

Embeddings Curve Editor

The tiny node that finally shows you what IPAdapter is sending

By chris-the-wiz·Created 2 years ago·Updated 2 years ago· 7
Embeddings Curve Editor
  • embed
  • image
  • embed
text(0,1.0),(0.25,1.0),(0.75,1.0),(1.0,1.0)

If you've ever fought IPAdapter's start_at/end_at and weight_type sliders, this is the node that replaces them with a picture. Embeddings Curve Editor is a one-trick pony, but the trick is genuinely useful: it lets you draw a curve that gets multiplied, element-by-element, into an embedding - and it plots the whole thing so you can see what you're doing. The author (chris-the-wiz, posting on r/comfyui as Zucchini_Weak) built it as a first custom node specifically because IPAdapter-plus's coarse start/end controls weren't fine enough. It's a utility, not a headline feature, but once you've used it to inspect an embedding you'll keep it around.

How it works

An embedding is just a 1D tensor - for IPAdapter-plus, an EMBEDS tensor with one value per position along its sequence. This node builds a cubic B-spline from control points you type as (x,y) pairs, samples it across the embedding's length, and multiplies those weights into the embedding. Out comes a reshaped embedding: the curve is the envelope, and everything inside gets scaled by it.

Two details matter because they'll surprise you. First, the spline's y-values are normalized to 0–1, so this is an attenuation tool, not an amplifier - you shape which positions dominate, you can't boost the whole thing past its original strength. Second, a cubic B-spline needs at least four control points; the default (0,1.0),(0.25,1.0),(0.75,1.0),(1.0,1.0) is exactly that, so if you trim down to three points you'll hit a hard error.

The inputs and outputs that matter

There are only two inputs, both worth knowing:

  • text - your control points as comma-separated (x, y) tuples. X runs 0→1 across the embedding's length, Y is the weight. Add as many as you like; that's the whole editing surface.
  • embed - the EMBEDS tensor, almost always straight out of an IPAdapter-plus encoder node. Without that pack installed, there's no node that produces this type at all.

Outputs are two, both always produced:

  • embed - the reweighted EMBEDS, wired onward into your IPAdapter apply node in place of the original.
  • image - a 256-pixel-tall graph: red is the original embedding values, white is your curve, blue is the result. Since the node is flagged as an output node, this preview shows up right in your UI, which makes iterating on settings genuinely fast - the author's accidental discovery was that ComfyUI caches the original embedding, so reweighting is cheap.

The pack's README notes it "should work on any 1D input tensor," and the code agrees - it doesn't care what produced the embedding. In practice you'll use it with IPAdapter-plus, which is the only mainstream source of the EMBEDS type.

Installing it

Either route is fine:

  • ComfyUI Manager → Install Custom Nodes → search Embeddings Curve Editor (the pack title is EmbeddingsCurveEditor_ComfyUI), install, restart.
  • Or manually: cd ComfyUI/custom_nodes && git clone https://github.com/chris-the-wiz/EmbeddingsCurveEditor_ComfyUI, then restart.

Dependencies are numpy, Pillow, scipy, regex - nothing exotic; ComfyUI ships most of it already and Manager will sort the rest. There are no model files to download, and the whole pack is a single ~4 KB Python file plus a license, which is its own kind of appealing.

Where people get burned

The classic trap is treating the curve like a gain knob and trying to push values above 1.0 - it won't amplify, because everything gets normalized back to 0–1 before the multiply. If your change seems to do nothing at all, check that you still have four or more control points, and remember the graph's y-axis is per-position weight, not raw magnitude. And if the embed input shows up red/unwired, you're missing IPAdapter-plus; install that first. It's a niche tool - nobody's embedding a whole workflow around it - but as a debug window into what your embeddings actually look like, it's the one I'd reach for.

CategoryChris's nodes

Inputs (2)

NameTypeDefaultDescription
textSTRING(0,1.0),(0.25,1.0),(0.75,1.0),(1.0,1.0)
embedEMBEDS

Outputs (2)

NameTypeDescription
imageIMAGE
embedEMBEDS