Generated reference · ComfyUI workflow · motion

Wan 2.1 VACE Edit

One VACE graph with four jobs: replace a masked region, restyle a whole clip under a control signal, extend a clip past its last frame, or outpaint its canvas. Which job it does is decided by what the control video and mask track are fed …

motion14nodesGPU H100out unspecified~200sv1.0.0

On this page

One VACE graph with four jobs: replace a masked region, restyle a whole clip under a control signal, extend a clip past its last frame, or outpaint its canvas. Which job it does is decided by what the control video and mask track are fed, which is why the node set changes after rendering.

14Graph nodes
13Node classes
22Inputs
3Models

Tags: motionwan2.1vacevideo-to-videoinpaintoutpaintrunpod-serverlessvolume-backed

Inputs (22)#

The typed parameter surface callers bind when they request this workflow. Enum options and numeric bounds are the values the workflow document declares.

source_videovideorequired
The clip being edited. Every mode reads it; what is done with it is the mode's business.
modeenumdefault restyle
inpaint replaces what the mask covers; restyle regenerates the whole frame under the control signal; extend keeps the first keep_frames and generates the rest; outpaint grows the canvas by the pads and fills the new area.
options: inpaintrestyleextendoutpaint
controlenumdefault raw
What VACE is shown as structure. raw passes the frames through; depth/pose/canny preprocess them; none supplies no control video at all, which is a pure prompt-driven generation inside the mask.
options: nonedepthposecannyraw
mask_videovideo
Grayscale mask clip, one frame per source frame — sam3-video-track produces exactly this. Required by `inpaint` and ignored by every other mode.
reference_imageimage
One still VACE conditions on, in any mode. The node takes ONE — the tracker's "0-3" is not what WanVaceToVideo offers.
keep_framesintegerdefault 16min 1max 236
extend only: how many frames of the source are kept as known context. The rest are generated.
pad_leftintegerdefault 0min 0max 512
outpaint only: pixels added on the left. Pads are in multiples of 8 in the node; values between are rounded by ComfyUI.
pad_rightintegerdefault 0min 0max 512
outpaint only: pixels added on the right.
pad_topintegerdefault 0min 0max 512
outpaint only: pixels added on top.
pad_bottomintegerdefault 0min 0max 512
outpaint only: pixels added below.
promptstringrequireddefault the same scene, cinematic lighting
What the generated region should contain.
negative_promptstringdefault 色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走
Wan's own published negative prompt.
strengthfloatdefault 1.0min 0.0max 2.0
How hard the control track binds. 1.0 follows it closely.
resolutionenumdefault 480p_landscape_832x480
Frame size before any outpaint pads are added.
options: 480p_landscape_832x480480p_portrait_480x832720p_landscape_1280x720720p_portrait_720x1280
lengthintegerdefault 81min 5max 241
Frames to produce. Wan wants 4n+1.
fpsfloatdefault 16.0min 1.0max 30.0
Frame rate written into the output.
stepsintegerdefault 20min 1max 60
Sampling steps.
cfgfloatdefault 5.0min 1.0max 20.0
Classifier-free guidance.
shiftfloatdefault 8.0min 0.0max 20.0
ModelSamplingSD3 shift, from Wan 2.1's own template.
seedintegerdefault 0min 0
Sampler seed.
samplerenumdefault uni_pc
Sampler. uni_pc is Wan 2.1's template default.
options: uni_pceulerdpmpp_2m
schedulerenumdefault simple
Schedule.
options: simplenormalbetakarras

ComfyUI node graph (14)#

The executable ComfyUI prompt graph: 14 nodes across 13 distinct node classes, wired by 18 data dependencies. Nodes tinted green come from a custom node pack this workflow declares; the rest are ComfyUI core / baked-community classes.

flowchart TD n0["1: UNETLoader"] n1["2: CLIPLoader"] n2["3: VAELoader"] n3["4: ModelSamplingSD3"] n4["5: CLIPTextEncode"] n5["6: CLIPTextEncode"] n6["7: LoadVideo"] n7["8: GetVideoComponents"] n8["9: WanVaceToVideo"] n9["10: KSampler"] n10["11: TrimVideoLatent"] n11["12: VAEDecode"] n12["13: CreateVideo"] n13["14: SaveVideo"] n0 -->|model| n3 n1 -->|clip| n4 n1 -->|clip| n5 n6 -->|video| n7 n4 -->|positive| n8 n5 -->|negative| n8 n2 -->|vae| n8 n7 -->|control_video| n8 n3 -->|model| n9 n8 -->|positive| n9 n8 -->|negative| n9 n8 -->|latent_image| n9 n9 -->|samples| n10 n8 -->|trim_amount| n10 n10 -->|samples| n11 n2 -->|vae| n11 n11 -->|images| n12 n12 -->|video| n13
Data-flow DAG — scroll to zoom, drag to pan.

