WaveSpeedAI OpenAI Sora 2 Image-to-Video
Animate a still image with Sora 2 for $0.40 — from inside ComfyUI
- client
- video_url
Sora's a closed model - no weights, no local version, no way around the API. So if you want that distinctive physics-aware motion without leaving ComfyUI, you either use a wrapper like this or you don't get Sora at all. This is the entry-level one: give it a still image and a sentence about how it should move, and it returns a short video clip, billed at $0.10 a second. A 4-second test costs less than a bus fare, which is exactly the right way to find out whether Sora's look is worth the hassle for your workflow.
What it is
The base Sora 2 image-to-video node from the razv-wavespeed pack. It's the cheaper sibling of the Pro version - same endpoint family, same idea, but no resolution control: you get whatever the API's default output is, and you pay $0.40 / $0.80 / $1.20 for 4 / 8 / 12 seconds. For mood tests, style explorations, and anything where the final resolution doesn't matter, this is the one to reach for. Pay for 1080p only when you know you need it.
How it works
Like everything in this pack, it's a thin HTTP client in disguise. The client input comes from the WaveSpeedAI Client node (your API key lives there), the image input is a public URL - the tooltip explicitly says to connect it from the Upload Image node - and the prompt is a multiline box for describing motion and camera. The node POSTs to the Sora 2 image-to-video endpoint and returns a video_url string.
enable_sync_mode is the one behavioral switch: false (default) submits the job, then polls until the video is done - up to a 30-minute ceiling. true tells the API to hold the response until generation completes. Either way the node blocks until it has a URL for you, so don't expect this to be instant; Sora takes a couple of minutes per clip.
Inputs at a glance
- prompt - describe motion, not content. "Slow dolly out, rain on the window, shallow focus" beats "a city street."
- duration - 4, 8, or 12 seconds. Longer = linearly more money.
- enable_sync_mode - wait for completion or not; default off.
Output is video_url (STRING). It's a URL, not a video file - you'll want a download node or a manual fetch to keep the clip.
Install & setup
It's one pack for all of these nodes:
cd ComfyUI/custom_nodes
git clone https://github.com/razvanmatei-sf/razv-wavespeed.git
cd razv-wavespeed
pip install -r requirements.txt
ComfyUI Manager works too - search "razv-wavespeed". Then grab an API key from wavespeed.ai and set it in config.ini (copy config.ini.tmp), in the WaveSpeedAI Client node, or via WAVESPEED_API_KEY. Restart ComfyUI after installing. No model files, no GPU requirements beyond what ComfyUI already needs.
Common issues
- 401 / "Invalid API key" - key missing, mistyped, or out of credit. Check
config.iniand the Client node. - Long hangs then "No output received" - the job timed out or the source image URL wasn't publicly reachable. Upload the image somewhere with a real URL first.
- Confusing it with the "WaveSpeed" speedup plugin - the fast local-inference WaveSpeed project and this WaveSpeed AI API are unrelated. If you installed the plugin thinking it was this, different thing.
Start with 4 seconds and a single seed. If Sora's motion is what your project needs, scale from there; if not, you spent forty cents to learn that.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| client | WAVESPEED_AI_API_CLIENT | — | |
| image | STRING | Source image URL for video generation (connect from Upload Image node) | |
| prompt | STRING | Positive prompt guiding video generation - describe desired motion and characteristics | |
| duration | COMBO | 4 | Video duration in seconds (4s=$0.40, 8s=$0.80, 12s=$1.20) |
| enable_sync_modeopt | BOOLEAN | false | Wait for generation to complete before returning |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video_url | STRING | — |