Nodes/ComfyUI-Anima-Remap/Anima VACE ControlNet Remap
ComfyUI Node

Anima VACE ControlNet Remap

The node that catches VACE injecting at the wrong depth

By shin131002·Created about a month ago·Updated 6 days ago· 13
Anima VACE ControlNet Remap
  • control_net
  • model
  • control_net
  • remap_info
◄auto_remaptrue►
◄manifest▾►

Here's the trap this node exists for. You load an Anima VACE ControlNet on a 40-block Anima-2.9B model, hit generate, and it runs. No error, no warning, no red text. The picture just comes out weaker and less stable than it should be, and you spend the evening blaming your prompt.

The reason is boring. A VACE ControlNet's forward hooks are addressed by block index, and the published Anima VACE models were trained against the 28-block base, where they inject at blocks 0, 7, 14 and 21. Point that at a 40- or 52-block model and the loader hooks the same four numbers anyway - now physically different blocks at a different depth. Your control signal goes in at the wrong place. This node sits between loading the ControlNet and applying it, and moves those four numbers to where they belong.

How the remap works

A VACE ControlNet isn't an encoder bolted onto your model - it's a small separate network (a few copied Anima blocks) that produces one "hint" per control block, and each hint gets added to the output of one specific host-DiT block through a forward hook. Those target indices live in the checkpoint's metadata.

The node reads them from the ControlNet object you loaded rather than hardcoding anything, which is why it should keep working if someone publishes a VACE model with a different number or spacing of control blocks. Then it resolves the expansion manifest for the detected pair and rewrites the indices:

| Connected model | Injection blocks | |---|---| | 28 blocks (Anima-Base) | 0, 7, 14, 21 - unchanged | | 40 blocks (Anima-2.9B) | 0, 10, 20, 31 | | 52 blocks (Anima-3.8B) | 0, 13, 26, 41 |

Only those indices change. The control branch's weights and everything it computes are untouched, nothing is duplicated in memory (it's a shallow copy, so the parameters are literally shared), and the loader's cached ControlNet is never modified - so alternating between a 28-block and a 52-block model always re-converts from the original indices.

Inputs and wiring

Four inputs, two of which you'll set once:

  • control_net - a VACE ControlNet loaded with Load Advanced ControlNet Model (the node whose name ends in 🛂🅐🅒🅝). ComfyUI's built-in "Load ControlNet Model" and the "ControlNet++ Loader" can't recognise the VACE type.
  • model - feed it the same model you connect to your KSampler. It's only used to detect the block count, but it has to be the right one.
  • auto_remap - default on. Off logs a warning and injects as-is at blocks that don't correspond, which is a debugging mode, not a setting.
  • manifest - leave it on Auto (Recommended).

Outputs are control_net, which feeds Apply Advanced ControlNet, and remap_info - a string spelling out what happened, e.g. 28->40 via expand_manifest_28_40.json, injection blocks [0, 7, 14, 21] -> [0, 10, 20, 31]. Preview it the first time: it's the difference between "my control is weak" and "my control never moved".

[Load Advanced ControlNet Model] ─CONTROL_NET→ [Anima VACE ControlNet Remap] ─→ [Apply Advanced ControlNet]
[model loader] ─────────────────MODEL──────────↗

Install

The node itself comes with the pack:

cd ComfyUI/custom_nodes/
git clone https://github.com/shin131002/ComfyUI-Anima-Remap.git

But it needs a fork of ComfyUI-Advanced-ControlNet to have anything to remap: the fix/anima-vace-hardening branch by PineCookie, which can load VACE-type Anima ControlNets and also fixes a bug where an interrupted generation leaves the control attached, so later images degrade into noise. If the original Advanced-ControlNet is installed, rename its folder to ComfyUI-Advanced-ControlNet.disabled, then:

cd ComfyUI/custom_nodes/
git clone -b fix/anima-vace-hardening https://github.com/PineCookie/ComfyUI-Advanced-ControlNet.git

Weights go in models/controlnet: Depth from TaihoC/Anima-ControlNet-VACE-Depth, Canny from khanghy1000/Anima-ControlNet-VACE-Canny. Anima-Remap imports none of the fork's code, so the pack loads fine without it - you only need the fork when you actually use this node.

If you still have ComfyUI-Anima29B-Remap installed, remove it. Same node IDs, so both installed means a registration conflict.

Where people get burned

"This is not an Anima VACE ControlNet." That error means the loader produced something the node doesn't recognise - nearly always because the ControlNet came from the built-in loader or a different Advanced-ControlNet install, not the fork. Check the folder name first.

Manager ate your fork. "Repair" or "Reinstall" on ComfyUI-Advanced-ControlNet can silently replace the fork with upstream. If VACE loading suddenly stops working, git pull inside the fork's folder.

Resolution. Stick to multiples of 16 - 832, 1024, 1216, 1536. The fork handles sizes like 1080, but older ones have been reported to error on them.

Bigger-on-smaller is refused. A ControlNet trained for more blocks than the model has stops the node - the same stance the pack's LoRA nodes take. A 28-block ControlNet on a 28-block model passes through unchanged, and a block-count pair with no manifest stops rather than injecting in the wrong place, which is the entire point.

One honest note on expectations: LLLite is the light-touch option for Anima, and people have found it barely moves the image. A VACE-type ControlNet is the conventional, stronger kind - this remap is what makes it usable on anything past Anima-Base.

Categoryloaders/anima

Inputs (4)

NameTypeDefaultDescription
control_netCONTROL_NET—
modelMODEL—
auto_remapBOOLEANtrue—
manifestCOMBO4 options: Auto (Recommended), expand_manifest_28_40.json, expand_manifest_28_52_composed.json, expand_manifest_40_52.json

Outputs (2)

NameTypeDescription
control_netCONTROL_NET—
remap_infoSTRING—