Load Dual CLIP (Any)
The Flux/SD3-style two-encoder loader, staged
- any
- CLIP
Flux, SD3, HiDream - a lot of the models that matter right now use two text encoders instead of one, usually a smaller "linguistic" encoder paired with a much bigger semantic one. DualCLIPLoader_Any loads both in one node and hands back a single CLIP output that already carries both, so downstream nodes don't need to know there were ever two files.
Why two encoders
The reason Flux understands natural language so much better than SD1.5-era models is T5-XXL: a proper language model, not just an image-text alignment model like CLIP-L. Flux pairs CLIP-L with T5-XXL and combines their outputs; SDXL pairs CLIP-L with OpenCLIP-G instead, for a different kind of coverage. This node is built around that pattern - two files, one architecture recipe, one merged encoder.
The inputs that matter
clip_name1 and clip_name2 are the two files; type picks the architecture recipe and, per the node's own description, decides how the pair is interpreted:
sdxl→ clip-l, clip-gsd3→ clip-l + clip-g, clip-l + t5, or clip-g + t5flux→ clip-l, t5hidream→ at least one of t5 or llama, both recommendedhunyuan_image→ qwen2.5vl 7b and byt5 small
Get the file-to-slot order backwards for your architecture and you'll usually get a clear error rather than a silent bad result, but it's still worth matching the recipe order above rather than guessing. device (default / cpu) is also available, same as the single-encoder loader - force cpu if you'd rather keep the VRAM for the diffusion model and accept a slower text encode.
The any staging trick
This node carries the same optional any input every loader in the pack gets. It accepts anything and does nothing with the value - it's purely there to create a dependency, because ComfyUI's executor otherwise runs a loader node the instant it can, which for something with no required upstream inputs usually means immediately, alongside every other model in your workflow. Wire something into any and the node waits for that source to finish first, letting you decide exactly when both encoder files actually land in memory.
This one is worth staging deliberately: you're loading two files at once here, sometimes two large ones (Flux's fp8 T5-XXL alone is a meaningful chunk of VRAM), so deferring it until after your prompt-adjacent nodes but before the diffusion model loads is a reasonable default on tighter cards.
Installing it
ComfyUI Manager: search ComfyUI-LoaderUtils, install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/lrzjason/ComfyUI-LoaderUtils
No extra Python dependencies. Put both encoder files in models/clip as usual - this node doesn't need them bundled or co-located, just present.
Where people get burned
Mismatched recipe is the big one: loading an SDXL-style clip-l/clip-g pair with type set to flux, or vice versa, either throws or produces conditioning that looks plausible but is quietly wrong. Match type to the checkpoint you're actually running, not to whichever files you happen to have handy.
The pack has no GGUF-format loader, so if either encoder is a GGUF quant, this node can't load it - that goes through ComfyUI-GGUF's own dual-CLIP node instead, without the any staging benefit. And if you only need one encoder for your architecture rather than two, reach for the plain CLIPLoader_Any instead - this node specifically expects a pair.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| clip_name1 | COMBO | 0 options: | |
| clip_name2 | COMBO | 0 options: | |
| type | COMBO | 5 options: sdxl, sd3, flux, hidream, hunyuan_image | |
| deviceopt | COMBO | 2 options: default, cpu | |
| anyopt | * | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CLIP | CLIP | — |