从一个提示词,
到一条视频。
通过统一的项目和任务接口调用本地 GPU 或 Grok。提交后异步生成,随后查询状态、下载结果。
https://video-gen.qianyiyule.top/apiHTTPS · JSON此页无需登录。实际接口、项目和素材需要管理员提供的共享 key。
连接与鉴权
每个 API 请求携带 Authorization: Bearer <key>。key 不放在 URL、提示词或项目字段中。你拿到的是 Studio 访问 key,无需配置 Grok 供应商密钥。
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 和旧会话会一起失效。选择生成后端
| 后端 / backend | 画质 / quality | 单镜时长 | 使用方式 |
|---|---|---|---|
win-4060ti本地 Windows GPU | fast · 448p 档high · 原生分辨率 | fast ≤ 10 秒 high ≤ 5 秒 | 无云端生成费 适合预览和常规生成 |
grok-cloudGrok Imagine Video 1.5 | high · 720pultra · 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;为空时表示尚无费用记录。
生成第一条视频
入门使用 single_shot 模板,没有人工审核门。其他模板可能需要剧本或关键帧审核,不能照搬无审核的提交过程。
推荐:直接运行 Python 示例
只需要 Python 3,无第三方依赖。脚本会创建项目、生成一个 5 秒镜头、每 10 秒查询状态,完成后下载 MP4 并校验 SHA-256。运行即会提交真实生成任务。
下载 generate_video.py ↓# 先按“连接与鉴权”设置 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.pyexport 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。
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\"}"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."}]}'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。
图片、首尾帧与中间关键帧
先上传素材,再在镜头中引用返回的逻辑路径。上传使用 multipart,path 只能位于 assets/、blockout/ 或 keyframes/ 下。最大单文件 2 GiB,并校验真实文件格式。
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,再写入镜头。以下是镜头字段示意,各路径都必须先上传:
{
"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。查询状态与下载结果
生成接口立即返回任务信息,HTTP 连接不会一直等待 GPU。轮询 GET /api/jobs/{job_id},建议间隔 5~10 秒。
| status | 含义 | 处理 |
|---|---|---|
queued | 排队中 | 等待后端空闲;可查全局队列 |
blocked | 有前置条件未满足 | 查看 block_reason,处理审核或上游依赖 |
running / collecting | 生成中 / 收集视频中 | 继续等待,不重复提交 |
done | 结果已登记 | 获取版本文件并下载 |
failed | 失败 | 查看 error 和 actions,确认原因后重试 |
cancelling / cancelled | 取消中 / 已取消 | Grok 远端不保证可取消,可能仍产生费用 |
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)
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。
接口速查
下表路径均相对于 /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 相应增加费用。
错误、并发与重试
| HTTP | 常见原因 | 怎么处理 |
|---|---|---|
| 401 | 未携带 key、key 错误或会话过期 | 检查 Bearer 请求头;网页重新登录 |
| 403 | 浏览器来源不允许 | 使用同源网页或服务端调用;Cookie 写请求需要合法 Origin |
| 409 | revision 过期、状态冲突或幂等 key 用于不同请求 | 重新读取状态,合并修改;同一 key 不能换请求体 |
| 413 | 上传过大 | 压缩或拆分文件,单文件不超过 2 GiB |
| 422 | 参数、画质、时长或后端能力不匹配 | 查看 error.details 或 detail 数组,按后端限制修正 |
| 423 | 审核门未通过 | 查 gates,并由成员审阅后批准;不要自动绕过审核 |
| 428 | 缺少 If-Match | 获取当前项目 revision 后重新提交 |
| 502 / 504 | 入口到服务的连接异常或超时 | 先查任务是否已创建,再决定是否重发 |
| 507 | 服务端磁盘空间不足 | 联系管理员处理存储 |
业务错误通常返回 {"error":{"code":"…","message":"…","details":{}}};参数校验也可能返回 {"detail":[…]}。
If-Match 是并发保护,填写你刚读取的 revision。它不是身份凭据,也不是幂等键。上传、镜头改动和选版会推进 revision,不能长期固定使用一个数字。