VIDEO GENERATION / API GUIDE

从一个提示词,
到一条视频。

通过统一的项目和任务接口调用本地 GPU 或 Grok。提交后异步生成,随后查询状态、下载结果。

BASE URLhttps://video-gen.qianyiyule.top/apiHTTPS · JSON

此页无需登录。实际接口、项目和素材需要管理员提供的共享 key。

01 / ACCESS

连接与鉴权

每个 API 请求携带 Authorization: Bearer <key>。key 不放在 URL、提示词或项目字段中。你拿到的是 Studio 访问 key,无需配置 Grok 供应商密钥。

BASH · 先输入 KEY,再检查连接
export STUDIO_URL='https://video-gen.qianyiyule.top'
# 下一行等待输入 key,输入时不会显示;按回车确认。
read -r -s STUDIO_ACCESS_KEY
export STUDIO_ACCESS_KEY

curl -sS "$STUDIO_URL/api/health" \
  -H "Authorization: Bearer $STUDIO_ACCESS_KEY"

正常返回包含 ok: true 和 backends。后端的 state 表示就绪状态。模型探测成功不代表一次新生成已完成。

网页从 登录页 输入相同 key,保存 30 天会话。API 继续使用 Bearer 即可,不必先登录。浏览器应用应同源调用;第三方网页跨域暂未启用,服务端和脚本可直接调用。

成员共享全部项目和操作权限。by 只是显示用的作者名。需要撤销成员访问时,请管理员更换共享 key;旧 key 和旧会话会一起失效。
02 / BACKENDS

选择生成后端

后端 / backend画质 / quality单镜时长使用方式
win-4060ti
本地 Windows GPU
fast · 448p 档
high · 原生分辨率
fast ≤ 10 秒
high ≤ 5 秒
无云端生成费
适合预览和常规生成
grok-cloud
Grok Imagine Video 1.5
high · 720p
ultra · 1080p
1~15 秒
必须是整数
按量计费
必须显式指定 backend

画幅由项目的 aspect 指定:16:9、9:16 或 1:1。实际像素取决于后端和画幅,以任务 params.width / height 为准。不指定画质时,接口默认 high;下面入门示例显式使用本地 fast。

查询 GET /api/backends 获取当前能力。Grok 的 hidden: true 仅表示不自动分配,显式指定仍可使用。费用估算看 capabilities.cost_usd_per_s,最终费用看完成任务的 cost_usd;为空时表示尚无费用记录。

03 / QUICKSTART

生成第一条视频

创建项目→写入镜头→提交生成→查询并下载

入门使用 single_shot 模板,没有人工审核门。其他模板可能需要剧本或关键帧审核,不能照搬无审核的提交过程。

推荐:直接运行 Python 示例

只需要 Python 3,无第三方依赖。脚本会创建项目、生成一个 5 秒镜头、每 10 秒查询状态,完成后下载 MP4 并校验 SHA-256。运行即会提交真实生成任务。

下载 generate_video.py ↓
BASH · 本地 GPU
# 先按“连接与鉴权”设置 STUDIO_ACCESS_KEY。
curl -fsS "$STUDIO_URL/api/guide/example.py" -o generate_video.py
export STUDIO_BACKEND=win-4060ti
export STUDIO_QUALITY=fast
export STUDIO_SECONDS=5
python3 generate_video.py
BASH · 改用 GROK,产生云端费用
export STUDIO_BACKEND=grok-cloud
export STUDIO_QUALITY=high   # 720p;ultra 为 1080p
export STUDIO_SECONDS=5
python3 generate_video.py

可选环境变量:STUDIO_PROMPT 设置提示词,STUDIO_AUTHOR 设置作者名。每次执行会创建一个新项目;连接中断时先查看本地 api-demo-*-request.json 中的 job_id,不要直接重跑脚本。

逐步调用 HTTP 接口(curl)

以下示例在 Bash 中运行,并使用 jq 解析 JSON。

1 · 创建项目
PROJECT="api-demo-$(date +%s)"
curl -sS "$STUDIO_URL/api/projects" \
  -H "Authorization: Bearer $STUDIO_ACCESS_KEY" \
  -H 'Content-Type: application/json' \
  -d "{\"id\":\"$PROJECT\",\"title\":\"我的第一条视频\",\"template\":\"single_shot\",\"aspect\":\"16:9\",\"by\":\"member\"}"
