{"record":{"id":"9f02daa4e9bae6e5","repo":"Comfy-Org/ComfyUI","slug":"beeble-job-response-id-completed-without-a-name","errorCode":null,"errorMessage":"Beeble job {response.id} completed without a {name!r} output URL.","messagePattern":"Beeble job (.+?) completed without a (.+?) output URL\\.","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"comfy_api_nodes/nodes_beeble.py","lineNumber":185,"sourceCode":") -> SwitchXStatusResponse:\n    initial = await sync_op(\n        cls,\n        ApiEndpoint(path=\"/proxy/beeble/v1/switchx/generations\", method=\"POST\"),\n        response_model=SwitchXStatusResponse,\n        data=request,\n    )\n    return await poll_op(\n        cls,\n        ApiEndpoint(path=f\"/proxy/beeble/v1/switchx/generations/{initial.id}\"),\n        response_model=SwitchXStatusResponse,\n        status_extractor=lambda r: r.status,\n        progress_extractor=lambda r: r.progress,\n    )\n\n\ndef _require_output_url(response: SwitchXStatusResponse, name: str) -> str:\n    if response.output is None or getattr(response.output, name) is None:\n        raise RuntimeError(f\"Beeble job {response.id} completed without a {name!r} output URL.\")\n    return getattr(response.output, name)\n\n\ndef _alpha_url(response: SwitchXStatusResponse, mode: str) -> str | None:\n    \"\"\"URL of the alpha matte, or None when the mode produces no separate matte.\n\n    'fill' selects the whole frame, so Beeble writes no alpha asset even though the status\n    response still returns a (dangling) signed URL for it — fetching it 403s with S3\n    AccessDenied. The other three modes ('auto', 'custom', 'select') all produce a real,\n    downloadable matte.\n    \"\"\"\n    if mode == \"fill\" or response.output is None:\n        return None\n    return response.output.alpha\n\n\nclass BeebleSwitchXVideoEdit(IO.ComfyNode):\n","sourceCodeStart":167,"sourceCodeEnd":203,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_api_nodes/nodes_beeble.py#L167-L203","documentation":"After the switchX generation job reports completion, the node requires a URL for the expected output asset (by name). If response.output is None or the named field on it is None, the job finished in a state that produced no downloadable asset and the node raises RuntimeError instead of following a dead link.","triggerScenarios":"poll_op on /proxy/beeble/v1/switchx/generations/{id} returns a terminal status whose output object lacks the requested field (e.g. requesting an alpha URL from a mode that did not generate one, or a Beeble server-side partial completion).","commonSituations":"Beeble-side pipeline failure that still marks the job done; requesting an output name not produced by the chosen mode; API schema changes dropping fields.","solutions":["Retry the generation — transient Beeble completion without assets usually succeeds on a second run.","Check the job status response in the Beeble dashboard/API for the actual outputs produced by your mode/parameters.","Verify you requested parameters consistent with the output (e.g. alpha modes other than 'fill' produce a matte).","If persistent, report to Beeble with the job id embedded in the message."],"exampleFix":"# before\nurl = _require_output_url(response, \"video\")  # RuntimeError when asset missing\n\n# after\nfor attempt in range(2):\n    response = run_beeble_job(params)\n    if response.output and getattr(response.output, \"video\", None):\n        break\nurl = response.output.video","handlingStrategy":"retry","validationCode":"if response.status == \"completed\":\n    assert response.output is not None and getattr(response.output, name, None), \"missing asset; retry job\"","typeGuard":"def job_has_output(response, name: str) -> bool:\n    return response.output is not None and getattr(response.output, name, None) is not None","tryCatchPattern":"for attempt in range(3):\n    try:\n        url = _require_output_url(response, name)\n        break\n    except RuntimeError:\n        if attempt == 2:\n            raise\n        response = await run_beeble_job(params)","preventionTips":["Treat 'completed without asset' as transient first; retry once before debugging.","Log the job id from the error for Beeble support.","Confirm the requested output name exists for the chosen mode."],"tags":["beeble","job-polling","missing-output","remote-api","runtime-error"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}