Nodes/ComfyUI-GGUF-Loader/Text Encoder + ClipProj Loader ⚡
ComfyUI Node

Text Encoder + ClipProj Loader ⚡

Run MiniMax H3 without paying for the 32B text encoder

By ChrisColeTech·Created about a month ago·Updated 3 days ago· 10
Text Encoder + ClipProj Loader ⚡
    • CLIP
    clip_name
    typeauto
    projection

    MiniMax H3's video generation is genuinely good - and its text encoder is the reason most people can't run it. The model expects a 32B encoder, which is something like 15.7 GB of weights sitting in front of the DiT, doing nothing but reading your prompt. Text Encoder + ClipProj Loader is the escape hatch: it loads a small Qwen3-VL text encoder - 4B or 8B - and runs it through a learned projection matrix so its output lands in the space the 32B encoder would have produced. The text-encoder cost drops from ~15.7 GB to about 5 GB. That's the difference between "installing H3" and "installing H3 and everything else that used to fit".

    It's one of the nodes in the CCTech fork of city96/ComfyUI-GGUF, living under 🤖 CCTech/GGUF. One CLIP in, one CLIP out, and it slots straight into where H3's CLIPTextEncode would be.

    How it works

    The trick is that projection isn't a hack - it's the architecture. MiniMax H3 was trained with a text encoder whose output feeds through a projection into the DiT's embedding space, and a small encoder plus the right linear map produces conditioning that's very close to the big encoder's. This node is a port of nicolab28/ComfyUI-ClipProj (MIT), with the projection itself living in the pack's clipproj.py - no second node pack required. The matrices ship separately in models/clip_projections/, from NicoLab28/ClipProj-MiniMax-H3.

    The three inputs that matter:

    • clip_name - the full Qwen3-VL text encoder, .gguf or .safetensors, from models/text_encoders. Not an mmproj file: that's just the vision projector with no text model in it, and the node refuses it up front instead of failing mid-load.
    • type - defaults to auto, which reads the file header and picks the architecture (krea2 = 4B, boogu = 8B, minimax = 32B). Override only if auto fails.
    • projection - the matrix: mmh3-4b-* goes with a 4B encoder, mmh3-8b-* with an 8B, and they are not interchangeable. The <control:zero> / <control:identity> / <control:random> entries are deliberate baselines, not projections - they run on any encoder and show what the diffusion model does on its own. Run one first so you can tell the matrix is actually doing the work.

    Where people get burned

    Three mistakes cover almost all of it. First, mixing matrix sizes - a 4B encoder with an 8B matrix is silently wrong conditioning, so match the names. Second, dropping in a text-only Qwen3 of the right size: it loads fine, the tooltip warns, and the resulting conditioning just ignores your prompt. The file has to be the VL variant. Third, expecting this to be the same thing as pinning an encoder to a spare GPU. It isn't - the upstream ClipProj node has device/mode widgets for multi-GPU pinning, and this port deliberately leaves them out because pinning an encoder holds 4–9 GB away from the diffusion model on a single card. ComfyUI's normal paging is the right behaviour on one GPU.

    Installing it

    Same pack install as everything else here - Manager search "ComfyUI-GGUF-Loader", or git clone https://github.com/ChrisColeTech/ComfyUI-GGUF-Loader into ComfyUI/custom_nodes, then pip install --upgrade gguf and restart. Make sure ComfyUI is recent enough for the custom ops the loader uses. Then grab a Qwen3-VL GGUF (a Q4/Q5 quant of the 4B or 8B is the usual choice) into models/text_encoders and the matching matrix into models/clip_projections/. The node reads GGUF by extension and routes .gguf through this pack's loader, everything else through ComfyUI's stock one - so a scaled-fp8 safetensors encoder works too, which is what most people already have.

    Category🤖 CCTech/GGUF

    Inputs (3)

    NameTypeDefaultDescription
    clip_nameCOMBOA full Qwen3-VL text encoder, .gguf or .safetensors. Not an mmproj file, which is the vision projector alone and carries no text model. It must be a VL model: a text-only Qwen3 of the same size loads without complaint and produces conditioning that ignores your prompt.
    typeCOMBOautoauto reads the file header and picks the architecture. Override only if that fails: krea2 = 4B, boogu = 8B, minimax = 32B.
    projectionCOMBOLearned matrix from models/clip_projections/, or a <control:...> baseline. mmh3-4b-* goes with a 4B, mmh3-8b-* with an 8B; they are not interchangeable. Run the controls first: they show what the diffusion model does on its own.

    Outputs (1)

    NameTypeDescription
    CLIPCLIP