ComfyUI Node

CLIP Loader

Finally a text encoder loader that doesn't cap you at two rows

By r-vage·Created 23 days ago·Updated 3 days ago· 0
CLIP Loader
    • clip
    • clip_names
    ◄configuration{"clip":{"encoders":[{"id":"encoder-1","resource":{"name":""}}],"type":"flux"},"integrity":"off","version":1}►

    Modern workflows stopped loading one text encoder a while ago. SDXL wants two, Flux wants T5 plus CLIP-L, video models want a Gemma or a Qwen3-VL, and half the interesting setups use a GGUF-quantized encoder because the fp16 T5 doesn't fit alongside the model. CLIP Loader [SML2] is a standalone node for exactly that job: pick an architecture, add rows, point each row at a file.

    Why a separate node at all

    Smart Model Loader already has a CLIP section, and it works - up to four external encoder rows. CLIP Loader gives you the same loader without the model attached, and without the four-row ceiling: add as many rows as you want, reorder them, and it hands the whole ordered list to ComfyUI. That's useful when the model and the encoder don't live or die together - swapping a GGUF T5 to test a different quant, reusing one encoder across two model loaders, or building a conditioning graph that isn't fed by this pack's loader at all.

    The pack's own point bears repeating: adding rows does not add a new model architecture. Supported combinations are whatever your installed ComfyUI supports.

    How it works

    Each row has an Encoder type picked from a searchable list of what your ComfyUI build actually registers (it starts on Flux when available), and a file picked from models/clip or models/text_encoders. The files are passed to ComfyUI in displayed row order, and the order and count genuinely matter - architecture detection reads the list, so a stray extra row can change how the encoder set gets interpreted. Include only what the model needs.

    The output is deliberately split. clip is the loaded CLIP object that conditioning nodes consume. clip_names is a comma-and-space-joined STRING of the filenames in row order, subfolders and repeats preserved - Encoders/clip_l.safetensors, t5xxl.safetensors. That string is plumbing gold: feed it into a filename template, a metadata saver, or a note node, and your output PNG records which encoder produced it without any extra wiring.

    What you actually set

    • configuration - the one required input, a STRING the editor writes for you. Don't hand-edit it; validation rejects malformed payloads instead of guessing.
    • Encoder type per row - the architecture, e.g. flux, qwen_image, ltxv. There's no separate qwen_image_2.1 type; ComfyUI infers the 2.1 encoder from the weights, and older Qwen Image encoders are not interchangeable with it.
    • The file per row. GGUF files need the compatible GGUF backend installed - this pack ships its own GGUF integration plus the gguf Python package in its requirements.

    Each row also has a Source / integrity panel: a CivitAI AIR or Hugging Face repo ID, plus an expected SHA-256. Enter an AIR with the filename empty, hit Open in Download Manager, choose the file, and a verified download fills the row's filename and hash for you. Local integrity verification (Advanced → Local integrity → policy verify) checks every selected encoder before loading and refuses to proceed on a mismatch. Selection itself never hashes anything or phones a provider, which is the correct behaviour and worth knowing when you wonder why it's instant.

    Installing it

    One install for the whole pack. ComfyUI Manager → search Smart Model Loader Nova, or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/r-vage/ComfyUI_SmartModelLoader_Nova.git
    cd ComfyUI_SmartModelLoader_Nova
    python -m pip install -r requirements.txt
    

    Use ComfyUI's Python. The GGUF path pulls gguf>=0.13.0,<0.20 plus transformers, sentencepiece and protobuf for tokenizer conversion; everything else is stock. Restart, then find it under Add Node → 🌒 Smart Model Loader Nova → Loader.

    Where people get burned

    A missing file aborts the whole load, before any encoder is read. That's better than half-loading a set, but it's abrupt. Missing selections stay visible in the node with Local file missing instead of being quietly dropped - a shared workflow with a path you don't have is your problem to resolve, not the node's.

    Row order is not cosmetic. Two T5s in the wrong order, or a leftover clip_g row on a model that wants clip_l plus T5, changes detection and can fail with an error that names the wrong culprit.

    No presets here, by design. CLIP Loader has no preset library - the whole configuration, including ordered rows and source metadata, is saved in the workflow. If you're the kind of person who leans on loader presets, note this one won't have them; that's Smart Model Loader's job.

    Category🌒 Smart Model Loader Nova/ Loader

    Inputs (1)

    NameTypeDefaultDescription
    configurationSTRING{"clip":{"encoders":[{"id":"encoder-1","resource":{"name":""}}],"type":"flux"},"integrity":"off","version":1}—

    Outputs (2)

    NameTypeDescription
    clipCLIP—
    clip_namesSTRING—