Prompt Composer Single Text
The one text-and-weight block the whole pack is built from
- text_out
If you've ever wished you could break a giant prompt into pieces you can turn on and off individually, this is the node that does it. Prompt Composer Single Text is one typing box, one weight slider, and a bypass switch - the atomic unit of the whole comfyui-prompt-composer suite. Chain a handful of these together and instead of one unreadable wall of text you get discrete, labelled blocks you can mute, reweight, or swap out without touching anything else.
That's also exactly what people on r/comfyui point newcomers toward it for: someone asking for a way to keep several prompt variants around and switch between them got told to "look up prompt composer, it's a neat way to turn on and off bits of prompts or whole prompts, as well as making it easy to change the weight of sections." That's the whole pitch in one sentence, and TextSingle is the node that sentence is describing.
How it works
You type into the text box, ComfyUI concatenates whatever's wired into text_in_opt (if anything) with your text, and the result comes out text_out. Chain several of these - and the pack's other nodes - by wiring each one's text_out into the next one's text_in_opt, and the final node in the chain feeds a CLIP Text Encode or anything else that takes a plain string.
The weight slider is where it gets interesting. Leave it at the default of 1 and your text passes straight through, untouched. Nudge it up or down and the node wraps your text in the standard (text:weight) attention-weighting syntax - the same trick you'd type by hand in an SD1.5 or SDXL prompt.
The inputs and outputs that matter
text(multiline string, required) - whatever you want this block to say.weight(0 to 1.95, step 0.1, default 1) - nudges it away from 1 to get(text:weight).active(boolean) - a bypass switch. Flip it to pull this block out of the chain for A/B testing without deleting the node or rewiring anything.text_in_opt(optional string) - where the previous node in your chain plugs in.text_out- the combined string, wired to the next node or your text encoder.
The catch nobody tells you: this weighting only works on some checkpoints
The (text:weight) syntax this node builds is a CLIP-era mechanism. It works on SD1.5, SDXL, and SDXL-lineage checkpoints like Illustrious, NoobAI and Pony. It does nothing - worse than nothing, actually - on anything with an LLM text encoder: Flux, Z-Image, Anima, Chroma's T5 side, Klein. On those models the parentheses and colon aren't parsed as weighting at all; they're fed to the encoder as literal punctuation sitting inside your prompt, which reads worse than if you'd left the weight at 1. If you're on a 2026-era LLM-encoded checkpoint, either keep the slider at 1 (plain concatenation) or say what you mean in words instead of leaning on the number.
How to install it
Easiest path: open ComfyUI Manager, search florestefano1975, hit install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/florestefano1975/comfyui-prompt-composer
then restart ComfyUI. There's nothing to download beyond the node code itself - no checkpoints, no heavy Python dependencies. It's a pure text-manipulation pack, so the install is fast and there's nothing to babysit.
Common issues & troubleshooting
You cranked the weight and nothing changed. Check what checkpoint you're actually running. If it's Flux, Z-Image, Anima or anything LLM-encoded, the weighting is inert by design - see above.
Text from upstream nodes just vanished. text_in_opt is optional, which means it's easy to forget to wire it. If you leave it unplugged, whatever came before this node in your chain silently gets dropped - the node has no way to warn you it expected an input and didn't get one.
Can't find the node. It lives under AI WizArt/Prompt Composer Tools in the right-click add-node menu, not under a generic "text" category - search for it by name instead if you're browsing manually.
A shared workflow shows a red "missing node" box for this one. Standard ComfyUI story: install the pack via Manager (or the manual clone above) and reload - the workflow JSON already has the right class name wired up, it just needs the code present.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | — | |
| weight | FLOAT | 1.00–1.95 | — |
| active | BOOLEAN | false | — |
| text_in_optopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text_out | STRING | — |