返回博客
指南·2026年5月23日·阅读约 7 分钟

Veo 3 和 Sora API 快速入门——5 分钟实现文本转视频和图像转视频

通过 OpenAI 风格 API 调用你的第一个 Veo 3 视频生成:文本转视频、带首帧/尾帧控制的图像转视频、文件上传,以及可用于生产环境的 Python 和 Node 示例。Veo 3 今日可用;Sora 规划在同一端点上提供。无需候补名单,也无需按提供商分别计费。

Veo 3 和 Sora 将文生视频提升到了文本生图十八个月前所达到的同一质量标准。问题在于:供应商通过候补名单、地区限制和无法与其他 AI 技术栈配合的专门计费流程限制访问。

在 Kunavo 上,目前在线的文生视频模型是Google Veo 3,通过一个 OpenAI 兼容端点提供——无需候补名单,使用 OpenAI 兼容身份验证,按视频计费,结果通过永久 URL 提供。Sora(sora-2)已列入路线图:由于端点与模型无关,之后切换到它只需修改一个单词,即 model。本指南将在约五分钟内帮你完成第一次 Veo 3 调用。完整信息请参阅 Sora API 指南。

设置

  1. 在 kunavo.com/app/signup 注册。充值金额从 $10 起,按量付费——足够把本指南中的每个示例都运行好几遍,而且余额永不过期。
  2. 在 /app/keys 创建密钥。密钥以 sk-kn- 开头。
  3. 导出它:export KUNAVO_API_KEY=sk-kn-...。

使用 Veo 3 进行文生视频

Veo 3 目前是市场上最适合电影感镜头的文生视频模型——它理解摄影机语言(dolly、push-in、rack focus),能在镜头切换间保持稳定的光照,并正确处理 24fps 运动。生成需要 30 秒到几分钟;HTTP 响应是同步的——请将客户端超时时间设置得较长。

text_to_video.py
import requests, os, time

KEY = os.environ["KUNAVO_API_KEY"]

resp = requests.post(
    "https://api.kunavo.com/v1/video/generations",
    headers={"Authorization": f"Bearer {KEY}"},
    json={
        "model": "veo-3",
        "prompt": "A drone shot pulling back from a quiet mountain lake at dawn, mist rising off the water. Cinematic, 24fps, soft golden light.",
        "aspect_ratio": "16:9",
        "resolution": "1080p",
    },
    timeout=600,   # generations take 30s to several minutes
)
resp.raise_for_status()
data = resp.json()
print(data["data"][0]["url"])

duration(秒)用于在按秒计费的模型(Seedance 系列模型和 Wan 2.7)上设置片段时长。Veo 模型会忽略它;每个 Veo 片段都是 8 秒,按视频计费。

响应采用 OpenAI 风格:{ data: [{ url: '...' }] }。URL 是永久的,由 files.kunavo.com 提供——如果需要长期托管,请将其下载一次并保存到自己的存储中。

图像生成视频

使用图像进行锚定通常是获得生产级结果的关键。Veo 3 支持两种图像模式:

  • image_mode: "frame"——单张图像作为第一帧;两张图像作为第一帧和最后一帧。image_url 的默认模式。
  • image_mode: "reference"——最多 3 个风格参考图,用于保持角色/服装一致性,而不会强制指定帧。
image_to_video.py
# image-to-video: pass an image_url to anchor the first frame.
resp = requests.post(
    "https://api.kunavo.com/v1/video/generations",
    headers={"Authorization": f"Bearer {KEY}"},
    json={
        "model": "veo-3",
        "prompt": "She smiles, then walks out of frame to the left",
        "image_url": "https://files.kunavo.com/<your-upload>.jpg",
        "image_mode": "frame",      # one image => first frame
        "aspect_ratio": "9:16",     # vertical, mobile-native
    },
    timeout=600,
)
print(resp.json()["data"][0]["url"])

如果你还没有锚定图像的公开 URL,可以将字节发送到 /v1/files,Kunavo 会将文件托管在 files.kunavo.com 下:

upload_anchor.py
# If you don't have a public URL, upload bytes; Kunavo hosts the file.
with open("anchor.jpg", "rb") as f:
    up = requests.post(
        "https://api.kunavo.com/v1/files",
        headers={"Authorization": f"Bearer {KEY}"},
        files={"file": f},
    )
image_url = up.json()["url"]   # permanent files.kunavo.com URL

Sora 和其他模型

相同的端点结构适用于目录中的所有视频模型——传入相应的模型 slug:

  • veo-3——电影感、1080p,支持图生视频。当前已上线。
  • seedance-2、seedance-2-5——字节跳动模型,角色运动表现非常出色。

OpenAI Sora(sora-2)已列入路线图,目前尚不能在 Kunavo 上调用。由于 /v1/video/generations 与模型无关,它上线当天,上述调用唯一需要修改的是 model 字段;在此之前,Veo 3 是同一端点上的当前可用替代模型。

查看 /models 获取当前模型列表以及每个模型的价格。

使用 Node / TypeScript

veo.mjs
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.KUNAVO_API_KEY,
  baseURL: "https://api.kunavo.com/v1",
});

// /v1/video/generations isn't in OpenAI's SDK shape, but the same auth
// header works — call it with fetch:
const resp = await fetch(
  "https://api.kunavo.com/v1/video/generations",
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${process.env.KUNAVO_API_KEY}`,
    },
    body: JSON.stringify({
      model: "veo-3",
      prompt: "A red origami crane unfolding into a paper plane and flying away through a window",
      resolution: "1080p",
    }),
  },
);
const { data } = await resp.json();
console.log(data[0].url);

定价模式

视频模型按视频或按输出秒数计费,而不是按 token 计费:Veo 模型按视频计费,且每个片段的时长都是 8 秒;Seedance 模型和 Wan 2.7 按秒计费。Kunavo 在 /pricing 上公布每个模型的费率。一个 8 秒 Veo 3 1080p 片段的费用为 $0.42。失败的生成(4xx / 5xx)绝不会收费。

生产检查清单

  • 设置 10 分钟的 HTTP 超时。网关会向上游轮询最多 540 秒;如果模型在此之后仍在处理,则返回 504。重试是一个新任务,每个成功完成的任务都会计费。对于非常长的作业,请改为提交到 /v1/videos 并轮询它返回的任务:带上 Idempotency-Key 请求头后,用同一个幂等键再次提交会返回这个任务,而不会再启动一个新任务。
  • 持久化保存结果 URL。即使 files.kunavo.com 的 URL 是永久的,你的产品也应在自己控制的存储中保留一份副本。
  • 使用退避处理 429。视频模型受 GPU 资源限制,短暂争用是正常现象。如果存在 retry-after 标头,系统会遵守它。
  • 条件允许时按提示词哈希缓存。同一个提示词发送两次,会生成两个片段并计费两次:网关不会复用之前的结果,也不会向模型发送 seed。

问题请发送至:contact@kunavo.com。网关背后的团队会阅读每封邮件,并在 24 小时内回复。