Generated reference · ComfyUI workflow · motion

Wan 2.2 Animate-2

Wan2.2-Animate-2: a reference still performs the motion of a driving clip, end to end. The driving frames go to the model directly (no ONNX pose/face preprocess, unlike wan22-animate); the character comes from the reference and the …

motion25nodesGPU H100out unspecified~606sv1.0.0

On this page

Wan2.2-Animate-2: a reference still performs the motion of a driving clip, end to end. The driving frames go to the model directly (no ONNX pose/face preprocess, unlike wan22-animate); the character comes from the reference and the background and camera from the prompt. One 81-frame window of the ComfyUI Animate-2 distilled template.

25Graph nodes
21Node classes
13Inputs
4Models

Tags: motionwan2.2animate-2performance-transferrunpod-serverlessvolume-backed

Inputs (13)#

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

reference_imageimagerequired
The character. Its background does not matter: the output background follows the prompt. Keep its framing like the driving clip's (full body to full body); a framing mismatch is the template's first named cause of bad results.
driving_videovideorequired
The performance to follow. Its frames are consumed directly, 1:1 with no frame-rate resampling, from the first frame; a clip shorter than `length` holds its last frame. Its frame rate and audio are carried into the output.
promptstringrequireddefault Character appearance description: the character in the reference image. Background description: Plain light gray studio background, soft even lighting, no decorations.
What the character looks like and where they are, in the template's two-part form (`Character appearance description: ...` then `Background description: ...`). Describe looks only, no motion: the motion comes from the driving clip and `motion_prompt`.
motion_promptstringdefault a person dancing
The pose branch's prompt: the motion in the driving clip, e.g. the template's `a person dancing`. WanAnimate2ToVideo reads it as positive_pose for both the cond and uncond passes.
negative_promptstringdefault 色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走
The template's negative (Wan's published one). The distilled schedule samples at CFG 1, so it is encoded and wired as the template wires it but has no effect on the output.
speed_modeenumdefault distilled
distilled: the Animate-2 distilled transformer on the distilled template's schedule, 10 steps, sampler lcm, CFG 1 (the tracker's `euler` is not what the template uses). The base template's schedule is not offered: it runs the base transformer through lightx2v_I2V_14B_480p_cfg_step_distill_rank64_bf16, a LoRA with no row in the volume manifest.
options: distilled
resolutionenumdefault 482x854
Output size. The driving frames and the reference are each scaled to it with a centre crop (area filter), as the template does. 482x854 is the template's; 480x832/832x480 is the V.11 minimum shape and 512x896/896x512 the 896-class shape A.01.06's live clips name.
options: 482x854854x482480x832832x480512x896896x512720x12801280x720
lengthintegerdefault 81min 5max 81
Frames generated, 4n+1. 81 is one template window; longer clips chain windows through continue_motion, which this graph does not build.
pose_strengthfloatdefault 1.0min 0.0max 10.0
Scales the driving clip's influence on the motion (WanAnimate2ToVideo). 1.0 is the trained behaviour; 0.0 mutes it but does not fully remove it.
pose_start_percentfloatdefault 0.0min 0.0max 1.0
Sampling percent at which the pose influence starts; outside the window the pose branch is skipped. Must not exceed pose_end_percent.
pose_end_percentfloatdefault 1.0min 0.0max 1.0
Sampling percent at which the pose influence ends. Motion is mostly set early, so e.g. 0.7 loosens fine detail while keeping the choreography.
reference_image_strengthfloatdefault 1.0min 0.0max 10.0
How strongly generated frames attend to the reference latent. Below 1.0 loosens identity (lets the prompt restyle); above tightens it against drift.
seedintegerdefault 0min 0
Sampler noise seed.

ComfyUI node graph (25)#

