WanVacePhantomDualV2
Two VACE contexts, Phantom identity, and no separate patch node
- model
- positive
- negative
- vae
- latent_in
- control_video_1
- control_masks_1
- vace_reference_1
- control_video_2
- control_masks_2
- vace_reference_2
- phantom_images
- model
- positive
- negative
- neg_phant_img
- latent
- trim_latent
If you want to stack two kinds of video control on Wan - pose and depth, layout and a second subject reference - this is the node the pack points you to. WanVacePhantomDualV2 is the recommended "complex control" option: two fully independent VACE contexts, Phantom image embeddings for character identity, and - the thing that quietly saves you a support ticket - it patches the model itself the moment you connect one to its model input. No separate VaceAdvancedModelPatch required.
How it works
Under the hood it calls the same encode_vace_advanced routine as the rest of the family: each control video and reference image gets VAE-encoded into the 32-channel "inactive + reactive" latent that VACE expects, combined with a mask of where it applies, and stitched into your conditioning. With two contexts you get two of everything, controlled independently:
- Context 1:
control_video_1,control_masks_1,vace_reference_1,vace_strength_1,vace_ref_strength_1 - Context 2:
control_video_2,control_masks_2,vace_reference_2,vace_strength_2,vace_ref_strength_2 phantom_images: one shared Phantom embedding set on top.
The "V2" in the name buys you three upgrades over the original nodes. First, the built-in model patching above - connect a MODEL and you get the patched model back out the model output, ready for your sampler. Second, latent_in: feed an existing latent to continue a video, and the node auto-adjusts width/height to the latent's decoded size (latent dims × 8) and does smart reference-frame handling - trimming or adding frames so the new reference frames align with your continuation. Third, both strength inputs take per-frame float lists (with a patched model), each entry covering 4 video frames.
The inputs you'll actually touch
Every input is optional, which is both a blessing and a trap: the node will happily run with nothing wired, and it will complain at you in the console if positive/vae are missing at execution time. Set width (832), height (480), length (81), batch_size (1), then wire at least one control context. The three outputs beyond the conditioning - neg_phant_img, latent, and trim_latent (the INT reference-frame count) - matter most when you're chaining or continuing; for a first run, positive → sampler and model → sampler is enough.
Gotchas worth knowing
- Phantom needs CFG > 1.0 (1.5–3.5 typically). At CFG 1.0 the embeddings do almost nothing - the README is explicit about it, and it's the most common "Phantom doesn't work" post.
- Combine
negativeandneg_phant_imgwithConditioning Combinefor best results. - Chaining this node after another VACE node accumulates contexts; if you only want the one, don't double up. The community consensus on Phantom+VACE is that the combination is powerful but fiddly - expect to tune, and keep your reference images simple with your subject as the focus.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/drozbay/ComfyUI-WanVaceAdvanced
# restart ComfyUI
or ComfyUI Manager → "ComfyUI-WanVaceAdvanced". Deps are numpy + scipy; you'll also want KJNodes and VideoHelperSuite for loading models and video, plus either the Phantom 14B + VACE module pair from Kijai's WanVideo hub or the pre-merged InnerReflections Wan2.1_VACE_Phantom checkpoint. If you only need one control channel, WanVacePhantomSimpleV2 is the lighter sibling - this node is for when one context genuinely isn't enough.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| modelopt | MODEL | — | |
| positiveopt | CONDITIONING | — | |
| negativeopt | CONDITIONING | — | |
| vaeopt | VAE | — | |
| widthopt | INT | 83216–16384 | — |
| heightopt | INT | 48016–16384 | — |
| lengthopt | INT | 811–16384 | — |
| batch_sizeopt | INT | 11–4096 | — |
| latent_inopt | LATENT | Optional latent input to continue from | |
| control_video_1opt | IMAGE | — | |
| control_masks_1opt | MASK | — | |
| vace_reference_1opt | IMAGE | — | |
| vace_strength_1opt | FLOAT | 1.000–1000 | — |
| vace_ref_strength_1opt | FLOAT | 1.000–1000 | — |
| control_video_2opt | IMAGE | — | |
| control_masks_2opt | MASK | — | |
| vace_reference_2opt | IMAGE | — | |
| vace_strength_2opt | FLOAT | 1.000–1000 | — |
| vace_ref_strength_2opt | FLOAT | 1.000–1000 | — |
| phantom_imagesopt | IMAGE | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| neg_phant_img | CONDITIONING | — |
| latent | LATENT | — |
| trim_latent | INT | — |