Nodes/ComfyUI-WanVaceAdvanced/WanVacePhantomDualV2
ComfyUI Node

WanVacePhantomDualV2

Two VACE contexts, Phantom identity, and no separate patch node

By drozbay·Created about a year ago·Updated 7 months ago· 95
WanVacePhantomDualV2
  • 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
width832
height480
length81
batch_size1
vace_strength_11.00
vace_ref_strength_11.00
vace_strength_21.00
vace_ref_strength_21.00

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 negative and neg_phant_img with Conditioning Combine for 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.

CategoryWanVaceAdvanced

Inputs (20)

NameTypeDefaultDescription
modeloptMODEL
positiveoptCONDITIONING
negativeoptCONDITIONING
vaeoptVAE
widthoptINT83216–16384
heightoptINT48016–16384
lengthoptINT811–16384
batch_sizeoptINT11–4096
latent_inoptLATENTOptional latent input to continue from
control_video_1optIMAGE
control_masks_1optMASK
vace_reference_1optIMAGE
vace_strength_1optFLOAT1.000–1000
vace_ref_strength_1optFLOAT1.000–1000
control_video_2optIMAGE
control_masks_2optMASK
vace_reference_2optIMAGE
vace_strength_2optFLOAT1.000–1000
vace_ref_strength_2optFLOAT1.000–1000
phantom_imagesoptIMAGE

Outputs (6)

NameTypeDescription
modelMODEL
positiveCONDITIONING
negativeCONDITIONING
neg_phant_imgCONDITIONING
latentLATENT
trim_latentINT