SFWaveSpeedWan22I2V720p
Wan 2.2 I2V with a start AND end frame — the cloud node that anchors both ends
- client
- video_url
Wan is the open video family the community consolidated on, and Wan 2.2 is its high-water mark - the 27B MoE with the best faces and motion of anything you can run locally. It's also the last open one, because Alibaba froze the numbered series at 2.2 and took 2.5+ API-only. This node is the cloud version of Wan 2.2 image-to-video at 720p, from the SF ComfyUI Nodes pack (Stillfront/comfyui-sf-nodes): a still image in, a motion prompt, and a 720p clip back.
But here's the feature that makes this node stand out from the generic "animate my image" crowd: last_image_url. That's an optional second image that guides the end of the video. Most I2V nodes condition on the first frame and let the ending wander. This one can pin both ends - which is exactly how you force a seamless loop, or guarantee the camera lands on a specific final composition. If you've fought with loop workflows that never quite join up, this is the input you've been missing.
How it works
The node POSTs your image, prompt, duration (5 or 8 seconds), and optional negative prompt plus last_image to /api/v3/wavespeed-ai/wan-2.2/i2v-720p. Wan 2.2's two-expert architecture - high-noise pass for motion and composition, low-noise for detail - runs on WaveSpeed's side. The result comes back as a hosted video_url (STRING). Nothing runs locally, and the 720p ceiling is the model's native tier, so you're not paying for a hallucinated upscale.
The inputs that matter
- client - required, from the SF WaveSpeed Client node.
- image_url - the start frame. URL string from ComfyUI's Upload Image node; must be publicly reachable.
- prompt - describe the motion and content. The community rule for Wan I2V applies here too: describe the motion in this field, don't re-describe the image as if it's text-to-video.
- duration - 5 or 8 seconds.
- last_image_url - the optional end frame. This is the standout input: wire one in to anchor the ending (or force a loop back to the start).
- negative_prompt - optional; useful for the usual video failure modes.
- seed - -1 for random; set it to lock a take.
- enable_sync_mode - on by default, so the node waits for the clip.
Output: video_url (STRING) - a link to the finished 720p clip.
Install
Same pack install as always. ComfyUI Manager → search "SF ComfyUI Nodes" → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Stillfront/comfyui-sf-nodes.git
cd comfyui-sf-nodes
pip install -r requirements.txt
Then an SF WaveSpeed Client node with your key. No models, no VRAM, no GGUFs to track.
Gotchas
- URLs must be public. Both the start and end images are fetched by WaveSpeed's servers; localhost fails.
- The loop trick costs the same as a normal run - that's the good news. Feed the same image into both
image_urlandlast_image_urland the model has to land where it started, which is the cheap path to a loopable clip. - End-frame conditioning is a hint, not a promise.
last_imageguides the ending; it doesn't guarantee a frame-perfect match. If you need pixel-exact ends, this gets you close, then a local stitch pass finishes it. - README config drift: the README's
wavespeed_api_keyexample doesn't match theapi_keykey the code reads. Copyconfig.ini.tmp.
Wan 2.2 I2V is one of those nodes where you either have a use for the end-frame input or you don't - and if you do, you'll wonder why every other video node in this pack doesn't have it. For loopable clips and directed endings from a strong still, it's the one I'd reach for in the WaveSpeed section.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| client | WAVESPEED_AI_API_CLIENT | — | |
| image_url | STRING | URL of input image for video generation (connect from Upload Image node) | |
| prompt | STRING | Text prompt describing the desired motion and content | |
| duration | COMBO | 5 | Duration of the generated video in seconds (5 or 8) |
| enable_sync_mode | BOOLEAN | true | Wait for generation to complete before returning |
| negative_promptopt | STRING | Negative text prompt of what to avoid in the generation | |
| last_image_urlopt | STRING | Optional URL of an image to guide the end of the video (connect from Upload Image node) | |
| seedopt | INT | -1-1–2147483647 | Random seed for reproducible results. -1 for random seed |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video_url | STRING | — |