Differential Feature Guidance (DFG)
When concept strength and CFG fight, this node makes them independent
- conditioning
- embedding
- negative_conditioning
- positive
- negative
With Apply Embedding Qwen, your concept's influence and the sampler's cfg are tangled up in one dial - crank CFG and you're implicitly cranking the concept, too. Differential Feature Guidance (DFG) is the node that untangles them. It computes the concept's direction in conditioning space and lets you scale it independently of KSampler's cfg, so you get two separate knobs: strength controls only the concept, cfg keeps doing its normal text-guidance job. If your CFG sweeps keep blowing out a concept, or the concept won't show up no matter what you do to CFG, this is the node you were looking for.
The mechanism is dead simple, and it's worth understanding because it explains the weird-looking strength scale. The node takes your text conditioning and your text-plus-concept conditioning, and produces:
output = text_only + strength × (text + concept − text_only)
The parenthetical is the concept direction - what the concept adds on top of the plain text. strength scales exactly that difference. At 0 you get plain text (no concept), at 1.0 the full concept is in, and because there's nothing clamping the difference term, strength above 1.0 extrapolates and amplifies the concept beyond what it was trained to express. That's the knob the Apply node won't give you.
The inputs and outputs
- conditioning - your positive CLIP encode.
- embedding - the
KINAMIX_EMBEDDINGoutput from Load Kinamix Embedding. - strength - default 0.03, range 0–5. Read that default again, because it's the thing that trips everyone up. This is a different scale from Apply Embedding Qwen's 0–1 slider. 0.01 is subtle, 0.05 is already moderate, 1.0 is full, and anything past 1.0 is deliberate amplification. Do not set this to 0.75 on your first run expecting Apply-style behavior.
- negative_conditioning (optional) - if you feed your actual negative here, it's used as-is; if you leave it empty, the node deep-copies your positive as the negative baseline.
The outputs are the big difference from the single-embedding path: positive and negative, and you wire both into KSampler. The negative is your text baseline without the concept - the thing CFG pushes against - which is what gives you that clean separation of duties. One more naming note while you're in the code: the node docstring calls it "Decomposed Flow Guidance" while the README and the pack listing say "Differential Feature Guidance." Same node, same formula, just an author who hasn't settled on one name yet.
Installing it
It ships in the same tiny pack as the rest - no heavy deps, just torch:
cd ComfyUI/custom_nodes
git clone https://github.com/latentwill/kinamix-embeddings-comfyui.git
Restart ComfyUI, make sure your .safetensors embeddings live in ComfyUI/models/embeddings/, or grab the pack by searching kinamix-embeddings-comfyui in ComfyUI Manager.
Where it bites
The usual dim-mismatch error applies: the embedding's hidden dim has to match the text encoder you loaded (3584 for Qwen-Image's Qwen2.5-VL), or the node raises a clear "trained for a different encoder" error - that check runs here too, on the positive conditioning. And a reminder about this pack's age: when I checked, it had zero reddit presence and zero search impressions, so you're early. The reference workflows in the repo are the ground truth - the apply_embedding_qwen.json file has a detailed in-graph note about the two-knob philosophy that's worth reading even if you're coming in through DFG.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| conditioning | CONDITIONING | — | |
| embedding | KINAMIX_EMBEDDING | — | |
| strength | FLOAT | 0.0300–5 | — |
| negative_conditioningopt | CONDITIONING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |