Wan Image-to-Video (First/Last Frame) Generator
First frame, last frame, and the model fills the middle
- video_file_path
- video_url
Want a video that starts on one shot and ends on a specific different shot? That's what WanII2VGenerator ("Wan Image-to-Video (First/Last Frame) Generator") is for. You hand it two images - the frame the clip starts on and the frame it must finish on - and the Wan 2.1 model invents a plausible, continuous transition between them. It's the node that turns "camera rises from eye level to a top-down shot" into a rendered reality, which is exactly the kind of camera move the default prompt describes.
It's a cloud node from ru4ls/ComfyUI_Wan: the generation runs on Alibaba's DashScope API, you pay per job, and your machine just submits and polls. This specific model, wan2.1-kf2v-plus, never shipped open weights, so the API is the only way to get Wan's first/last-frame mode at all - unless you hack the trick together with two I2V runs and stitching, which is messier.
How it works
Async DashScope job like every node in this pack: POST first_frame_url and last_frame_url plus your prompt to the image2video endpoint, poll every 10 seconds until the task completes (up to 60 attempts), then download the mp4 to your output_dir. Outputs are video_file_path and video_url; preview the clip by wiring the path into a "Load Video (Path)" node from ComfyUI-VideoHelperSuite.
The motion prompt matters here more than you'd think. First/last-frame models are great at hitting the two endpoints, but they lean on your words to decide how the transition happens - a camera dolly, a cut, a character turning around. Write the in-between as explicitly as you can.
Inputs to know
- first_frame_url / last_frame_url - both required, both must be publicly accessible URLs. Alibaba's servers fetch them, so local paths won't work. The two frames should share composition and subject as much as possible; the model bridges gaps, but it can't teleport a person into a different outfit without artifacts.
- prompt - required, multiline. Describe the action and camera move for the middle.
- resolution - a single option: 720P. This model is 720p-or-nothing, so don't go hunting for a 1080P setting.
- negative_prompt, prompt_extend, watermark, seed, output_dir - the usual pack fare. Prompt_extend defaults on; flip it off if the rewriter mangles your camera directions.
Why you'd actually use this
Two genuinely useful patterns:
- Keyframed sequences. The community's long-video workaround is to generate several clips from the same source image and bridge them - and first/last-frame is the bridge. Generate a bunch of candidate keyframes, then ask this model to walk between them.
- Controlled endings. Sometimes you need a clip that resolves somewhere specific (a logo, a face turning to camera, a door closing). Regular I2V just wanders; this one commits.
Install
ComfyUI Manager, search ComfyUI_Wan, or:
cd ComfyUI/custom_nodes
git clone https://github.com/ru4ls/ComfyUI_Wan.git
pip install -r ComfyUI_Wan/requirements.txt
Restart, then copy config/.env.template to config/.env in the pack folder and set DASHSCOPE_API_KEY (plus DASHSCOPE_API_KEY_CHINA for the mainland China region). Dependencies are minimal - requests, Pillow, numpy, python-dotenv - because the heavy lifting is remote. And it's paid per job, so budget accordingly.
The honest caveat
First/last-frame transitions are where video models show their seams. Fast or extreme camera moves between very different frames can wobble or morph, and 720P is the only output, so don't plan on crisp 1080p finals from this node. Where it's genuinely strong is the modest camera move or the subtle action beat between two similar shots. For those, it's the most controllable node in the pack.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | wan2.1-kf2v-plus | 1 options: wan2.1-kf2v-plus |
| first_frame_url | STRING | https://example.com/first_frame.png | — |
| last_frame_url | STRING | https://example.com/last_frame.png | — |
| prompt | STRING | A black kitten looks up at the sky curiously, the camera gradually rises from eye level, and finally shoots from a top-down angle to capture the kitten's curious eyes. | — |
| region | COMBO | international | 2 options: international, mainland_china |
| negative_promptopt | STRING | — | |
| resolutionopt | COMBO | 720P | 1 options: 720P |
| prompt_extendopt | BOOLEAN | true | — |
| watermarkopt | BOOLEAN | false | — |
| seedopt | INT | 00–2147483647 | — |
| output_diropt | STRING | ./videos | Directory where the generated video will be saved. Browse to select a custom directory. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video_file_path | STRING | — |
| video_url | STRING | — |