Nodes/ComfyUI-Anima-LLLite/Apply Anima ControlNet-LLLite (sd-scripts)
ComfyUI Node

Apply Anima ControlNet-LLLite (sd-scripts)

Anima's only real ControlNet — and what it can actually do

By kohya-ss·Created 4 months ago·Updated 15 days ago· 183
Apply Anima ControlNet-LLLite (sd-scripts)
  • model
  • image
  • mask
  • MODEL
lllite_name
strength1.00
start_percent0.000
end_percent1.000
preserve_wrappertrue

If you've moved to Anima and found yourself missing ControlNet, this node is the reason you don't have to move back. Anima is a 2B DiT built on Cosmos-Predict2, not SDXL, which means every SD-era ControlNet file is structurally useless to it - no converter will save you. Apply Anima ControlNet-LLLite (sd-scripts) is kohya-ss's own port of ControlNet-LLLite to Anima, loading weights trained with their sd-scripts trainer and injecting them at inference time. It's the closest thing Anima has to a first-party ControlNet, and for one job - region-based editing and inpainting - it's genuinely good.

LLLite is the clever part. Instead of duplicating the whole encoder like classic ControlNet, it's a lightweight, LoRA-like module that injects a low-rank correction straight into the DiT's attention (and optionally MLP) projections. On every sampling step the node wraps apply_model, swaps in the LLLite forward pass for the target Linear layers, runs, then restores the originals - so the patch never leaks across model clones. The control image is resized to latent×8 and embedded by the v2 conditioning trunk into a per-token feature map that matches the DiT's token grid. That's why this node is tiny: no copied encoder, no new UNet to hold in VRAM.

The inputs that matter

  • model - your Anima checkpoint, loaded however you normally load it. The patched output MODEL feeds your KSampler (or chains into another LLLite node).
  • lllite_name - the .safetensors weights, picked from ComfyUI/models/controlnet/.
  • image - the control image. Any resolution; it gets auto-resized.
  • strength - LLLite multiplier, default 1.0.
  • start_percent / end_percent - the active sampling window. Defaults 0.0→1.0; shorten it if the condition is fighting the model late in denoising.
  • mask (optional) - required when the weights are 4-channel (inpaint). White = inpaint area, black = keep.

Everything architectural - cond_emb_dim, target layers, ASPP, inpaint flags - is baked into the safetensors metadata and read automatically. Don't go looking for those knobs; changing them would just break loading.

Installing it

Manager will find it under ComfyUI-Anima-LLLite, or clone it the normal way:

cd ComfyUI/custom_nodes
git clone https://github.com/kohya-ss/ComfyUI-Anima-LLLite

Restart ComfyUI. There's no requirements.txt - this node is pure torch on top of ComfyUI's own APIs, so no dependency hell. Then grab weights from kohya-ss/Anima-LLLite on HuggingFace and drop them in ComfyUI/models/controlnet/.

Where people get burned

The rename. ComfyUI core shipped its own beta AnimaLLLiteApply node, which silently shadows any custom node with the same ID. So this node is now AnimaLLLiteApply_sdscripts (display: "Apply Anima ControlNet-LLLite (sd-scripts)"). Old workflows that saved the original node type will fail validation - the old type now resolves to the core node, which takes a MODEL_PATCH from ModelPatchLoader instead of loading weights directly. Fix is manual: delete the old node, add this one, rewire. Annoying, but there's no alias workaround.

The weights are what they are. kohya calls these "community starting points / references rather than strong production-grade ControlNets," and users agree - the Preview3-era pose, depth, lineart and scribble models barely move base v1.0 output even at high strength. If you want a pose pipeline, Illustrious is still the answer. The two models retrained for base v1.0 - inpainting-v2 and any-test-like-v2 (lineart/scribble/grayscale) - are the ones actually worth using, and the inpaint model is the star: it's the base of several well-received Anima image-editing workflows.

Inpaint weights demand a mask. Load a 4-channel weight without one and you get a ValueError, not a silent fallback - that's intentional. And legacy pre-v2 weights (keys like lllite_modules.0.*) are rejected outright; retrain against current sd-scripts.

Cascading. Chain multiple LLLite nodes by feeding one node's MODEL output into the next's model input. preserve_wrapper (default True) makes them stack instead of overwriting each other - leave it on unless you know why you're turning it off.

The honest summary: this is a minimal reference implementation, and it feels like one. But for inpainting-based editing on Anima, it's the tool.

Categoryloaders

Inputs (8)

NameTypeDefaultDescription
modelMODEL
lllite_nameCOMBO0 options:
imageIMAGE
strengthFLOAT1.00-10–10
start_percentFLOAT0.0000–1
end_percentFLOAT1.0000–1
preserve_wrapperBOOLEANtrue
maskoptMASK

Outputs (1)

NameTypeDescription
MODELMODEL