DiffSynth: Wan Video Inference
One node, every Wan variant, and about forty sockets you can ignore
- pipe
- input_image
- end_image
- input_video
- input_audio
- audio_embeds
- s2v_pose_video
- s2v_pose_latents
- motion_video
- control_video
- reference_image
- vace_video
- vace_video_mask
- vace_reference_image
- animate_pose_video
- animate_face_video
- animate_inpaint_video
- animate_mask_video
- animate2_reference_image
- animate2_reference_video
- animate2_refert_images
- vap_video
- longcat_video
- wantodance_reference_image
- wantodance_keyframes
- video
Scroll past the input list on this node and you'll think something has gone wrong. It's enormous. That's not a mistake or a sign of bloat - it's the union of every task the Wan family can do, from text-to-video through VACE control, speech-to-video, motion transfer and music-driven dance. You use three or four sockets. The rest are for a workflow you're not running.
The core settings
If you're doing plain text-to-video, this is the whole node:
pipe- from DiffSynth: Wan Video Loader.prompt,negative_prompt- natural language, cinematic description works better than tag soup.seed,num_inference_steps(50),cfg_scale(5).height480,width832,num_frames81 - the classic Wan 480p short. 81 frames is the model's native context; it's roughly three and a half seconds at 16fps, and everything the community does at 3–5 seconds starts here.sigma_shift(5) andswitch_DiT_boundary(0.875) - scheduler and expert-boundary knobs. Wan 2.2 splits denoising between a high-noise expert and a low-noise one; the boundary is where it hands over. Leave both alone unless you're following a recipe.
Image, video and audio conditioning
input_image- image-to-video. This is most people's actual workflow; a still plus motion beats a prompt alone for anything with a subject you care about.end_image- first/last-frame interpolation. Give it both ends and let it join them.input_video+denoising_strength- video-to-video.denoising_strengthnear 1 replaces the clip; drop it to keep more of the original.input_audio,audio_sample_rate,motion_video,s2v_pose_video- the speech-to-video family. Wants the audio processor config on the Loader.control_video,reference_image- ControlNet-style conditioning and subject reference.camera_control_direction,camera_control_speed,camera_control_origin- camera moves on the models trained for it.camera_control_directiontakesLeft,Right,Up,Downand the four diagonals; origin is a long transform string you should only ever paste from an example.
The rest - vace_video and friends, animate_*, animate2_*, vap_*, longcat_video, wantodance_* - belong to specific checkpoints. Connect a VACE input without VACE weights loaded and you get an error or, worse, a video that silently ignores it.
The ones that actually change your day
tiled(on by default),tile_size,tile_stride- VAE decode tiling. Wan's 3D VAE is where big clips die, and this is why the default is on. The values are comma-separated strings (30,52and15,26), not tuples, because ComfyUI has no fancy string widgets.sliding_window_size,sliding_window_stride- how you go past 81 frames. Chunked generation; identity drift across windows is the known cost, and the community's long-video node wrappers exist for exactly this reason.tea_cache_l1_thresh- TeaCache, the caching speedup. Somewhere around 0.2–0.3 typically buys real time for a little drift; it's a trade, not a free win.cfg_merge,motion_bucket_id,framewise_decoding- niche.cfg_mergematters on Wan 2.2's MoE checkpoints; the others are model-specific.latents-adjacent sockets likes2v_pose_latents,audio_embeds- wildcard inputs for precomputed tensors. Ignore them unless a workflow hands you one.
Output is a single video socket, type IMAGE: a batch of frames. Wire to Video Combine or any frame consumer.
Install
Manager → DiffSynth-ComfyUI → install → restart, or clone into custom_nodes after pip install git+https://github.com/modelscope/DiffSynth-Studio.git. Weights are the real cost - the 1.3B T2V model is a few gigabytes; 14B is tens.
Common issues
- Out of memory on decode, not sampling. Tiling is already on by default; if you turned it off, turn it back on.
- A four-minute clip that loops or degrades. Native context is 81 frames. Chunk it deliberately or accept the mush.
- Wrong task weights. The Loader loads what you tell it; this node then tries to use inputs the checkpoint was never trained for. Copy a working example graph, then edit.
- Long waits on a mid-range card. 81 frames at 480p is minutes, not seconds, and 14B on a 12GB card is a different sport. Get a baseline at 1.3B first.
Inputs (58)
| Name | Type | Default | Description |
|---|---|---|---|
| pipe | DIFFSYNTH_PIPE | — | |
| prompt | STRING | — | |
| seed | INT | 00–4294967295 | — |
| num_inference_steps | INT | 501–200 | — |
| height | INT | 48064–4096 | — |
| width | INT | 83264–4096 | — |
| negative_promptopt | STRING | — | |
| input_imageopt | IMAGE | — | |
| end_imageopt | IMAGE | — | |
| input_videoopt | IMAGE | — | |
| denoising_strengthopt | FLOAT | 1.00–10000 | — |
| input_audioopt | * | — | |
| audio_embedsopt | * | — | |
| audio_sample_rateopt | INT | 160000–4294967295 | — |
| s2v_pose_videoopt | IMAGE | — | |
| s2v_pose_latentsopt | * | — | |
| motion_videoopt | IMAGE | — | |
| control_videoopt | IMAGE | — | |
| reference_imageopt | IMAGE | — | |
| camera_control_directionopt | COMBO | Left | 8 options: Left, Right, Up, Down, LeftUp, LeftDown, +2 |
| camera_control_speedopt | FLOAT | 0.00–10000 | — |
| camera_control_originopt | STRING | 0,0.532139961,0.946026558,0.5,0.5,0,0,1,0,0,0,0,1,0,0,0,0,1,0 | — |
| vace_videoopt | IMAGE | — | |
| vace_video_maskopt | IMAGE | — | |
| vace_reference_imageopt | IMAGE | — | |
| vace_scaleopt | FLOAT | 1.00–10000 | — |
| animate_pose_videoopt | IMAGE | — | |
| animate_face_videoopt | IMAGE | — | |
| animate_inpaint_videoopt | IMAGE | — | |
| animate_mask_videoopt | IMAGE | — | |
| animate2_prompt_refopt | STRING | — | |
| animate2_reference_imageopt | IMAGE | — | |
| animate2_reference_videoopt | IMAGE | — | |
| animate2_refert_imagesopt | IMAGE | — | |
| animate2_offload_kvopt | BOOLEAN | false | — |
| animate2_log_scaleopt | FLOAT | 0.00–10000 | — |
| vap_videoopt | IMAGE | — | |
| vap_promptopt | STRING | — | |
| negative_vap_promptopt | STRING | — | |
| num_framesopt | INT | 811–1000 | — |
| cfg_scaleopt | FLOAT | 5.00–10000 | — |
| cfg_mergeopt | BOOLEAN | false | — |
| switch_DiT_boundaryopt | FLOAT | 0.90–10000 | — |
| sigma_shiftopt | FLOAT | 5.00–10000 | — |
| motion_bucket_idopt | INT | 00–4294967295 | — |
| longcat_videoopt | IMAGE | — | |
| tiledopt | BOOLEAN | true | — |
| tile_sizeopt | STRING | 30,52 | — |
| tile_strideopt | STRING | 15,26 | — |
| sliding_window_sizeopt | INT | 00–4294967295 | — |
| sliding_window_strideopt | INT | 00–4294967295 | — |
| tea_cache_l1_threshopt | FLOAT | 0.00–10000 | — |
| wantodance_music_pathopt | STRING | — | |
| wantodance_reference_imageopt | IMAGE | — | |
| wantodance_fpsopt | FLOAT | 300–10000 | — |
| wantodance_keyframesopt | IMAGE | — | |
| wantodance_keyframes_maskopt | STRING | — | |
| framewise_decodingopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | IMAGE | — |