Nodes/Wan-video-extender/Wan 2.2 Video Extender PRO
ComfyUI Node

Wan 2.2 Video Extender PRO

Wan 2.2 only goes 81 frames. This node keeps going.

By Granddyser·Created 9 months ago·Updated 9 months ago· 34
Wan 2.2 Video Extender PRO
  • model
  • vae
  • clip
  • image
  • video
  • reference_image
  • inpaint_mask
  • image_loop_1
  • reference_image_1
  • image_loop_2
  • reference_image_2
  • image_loop_3
  • reference_image_3
  • image_loop_4
  • reference_image_4
  • image_loop_5
  • reference_image_5
  • image_loop_6
  • reference_image_6
  • image_loop_7
  • reference_image_7
  • image_loop_8
  • reference_image_8
  • image_loop_9
  • reference_image_9
  • image_loop_10
  • reference_image_10
  • full_video
  • used_prompts
positive_prompt
negative_promptlow quality, blurry, glitch, distortion
steps4
cfg1.00
sampler_name
scheduler
extension_loops1
generate_frames81
overlap_frames16
empty_frame_level0.50
strength1.00
seed0
default_width832
default_height480
prompt_loop_1
lora_loop_1
lora_strength_11.00
use_reference_loop_1false
use_overlap_loop_1false
use_endframe_loop_1false
prompt_loop_2
lora_loop_2
lora_strength_21.00
use_reference_loop_2false
use_overlap_loop_2false
use_endframe_loop_2false
prompt_loop_3
lora_loop_3
lora_strength_31.00
use_reference_loop_3false
use_overlap_loop_3false
use_endframe_loop_3false
prompt_loop_4
lora_loop_4
lora_strength_41.00
use_reference_loop_4false
use_overlap_loop_4false
use_endframe_loop_4false
prompt_loop_5
lora_loop_5
lora_strength_51.00
use_reference_loop_5false
use_overlap_loop_5false
use_endframe_loop_5false
prompt_loop_6
lora_loop_6
lora_strength_61.00
use_reference_loop_6false
use_overlap_loop_6false
use_endframe_loop_6false
prompt_loop_7
lora_loop_7
lora_strength_71.00
use_reference_loop_7false
use_overlap_loop_7false
use_endframe_loop_7false
prompt_loop_8
lora_loop_8
lora_strength_81.00
use_reference_loop_8false
use_overlap_loop_8false
use_endframe_loop_8false
prompt_loop_9
lora_loop_9
lora_strength_91.00
use_reference_loop_9false
use_overlap_loop_9false
use_endframe_loop_9false
prompt_loop_10
lora_loop_10
lora_strength_101.00
use_reference_loop_10false
use_overlap_loop_10false
use_endframe_loop_10false

Wan 2.2's native context is 81 frames, and that's about five seconds at 16fps. If you've been hand-chaining chunks in ComfyUI - sampling 81 frames, feeding the tail back into the next pass, doing the frame math wrong and getting a clip that comes back two frames short - you know exactly who this node is for. WanVideoExtenderNative (listed as "Wan 2.2 Video Extender PRO") folds that whole extend-and-stitch loop into a single node, and unlike a lot of the single-node chunkers floating around, it hands you real story control while it's at it.

It's the workhorse of the Granddyser/wan-video-extender pack, from the same author who publishes free Wan fine-tunes on HuggingFace. The companion model he recommends is Phr00t's WAN2.2-14B-Rapid-AllInOne. "AllInOne" matters here, because this node is built on VACE conditioning and the embedded workflow guide says it flat out: "Feel free to try any other model, but VACE integration is required!" Feed it a plain Wan checkpoint and it gets conditioning it can't use.

How it works

Each loop builds a VACE control latent: a gray canvas at empty_frame_level (default 0.5, mid-gray), with the last overlap_frames frames of your previous clip stamped in at the front as context, and anything connected to image_loop_X pasted in as a hard cut. Turn on use_endframe_loop_X and it also takes the next loop's image and pins it to the end of the clip as a target to animate toward - a cheap way to force a shot to land somewhere specific.

Then it samples at denoise 1.0, decodes, and here's the memory trick: each segment is written to disk (a temp dir prefixed wan_segments_) instead of staying in RAM, and models are unloaded between loops. Only the overlap stays resident; the author claims roughly 150–200MB during processing, and the final video is assembled from disk at the end. That's what makes "5-second clips" stop being a ceiling. Ten loops at 81 frames is close to a minute of footage without the machine grinding to a halt.

The settings that matter

Wire up model, vae, and clip as usual, then the numbers a beginner actually touches:

  • extension_loops (1–10): how many chunks to generate. Start at 2 for tests.
  • generate_frames (default 81): frames per loop. Just leave it.
  • overlap_frames (4–64, default 16): how much context carries into the next loop. More overlap = smoother, shorter, slower. The README's sweet spot is 16–24.

