KSampler Conditioning Blend π
Two Prompts, One Slider, One Sampler
- model
- positive_a
- positive_b
- negative
- latent_image
- latent
- summary
Sometimes you don't want prompt A or prompt B - you want between them. "50/50 of these two concepts" is a surprisingly common ask, and the stock way to do it is a ConditioningAverage node feeding a KSampler. KSampler Conditioning Blend folds both steps into one node: two positive CONDITIONING inputs, a blend_ratio slider, and it samples for you.
The blend_ratio semantics are the thing to internalize: 1.0 uses positive_a only, 0.0 uses positive_b only, and anything between weighted-averages the two conditioning tensors (including their pooled outputs, when present). The math is identical to ComfyUI's own core ConditioningAverage node - the source says so explicitly, and it copies the same handling for token-length mismatches (the shorter tensor gets zero-padded so you don't hit a silent shape error when two prompts tokenize to different lengths).
Why it's more than a shortcut
The real payoff is sweeping. Because the blend is a widget, you can convert it to an input and drive it from anything - a schedule, a random source, or (neat combo) the value_at_frame output of OmniNodes' Audio-to-Latent Modulator, so the prompt blend pulses with a beat. And if you're doing a manual sweep across a batch of renders, each blend_ratio value shows you exactly where one concept hands off to the other - the transition point between two prompt ideas becomes visible instead of mysterious.
Everything else is a standard sampler: model, negative, latent_image, seed, steps, cfg, sampler_name, scheduler, denoise. It delegates the actual sampling to ComfyUI's core KSampler (called via getattr(instance, instance.FUNCTION), so it stays correct even if core renames its internal method), which means there's no risk of this node quietly diverging from stock sampling behavior. Outputs are the sampled latent plus a summary describing the run.
The honest review
If you've never needed to interpolate between prompts, this node solves a problem you don't have - a plain KSampler does everything else it does. But the moment you want "this concept but a little of that concept too," or you want to find the blend where an image actually reads as both, this is cleaner than hand-wiring a ConditioningAverage node, and it removes a whole graph step. For iterative prompt exploration it's genuinely the right tool.
One caveat that applies to any conditioning interpolation: blending in conditioning space isn't the same as "50% of each image." The result depends on how the two prompts interact inside the model, and near 0.5 you sometimes get a third, unexpected concept rather than a clean halfway point. That's physics, not a bug - it's exactly why the sweep trick is worth doing.
Install
ComfyUI Manager β search OmniNodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/TensorVizion/OmniNodes
Restart ComfyUI; find it under TensorVizion/Sampling. No extra dependencies - it wraps core sampler code.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | β | |
| positive_a | CONDITIONING | β | |
| positive_b | CONDITIONING | β | |
| blend_ratio | FLOAT | 0.500β1 | β |
| negative | CONDITIONING | β | |
| latent_image | LATENT | β | |
| seed | INT | 00β18446744073709550000 | β |
| steps | INT | 201β10000 | β |
| cfg | FLOAT | 7.00β100 | β |
| sampler_name | STRING | dpmpp_2m | β |
| scheduler | STRING | karras | β |
| denoise | FLOAT | 1.000β1 | β |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | β |
| summary | STRING | β |