Krea2 · Projector + External MLP · LoRA Isolation
Which Part of That Krea 2 LoRA Is Actually Doing the Work?
- model
- model
- configuration
Most people will never need this node, and the README files it as "a small testing utility". But if you've ever wanted to know why a LoRA changes your prompt behaviour instead of just accepting the vibes, nothing else does this job.
It reads exactly three saved weight updates out of a reference adapter - the text-fusion projector and the two external text-MLP linear layers - and gives each its own dial. Everything else in the file - attention, the shared DiT blocks, internal MLP, norms - is excluded.
Why those three
They're the tail of Krea 2's text path. The Qwen3-VL encoder hands over twelve hidden-state taps, the layerwise blocks process them, the projector combines those taps into one fused text vector, the refiner blocks refine it, and the external txtmlp - a small linear/GELU/linear stack outside the DiT - hands the result to the shared blocks. The failure modes the pack author documented while hunting prompt adherence map straight onto those pieces: projector-only edits moved the model but bluntly, txtmlp and text-scale changes improved prompt strength while over-amplifying the whole image, and tap scaling alone changed unrelated detail. This node reruns that experiment on a LoRA you already have, one dial at a time, same seed.
How it works
Safetensors only, read with safe_open. For each selected target it demands exactly one LoRA factor pair stored under the exact ComfyUI prefix - diffusion_model.txtfusion.projector, diffusion_model.txtmlp.1, diffusion_model.txtmlp.3 - plus an optional scalar alpha, and nothing else under that prefix. Factor shapes get checked against the input model's real weights, ComfyUI's own load_lora builds the patch, the model is cloned, and each patch is added with strength_patch set to your mix.
The bit people misread: the mix scales the saved update, not the layer's output. 0.5 is half the delta from the base weights, -1 subtracts it, 0 adds nothing. It is not a strength knob, and there's no reading of it that makes a layer quieter - the tooltips say so.
No runtime hooks, no second sampling pass. Existing patches on the input model are retained, so it's stackable - meaning if you leave the same adapter loaded upstream you're adding its update twice. For a clean test, feed it the base model.
Inputs and outputs
model- the tooltip's advice: use the base Krea 2 model output for an isolated test.source_lora- the selector only lists.safetensors/.sft, and only the three named updates are read.projector_mix,before_gelu,after_gelu- all default1.0, step0.05, and unbounded.before_geluis txtmlp's first linear (before GELU, after R1);after_geluis its second (after GELU, before the DiT);projector_mixis how the twelve text taps get combined.enabled- off returns the input model unchanged: your same-seed baseline.
Outputs are model and configuration. That second string is JSON: status, the applied map, and the literal meaning of the numbers (input weight + amount * saved adapter update). Wire it to a text preview node or you're guessing.
Install
Same pack, same two commands. Manager → search ComfyUI-Krea2T-Enhancer, or:
cd ComfyUI/custom_nodes
git clone https://github.com/capitan01R/ComfyUI-Krea2T-Enhancer.git
Restart. No extra Python packages and no requirements.txt - it uses safetensors and ComfyUI internals, both already present. You do need native Krea2 support, since the node reads diffusion_model.txt* weights off the model.
UNETLoader (base Krea2) -> Krea2 · Projector + External MLP · LoRA Isolation -> sampler
Where it bites
This node refuses to guess - every failure is a raised error, not a quiet approximation:
Krea2 path isolation requires diffusion_model.txtfusion.projector.weight on the input model.→ whatever you fed it isn't a stock Krea 2 model exposing those weights.the source needs exactly one LoRA factor pair for ...→ that file stores the target in a layout it won't touch. LoKr and DoRA exports are out; you need plain LoRA factors (up/downorB/A).unsupported extra tensors at this target: [...]→ the file carries something else under that prefix. It won't pretend to understand it - some full-rank exports do this.the source factors do not match the input model weight shape.→ wrong architecture, a rank-resized or reprojected file, or a Krea 2 variant whose shapes differ.
Also: with enabled off, or all three mixes at 0, it hands the model back untouched, so it's safe to leave parked in a workflow. And since it's a per-layer patch, 1.0 on all three means "apply the full saved projector + MLP update from this file" - a decent test of whether they alone reproduce what you liked about the whole LoRA. If they don't, it lives in the part this node throws away, and no amount of dial-turning brings it back.
One seed, base model, flip enabled, compare. Then raise one mix at a time.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | Use the base Krea2 MODEL output for an isolated test. Existing input patches are retained. | |
| source_lora | COMBO | Reference adapter. Only the three named weight updates are read. Its attention, internal MLP, norm, and other updates are excluded. | |
| projector_mix | FLOAT | 1.00 | Changes how the 12 text taps are combined between LW1 and R0. 0 = no added update; 1 = the saved adapter update; 0.5 = half that update; -1 = subtract it. This does not scale the whole layer output. |
| before_gelu | FLOAT | 1.00 | Changes external MLP layer 1: the linear transformation before GELU, after R1. 0 = no added update; 1 = the saved adapter update; 0.5 = half that update; -1 = subtract it. This does not scale the whole layer output. |
| after_gelu | FLOAT | 1.00 | Changes external MLP layer 3: the linear transformation after GELU, before the DiT. 0 = no added update; 1 = the saved adapter update; 0.5 = half that update; -1 = subtract it. This does not scale the whole layer output. |
| enabled | BOOLEAN | true | Off returns the input model unchanged. Useful for a baseline with the same seed. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| configuration | STRING | — |