前言

Omni Flash 是一款 online 的网页版 AI 视频生成器,基于 Google 视频 AI,支持 text-to-video、image-to-video,可输出 16:9 / 9:16 比例,适合广告、社媒短视频、产品演示等场景。除了在网页里直接出片,它还开放了一套简洁的 REST API,方便把视频/图片生成能力嵌进自己的服务里。

本文从技术角度走一遍完整对接流程:拿 Key、鉴权、提交任务、轮询结果,并给出可直接运行的 Python / Node.js 封装。

一、准备工作:获取 API Key

接口采用 Bearer Token 鉴权,所有请求都要带一个 sk- 开头的密钥。

去官网 Omni Flash 登录后,在账户页(Account / API Keys)即可生成并复制你的密钥,形如:

sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

请求头统一带上:

Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

如果 Key 缺失或无效,服务端会直接返回 HTTP 401。

二、支持的模型

model_id 只接受以下取值,选错会被拒绝:

MODEL_ID 能力 输出
omni-flash Omni Flash(文/图生视频) video_url
omni-pro Omni Pro(文/图生视频) video_url
seedance-2 Seedance 2.0(文/图生视频) video_url
gpt-image-2 ChatGPT Image 2(文/图生图) image_url
nano-banana-2 Nano Banana 2(文/图生图) image_url

视频类模型返回 video_url,图片类模型返回 image_url,下游解析时要按模型区分。

三、创建任务

提交一个生成请求,接口会立即返回 task_id,后续靠它轮询。

接口

POST https://omniflash.net/api/v1/tasks/create

请求体

{
  "model_id": "gpt-image-2",
  "prompt": "a serene zen garden at sunrise, ultra detailed",
  "image_urls": [],
  "aspect_ratio": "16:9"
}

字段说明:

  • model_id(必填):上表中的模型 ID。
  • prompt(必填):文本描述。
  • image_urls(可选):源图地址数组,做图生视频/图生图时传入。
  • aspect_ratio(可选):输出比例,如 16:99:16

cURL 示例

curl -X POST https://omniflash.net/api/v1/tasks/create \
  -H "Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model_id": "gpt-image-2",
    "prompt": "a serene zen garden at sunrise",
    "aspect_ratio": "16:9"
  }'

响应

{
  "code": 200,
  "msg": "提交成功,等待生成",
  "data": {
    "task_id": "abcdef123456",
    "request_id": "kie_xxxxxxxxxxxx",
    "credits": 15
  }
}

积分在提交时即扣除,任务失败会自动退还,所以不用担心扣了钱却没出片。

四、轮询任务结果

拿到 task_id 后,轮询直到 task_status 变成 3(成功)或 4(失败)。

接口

GET https://omniflash.net/api/v1/tasks/{task_id}

cURL 示例

curl https://omniflash.net/api/v1/tasks/abcdef123456 \
  -H "Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

响应

{
  "code": 200,
  "msg": "ok",
  "data": {
    "task_id": "abcdef123456",
    "task_status": 3,
    "task_type": "image",
    "model_id": "gpt-image-2",
    "image_url": "https://your-cdn.com/...",
    "video_url": null,
    "audio_url": null,
    "credits": 15,
    "created_at": 1730000000
  }
}

task_status 状态机:

  • 1 排队中
  • 2 生成中
  • 3 成功(从 video_url / image_url 取结果)
  • 4 失败(看 msg

五、Python 封装(提交 + 轮询一把梭)

import time
import requests

BASE = "https://omniflash.net"
API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}


def create_task(model_id, prompt, image_urls=None, aspect_ratio="16:9"):
    payload = {
        "model_id": model_id,
        "prompt": prompt,
        "image_urls": image_urls or [],
        "aspect_ratio": aspect_ratio,
    }
    r = requests.post(f"{BASE}/api/v1/tasks/create", json=payload, headers=HEADERS)
    r.raise_for_status()
    data = r.json()["data"]
    return data["task_id"]


def wait_for_result(task_id, interval=5, timeout=600):
    deadline = time.time() + timeout
    while time.time() < deadline:
        r = requests.get(f"{BASE}/api/v1/tasks/{task_id}", headers=HEADERS)
        r.raise_for_status()
        data = r.json()["data"]
        status = data["task_status"]
        if status == 3:
            return data.get("video_url") or data.get("image_url")
        if status == 4:
            raise RuntimeError(f"任务失败: {data.get('msg')}")
        time.sleep(interval)
    raise TimeoutError("轮询超时")


if __name__ == "__main__":
    tid = create_task("omni-flash", "a cat surfing on a rainbow wave")
    url = wait_for_result(tid)
    print("生成结果:", url)

六、Node.js 封装

const BASE = "https://omniflash.net";
const API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const headers = {
  Authorization: `Bearer ${API_KEY}`,
  "Content-Type": "application/json",
};

async function createTask(modelId, prompt, opts = {}) {
  const res = await fetch(`${BASE}/api/v1/tasks/create`, {
    method: "POST",
    headers,
    body: JSON.stringify({
      model_id: modelId,
      prompt,
      image_urls: opts.imageUrls || [],
      aspect_ratio: opts.aspectRatio || "16:9",
    }),
  });
  const json = await res.json();
  return json.data.task_id;
}

async function waitForResult(taskId, interval = 5000, timeout = 600000) {
  const deadline = Date.now() + timeout;
  while (Date.now() < deadline) {
    const res = await fetch(`${BASE}/api/v1/tasks/${taskId}`, { headers });
    const { data } = await res.json();
    if (data.task_status === 3) return data.video_url || data.image_url;
    if (data.task_status === 4) throw new Error(`任务失败: ${data.msg}`);
    await new Promise((r) => setTimeout(r, interval));
  }
  throw new Error("轮询超时");
}

(async () => {
  const tid = await createTask("omni-flash", "a cat surfing on a rainbow wave");
  console.log("生成结果:", await waitForResult(tid));
})();

七、错误处理约定

  • code: 200 —— 成功。
  • code: 0 —— 业务失败,具体原因看 msg 字段。
  • HTTP 401 —— Key 无效或缺失,检查 Authorization 头。

实际接入时建议把 code !== 200 统一抛异常,并对网络层做重试。

小结

整套对接非常轻量:一个 POST 提交任务、一个 GET 轮询结果,鉴权就一个 Bearer Token。因为 Omni Flash 本身是网页版 online 服务,你既可以在浏览器里手动出片,也可以用上面的封装把文/图生视频能力接进自己的后端或自动化流水线。Key 在 Omni Flash 官网登录后的账户页即可获取,复制进代码就能跑起来。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