Dual CLIP Text Encode
One node instead of two, with the prompts handed back for metadata
- clip
- positive
- negative
- pos_text
- neg_text
Two CLIP Text Encode nodes - one for positive, one for negative - is so standard in ComfyUI that a workflow screenshot is instantly recognizable by the pair of them sitting upstream of the sampler. Dual CLIP Text Encode collapses that pair into one node and then does something neither of the originals can: it hands you back both prompts as strings, ready to feed straight into metadata.
So you get three wins at once. First, graph space - one node instead of two, which is exactly the kind of clutter-reduction this pack is obsessed with. Second, a clean toggle (on by default) that runs both prompts through the pack's text cleaning before encoding: extra spaces, stray commas, doubled separators get tidied. Third, the two text outputs. This is the same trick as the single-encoder version - the prompt-as-string output exists because Sage Utils' metadata nodes (Construct Metadata, Save Image w/ Added Metadata) want your actual prompt text to embed in the PNG. On this node you get pos_text and neg_text on top of the two CONDITIONING outputs, so a single node feeds your sampler and your metadata with no extra wiring.
Inputs are clip (required), the clean boolean, and optional multiline pos and neg strings. The word "optional" is doing real work here: leave one disconnected and the node zeroes the conditioning for that side instead of erroring - handy when you're mid-build and only have the positive prompt written. The mechanism is ordinary CLIP conditioning under the hood, one call per prompt, with the cleaning applied first.
Where the usual caveats apply: your negative prompt only does what your checkpoint's encoder lets it. On SDXL/Illustrious/Pony-lineage models a good negative still matters a lot. On the LLM-encoder models that dominate 2026 releases, negatives are largely inert and (word:1.3) weighting is silently dropped - so don't blame the node when the text encoder is the thing ignoring you. And remember the cleaning toggle is a quality-of-life fix, not a semantic one: it won't rewrite your prompt, just normalize the whitespace.
The outputs you'll actually use
positive/negative- CONDITIONING, into your sampler (or KSampler w/ Sampler Info if you're running full Sage).pos_text/neg_text- STRING, into a metadata constructor, or anywhere else that needs the text back.
Install
ComfyUI Manager → search Sage Utils → install → restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/arcum42/ComfyUI_SageUtils.git
cd ComfyUI_SageUtils && pip install -r requirements.txt
Then restart ComfyUI. Dependency footprint is tiny (dynamicprompts), no model downloads - the models are yours already. If you're on an image-edit model with a Qwen-style encoder, the sibling Dual CLIP Text Encode Qwen adds reference-image inputs to the same trick.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | The CLIP model used for encoding the text. | |
| clean | BOOLEAN | true | Clean up the text, getting rid of extra spaces, commas, etc. |
| posopt | STRING | The positive prompt's text. | |
| negopt | STRING | The negative prompt's text. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | A conditioning containing the embedded text used to guide the diffusion model. |
| negative | CONDITIONING | A conditioning containing the embedded text used to guide the diffusion model. |
| pos_text | STRING | The positive prompt's text. |
| neg_text | STRING | The negative prompt's text. |