Wan 3.0 · Image to Video
30 seconds, and a '-1' that lets the model pick the length
- image_url
- last_image_url
- video
- task id
Two things separate this from every 2.x Wan image-to-video node in the pack. Length: 2 to 30 seconds, where 2.6 stops at 15 and 2.2 at 8. And the -1 duration.
That second one is the genuinely new idea. Set duration_seconds to -1 and the model picks the length from your prompt and input media instead of a fixed number - smart duration, the tooltip calls it. If your prompt describes a beat ("she notices the camera, pauses, then turns away"), letting the model decide how long that takes is often better than forcing it into ten seconds and watching it pad. When you need a specific length for an edit, pick the number and it behaves like every other node here.
$0.045/second, and 30 seconds of it is not a small charge - this is the node where the cost settings stop being decorative.
Why you can't just download it
Wan 2.2 is the last open Wan; 3.0 is API-only, as are 2.5, 2.6 and 2.7. The open 2.2 weights with the community's fine-tunes are still perfectly good, and if you have them running you already know the trade: free after the electricity, versus a hosted model that will do half a minute with generated audio from one frame. Pick according to the length and the audio, not the model number.
Inputs
image_url is the opening frame - the clip starts there, so subject, wardrobe and light are settled. Write prompt as motion and camera. The tooltip even lists the slot: subject, action, camera, light, pacing, boundaries.
aspect_ratio defaults to model default, which is deliberate: omit it and the task adapts to your opening image rather than forcing a shape onto it. Override it when the output has to fit a format.
duration_seconds offers 5 as a default and accepts -1 for smart duration. Note that at 30 seconds you're paying $1.35 at the base rate - this is the point where you check the quote.
generate_audio is on by default: the clip arrives with sound. enable_thinking lets the model reason about the brief and any reference material before generating. It's slower and it helps with complicated references; the tooltip notes it switches itself on when a reference file or link is supplied.
enable_prompt_expansion is off by default. seed repeats a draw. The optional last_image_url pins the final frame - it needs image_url to be connected, and it's the cleanest way to land a shot exactly where the next one starts.
Outputs: video → Save Video, and task id for the console.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart, then Settings > SpicyAPI and paste a key from spicyapi.ai/console/keys - Manager users can search "SpicyAPI". Nothing to compile, no weights, no GPU, because the node only uploads a frame, polls a job and downloads an MP4; ComfyUI already provides the aiohttp it uses. The key lives in the ComfyUI user folder, not in a node field, so a shared workflow doesn't share credentials; SPICY_API_KEY handles servers. Restart once after adding the key so the node list is pulled from your account.
Guardrails worth setting on day one
Set Max cost per run in the SpicyAPI settings. On a node that will happily quote you a 30-second 1080p run, that ceiling is the difference between an experiment and an incident. The badge is a per-second rate, not a total, so do the multiplication before queueing.
Leave the seed's control after generate on fixed while iterating - same seed and settings, same result, one charge. randomize bills each queue. If a run is going badly, cancelling in ComfyUI won't stop it or the charge: the job completes server-side and waits in your console for 14 days, so check there before re-running.
Failures announce themselves usefully: No SpicyAPI key is set; 40004 when no deployment serves your option combination, with the offending parameter named in the message; 40310 for an unverified email; 50301 when the model has no usable deployment right now; 50302 when the run failed upstream and was refunded - that one is safe to simply re-queue. An error ending in request_id ... names the exact request, which is the only thing support needs.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Describe the subject, action, camera, light, pacing, and boundaries for the shot. | |
| image_url | IMAGE | Opening-frame image. | |
| aspect_ratio | COMBO | model default | Output aspect ratio. Omit it to let the task adapt to the opening image; adaptive follows the input media and the intent. |
| enable_thinking | BOOLEAN | false | Let the model reason about the brief and the reference material before generating. Helps with complex references; slower. Switches on by itself when a reference file or link is given. |
| resolution | COMBO | 720p | Output resolution. |
| duration_seconds | COMBO | 5 | Requested output length in seconds. Pass -1 for smart duration: the model picks the length from the prompt and any input media instead of a fixed number. |
| generate_audio | BOOLEAN | true | Request generated audio with the video. |
| 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. |
| last_image_urlopt | IMAGE | Optional last frame: the clip ends exactly on this image. Requires image_url. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |