基础地址: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/generations | H3 文生视频 / 多参考视频 |
| 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
}{
"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"
}{
"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 适用于视频接口。
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"]
actual_duration,帧率 24fps。短测试和低采样步数只用于连通性检查,不代表正式画质。