WaveSpeedAI OpenAI Sora 2 Image-to-Video Pro
The paid, no-GPU route
- client
- video_url
You can't run Sora 2 on your own GPU - it's a closed API model, full stop. What this node does is put that API inside ComfyUI so you can drop a still image into your existing graph and get a physics-aware video clip out the other end, all billed per second to a WaveSpeed AI account. If you've been kicking around local video models and wondering what the "just works" alternative looks like, this is it: no 14B checkpoint to babysit, no VRAM roulette, just a prompt, an image, and a credit balance.
What it is
This is the "Pro" tier of the pack's Sora 2 image-to-video pair. Where the plain Sora 2 Image-to-Video node just takes a duration, this one adds a resolution choice (720p or 1080p) so you can pick the quality you're actually paying for. That's the whole difference, and it's reflected in the pricing baked into the tooltip: 720p runs $1.20 per 4 seconds ($0.30/s) and 1080p runs $2.00 per 4 seconds ($0.50/s), doubling with length. The base node is $0.10/s at a fixed resolution. You reach for Pro when output resolution matters - a delivery, a client piece, something you're not going to re-encode down anyway.
How it works
Like every node in the razvanmatei-sf/razv-wavespeed pack, this is a thin wrapper over the WaveSpeed AI API at api.wavespeed.ai. You feed it a client (from the WaveSpeedAI Client node), a public image URL, and a prompt; the node POSTs to the Sora 2 endpoint and hands you back a video_url string, not a video tensor. There's nothing running on your machine beyond a requests call.
One setting matters more than the rest: enable_sync_mode. On (it polls until the video is done, up to 30 minutes), the node blocks and returns the finished URL. Off, it returns a task ID and you check back later - which lets ComfyUI keep the rest of the queue moving. For a single render just leave sync on and let it block.
The inputs that matter
- image - the source frame, as a URL (the tooltip says to connect it from the Upload Image node). It must be reachable by WaveSpeed's servers; localhost won't work.
- prompt - describe mood, motion style, and camera behavior. Sora rewards explicit camera language ("slow push-in, handheld, gentle wind").
- resolution - 720p or 1080p. This is the Pro-upsell.
- duration - 4, 8, or 12 seconds. Price scales linearly.
The output, video_url, is a string - wire it into a download/save node or grab it from the console print. There's no built-in preview, so budget one extra node or a browser tab.
Install & setup
Install once for the whole pack:
cd ComfyUI/custom_nodes
git clone https://github.com/razvanmatei-sf/razv-wavespeed.git
cd razv-wavespeed
pip install -r requirements.txt
Or just search "razv-wavespeed" in ComfyUI Manager and hit Install, then restart ComfyUI. You need a WaveSpeed AI API key from wavespeed.ai - drop it in config.ini (copy from config.ini.tmp), in the Client node directly, or as a WAVESPEED_API_KEY env var. No models download; the only pip deps are requests, pillow, numpy<2.0.0, and torch.
Gotchas
- A 401 Unauthorized means the key is wrong, expired, or out of credit.
- "No output received" after a long wait usually means the job hit the 30-minute timeout or the image URL was unreachable.
- Don't confuse this with the "WaveSpeed" ComfyUI plugin people rave about for fast local inference - that's a different project entirely. This pack is the hosted API.
For one-off videos the plain Sora 2 node is the better deal. Pro earns its keep only when you specifically need 1080p.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| client | WAVESPEED_AI_API_CLIENT | — | |
| image | STRING | Reference image URL for video generation (PNG/JPEG) - connect from Upload Image node | |
| prompt | STRING | Describe the mood, motion style, or camera behavior for video generation | |
| resolution | COMBO | 720p | Video output resolution - 720p or 1080p (higher cost) |
| duration | COMBO | 4 | Video duration in seconds (720p: 4s=$1.20, 8s=$2.40, 12s=$3.60 | 1080p: 4s=$2.00, 8s=$4.00, 12s=$6.00) |
| enable_sync_modeopt | BOOLEAN | false | Wait for generation to complete before returning |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video_url | STRING | — |