NS WaveSpeed Sora 2 Image to Video
Feed an image, get motion for $0.40 a shot
- client
- video_url
Text-to-video gives you a shot of whatever the model hallucinated. Image-to-video gives you a shot of your image, moving - and for anyone who's built a still they're proud of, that's the workflow that feels like magic. NSWaveSpeedSora2ImageToVideo from symbiotica-ai/comfyui-nodes takes one still, runs it through OpenAI's Sora 2 on WaveSpeed's hosted API, and returns a URL to the animated clip. Sora 2's whole pitch here is physics-aware motion - water that sloshes, cloth that follows, cameras that move like cameras - while keeping the identity, lighting, and composition of your input frame.
How it works
The image input is a URL string, not an image tensor - wire it from ComfyUI's core Upload Image node. The node bundles your still, your motion prompt, and a duration, POSTs to WaveSpeed (/api/v3/openai/sora-2/image-to-video), and with enable_sync_mode off (default) it submits the job, then polls the task endpoint every second until the render finishes. The graph blocks meanwhile, and Cancel actually stops the wait because the polling checks ComfyUI's interrupt flag.
The prompt is where you describe motion and characteristics - "slow push-in on the subject, hair moving in wind, subtle background parallax." You're not describing the scene (the image already is the scene), you're directing the camera and the physics.
The inputs that matter
image- your still as a URL (Upload Image node → here). This is the anchor frame Sora animates from.prompt- desired motion, camera behavior, and characteristics.duration- 4, 8, or 12 seconds, priced in the tooltip: 4s = $0.40, 8s = $0.80, 12s = $1.20. A flat $0.10/second.client- theWAVESPEED_AI_API_CLIENTsocket from the NS WaveSpeed Client node.
Output is video_url (STRING) - the hosted clip. Preview in a browser or feed it to a download-from-URL node; the pack doesn't save it for you.
Install and keys
# ComfyUI Manager: search "Symbiotica", or:
cd ComfyUI/custom_nodes
git clone https://github.com/symbiotica-ai/comfyui-nodes.git symbiotica
pip install -r symbiotica/requirements.txt
Restart, then add the NS WaveSpeed Client node and put your wavespeed.ai key in its api_key field (or once in ComfyUI Settings → Symbiotica, or as WAVESPEED_API_KEY). Wire client in. No model files - this is a pure API wrapper.
Common issues
The classic "API_KEY is empty". The key lives on the client node and this node requires that client wire. If you see that error, the client node is missing or unwired.
I2V can be picky about the still. Sora does best with clear, well-lit, unambiguous images - a messy mid-process render gives the model less to hold onto. And remember what you feed it is exactly what leaves your machine; cloud moderation applies to the input image too (external-api-nodes.md).
Cost drift in batches. Four seconds is cheap; twelve seconds of a five-variant batch is not. The tooltip does the math for you, which is more than most API nodes bother with - read it before you queue.
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 | — |