☁️BizyAir Veo3.1 Image To Video
Google's video model without a Google API key
- first_frame_image
- last_frame_image
- video
- bizyair_model_name
This node doesn't run Veo. Nothing does, locally - Veo 3.1 is Google's, it's closed, and there's no open-source equivalent that generates audio the way it does. What this node does is call Google's API on your behalf, billed through your BizyAir account instead of a Google Cloud one. You give it an image and a prompt, it comes back with a video a minute or two later, and your GPU never spins up because the actual compute happened on Google's servers.
Why bother going through BizyAir instead of Google directly? Mostly convenience: no separate GCP billing account, no wrestling with Google's own API onboarding, and it drops straight into a ComfyUI graph next to your other nodes. You're trading a bit of markup for not having to leave the app.
What it does
You're animating a still image. Feed it a starting frame and a text prompt describing the motion, and Veo generates a short clip that begins from that frame. This is the image-to-video path specifically - there's a separate text-to-video node in the pack if you don't have a starting image, and a reference-image variant if you want to hand Veo a cast of subjects instead of a literal first frame.
Inputs and outputs that matter
prompt- plain text describing the motion and scene. Multiline, so don't cram it into one line.first_frame_image- the image the clip opens on. Required.model-veo3.1-fastorveo3.1-pro. Fast is what you want while you're iterating on a prompt; pro costs more and renders slower for a real quality bump, so save it for the take you're actually keeping.last_frame_image(optional) - bookend the other end of the clip with a second image. This is the thing that separates it from most i2v nodes: you can pin both the start and end frame and let Veo fill in the motion between them, rather than just extrapolating forward from one frame.aspect_ratio(optional) -16:9or9:16.
Output is a video you can wire straight into a preview or save node, plus bizyair_model_name - a string echoing which model served the request. In practice both fast and pro currently report back as the same "veo3.1" label, so don't lean on this output to distinguish which tier actually ran; it's there for logging, not branching logic.
How to install it
Same pack, same steps regardless of which BizyAir node you're after:
- ComfyUI Manager - search "BizyAir", install, restart.
- Manual -
cd ComfyUI/custom_nodes && git clone https://github.com/siliconflow/BizyAir.git, then restart. - Comfy CLI -
comfy node install bizyair.
The step people skip and then can't figure out why nothing runs: set your API key. Click the "click to login" prompt in the node's first use, or register at bizyair.siliconflow.cn ahead of time. Every one of these API nodes is metered - you're spending BizyAir credits per generation, not free compute.
Common issues & troubleshooting
It just appeared in your custom_nodes folder and you don't remember installing it. This happens. ComfyUI Manager used to guess which pack a missing node belonged to when you opened someone else's workflow, and it guessed BizyAir wrong often enough that there are multiple "is this malware" threads about it - flaired Security Alert, people asking how to safely remove it. It's not malware; it's a legitimate commercial node pack that happened to get auto-resolved into workflows that never needed it, and the underlying Manager bug has since been fixed. If you don't want a cloud-execution dependency sitting in your node list, uninstall it from the Manager same as anything else.
Generation fails with no useful error. Since this proxies to Google's actual Veo service, content-policy rejections happen upstream and you don't control that filter - a prompt that's fine on an uncensored local model can bounce here. There's no local workaround; it's Google's model.
No audio in your output. Veo 3.1 can generate synchronized audio, but this node's schema only exposes a single video output - there's no separate audio track control here, so whatever comes back is whatever the API decided to bake into the clip.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — | |
| first_frame_image | IMAGE | 首帧图片 | |
| model | COMBO | veo3.1-fast | 2 options: veo3.1-fast, veo3.1-pro |
| last_frame_imageopt | IMAGE | 尾帧图片 | |
| aspect_ratioopt | COMBO | 16:9 | 2 options: 9:16, 16:9 |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| bizyair_model_name | {"veo3.1-fast": "veo3.1","veo3.1-pro": "veo3.1"} | — |