Comfy-Org/ComfyUI · error · RuntimeError

LTX job {job.id} completed without a video URL.

Error message

LTX job {job.id} completed without a video URL.

What it means

Raised inside the LTX v2.5 submit-and-poll helper when a job reaches a finished state but job.result or job.result.video_url is falsy. The LTX task completed without producing a downloadable video, so the node cannot build a video output.

Source

Thrown at comfy_api_nodes/nodes_ltxv.py:78

    result: Ltx25JobResult | None = Field(None)


async def _v25_submit_and_poll(cls: type[IO.ComfyNode], route: str, data: BaseModel) -> IO.NodeOutput:
    submit = await sync_op(
        cls,
        ApiEndpoint(f"/proxy/ltx/v2/{route}", "POST"),
        response_model=Ltx25SubmitResponse,
        data=data,
        max_retries=1,
    )
    job = await poll_op(
        cls,
        ApiEndpoint(f"/proxy/ltx/v2/{route}/{submit.id}"),
        response_model=Ltx25JobStatusResponse,
        status_extractor=lambda r: r.status,
    )
    if not job.result or not job.result.video_url:
        raise RuntimeError(f"LTX job {job.id} completed without a video URL.")
    return IO.NodeOutput(await download_url_to_video_output(job.result.video_url, cls=cls))


PRICE_BADGE = IO.PriceBadge(
    depends_on=IO.PriceBadgeDepends(widgets=["model", "duration", "resolution"]),
    expr="""
    (
      $prices := {
        "ltx-2 (pro)": {"1920x1080":0.06,"2560x1440":0.12,"3840x2160":0.24},
        "ltx-2 (fast)": {"1920x1080":0.04,"2560x1440":0.08,"3840x2160":0.16}
      };
      $modelPrices := $lookup($prices, $lowercase(widgets.model));
      $pps := $lookup($modelPrices, widgets.resolution);
      {"type":"usd","usd": $pps * widgets.duration}
    )
    """,
)

View on GitHub (pinned to 1c6d8d45b3)

Solutions

  1. Re-submit the task once; transient LTX render failures are the most frequent cause.
  2. Inspect job.status semantics — if the poll returned 'failed', simplify the prompt and verify settings pass _v25_validate_settings.
  3. Check LTX service status and your account's task history for the failed job id (in the error context).
  4. Update comfy_api_nodes if the failure is consistent across prompts (response-model drift).
Defensive patterns

Strategy: retry

Type guard

def ltx_job_has_video(job: Ltx25JobStatusResponse) -> bool:
    return bool(job.result and job.result.video_url)

Try / catch

for attempt in range(2):
    try:
        return await _v25_submit_and_poll(cls, route, data)
    except RuntimeError as e:
        if attempt == 0 and "without a video URL" in str(e):
            continue  # transient LTX render failure
        raise

Prevention

When it happens

Trigger: _v25_submit_and_poll polling /proxy/ltx/v2/<route>/<id> ends with an Ltx25JobStatusResponse whose status is terminal but result.video_url is null/missing — server-side render failure, safety rejection, or truncated job record. Affects all v2.5 routes (text-to-video, image-to-video, audio-to-video).

Common situations: LTX render failing server-side under load; prompt flagged; job record shape changed after an API update so video_url lands elsewhere; rare cases where the poll's terminal status is 'failed' rather than 'succeeded'.

Related errors


AI-assisted analysis of Comfy-Org/ComfyUI@1c6d8d45b3 (2026-08-14). Data as JSON: /api/errors/e4b95bca9cd13f5a. Report an issue: GitHub.