Prompt Palette (Weight Controller)
1.35) gets silently thrown away — translate weights to your backend
- clip
- model
- Weighted text
- Weight dictionary
- NegPip text
- Conditioning
- Model
- CLIP
- CLIP tokens
Here's a 2026 reality most guides don't warn you about: on half the models people run now - anything with a Qwen, T5, or other LLM text encoder, like Z-Image, LTX, or KREA 2 - (fox:1.35) isn't ignored, it's worse than ignored. The brackets and colon get fed to the encoder as literal punctuation inside your instruction. Prompt weighting is disabled for those text encoders, full stop. Prompt Palette (Weight Controller) exists because of exactly that: it parses explicit (phrase:weight) syntax out of your text and re-emits it in whatever format your backend actually wants.
What it is
A standalone text-routing node. Feed it any STRING - the resolved prompt, negative_prompt, or raw_text output from Prompt Palette, or text from any other node - and it reads the weighted segments. The input syntax is simple:
a portrait of a (red fox:1.35), dusk lighting, (blurry:-0.8)
Weight 1.0 is neutral, above emphasizes, below reduces, and negative values request suppression where the backend supports it. Two rules to keep in mind: nested weighted parentheses aren't supported (keep each weighted phrase in its own top-level group), and bare (word) or [word] shorthand isn't interpreted - you must use the explicit :weight form.
The modes - this is the whole point
The weighting_mode combo decides what the text output looks like:
- SDXL / CLIP (Standard) keeps the
(phrase:weight)annotations intact. Standard ComfyUI CLIP tokenization understands them, so connect CLIP and get direct conditioning. - Krea 2 / ZIT (Qwen) and LTX 2.3 / T5 (LLM) return clean, de-bracketed prose - because an LLM-family encoder should get natural language, not literal weight brackets. Use the
negpip_compatibleoutput for a downstream attention/negative-weight patcher that parses explicit weights.
The weight_dict output is a raw {phrase: weight} dictionary, exactly as you authored it - neutral 1.0 segments are excluded, and it always preserves the number you typed, regardless of what the other outputs do to the text. negpip_compatible always emits bracketed weighted text for negative-weight pipelines. Connect CLIP and you also get encoded Conditioning, plus Model/CLIP passthrough sockets and a CLIP tokens count.
Advanced controls (off by default, and fine that way)
Toggle advanced_controls to reveal two knobs. Soft Safety Clamp compresses extreme weights toward 1.0 while leaving near-neutral values alone - handy when you've inherited a prompt with (face:1.9) written by someone who loved oversaturation. Zero Inversion Null affects only the clean-prose modes: since plain prose can't carry a negative multiplier, negatively weighted phrases get removed rather than silently becoming normal unweighted text. Remember, neither of these touches weight_dict - that stays raw.
Typical wiring: Prompt Palette's prompt → Weight Controller text, then text → your target text encoder, negpip_compatible → the attention/negative-weight patcher, and conditioning → the sampler path when CLIP is connected. Add a second controller after the negative_prompt output if the negative side needs independent handling.
Install and gotchas
Same pack, same install: ComfyUI Manager → "Prompt Palette", or git clone https://github.com/z3rofeels/comfyui-promptpalette into custom_nodes and restart. Only PyYAML and typing-extensions as deps - no models, no downloads. The classic failure mode is exactly the problem this node solves backwards: weights showing up as literal text because the selected mode doesn't match the connected encoder. If you're all-SDXL-lineage, honestly, you may never need this node - your CLIP already parses (phrase:weight). But the moment you touch a Qwen-family or T5-encoded model and wonder why your carefully weighted prompt reads like a transcript of a regex, this is the fix.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | Text containing optional (phrase:weight) segments. | |
| weighting_mode | COMBO | SDXL / CLIP (Standard) | Choose the output syntax expected by the target text encoder. |
| advanced_controls | BOOLEAN | false | Show or hide the optional clamping and negative-routing controls. |
| weight_clamping | COMBO | None | Optionally compress extreme weights with a soft safety clamp. |
| negative_routing | COMBO | Direct | Choose how negative weights are represented in clean-text modes. |
| clipopt | CLIP | Optional CLIP input for direct conditioning output. | |
| modelopt | MODEL | Optional model passthrough for compact workflow wiring. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| Weighted text | STRING | Text formatted for the selected weighting mode. |
| Weight dictionary | DICT | Parsed phrase-to-weight values. |
| NegPip text | STRING | Bracketed text compatible with negative-weight pipelines. |
| Conditioning | CONDITIONING | Encoded conditioning when CLIP is connected. |
| Model | MODEL | Model passthrough. |
| CLIP | CLIP | CLIP passthrough. |
| CLIP tokens | INT | CLIP-L token count for the weighted text, or -1 when unavailable. |