calesthio/OpenMontage · error · RuntimeError

Jimeng submit returned no task_id: {data}

Error message

Jimeng submit returned no task_id: {data}

What it means

Raised when the Jimeng (Volcengine CVSync2AsyncSubmitTask) submit call succeeds at the HTTP and code level but the response's data.task_id is missing. The async flow needs the task_id to poll CVSync2AsyncGetResult; without it the tool raises RuntimeError with the full response body so you can see what came back instead.

Source

Thrown at tools/video/jimeng_video.py:290

            "seed": int(inputs.get("seed", -1)),
        }
        if operation == "image_to_video" and inputs.get("image_url"):
            payload["image_urls"] = [inputs["image_url"]]
        return payload

    def _submit_task(self, payload: dict[str, Any], *, ak: str, sk: str) -> str:
        import requests

        query = {"Action": "CVSync2AsyncSubmitTask", "Version": _API_VERSION}
        body = json.dumps(payload, ensure_ascii=False).encode("utf-8")
        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)
        task_id = data.get("data", {}).get("task_id")
        if not task_id:
            raise RuntimeError(f"Jimeng submit returned no task_id: {data}")
        return task_id

    def _poll_task(
        self, task_id: str, *, ak: str, sk: str,
        poll_interval: float, timeout_seconds: int,
    ) -> str:
        import requests

        query = {"Action": "CVSync2AsyncGetResult", "Version": _API_VERSION}
        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)

View on GitHub (pinned to 95e1c3d0ab)

Solutions

  1. Inspect the {data} in the error message to see the actual envelope and any status/message fields inside data.
  2. Verify the Volcengine account has Jimeng video generation enabled and is not out of quota.
  3. Confirm access key / secret key pair is valid and the system clock is in sync (signature includes timestamps).
  4. Update OpenMontage or check Jimeng docs if the response contract (data.task_id) changed.
Defensive patterns

Strategy: try-catch

Validate before calling

import os

for var in ("JIMENG_ACCESS_KEY", "JIMENG_SECRET_KEY"):
    if not os.environ.get(var):
        raise RuntimeError(f"{var} not set — Jimeng submit will fail")

Try / catch

try:
    result = jimeng_video(inputs)
except RuntimeError as e:
    if "no task_id" in str(e):
        # inspect embedded body; do not blind-retry a contract/auth problem
        raise ProviderContractError(str(e)) from e
    raise

Prevention

When it happens

Trigger: POST to CVSync2AsyncSubmitTask returns JSON without data.task_id — e.g. req_key not matching a valid video capability, signature/canonical-request issues that pass code checks but route wrong, or an API revision changing the response envelope.

Common situations: Invalid or outdated _REQ_KEY_VIDEO after Jimeng API updates; a signing bug (HMAC of body/query) causing a structured-but-empty data object; account not entitled to the video generation capability, returning an error shape the code check does not recognize.

Related errors


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