{"record":{"id":"1e79040479113173","repo":"Comfy-Org/ComfyUI","slug":"at-least-one-input-image-is-required","errorCode":null,"errorMessage":"At least one input image is required","messagePattern":"At least one input image is required","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"warning","filePath":"comfy_extras/nodes_glsl.py","lineNumber":773,"sourceCode":"        images: io.Autogrow.Type,\n        floats: io.Autogrow.Type = None,\n        ints: io.Autogrow.Type = None,\n        bools: io.Autogrow.Type = None,\n        curves: io.Autogrow.Type = None,\n        **kwargs,\n    ) -> io.NodeOutput:\n\n        image_list = [v for v in images.values() if v is not None]\n        float_list = (\n            [v if v is not None else 0.0 for v in floats.values()] if floats else []\n        )\n        int_list = [v if v is not None else 0 for v in ints.values()] if ints else []\n        bool_list = [v if v is not None else False for v in bools.values()] if bools else []\n\n        curve_luts = [v.to_lut().astype(np.float32) for v in curves.values() if v is not None] if curves else []\n\n        if not image_list:\n            raise ValueError(\"At least one input image is required\")\n\n        # Determine output dimensions\n        if size_mode[\"size_mode\"] == \"custom\":\n            out_width = size_mode[\"width\"]\n            out_height = size_mode[\"height\"]\n        else:\n            out_height, out_width = image_list[0].shape[1:3]\n\n        batch_size = image_list[0].shape[0]\n\n        # Prepare batches\n        image_batches = []\n        for batch_idx in range(batch_size):\n            batch_images = [img_tensor[batch_idx].cpu().numpy().astype(np.float32) for img_tensor in image_list]\n            image_batches.append(batch_images)\n\n        all_batch_outputs = _render_shader_batch(\n            fragment_shader,","sourceCodeStart":755,"sourceCodeEnd":791,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_extras/nodes_glsl.py#L755-L791","documentation":"Raised at the top of the GLSL render node's execute() when, after filtering the optional Autogrow image inputs for non-None values, none remain. The shader pipeline needs at least one input texture (both as the sizing reference for 'match first input' mode and as the batch dimension source), so an empty image set is rejected before any GL work starts.","triggerScenarios":"Executing the GLSL node with all image inputs unconnected, or with every connected wire carrying None (e.g. upstream optional outputs that produced nothing); using size_mode 'custom' thinking no image is needed — the check fires regardless.","commonSituations":"Wiring the node up while building a workflow and pressing Run early; a switch/mux node upstream returning None on the selected branch.","solutions":["Connect at least one image output (e.g. LoadImage or EmptyLatentImage-derived image) to one of the node's image inputs.","If the upstream node can legitimately emit nothing, feed a small placeholder image (a 64x64 black tensor via an empty-image node) to satisfy the requirement.","Check that an upstream switch node actually selected the branch that produces the image."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"images = {k: v for k, v in image_inputs.items() if v is not None}\nif not images:\n    raise ValueError(\"Connect at least one image input to the GLSL node before running\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always connect one image input, even a small placeholder, before executing.","Mute/bypass the GLSL node while building the workflow.","Check upstream switch nodes actually emit an image on the selected branch."],"tags":["workflow","validation","glsl","node-inputs"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}