2 · 写入镜头,需要最新 REVISION
REV=$(curl -sS "$STUDIO_URL/api/projects/$PROJECT" \
  -H "Authorization: Bearer $STUDIO_ACCESS_KEY" | jq -r '.revision')

curl -sS -X PUT "$STUDIO_URL/api/projects/$PROJECT/shots" \
  -H "Authorization: Bearer $STUDIO_ACCESS_KEY" \
  -H 'Content-Type: application/json' -H "If-Match: $REV" \
  -d '{"by":"member","shots":[{"no":1,"seconds":5,"prompt":"A quiet lake at sunrise, gentle ripples, slow camera push in. No dialogue, no music."}]}'
3 · 提交任务,返回批次与 JOB ID
REV=$(curl -sS "$STUDIO_URL/api/projects/$PROJECT" \
  -H "Authorization: Bearer $STUDIO_ACCESS_KEY" | jq -r '.revision')
IDEM=$(python3 -c 'import uuid; print(uuid.uuid4())')

curl -sS "$STUDIO_URL/api/projects/$PROJECT/render" \
  -H "Authorization: Bearer $STUDIO_ACCESS_KEY" \
  -H 'Content-Type: application/json' \
  -H "If-Match: $REV" -H "Idempotency-Key: $IDEM" \
  -d '{"shots":[1],"backend":"win-4060ti","quality":"fast","by":"member"}' \
  | tee render-response.json

JOB=$(jq -r '.jobs[0].id' render-response.json)
curl -sS "$STUDIO_URL/api/jobs/$JOB" \
  -H "Authorization: Bearer $STUDIO_ACCESS_KEY"

要用 Grok,只改提交体中的 backend 为 grok-cloud、quality 为 high 或 ultra。相同请求断网重试必须保留相同的 IDEM、请求体和 REV。

04 / INPUTS

图片、首尾帧与中间关键帧

先上传素材,再在镜头中引用返回的逻辑路径。上传使用 multipart,path 只能位于 assets/、blockout/ 或 keyframes/ 下。最大单文件 2 GiB,并校验真实文件格式。

BASH · 上传首帧
REV=$(curl -sS "$STUDIO_URL/api/projects/$PROJECT" \
  -H "Authorization: Bearer $STUDIO_ACCESS_KEY" | jq -r '.revision')
curl -sS "$STUDIO_URL/api/projects/$PROJECT/files" \
  -H "Authorization: Bearer $STUDIO_ACCESS_KEY" -H "If-Match: $REV" \
  -F 'path=keyframes/first.png' -F 'file=@first.png' -F 'by=member'

上传后重新获取项目 revision,再写入镜头。以下是镜头字段示意,各路径都必须先上传:

JSON · GROK 关键帧示例
{
  "no": 1,
  "seconds": 8,
  "prompt": "A smooth camera movement through the scene.",
  "first_frame": "keyframes/first.png",
  "last_frame": "keyframes/last.png",
  "keyframes": [{"frame": "keyframes/middle.png", "at": 4}]
}

本地 H3 支持首帧和首尾帧。中间关键帧目前仅 Grok 支持,最多 4 张,at 必须严格递增且位于镜头起止之间。continue_from 可引用上游镜头编号,从上游选定版本提取承接帧。

PUT /projects/{id}/shots 是镜头列表更新,不要把单个镜头当作增量追加。已有镜头的小改动可用 PATCH /projects/{id}/shots/{no},同样带最新 If-Match。
05 / RESULTS

查询状态与下载结果

生成接口立即返回任务信息,HTTP 连接不会一直等待 GPU。轮询 GET /api/jobs/{job_id},建议间隔 5~10 秒。

status含义处理
queued排队中等待后端空闲;可查全局队列
blocked有前置条件未满足查看 block_reason,处理审核或上游依赖
running / collecting生成中 / 收集视频中继续等待,不重复提交
done结果已登记获取版本文件并下载
failed失败查看 error 和 actions,确认原因后重试
cancelling / cancelled取消中 / 已取消Grok 远端不保证可取消,可能仍产生费用
BASH · 按任务对应的版本下载
curl -sS "$STUDIO_URL/api/projects/$PROJECT/shots" \
  -H "Authorization: Bearer $STUDIO_ACCESS_KEY" > shots-response.json