Nodes (14)#

1UNETLoadercore
unet_name = wan2.1_vace_14B_fp16.safetensorsweight_dtype = default
outputs: MODEL
2CLIPLoadercore
clip_name = umt5_xxl_fp16.safetensorstype = wandevice = default
outputs: CLIP
3VAELoadercore
vae_name = wan_2.1_vae.safetensors
outputs: VAE
4ModelSamplingSD3core
model = ◂ node 1 · out[0]shift = {{shift}} tmpl
outputs: MODEL
5CLIPTextEncodecore
clip = ◂ node 2 · out[0]text = {{prompt}} tmpl
outputs: CONDITIONING
6CLIPTextEncodecore
clip = ◂ node 2 · out[0]text = {{negative_prompt}} tmpl
outputs: CONDITIONING
7LoadVideocore
file = {{source_video}} tmpl
outputs: VIDEO
8GetVideoComponentscore
video = ◂ node 7 · out[0]
outputs: IMAGEAUDIOFLOATCOMBOCOMBO
9WanVaceToVideocore
positive = ◂ node 5 · out[0]negative = ◂ node 6 · out[0]vae = ◂ node 3 · out[0]width = {{resolution_map[resolution].width}} tmplheight = {{resolution_map[resolution].height}} tmpllength = {{length}} tmplbatch_size = 1strength = {{strength}} tmplcontrol_video = ◂ node 8 · out[0]
outputs: CONDITIONINGCONDITIONINGLATENTINT
10KSamplercore
model = ◂ node 4 · out[0]positive = ◂ node 9 · out[0]negative = ◂ node 9 · out[1]latent_image = ◂ node 9 · out[2]seed = {{seed}} tmplsteps = {{steps}} tmplcfg = {{cfg}} tmplsampler_name = {{sampler}} tmplscheduler = {{scheduler}} tmpldenoise = 1.0
outputs: LATENT
11TrimVideoLatentcore
samples = ◂ node 10 · out[0]trim_amount = ◂ node 9 · out[3]
outputs: LATENT
12VAEDecodecore
samples = ◂ node 11 · out[0]vae = ◂ node 3 · out[0]
outputs: IMAGE
13CreateVideocore
images = ◂ node 12 · out[0]fps = {{fps}} tmpl
outputs: VIDEO
14SaveVideocore
video = ◂ node 13 · out[0]filename_prefix = wan21-vaceformat = mp4

Parameter banks (3)#

The prompt / configuration lookup tables this workflow keys into from its inputs — the vocabulary that turns a style / palette / preset selection into graph parameters.

resolution_map (4)#

480p_landscape_832x480
{"width": 832, "height": 480}
480p_portrait_480x832
{"width": 480, "height": 832}
720p_landscape_1280x720
{"width": 1280, "height": 720}
720p_portrait_720x1280
{"width": 720, "height": 1280}

post_render (1)#

vace_modes
{"mode_input": "mode", "control_input": "control", "mask_video_input": "mask_video", "reference_image_input": "reference_image", "keep_frames_input": "keep_frames", "pad_inputs": {"left": "pad_left", "right": "pad_right", "top": "pad_top", "bottom": "pad_bottom"}, "target_class": "WanVaceToVideo", "frames_class": "GetVideoComponents", "frames_output": 0}

requires_families (3)#

wan21-vacewan-sharedcontrolnet-aux

Models & dependencies#

Custom node packs (1)#

The non-core ComfyUI node classes this graph requires; the RunPod worker image the workflow runs on must bake or install a pack that provides every one of them.

comfyui_controlnet_aux

Models required (3)#

wan2.1_vace_14B_fp16.safetensors
umt5_xxl_fp16.safetensors
wan_2.1_vae.safetensors

Output contract#

What a successful run of this workflow returns.

primary
{"type": "video", "format": "mp4", "codec": "h264", "fps_source": "declared", "audio": false, "alpha": false, "description": "The edited clip."}

Taxonomy & routing#

How the control plane classifies this workflow — from the committed workflow-taxonomy-registry.json. It drives the consistency / control surface the agentic director can exercise over the workflow.

assetFamily
region-edited-video
outputPackageProfile
video-master-profile
controlModalities
model-lockprompt-template-locksampler-scheduler-lockseed-locktemporal-lockcontrolnet-depthcontrolnet-posecontrolnet-cannycontrolnet-inpaintreference-ensemble
consistencyDimensions
identitymotionlightingenvironment
notes
Wan 2.1 VACE, four modes in one graph. Every controlnet-* modality is listed because the `control` input really does select between depth, pose and canny preprocessors, and `inpaint` mode really does take a mask track; reference-ensemble covers the optional reference still. The mode is a node-set change applied after rendering, not a value substitution.