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
- Re-submit the task once; transient LTX render failures are the most frequent cause.
- Inspect job.status semantics — if the poll returned 'failed', simplify the prompt and verify settings pass _v25_validate_settings.
- Check LTX service status and your account's task history for the failed job id (in the error context).
- 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
- Retry once before escalating; most empty-result jobs are transient.
- Validate settings client-side (_v25_validate_settings) so server rejections stay rare.
- Keep the job id available for LTX dashboard lookup.
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
- Kling 3.0 Turbo task finished without a video output: {respo
- Krea 2 job {job.job_id} completed without any image URLs.
- Minimum supported duration for Seedance 1.5 Pro is 4 seconds
- --{i} is not allowed in the prompt, use the appropriated wid
- Reference video {i} is too short: {dur:.1f}s. Minimum durati
AI-assisted analysis of Comfy-Org/ComfyUI@1c6d8d45b3 (2026-08-14).
Data as JSON: /api/errors/e4b95bca9cd13f5a.
Report an issue: GitHub.