Wan 2.2 Image-to-Video
Image-to-video with Wan 2.2 — animate a still into a clip, with a motion prompt driving the movement. Identity and scene come from the source image. Past 81 frames the clip is sampled in overlapping context windows and fused, so one action carries on as ONE clip — use a longer length instead of taking a clip's last frame and animating it again, which hands the model a still and restarts the motion from rest.
Workflow id: wan22_i2v · Image → Video
Calling it
POST /api/video/generate
{
"workflow": "wan22_i2v",
"prompt": "...",
"image": "..."
}Params
Every input this workflow takes. Your install is the source of truth:GET /api/workflows/wan22_i2v returns these as they are on your machine.
prompt· str · required
Motion prompt. Name an action a viewer could describe afterwards - she stands up and walks toward the camera, he throws the bag over his shoulder. Add a camera instruction on top of it, never instead of it. Words like subtle, slowly or gently are instructions to do nothing. Past 81 frames every context window reads the same prompt, so one sustained action works better than a sequence: asking for a beginning and an end gives you neither.image· str · required
Input image filename. The clip keeps this image's aspect ratio and is rendered at the area set by size, in steps of 16.size· str · default1280*720
Render area, as the Wan 2.2 authors' --size flag: 1280*720 (720P, their default and every I2V example) or 832*480 (480P). I2V-A14B supports both (wan/configs/__init__.py SUPPORTED_SIZES). For image-to-video the size is an area, not a box: the clip takes the start image's aspect ratio at that many pixels, rounded down to steps of 16, as wan/image2video.py does with max_area. 832*480 is 43% of the pixels, for faster drafts and motion-capture source clips.negative_prompt· str · defaultbright colors, overexposed, static, blurred detailslength· int · default81
Frame count, must be 4n+1 (33/49/65/81). Default 81 is the length Wan itself ships and generates at: wan_shared_cfg.frame_num = 81 with sample_fps = 16 in wan/configs/shared_config.py, i.e. 5.06 s. The 4n+1 rule is the authors' too - generate.py --frame_num help: "How many frames of video are generated. The number should be 4n+1". Source: github.com/Wan-Video/Wan2.2, both files read 2026-09-21. Up to 81 frames the clip renders in one pass. Past that it is sampled in overlapping context windows (the context_* params) and fused into one clip; 161 frames at 16 fps is about 10 seconds.context_length· int · default21
Window size in LATENT frames, not real frames - Wan packs 4 real frames into 1 latent, so 21 latent is the model's native 81 real frames ((81-1)/4+1). This sets the per-step VRAM cost. Keep at 21. A clip that fits in one window (length up to 81 at 21) skips context windows entirely: the nodes are removed from the graph.context_overlap· int · default12
Latent frames shared between neighbouring windows; 12 latent is 48 real frames. This overlap is what carries the motion across a join, so it is the knob to raise if the action stutters or the face shifts mid-clip. Measured 2026-09-17: at 7 latent (28 real) a 161-frame clip showed a visible artefact where the second window blends in, and 12 removed it. Raising it also adds windows, so it costs time.cond_retain_index_list· str · default0
Past one window: pins the start image into EVERY window instead of only the first. Leave at "0". Measured 2026-09-17: with this empty, only the first window is anchored to the image, and a 161-frame clip ended on a different subject in a different location than it started - each later window invents its own. Set it empty only if you want the clip free to wander.context_schedule· str · defaultstandard_static
standard_static cuts the clip into fixed sequential windows, each starting context_length - context_overlap frames after the last, and reuses that same set on every step - which is what a one-way action wants. standard_uniform instead re-picks strided windows per step from a shifting offset, and looped_uniform lets them wrap around to the start; both come from AnimateDiff's scheduler and suit looping or ambient motion. Read from comfy/context_windows.py, create_windows_static_standard vs create_windows_uniform_standard.fuse_method· str · defaultpyramid
How overlapping windows are blended. pyramid weights the middle of each window highest.fps· int · default32
Frame rate of the saved clip. Wan renders 16 fps; every clip then goes through RIFE x2 frame interpolation (rife49, ComfyUI-Frame-Interpolation), which doubles the frames, so 32 plays at the speed Wan rendered it.seed· int · optional
Optional. Leave it out and every run is a new random take. Send a seed only to remake an image exactly: the seed a job used is in its record.steps_high· int · default2
2+2=4 total. The model authors' published value, not one we tuned. The Lightning LoRA is step-distilled: it was trained on the noise schedule a 4-step run produces, and ComfyUI derives its sigma spacing from the step count you pass, so any other count denoises at noise levels the LoRA never saw. That shows up as rising contrast and a light that blooms across the clip. Source: lightx2v/Wan2.2-Lightning, official native-ComfyUI workflow Wan2.2-I2V-A14B-4steps-lora-rank64-Seko-V1-NativeComfy.json — steps 4, split 0-2 / 2-4.steps_low· int · default2
See steps_high. 2+2=4 total, per the authors' workflow.total_steps· int · default4
steps_high + steps_low; passed to KSamplerAdvanced.steps. Fixed by what the distillation was trained on, not by quality preference — changing it means changing the LoRA.cfg_high· float · default1
1.0 on both stages. The Lightning LoRA is CFG-distilled — there is no unconditional branch to guide, and raising CFG pushes it off its trained trajectory. Source: lightx2v/Wan2.2-Lightning official native-ComfyUI workflow, cfg 1 on both KSamplerAdvanced nodes. Consequence: negative_prompt is inert here, because at CFG 1.0 nothing evaluates it.cfg_low· float · default1
Leave at 1.0; the low-noise stage runs the distilled LoRA.shift· float · default5sampler· str · defaulteulerscheduler· str · defaultsimplevae· str · defaultWan2.1_VAE.safetensorsclip· str · defaultumt5_xxl_fp8_e4m3fn_scaled.safetensorshigh_model· str · defaultwan2.2_i2v_high_noise_14B_fp8_scaled.safetensors
fp8_scaled high-noise model in diffusion_models (UNETLoader)low_model· str · defaultwan2.2_i2v_low_noise_14B_fp8_scaled.safetensors
fp8_scaled low-noise model in diffusion_models (UNETLoader)high_lora· str · defaultWan2.2-Lightning_I2V-A14B-4steps-lora_HIGH_fp16.safetensors
Lightning speed LoRA for high-noise modellow_lora· str · defaultWan2.2-Lightning_I2V-A14B-4steps-lora_LOW_fp16.safetensors
Lightning speed LoRA for low-noise modelhigh_lora_strength· float · default1
1.0, same as low_lora_strength. Source: lightx2v/Wan2.2-Lightning official native-ComfyUI workflow — both LoraLoaderModelOnly nodes at 1.0. Lowering it to fight the Lightning slow-motion artifact is a community recipe, not the authors': it weakens the distillation that the 4-step schedule assumes, and we measured the cost on 2026-09-21 as a light blooming across the clip. If motion is flat, change the start frame or the action, not this.high_lora_2· str · optional
Optional second LoRA stacked after the speed LoRA - this is where a motion or concept LoRA goes, e.g. a dance or action LoRA trained for Wan 2.2 i2v. Leave empty and the slot is removed from the graph entirely. Wan 2.2 LoRAs ship as a high/low pair: set both.high_lora_2_strength· float · default1
Weight of the second high-noise LoRA. Ignored when high_lora_2 is empty.low_lora_strength· float · default1
Leave at 1.0.low_lora_2· str · optional
Low-noise half of the pair in high_lora_2. Leave empty to disable.low_lora_2_strength· float · default1
Weight of the second low-noise LoRA. Ignored when low_lora_2 is empty.high_lora_3· str · optional
Optional third LoRA, stacked after high_lora_2 - for a second concept on the same clip, e.g. a facial-expression LoRA on top of a motion LoRA. Leave empty and the slot is removed from the graph entirely. Set both halves of the pair.high_lora_3_strength· float · default1
Weight of the third high-noise LoRA. Ignored when high_lora_3 is empty.low_lora_3· str · optional
Low-noise half of the pair in high_lora_3. Leave empty to disable.low_lora_3_strength· float · default1
Weight of the third low-noise LoRA. Ignored when low_lora_3 is empty.