Load Qwen3.5 CLIP (Anima)
Anima's 0.6B text encoder is the bottleneck. This swaps in Qwen3.5 4B.
- CLIP
Anima's whole pitch is prompt comprehension - it ditched SDXL's CLIP for a Qwen LLM encoder so tags and natural language could coexist. But the model ships with the smallest Qwen there is, the 0.6B. This node is the bigger-brain swap: it loads the Qwen 3.5 4B hybrid (Mamba2 + attention) text encoder and hands it to Anima as a bog-standard CLIP, ready to plug into CLIPTextEncode.
You reach for it when the 0.6B's language ceiling is what's holding a prompt back - long natural-language sentences, multi-character scenes, rare or awkwardly-phrased concepts. Seven times the parameters isn't a small bump. It's the same logic as Flux 2 Dev running a Mistral-3 encoder: as text encoders got swapped for full LLMs, the encoder increasingly decides what a model can understand, and Anima kept the cheapest one.
How it works
The Qwen 3.5 4B isn't a standard transformer. It's 32 layers alternating between Mamba2-style selective state-space blocks and gated self-attention: 24 SSM + 8 attention layers sitting at positions 3, 7, 11, 15, 19, 23, 27 and 31. Hidden size is 2560, and the output is 1024 - which exactly matches the embedding size Anima's DiT expects, so it drops in without touching the diffusion model. Weights are FP8 (F8_E4M3) with BF16 norms, loaded through ComfyUI's built-in quantization detection. That's why the README's floor is ComfyUI v0.16.3+; older installs will trip over the FP8 metadata. The checkpoint is 4.14B parameters and a 4.78 GB download.
One trap matters more than the architecture: the tokenizer. Qwen 3.5's vocab is 248,320 tokens, not Qwen 3's 151,936. Feed the wrong one and every token ID maps to the wrong embedding row while 96,000 trained rows never get touched - the node "loads" fine and output comes out garbled. On first use the node tries to auto-download the tokenizer from Qwen/Qwen3.5-4B on HuggingFace; if you're offline or behind a proxy, drop vocab.json, merges.txt and tokenizer.json into the node's qwen35_tokenizer/ folder yourself.
Inputs that matter
Only one is required: clip_name, which lists safetensors files containing "qwen35" in ComfyUI/models/text_encoders. The optional four are the calibration machinery, and here's the honest read on them:
use_calibration- per-dimension affine calibration that aligns the 4B's output distribution with the 0.6B's. Requirescalibration_params.safetensorsin the node folder.use_alignment- a Procrustes rotation that realigns viewpoint/pose concept directions ("from side", "from behind") with the 0.6B. Requiresrotation_matrix.safetensors.alignment_strength- blends the distribution center: 0 keeps the 4B's own magnitude (L2≈10), 1 shifts toward the 0.6B's (L2≈70). The tooltip's advice is right: start at 0 (rotation only) and only raise it if poses still regress.output_scale- a uniform scale applied after calibration. Leave it at 1.0.
The reason these exist: the 0.6B was baked into Anima's training, so a raw 4B speaks a slightly different statistical dialect. Calibration is the author's attempt to translate. Start with everything off - the stock 4B is the real feature. Turn alignment on only if viewpoint tags that used to behave stop behaving.
Install
Via ComfyUI Manager, search comfyui-qwen35-anima, or clone it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/GumGum10/comfyui-qwen35-anima
Then the downloads from lylogummy/anima2b-qwen-3.5-4b:
qwen35_4b.safetensors→ComfyUI/models/text_encoders/calibration_params.safetensors+rotation_matrix.safetensors→ inside the custom node folder (optional)- tokenizer files →
qwen35_tokenizer/(optional, auto-downloads otherwise)
Restart ComfyUI. No extra pip dependencies beyond what ComfyUI ships.
Common issues
"Text encoder not found": the node only lists files with "qwen35" in the name, and it looks in models/text_encoders specifically. Name the file qwen35_4b.safetensors and put it in the right folder.
Calibration silently does nothing: if calibration_params.safetensors is missing, the code logs a warning and turns the flag off - the toggle just sits there. And a heads-up: the README and tooltips say to "run calibrate.py" to generate it, but that script isn't in the repo. Download the precomputed files from HuggingFace instead; don't go hunting for a script that was never shipped.
First generation hangs: it's pulling the tokenizer from HuggingFace. Give it a moment, or install the tokenizer manually if you run ComfyUI offline.
The name is accurate, this one's a genuine upgrade, not a rebadge. Worth the 4.78 GB if Anima's language handling is what frustrates you.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| clip_name | COMBO | 1 options: qwen35_4b.safetensors | |
| use_calibrationopt | BOOLEAN | false | Apply per-dimension affine calibration to align 4B output distribution with 0.6B. Requires calibration_params.safetensors (run calibrate.py to generate). |
| use_alignmentopt | BOOLEAN | false | Apply Procrustes rotation to align 4B spatial/pose concept directions with 0.6B. Requires rotation_matrix.safetensors (run compute_alignment.py to generate). Helps with 'from side', 'from behind', and other viewpoint tags. |
| alignment_strengthopt | FLOAT | 0.000–1 | Controls the bias shift strength. The rotation (fixing concept directions like 'from side') is always applied when alignment is on. This slider blends the distribution center: 0=keep 4B's own magnitude (L2~10), 1=shift to 0.6B's magnitude (L2~70). Try 0.0 first (rotation only) and increase if poses/viewpoints still need help. |
| output_scaleopt | FLOAT | 1.00–1000 | Additional uniform scale factor applied AFTER calibration (if enabled). Usually leave at 1.0 when calibration is on. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CLIP | CLIP | — |