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

  1. Set one of GOOGLE_API_KEY, GEMINI_API_KEY, or GOOGLE_GENAI_API_KEY to a valid Google AI key.
  2. If you intended to use another provider, change LAST30DAYS_REASONING_PROVIDER accordingly.
  3. 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

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


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