The executable ComfyUI prompt graph: 25 nodes across 21 distinct node classes, wired by 36 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: CLIPVisionLoader"] n4["5: WanAnimate2Cache"] n5["6: ModelSamplingSD3"] n6["7: CLIPTextEncode"] n7["8: CLIPTextEncode"] n8["9: CLIPTextEncode"] n9["10: LoadImage"] n10["11: LoadVideo"] n11["12: GetVideoComponents"] n12["13: ResizeImageMaskNode"] n13["14: ResizeImageMaskNode"] n14["15: ImageFromBatch"] n15["16: CLIPVisionEncode"] n16["17: CLIPVisionEncode"] n17["18: WanAnimate2ToVideo"] n18["19: KSamplerSelect"] n19["20: BasicScheduler"] n20["21: SamplerCustom"] n21["22: TrimVideoLatent"] n22["23: VAEDecode"] n23["24: CreateVideo"] n24["25: SaveVideo"] n0 -->|model| n4 n4 -->|model| n5 n1 -->|clip| n6 n1 -->|clip| n7 n1 -->|clip| n8 n10 -->|video| n11 n11 -->|input| n12 n9 -->|input| n13 n12 -->|image| n14 n3 -->|clip_vision| n15 n13 -->|image| n15 n3 -->|clip_vision| n16 n14 -->|image| n16 n6 -->|positive| n17 n7 -->|negative| n17 n2 -->|vae| n17 n13 -->|reference_image| n17 n12 -->|pose_video| n17 n15 -->|clip_vision_output| n17 n8 -->|positive_pose| n17 n16 -->|clip_vision_output_pose| n17 n4 -->|model| n19 n5 -->|model| n20 n17 -->|positive| n20 n17 -->|negative| n20 n18 -->|sampler| n20 n19 -->|sigmas| n20 n17 -->|latent_image| n20 n20 -->|samples| n21 n17 -->|trim_amount| n21 n21 -->|samples| n22 n2 -->|vae| n22 n22 -->|images| n23 n11 -->|audio| n23 n11 -->|fps| n23 n23 -->|video| n24
Data-flow DAG — scroll to zoom, drag to pan.

Nodes (25)#