The tested combo for the Rapid model is steps 4, sampler euler_a, scheduler beta, CFG 1.0. Don't blindly copy that onto an undistilled checkpoint - CFG 1.0 at 4 steps is a speed-LoRA thing, not a Wan default. strength (default 1.0) is the VACE strength: how hard the input frames are enforced against the generated ones.

Input modes are the nice part: video in for V2V, a single image for I2V, or nothing for T2V. One gotcha - default_width/default_height only apply to T2V. With an image input the node uses the image's own resolution, so resize your stills before feeding them in. Connect a reference_image and VACE keeps faces and characters consistent across loops, which is the single biggest quality win for long takes.

For storytelling, prompt_loop_1..10 each take a String node, lora_loop_1..10 are dropdowns over your loras folder, and image_loop_1..10 do scene cuts. Outputs are full_video (IMAGE) and used_prompts (STRING), so you can see which prompt actually ran per loop.

Install

ComfyUI Manager - search "Wan Video Extender" - or the manual route:

cd ComfyUI/custom_nodes
git clone https://github.com/Granddyser/wan-video-extender
pip install -r requirements.txt

Then restart. The requirements pull in diffusers, peft, gguf (so quantized Wan checkpoints work), opencv, and friends. Small trap: the README literally writes pip install requirements.txt, missing the -r - easy copy-paste stumble that fails on the first token.

Grounded gripes

The node is a skyscraper on your canvas - ten loops of per-loop inputs adds up to a lot of widgets, and the author owns it: a "luxury high-rise of functionality rather than a sprawling slum of spaghetti wires." Fine, but leave the loops you aren't using alone. And remember identity drift across chunk boundaries is physics of the 81-frame context - the reference image and overlap are a mitigation, not a cure. It's the node I'd reach for when a short Wan clip needs to become a scene.

CategoryWanCustom

Inputs (101)

