Skip to content
Automation
Skill

/wan-flf-video

Build WAN 2.2 First-Last-Frame video workflows. Native dual hi-lo (required), and WanVideoWrapper VACE approaches

From plugin
comfyui-mcp
74242 skills4 agents11 commands1 MCP
Install
$ npx -y skills add artokun/comfyui-mcp --skill wan-flf-video --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/wan-flf-video

Context preview

The summary Claude sees to decide when to auto-load this skill.

Build WAN 2.2 First-Last-Frame video workflows. Native dual hi-lo (required), and WanVideoWrapper VACE approaches

SKILL.md

wan-flf-video.SKILL.md
name: wan-flf-video
description: Build WAN 2.2 First-Last-Frame video workflows. Native dual hi-lo (required), and WanVideoWrapper VACE approaches
globs:
  - "**/*.json"

WAN 2.2 First-Last-Frame (FLF) Video Workflows

Overview

First-Last-Frame (FLF) video generation takes a start image and an end image and generates a smooth video transition between them. The WAN 2.2 I2V (Image-to-Video) 14B model is good at this.

CRITICAL: Dual Hi-Lo Architecture (REQUIRED)

**WAN 2.2 I2V uses a split-noise architecture.** Unlike WAN 2.1, the 2.2 model was trained with separate HighNoise and LowNoise components that handle different denoising ranges. **You MUST use both models in a two-pass KSamplerAdvanced setup.** Using a single model produces low-quality, broken output.

  • HighNoise model (pass 1, steps 0→N/2) establishes structure, motion, and composition
  • LowNoise model (pass 2, steps N/2→N) refines details and keeps fidelity to input frames
  • Both passes share the same conditioning from `WanFirstLastFrameToVideo`
  • Pass 1 returns noisy latent → Pass 2 continues from there

**NEVER use a single KSampler with only one model for WAN 2.2 I2V.**

Two native approaches are available: 1. Native Dual Hi-Lo (Default): `WanFirstLastFrameToVideo` + dual `KSamplerAdvanced` two-pass 2. WanVideoWrapper: `WanVideoVACEStartToEndFrame` + `WanVideoVACEEncode` + `WanVideoSampler` (VACE, caching, context windows)

Models

UNET Pairs (Always load BOTH Hi and Lo)

Remix NSFW (Recommended, built-in lightning, fp16): | Model | Loader | Notes | |-------|--------|-------| | `Wan2.2_Remix_NSFW_i2v_14b_high_lighting_fp16_v2.1.safetensors` | `UNETLoader` | HighNoise, built-in lightning acceleration | | `Wan2.2_Remix_NSFW_i2v_14b_low_lighting_fp16_v2.1.safetensors` | `UNETLoader` | LowNoise, built-in lightning acceleration |

GGUF Q8 (Alternative, needs external lightning LoRAs): | Model | Loader | Notes | |-------|--------|-------| | `Wan2.2-I2V-A14B-HighNoise-Q8_0.gguf` | `UnetLoaderGGUF` | HighNoise, quantized | | `Wan2.2-I2V-A14B-LowNoise-Q8_0.gguf` | `UnetLoaderGGUF` | LowNoise, quantized |

Official fp8: | Model | Loader | Notes | |-------|--------|-------| | `wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors` | `UNETLoader` | HighNoise, needs lightning LoRA | | `wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors` | `UNETLoader` | LowNoise, needs lightning LoRA |

Text Encoder

| Model | Node | Notes | |-------|------|-------| | `nsfw_wan_umt5-xxl_bf16_fixed.safetensors` | `CLIPLoaderGGUF` (type=`wan`) | NSFW-tuned, pair with Remix models | | `umt5_xxl_fp8_e4m3fn_scaled.safetensors` | `CLIPLoader` (type=`wan`) | Standard UMT5-XXL fp8 |

CLIP Vision + VAE

| Component | Node | Model | |-----------|------|-------| | **CLIP Vision** | `CLIPVisionLoader` | `clip_vision_h.safetensors` | | **VAE** | `VAELoader` | `wan_2.1_vae.safetensors` |

ModelSamplingSD3 (REQUIRED)

WAN 2.2 uses flow matching and requires `ModelSamplingSD3` applied to each UNET:

{"class_type": "ModelSamplingSD3", "inputs": {"model": ["<unet>", 0], "shift": 5}}

shift=5 for lightning/Remix models. shift=8 for standard (non-lightning) models.

Lightning LoRAs

Remix NSFW models have lightning baked in. No external LoRA needed.

For GGUF/fp8 models, use paired hi/lo lightning LoRAs:

  • `wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors` → HighNoise UNET
  • `wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors` → LowNoise UNET

LoRA Stacks (rgthree)

Each model path has two stacked loaders (Common + Specific), each supporting 4 LoRA slots:

Hi path: UNETLoader(HN) → ModelSamplingSD3(shift=5) → Hi Common Stack → Hi Lora Stack → MODEL_HI
Lo path: UNETLoader(LN) → ModelSamplingSD3(shift=5) → Lo Common Stack → Lo Lora Stack → MODEL_LO

Common stacks hold shared LoRAs (quality/style). Specific stacks hold model-variant LoRAs. Set slots to `"None"` when unused. Even with no LoRAs, include the stacks. They pass CLIP through for text encoding.

Image Resizing (ImageResizeKJv2)

Input frames MUST be resized to the target video resolution before FLF and CLIPVisionEncode. The end frame inherits width/height from the start frame's resize so the dimensions match.

{"class_type": "ImageResizeKJv2", "inputs": {
  "image": ["<load_image>", 0], "width": 480, "height": 720,
  "upscale_method": "nearest-exact", "keep_proportion": "crop",
  "pad_color": "0, 0, 0", "crop_position": "center", "divisible_by": 2
}}

KSamplerAdvanced Two-Pass Settings

| Parameter | Pass 1 (Hi) | Pass 2 (Lo) | |-----------|-------------|-------------| | model | Hi LoRA stack output | Lo LoRA stack output | | add_noise | **enable** | **disable** | | steps | 4 | 4 | | cfg | 1 | 1 | | sampler_name | **uni_pc** | **uni_pc** | | scheduler | **beta** | **beta** | | start_at_step | 0 | 2 | | end_at_step | 2 | 4 | | return_with_leftover_noise | **enable** | **disable** | | latent_image | WanFLF output[2] | **Pass 1 output[0]** |

Both passes share the same positive/negative conditioning from `WanFirstLastFrameToVideo` outputs [0] and [1].

For standard (non-lightning) models: steps=20, split at step 10, cfg=4, sampler=euler, scheduler=simple, shift=8.

Negative Prompt (REQUIRED)

Always include a quality negative prompt:

The tones are vibrant, overexposed, static, details are unclear, subtitles, style, work, painting, image, still, overall grayish, worst quality, low quality, JPEG compression artifacts, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, distorted limbs, merged fingers, motionless image, cluttered background, three legs, many people in the background, walking backwards

Node: WanFirstLastFrameToVideo

Required Inputs:
  - positive: CONDITIONING (from CLIPTextEncode)
  - negative: CONDITIONING (from CLIPTextEncode with negative prompt)
  - vae: VAE
  - width: INT (from ImageResizeKJv2 end frame output[1])
  - height: INT (from ImageResizeKJv2 en
Read more
Ships withcomfyui-mcp

This project is no longer maintained. ComfyUI now ships official agent and MCP tooling — Comfy Agent and Comfy MCP — built and supported by the Comfy-Org team with deeper integration than a community project can match.

Get the whole plugin

Other skills on comfyui-mcp.