{"record":{"id":"774debfa65c5af19","repo":"ATH-MaaS/Pixelle-Video","slug":"the-workflow-did-not-return-a-video-please-check-774deb","errorCode":null,"errorMessage":"The workflow did not return a video. Please check the workflow configuration.","messagePattern":"The workflow did not return a video\\. Please check the workflow configuration\\.","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"web/pipelines/i2v.py","lineNumber":341,"sourceCode":"                            workflow_input = workflow_config[\"workflow_id\"]\n                        else:\n                            workflow_input = str(workflow_path)\n\n                        video_result = await kit.execute(workflow_input, workflow_params)\n\n                        generated_video_url = None\n                        if hasattr(video_result, 'videos') and video_result.videos:\n                            generated_video_url = video_result.videos[0]\n                        elif hasattr(video_result, 'outputs') and video_result.outputs:\n                            for node_id, node_output in video_result.outputs.items():\n                                if isinstance(node_output, dict) and 'videos' in node_output:\n                                    videos = node_output['videos']\n                                    if videos and len(videos) > 0:\n                                        generated_video_url = videos[0]\n                                        break\n\n                        if not generated_video_url:\n                            raise Exception(\"The workflow did not return a video. Please check the workflow configuration.\")\n\n                        timeout = httpx.Timeout(300.0)\n                        async with httpx.AsyncClient(timeout=timeout) as client:\n                            response = await client.get(generated_video_url)\n                            response.raise_for_status()\n                            with open(final_video_path, 'wb') as f:\n                                f.write(response.content)\n                        progress_bar.progress(100)\n                        status_text.text(tr(\"status.success\"))\n                        await save_web_generation_history(\n                            pixelle_video,\n                            task_id=task_id,\n                            video_path=final_video_path,\n                            pipeline=\"image_to_video\",\n                            title=\"图生视频\" if get_language() == \"zh_CN\" else \"Image to Video\",\n                            input_params={\n                                \"text\": prompt,\n                                \"prompt_text\": prompt,","sourceCodeStart":323,"sourceCodeEnd":359,"githubUrl":"https://github.com/ATH-MaaS/Pixelle-Video/blob/848b054e4fae40dabc62ec58e960b573e83793ac/web/pipelines/i2v.py#L323-L359","documentation":"After running the image-to-video workflow, the code looks through node outputs for a 'videos' list and picks the first URL; if none is found it raises this Exception pointing at the workflow configuration. It prevents a null-URL download attempt of the final video.","triggerScenarios":"The i2v workflow completes but no node emits a non-empty 'videos' array — the workflow lacks a video output node, the video node failed or was muted, outputs are returned under 'images'/'gifs' instead, or input param 'image' was not bound so the video node never produced output.","commonSituations":"Using a workflow JSON exported from a different ComfyUI/custom-node version where the output node name/key changed; replacing a SaveAnimatedWEBP/VHS node with a SaveImage node; ComfyUI queue error swallowed so downstream output missing; insufficient VRAM causing the video encode node to fail silently in the parsed results.","solutions":["Inspect the workflow JSON and ensure it ends with a proper video output node (VHS_VideoCombine / SaveVideo etc.)","Check ComfyUI server logs for node failures (OOM, missing custom nodes) during execution","Verify the 'image' param placeholder name matches the workflow's LoadImage node input","Broaden the result-parsing to check alternate keys ('gifs', 'images') if your output node classifies video differently"],"exampleFix":"// before\nif not generated_video_url:\n    raise Exception(\"The workflow did not return a video. Please check the workflow configuration.\")\n// after\nif not generated_video_url:\n    raise RuntimeError(\n        f\"i2v workflow returned no video. workflow={workflow_path}, \"\n        f\"outputs={node_outputs!r} — verify the video output node exists and ran.\"\n    )","handlingStrategy":"validation","validationCode":"node_outputs = result.get(\"node_outputs\", [])\nvideo_urls = [v for out in node_outputs if isinstance(out, dict) for v in out.get(\"videos\") or out.get(\"gifs\") or []]\nif not video_urls:\n    raise RuntimeError(f\"i2v workflow returned no video: {node_outputs!r}\")","typeGuard":"def extracted_video_url(node_outputs):\n    for o in (node_outputs or []):\n        if isinstance(o, dict):\n            vids = o.get(\"videos\") or []\n            if vids:\n                return vids[0]\n    return None","tryCatchPattern":"try:\n    video = await generate_audio_visual_video(...)\nexcept Exception as e:\n    if \"did not return a video\" in str(e):\n        log.error(\"i2v workflow output had no videos; check workflow config and ComfyUI logs\")\n    raise","preventionTips":["Verify the exported workflow JSON ends in a video-producing node before deploying","Monitor ComfyUI server logs for silent node failures (OOM, missing nodes)","Match the 'image' param key to the workflow's LoadImage placeholder exactly","Add a smoke test that runs each i2v workflow and asserts a video URL is returned"],"tags":["comfyui","workflow-config","empty-result","i2v"],"backgroundTag":"workflow-returned-no-output","analyzedSha":"848b054e4fae40dabc62ec58e960b573e83793ac","analyzedAt":"2026-08-30T03:24:41.468Z","schemaVersion":2},"datasetVersion":"2026-08-30T08:17:16.595Z"}