Wan 2.5 · Image to Video
When you need the audio, not just the motion
- image_url
- audio_url
- video
- task id
The jump from Wan 2.2 to 2.5 is the jump from silent clips to clips that make noise, and it's the reason this node exists at all: Alibaba never released 2.5 weights, so if you want it, you call it. One opening frame in, five or ten seconds out, with generated sound, at 480p, 720p or 1080p. From $0.045 per second.
Why it's not on your hard drive
Wan 2.2 is the last open Wan. 2.5 arrived in late 2025 as a cloud preview that promised open weights and never delivered, and 2.6, 2.7 and 3.0 followed the same path - API-only, per-second pricing, no Hugging Face repo. There are content-farm pages advertising local Wan 2.5 downloads; the links are dead and the pages are fabricated. So the choice isn't local versus hosted for this model. It's hosted, or a different model.
The honest counter-argument, and the one you'll see in every thread about a new Wan release: the open 2.2 weights are free forever and the community fine-tune layer on top of them is deep. If you don't need generated audio and 1080p, 2.2 with the right LoRAs still lands surprisingly close. Reach for 2.5 when you specifically need sound or the higher tier.
How it works
Your frame is uploaded, the job is quoted, run and polled, and the returned MP4 comes back as a ComfyUI VIDEO. Uploads are re-encoded for you - PNG under 10 MiB, then high-quality JPEG - so a giant source image is fine, though a sane 1–2 MP frame uploads faster and hasn't visibly hurt anyone's result.
The inputs worth setting
image_url is the opening frame, and it fixes subject, wardrobe, set and light. Which means prompt should carry the motion: the action, the camera, the mood. This is the I2V rule that gets repeated in every Wan thread and it's true here - describe what happens after the still, don't re-describe the still.
duration_seconds is 5 or 10. resolution is 480p, 720p or 1080p, and 1080p roughly doubles the bill, so draft at 480p and spend on the take you keep. negative_prompt is available and underused: "static, morphing hands, text" earns its keep.
audio_url is the optional and most interesting input - it's an AUDIO socket, so a clip from any audio node in your graph can drive lip sync and pacing. This is how you make a talking-head shot that actually lands on the beat instead of approximating it. Note that the video comes back with generated sound too, so if you're feeding your own track, plan for which one you're keeping. enable_prompt_expansion is off by default; seed repeats a draw exactly.
Outputs: video to Save Video, task id as a string for the console.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart, then Settings > SpicyAPI with a key from spicyapi.ai/console/keys - or search "SpicyAPI" in ComfyUI Manager. Nothing installs: the client is aiohttp, which ComfyUI already includes, and there are no weights to fetch. The key sits in your ComfyUI user folder, not in the workflow, so a shared graph stays clean; set SPICY_API_KEY on headless machines.
Troubleshooting
If a node run dies mid-render, don't reach for cancel as a cost control - a cancelled run keeps going server-side and is charged if it succeeds, with the result waiting in your console for 14 days.
On errors: No SpicyAPI key is set is literal. 40004 means no deployment serves that combination of options - usually a resolution/duration pairing - and the message names the parameter to change. 40310 is an unverified email on your SpicyAPI account. 50302 means the generation failed upstream and was refunded, so re-queue it. Anything ending in request_id ... is the identifier support wants; paste that, not the whole traceback.
One last thing that catches people: your first run after adding the key may show a shorter node list until you restart, because the catalogue is fetched from your account at startup. Restart once and forget about it.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image_url | IMAGE | Opening frame. The clip starts from this image. | |
| prompt | STRING | Describe what happens after the opening frame: the action, the camera, and the mood. | |
| negative_prompt | STRING | List what must not appear in the shot. | |
| resolution | COMBO | 720p | Output resolution. |
| duration_seconds | COMBO | 5 | Requested output length in seconds. |
| enable_prompt_expansion | BOOLEAN | false | Allow the service to expand the submitted creative brief before generation. |
| seed | INT | 00–2147483647 | Same seed and settings, same result. Set 'control after generate' to randomize to get a new result on every run; every run is billed. |
| audio_urlopt | AUDIO | Audio track that drives lip sync or pacing. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |