星海智算开发文档
模型 API

等待任务并下载结果

将受理、执行、业务终态和网络失败分别处理,避免重复生成。

创建只表示受理

媒体创建接口成功通常返回 HTTP 202、jobId、绝对 jobUrlLocation 指向查询地址,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 错误会停止。生产客户端可对明确可恢复的读取失败按 错误恢复 退避,但不得因此重新提交生成请求。达到本地期限不表示服务端任务已经取消。

本页目录