Comfy-Org/ComfyUI · error · ValueError

sync.so generation completed but no output URL was returned.

Error message

sync.so generation completed but no output URL was returned.

What it means

Raised by the sync.so node when the generation status is COMPLETED but the response contains no outputUrl. The task claims success yet provides no downloadable artifact, so the node cannot fetch the video. It is the last guard after the FAILED/REJECTED branch.

Source

Thrown at comfy_api_nodes/nodes_sync_so.py:201

        )
        generation = await poll_op(
            cls,
            ApiEndpoint(path=f"/proxy/synclabs/v2/generate/{generation.id}"),
            response_model=SyncGeneration,
            status_extractor=lambda g: g.status,
            completed_statuses=["COMPLETED", "FAILED", "REJECTED"],
            failed_statuses=[],
            queued_statuses=["PENDING"],
            poll_interval=10.0,
        )
        if generation.status != "COMPLETED":
            code = f" [{generation.errorCode}]" if generation.errorCode else ""
            raise ValueError(
                f"sync.so generation {generation.status.lower()}{code}: "
                f"{generation.error or 'no error details provided'}"
            )
        if not generation.outputUrl:
            raise ValueError("sync.so generation completed but no output URL was returned.")
        return IO.NodeOutput(await download_url_to_video_output(generation.outputUrl))


class SyncTalkingImageNode(IO.ComfyNode):
    @classmethod
    def define_schema(cls) -> IO.Schema:
        return IO.Schema(
            node_id="SyncTalkingImageNode",
            display_name="sync.so Talking Image",
            category="partner/video/sync.so",
            description=(
                "Animate a still portrait into a talking video driven by speech audio, "
                "using sync.so's sync-3 model. The output duration matches the audio. "
                "Cost scales with output duration."
            ),
            inputs=[
                IO.Image.Input(
                    "image",

View on GitHub (pinned to 1c6d8d45b3)

Solutions

  1. Retry the generation — delayed artifact publication sometimes yields empty completions
  2. Check the sync.so dashboard for the generation id to see if an output exists under a different field
  3. Review sync.so API changelog for response schema changes
Defensive patterns

Strategy: retry

Try / catch

try:
    out = await syncso_generate(...)
except ValueError as e:
    if "no output URL" in str(e):
        await asyncio.sleep(5)
        out = await syncso_generate(...)  # retry once
    else:
        raise

Prevention

When it happens

Trigger: poll_op returns status COMPLETED with outputUrl None/empty/missing from the response body of /proxy/synclabs/v2/generate/{id}.

Common situations: sync.so API schema changes renaming the output field; transient server-side artifact publication delay; account-level restrictions producing empty completions.

Related errors


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