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 NoneView on GitHub (pinned to 5be4028344)
Solutions
- Export SERPER_API_KEY.
- 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
- Prefer `--web-backend auto`.
- Verify the secret is exported in the shell that launches the script.
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
- BRAVE_API_KEY is required when web_backend='brave'
- EXA_API_KEY is required when web_backend='exa'
- PARALLEL_API_KEY is required when web_backend='parallel'
- Unsupported web backend: {backend!r}
- No sources are available for this run.
AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12).
Data as JSON: /api/errors/3736f704959ee2af.
Report an issue: GitHub.