TL;DR. Pusa rides the same WanVideoWrapper stack as WAN 2.2 T2V — same A14B HIGH/LOW fp8 models, same UMT5 encoder, same WAN VAE. The only new download is the two Pusa V1 LoRAs (~1.9 GB). Add theflowmatch_pusascheduler +WanVideoAddPusaNoise, condition on the tail of your clip viaWanVideoEncode, and the continuation inherits the existing motion. Jump to the pipeline.
What “temporal flowmatching” means here
WAN is a flow-matching video model: sampling integrates a velocity field from noise to a clean latent, and every frame normally shares the same denoising timestep. Pusa’s contribution (Vectorized Timestep Adaptation) is to make the timestep per-frame — the frames you already have can be held at (or near) t = 0 (clean) while the new frames start from t = 1 (noise), and the model flow-matches the noisy tail conditioned on the clean head. That is the whole difference from the two paths you already know:- Plain T2V has no memory of any clip — it starts from pure noise.
- I2V conditions on a single still frame only.
- Pusa conditions on real clip latents — actual footage placed at the front of the generation window — so the continuation inherits the existing motion, subject, camera, and color, then keeps going.
WanVideoEncodeturns the tail of your loaded clip into a clean latent.- That latent is placed at the front of an otherwise-empty embed
(
WanVideoEmptyEmbeds+WanVideoAddExtraLatent), so the generation’s first latents are your real footage. WanVideoAddPusaNoiseassigns small, ramping per-latent noise multipliers to those conditioning latents (so they stay mostly clean) and full noise to the new latents — this per-frame noise schedule is the “vectorized timestep.”flowmatch_pusaonWanVideoSamplerintegrates that mixed-timestep field.
CLIPVision,
no WanFirstLastFrameToVideo.
The pipeline (kijai’s extension graph)
The official reference is kijai’swanvideo_2_2_14B_Pusa_extension_example_01.json (in
ComfyUI-WanVideoWrapper/example_workflows/). The shape of it:
WanVideoAddPusaNoise— “Adds latent and timestep noise multipliers when using flowmatch_pusa.” Itsnoise_multipliersinput is a per-input-latent FLOAT list where 0 = keep that latent fully clean and higher = let the model change it. The example feeds a ramp[0.0, 0.07, 0.13, 0.17, 0.19, 0.2]fromCreateScheduleFloatList(one value per conditioning latent), so the oldest frame stays cleanest and the seam frame gets a touch of noise for a smooth blend. Itsnoisy_stepsinput controls how many sampling steps the extra noise applies for — 0 on the HIGH pass, 2 on the LOW pass in the example.flowmatch_pusa— a value inWanVideoSampler.scheduler. It must be selected for the Pusa noise schedule to be interpreted correctly. Leave it onunipc/eulerand the conditioning latents stop behaving as clean anchors — you get a hard cut / regeneration instead of a continuation.
VHS_LoadVideo / VHS_VideoCombine come from ComfyUI-VideoHelperSuite;
everything WanVideo* is ComfyUI-WanVideoWrapper (kijai); the helper nodes
(ImageResizeKJv2, GetImageRangeFromBatch, GetLatentSizeAndCount,
CreateScheduleFloatList) are ComfyUI-KJNodes. All three are already part of a
WAN 2.2 install.
Models and LoRAs — almost nothing new to download
This is the best part of the Pusa path: it reuses the WAN 2.2 T2V A14B stack. The UNET, text encoder, and VAE are the exact fileswan-t2v-video already uses.
The only new download is the two Pusa V1 LoRAs (~1.9 GB total), from kijai’s HF
repo
Kijai/WanVideo_comfy, folder Pusa/ (upstream weights / paper:
RaphaelLiu/PusaV1). Place them in models/loras/ (the example expects
loras/WanVideo/Pusa/):
Match the Pusa LoRA to its expert —
...HIGH... → HIGH model, ...LOW... → LOW
model. Crossing them degrades quality. There’s also a single-file
Wan21_PusaV1_LoRA_14B_rank512_bf16 (~4.9 GB) in the same folder — that’s the
Wan 2.1 single-model LoRA; don’t substitute it into the 2.2 dual graph.
The example also stacks the lightx2v T2V distill LoRA
(lightx2v_T2V_14B_cfg_step_distill_v2_lora_rank64_bf16, from
Kijai/WanVideo_comfy/Lightx2v/, strength 1.0) on each model so 6-step, cfg-1
sampling works. LoRAs are selected with WanVideoLoraSelectMulti (one feeds
HIGH: Pusa HIGH + distill; one feeds LOW: Pusa LOW + distill).
CRITICAL — merge_loras=false on fp8 models
This is the gotcha that costs people an afternoon. Pusa loads LoRAs onto the
fp8-quantized A14B models (quantization=fp8_e4m3fn_scaled). When a LoRA is
applied to an fp8 model via the wrapper’s LoRA select, you must set merge_loras
to false. The default merge_loras=true tries to bake the LoRA into the
already-quantized fp8 weights and hard-crashes ComfyUI during LoRA loading with
no Python traceback — it looks like an unexplained restart or OOM. false
applies the LoRA as a runtime patch, which is fp8-safe. This applies to both the
Pusa LoRAs and the distill LoRA. Only use merge_loras=true on non-quantized
bf16/fp16 models.
Don’t hand-build it — load, strip, re-point
The kijai example is a 56-node graph thick withGetNode/SetNode buses,
reroutes, and a dead alternate text branch. Hand-wiring the noise / extra-latent /
frame-stitch path is slow and error-prone. The reliable flow is load the real
graph, then adapt ~7 widgets. The traps that bite on load:
- Model paths reset to the wrong file. The example references models by
subfolder (
WanVideo\2_2\…). On a flat localmodels/layout those don’t resolve, so ComfyUI silently falls each dropdown back to the first entry — you can end up with both model loaders onQwen_Image_Edit-Q8_0.ggufand the VAE onLTX23_audio_vae_bf16. It looks wired but errors or renders garbage. Set HIGH, LOW, and the VAE explicitly after loading. (Mind the HIGH-underscore / LOW-dash filename inconsistency — verify each rather than copy-pasting.) - The distill LoRA drops to
none. The example’s lightx2v path is arank64filename with a trailing underscore; if you haverank128locally the slot resets tonone, removing the speed LoRA — and 6-step / cfg-1 sampling then produces mush. Re-add it at strength 1.0 on bothWanVideoLoraSelectMultinodes,merge_loras=false. - The active prompt is on
WanVideoTextEncodeCached, notCLIPTextEncode. The example contains aCLIPLoader → CLIPTextEncode → WanVideoTextEmbedBridgebranch that is not wired to the samplers — it’s a decoy. Edit your continuation prompt onWanVideoTextEncodeCached(umt5-xxl-enc). - Match the conditioning fps to WAN-native (16). If your source was
frame-interpolated (RIFE’d to 32/50 fps), set
VHS_LoadVideo.force_rate = 16so the conditioning carries motion at WAN’s native cadence — otherwise the encoded “past” runs at 2–3× the model’s pace and you get a velocity jump at the seam, the exact artifact Pusa exists to avoid. Best practice: extend the pre-interpolation 16 fps master, then interpolate/upscale the combined result. - The example assumes SageAttention + torch.compile. It sets
attention_mode: sageattnand wiresWanVideoTorchCompileSettings(inductor). Both need extra deps a stock Windows ComfyUI usually lacks —sageattnhard-fails the loader with “No module named ‘sageattention’” before any sampling, and inductor compile needs triton (no official Windows build). Fix: setattention_mode→sdpaon both model loaders, and disconnectWanVideoTorchCompileSettingsfrom eachcompile_args. Re-enable only if you’ve actually installed them.
Settings that matter
The example runs the distilled 6-step, two-pass HIGH→LOW profile:
The
noise_multipliers ramp is the main creative dial — it controls how
strictly the continuation honors the input clip versus how free it is to diverge:
- Lower (→ 0) = conditioning latents stay clean = the continuation clings tightly to the source (less drift, but can look “stuck” / repeat).
- Higher = more noise on the conditioning latents = the model is freer to evolve the scene (more new motion, more drift risk).
- The example ramps
[0.0 … 0.2]so the oldest frame is locked and the seam frame gets a little noise. Start there; nudge the top of the ramp up (~0.3) if continuations feel frozen, down if they drift.
WanVideoEmptyEmbeds.num_frames is the total window
(conditioning frames + new frames); the example uses 81 total (the WAN-native
4n+1 length, ~5 s @ 16 fps). New frames added = total − conditioning frames, so
with ~13 tail frames conditioned you add ~68 new frames (~4 s) per pass. Keep
totals on the 4n+1 grid (49 / 81 / 121…) — the num_frames UI step is 4.
Resolution defaults to 832×480 (divisible by 16); ImageResizeKJv2 with divisor
16 keeps the loaded clip on-grid. Output frame_rate is 16 fps.
If you drop the distill LoRA, use steps ~20–30, cfg ~5–6, and keep flowmatch_pusa
and shift 5.
Chaining extensions into a long video
Pusa adds a bounded window (~4 s) per run. To go longer, feed the output back in:- Run the extension → decode → save (or keep the frames in-graph).
- Take the tail of the new output (the last ~13 frames) as the next
WanVideoEncodeinput. - Re-run the same graph; the fresh tail becomes the new conditioning head.
- Repeat.
ImageConcatMulti/ImageBatchMulti(KJNodes) stitch the segments into one continuous clip.
- Always condition on the newest frames, never the original clip, or you’ll “rewind.”
- Drift compounds across hops — color/identity slowly wander. Keep
noise_multipliersmodest and restate the subject in the prompt each hop. Color/exposure drift is the most common long-video artifact; optionally color-match each new segment to the previous before concat. - Overlap a few frames between segments and drop duplicates at concat to hide the seam.
clear_vramisn’t needed between hops, but decode/cache long chains to disk so you don’t hold every segment in VRAM.
VRAM tiers
Same envelope aswan-t2v-video (dual A14B fp8 + UMT5) — Pusa adds only ~1.9 GB of
LoRA on top.
VAE tiling on the encoder matters here specifically because you’re VAE-encoding
real footage in addition to decoding the output. Always
clear_vram before
switching to Pusa from another model family.
Troubleshooting
- Hard cut / regeneration instead of a smooth continuation. The scheduler isn’t
flowmatch_pusa— set it on the sampler(s). Without it the conditioning latents don’t behave as clean anchors. - Unexplained ComfyUI restart / OOM with no traceback during LoRA load.
merge_loras=trueon an fp8 model. Set it tofalseon every Pusa and distill LoRA select. - Errors or garbage on a freshly loaded example. The model/VAE/distill-LoRA dropdowns silently reset to the wrong first entry (subfolder paths don’t resolve). Re-point HIGH, LOW, VAE, and the distill LoRA explicitly.
- Velocity jump at the seam. Interpolated source. Set
VHS_LoadVideo.force_rate = 16or condition on the pre-interpolation 16 fps master. No module named 'sageattention'before sampling, or compile errors later. Setattention_mode=sdpaand disconnectWanVideoTorchCompileSettingsfrom both model loaders.- Continuation feels frozen / repeats, or drifts off-subject. Tune
noise_multipliers— too low = stuck, too high = wanders. The0 → 0.2ramp is the safe middle. - No audio in the new section. WAN/Pusa generate silent video, and the
original clip’s audio is not extended. Re-attach/curate audio at the end with
VHS_VideoCombine(pass the sourceaudiothrough) or in an editor. VHS_VideoCombineerrors “ffmpeg … could not be found.” Install ffmpeg into the ComfyUI venv:<comfy-venv>/python -m pip install imageio-ffmpeg, then reboot.
FAQ
How is this different from generating a new clip? Pusa conditions on the real latents of your existing footage placed at the front of the generation window, so the continuation inherits the existing motion, subject, camera, and color. A fresh T2V/I2V clip has no memory of the original and produces a hard cut. Do I need new models? Almost none. Pusa reuses the WAN 2.2 T2V A14B HIGH/LOW fp8 models, UMT5 encoder, and WAN VAE you already have. The only new download is the two Pusa V1 LoRAs (~1.9 GB). What’s the scheduler?flowmatch_pusa on WanVideoSampler — it’s required, and
it’s what interprets the per-latent noise schedule from WanVideoAddPusaNoise.
How long can the extension be? Each run adds a bounded window (~4 s of new
frames within an 81-frame 4n+1 total). Chain runs — feed each output’s tail back
in — to go arbitrarily long, watching for compounding color/identity drift.
Why did ComfyUI just die during LoRA loading? Almost certainly
merge_loras=true on the fp8 models. Set it to false.
Extend first or upscale first? Extend first. Generate/extend at 832×480 / 16 fps,
then upscale and interpolate the combined result. Upscaling before extending wastes
the work and feeds Pusa an off-cadence, harder-to-match conditioning clip.
Get it running
Pusa doesn’t ship a dedicated installer pack yet — but it doesn’t need one. It reuses the WanVideoWrapper + KJNodes + VideoHelperSuite stack and the WAN 2.2 T2V A14B models that thewan-longer-videos pack
already installs. So the path is:
- Install comfyui-mcp and the
Panel, and apply the
wan-longer-videospack — that lands the nodes and the shared T2V A14B stack. Don’t re-download the big models. - Grab the two Pusa V1 LoRAs from
Kijai/WanVideo_comfy/Pusa/intomodels/loras/. - Open the Panel and let the panel’s agent load kijai’s extension graph,
re-point the model/VAE/LoRA dropdowns, set
merge_loras=false, and tune the noise ramp for you — conversationally, with full undo and no extra API keys.