Anima Dual KV Style Lora Loader
Anima's style LoRAs are a different animal — this loader is why yours did nothing
- model
- MODEL
If you've downloaded an Anima style adapter, dropped it into models/loras, plugged it into the built-in LoraLoader - and gotten nothing but the base model's deliberately plain output - this is the node you were missing. The Anima Dual KV Style Lora Loader is the only loader that understands how Anima style adapters are actually trained, and it quietly patches attention blocks the normal loader can't even see.
Here's the backstory. Anima (Circlestone Labs' 2B diffusion transformer on Cosmos-Predict2) escapes SDXL, which means its LoRAs escape SDXL conventions too. Style adapters for it are trained with something called the Dual KV Style Network: instead of low-rank deltas on the q/k/v projections, the trainer freezes the model and learns a small set of static key/value style vectors - 64 style tokens by default - plus a low-rank output bottleneck. During inference the model's own queries retrieve those vectors and the result is added to normal attention. A standard ComfyUI LoraLoader keys on lora_unet_*-style weight names; these files carry k_style, v_style, and out_proj_up weights instead. No match, no patch, no error.
How it works
The node is more of a network autodetector than a plain loader. It reads your .safetensors, inspects the keys, and picks one of three patch types:
- Dual KV - the base style network (
k_style/v_stylekeys) - Dual QKV - detected by
route_down.weight - Dual QKV-KV -
k_down/v_downkeys, with an MoE experts variant flagged byv_router/v_down_experts
It then walks the Anima model's Attention modules (skipping the LLM adapter), wraps each one, and adds the style path: your query attends over the learned style KV, the result goes through the low-rank bottleneck, and gets added to the original attention output scaled by strength. Two details are worth knowing. apply_rope (default on) applies split-half Rotary Position Embedding to the queries before they attend to the style vectors, matching Anima's own RoPE implementation - the sd-scripts reference this is built from has RoPE commented out, so the node is doing the faithful thing. And it's CFG-aware: the style path touches only the positive branch, leaving the unconditional/negative path clean, with a compatibility shim for the Anima-NAG guidance node.
The inputs that matter
model- the Anima diffusion model to patch. It has to be Anima.lora_name- your style adapter frommodels/loras.strength- 0 to 10, default 1.0. Set to 0 and the style path is skipped entirely. These adapters are trained to be strong, so don't be shy about pushing past 1.apply_rope- leave it on unless the adapter's trainer says otherwise.
Output is a single MODEL, wired straight into your KSampler like any other loader output. Multiple loaders chain cleanly - the node clones the model patcher per loader, so branch A's style can't bleed into branch B.
Install
ComfyUI Manager, search AnimaDualKVStyle, or the old-fashioned way:
cd ComfyUI/custom_nodes
git clone https://github.com/TheDucker1/animadualkvstyle.git
Then restart ComfyUI. That's it - the pack ships zero Python dependencies and downloads no models. You bring the Anima checkpoint (circlestone-labs/Anima on Hugging Face or CivitAI 2458426) and a Dual KV style adapter yourself.
Where people get burned
The silent-fail trap is real: feed this node a normal kohya-style LoRA, or an SDXL checkpoint, and it prints No matching Dual KV/QKV/QKV-KV layers found to the console and hands the model back untouched. No red error - just no style. Watch the console, not the preview. And remember Anima's version churn: adapters trained on Preview 2 or 3 degrade on the base v1.0 model, so match the adapter to the checkpoint it was trained for.
One honesty note: this is a young, single-maintainer project (v0.0.4/0.0.5, GPLv3), and the Dual KV method has essentially zero Reddit footprint beyond the Anima scene. It's the tool you reach for because it's the only option, not because it's battle-tested. But it's also the difference between Anima style LoRAs working and silently not - which, on a base model this plain, is most of the reason you're on Anima.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | The diffusion model to apply the style to. | |
| lora_name | COMBO | The style adapter Lora model to load. | |
| strength | FLOAT | 1.000–10 | Style strength multiplier. |
| apply_rope | BOOLEAN | true | Apply Rotary Position Embedding to Q before cross attend with custom KV path. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |