"""Minimal repro isolating how gr.Examples handles None in optional image columns. Hypothesis under test --------------------- gr.Examples drops any INPUT COLUMN that is None in *every* example row (it builds an `input_has_examples` mask, keeps a column only if at least one row is non-None, then filters the value rows to match). When a whole column is dropped, the click handler that loads an example back into the inputs returns fewer values than there are output components -> ValueError: "didn't return enough output values". Claim: a lone None in a *surviving* column (one that has >=1 non-None value across the rows) is fine. Only an *entirely*-None column breaks. This Space demonstrates the SAFE case (option 2). The optional second image column has a real image in row 1, so the column survives; row 2's None loads cleanly. To reproduce the FAILURE, swap in the BROKEN_EXAMPLES block below (both rows None for img2) and redeploy -> you'll get the ValueError on example click / cache warm. """ import gradio as gr SAFE_EXAMPLES = [ # [label, img1, img2] -- img2 column survives because row 1 fills it. ["both images", "red.png", "green.png"], ["only first image (img2=None, but column survives)", "blue.png", None], ] # BROKEN_EXAMPLES -- uncomment to reproduce the crash. img2 is None in EVERY row, # so gr.Examples drops the img2 column and the loader returns 2 values for 3 # components -> "didn't return enough output values (needed: 3, returned: 2)". # BROKEN_EXAMPLES = [ # ["only first image", "red.png", None], # ["only first image", "blue.png", None], # ] def describe(label, img1, img2): n = sum(x is not None for x in (img1, img2)) return f"label={label!r} | images provided: {n} | img1={'set' if img1 is not None else 'None'} | img2={'set' if img2 is not None else 'None'}" with gr.Blocks() as demo: gr.Markdown( "# gr.Examples None-column repro\n" "Click each example. Both load without error because the `img2` column " "has at least one real image (row 1), so Gradio keeps the column and the " "`None` in row 2 loads fine. This is **option 2** from the fix guidance." ) label = gr.Textbox(label="label") with gr.Row(): img1 = gr.Image(label="image 1 (required)", type="filepath") img2 = gr.Image(label="image 2 (optional)", type="filepath") out = gr.Textbox(label="result") run = gr.Button("Describe", variant="primary") gr.Examples( examples=SAFE_EXAMPLES, inputs=[label, img1, img2], outputs=out, fn=describe, cache_examples=True, ) run.click(describe, inputs=[label, img1, img2], outputs=out) if __name__ == "__main__": demo.launch()