OmniVideo API 对接实战:一套 REST 接口统一调度多模型 AI 视频与图像生成
前言
在做内容生产、营销素材或多媒体应用时,我们经常要把"文本/图片 → 视频"和"文本/图片 → 图片"的生成能力接入到自己的服务里。OmniVideo 提供了一套统一的 REST API:用同一套接口就能调度多个底层模型(视频与图像两类),整体走异步任务模式。本文从工程角度梳理完整的对接流程——拿 Key、建任务、轮询结果、错误处理,并给出可直接运行的 Python 代码。
文中用到的 API Key 需要登录官网获取:注册登录后在账户页即可生成。官网地址:Omni Video ,登录后在账户 / API 页面拿到形如 sk-xxxx 的密钥。
一、准备工作:获取 API Key
所有请求都走 Bearer Token 鉴权。登录 Omni Video 账户后,在 API 页面生成密钥,请求头格式为:
Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
请求基础地址(Base URL):
https://omnivideo.net/api/v1
二、支持的模型
接口通过 model_id 切换底层模型,目前覆盖视频与图像两类:
| model_id | 能力 | 输出 |
|---|---|---|
| omni-flash | 文/图生视频 | video_url |
| omni-pro | 文/图生视频 | video_url |
| seedance-2 | 文/图生视频 | video_url |
| gpt-image-2 | 文/图生图 | image_url |
| nano-banana-2 | 文/图生图 | image_url |
三、核心接口
整个生成是异步任务模型:先提交任务拿到 task_id,再轮询查询结果。
3.1 创建任务
POST /api/v1/tasks/create
请求体字段:
- model_id(必填):模型标识
- prompt(必填):生成描述
- image_urls(可选):输入图片数组,用于图生图 / 图生视频
- aspect_ratio(可选):画面比例,如 16:9
请求示例:
curl -X POST https://omnivideo.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, ultra detailed",
"image_urls": [],
"aspect_ratio": "16:9"
}'
返回示例:
{
"code": 200,
"msg": "提交成功,等待生成",
"data": {
"task_id": "abcdef123456",
"request_id": "kie_xxxxxxxxxxxx",
"credits": 15
}
}
提交即扣除积分(credits),任务失败会自动退还,这点对成本控制比较友好。
3.2 查询任务
GET /api/v1/tasks/{task_id}
curl https://omnivideo.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 | 排队中 queued |
| 2 | 生成中 running |
| 3 | 成功 success |
| 4 | 失败 failed |
视频模型取 video_url,图像模型取 image_url。
四、完整对接代码(Python)
把“建任务 + 轮询”封装成一个工具函数,开箱即用:
import time
import requests
BASE_URL = "https://omnivideo.net/api/v1"
API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 登录官网获取
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
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,
}
resp = requests.post(f"{BASE_URL}/tasks/create", json=payload,
headers=HEADERS, timeout=30)
resp.raise_for_status()
data = resp.json()
if data.get("code") != 200:
raise RuntimeError("创建任务失败: " + str(data.get("msg")))
return data["data"]["task_id"]
def wait_result(task_id, interval=3, timeout=600):
deadline = time.time() + timeout
while time.time() < deadline:
resp = requests.get(f"{BASE_URL}/tasks/{task_id}",
headers=HEADERS, timeout=30)
resp.raise_for_status()
data = resp.json()["data"]
status = data["task_status"]
if status == 3:
return data.get("video_url") or data.get("image_url")
if status == 4:
raise RuntimeError("任务生成失败,积分将自动退还")
time.sleep(interval)
raise TimeoutError("轮询超时")
if __name__ == "__main__":
tid = create_task(
model_id="omni-flash",
prompt="a cinematic drone shot over a misty mountain valley at dawn",
aspect_ratio="16:9",
)
print("task_id:", tid)
url = wait_result(tid)
print("生成结果:", url)
五、错误处理要点
- code 为 200 表示成功,code 为 0 表示业务失败,需读取 msg 定位原因;
- HTTP 401 通常是 Key 无效或没带上 Authorization 头;
- 轮询要设置最大超时与退避间隔,避免空转打满频率;
- 图生视频 / 图生图务必保证 image_urls 是可公网访问的直链。
六、小结
OmniVideo 的接口设计是典型的“提交 - 轮询”异步模型:字段精简、模型可通过 model_id 热切换,接入成本很低,几十行代码就能跑通文 / 图生视频和文 / 图生图。需要 Key 的话,登录 Omni Video 在账户页生成即可,把上面的 Python 封装改改 prompt 和 model_id 就能集成进自己的业务。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐




所有评论(0)