用 REST API 对接 Omni Flash:网页版 AI 视频生成器的接入实战
前言
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:9、9: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 官网登录后的账户页即可获取,复制进代码就能跑起来。
更多推荐


所有评论(0)