Nodes/ComfyUI-Tessiiiz-WanVideoToolkit/Wan 2.2 VACE Multi-Ref To Video
ComfyUI Node

Wan 2.2 VACE Multi-Ref To Video

The Wan 2.2 node that ends multi-ref juggling

By Tessiiiz·Created 6 months ago·Updated 6 months ago· 2
Wan 2.2 VACE Multi-Ref To Video
  • positive
  • negative
  • wan_vae
  • vae
  • clip_vision_output
  • control_video
  • start_image
  • positioned_frames
  • end_image
  • extra_reference_images
  • inpaint_mask
  • prev_vace_embeds
  • positive
  • negative
  • latent
  • vace_embeds
width832
height480
num_frames81
batch_size1
strength1.00
vace_start_percent0.00
vace_end_percent1.00
control_start_frame1
frames_to_keep_in_control_video
positions_of_positioned_frames20 30 50 90
start_frame_hold1
positioned_frame_hold1
end_frame_hold1
empty_frame_level0.50
control_mask_value1.00
resize_modestretch

If you've ever stared at a Wan 2.2 VACE workflow and wished one node would just take your start frame, a few middle frames, your end frame, and a control video, then hand you clean sampler-ready outputs - this is that node. Wan22VaceMultiRefEncode (shown as "Wan 2.2 VACE Multi-Ref To Video") is the Wan 2.2 half of the Tessiiiz Wan Video Toolkit, and it's the closest thing the pack has to a one-stop prep node for reference-to-video.

Multi-reference R2V is exactly what the community keeps chasing - "finally have near closed source level Reference to Video" was the reaction when Bernini shipped its multi-ref mode on Wan 2.2 weights. VACE is the Wan-side answer to the same problem, but the stock nodes make you assemble the pieces yourself. This node does the assembling.

What it actually does

Internally it's a bridge that builds two things at once, by expanding into ComfyUI's own Wan 2.2 nodes:

  • A normal image-to-video prep path through the built-in WanImageToVideo node, which produces your positive, negative, and latent outputs.
  • A VACE conditioning path through the built-in WanVideoVACEEncode node, which produces vace_embeds from your pinned reference frames.

So you get the exact same output shape as a normal Wan I2V graph, plus a vace_embeds output you only wire up if your downstream graph has a node that consumes VACE embeddings.

The mechanism underneath is a pinned timeline. The node allocates num_frames frames, fills the empty ones with empty_frame_level gray (default 0.5), then stamps your inputs onto it: control_video starting at control_start_frame, start_image held for start_frame_hold frames, each positioned_frames image held for positioned_frame_hold frames at its assigned position, and end_image held at the very end. That whole timeline plus a per-frame mask is what goes into the VACE encode. Frames you didn't pin stay gray, which is how VACE knows what to leave alone.

The inputs that matter

  • vae or wan_vae - one of these is required, and the node hard-errors with "needs a VAE" if you connect neither. wan_vae is the type that comes out of a Wan 2.2 VAE loader; a plain vae also works.
  • start_image and end_image - your first and last frame anchors. If you only pin one frame, make it the start.
  • positioned_frames + positions_of_positioned_frames - your middle references. This is the whole point of the pack. The default positions string 20 30 50 90 is space-separated, 1-based frame numbers (so 20 = the 20th frame), and it also understands L/END for the last frame and negative numbers counting back from it.
  • control_video + frames_to_keep_in_control_video - an optional driving video (pose, depth, whatever you preprocessed). The keep field filters it to specific frames: 1 20 30 keeps just those, 1:16 keeps the first 16. Leave it empty to keep everything.
  • vace_start_percent / vace_end_percent - the 0-to-1 window over which VACE conditioning applies during denoising. Defaults are 0 and 1 (the whole thing).

Outputs: positive, negative, and latent go to your sampler exactly like a normal Wan graph; vace_embeds goes to whatever downstream node in your Wan 2.2 setup consumes WANVIDIMAGE_EMBEDS.

Installing it

The pack is a thin glue layer - no weights, no Python dependencies beyond ComfyUI itself, no requirements.txt. Via Manager, search for ComfyUI-Tessiiiz-WanVideoToolkit, or:

cd ComfyUI/custom_nodes
git clone https://github.com/Tessiiiz/ComfyUI-Tessiiiz-WanVideoToolkit

Restart ComfyUI. What you do still need is the Wan 2.2 weights plus the Wan 2.2 VACE model, loaded through ComfyUI's normal Wan loaders - this pack doesn't ship any of that.

Where people get burned

  • The positions must line up with your frames. Each positioned_frames image pairs with one position token in order. Feed more images than positions and the extras are silently dropped - no error, just refs that never appear.
  • Off-by-one on positions. They're 1-based, which trips everyone once. Position 1 is the first frame.
  • It's 2.2-only, but lives under "Wan 2.1 Toolkit" in the node menu - a naming quirk of the pack. Don't grab it for a 2.1 VACE graph; that's what WanVaceMultiRefToVideo is for.
  • Ignore vace_embeds if nothing consumes it. The README is explicit: only use it if your downstream 2.2 workflow has a VACE-embedding consumer. Wandering around trying to find a use for it is wasted effort.

One honest caveat: this is a small, actively-rebuilding pack (the author stripped old nodes out to rebuild around this cleaner VACE flow), so node names and wiring may shift between versions. When they do, the README updates before any tutorial does.

CategoryWan 2.1 Toolkit

Inputs (28)

NameTypeDefaultDescription
positiveCONDITIONING
negativeCONDITIONING
widthINT83216–8192
heightINT48016–8192
num_framesINT811–4096
batch_sizeINT11–4096
strengthFLOAT1.000–1000
vace_start_percentFLOAT0.000–1
vace_end_percentFLOAT1.000–1
control_start_frameINT11–4096
frames_to_keep_in_control_videoSTRING
positions_of_positioned_framesSTRING20 30 50 90
start_frame_holdINT11–240
positioned_frame_holdINT11–240
end_frame_holdINT11–240
empty_frame_levelFLOAT0.500–1
control_mask_valueFLOAT1.000–1
resize_modeCOMBOstretch2 options: stretch, crop
wan_vaeoptWANVAE
vaeoptVAE
clip_vision_outputoptCLIP_VISION_OUTPUT
control_videooptIMAGE
start_imageoptIMAGE
positioned_framesoptIMAGE
end_imageoptIMAGE
extra_reference_imagesoptIMAGE
inpaint_maskoptMASK
prev_vace_embedsoptWANVIDIMAGE_EMBEDS

Outputs (4)

NameTypeDescription
positiveCONDITIONING
negativeCONDITIONING
latentLATENT
vace_embedsWANVIDIMAGE_EMBEDS