1UNETLoadercore
unet_name = {{speed_unet_map[speed_mode]}} tmplweight_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
4CLIPVisionLoadercore
clip_name = clip_vision_h.safetensors
outputs: CLIP_VISION
5WanAnimate2Cachecore
model = ◂ node 1 · out[0]device = gpudtype = int8
outputs: MODEL
6ModelSamplingSD3core
model = ◂ node 5 · out[0]shift = 5
outputs: MODEL
7CLIPTextEncodecore
clip = ◂ node 2 · out[0]text = {{prompt}} tmpl
outputs: CONDITIONING
8CLIPTextEncodecore
clip = ◂ node 2 · out[0]text = {{negative_prompt}} tmpl
outputs: CONDITIONING
9CLIPTextEncodecore
clip = ◂ node 2 · out[0]text = {{motion_prompt}} tmpl
outputs: CONDITIONING
10LoadImagecore
image = {{reference_image}} tmpl
outputs: IMAGEMASK
11LoadVideocore
file = {{driving_video}} tmpl
outputs: VIDEO
12GetVideoComponentscore
video = ◂ node 11 · out[0]
outputs: IMAGEAUDIOFLOATCOMBOCOMBO
13ResizeImageMaskNodecore
input = ◂ node 12 · out[0]resize_type = scale dimensionsresize_type.width = {{resolution_map[resolution].width}} tmplresize_type.height = {{resolution_map[resolution].height}} tmplresize_type.crop = centerscale_method = area
outputs: IMAGE
14ResizeImageMaskNodecore
input = ◂ node 10 · out[0]resize_type = scale dimensionsresize_type.width = {{resolution_map[resolution].width}} tmplresize_type.height = {{resolution_map[resolution].height}} tmplresize_type.crop = centerscale_method = area
outputs: IMAGE
15ImageFromBatchcore
image = ◂ node 13 · out[0]batch_index = 0length = 1
outputs: IMAGE
16CLIPVisionEncodecore
clip_vision = ◂ node 4 · out[0]image = ◂ node 14 · out[0]crop = none
outputs: CLIP_VISION_OUTPUT
17CLIPVisionEncodecore
clip_vision = ◂ node 4 · out[0]image = ◂ node 15 · out[0]crop = none
outputs: CLIP_VISION_OUTPUT
18WanAnimate2ToVideocore
positive = ◂ node 7 · out[0]negative = ◂ node 8 · out[0]vae = ◂ node 3 · out[0]reference_image = ◂ node 14 · out[0]pose_video = ◂ node 13 · out[0]clip_vision_output = ◂ node 16 · out[0]positive_pose = ◂ node 9 · out[0]clip_vision_output_pose = ◂ node 17 · out[0]width = {{resolution_map[resolution].width}} tmplheight = {{resolution_map[resolution].height}} tmpllength = {{length}} tmplbatch_size = 1video_frame_offset = 0pose_strength = {{pose_strength}} tmplpose_start_percent = {{pose_start_percent}} tmplpose_end_percent = {{pose_end_percent}} tmplreference_image_strength = {{reference_image_strength}} tmpl
outputs: CONDITIONINGCONDITIONINGLATENTINTINTINT
19KSamplerSelectcore
sampler_name = {{speed_sampler_map[speed_mode]}} tmpl
outputs: SAMPLER
20BasicSchedulercore
model = ◂ node 5 · out[0]scheduler = simplesteps = {{speed_steps_map[speed_mode]}} tmpldenoise = 1.0
outputs: SIGMAS
21SamplerCustomcore
model = ◂ node 6 · out[0]add_noise = truenoise_seed = {{seed}} tmplcfg = {{speed_cfg_map[speed_mode]}} tmplpositive = ◂ node 18 · out[0]negative = ◂ node 18 · out[1]sampler = ◂ node 19 · out[0]sigmas = ◂ node 20 · out[0]latent_image = ◂ node 18 · out[2]
outputs: LATENTLATENT
22TrimVideoLatentcore
samples = ◂ node 21 · out[0]trim_amount = ◂ node 18 · out[3]
outputs: LATENT
23VAEDecodecore
samples = ◂ node 22 · out[0]vae = ◂ node 3 · out[0]
outputs: IMAGE
24CreateVideocore
images = ◂ node 23 · out[0]audio = ◂ node 12 · out[1]fps = ◂ node 12 · out[2]
outputs: VIDEO
25SaveVideocore
video = ◂ node 24 · out[0]filename_prefix = wan22-animate-2format = mp4

Parameter banks (6)#

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 (8)#

482x854
{"width": 482, "height": 854}
854x482
{"width": 854, "height": 482}
480x832
{"width": 480, "height": 832}
832x480
{"width": 832, "height": 480}
512x896
{"width": 512, "height": 896}
896x512
{"width": 896, "height": 512}
720x1280
{"width": 720, "height": 1280}
1280x720
{"width": 1280, "height": 720}

speed_unet_map (1)#

distilled
wan_animate_2_distill_bf16.safetensors

speed_steps_map (1)#

distilled
10

speed_sampler_map (1)#

distilled
lcm

speed_cfg_map (1)#

distilled
1.0

requires_families (1)#

wan22-animate2

Models & dependencies#

Models required (4)#

wan_animate_2_distill_bf16.safetensors
umt5_xxl_fp16.safetensors
wan_2.1_vae.safetensors
clip_vision_h.safetensors

Output contract#

What a successful run of this workflow returns.

primary
{"type": "video", "format": "mp4", "codec": "h264", "fps_source": "source", "audio": true, "alpha": false, "description": "The reference character performing the driving motion, at the driving clip's frame rate with its audio track when it has one."}

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
anim-character-turnaround-pack
outputPackageProfile
video-master-profile
controlModalities
model-lockprompt-template-locksampler-scheduler-lockseed-lockidentity-lockpose-constrainttemporal-lock
consistencyDimensions
identitymotionenvironmentwardrobe
notes
Wan2.2-Animate-2 (A.01.06). pose-constraint, not openpose-sequence: the driving frames themselves are the pose video, with no skeleton drawn. identity-lock is the reference latent plus its CLIP-vision encoding; environment comes from the prompt's background description.