Nodes/Symbiotica/NS WaveSpeed VEO 3.1 Image to Video
ComfyUI Node

NS WaveSpeed VEO 3.1 Image to Video

Bookend your clip

By symbiotica-ai·Created 6 months ago·Updated about 13 hours ago· 2
NS WaveSpeed VEO 3.1 Image to Video
  • client
  • video_url
image
prompt
aspect_ratio16:9
duration8
resolution1080p
generate_audiofalse
last_frame
negative_prompt
seed-1
enable_sync_modefalse

The killer feature of NSWaveSpeedVeo31ImageToVideo from symbiotica-ai/comfyui-nodes is sitting quietly in the optional inputs, and most people miss it. Beyond the standard "start from this still" animation, this node has a last_frame input - an ending image the clip is supposed to transition into. Start at frame A, end at frame B, and Veo 3.1 figures out the bridge between them. That's a genuine editing capability, not a gimmick: it's how you get a clip to land exactly where you need it for a cut or a match dissolve.

How it works

Your starting frame goes in as a URL string from ComfyUI's Upload Image node; optionally, an ending frame does too. The node calls WaveSpeed (/api/v3/google/veo3.1/image-to-video), and Veo 3.1 animates from the start image toward the end image, with your prompt directing the motion in between - "slow dolly zoom on a city skyline" reads very differently from "camera orbits the subject." enable_sync_mode defaults off: submit, poll every second, block until the clip's done, and Cancel stops the wait properly because the polling checks ComfyUI's interrupt flag.

generate_audio carries over from the text-to-video node, and it matters just as much here - native synchronized sound is Veo 3.1's claim to fame and the capability gap no local video model has fully closed. You can also set aspect_ratio, duration (4/6/8s), and resolution (720p/1080p), and a negative_prompt to steer it away from morphing, text, or warping.

The inputs that matter

  • image - the starting frame (JPEG/PNG/WEBP), as a URL.
  • last_frame (optional) - the ending frame for a transition. The reason to pick this node over the plain i2v variant.
  • prompt - motion and story context between the two frames.
  • generate_audio - Veo's native synchronized audio.
  • client - the WAVESPEED_AI_API_CLIENT socket from the NS WaveSpeed Client node.

Output: video_url (STRING). Preview in a browser or feed a download-from-URL node.

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, add the NS WaveSpeed Client node with your wavespeed.ai key (widget, Settings → Symbiotica, or WAVESPEED_API_KEY), wire client in. No model files.

Common issues

The end frame can fight the start frame. If the two images are wildly different in composition or lighting, Veo has to invent a path between them and you'll see it strain. Keep them in the same world - same palette, same scale of subject - and the transition reads as intentional.

Billing and waiting are part of the deal. Minutes per render, per-second pricing, prompts and both frames leaving your machine. That's the API-node contract (external-api-nodes.md). If you don't need the landing frame, the plain text/image variants are cheaper per second.

Categoryneuralsins/WaveSpeed

Inputs (11)

NameTypeDefaultDescription
clientWAVESPEED_AI_API_CLIENT
imageSTRINGStarting frame image URL (JPEG/PNG/WEBP) - connect from Upload Image node
promptSTRINGDescribe motion/story context (e.g., 'Slow dolly zoom on a city skyline')
aspect_ratioCOMBO16:9Video aspect ratio - 16:9 (landscape) or 9:16 (portrait)
durationCOMBO8Video duration in seconds
resolutionCOMBO1080pVideo output resolution
generate_audioBOOLEANfalseGenerate native audio synchronized with the video
last_frameoptSTRINGOptional ending frame image URL for transition effect (JPEG/PNG/WEBP)
negative_promptoptSTRINGSpecify undesired generation characteristics
seedoptINT-1-1–2147483647Random seed for reproducible results. -1 for random seed
enable_sync_modeoptBOOLEANfalseWait for generation to complete before returning

Outputs (1)

NameTypeDescription
video_urlSTRING