nexu-io/open-design · error · RuntimeError
Gemini selected but no Google API key is configured.
Error message
Gemini selected but no Google API key is configured.
What it means
Raised in resolve_runtime when provider_name is 'gemini' but the resolved google_key (GOOGLE_API_KEY / GEMINI_API_KEY / GOOGLE_GENAI_API_KEY) is empty. The provider was selected (either explicitly or via auto-resolution) without a matching credential, so the pipeline refuses to construct a GeminiClient.
Source
Thrown at design-templates/last30days/scripts/lib/providers.py:287
elif openai_token and config.get("OPENAI_AUTH_STATUS") == env.AUTH_STATUS_OK:
provider_name = "openai"
elif xai_key:
provider_name = "xai"
elif config.get("OPENROUTER_API_KEY"):
provider_name = "openrouter"
else:
return schema.ProviderRuntime(
reasoning_provider="local",
planner_model="deterministic",
rerank_model="local-score",
x_search_backend=_resolve_x_backend(config),
), None
planner_model, rerank_model = _resolve_model_pins(config, depth, provider_name)
if provider_name == "gemini":
if not google_key:
raise RuntimeError("Gemini selected but no Google API key is configured.")
runtime = schema.ProviderRuntime(
reasoning_provider="gemini",
planner_model=planner_model,
rerank_model=rerank_model,
x_search_backend=_resolve_x_backend(config),
)
return runtime, GeminiClient(google_key)
if provider_name == "openai":
if not openai_token or config.get("OPENAI_AUTH_STATUS") != env.AUTH_STATUS_OK:
raise RuntimeError("OpenAI selected but no valid OpenAI auth is configured.")
runtime = schema.ProviderRuntime(
reasoning_provider="openai",
planner_model=planner_model,
rerank_model=rerank_model,
x_search_backend=_resolve_x_backend(config),View on GitHub (pinned to 5be4028344)
Solutions
- Set one of GOOGLE_API_KEY, GEMINI_API_KEY, or GOOGLE_GENAI_API_KEY to a valid Google AI key.
- If you intended to use another provider, change LAST30DAYS_REASONING_PROVIDER accordingly.
- Switch provider to 'auto' so the runtime falls back to whichever credential is present (or local deterministic mode if none).
Example fix
# before LAST30DAYS_REASONING_PROVIDER=gemini # (no google key set) # after LAST30DAYS_REASONING_PROVIDER=gemini GOOGLE_API_KEY=AIzaSy...
Defensive patterns
Strategy: validation
Validate before calling
def ensure_gemini_key(config):
key = (config.get("GOOGLE_API_KEY")
or config.get("GEMINI_API_KEY")
or config.get("GOOGLE_GENAI_API_KEY"))
if not key:
raise RuntimeError(
"Provider is gemini but no Google key found. "
"Set GOOGLE_API_KEY / GEMINI_API_KEY / GOOGLE_GENAI_API_KEY."
)
return key Type guard
null
Try / catch
null
Prevention
- Run a pre-flight credential check that maps each provider to its required env vars.
- Prefer 'auto' provider selection so a missing Google key falls through to the next available provider.
- In CI, assert required secret names are present before invoking the pipeline.
When it happens
Trigger: LAST30DAYS_REASONING_PROVIDER=gemini while none of GOOGLE_API_KEY, GEMINI_API_KEY, GOOGLE_GENAI_API_KEY are set. Also reached via auto-resolution if a stale config pins gemini but the key env vars were cleared.
Common situations: Forgetting to copy GOOGLE_API_KEY into the deployment env. Renaming GEMINI_API_KEY to GOOGLE_GENAI_API_KEY in only some environments. CI running with provider=gemini but secrets not injected.
Related errors
- no Nano Banana API key — configure it in Settings or set OD_
- OpenAI selected but no valid OpenAI auth is configured.
- xAI selected but XAI_API_KEY is not configured.
- OpenRouter selected but OPENROUTER_API_KEY is not configured
- Cloudflare API token is required.
AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12).
Data as JSON: /api/errors/20353547807675ec.
Report an issue: GitHub.