LTX25 CLIP GGUF LOADER (TJ)
LTX 2.5's 12B text encoder as a GGUF file — and why plain CLIPLoaderGGUF refuses it
- clip
If you've ever tried to feed an LTX 2.5 workflow a quantized Gemma4 text encoder, you already know the error. ComfyUI-GGUF looks at the file's general.architecture, doesn't find gemma4 in its allowlist, and refuses to open it. This node exists to make that go away - and to quietly fix a second, nastier GGUF bug while it's there.
What it is
A single-purpose loader: pick a .gguf text encoder, get a CLIP back. That's the whole node. It has no type widget, no dtype dropdown, no model knob - it deliberately hardcodes type="ltxv" so you land on ComfyUI's LTX path (the dual-linear projection that the Gemma-family encoder for LTX 2.5 expects).
That output is drop-in identical to what core CLIPLoader or CLIPLoaderGGUF would hand you, so it feeds a CLIPTextEncode like any other CLIP, and that conditioning goes wherever your LTX 2.5 sampler wants positive/negative. You're not adopting a new conditioning format here - you're just changing how the encoder weights get read off disk.
Why you'd reach for it
The LTX story repeats itself every generation. LTX-2 shipped with a Gemma 3 12B text encoder that was 22.71 GB in fp16, and it caused the majority of the OOM reports in the first weeks - the model itself wasn't the wall, the encoder was. GGUF quants of it appeared in early January, and even then the GGUF node needed a patch before it would load Gemma 3 at all. LTX 2.5's encoder is another 12B Gemma (the author points at a gemma4-12b-with-proj-ltx-2.5 quantization), so the same arithmetic applies: a Q8 GGUF is roughly fp16 quality at half the file size, and Q4_K_M is the tier people actually run on a 12–16 GB card.
The ladder is worth keeping in your head: Q8 is close enough to fp16 that you should just use it if it fits, Q6_K is the balanced pick, Q4_K_M is the accepted compromise, Q3 and below get mushy. The tradeoff is a little dequantization overhead, not quality you'd notice.
How the fix actually works
Here's the part that makes this node more than a wrapper. It patches city96's loader.py in memory at runtime, rather than editing the installed file - so when ComfyUI-Manager updates ComfyUI-GGUF, nothing gets reverted. Two fixes:
gemma4added toTXT_ARCH_LIST. Oneset.add(), idempotent and non-destructive. Downstream code already handles Gemma 4 fine; the allowlist check was the only thing standing in the way.- Three raw LTX parameters force-dequantized to float32. In
arch=ltxvdiffusion GGUFs,audio_embeddings_connector.learnable_registers,video_embeddings_connector.learnable_registersandkeyframes_abs_pos_embeddingare stored as BF16 and never pass through GGMLOps - so they arrive asGGMLTensorand blow up inside the connector'storch.catwithTensors must have same number of dimensions: got 4 and 3. The node wrapsgguf_sd_loaderand dequants those three keys whenarch_str == "ltxv".
Both are wrapped onto every module holding the original gguf_sd_loader, and the allowlist is applied at import time as well - so even UnetLoaderGGUF benefits, which is exactly why the patch survives you never touching this node in a session. It also means: if you remove the pack, those errors come back.
Inputs and output
Only three, and you'll touch two of them.
clip_name- the combo list of.gguffiles. The node scansmodels/text_encoders,models/clipandmodels/clip_gguf. If it shows(no .gguf files found), that's literal: your file isn't in one of those three folders, or ComfyUI hasn't rescanned. The dropdown is a snapshot taken when the node's inputs are built, so drop the file intext_encoders/, refresh the browser tab, and try again.auto_set- off by default. Turn it on and theclipoutput is registered as a wireless provider, so a TJ Get node can pull the CLIP without a visible wire.setnode_name- defaults toLTX25_CLIP. That's the provider name; rename it if you're loading two encoders in one graph.
Output is a single clip (CLIP). One caveat worth knowing: this node only replaces the text-encoder half. The LTX 2.5 diffusion model still loads through UnetLoaderGGUF or core loaders, and if that one is also GGUF, the same runtime patch is what unblocks it.
Installing it
ComfyUI Manager → Install Custom Nodes → search TJ_NODE, or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/designloves2/ComfyUI-TJ_NODE.git
Restart ComfyUI. Then you need ComfyUI-GGUF - this node calls the CLIPLoaderGGUF class that pack registers, and without it you get a plain RuntimeError telling you to install city96/ComfyUI-GGUF. It's a patch on top of that pack, not a replacement.
Put the encoder GGUF in ComfyUI/models/text_encoders/ (or clip/) and load the LTX 2.5 model GGUF as usual. Nothing else installs - no llama-cpp, no GPU build, no compilers. If you still hit Unexpected text model architecture or the got 4 and 3 cat error, you're on an older TJ_NODE: the current version applies both fixes at import, and wrapping instead of editing is what keeps a ComfyUI-GGUF update from undoing them.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| clip_name | COMBO | 1 options: (no .gguf files found) | |
| auto_setopt | BOOLEAN | false | — |
| setnode_nameopt | STRING | LTX25_CLIP | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| clip | CLIP | — |