{"record":{"id":"558289f517369ff9","repo":"ATH-MaaS/Pixelle-Video","slug":"the-workflow-did-not-return-a-video-please-check","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/action_transfer.py","lineNumber":438,"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=\"action_transfer\",\n                            title=\"动作迁移\" if get_language() == \"zh_CN\" else \"Action Transfer\",\n                            input_params={\n                                \"text\": prompt,\n                                \"prompt_text\": prompt,","sourceCodeStart":420,"sourceCodeEnd":456,"githubUrl":"https://github.com/ATH-MaaS/Pixelle-Video/blob/848b054e4fae40dabc62ec58e960b573e83793ac/web/pipelines/action_transfer.py#L420-L456","documentation":"generate_audio_visual_video iterates ComfyKit node outputs looking for node_output['videos']; if no video URL was produced it raises this Exception before downloading the result. It indicates the workflow ran but no output node emitted a video (or output parsing didn't match).","triggerScenarios":"kit.execute(workflow_input, workflow_params) completes successfully, but the result's nodes contain no 'videos' list with entries — e.g. the workflow's save node outputs images instead of video, or the workflow lacks a video output node entirely.","commonSituations":"Editing the workflow JSON and accidentally replacing a VHS/Video save node with a SaveImage node; a workflow that only renders previews; an output node failing silently upstream so the videos list is empty.","solutions":["Open the workflow JSON and confirm it contains a video output node (e.g. VHS_VideoCombine) whose results land under 'videos'","Re-run the workflow in ComfyUI directly to see whether a video is actually produced","Check ComfyUI server logs for node errors that prevented video generation","Fix the output-parsing key if the node emits under a different field"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"# Before relying on the pipeline, confirm the workflow JSON has a video output node:\nimport json\ncfg = json.load(open(\"workflows/<key>.json\"))\nassert any(\"VHS_VideoCombine\" in str(node) or \"video\" in str(node).lower() for node in cfg.get(\"nodes\", {}).values()), \"No video output node in workflow\"","typeGuard":"def has_video_output(node_output: dict) -> bool:\n    videos = node_output.get(\"videos\") if isinstance(node_output, dict) else None\n    return isinstance(videos, list) and len(videos) > 0","tryCatchPattern":"try:\n    url = await generate_audio_visual_video(...)\nexcept Exception as e:\n    if \"did not return a video\" in str(e):\n        st.error(\"Workflow produced no video; check its output node (must emit 'videos').\")\n        # fall back or re-run with a known-good workflow","preventionTips":["Only use workflow JSONs that include a video combine/output node","Re-validate workflows after any manual edit in ComfyUI","Monitor ComfyUI logs for node failures that yield empty outputs","Pin known-good workflow files in version control"],"tags":["workflow","video-output","comfyui"],"backgroundTag":"workflow-no-video-output","analyzedSha":"848b054e4fae40dabc62ec58e960b573e83793ac","analyzedAt":"2026-08-30T03:24:41.468Z","schemaVersion":2},"datasetVersion":"2026-08-30T08:17:16.595Z"}