Wan 2.2 Video Extender PRO high+low-noise
Steer Wan 2.2's high and low noise experts separately — from one node
- high_noise
- low_noise
- 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 is a Mixture of Experts, and the two experts aren't subtle about their jobs: the high-noise pass decides motion and composition, the low-noise pass fills in the detail. In stock ComfyUI, that split is something you wrangle with two sampler stages and a latent hand-off you only half-understand. WanVideoExtenderLowHigh - "Wan 2.2 Video Extender PRO high+low-noise" - takes the same extend-a-video machinery as the pack's native node, but accepts two separate models and runs the split for you, with independent LoRA and sampler settings per stage.
Fair warning up front: this is the pack's Beta node (added in v1.3.0), and the author doesn't hide it. It's for people who want the real MoE architecture - the ability to apply a speed LoRA to the low-noise expert only, keep the high-noise pass clean, and tune each stage's sampler separately. That's not a niche flex. Community consensus is that speed LoRAs applied everywhere "kill everything that's good in" Wan 2.2, but applied to the low-noise pass alone they're the standard trick for fast, still-good output. This node exists so you can do exactly that without building a custom graph.
How it works
Mechanically it's the native node's loop: a gray VACE canvas, the last overlap_frames as context, optional per-loop image cuts and endframes, segments cached to disk and assembled at the end. What changes is the sampling - instead of one pass it chains two KSamplerAdvanced calls:
- High stage:
steps_h(default 4), returns with leftover noise enabled, so it deliberately stops partway through denoising. - Low stage:
steps_l(default 4), noise disabled, starts from the high stage's leftover latent and finishes the job.
You get full per-stage control: sampler_name_high / scheduler_high / steps_h / cfg_h and the _low counterparts, plus start_at_step and end_at_step for each stage so you can fine-tune exactly where the baton passes. That mirrors the model's own two-expert design - you're just finally steering both hands.
What to feed it
Two model inputs (high_noise, low_noise) plus vae and clip. The pack's high/low workflow guide lists the split setup it was built against:
- Diffusion models:
wan2.2_t2v_high_noise_14B_fp8_scaledandwan2.2_t2v_low_noise_14B_fp8_scaledfrom Comfy-Org's repackaged Wan 2.2 - VACE modules: Kijai's
Wan2_2_Fun_VACE_module_A14B_HIGH/LOW_bf16, loaded through a model selector - Optional: the Lightx2v 4-step LoRA pair, one per expert, at CFG 1.0
That's real setup work, and the LoRA slots prove the point of all of it: lora_high_loop_X and lora_low_loop_X are separate dropdowns, so the high stage can stay untouched while the low stage runs a 4-step LoRA. Every other loop control - prompt_loop_X, image_loop_X, use_endframe_loop_X, reference_image_X - behaves like the native node.
Watch the RAM
The Beta warning is specific and you should believe it: system RAM (CPU RAM, not VRAM) can climb significantly past Loop 5. Segments go to disk to protect VRAM, but the two-model setup plus leftover latents adds up in host memory. Check your RAM before a long multi-loop run and make sure swap exists.
Install
Same as the native node - ComfyUI Manager, search "Wan Video Extender", or:
cd ComfyUI/custom_nodes
git clone https://github.com/Granddyser/wan-video-extender
pip install -r requirements.txt
Then restart and grab the split models above. (The README writes pip install requirements.txt, missing the -r - the requirements file itself pulls diffusers, peft, gguf, opencv, and friends.)
Honest take: if this sounds like extra steps for a result the AllInOne model gets from one model input and the native node, you're not wrong. This node is for the person who wants the control, not the person who wants the least work. Start with the native node; come back here when you want to know which expert is doing what to your video - and want to change it.
Inputs (130)
| Name | Type | Default | Description |
|---|---|---|---|
| high_noise | MODEL | — | |
| low_noise | MODEL | — | |
| vae | VAE | — | |
| clip | CLIP | — | |
| positive_prompt | STRING | Main-Prompt / Basis-Prompt für alle Loops (Fallback). | |
| negative_prompt | STRING | low quality, blurry, glitch, distortion | — |
| sampler_name_high | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler_high | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| steps_h | INT | 41–100 | — |
| start_at_step_h | INT | 00–10000 | — |
| end_at_step_h | INT | 100000–10000 | — |
| cfg_h | FLOAT | 1.000–100 | — |
| sampler_name_low | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler_low | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| steps_l | INT | 41–100 | — |
| start_at_step_l | INT | 00–10000 | — |
| end_at_step_l | INT | 100000–10000 | — |
| cfg_l | FLOAT | 1.000–100 | — |
| 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 | Globales Character-Referenzbild für VACE | |
| inpaint_maskopt | MASK | — | |
| prompt_loop_1opt | STRING | Optionaler Loop-1-Prompt (String-Node anschließen, leer = Base Prompt). | |
| lora_high_loop_1opt | COMBO | LoRA für HIGH noise model Loop 1 (None = keine LoRA) | |
| lora_high_strength_1opt | FLOAT | 1.000–2 | — |
| lora_low_loop_1opt | COMBO | LoRA für LOW noise model Loop 1 (None = keine LoRA) | |
| lora_low_strength_1opt | FLOAT | 1.000–2 | — |
| image_loop_1opt | IMAGE | Optionales Bild / Bilder für Loop 1. Wenn gesetzt, harter Schnitt: diese Frames als Kontext 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-Referenz nur für Loop 1 | |
| prompt_loop_2opt | STRING | Loop 2 Prompt (leer = Base Prompt) | |
| lora_high_loop_2opt | COMBO | LoRA für HIGH noise model Loop 2 (None = keine LoRA) | |
| lora_high_strength_2opt | FLOAT | 1.000–2 | — |
| lora_low_loop_2opt | COMBO | LoRA für LOW noise model Loop 2 (None = keine LoRA) | |
| lora_low_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-Referenz nur für Loop 2 | |
| prompt_loop_3opt | STRING | Loop 3 Prompt (leer = Base Prompt) | |
| lora_high_loop_3opt | COMBO | LoRA für HIGH noise model Loop 3 (None = keine LoRA) | |
| lora_high_strength_3opt | FLOAT | 1.000–2 | — |
| lora_low_loop_3opt | COMBO | LoRA für LOW noise model Loop 3 (None = keine LoRA) | |
| lora_low_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-Referenz nur für Loop 3 | |
| prompt_loop_4opt | STRING | Loop 4 Prompt (leer = Base Prompt) | |
| lora_high_loop_4opt | COMBO | LoRA für HIGH noise model Loop 4 (None = keine LoRA) | |
| lora_high_strength_4opt | FLOAT | 1.000–2 | — |
| lora_low_loop_4opt | COMBO | LoRA für LOW noise model Loop 4 (None = keine LoRA) | |
| lora_low_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-Referenz nur für Loop 4 | |
| prompt_loop_5opt | STRING | Loop 5 Prompt (leer = Base Prompt) | |
| lora_high_loop_5opt | COMBO | LoRA für HIGH noise model Loop 5 (None = keine LoRA) | |
| lora_high_strength_5opt | FLOAT | 1.000–2 | — |
| lora_low_loop_5opt | COMBO | LoRA für LOW noise model Loop 5 (None = keine LoRA) | |
| lora_low_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-Referenz nur für Loop 5 | |
| prompt_loop_6opt | STRING | Loop 6 Prompt (leer = Base Prompt) | |
| lora_high_loop_6opt | COMBO | LoRA für HIGH noise model Loop 6 (None = keine LoRA) | |
| lora_high_strength_6opt | FLOAT | 1.000–2 | — |
| lora_low_loop_6opt | COMBO | LoRA für LOW noise model Loop 6 (None = keine LoRA) | |
| lora_low_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-Referenz nur für Loop 6 | |
| prompt_loop_7opt | STRING | Loop 7 Prompt (leer = Base Prompt) | |
| lora_high_loop_7opt | COMBO | LoRA für HIGH noise model Loop 7 (None = keine LoRA) | |
| lora_high_strength_7opt | FLOAT | 1.000–2 | — |
| lora_low_loop_7opt | COMBO | LoRA für LOW noise model Loop 7 (None = keine LoRA) | |
| lora_low_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-Referenz nur für Loop 7 | |
| prompt_loop_8opt | STRING | Loop 8 Prompt (leer = Base Prompt) | |
| lora_high_loop_8opt | COMBO | LoRA für HIGH noise model Loop 8 (None = keine LoRA) | |
| lora_high_strength_8opt | FLOAT | 1.000–2 | — |
| lora_low_loop_8opt | COMBO | LoRA für LOW noise model Loop 8 (None = keine LoRA) | |
| lora_low_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-Referenz nur für Loop 8 | |
| prompt_loop_9opt | STRING | Loop 9 Prompt (leer = Base Prompt) | |
| lora_high_loop_9opt | COMBO | LoRA für HIGH noise model Loop 9 (None = keine LoRA) | |
| lora_high_strength_9opt | FLOAT | 1.000–2 | — |
| lora_low_loop_9opt | COMBO | LoRA für LOW noise model Loop 9 (None = keine LoRA) | |
| lora_low_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-Referenz nur für Loop 9 | |
| prompt_loop_10opt | STRING | Loop 10 Prompt (leer = Base Prompt) | |
| lora_high_loop_10opt | COMBO | LoRA für HIGH noise model Loop 10 (None = keine LoRA) | |
| lora_high_strength_10opt | FLOAT | 1.000–2 | — |
| lora_low_loop_10opt | COMBO | LoRA für LOW noise model Loop 10 (None = keine LoRA) | |
| lora_low_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-Referenz nur für Loop 10 |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| full_video | IMAGE | — |
| used_prompts | STRING | — |