Nodes/Prompt Palette/Prompt Palette (Weight Controller)
ComfyUI Node

Prompt Palette (Weight Controller)

1.35) gets silently thrown away — translate weights to your backend

By z3rofeels·Created 2 months ago·Updated 21 days ago· 14
Prompt Palette (Weight Controller)
  • clip
  • model
  • Weighted text
  • Weight dictionary
  • NegPip text
  • Conditioning
  • Model
  • CLIP
  • CLIP tokens
text
weighting_modeSDXL / CLIP (Standard)
advanced_controlsfalse
weight_clampingNone
negative_routingDirect

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_compatible output 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.

CategoryPromptPalette

Inputs (7)

NameTypeDefaultDescription
textSTRINGText containing optional (phrase:weight) segments.
weighting_modeCOMBOSDXL / CLIP (Standard)Choose the output syntax expected by the target text encoder.
advanced_controlsBOOLEANfalseShow or hide the optional clamping and negative-routing controls.
weight_clampingCOMBONoneOptionally compress extreme weights with a soft safety clamp.
negative_routingCOMBODirectChoose how negative weights are represented in clean-text modes.
clipoptCLIPOptional CLIP input for direct conditioning output.
modeloptMODELOptional model passthrough for compact workflow wiring.

Outputs (7)

NameTypeDescription
Weighted textSTRINGText formatted for the selected weighting mode.
Weight dictionaryDICTParsed phrase-to-weight values.
NegPip textSTRINGBracketed text compatible with negative-weight pipelines.
ConditioningCONDITIONINGEncoded conditioning when CLIP is connected.
ModelMODELModel passthrough.
CLIPCLIPCLIP passthrough.
CLIP tokensINTCLIP-L token count for the weighted text, or -1 when unavailable.