Donut Krea2 Fusion Control
Fine-tune how Krea 2 fuses text, without a single LoRA
- model
- conditioning_in_1
- conditioning_in_2
- conditioning_in_3
- conditioning_in_4
- model
- conditioning_out_1
- conditioning_out_2
- conditioning_out_3
- conditioning_out_4
- diagnostics
Krea 2 runs its text conditioning through a Qwen3-VL encoder, and the interesting part is how: the text isn't injected once, it's fused through 12 concatenated hidden-state taps that a bias-free "projector" then squeezes down to the conditioning the model actually reads. DonutKrea2FusionControl sits on that fusion path and gives you the knobs to weight it per tap. No LoRAs, no extra safetensors, no downloads - it's pure activation-space math inside the sampler graph, and the node description makes that promise up front: "No external LoRA or safetensors file is loaded."
Why would you want this? Because Krea 2 shipped with a trained-in alignment pass that community nodes like ConditioningKrea2Rebalance and Krea2FilterBypass already fight - people rebalance the conditioning to restore expression the filter flattened. This node lets you do that same class of surgery with explicit per-tap control, and it ships compatibility presets that copy the exact settings from those known community nodes so you can reproduce their behavior without installing them.
What you're actually controlling
Two independent intervention points:
- Pre-fusion tap scaling (
tap_*inputs) - scales the 12 Qwen hidden-state taps before they're fused. Thetap_profilepresets (classic,deep_2,deep_3) are canned weight vectors;classicis the familiar1,1,...,2.5,5.0,1.1,4.0,1.0pattern.tap_strength(-10 to 10) sets how hard the profile applies, andtap_formula/tap_normalizationchange the strength law and how gains are normalized (tensor_rms,rms_gain, …) - the right combo to compare fixed-seed experiments with. - Post-layerwise projector-input scaling (
projector_*inputs) - scales the 12 inputs to Krea 2's 12→1 projector, which is mathematically equivalent to scaling its weight columns. That's a much more surgical lever: you're steering which layers get to speak at the final fusion.
The compatibility_preset dropdown is a UI helper, not a runtime override - the tooltip is explicit about this. It copies values into the visible settings below it, and it's how you get "COPY settings: Krea2FilterBypass 2vector" or the hybrid/donut-balanced profiles into the graph without hand-typing 12-number vectors. Then you tweak from there.
fusion_method picks between standard Krea 2 fusion and the "capitan01R Krea2T-Enhancer operation," with fusion_strength (0–2) scaling whichever you chose.
Wiring it
Inputs: model, plus up to four conditionings (conditioning_in_1 required, 2–4 optional). Outputs mirror that: patched model, four conditioning_out slots, and a diagnostics STRING you can read for what got applied. Note it doesn't take an image - that's DonutKrea2ImageConditioning's job. This node is the second half of the Krea2 finishing kit.
Install
Standard pack install, nothing extra:
cd ComfyUI/custom_nodes
git clone https://github.com/DonutsDelivery/ComfyUI-DonutNodes.git donutnodes
cd donutnodes
python -m pip install -r requirements.txt
or ComfyUI Manager → "DonutNodes," restart.
The honest caveat
This is a deep-control node for people who are already running Krea 2 and chasing a specific failure - usually the refusal-flattening that the KB documents. If you just want a normal Krea 2 workflow, you don't need it. If you want the classic rebalance behavior, the presets are the fastest on-ramp. And because it loads no weights, everything is deterministic and free to experiment with on a fixed seed - which is exactly how the author intends it.
Inputs (24)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| conditioning_in_1 | CONDITIONING | — | |
| compatibility_preset | COMBO | Custom | Select a preset. UncensorFix uses embedded weights and stays selected when its controls are edited. Off passes the input model and conditioning through unchanged, preserving upstream LoRAs and stored control values. |
| tap_method | COMBO | Donut 12-tap gains | 2 options: Donut 12-tap gains, nova452 Rebalance operation |
| tap_profile | COMBO | classic | 5 options: off, classic, deep_2, deep_3, custom |
| per_layer_weights | STRING | 1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.5,5.0,1.1,4.0,1.0 | — |
| tap_strength | FLOAT | 1.00-10–10 | Tap strength. For UncensorFix this scales its embedded weights in both modes. In Simple mode it also drives the selected preset's projector/fusion strength. |
| tap_formula | COMBO | scale_around_1 | 3 options: scale_around_1, geometric_power, raw_multiply |
| tap_normalization | COMBO | tensor_rms | 4 options: none, mean_gain, rms_gain, tensor_rms |
| projector_method | COMBO | Donut projector-input gains | 3 options: Donut projector-input gains, Krea2FilterBypass 2vector diff, Krea2FilterBypass 3vector diff |
| projector_profile | COMBO | off | 5 options: off, classic, deep_2, deep_3, custom |
| projector_layer_weights | STRING | 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.0,2.0,1.0,1.0 | — |
| projector_strength | FLOAT | 1.00-10–10 | Strength of the live post-layerwise projector-input profile. |
| projector_formula | COMBO | scale_around_1 | 3 options: scale_around_1, geometric_power, raw_multiply |
| projector_normalization | COMBO | none | 4 options: none, mean_gain, rms_gain, tensor_rms |
| fusion_method | COMBO | Standard Krea2 fusion | 2 options: Standard Krea2 fusion, capitan01R Krea2T-Enhancer operation |
| fusion_strength | FLOAT | 1.000–2 | Strength used by the selected fusion operation. |
| ui_mode | COMBO | Advanced | Simple hides individual fusion controls. UncensorFix composition and execution remain explicit. |
| conditioning_in_2opt | CONDITIONING | — | |
| conditioning_in_3opt | CONDITIONING | — | |
| conditioning_in_4opt | CONDITIONING | — | |
| uncensorfix_controlsopt | COMBO | Fusion only | Fusion only applies the visible fusion settings. Fusion + UncensorFix weights also applies embedded UncensorFix weights with any preset. Old LoRA modes remain for saved workflows. |
| execution_modeopt | COMBO | Comfy patches | Inherited from the upstream global LoRA execution mode; this legacy widget is ignored when the model already carries a selection. Experimental bypass reuses its forward-adapter path and compatibility fallbacks. The two execution modes are not numerically interchangeable, especially with quantization. |
| uncensorfix_strengthopt | FLOAT | 1.00-20–20 | UncensorFix weight strength, independent of tap/fusion strength. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| conditioning_out_1 | CONDITIONING | — |
| conditioning_out_2 | CONDITIONING | — |
| conditioning_out_3 | CONDITIONING | — |
| conditioning_out_4 | CONDITIONING | — |
| diagnostics | STRING | — |