Wan 2.2 VACE Multi-Ref To Video
The Wan 2.2 node that ends multi-ref juggling
- 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
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, andlatentoutputs. - A VACE conditioning path through the built-in WanVideoVACEEncode node, which produces
vace_embedsfrom 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
vaeorwan_vae- one of these is required, and the node hard-errors with "needs a VAE" if you connect neither.wan_vaeis the type that comes out of a Wan 2.2 VAE loader; a plainvaealso works.start_imageandend_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 string20 30 50 90is space-separated, 1-based frame numbers (so20= the 20th frame), and it also understandsL/ENDfor 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 30keeps just those,1:16keeps 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_framesimage 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
1is 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
WanVaceMultiRefToVideois for. - Ignore
vace_embedsif 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.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| width | INT | 83216–8192 | — |
| height | INT | 48016–8192 | — |
| num_frames | INT | 811–4096 | — |
| batch_size | INT | 11–4096 | — |
| strength | FLOAT | 1.000–1000 | — |
| vace_start_percent | FLOAT | 0.000–1 | — |
| vace_end_percent | FLOAT | 1.000–1 | — |
| control_start_frame | INT | 11–4096 | — |
| frames_to_keep_in_control_video | STRING | — | |
| positions_of_positioned_frames | STRING | 20 30 50 90 | — |
| start_frame_hold | INT | 11–240 | — |
| positioned_frame_hold | INT | 11–240 | — |
| end_frame_hold | INT | 11–240 | — |
| empty_frame_level | FLOAT | 0.500–1 | — |
| control_mask_value | FLOAT | 1.000–1 | — |
| resize_mode | COMBO | stretch | 2 options: stretch, crop |
| wan_vaeopt | WANVAE | — | |
| vaeopt | VAE | — | |
| clip_vision_outputopt | CLIP_VISION_OUTPUT | — | |
| control_videoopt | IMAGE | — | |
| start_imageopt | IMAGE | — | |
| positioned_framesopt | IMAGE | — | |
| end_imageopt | IMAGE | — | |
| extra_reference_imagesopt | IMAGE | — | |
| inpaint_maskopt | MASK | — | |
| prev_vace_embedsopt | WANVIDIMAGE_EMBEDS | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |
| vace_embeds | WANVIDIMAGE_EMBEDS | — |