Veo 3.1 是同一个模型挂在两个入口上:Google AI 这边是 Gemini API,Google Cloud 那边是 Vertex AI。模型一样,视频一样,model id 不一样,账单也不一样。网上关于 Veo 3.1 API 价格的混乱,多半来自把这两个入口的数字混着用。

Veo 3.1 API 到底返回什么

Veo 3.1 生成 8 秒的短片,分辨率可选 720p、1080p 或 4k,音频由模型原生生成,而不是后期贴上去的。排期时要盯住四个控制项:横屏 16:9 或竖屏 9:16、用首尾帧做插值、最多三张参考图、以及可以接着上一段继续生成的延展。

这些能力并不是三档模型都有。参考图与图片输入只挂在标准版和 Fast 版上,Lite 的参数表里写的是 n/a。延展则被限制在 720p,所以想做高分辨率的连续镜头,得换条路走。

有两个限制比看上去更影响架构。提示词上限是 1,024 tokens,参数表里写明单次请求只出一个视频,所以同一个镜头想要四个版本,就是四次请求。所有产出都带 SynthID 水印。如果这是你第一次用 Google 的图像或视频 API,Gemini API 上手指南里讲的密钥与请求结构,下面这条路会原样复用。

两个入口,两套 model id

Gemini API 的 model id

Gemini API 列出三个 Veo 3.1 的 id,全部处于预览状态:veo-3.1-generate-previewveo-3.1-fast-generate-previewveo-3.1-lite-generate-preview。上一代模型仍在文档里,但已标注为 deprecated:veo-3.0-generate-001veo-3.0-fast-generate-001

Vertex AI 的 model id 与区域

Vertex AI 给同样三个模型起了另一套名字:veo-3.1-generate-001veo-3.1-fast-generate-001veo-3.1-lite-generate-001。前两个已正式可用,Lite 仍是预览。

模型卡上写的可用区域是美国 us-central1,配额是每个基础模型每分钟 50 次区域在线预测请求。

第一条请求:用 REST 调 Gemini API

Google 的 Veo 3.1 官方公告卡:多张生成的影片画面拼贴,包括气球从工坊窗口涌出、剪影中的舞者、烛光下的小人偶、金色田野上骑马的人、以及金碧辉煌长廊里的女子,画面中央压着白色的 Veo 3.1 字标
Google

Veo 是长时任务,所以调用分两半:先提交,再轮询。

# 需要 curl 与 jq。
BASE_URL="https://generativelanguage.googleapis.com/v1beta"
VEO_MODEL="veo-3.1-generate-preview"

# 1. 提交任务,把 operation 名字留下来。
operation_name=$(curl -s "${BASE_URL}/models/${VEO_MODEL}:predictLongRunning" \
  -H "x-goog-api-key: ${GEMINI_API_KEY}" \
  -H "Content-Type: application/json" \
  -X POST \
  -d '{
    "instances": [
      {
        "prompt": "A slow dolly shot through a rain-soaked neon alley at night, reflections on wet asphalt, distant traffic and light rain."
      }
    ],
    "parameters": {
      "aspectRatio": "16:9",
      "resolution": "1080p",
      "durationSeconds": "8"
    }
  }' | jq -r .name)

# 2. 轮询到任务完成。
while true; do
  status=$(curl -s -H "x-goog-api-key: ${GEMINI_API_KEY}" "${BASE_URL}/${operation_name}")
  if [ "$(echo "${status}" | jq .done)" = "true" ]; then
    video_uri=$(echo "${status}" | jq -r '.response.generateVideoResponse.generatedSamples[0].video.uri')

    # 3. 在同一次运行里下载:服务器只留两天。
    curl -L -o out.mp4 -H "x-goog-api-key: ${GEMINI_API_KEY}" "${video_uri}"
    break
  fi
  sleep 10
done

有三个细节是承重的。动词是 predictLongRunning,不是 generateContent。提交之后只回一个 operation 名字,轮询循环就是为它存在的。而下载地址带有效期。

durationSeconds 接受 "4""6""8",但 1080p 与 4k 输出必须是 8 秒。要一条 4 秒的 4k 视频,结果是被拒,不是被截短。

用 Python SDK 发同一条请求

import time

from google import genai
from google.genai import types

client = genai.Client()  # 从环境变量读 GEMINI_API_KEY

operation = client.models.generate_videos(
    model="veo-3.1-fast-generate-preview",
    prompt=(
        "A macro shot of espresso pouring into a glass cup, steam rising, "
        "warm window light, quiet cafe ambience, no dialogue."
    ),
    config=types.GenerateVideosConfig(
        aspect_ratio="9:16",
        number_of_videos=1,
        resolution="720p",
    ),
)

while not operation.done:
    time.sleep(10)
    operation = client.operations.get(operation)

video = operation.response.generated_videos[0].video
client.files.download(file=video, destination="espresso.mp4")

SDK 包的是同一个长时任务,轮询循环照样要写。有两个习惯值得养成:model id 从环境变量读,operation 名字记进日志。进程在轮询中途挂掉时,这个字符串是你唯一的抓手。

