CLIPStringEncode _O
A CLIP Text Encode from 2023 that you probably shouldn't use (but might already have)
- string
- clip
- CONDITIONING
Let's get the bad news out first: this is a deprecated node, and it exists so old workflows don't explode - not because anyone wants you to add it fresh. CLIPStringEncode _O does exactly one thing: it takes a string and a CLIP model and turns them into CONDITIONING for the sampler. That's the job of ComfyUI's built-in CLIP Text Encode node, which you already have and which does it identically. If you're starting a workflow from zero, add the built-in one and move on with your day.
So why is it here, and why would you ever meet it? The Quality of Life Suit shipped this in its early "String Suite" era, back when it had its own STR type that the whole pack used internally. When you load a workflow from an image with this node in it, it'll be mapped to this class so the graph still runs. The node is also your warning label for the pack's history: it sits under O/deprecated/string, alongside a pile of other string nodes that were kept "for backward compatibility" and removed from the README's active list.
How it works
Mechanically it's a one-liner. The source does:
def encode(self, string, clip):
return ([[clip.encode(string["string"])], {}], )
Feed it a string and a clip, and it returns a CONDITIONING you can wire straight into a KSampler. That [[tokens, {}], {}] shape is the standard ComfyUI conditioning format - the empty dict being where you'd normally stash things like a ControlNet conditioning strength.
The catch is the input types. Its string input is the old STR type, not the STRING that every modern text node outputs. In practice that means you can't just drop a Text _O or String node in and connect it - you need another node from the same deprecated era to produce that STR. This is the kind of type friction that makes deprecated nodes feel like a locked room. If you must use it, expect to wire it to the pack's String _O node. If that feels like too much archaeology, it is - use the core node.
The one thing worth knowing about CLIP encoding here
clip.encode() runs the text through whatever text encoder your checkpoint uses. For SD 1.5 and the SDXL line that's CLIP with a 77-token budget - the model reads the prompt as comma-separated tags and stops at the token limit, so longer prose silently gets truncated. The KB's prompt-engineering doc is blunt about this: tag lists, (word:1.3) weights and BREAK all mean something on the SDXL lineage and essentially nothing on newer LLM-encoded models. None of that changes because you used this node instead of the built-in one - it's a pure pass-through to the same clip.encode.
Install and why you have it
You almost certainly didn't install this node by itself. It ships in the Quality of Life Suit (O/ menu), which you get via ComfyUI Manager (search "Quality of Life Suit") or:
cd <ComfyUI root>/custom_nodes
git clone https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92.git
Then restart ComfyUI - a browser reload isn't enough. The pack creates a config.json on first run with auto-update on, and pulls new commits on every start. If the pack ever updates and this node disappears, that's why: it's scheduled for removal, and it's only here now to keep old graphs alive. If a workflow breaks because the node went missing, replace it with a core CLIP Text Encode and reconnect the same string and CLIP inputs - the output is identical.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| string | STR | — | |
| clip | CLIP | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | — |