{"record":{"id":"2f548959322a3d0f","repo":"Comfy-Org/ComfyUI","slug":"sync-so-generation-generation-status-lower-cod","errorCode":null,"errorMessage":"sync.so generation {generation.status.lower()}{code}: {generation.error or 'no error details provided'}","messagePattern":"sync\\.so generation (.+?)(.+?): (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy_api_nodes/nodes_sync_so.py","lineNumber":196,"sourceCode":"                options=SyncGenerationOptions(\n                    sync_mode=model[\"sync_mode\"],\n                    active_speaker_detection=speaker_detection,\n                ),\n            ),\n        )\n        generation = await poll_op(\n            cls,\n            ApiEndpoint(path=f\"/proxy/synclabs/v2/generate/{generation.id}\"),\n            response_model=SyncGeneration,\n            status_extractor=lambda g: g.status,\n            completed_statuses=[\"COMPLETED\", \"FAILED\", \"REJECTED\"],\n            failed_statuses=[],\n            queued_statuses=[\"PENDING\"],\n            poll_interval=10.0,\n        )\n        if generation.status != \"COMPLETED\":\n            code = f\" [{generation.errorCode}]\" if generation.errorCode else \"\"\n            raise ValueError(\n                f\"sync.so generation {generation.status.lower()}{code}: \"\n                f\"{generation.error or 'no error details provided'}\"\n            )\n        if not generation.outputUrl:\n            raise ValueError(\"sync.so generation completed but no output URL was returned.\")\n        return IO.NodeOutput(await download_url_to_video_output(generation.outputUrl))\n\n\nclass SyncTalkingImageNode(IO.ComfyNode):\n    @classmethod\n    def define_schema(cls) -> IO.Schema:\n        return IO.Schema(\n            node_id=\"SyncTalkingImageNode\",\n            display_name=\"sync.so Talking Image\",\n            category=\"partner/video/sync.so\",\n            description=(\n                \"Animate a still portrait into a talking video driven by speech audio, \"\n                \"using sync.so's sync-3 model. The output duration matches the audio. \"","sourceCodeStart":178,"sourceCodeEnd":214,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_api_nodes/nodes_sync_so.py#L178-L214","documentation":"Raised by the sync.so node after polling when the generation's terminal status is FAILED or REJECTED (poll_op treats all three terminal statuses as completed; failed_statuses is empty). The message includes the lowercased status, optional errorCode in brackets, and the generation.error text or a placeholder. This is the unified failure surface for sync.so server-side rejections.","triggerScenarios":"Submitting a lipsync generation whose video/audio pair is rejected (mismatched durations, no face detected, unsupported codec) or that fails server-side; poll returns status FAILED or REJECTED with errorCode/error populated.","commonSituations":"Audio longer than the video or silent audio; video without a detectable face; content moderation rejection; sync.so internal failures; free-tier limits.","solutions":["Match the bracketed errorCode/error text to the sync.so docs — REJECTED usually means input issues, FAILED means server-side","Verify the video contains a clear, visible face and the audio has real speech for the full video duration","Trim audio to video length and re-submit","For repeated FAILED with no details, retry later or contact sync.so support"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"face_ok = video_has_clear_face(video)\naudio_ok = audio_has_speech(audio) and audio_duration(audio) <= video_duration(video)\nif not (face_ok and audio_ok):\n    raise ValueError(\"sync.so inputs likely to be REJECTED: need visible face and matching speech audio\")","typeGuard":null,"tryCatchPattern":"try:\n    out = await syncso_generate(...)\nexcept ValueError as e:\n    msg = str(e)\n    if \"rejected\" in msg:\n        raise ValueError(f\"Fix inputs: {msg}\") from e  # input problem, do not retry\n    if \"failed\" in msg:\n        await asyncio.sleep(10)\n        out = await syncso_generate(...)  # server-side, retry once\n    else:\n        raise","preventionTips":["Trim audio to the video duration and verify speech content before submitting","REJECTED = fix inputs; FAILED = possibly transient — handle them differently","Map errorCode values against sync.so docs in your error handler"],"tags":["sync-so","lipsync","api-error","polling"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}