Google Veo3.1 First Last Frame (Official Edition)
Veo 3.1 first-last-frame video, the standard Official Edition — the one I'd use
- first_frame_url
- last_frame_url
- api_config
- video
- request_id
- urls
Of everything in this pack's Veo family, this is the node I'd actually reach for. "Google Veo3.1 First Last Frame (Official Edition)" - the standard tier of Veo 3.1 doing first-last-frame generation, with the full control set and none of the tier trade-offs. You give it a start frame, an end frame, and a prompt, and it invents the video between them. That's the strongest trick in Veo's bag, on the tier with nothing taken away.
The FLF trick matters because it's the difference between hoping and directing. Plain image-to-video hopes the model takes your frame somewhere good; FLF tells it where to land. Storyboards, character two-pose shots, loopable b-roll, product pans from "here" to "there" - every one of those jobs is a first-last-frame job, and this node is the standard-tier way to do it.
Why you'd reach for it
Because the standard tier is the reference point - Fast and Lite are tuned for cost or speed, and this is what Veo 3.1 actually is when you don't compromise. Its improved image-to-video and audio behavior is what the 3.1 release was credited for, and FLF is where that shows. Combined with the Official Edition controls - duration, generate_audio, negative_prompt, seed - you get reproducibility and steering on top of the best trick. When a transition finally works here, it works.
How it works
Required: first_frame_url (IMAGE - the opening frame), prompt, resolution (720p default), duration (default 4), generate_audio (default true). Optional: last_frame_url (IMAGE - the destination frame), negative_prompt, aspect_ratio (16:9 default), seed (0 default). The frame inputs are named for the provider's URL-based API contract, but you wire in normal IMAGE tensors and the node handles the hosting side.
On queue the node uploads both frames, submits to Veo 3.1 through BizyAir's channel, polls, and returns video (VIDEO - preview or save like any local render), request_id (STRING - trace ID), and urls (STRING - clip location). The optional api_config (BIZYAIR_OPENAPI_CONFIG) overrides base_url/api_key per request; skip_error swaps a failed call for a placeholder so the workflow survives.
Install and setup
One-time install, identical across the pack:
cd ComfyUI/custom_nodes
git clone https://github.com/siliconflow/BizyAirPlus.git
cd BizyAirPlus
python -m pip install -r requirements.txt
Restart ComfyUI (or install "BizyAirPlus" via ComfyUI Manager). No model files - the bizyair-cloudberry and bizytrd pip packages auto-install on startup. Click the BizyAirPlus button to ON, get an API key from bizyair.ai, enter it, and queue.
Common issues
- The middle doesn't convince - FLF bridges plausibly, not deterministically. Mismatched lighting or composition between the two frames makes the model invent a jarring transition; make the frames agree before queueing.
- Last frame silently ignored - if
last_frame_urlis unconnected, this quietly degrades to plain image-to-video. Check the wire. - Reproducibility -
seeddefaults to 0 (effectively random); pin an explicit value when a transition needs to be re-run identically.
Pack caveat: BizyAir auto-installs and sends your images to the cloud. Legitimate SiliconFlow product, but keep the switch OFF for local-only sessions.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| first_frame_url | IMAGE | First image | |
| prompt | STRING | Prompts | |
| resolution | COMBO | 720p | Resolution |
| duration | COMBO | 4 | Video duration |
| generate_audio | BOOLEAN | true | Audio |
| last_frame_urlopt | IMAGE | End frame picture | |
| negative_promptopt | STRING | Back prompts | |
| aspect_ratioopt | COMBO | 16:9 | Aspect ratio |
| seedopt | INT | 0-1–2147483647 | Seeds |
| api_configopt | BIZYAIR_OPENAPI_CONFIG | 单次请求覆盖base_url和api_key | |
| skip_erroropt | BOOLEAN | false | 开启后遇到错误不中断工作流,输出对应类型的错误占位符 |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| request_id | STRING | — |
| urls | STRING | — |