Google Veo3.1 First Last Frame (Channel Edition)
First-last-frame video, portrait by default
- first_frame_image
- last_frame_image
- api_config
- video
- request_id
- urls
First-last-frame-to-video is the most controllable thing Veo does, and this is the Pro tier of it: give the model a starting image, an ending image, and a prompt, and it generates the video that plausibly connects them. This Channel Edition of Veo 3.1 Pro FLF has one small surprise in its defaults - the aspect_ratio comes pre-set to 9:16 (portrait) rather than the 16:9 you see on the rest of the family.
That portrait default is a strong hint about who this node is for: short-form vertical video. Reels, TikTok, the phone-first deliverable. Combine it with the Pro tier's 1080p-class quality and you've got a very direct path from "two frames I composed" to "a finished vertical clip," which is exactly the kind of job people used to stitch together by hand.
Why you'd reach for it
FLF gives you creative control over the destination that plain image-to-video can't: you're not hoping the model lands somewhere nice, you're telling it where to land. The Pro tier brings the fidelity; the portrait default suggests the target platform. If you generate a strong opening and closing frame locally - say, the two key poses of a character - this node turns them into the shot between them. The trade is the usual closed, billed, cloud-rendered one, with the Pro wait on top.
How it works
Required inputs: first_frame_image (IMAGE), prompt, resolution (720p default here), and aspect_ratio (9:16 default). The optional last_frame_image (IMAGE) is the destination frame - connect it and the model has something to reach; leave it unconnected and this degrades to plain image-to-video. The prompt describes the motion, scene, and (since Veo generates audio natively) the sound.
On queue the node uploads both frames, submits to Veo 3.1 Pro through BizyAir's channel, polls, and returns video (VIDEO - preview or save it like any local render), request_id (STRING), and urls (STRING). The optional api_config (BIZYAIR_OPENAPI_CONFIG) overrides base_url/api_key per request; skip_error turns a failed call into a placeholder instead of an aborted workflow.
Install and setup
The same one-time install as the rest of 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 bridge looks wrong - FLF interpolates plausibly, not deterministically. Mismatched lighting or framing between the two frames makes the model invent a jarring middle; match the frames' look before queueing.
- Unexpected portrait output - the 9:16 default is doing its job, but if you want landscape, remember to change
aspect_ratio. - Last frame quietly ignored - an unconnected
last_frame_imagesilently turns this back into image-to-video. Check the wire.
Pack caveat: BizyAir auto-installs and sends your images to the cloud. Legitimate SiliconFlow product, but flip the switch OFF for local-only sessions.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| first_frame_image | IMAGE | First image | |
| prompt | STRING | Video cue words | |
| resolution | COMBO | 720p | Video resolution |
| aspect_ratio | COMBO | 9:16 | Picture scale |
| last_frame_imageopt | IMAGE | End frame picture | |
| 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 | — |