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_dateView on GitHub (pinned to 95e1c3d0ab)
Solutions
- Inspect the {data} in the error to locate the actual result field; if it moved, the tool's extraction needs updating.
- Poll promptly — don't leave long gaps between submit and result retrieval, since artifacts can age out.
- Resubmit the task; publication-after-render failures usually clear on a fresh run.
- 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
- Collect results promptly after submit; don't let hours pass before polling completes.
- Download the returned video_url immediately and cache it locally — Jimeng URLs can expire.
- Report recurring result-shape drift with the embedded response payload.
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
- TokenHub task {task_id} completed but no data.url: {data}
- Jimeng submit returned no task_id: {data}
- Prediction {prediction_id} reported '{last_status}' but retu
- Doubao submit succeeded but did not return data.task_id
- Doubao task completed but did not return data.audio_url
AI-assisted analysis of calesthio/OpenMontage@95e1c3d0ab (2026-08-15).
Data as JSON: /api/errors/67d094e2c48067e0.
Report an issue: GitHub.