模型 API
等待任务并下载结果
将受理、执行、业务终态和网络失败分别处理,避免重复生成。
创建只表示受理
媒体创建接口成功通常返回 HTTP 202、jobId、绝对 jobUrl。Location 指向查询地址,Retry-After 或正文中的轮询建议控制查询节奏。
保存原任务 ID、查询地址和本次业务幂等键。支持 Idempotency-Key 的操作使用稳定业务键;同一业务动作的重试必须保持身份、正文和键一致。开始新业务动作才使用新键。
按状态推进
| 状态 | 客户端处理 |
|---|---|
queued | 继续等待,显示排队状态,不承诺完成时间。 |
running | 显示执行状态;服务返回阶段信息时使用 stage / stageMessage。 |
succeeded | 读取 outputs[],下载每个需要的输出。 |
failed | 停止轮询,读取错误和可重试标志;不自动再次创建。 |
历史 canceled | 停止轮询;公开 API 当前不提供用户取消任务操作。 |
查询 HTTP 200 也可能是失败任务。Account API Key 当前没有独立的媒体 Job SSE 端点,不能使用应用 Runtime 的事件地址替代。
有界轮询示例(Python 标准库)
把创建响应保存为 create.json。此脚本只查询原任务,不创建新任务;下载第一项输出到 result.bin。真实格式以响应 mimeType 为准。
import json
import os
import time
import urllib.parse
import urllib.request
base = os.environ["JUSP_BASE_URL"].rstrip("/")
origin = urllib.parse.urlsplit(base)
key = os.environ["JUSP_API_KEY"]
with open("create.json", encoding="utf-8") as file:
created = json.load(file)
class NoRedirect(urllib.request.HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
opener = urllib.request.build_opener(NoRedirect)
def read(url):
target = urllib.parse.urlsplit(url)
if (target.scheme, target.netloc) != (origin.scheme, origin.netloc):
raise ValueError("拒绝向非 API 来源发送凭据")
request = urllib.request.Request(url, headers={"Authorization": "Bearer " + key})
return opener.open(request, timeout=60)
deadline = time.monotonic() + 1800
while time.monotonic() < deadline:
with read(created["jobUrl"]) as response:
job = json.load(response)
if job["status"] == "succeeded":
output = job["outputs"][0]
with read(output["contentUrl"]) as response, open("result.bin", "wb") as file:
total = 0
while chunk := response.read(1024 * 1024):
total += len(chunk)
if total > 1024 * 1024 * 1024:
raise ValueError("输出超过本示例 1 GiB 下载预算")
file.write(chunk)
break
if job["status"] in {"failed", "canceled"}:
raise RuntimeError(f"任务结束:{job.get('errorCode', job['status'])}")
delay = max(1, min(60, int(job.get("retryAfterSeconds") or job.get("refreshAfterSeconds") or 3)))
time.sleep(min(delay, max(0, deadline - time.monotonic())))
else:
raise TimeoutError("本地等待结束;保留原 jobUrl,稍后继续查询")示例遇到 HTTP 错误会停止。生产客户端可对明确可恢复的读取失败按 错误恢复 退避,但不得因此重新提交生成请求。达到本地期限不表示服务端任务已经取消。