Wan 2.2 Video Extender PRO
Wan 2.2 only goes 81 frames. This node keeps going.
- 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
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.
Inputs (101)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| vae | VAE | — | |
| clip | CLIP | — | |
| positive_prompt | STRING | Main-Prompt / Basis-Prompt for all Loops (Fallback). | |
| negative_prompt | STRING | low quality, blurry, glitch, distortion | — |
| steps | INT | 41–100 | — |
| cfg | FLOAT | 1.000–100 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| extension_loops | INT | 11–10 | — |
| generate_frames | INT | 8116–200 | — |
| overlap_frames | INT | 164–64 | Anzahl Überlappungsframes zwischen Loops (Kontext). |
| empty_frame_level | FLOAT | 0.500–1 | — |
| strength | FLOAT | 1.000–10 | — |
| seed | INT | 00–18446744073709550000 | — |
| default_width | INT | 832256–2048 | — |
| default_height | INT | 480256–2048 | — |
| imageopt | IMAGE | — | |
| videoopt | * | — | |
| reference_imageopt | IMAGE | Character Reference für VACE | |
| inpaint_maskopt | MASK | — | |
| prompt_loop_1opt | STRING | Optionaler Loop-1-Prompt (String-Node anschließen, leer = Base Prompt). | |
| lora_loop_1opt | COMBO | LoRA für Loop 1 (None = keine LoRA) | |
| lora_strength_1opt | FLOAT | 1.000–2 | — |
| image_loop_1opt | IMAGE | Optionales 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_1opt | BOOLEAN | false | Use global reference image for Loop 1 |
| use_overlap_loop_1opt | BOOLEAN | false | Use overlap context for Loop 1 |
| use_endframe_loop_1opt | BOOLEAN | false | Nutze Bild(er) des nächsten Loops als Endframe für Loop 1 (VACE Endframe). |
| reference_image_1opt | IMAGE | Character Reference für VACE | |
| prompt_loop_2opt | STRING | Loop 2 Prompt (leer = Base Prompt) | |
| lora_loop_2opt | COMBO | LoRA für Loop 2 (None = keine LoRA) | |
| lora_strength_2opt | FLOAT | 1.000–2 | — |
| image_loop_2opt | IMAGE | Optionales Bild / Bilder für Loop 2 (harte Schnitt-Quelle). | |
| use_reference_loop_2opt | BOOLEAN | false | Use global reference image for Loop 2 |
| use_overlap_loop_2opt | BOOLEAN | false | Use overlap context for Loop 2 |
| use_endframe_loop_2opt | BOOLEAN | false | Nutze Bild(er) des nächsten Loops als Endframe für Loop 2 (VACE Endframe). |
| reference_image_2opt | IMAGE | Character Reference für VACE | |
| prompt_loop_3opt | STRING | Loop 3 Prompt (leer = Base Prompt) | |
| lora_loop_3opt | COMBO | LoRA für Loop 3 (None = keine LoRA) | |
| lora_strength_3opt | FLOAT | 1.000–2 | — |
| image_loop_3opt | IMAGE | Optionales Bild / Bilder für Loop 3 (harte Schnitt-Quelle). | |
| use_reference_loop_3opt | BOOLEAN | false | Use global reference image for Loop 3 |
| use_overlap_loop_3opt | BOOLEAN | false | Use overlap context for Loop 3 |
| use_endframe_loop_3opt | BOOLEAN | false | Nutze Bild(er) des nächsten Loops als Endframe für Loop 3 (VACE Endframe). |
| reference_image_3opt | IMAGE | Character Reference für VACE | |
| prompt_loop_4opt | STRING | Loop 4 Prompt (leer = Base Prompt) | |
| lora_loop_4opt | COMBO | LoRA für Loop 4 (None = keine LoRA) | |
| lora_strength_4opt | FLOAT | 1.000–2 | — |
| image_loop_4opt | IMAGE | Optionales Bild / Bilder für Loop 4 (harte Schnitt-Quelle). | |
| use_reference_loop_4opt | BOOLEAN | false | Use global reference image for Loop 4 |
| use_overlap_loop_4opt | BOOLEAN | false | Use overlap context for Loop 4 |
| use_endframe_loop_4opt | BOOLEAN | false | Nutze Bild(er) des nächsten Loops als Endframe für Loop 4 (VACE Endframe). |
| reference_image_4opt | IMAGE | Character Reference für VACE | |
| prompt_loop_5opt | STRING | Loop 5 Prompt (leer = Base Prompt) | |
| lora_loop_5opt | COMBO | LoRA für Loop 5 (None = keine LoRA) | |
| lora_strength_5opt | FLOAT | 1.000–2 | — |
| image_loop_5opt | IMAGE | Optionales Bild / Bilder für Loop 5 (harte Schnitt-Quelle). | |
| use_reference_loop_5opt | BOOLEAN | false | Use global reference image for Loop 5 |
| use_overlap_loop_5opt | BOOLEAN | false | Use overlap context for Loop 5 |
| use_endframe_loop_5opt | BOOLEAN | false | Nutze Bild(er) des nächsten Loops als Endframe für Loop 5 (VACE Endframe). |
| reference_image_5opt | IMAGE | Character Reference für VACE | |
| prompt_loop_6opt | STRING | Loop 6 Prompt (leer = Base Prompt) | |
| lora_loop_6opt | COMBO | LoRA für Loop 6 (None = keine LoRA) | |
| lora_strength_6opt | FLOAT | 1.000–2 | — |
| image_loop_6opt | IMAGE | Optionales Bild / Bilder für Loop 6 (harte Schnitt-Quelle). | |
| use_reference_loop_6opt | BOOLEAN | false | Use global reference image for Loop 6 |
| use_overlap_loop_6opt | BOOLEAN | false | Use overlap context for Loop 6 |
| use_endframe_loop_6opt | BOOLEAN | false | Nutze Bild(er) des nächsten Loops als Endframe für Loop 6 (VACE Endframe). |
| reference_image_6opt | IMAGE | Character Reference für VACE | |
| prompt_loop_7opt | STRING | Loop 7 Prompt (leer = Base Prompt) | |
| lora_loop_7opt | COMBO | LoRA für Loop 7 (None = keine LoRA) | |
| lora_strength_7opt | FLOAT | 1.000–2 | — |
| image_loop_7opt | IMAGE | Optionales Bild / Bilder für Loop 7 (harte Schnitt-Quelle). | |
| use_reference_loop_7opt | BOOLEAN | false | Use global reference image for Loop 7 |
| use_overlap_loop_7opt | BOOLEAN | false | Use overlap context for Loop 7 |
| use_endframe_loop_7opt | BOOLEAN | false | Nutze Bild(er) des nächsten Loops als Endframe für Loop 7 (VACE Endframe). |
| reference_image_7opt | IMAGE | Character Reference für VACE | |
| prompt_loop_8opt | STRING | Loop 8 Prompt (leer = Base Prompt) | |
| lora_loop_8opt | COMBO | LoRA für Loop 8 (None = keine LoRA) | |
| lora_strength_8opt | FLOAT | 1.000–2 | — |
| image_loop_8opt | IMAGE | Optionales Bild / Bilder für Loop 8 (harte Schnitt-Quelle). | |
| use_reference_loop_8opt | BOOLEAN | false | Use global reference image for Loop 8 |
| use_overlap_loop_8opt | BOOLEAN | false | Use overlap context for Loop 8 |
| use_endframe_loop_8opt | BOOLEAN | false | Nutze Bild(er) des nächsten Loops als Endframe für Loop 8 (VACE Endframe). |
| reference_image_8opt | IMAGE | Character Reference für VACE | |
| prompt_loop_9opt | STRING | Loop 9 Prompt (leer = Base Prompt) | |
| lora_loop_9opt | COMBO | LoRA für Loop 9 (None = keine LoRA) | |
| lora_strength_9opt | FLOAT | 1.000–2 | — |
| image_loop_9opt | IMAGE | Optionales Bild / Bilder für Loop 9 (harte Schnitt-Quelle). | |
| use_reference_loop_9opt | BOOLEAN | false | Use global reference image for Loop 9 |
| use_overlap_loop_9opt | BOOLEAN | false | Use overlap context for Loop 9 |
| use_endframe_loop_9opt | BOOLEAN | false | Nutze Bild(er) des nächsten Loops als Endframe für Loop 9 (VACE Endframe). |
| reference_image_9opt | IMAGE | Character Reference für VACE | |
| prompt_loop_10opt | STRING | Loop 10 Prompt (leer = Base Prompt) | |
| lora_loop_10opt | COMBO | LoRA für Loop 10 (None = keine LoRA) | |
| lora_strength_10opt | FLOAT | 1.000–2 | — |
| image_loop_10opt | IMAGE | Optionales Bild / Bilder für Loop 10 (harte Schnitt-Quelle). | |
| use_reference_loop_10opt | BOOLEAN | false | Use global reference image for Loop 10 |
| use_overlap_loop_10opt | BOOLEAN | false | Use overlap context for Loop 10 |
| use_endframe_loop_10opt | BOOLEAN | false | Nutze Bild(er) des nächsten Loops als Endframe für Loop 10 (falls vorhanden, sonst ignoriert). |
| reference_image_10opt | IMAGE | Character Reference für VACE |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| full_video | IMAGE | — |
| used_prompts | STRING | — |