Nodes/Tenser Tensor/TT CLIP Text Encode SDXL
ComfyUI Node

TT CLIP Text Encode SDXL

SDXL's two text encoders, finally in their own boxes

By tenser-tensor·Created 7 months ago·Updated 5 months ago· 0
TT CLIP Text Encode SDXL
  • clip
  • POSITIVE
  • NEGATIVE
clip_l_positive
clip_g_positive
clip_l_negative
clip_g_negative
ascore_positive9.0
ascore_negative6.0
width512
height512
target_width512
target_height512

SDXL runs two text encoders - CLIP-L and OpenCLIP-G - and fuses their output into one conditioning. Stock ComfyUI makes you shove one prompt into a single box and hope. This node gives you a separate text field for each encoder, which is what you actually want if you've ever read that SDXL prompt-engineering advice and wondered where to type the "CLIP-G prompt."

It's from TenserTensor, a small pack whose whole pitch is collapsing multi-node chains into single loaders. This is its SDXL text encoder, and it does exactly one job: turn four prompt boxes plus a few conditioning knobs into POSITIVE and NEGATIVE conditioning.

What you set

Four multiline fields: clip_l_positive, clip_g_positive, and the two negative counterparts. The trick of SDXL is that CLIP-L (small, fast, good with tags) and CLIP-G (big, slow, understands natural language) each want a slightly different prompt. Power users routinely put terse tags in L and a flowing sentence in G. With one box, you can't do that.

The other inputs are the parts people forget about, and they matter because SDXL bakes them into the conditioning:

  • ascore_positive (default 9) and ascore_negative (default 6) - aesthetic score, a knob SDXL uses to bias toward "pretty."
  • width, height, target_width, target_height (defaults 512) - resolution hints embedded in the conditioning. Set these to your actual generation size; SDXL genuinely uses them. Every one of these gets packed into the conditioning via encode_from_tokens_scheduled, so changing them changes output even with the same seed.

Outputs are POSITIVE and NEGATIVE conditioning, which wire straight into any KSampler - this pack's TT KSampler or stock ComfyUI's, both fine.

One honest caveat

This is one of the pack's legacy V1 nodes. The pack fully migrated to ComfyUI's newer API V3, and the old V1 classes now sit in a Deprecated/ category that will be removed in a future major release. It still works fine - it's just on notice. If you're building something new from scratch and want the V3 version, look for the SDXL encoder under the pack's non-deprecated section; if you just want the boxes, this one's fine to keep using.

Install and gotchas

cd ComfyUI/custom_nodes
git clone https://github.com/tenser-tensor/ComfyUI-TenserTensor

Or use ComfyUI Manager: search "TenserTensor", install, restart. The pack needs gguf and kornia (its requirements.txt), which Manager installs for you; a manual clone means pip install -r requirements.txt in your ComfyUI environment.

Two things trip people up. First, the clip input has to be the dual CLIP-L + CLIP-G encoder - load it via this pack's FLUX/SDXL loaders or a DualCLIPLoader. A single-encoder CLIP won't have the l token stream and the node will error. Second, the aesthetic-score and dimension defaults (512×512, ascore 9/6) are not "nothing" - they're real values baked into your conditioning. If your output looks off, check that width/height match your latent before you blame the prompt.

Where people get burned: dragging this node's output into a context node from a different pack. The TenserTensor context system uses a proprietary TT_CONTEXT socket type that only talks to other TenserTensor nodes. Keep its outputs on the plain CONDITIONING sockets and you're fine.

CategoryTenserTensor/Text Encoders/SDXL

Inputs (11)

NameTypeDefaultDescription
clipCLIP
clip_l_positiveSTRING
clip_g_positiveSTRING
clip_l_negativeSTRING
clip_g_negativeSTRING
ascore_positiveFLOAT9.00–1000
ascore_negativeFLOAT6.00–1000
widthINT5120–16384
heightINT5120–16384
target_widthINT5120–16384
target_heightINT5120–16384

Outputs (2)

NameTypeDescription
POSITIVECONDITIONING
NEGATIVECONDITIONING