WanVaceToVideo
Reference characters plus a driving video, in one conditioning node
- positive
- negative
- vae
- control_video
- control_masks
- reference_image
- positive
- negative
- latent
- trim_latent
VACE is Wan's video-to-video and extension framework, and this node is its front door in ComfyUI. It's the one you build a "make this character do this motion" workflow around: you give it a reference image for identity, a control video for the motion, and it returns the conditioning plus the empty latent that your KSampler fills in. When the community says "VACE does vid2vid with per-frame control," this node is the thing doing the conditioning half of that.
VACE (Video-Aware Context Extension) is Alibaba's own framework for Wan, and it became one of the most-hyped open video releases of 2025 for a reason: two reference images got you character-consistent video that used to need full training. This node is the core, built-in way to drive it.
How it works
Under the hood it VAE-encodes the control video twice - once masked-inactive, once reactive - concatenates the two latent halves, optionally prepends the encoded reference image, and packages the whole thing as vace_frames/vace_mask/vace_strength metadata on your positive and negative conditioning. The mask decides which frames and regions actually drive the generation.
The inputs that matter:
- control_video - the driving video (pose, depth, or any visual guide). Optional; if you leave it out you get a plain Wan generation.
- control_masks - which parts of the control video are active. Optional; without it the whole video drives.
- reference_image - identity source. Optional, but it's what makes VACE VACE. If you want character consistency, this is the input that provides it.
- strength - 0 to 1000, default 1. How hard the VACE conditioning pulls.
- width / height / length / batch_size - the generation canvas, same as the other Wan nodes. length defaults to 81 frames, Wan's native context.
Outputs: positive, negative (go to the KSampler), latent (the empty latent to sample), and trim_latent - an integer telling you how many leading latent frames are reference-image padding. You feed trim_latent into a Trim Video Latent node after sampling, or you'll render a few junk frames at the start.
Where people get burned
- Forgetting trim_latent. With a reference image, the latent has a reference head that isn't output video. The node tells you exactly how long it is - use it.
- Short control videos. A control_video shorter than
lengthgets padded with neutral gray, which produces a generation that "keeps going" past the driving clip. Sometimes that's a feature (auto-extension); mostly people want their video to match the driving length. - VRAM. VACE 14B is genuinely heavy - 15–40 minutes a clip on a 4090 at 720p is the community's real-world experience, and 12GB cards struggle with the 14B model. The 1.3B variant is the budget path.
- Control resolution mismatch. The control video is resized to width×height, and masks are resized with it. If your mask was drawn on the original resolution, edges can shift.
Ships with ComfyUI core. VACE model files go in the normal checkpoints folder and load through the Wan loader - nothing extra to install.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| width | INT | 83216–16384 | — |
| height | INT | 48016–16384 | — |
| length | INT | 811–16384 | — |
| batch_size | INT | 11–4096 | — |
| strength | FLOAT | 1.000–1000 | — |
| control_videoopt | IMAGE | — | |
| control_masksopt | MASK | — | |
| reference_imageopt | IMAGE | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |
| trim_latent | INT | — |