Nodes/ComfyUI-Conditioning-Rebalance/Krea 2 Image Edit Rebalance Steering
ComfyUI Node

Krea 2 Image Edit Rebalance Steering

One dial that makes Krea 2 Edit obey the prompt

By nova452·Created 3 months ago·Updated a day ago· 524
Krea 2 Image Edit Rebalance Steering
  • clip
  • image1
  • image2
  • image3
  • image4
  • base
  • conditioning
◄text—►
◄steering0.00►
◄layer_multiplier1.00►
◄image1_tokensnormal►
◄image2_tokensnormal►
◄image3_tokensnormal►
◄image4_tokensnormal►

If you've used Krea 2 Edit and felt like the model was reading your prompt with one eye closed, this node is the community's answer to that. It's the single-knob version of the pack's Krea 2 Image Edit Rebalance: you set a reference image or four, type the edit you want, and one steering value decides how hard the conditioning pushes against the model's trained-in refusals.

Why this exists

Krea was unusually straight about it. The open weights went through an alignment pass the hosted model never got, confirmed on the record by Krea's own head of research in the release-day AMA. The result isn't SD3-style anatomy collapse - it's a refusal. Clauses about bodies, expressions, violence and horror get silently dropped, so "her laughing" comes back a pleasant blank face. People called them craters, and they aren't confined to NSFW.

Krea 2 got a filter-removal custom node within hours of release, and this pack is that lineage - the node below was originally published as ComfyUI-ConditioningKrea2Rebalance, which is why old index entries still point at that name. This steering variant is the cleaned-up version: instead of the per-layer weight strings the full node exposes, you get steering and layer_multiplier.

What it actually does

Two encodes per pass, then a subtraction.

  1. Your text is encoded through clip as the main conditioning, with your images attached.
  2. A stripped-down reference prompt is encoded the same way - no user instruction, just the framing the encoder expects for the image side.
  3. Both get refocused with fixed per-layer weights: the main branch keeps essentially a single tap layer at a big ×12 multiplier, and the reference branch keeps everything at ~1.09 with that same layer zeroed. The two branches are deliberately made to disagree in the encoder's layer space.
  4. Those two are then passed to the pack's contrastive guidance: it computes the per-token direction between them, normalises it, projects the conditioning onto it, and adds sign × steering × projection back.

In plain terms: positive steering amplifies what makes your prompt distinctive, and negative steering subtracts a direction - which is the mechanism behind the README's line about "negative prompting for stripping undesired effects." It's the same family of move as NAG, done in conditioning space instead of inside the sampler.

Inputs, outputs, and what to touch

text, clip, steering, layer_multiplier are required; image1–image4 (each with a token tier) are optional.

Set steering first and leave it alone for a while. The default is 0.0, which is a legitimate baseline - you get the refocusing with no contrastive push, so it's your control condition. Range is −2 to 2. layer_multiplier scales the whole per-layer scheme on both branches; at 1.0, 0.0 or a negative value you will get something strange, and there is no reason to go there until steering is dialled in.

The token tiers (low, normal, high, max) are the longest-side resolution each reference is scaled to before encoding: 384, 768, 1024, 1280 pixels. Bigger reference, more vision tokens, more time and VRAM. Start on normal.

Two outputs, and they are not interchangeable. base is your images encoded cheaply - a fixed 32px longest side, no steering - and conditioning is the steered result. Which one goes where depends on the model's wiring, so open the workflow that ships with the pack (workflows/Krea 2 Edit (Full Context).json) rather than guessing.

Cost, caching and the honest caveat

Passes are per-frame: four reference images means four encode-plus-guidance passes, then the pack merges them with its own top_match merge at match_percent 0.8. That's where VRAM goes with multi-character references. A bounded cache keyed on the image signature, the CLIP identity and your parameters means re-queuing unchanged inputs is nearly free - but nudging steering invalidates it.

And the caveat the community keeps repeating: bypassing the filter is not free. Users report it costs some character knowledge and prompt adherence, which is why the uncensor LoRA became the preferred tool for that specific job. Tune rather than accept defaults. Separately, Krea's licence prohibits circumventing safety mechanisms - nobody has documented enforcement against a local user, but it's your call.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/nova452/Rebalance-Pack.git
# restart ComfyUI, then hard-refresh the browser (Ctrl+Shift+R)

Manager users: search Rebalance Pack. No requirements.txt, no model downloads - it runs on your existing ComfyUI torch. If you still have the old ComfyUI-ConditioningKrea2Rebalance folder installed, delete it; the node classes overlap and you'll get confusing duplicate registrations.

clip must be Krea 2's own encoder (stock CLIPLoader with type krea2) - the node hardcodes the Krea 2 chat template, bits included, so a different encoder will tokenize your prompt into something the model wasn't trained to read. Which is also the most common reason "steering did nothing": wrong encoder, or a steering left at 0.

CategoryRebalance-Pack/conditioning

Inputs (12)

NameTypeDefaultDescription
textSTRING—
clipCLIP—
steeringFLOAT0.00-2–2—
layer_multiplierFLOAT1.00-1000000000–1000000000—
image1optIMAGE—
image1_tokensoptCOMBOnormal4 options: low, normal, high, max
image2optIMAGE—
image2_tokensoptCOMBOnormal4 options: low, normal, high, max
image3optIMAGE—
image3_tokensoptCOMBOnormal4 options: low, normal, high, max
image4optIMAGE—
image4_tokensoptCOMBOnormal4 options: low, normal, high, max

Outputs (2)

NameTypeDescription
baseCONDITIONING—
conditioningCONDITIONING—