# 获取 JOB 对应版本的 file 字段,避免误下载其他成员选定的版本。
FILE=$(jq -r --arg job "$JOB" \
  '.shots[].versions[] | select(.job_id == $job) | .file' shots-response.json)
curl -fS "$STUDIO_URL/api/projects/$PROJECT/files/$FILE" \
  -H "Authorization: Bearer $STUDIO_ACCESS_KEY" -o result.mp4

文件接口支持 Range 和 ETag。下载项目当前选定的全部文件可用 GET /api/projects/{id}/manifest,其中 files[].url 相对于 /api,需要拼为 $STUDIO_URL/api + url。

实时事件(SSE)
BASH · 监听项目事件
curl -N -sS "$STUDIO_URL/api/events?project=$PROJECT&after=0" \
  -H "Authorization: Bearer $STUDIO_ACCESS_KEY"

事件带 id、事件类型和 JSON 内容。保存最后一个事件 id,重连时设置 after 或请求头 Last-Event-ID。浏览器原生 EventSource 无法直接设置 Bearer 头,同源网页应使用登录 Cookie。不要把 key 放进 SSE URL。

06 / REFERENCE

接口速查

下表路径均相对于 /api。完整字段可在登录后查看 交互式接口文档 和 OpenAPI JSON。

方法路径用途 / 注意
GET/health · /backends · /templates连接、后端能力、项目模板
GET/projects · /projects/{id}项目列表与详情,读取 revision
POST/projects创建;必填 id / title / template
PUT/projects/{id}/shots镜头列表;If-Match
PATCH/projects/{id}/shots/{no}改提示词等创作字段;If-Match
POST/projects/{id}/files上传;multipart + If-Match
POST/projects/{id}/render生成;If-Match + Idempotency-Key
GET/jobs/{job_id} · /jobs?project={id}任务详情、项目任务列表
GET/batches/{batch_id} · /queue批次与全局队列
POST/jobs/{job_id}/cancel取消,body 可为 {"by":"member"}
POST/jobs/{job_id}/retry按 actions 判断是否可重试;Idempotency-Key
POST/jobs/{job_id}/clone重抽;source_revision、可选 seed;Idempotency-Key
GET/projects/{id}/shots · /projects/{id}/manifest镜头版本与下载清单
GET / HEAD/projects/{id}/files/{path}下载与 Range 分段读取
POST/projects/{id}/shots/{no}/select选版;{"version":1,"by":"member"} + If-Match
GET/projects/{id}/gates · /events审核状态与 SSE

render 可用字段:shots(编号数组或 "all")、backend、quality、versions(如 {"1":2},表示第 1 镜生成两版)、priority、by。多版本会提交多次生成,Grok 相应增加费用。

07 / RECOVERY

错误、并发与重试

HTTP常见原因怎么处理
401未携带 key、key 错误或会话过期检查 Bearer 请求头;网页重新登录
403浏览器来源不允许使用同源网页或服务端调用;Cookie 写请求需要合法 Origin
409revision 过期、状态冲突或幂等 key 用于不同请求重新读取状态,合并修改;同一 key 不能换请求体
413上传过大压缩或拆分文件,单文件不超过 2 GiB
422参数、画质、时长或后端能力不匹配查看 error.details 或 detail 数组,按后端限制修正
423审核门未通过查 gates,并由成员审阅后批准;不要自动绕过审核
428缺少 If-Match获取当前项目 revision 后重新提交
502 / 504入口到服务的连接异常或超时先查任务是否已创建,再决定是否重发
507服务端磁盘空间不足联系管理员处理存储

业务错误通常返回 {"error":{"code":"…","message":"…","details":{}}};参数校验也可能返回 {"detail":[…]}。

一次逻辑操作,一枚幂等 key。 创建生成批次、clone 和 retry 都建议使用 UUID。响应丢失后保留原 key 和请求体再试;确实要生成新版本时才换新 key。幂等键请全局唯一,不要对不同项目复用。

If-Match 是并发保护,填写你刚读取的 revision。它不是身份凭据,也不是幂等键。上传、镜头改动和选版会推进 revision,不能长期固定使用一个数字。