在 Vertex AI 上生成

Vertex AI 在出第一帧之前要多准备几样东西:一个 Google Cloud 项目、应用默认凭据,以及一个 Cloud Storage 存储桶,因为视频是以 gs:// 链接返回的,不是内联字节。

import time

from google import genai
from google.genai.types import GenerateVideosConfig

# export GOOGLE_CLOUD_PROJECT=<project>
# export GOOGLE_CLOUD_LOCATION=<location>
# export GOOGLE_GENAI_USE_ENTERPRISE=True
client = genai.Client()

output_gcs_uri = "gs://your-bucket/veo/"  # 桶必须已存在

operation = client.models.generate_videos(
    model="veo-3.1-generate-001",
    prompt="A heron standing perfectly still in shallow water at dawn, mist on the surface.",
    config=GenerateVideosConfig(
        aspect_ratio="16:9",
        output_gcs_uri=output_gcs_uri,
    ),
)

while not operation.done:
    time.sleep(15)
    operation = client.operations.get(operation)

if operation.response:
    print(operation.result.generated_videos[0].video.uri)

代码从一侧搬到另一侧时,有三处会咬人。model id 去掉 -preview 后缀、换成带版本号的写法。想留下能长期保存的文件,靠的是 output_gcs_uri。Vertex 的参数表还更长:多了 negativePromptseed、一个取值 "allow_adult""disallow"personGeneration,以及 1 到 4 的 sampleCount

模型卡上还写着,消耗方式里包括 Provisioned Throughput,产出带 Content Credentials 标记。Gemini API 那边对应的水印是 SynthID。两套标记不是一回事,做合规审查时要分开看。

官方定价页公布了什么

两个定价页都列了 Veo 3.1,但计价单位不同。Gemini API 报的是每秒单价,Vertex AI 报的是每条单价,并且把带音频和不带音频分开计。

模型Gemini API,付费档按秒Vertex AI,按条
Veo 3.1720p 与 1080p 为 $0.40,4k 为 $0.60带音频 $0.40,纯视频 $0.20,4k 为 $0.60 / $0.40
Veo 3.1 Fast720p 为 $0.10,1080p 为 $0.12,4k 为 $0.30带音频 $0.10 / $0.12 / $0.30,纯视频 $0.08 / $0.10 / $0.25
Veo 3.1 Lite720p 为 $0.05,1080p 为 $0.08,不支持 4k带音频 $0.05 / $0.08,纯视频 $0.03 / $0.05

还有一个容易忽略的细节:同一档模型里 4k 明显比 1080p 贵,官方文档在讲分辨率时专门指向定价页提醒了这一点。

有三件事官方写得明明白白。Veo 3.1 在 Gemini API 上没有免费额度,那一行写的是 “Not available”。音频费用包含在每秒单价里。生成被拦截不计费,页面原话是只有生成成功才收费。

跑一批之前先算成本

标准模型 1080p 一条 8 秒片子,是 8 × $0.40,也就是 $3.20。换成 Fast 是 $0.96,Lite 是 $0.64。乘的时候要乘重试率,不是乘分镜数量:被安全过滤拦下的那次不花钱,但生成成功却不能用的那些,是按全价计的。

配额、留存与重试

Vertex AI 给了一个硬数字:每个基础模型每分钟 50 次区域在线预测请求。Gemini API 给的是 1,024 tokens 的输入上限,以及高峰时段 11 秒到 6 分钟的延迟区间。这个跨度足以让任何同步设计超时,所以轮询要带上限和重试预算。

生成的视频会在两天后从服务器删除,延展出来的视频按新生成计算,计时重新开始。

把密钥贴进前端文件之前,先看 Google 对 API 密钥的处理要求。浏览器能读到的密钥就是公开密钥。如果你同时还要生成图片,我们的 Nano Banana Pro API 接入示例讲的是同一套鉴权与错误处理习惯。

常见问题

Veo 3.1 API 有免费额度吗? Gemini API 的定价表上写的是 “Not available”。Vertex AI 也没有,新 Cloud 账号的试用赠金是另一回事。

该用 Gemini API 还是 Vertex AI? 只求最快跑通第一条请求,用 Gemini API。已经在 Google Cloud 上跑业务、希望模型纳入自己的 IAM 与配额,或者希望产出直接落到自己的存储桶,就用 Vertex AI。

同一个模型,两个页面为什么价格不一样? 因为计的是不同单位。Gemini API 按每秒视频报一个价,Vertex AI 按条报价,并且把带音频与不带音频分开收。

API 会比在 Gemini 应用里用 Veo 更贵吗? 两者是不同的产品:应用是订阅制,API 按秒计量。我们的应用与 API 对比讲了什么时候订阅更划算。

一次生成要多久? 官方给的区间是 11 秒到 6 分钟。轮询循环按最大值设计,别按平均值。

把提交与轮询的循环接上,把 model id 放进配置,把重试率折进单价。这三件事决定了 Veo 3.1 API 是否适合你的流水线。