图像与视频生成 API

管理入口 · OpenAPI 规格

基础地址:https://api.douchengjiu.com。所有业务请求携带 Authorization: Bearer YOUR_API_KEY。API Key 放在调用程序的服务端,不嵌入公开网页。

调用流程

上传参考素材(可选) → 提交生成任务(返回 202) → 每 5–10 秒查询状态 → 完成后凭相同 API Key 下载结果。

方法与路径说明
GET /v1/models模型和工作流版本
POST /v1/files?filename=reference.png上传原始文件字节,返回 file_id。不是 multipart 表单。
POST /v1/images/generations千问生图
POST /v1/videos/generationsH3 文生视频 / 多参考视频
GET /v1/tasks/{id}任务状态、实际参数、结果链接
GET /v1/tasks当前调用方最近 100 个任务
GET /v1/files/{id}/content下载参考文件或生成结果,需要鉴权
POST /v1/tasks/{id}/cancel仅取消尚未领取的排队任务
GET /v1/status算力机在线状态和全局排队数量

千问生图

{
  "model": "qwen-image-2512-bf16",
  "prompt": "清晨的竹林,一只白色陶瓷茶杯放在石桌上,写实摄影",
  "width": 1024, "height": 1024,
  "steps": 50, "cfg": 4, "seed": 12345
}

H3 文生视频

{
  "model": "minimax-h3-t2v",
  "prompt": "A ceramic cup on a wooden table. Morning light, slow camera move. Gentle birdsong, no dialogue or text.",
  "width": 768, "height": 512, "duration": 5,
  "steps": 20, "sage_attention": "auto"
}

H3 完整 BF16 多参考

{
  "model": "minimax-h3-ref2va-bf16",
  "prompt": "The character in <Picture 1> follows the movement in <Video 1>. Natural movement, stable identity, no text.",
  "reference_images": ["file_上传图片返回的编号"],
  "reference_videos": ["file_上传视频返回的编号"],
  "reference_audios": [],
  "include_reference_video_audio": false,
  "width": 768, "height": 512, "duration": 5,
  "steps": 20, "ref_image_size": "max", "sage_attention": "auto"
}

最多 9 张图片、3 段参考视频、3 段音频。参考视频为 2–15 秒,自动取 24fps,最大 4K;独立参考音频最多 30 秒。需要参考视频原声时启用 include_reference_video_audio,素材必须含音轨。ref_image_size=max 保留原完整 BF16 工作流设置,速度较慢;match 可减少参考图处理量。T2V 使用现有 INT8 模型及 NVFP4 文本编码器,Ref2VA 使用完整 BF16 主模型和文本编码器。SageAttention 适用于视频接口。

Python 示例

import os, time, requests
BASE = "https://api.douchengjiu.com"
headers = {"Authorization": "Bearer " + os.environ["DCJ_API_KEY"]}
r = requests.post(BASE + "/v1/images/generations",
    headers={**headers, "Idempotency-Key": "your-unique-request-id"},
    json={"prompt": "一只白色陶瓷茶杯,写实摄影"}, timeout=30)
r.raise_for_status()
task_id = r.json()["id"]
while True:
    r = requests.get(BASE + "/v1/tasks/" + task_id, headers=headers, timeout=30)
    r.raise_for_status()
    task = r.json()
    if task["status"] in ("succeeded", "failed", "cancelled", "needs_attention"):
        break
    time.sleep(5)
if task["status"] != "succeeded":
    raise RuntimeError(task.get("error") or task["status"])
with requests.get(task["outputs"][0]["download_url"], headers=headers,
                  stream=True, timeout=120) as result:
    result.raise_for_status()
    with open("result.png", "wb") as file:
        for chunk in result.iter_content(1024 * 1024):
            file.write(chunk)

# 参考素材上传:
# with open("reference.png", "rb") as file:
#     r = requests.post(BASE + "/v1/files", params={"filename": "reference.png"},
#                       headers=headers, data=file, timeout=120)
#     r.raise_for_status()
#     file_id = r.json()["id"]

参数与运行约定