Positive Only (CLIP Encode Prompt)
Encode your positive prompt and skip the negative entirely
- clip
- POSITIVE CONDITIONING
- NEGATIVE CONDITIONING
Every SDXL-family workflow has the same little pair sitting next to the KSampler: a CLIP Text Encode for the positive prompt, and a second one for the negative that's usually left blank. "Positive Only (CLIP Encode Prompt)" collapses that pair into a single node. You type the prompt once and out come both the POSITIVE CONDITIONING and a NEGATIVE CONDITIONING built from an empty string. One less node, one less text box to babysit, one less wire across the graph.
That "empty negative" isn't a cheat, and understanding why makes the node click. A negative prompt isn't a filter that removes things from your image. Classifier-free guidance already runs a second, unconditioned pass at every denoising step, and the negative prompt just replaces the empty string in that pass. So encoding an empty string is literally running the default. On SDXL-lineage models - Illustrious, NoobAI, Pony - running with no negative is a real and defensible style, and if you're in that camp this node is a perfect fit. (On the 2026 guidance-distilled models that run at CFG 1, the sampler skips the unconditioned pass entirely, so the negative output gets computed and ignored. Harmless, just a wasted encode.)
The mechanism is three lines of source. Your positive string and an empty string both go through clip.tokenize(), then clip.encode_from_tokens_scheduled() for each, and out the two sockets. Same CLIP, one encode per token stream, nothing exotic.
What you actually touch:
clip(CLIP socket) - wired from your Checkpoint Loader or UNET Loader. It'sforceInput, meaning there's no widget: you have to connect it, and forgetting is the one reliable way to make this node error.positive(multiline text) - the only thing you type. This is the entire point of the node.
Outputs: POSITIVE CONDITIONING goes to the KSampler's positive socket, NEGATIVE CONDITIONING to its negative socket. That's the whole job.
Where people get burned: the name isn't hiding a negative text box. If you steer with a real negative prompt - CFG above 1, or an embedding you want to avoid - this node can't hold it, and the negative output will always be the empty-string conditioning. Reach for this when blank-negative is the point, and reach for the core CLIP Text Encode when it isn't. Also: leave positive empty and both conditionings are empty, so the sampler gets nothing to guide toward and you get the unconditioned output - which is to say, noise. Type a prompt.
Install is the whole pack, and it's about as light as custom nodes get. In ComfyUI Manager, search "ardent", install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/ardentillumina/ardent-comfy
then restart ComfyUI. There are no dependencies, no model downloads, nothing to hunt down - it's a pure-Python wrapper over ComfyUI's own CLIP encoding, and it works with any CLIP you hand it, from SD 1.5 to Flux's dual text encoder. (Pure-LLM-encoded models like Anima don't expose a CLIP at all, so this isn't for those.)
It's a one-trick node, but the trick - one box producing both conditionings, empty negative baked in - is one of those small graph-tidying wins that quietly add up. If you keep a never-touched negative encoder around, this is the node that replaces it.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| clipopt | CLIP | — | |
| positiveopt | STRING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| POSITIVE CONDITIONING | CONDITIONING | — |
| NEGATIVE CONDITIONING | CONDITIONING | — |