nexu-io/open-design · error · RuntimeError

SERPER_API_KEY is required when web_backend='serper'

Error message

SERPER_API_KEY is required when web_backend='serper'

What it means

Same dispatcher guard for the 'serper' branch: backend is 'serper' but config.get('SERPER_API_KEY') is empty/missing. RuntimeError("SERPER_API_KEY is required when web_backend='serper'"). As with the sibling checks, auto-mode would not pick serper without the key, so this normally reflects an explicit `--web-backend serper`.

Source

Thrown at design-templates/last30days/scripts/lib/grounding.py:221

            backend = "serper"
        elif config.get("PARALLEL_API_KEY"):
            backend = "parallel"
        else:
            return [], {}
    if backend == "brave":
        key = config.get("BRAVE_API_KEY")
        if not key:
            raise RuntimeError("BRAVE_API_KEY is required when web_backend='brave'")
        return brave_search(query, date_range, key)
    if backend == "exa":
        key = config.get("EXA_API_KEY")
        if not key:
            raise RuntimeError("EXA_API_KEY is required when web_backend='exa'")
        return exa_search(query, date_range, key)
    if backend == "serper":
        key = config.get("SERPER_API_KEY")
        if not key:
            raise RuntimeError("SERPER_API_KEY is required when web_backend='serper'")
        return serper_search(query, date_range, key)
    if backend == "parallel":
        key = config.get("PARALLEL_API_KEY")
        if not key:
            raise RuntimeError("PARALLEL_API_KEY is required when web_backend='parallel'")
        return parallel_search(query, date_range, key)
    if backend != "none":
        raise ValueError(f"Unsupported web backend: {backend!r}")
    return [], {}


# ---------------------------------------------------------------------------
# Helpers
# ---------------------------------------------------------------------------

def _normalize_date(value: object) -> str | None:
    if value is None:
        return None

View on GitHub (pinned to 5be4028344)

Solutions

  1. Export SERPER_API_KEY.
  2. Use `--web-backend auto`, another backend you have a key for, or `--web-backend none`.

Example fix

# before
python3.12 last30days.py --topic x --web-backend serper   # SERPER_API_KEY unset
# after
export SERPER_API_KEY=...
python3.12 last30days.py --topic x --web-backend serper
Defensive patterns

Strategy: validation

Validate before calling

if web_backend == 'serper' and not config.get('SERPER_API_KEY'):
    raise RuntimeError("SERPER_API_KEY is required when web_backend='serper'")

Prevention

When it happens

Trigger: `--web-backend serper` with SERPER_API_KEY unset/empty in config.

Common situations: Forcing serper without the key; secret not wired into CI; typo in the env var name.

Related errors


AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12). Data as JSON: /api/errors/3736f704959ee2af. Report an issue: GitHub.