{"record":{"id":"c7a6340938ccc292","repo":"ATH-MaaS/Pixelle-Video","slug":"the-second-step-of-the-workflow-did-not-return-a-v","errorCode":null,"errorMessage":"The second step of the workflow did not return a video. Please check the workflow configuration.","messagePattern":"The second step of the workflow did not return a video\\. Please check the workflow configuration\\.","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"web/pipelines/digital_human.py","lineNumber":665,"sourceCode":"                            }\n                            if second_workflow_config.get(\"source\") == \"runninghub\" and \"workflow_id\" in second_workflow_config:\n                                workflow_input = second_workflow_config[\"workflow_id\"]\n                            else:\n                                workflow_input = str(second_workflow_config)\n                            second_result = await kit.execute(workflow_input, second_workflow_params)\n                            # Video Link Extraction\n                            generated_video_url = None\n                            if hasattr(second_result, 'videos') and second_result.videos:\n                                generated_video_url = second_result.videos[0]\n                            elif hasattr(second_result, 'outputs') and second_result.outputs:\n                                for node_id, node_output in second_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                            if not generated_video_url:\n                                raise Exception(\"The second step of the workflow did not return a video. Please check the workflow configuration.\")\n                                        \n                            final_video_path = os.path.join(task_dir, \"final.mp4\")\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                            return final_video_path\n                        \n                        else:\n                            #Initialization and parameter preparation\n                            task_dir, task_id = create_task_output_dir()\n                            logger.info(f\"[Initialization] Task Directory: {task_dir}\")\n\n                            first_workflow_path = Path(workflow_path.get(\"first_workflow_path\"))","sourceCodeStart":647,"sourceCodeEnd":683,"githubUrl":"https://github.com/ATH-MaaS/Pixelle-Video/blob/848b054e4fae40dabc62ec58e960b573e83793ac/web/pipelines/digital_human.py#L647-L683","documentation":"In the first digital-human flow variant, after executing the second workflow via kit.execute, the code scans node outputs for a 'videos' entry; if none is found it raises this Exception instead of downloading final.mp4. The workflow completed but produced no video output.","triggerScenarios":"The second (image+audio -> video) workflow's output node emits nothing under 'videos' — e.g. wrong node type, node failure inside ComfyUI, or output key mismatch in the workflow config.","commonSituations":"Second workflow JSON edited so the video-combine node was replaced or renamed; ComfyUI node pack missing so the video node errored; the workflow saves images instead of video.","solutions":["Confirm the second workflow JSON contains a working video output node whose results appear under 'videos'","Run the workflow manually in ComfyUI with the same inputs to see node errors","Check ComfyUI server logs for failed nodes during execution","Re-download the stock second-step workflow if it was customized incorrectly"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"import json\ncfg = json.load(open(second_workflow_path))\nassert any(\"video\" in str(node).lower() for node in cfg.get(\"nodes\", {}).values()), \"Second workflow lacks a video output node\"","typeGuard":"def second_step_produced_video(outputs: list) -> bool:\n    return any(isinstance(o, dict) and o.get(\"videos\") for o in outputs)","tryCatchPattern":"try:\n    await generate_digital_human_video(...)\nexcept Exception as e:\n    if \"did not return a video\" in str(e):\n        st.error(\"Second workflow emitted no video; verify its video output node in ComfyUI.\")","preventionTips":["Verify the second workflow end-to-end in ComfyUI before wiring it into the pipeline","Ensure required custom node packs (e.g. VHS) are installed on the server","Keep an unmodified copy of the stock second-step workflow for rollback","Check ComfyUI logs whenever outputs come back empty"],"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"}