Comfy-Org/ComfyUI · error · RuntimeError

Beeble job {response.id} completed without a {name!r} output

Error message

Beeble job {response.id} completed without a {name!r} output URL.

What it means

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.

Source

Thrown at comfy_api_nodes/nodes_beeble.py:185

) -> SwitchXStatusResponse:
    initial = await sync_op(
        cls,
        ApiEndpoint(path="/proxy/beeble/v1/switchx/generations", method="POST"),
        response_model=SwitchXStatusResponse,
        data=request,
    )
    return await poll_op(
        cls,
        ApiEndpoint(path=f"/proxy/beeble/v1/switchx/generations/{initial.id}"),
        response_model=SwitchXStatusResponse,
        status_extractor=lambda r: r.status,
        progress_extractor=lambda r: r.progress,
    )


def _require_output_url(response: SwitchXStatusResponse, name: str) -> str:
    if response.output is None or getattr(response.output, name) is None:
        raise RuntimeError(f"Beeble job {response.id} completed without a {name!r} output URL.")
    return getattr(response.output, name)


def _alpha_url(response: SwitchXStatusResponse, mode: str) -> str | None:
    """URL of the alpha matte, or None when the mode produces no separate matte.

    'fill' selects the whole frame, so Beeble writes no alpha asset even though the status
    response still returns a (dangling) signed URL for it — fetching it 403s with S3
    AccessDenied. The other three modes ('auto', 'custom', 'select') all produce a real,
    downloadable matte.
    """
    if mode == "fill" or response.output is None:
        return None
    return response.output.alpha


class BeebleSwitchXVideoEdit(IO.ComfyNode):

View on GitHub (pinned to 1c6d8d45b3)

Solutions

  1. Retry the generation — transient Beeble completion without assets usually succeeds on a second run.
  2. Check the job status response in the Beeble dashboard/API for the actual outputs produced by your mode/parameters.
  3. Verify you requested parameters consistent with the output (e.g. alpha modes other than 'fill' produce a matte).
  4. If persistent, report to Beeble with the job id embedded in the message.

Example fix

# before
url = _require_output_url(response, "video")  # RuntimeError when asset missing

# after
for attempt in range(2):
    response = run_beeble_job(params)
    if response.output and getattr(response.output, "video", None):
        break
url = response.output.video
Defensive patterns

Strategy: retry

Validate before calling

if response.status == "completed":
    assert response.output is not None and getattr(response.output, name, None), "missing asset; retry job"

Type guard

def job_has_output(response, name: str) -> bool:
    return response.output is not None and getattr(response.output, name, None) is not None

Try / catch

for attempt in range(3):
    try:
        url = _require_output_url(response, name)
        break
    except RuntimeError:
        if attempt == 2:
            raise
        response = await run_beeble_job(params)

Prevention

When it happens

Trigger: 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).

Common situations: 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.

Related errors


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