SF WaveSpeed VEO 3.1 Reference to Video
The same character, every frame
- client
- video_url
Character consistency across frames is the thing that makes AI video look like footage instead of a fever dream, and it's also the thing vanilla text-to-video keeps failing. This node is VEO 3.1's answer: you feed it one to three reference images of the person, character or object, describe the scene, and it holds that subject steady through the whole clip. For character-driven narratives and anything where a brand or face has to be recognizable, this is the node you want.
It sits in the same territory the local community chased for months - reference-to-video was a headline capability people celebrated when it finally landed in open models - except here it's Google's model doing it, over the WaveSpeed API, with no local weights to babysit. The input format even reads like the API docs: reference images must be PNG/JPEG/JPG/WebP, at least 128x128, no more than 50MB.
How it works
Standard pack anatomy: wire an SF WaveSpeed Client into client, and the node POSTs your prompt plus reference images to /api/v3/google/veo3.1/reference-to-video, then waits (polls) until the render finishes. It returns a single video_url string. No local model, no VRAM pressure, no model download - the only thing that moves is the API key.
One difference from the other VEO nodes: there's no aspect_ratio or duration input here. The info_schema simply doesn't expose them - you pick resolution (720p/1080p), and the model decides the rest. Don't go hunting for missing widgets; they're not there.
The inputs that matter
- image_1 - the required first reference. This is your anchor: the face, outfit, or object that has to stay consistent.
- image_2, image_3 - optional second and third references for additional subjects or more angles on the same one.
- prompt - describe the scene and what's happening, keeping the subject description in line with what the references show. The consistency comes from the images; the prompt supplies the story.
- resolution, generate_audio - output size, and VEO's native synced audio if you want it.
- negative_prompt, seed, enable_sync_mode - the usual suspects, behaving exactly as their tooltips say.
Installing it
Easiest: ComfyUI Manager, search comfyui-stillfront, install. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/razvanmatei-sf/comfyui-stillfront.git
cd comfyui-stillfront
pip install -r requirements.txt
Then get a WaveSpeed key from wavespeed.ai and set it one of three ways: paste into config.ini (after copying config.ini.tmp to config.ini), export WAVESPEED_API_KEY, or type it into the SF WaveSpeed Client node's api_key field. Ignore the README's stale stillfront/... clone URL - the repo is at razvanmatei-sf/comfyui-stillfront.
Where people get burned
The references are URL strings, not IMAGE tensors - a stock Load Image node won't connect. You need an upload-style node that produces URLs. That's the #1 stumble for everyone coming from a normal local workflow.
Second, expectations about cost and time: this is pay-per-generation on a hosted service, and reference-to-video is one of the more expensive jobs. Test with one reference at 720p before you commit to three references at 1080p with audio.
Third, don't confuse this pack with ComfyUI-WaveSpeed (chengzeyi's local acceleration pack). Same "WaveSpeed" in the name, totally unrelated project - that one makes your own GPU faster, this one talks to an API.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| client | WAVESPEED_AI_API_CLIENT | — | |
| prompt | STRING | Text description for video generation with subject consistency | |
| image_1 | STRING | First reference image URL (required) - connect from Upload Image node. PNG/JPEG/JPG/WebP, min 128x128px, max 50MB | |
| resolution | COMBO | 1080p | Video output resolution |
| generate_audio | BOOLEAN | false | Generate native audio synchronized with the video |
| image_2opt | STRING | Second reference image URL (optional) for additional subject reference | |
| image_3opt | STRING | Third reference image URL (optional) for additional subject reference | |
| negative_promptopt | STRING | Specify elements to avoid in the generated video | |
| seedopt | INT | -1-1–2147483647 | Random seed for reproducible results. -1 for random seed |
| enable_sync_modeopt | BOOLEAN | false | Wait for generation to complete before returning |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video_url | STRING | — |