- context
- model
- funControl
- funControl22
- funInpaint
- ImageToVideo
- FirstLastFrame
- Vace
- AnimateVideo
- CameraImage
- Track
- SoundImage
- SoundImage_ex
- HuMoImage
- Phantom
- context
- model
- positive
- negative
- latent
- vace_trim_latent
- trim_image
- video_frame_offset
Wan is where local video generation consolidated: Alibaba's Apache 2.0 family, frozen at 2.2 but still the quality reference for people and characters, and the base under a pile of 2026 models. The problem is that "Wan" is really a dozen different generation modes - image-to-video, first/last frame, VACE control, animate, track, camera moves, sound-driven - each with its own node chain in stock ComfyUI. sum_stack_Wan is the Apt_Preset hub that collapses that whole family into one controller. You pick a mode, feed it the matching token from a Stack_Wan*ToVideo config node, and this node merges everything into the conditioning, latent, and model the sampler runs.
The README calls it "General Control wan Stack: All wan video generation nodes officially supported." That's not marketing - the input list really does cover the entire first-party task-model line.
What it actually does
It consumes the context and the mode token you connect, then builds the Wan conditioning for that mode. Each input is a typed token produced by a sibling config node in the pack's 😺backup stack set - the config nodes bundle width/height/length/images/settings, this hub applies them:
- ImageToVideo - image-to-video, from
Stack_WanImageToVideo. - FirstLastFrame - interpolate between a start and end frame, from
Stack_WanFirstLastFrameToVideo. - Vace - VACE reference/control video conditioning, from
Stack_WanVaceToVideo. - funControl / funControl22 / funInpaint - Wan 2.1/2.2 Fun Control and Fun Inpaint tokens.
- AnimateVideo - the Wan 2.2 Animate character-animation path.
- CameraImage - camera-move conditioning.
- Track - Wan Track motion-trajectory conditioning, from
Stack_WanTrackToVideo. - SoundImage / SoundImage_ex / HuMoImage - sound-to-video and human-motion paths;
SoundImage_excomes fromStack_WanSoundImageToVideoExtend. - Phantom - the Phantom subject-tracking input.
You only connect the inputs for the mode you're running. The stack reads the context's model (Wan 2.2 Unet + clip1, loaded via sum_load_simple), applies the mode's conditioning, and writes back the context plus three handy integers: vace_trim_latent, trim_image, and video_frame_offset - the frame numbers you need when you're stitching this segment back into a longer take.
The inputs that matter
The context and the one mode token for whatever you're generating. Also model if you want to override. Everything else is "connect only what you need."
The outputs that matter
context (with latent + conditioning), model, positive, negative, latent, and the three trim/offset integers.
Wiring it in
sum_load_simple (Wan 2.2) → prompt conditioning → sum_stack_Wan with your mode token → sum_Ksampler. The config node feeds the hub, not the sampler.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/cardenluo/ComfyUI-Apt_Preset.git
cd ComfyUI-Apt_Preset
pip install -r requirements.txt # Windows: double-click install.bat
Or ComfyUI Manager → ComfyUI-Apt_Preset. ComfyUI-GGUF helps if you're running the 14B quantized (the practical way to run Wan on 10–12GB).
Common issues
The most common beginner mistake is connecting multiple mode tokens at once and expecting a blend - it doesn't blend; it applies what's connected in a defined order, and multiple tokens usually means one silently wins. Connect one mode, run it, then switch. Second: this node outputs no image - the trim integers and context are the deliverables, and if you're staring at nothing, the problem is either a missing mode token or a config node upstream that never got its images/audio attached. And remember Wan's 81-frame native context: whatever length you set on the config node, the model still thinks in ~81-frame chunks, so plan extensions as chains, not one giant generation.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| context | RUN_CONTEXT | — | |
| modelopt | MODEL | — | |
| funControlopt | FUNCONTROL | — | |
| funControl22opt | FUNCONTROL22 | — | |
| funInpaintopt | FUNINPAINT | — | |
| ImageToVideoopt | IMAGETOVIDEO | — | |
| FirstLastFrameopt | FIRSTLASTFRAME | — | |
| Vaceopt | WANVACE | — | |
| AnimateVideoopt | ANIMATEVIDEO | — | |
| CameraImageopt | CAMERAIMAGE | — | |
| Trackopt | WANTRACKT | — | |
| SoundImageopt | SOUNDIMAGE | — | |
| SoundImage_exopt | SOUNDIMAGE_EX | — | |
| HuMoImageopt | HUMOIMAGE | — | |
| Phantomopt | PHANTOM | — |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| context | RUN_CONTEXT | — |
| model | MODEL | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |
| vace_trim_latent | INT | — |
| trim_image | INT | — |
| video_frame_offset | INT | — |