calesthio/OpenMontage · error · RuntimeError

Jimeng task done but no video_url: {data}

Error message

Jimeng task done but no video_url: {data}

What it means

Raised when the Jimeng poll (CVSync2AsyncGetResult) reports status='done' but data.video_url is absent. 'done' is treated as terminal success and the video URL is expected at data.video_url; a completion without a URL means the artifact was not published where expected (or lives under a different key), so the tool raises with the full response embedded rather than returning None.

Source

Thrown at tools/video/jimeng_video.py:318

        body = json.dumps({
            "req_key": _REQ_KEY_VIDEO,
            "task_id": task_id,
            "req_json": json.dumps({"return_url": True}),
        }, ensure_ascii=False).encode("utf-8")

        deadline = time.time() + timeout_seconds
        while time.time() < deadline:
            time.sleep(poll_interval)
            headers = self._sign("POST", "/", query, {}, body, ak, sk)
            url = f"https://{_HOST}/?{urllib.parse.urlencode(sorted(query.items()))}"
            resp = requests.post(url, data=body, headers=headers, timeout=30)
            data = self._json_or_raise(resp)
            self._check_code(resp.status_code, data)
            status = (data.get("data") or {}).get("status", "")
            if status == "done":
                video_url = (data.get("data") or {}).get("video_url")
                if not video_url:
                    raise RuntimeError(f"Jimeng task done but no video_url: {data}")
                return video_url
            if status in ("not_found", "expired"):
                raise RuntimeError(f"Jimeng task invalid: status={status}")
        raise TimeoutError(f"Jimeng task {task_id} did not finish within {timeout_seconds}s")

    @staticmethod
    def _sign(
        method: str, path: str, query_params: dict,
        headers: dict, body: bytes, ak: str, sk: str,
    ) -> dict:
        now = datetime.now(timezone.utc)
        x_date = now.strftime("%Y%m%dT%H%M%SZ")
        short_date = x_date[:8]

        body_hash = hashlib.sha256(body).hexdigest()
        headers = dict(headers)
        headers["Host"] = _HOST
        headers["X-Date"] = x_date

View on GitHub (pinned to 95e1c3d0ab)

Solutions

  1. Inspect the {data} in the error to locate the actual result field; if it moved, the tool's extraction needs updating.
  2. Poll promptly — don't leave long gaps between submit and result retrieval, since artifacts can age out.
  3. Resubmit the task; publication-after-render failures usually clear on a fresh run.
  4. Check for an OpenMontage patch if Jimeng changed the video_url contract.
Defensive patterns

Strategy: retry

Try / catch

try:
    result = jimeng_video(inputs)
except RuntimeError as e:
    if "no video_url" in str(e):
        result = jimeng_video(inputs)  # one retry: publication-after-render race
    else:
        raise

Prevention

When it happens

Trigger: Poll returns status 'done' while data lacks video_url — expired/aged-out CDN artifact, schema drift moving the URL (e.g. to a list of outputs), or a partial success where transcoding finished but upload failed server-side.

Common situations: Polling too long after completion (Jimeng result URLs can expire); multi-output generations returning video_url list or a different field name; provider-side publication failures after render; API revision changing the result shape.

Related errors


AI-assisted analysis of calesthio/OpenMontage@95e1c3d0ab (2026-08-15). Data as JSON: /api/errors/67d094e2c48067e0. Report an issue: GitHub.