abi/screenshot-to-code · error · ValueError

Prompt item is missing a prompt string.

Error message

Prompt item {index} is missing a prompt string.

What it means

ValueError("Prompt item {index} is missing a prompt string.") raised by load_prompts() when an array element is a dict but its "prompt" key is absent, not a string, or a blank/whitespace-only string. The check is isinstance(prompt, str) and prompt.strip(), so empty prompts are rejected too. Aborts the eval run at load time.

Solutions

  1. At the reported index, ensure the object has "prompt": "<non-empty text>" spelled exactly lowercase
  2. If the key was typo'd ("text"/"Prompt"), rename it to "prompt"
  3. Drop or fill empty-prompt rows before exporting the file

Example fix

// before
[{"id": "p1", "text": "a cat"}]

// after
[{"id": "p1", "prompt": "a cat"}]
Defensive patterns

Strategy: validation

Validate before calling

def validate_prompt_objects(items: list) -> list[int]:
    bad = []
    for i, item in enumerate(items, start=1):
        if isinstance(item, dict):
            p = item.get("prompt")
            if not isinstance(p, str) or not p.strip():
                bad.append(i)
    return bad

Type guard

from typing import Any, TypeGuard

def has_valid_prompt(item: dict[str, Any]) -> TypeGuard[dict[str, Any]]:
    p = item.get("prompt")
    return isinstance(p, str) and bool(p.strip())

Try / catch

try:
    load_prompts(prompt_file)
except ValueError as e:
    if "missing a prompt string" in str(e):
        idx = int(str(e).split()[2])
        fill_or_drop_prompt(prompt_file, idx)

Prevention

When it happens

Trigger: Array elements like {"id": "p1", "category": "Landscape"} (no prompt key), {"prompt": 123}, or {"prompt": " "}.

Common situations: Prompt objects built from spreadsheets/CSV where the prompt column is empty for some rows; typo'd key such as "text" or "Prompt" instead of "prompt" (keys are case-sensitive).

Related errors


AI-assisted analysis of abi/screenshot-to-code@d026163f58 (2026-08-14). Data as JSON: /api/errors/ee0690c3d9bd41fb. Report an issue: GitHub.

Appendix: source

Thrown at backend/run_image_generation_evals.py:83

    prompts: list[PromptItem] = []
    for index, item in enumerate(cast(list[Any], raw), start=1):
        if isinstance(item, str):
            prompts.append(
                {
                    "id": f"{index:03d}",
                    "category": "Prompt",
                    "prompt": item,
                }
            )
            continue

        if not isinstance(item, dict):
            raise ValueError(f"Prompt item {index} must be a string or object.")

        item_dict = cast(dict[str, Any], item)
        prompt = item_dict.get("prompt")
        if not isinstance(prompt, str) or not prompt.strip():
            raise ValueError(f"Prompt item {index} is missing a prompt string.")

        prompt_id = item_dict.get("id")
        category = item_dict.get("category")
        prompts.append(
            {
                "id": prompt_id if isinstance(prompt_id, str) else f"{index:03d}",
                "category": category if isinstance(category, str) else "Prompt",
                "prompt": prompt,
            }
        )

    return prompts


def build_replicate_input(
    model: ReplicateEvalModel, prompt: str
) -> dict[str, str | int | float | bool]:
    if model == "flux_2_klein":

View on GitHub (pinned to d026163f58)