SCAIL-2 Infinity (auto window)
Your SCAIL-2 video doesn't have to stop at 81 frames anymore
- positive
- negative
- model
- vae
- pose_video
- pose_video_mask
- reference_image
- reference_image_mask
- clip_vision_output
- images
- latent
- total_frames
The 81-frame wall
If you've run SCAIL-2 at all, you've hit it: the model is trained on 81-frame chunks (about 5 seconds at 16fps), and that's all the stock workflow gives you in one go. SCAIL-2 is Z.ai's Apache 2.0 motion-transfer model on a Wan 2.1 base - the one that dropped the stick-figure skeleton, which is exactly why it doesn't stretch your character like Wan 2.2 Animate does. It ships in ComfyUI core (Kijai's PR #14373), so the hard part was never the nodes, it was going past one chunk.
Want a 20-second clip? The official graph means chaining WanSCAILToVideo → KSampler → VAEDecode by hand, feeding each chunk's decoded tail back into the next via previous_frames and video_frame_offset, and keeping the segment arithmetic straight (the final chunk's 4n+1 frame rule, the context overlap…). Get it wrong and the video comes out too short or the ending goes weird. This pack exists to delete that whole tax.
How it works
WanSCAILInfinity is the manual loop, automated. It generates fixed 81-frame windows stepping by 76 - window_length minus previous_frame_count, the 5-frame overlap SCAIL-2 was trained on - until the cumulative output covers your driving video, then trims the final overshoot. With 228 driving frames that's exactly 3 samples. No pose_video? One window, no infinite loop, which is a nice safety rail.
The clever part is that it doesn't reimplement anything. Per chunk it calls the stock WanSCAILToVideo.execute() to build conditioning, latent and frame offset, samples with the core KSampler, decodes with VAE.decode (or decode_tiled), anchors the next chunk on the last 5 decoded frames, then drops those overlap frames when stitching. Every decoded chunk gets moved to CPU and soft_empty_cache() runs between windows, so peak VRAM stays at roughly a single 81-frame run even when you're generating 600 frames. The author claims the first 81 frames are byte-identical to the stock single-chunk graph - no quality tradeoff for the convenience, and it's easy to believe given it calls the same code.
The inputs that matter
Underneath it's a KSampler with SCAIL's extras bolted on. The sampler side (model, vae, positive/negative, width 512 × height 896, seed, steps 20, cfg 6, sampler_name, scheduler, denoise) works exactly like any other sampler node. The SCAIL-specific ones are where the action is:
pose_video- the driving clip. Its length decides how much video you get, and the node downscales it to half resolution internally.reference_image(+ its mask) - the character who's moving. Multiple characters? Composite them onto one image.pose_video_mask,replacement_mode(off = animation on black-bg mask, on = replacement on white-bg),pose_strength/pose_start/pose_end,clip_vision_output- all passed straight through to the stock node.- The windowing knobs:
window_length(81 - the tooltip says keep it, listen),previous_frame_count(5 - same),max_frames(0 = run until the pose ends, or set a hard cap),vary_seed_per_window(leave off; the same seed every chunk is what keeps anchored continuity).
Outputs: images (the full stitched video - wire it into VHS_VideoCombine or any video saver), latent (the concatenated, overlap-free latent, if you want a second pass or upscale without re-decoding), and total_frames (an INT, handy for downstream math).
Installing
ComfyUI Manager → search "comfyui-scail2-infinity", or the usual:
cd ComfyUI/custom_nodes
git clone https://github.com/collbroGTR/comfyui-scail2-infinity
Restart and you're done - the pack has no requirements.txt, no pip deps, it's a thin wrapper. The real dependency is a current ComfyUI: it imports comfy_extras.nodes_scail, which only exists in builds with SCAIL-2 core support (since June 2026). If you get an ImportError on nodes_scail, update ComfyUI before touching this node. Weights: grab the scaled/MXFP8 files from Comfy-Org/SCAIL-2, not the 65.6GB raw zai-org repo. On 8GB, GGUF quants from realrebelai/SCAIL-2_GGUF at low resolution.
What actually goes wrong
- Compute is the wall, not setup. ~42 minutes for 20 seconds at 704×1280 on a 4070 Ti Super (SageAttention 2.2.0) straight from the author's benchmark. Every extra window is another full 81-frame run; budget accordingly.
- Identity drifts across chunk boundaries. That's a SCAIL-2 limitation, not this node. The community fix: drop the LightX2V speed LoRAs, raise steps, raise CFG. The author's own workflow runs a Wan2.1 Pusa rank-512 LoRA on the model and reports noticeably better quality.
- Decode OOMs at high resolution? Flip
decode_tiled. - Long clips can get anatomically weird - the showcase thread's top comments were all about the subject's proportions. High score, low endorsement. Don't expect magic, expect really good motion transfer.
Inputs (26)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| model | MODEL | — | |
| vae | VAE | — | |
| width | INT | 51232–16384 | — |
| height | INT | 89632–16384 | — |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 6.00–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 | |
| denoise | FLOAT | 1.000–1 | — |
| window_length | INT | 815–16384 | Frames per chunk. SCAIL-2 was trained at 81; changing this is not recommended. |
| previous_frame_count | INT | 51–16384 | Overlap frames anchored from the previous chunk. SCAIL-2 trained at 5. |
| max_frames | INT | 00–16384 | Hard cap on total output frames. 0 = run until the driving pose video is exhausted. |
| decode_tiled | BOOLEAN | false | Use tiled VAE decode to bound decode VRAM at high resolution. |
| vary_seed_per_window | BOOLEAN | false | Add the window index to the seed each chunk. Off = same seed every chunk (anchored continuity). |
| pose_strength | FLOAT | 1.000–10 | — |
| pose_start | FLOAT | 0.000–1 | — |
| pose_end | FLOAT | 1.000–1 | — |
| pose_videoopt | IMAGE | Driving pose video. Its length determines how many frames are generated. Downscaled to half resolution internally. | |
| pose_video_maskopt | IMAGE | SCAIL-2 colored per-identity SAM3 mask video, same resolution as pose_video. | |
| replacement_modeopt | BOOLEAN | false | False = Animation Mode (black-bg mask). True = Replacement Mode (white-bg mask). |
| reference_imageopt | IMAGE | Reference character image. For multiple references composite them on a single image. | |
| reference_image_maskopt | IMAGE | SCAIL-2 colored reference mask, same resolution as reference_image. | |
| clip_vision_outputopt | CLIP_VISION_OUTPUT | CLIP vision features for conditioning. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | Full stitched video. |
| latent | LATENT | Concatenated, overlap-free latent of the full video. |
| total_frames | INT | — |