{"record":{"id":"ecae940cbdab4276","repo":"mvanhorn/last30days-skill","slug":"gemini-selected-but-no-google-api-key-is-configure","errorCode":null,"errorMessage":"Gemini selected but no Google API key is configured.","messagePattern":"Gemini selected but no Google API key is configured\\.","errorType":"validation","errorClass":"RuntimeError","httpStatus":null,"severity":"critical","filePath":"skills/last30days/scripts/lib/providers.py","lineNumber":266,"sourceCode":"        elif openai_token and config.get(\"OPENAI_AUTH_STATUS\") == env.AUTH_STATUS_OK:\n            provider_name = \"openai\"\n        elif xai_key:\n            provider_name = \"xai\"\n        elif config.get(\"OPENROUTER_API_KEY\"):\n            provider_name = \"openrouter\"\n        else:\n            return schema.ProviderRuntime(\n                reasoning_provider=\"local\",\n                planner_model=\"deterministic\",\n                rerank_model=\"local-score\",\n                x_search_backend=_resolve_x_backend(config),\n            ), None\n\n    planner_model, rerank_model = _resolve_model_pins(config, depth, provider_name)\n\n    if provider_name == \"gemini\":\n        if not google_key:\n            raise RuntimeError(\"Gemini selected but no Google API key is configured.\")\n        runtime = schema.ProviderRuntime(\n            reasoning_provider=\"gemini\",\n            planner_model=planner_model,\n            rerank_model=rerank_model,\n    \n            x_search_backend=_resolve_x_backend(config),\n        )\n        return runtime, GeminiClient(google_key)\n\n    if provider_name == \"openai\":\n        if not openai_token or config.get(\"OPENAI_AUTH_STATUS\") != env.AUTH_STATUS_OK:\n            raise RuntimeError(\"OpenAI selected but no valid OpenAI auth is configured.\")\n        runtime = schema.ProviderRuntime(\n            reasoning_provider=\"openai\",\n            planner_model=planner_model,\n            rerank_model=rerank_model,\n    \n            x_search_backend=_resolve_x_backend(config),","sourceCodeStart":248,"sourceCodeEnd":284,"githubUrl":"https://github.com/mvanhorn/last30days-skill/blob/c7460f6114449ddfe6ea3fc2f23c3d910c0e740c/skills/last30days/scripts/lib/providers.py#L248-L284","documentation":"RuntimeError raised in resolve_runtime when the reasoning provider is explicitly 'gemini' but no Google API key was found in the config/environment. Gemini is not optional once selected - unlike the no-key local fallback path - so the resolution aborts rather than silently degrading.","triggerScenarios":"LAST30DAYS_REASONING_PROVIDER=gemini (or auto-resolved to gemini) with GOOGLE_API_KEY / GEMINI_API_KEY unset, empty, or not loaded from ~/.config/last30days/.env.","commonSituations":"Fresh install without onboarding completed; key stored in a different shell's env and not visible to the agent subprocess; .env file at wrong path; key deleted or never created after skipping the setup wizard.","solutions":["Set GOOGLE_API_KEY (or the env var the env module reads) in ~/.config/last30days/.env or the shell","Re-run the first-run setup flow which persists the key","If you intended credential-free runs, switch the provider to the local/deterministic path instead of gemini"],"exampleFix":"# before\nLAST30DAYS_REASONING_PROVIDER=gemini\n# (no key anywhere)\n\n# after\nLAST30DAYS_REASONING_PROVIDER=gemini\nGOOGLE_API_KEY=your-key-here","handlingStrategy":"validation","validationCode":"if (os.environ.get(\"LAST30DAYS_REASONING_PROVIDER\") or \"gemini\").lower() == \"gemini\":\n    if not os.environ.get(\"GOOGLE_API_KEY\"):\n        raise SystemExit(\"Set GOOGLE_API_KEY before selecting the gemini provider\")","typeGuard":"def gemini_ready(config: dict) -> bool:\n    provider = (config.get(\"LAST30DAYS_REASONING_PROVIDER\") or \"gemini\").lower()\n    return provider != \"gemini\" or bool(os.environ.get(\"GOOGLE_API_KEY\"))","tryCatchPattern":"try:\n    runtime, client = resolve_runtime(config, depth)\nexcept RuntimeError as e:\n    if \"no Google API key\" in str(e):\n        prompt_user_for_key()  # or fall back to local runtime deliberately","preventionTips":["Run the first-run setup so the Google key is persisted in the .env layer","Preflight-check credentials before launching a long research run","If no key is intended, choose the local/deterministic provider explicitly"],"tags":["providers","gemini","credentials","configuration"],"backgroundTag":null,"analyzedSha":"c7460f6114449ddfe6ea3fc2f23c3d910c0e740c","analyzedAt":"2026-08-15T03:34:49.540Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}