NameTypeDefaultDescription
modelMODEL
vaeVAE
clipCLIP
positive_promptSTRING Main-Prompt / Basis-Prompt for all Loops (Fallback).
negative_promptSTRINGlow quality, blurry, glitch, distortion
stepsINT41–100
cfgFLOAT1.000–100
sampler_nameCOMBO44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBO9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
extension_loopsINT11–10
generate_framesINT8116–200
overlap_framesINT164–64Anzahl Überlappungsframes zwischen Loops (Kontext).
empty_frame_levelFLOAT0.500–1
strengthFLOAT1.000–10
seedINT00–18446744073709550000
default_widthINT832256–2048
default_heightINT480256–2048
imageoptIMAGE
videoopt*
reference_imageoptIMAGECharacter Reference für VACE
inpaint_maskoptMASK
prompt_loop_1optSTRINGOptionaler Loop-1-Prompt (String-Node anschließen, leer = Base Prompt).
lora_loop_1optCOMBOLoRA für Loop 1 (None = keine LoRA)
lora_strength_1optFLOAT1.000–2
image_loop_1optIMAGEOptionales Bild / Bilder für Loop 1. Wenn gesetzt, wird hier ein harter Schnitt gemacht und diese Frames als Kontext verwendet (statt vorheriger 16 Frames).
use_reference_loop_1optBOOLEANfalseUse global reference image for Loop 1
use_overlap_loop_1optBOOLEANfalseUse overlap context for Loop 1
use_endframe_loop_1optBOOLEANfalseNutze Bild(er) des nächsten Loops als Endframe für Loop 1 (VACE Endframe).
reference_image_1optIMAGECharacter Reference für VACE
prompt_loop_2optSTRINGLoop 2 Prompt (leer = Base Prompt)
lora_loop_2optCOMBOLoRA für Loop 2 (None = keine LoRA)
lora_strength_2optFLOAT1.000–2
image_loop_2optIMAGEOptionales Bild / Bilder für Loop 2 (harte Schnitt-Quelle).
use_reference_loop_2optBOOLEANfalseUse global reference image for Loop 2
use_overlap_loop_2optBOOLEANfalseUse overlap context for Loop 2
use_endframe_loop_2optBOOLEANfalseNutze Bild(er) des nächsten Loops als Endframe für Loop 2 (VACE Endframe).
reference_image_2optIMAGECharacter Reference für VACE
prompt_loop_3optSTRINGLoop 3 Prompt (leer = Base Prompt)
lora_loop_3optCOMBOLoRA für Loop 3 (None = keine LoRA)
lora_strength_3optFLOAT1.000–2
image_loop_3optIMAGEOptionales Bild / Bilder für Loop 3 (harte Schnitt-Quelle).
use_reference_loop_3optBOOLEANfalseUse global reference image for Loop 3
use_overlap_loop_3optBOOLEANfalseUse overlap context for Loop 3
use_endframe_loop_3optBOOLEANfalseNutze Bild(er) des nächsten Loops als Endframe für Loop 3 (VACE Endframe).
reference_image_3optIMAGECharacter Reference für VACE
prompt_loop_4optSTRINGLoop 4 Prompt (leer = Base Prompt)
lora_loop_4optCOMBOLoRA für Loop 4 (None = keine LoRA)
lora_strength_4optFLOAT1.000–2
image_loop_4optIMAGEOptionales Bild / Bilder für Loop 4 (harte Schnitt-Quelle).
use_reference_loop_4optBOOLEANfalseUse global reference image for Loop 4
use_overlap_loop_4optBOOLEANfalseUse overlap context for Loop 4
use_endframe_loop_4optBOOLEANfalseNutze Bild(er) des nächsten Loops als Endframe für Loop 4 (VACE Endframe).
reference_image_4optIMAGECharacter Reference für VACE
prompt_loop_5optSTRINGLoop 5 Prompt (leer = Base Prompt)
lora_loop_5optCOMBOLoRA für Loop 5 (None = keine LoRA)
lora_strength_5optFLOAT1.000–2
image_loop_5optIMAGEOptionales Bild / Bilder für Loop 5 (harte Schnitt-Quelle).
use_reference_loop_5optBOOLEANfalseUse global reference image for Loop 5
use_overlap_loop_5optBOOLEANfalseUse overlap context for Loop 5
use_endframe_loop_5optBOOLEANfalseNutze Bild(er) des nächsten Loops als Endframe für Loop 5 (VACE Endframe).
reference_image_5optIMAGECharacter Reference für VACE
prompt_loop_6optSTRINGLoop 6 Prompt (leer = Base Prompt)
lora_loop_6optCOMBOLoRA für Loop 6 (None = keine LoRA)
lora_strength_6optFLOAT1.000–2
image_loop_6optIMAGEOptionales Bild / Bilder für Loop 6 (harte Schnitt-Quelle).
use_reference_loop_6optBOOLEANfalseUse global reference image for Loop 6
use_overlap_loop_6optBOOLEANfalseUse overlap context for Loop 6
use_endframe_loop_6optBOOLEANfalseNutze Bild(er) des nächsten Loops als Endframe für Loop 6 (VACE Endframe).
reference_image_6optIMAGECharacter Reference für VACE
prompt_loop_7optSTRINGLoop 7 Prompt (leer = Base Prompt)
lora_loop_7optCOMBOLoRA für Loop 7 (None = keine LoRA)
lora_strength_7optFLOAT1.000–2
image_loop_7optIMAGEOptionales Bild / Bilder für Loop 7 (harte Schnitt-Quelle).
use_reference_loop_7optBOOLEANfalseUse global reference image for Loop 7
use_overlap_loop_7optBOOLEANfalseUse overlap context for Loop 7
use_endframe_loop_7optBOOLEANfalseNutze Bild(er) des nächsten Loops als Endframe für Loop 7 (VACE Endframe).
reference_image_7optIMAGECharacter Reference für VACE
prompt_loop_8optSTRINGLoop 8 Prompt (leer = Base Prompt)
lora_loop_8optCOMBOLoRA für Loop 8 (None = keine LoRA)
lora_strength_8optFLOAT1.000–2
image_loop_8optIMAGEOptionales Bild / Bilder für Loop 8 (harte Schnitt-Quelle).
use_reference_loop_8optBOOLEANfalseUse global reference image for Loop 8
use_overlap_loop_8optBOOLEANfalseUse overlap context for Loop 8
use_endframe_loop_8optBOOLEANfalseNutze Bild(er) des nächsten Loops als Endframe für Loop 8 (VACE Endframe).
reference_image_8optIMAGECharacter Reference für VACE
prompt_loop_9optSTRINGLoop 9 Prompt (leer = Base Prompt)
lora_loop_9optCOMBOLoRA für Loop 9 (None = keine LoRA)
lora_strength_9optFLOAT1.000–2
image_loop_9optIMAGEOptionales Bild / Bilder für Loop 9 (harte Schnitt-Quelle).
use_reference_loop_9optBOOLEANfalseUse global reference image for Loop 9
use_overlap_loop_9optBOOLEANfalseUse overlap context for Loop 9
use_endframe_loop_9optBOOLEANfalseNutze Bild(er) des nächsten Loops als Endframe für Loop 9 (VACE Endframe).
reference_image_9optIMAGECharacter Reference für VACE
prompt_loop_10optSTRINGLoop 10 Prompt (leer = Base Prompt)
lora_loop_10optCOMBOLoRA für Loop 10 (None = keine LoRA)
lora_strength_10optFLOAT1.000–2
image_loop_10optIMAGEOptionales Bild / Bilder für Loop 10 (harte Schnitt-Quelle).
use_reference_loop_10optBOOLEANfalseUse global reference image for Loop 10
use_overlap_loop_10optBOOLEANfalseUse overlap context for Loop 10
use_endframe_loop_10optBOOLEANfalseNutze Bild(er) des nächsten Loops als Endframe für Loop 10 (falls vorhanden, sonst ignoriert).
reference_image_10optIMAGECharacter Reference für VACE

Outputs (2)

NameTypeDescription
full_videoIMAGE
used_promptsSTRING