Krea2 Text Encode — Attention-Weighted Phrases
1.5). This node applies it inside attention instead.
- model
- clip
- model
- conditioning
- weight_report
You switched to Krea 2, typed (face close to the lens:1.5) out of muscle memory, and got a prompt that literally asks for a parenthesized number. Krea 2's text encoder is Qwen3-VL, not a CLIP, and the old weighting syntax doesn't weight anything there - it gets fed to the encoder as ordinary punctuation. The standard advice is "say it in words instead." This node is the exception that actually delivers what you wanted: real phrase weighting on Krea 2, applied where it can survive - inside attention.
Why Krea 2 broke weighting in the first place
This isn't a lazy port problem. Krea 2's conditioning isn't one tidy vector per token like SDXL's 768 or Flux's 4096. The text encoder hands over twelve selected Qwen hidden-state taps, a 12 x 2560 stack per token position, which then goes through Krea 2's internal text-fusion path before text and image tokens meet in the shared DiT blocks.
That layout fights every classic trick. Multiply a finished conditioning row and later normalization quietly eats your boost. Repeat a token to make it louder and you change the sequence length, which wrecks how terms relate across a long prompt. The Krea2AttentionWeightedPhraseEncoder's answer: don't touch the rows at all. It strips the (phrase:weight) annotation, encodes the perfectly clean text, then patches the model so that in every shared DiT block, image queries attending to the phrase's text keys get log(weight) added to their attention logits. After softmax, that phrase's odds are multiplied by the weight, and nothing else changes. No vectors scaled, no tokens duplicated, no sequence length touched.
The wiring, and the trap that burns people
The node takes three required inputs:
- model - your final Krea 2 model chain, after every LoRA loader. This is what gets patched.
- clip - a text encoder loaded with the Krea2 CLIP type.
- text - the prompt, with optional
(phrase:weight)sections.
It outputs a matched pair plus a diagnostic: model (the patched clone) and conditioning (normal, unscaled Krea 2 conditioning for the annotation-free prompt), and a weight_report STRING. The report is just for inspection - wire it to a ShowText-style node if you ever want to see exactly which Qwen token rows a phrase landed on. It isn't needed to sample.
Here's the part people miss: you must use both main outputs together. The patched MODEL and this node's CONDITIONING are a pair - the patch knows the exact text-key positions this conditioning was encoded from. Don't keep your old Text Encode node feeding the positive path; that orphaned conditioning won't match the patched attention. Model output to the sampler, conditioning output to positive, done.
Weight semantics
1.0 is an exact no-op. Above 1.0 raises the phrase's attention odds, between 0.0 and 1.0 lowers them, 0.0 suppresses them. Since it's an odds multiplier, 2.0 means twice the attention odds, not twice the visible object - after softmax renormalizes every key, huge weights just make a phrase fight your composition instead of winning gracefully. Start around 1.5–2.0, tune one phrase at a time, and keep seed and sampler fixed while you compare. Weighted sections can't nest or overlap, and negative weights aren't supported here.
Installing and running it
ComfyUI Manager (search "Krea2T Enhancer"), or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/capitan01R/ComfyUI-Krea2T-Enhancer.git
Then restart ComfyUI. There are no extra pip packages - the pack reuses the Qwen tokenizer ComfyUI already bundles for Krea 2. What you do need is the whole Krea 2 stack underneath: ComfyUI 0.25.0+, the Krea-2-Raw or Turbo weights, the Qwen3-VL text encoder and Qwen-Image VAE files (the ones new users routinely forget). No Krea 2 setup, no node.
Where it bites
The node validates hard and loudly. Wrong text encoder, a MODEL that doesn't expose Krea 2's expected text-fusion layout, tokenization that doesn't match the local Qwen tokenizer - it raises rather than silently mis-applying an uncertain mapping. Annoying until you hit it, then you're glad. One real-world gotcha from the field: after ComfyUI updates, this pack has occasionally broken with a krea2t_enhancer_wrapper() signature error at the KSampler. The fix both times was updating the node itself, so if you see that, don't go hunting in your workflow.
The pack is young and its author (Capitan01R) is one of the few people shipping Krea 2 weighting nodes that work - this one, plus the pack's model-patch enhancers, do real work in the attention path rather than crossing their fingers in the text-vector domain. If you've been rephrasing your prompt to dodge a missing emphasis feature, this is the node that closes the gap.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| text | STRING | Use (phrase:weight). The clean phrase is encoded normally. Weight changes only the image-query -> phrase-text-key attention odds in every Krea2 shared DiT block. 1 is exact no-op; 0 suppresses; values above 1 increase. No rows are copied or scaled. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| model | MODEL | Krea2 MODEL whose shared attention reads weighted phrase keys at weighted odds. |
| conditioning | CONDITIONING | Normal, unscaled Krea2 conditioning for the annotation-free prompt. |
| weight_report | STRING | Exact phrase rows, weights, affected route, formula, and invariants. |