跳转到主要内容

推荐 endpoint

最小请求

{
  "model": "veo-3.1-generate-preview",
  "prompt": "一段 8 秒的 Api.Go 产品演示动画"
}

cURL 示例

BASE_URL="https://generativelanguage.googleapis.com/v1beta"

OPERATION_NAME=$(curl -s "${BASE_URL}/models/veo-3.1-generate-preview:predictLongRunning" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -X POST \
  -d '{
    "instances": [
      {
        "prompt": "一段 8 秒的 Api.Go 产品演示动画"
      }
    ]
  }' | jq -r '.name')

while true; do
  STATUS=$(curl -s -H "x-goog-api-key: $GEMINI_API_KEY" "${BASE_URL}/${OPERATION_NAME}")
  DONE=$(echo "$STATUS" | jq -r '.done')

  if [ "$DONE" = "true" ]; then
    VIDEO_URI=$(echo "$STATUS" | jq -r '.response.generateVideoResponse.generatedSamples[0].video.uri')
    curl -L -H "x-goog-api-key: $GEMINI_API_KEY" "$VIDEO_URI" -o tidemind-veo.mp4
    break
  fi

  sleep 10
done

Python 示例

import time
from google import genai

client = genai.Client(api_key="<GEMINI_API_KEY>")

operation = client.models.generate_videos(
    model="veo-3.1-generate-preview",
    prompt="一段 8 秒的 Api.Go 产品演示动画",
)

while not operation.done:
    print("waiting for video generation...")
    time.sleep(10)
    operation = client.operations.get(operation)

generated_video = operation.response.generated_videos[0]
client.files.download(file=generated_video.video)
generated_video.video.save("tidemind-veo.mp4")
print("saved tidemind-veo.mp4")

Node.js 示例

import { GoogleGenAI } from "@google/genai";

const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });

let operation = await ai.models.generateVideos({
  model: "veo-3.1-generate-preview",
  prompt: "一段 8 秒的 Api.Go 产品演示动画"
});

while (!operation.done) {
  console.log("waiting for video generation...");
  await new Promise((resolve) => setTimeout(resolve, 10000));
  operation = await ai.operations.getVideosOperation({
    operation
  });
}

await ai.files.download({
  file: operation.response.generatedVideos[0].video,
  downloadPath: "tidemind-veo.mp4"
});

console.log("saved tidemind-veo.mp4");

最佳实践

  • 初始请求只会拿到 operation 句柄,不会直接拿到视频
  • 轮询层优先由服务端负责,并把 operation 状态映射成内部状态
  • 任务完成后再拉最终资产,避免前端频繁空请求