{"record":{"id":"943f33eddac4597d","repo":"rohitg00/agentmemory","slug":"gemini-api-key-or-google-api-key-is-required-for","errorCode":null,"errorMessage":"GEMINI_API_KEY (or GOOGLE_API_KEY) is required for the gemini provider","messagePattern":"GEMINI_API_KEY \\(or GOOGLE_API_KEY\\) is required for the gemini provider","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/providers/index.ts","lineNumber":112,"sourceCode":"  switch (config.provider) {\n    case \"minimax\":\n      return new MinimaxProvider(\n        requireEnvVar(\"MINIMAX_API_KEY\"),\n        config.model,\n        config.maxTokens,\n      );\n    case \"anthropic\":\n      return new AnthropicProvider(\n        requireEnvVar(\"ANTHROPIC_API_KEY\"),\n        config.model,\n        config.maxTokens,\n        config.baseURL,\n      );\n    case \"gemini\": {\n      const geminiKey =\n        getEnvVar(\"GEMINI_API_KEY\") || getEnvVar(\"GOOGLE_API_KEY\");\n      if (!geminiKey) {\n        throw new Error(\n          \"GEMINI_API_KEY (or GOOGLE_API_KEY) is required for the gemini provider\",\n        );\n      }\n      return new OpenRouterProvider(\n        geminiKey,\n        config.model,\n        config.maxTokens,\n        \"https://generativelanguage.googleapis.com/v1beta/openai/chat/completions\",\n      );\n    }\n    case \"openrouter\":\n      return new OpenRouterProvider(\n        requireEnvVar(\"OPENROUTER_API_KEY\"),\n        config.model,\n        config.maxTokens,\n        \"https://openrouter.ai/api/v1/chat/completions\",\n      );\n    case \"openai\": {","sourceCodeStart":94,"sourceCodeEnd":130,"githubUrl":"https://github.com/rohitg00/agentmemory/blob/e04ba88819c365c9acf9d6661ea802143e728bd6/src/providers/index.ts#L94-L130","documentation":"When the configured chat provider type is 'gemini', agentmemory routes it through OpenRouterProvider and requires a Gemini/Google key from GEMINI_API_KEY or GOOGLE_API_KEY. If neither is set the factory throws this message before constructing the provider.","triggerScenarios":"Calling createProvider/createBaseProvider (or createFallbackProvider) with config.type === 'gemini' while both GEMINI_API_KEY and GOOGLE_API_KEY are unset in env and ~/.agentmemory/.env.","commonSituations":"Users assuming the gemini provider talks directly to Google and setting only OPENAI-style vars; config generated by a template that omits the key; key set under GEMINI_KEY (wrong name); secrets synced to a different environment than the daemon's; Google AI Studio key created but never exported.","solutions":["Get a key from Google AI Studio and set GEMINI_API_KEY (or GOOGLE_API_KEY) in ~/.agentmemory/.env or the environment","Confirm exact variable names GEMINI_API_KEY / GOOGLE_API_KEY (not GEMINI_KEY or GOOGLE_AI_API_KEY)","Pass the key in config/explicitly where the factory supports it","Or switch config.type to a provider whose credentials you already have (e.g. 'openai')"],"exampleFix":"// before\n// config: { type: 'gemini', model: 'gemini-2.0-flash' } — no key set\nconst provider = await createProvider(config); // throws\n// after\n// ~/.agentmemory/.env: GEMINI_API_KEY=AIza...\nconst provider = await createProvider(config);","handlingStrategy":"validation","validationCode":"function assertGeminiKey() {\n  const key = process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY;\n  if (!key) throw new Error('Set GEMINI_API_KEY (or GOOGLE_API_KEY) for the gemini provider');\n  return key;\n}\nassertGeminiKey(); // before createProvider({ type: 'gemini', ... })","typeGuard":"const hasGeminiKey = (c: { type: string }): c is { type: 'gemini' } & { keyResolvable: true } =>\n  c.type !== 'gemini' || !!(process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY);","tryCatchPattern":"try {\n  provider = await createProvider({ type: 'gemini', model });\n} catch (err) {\n  if (err instanceof Error && err.message.startsWith('GEMINI_API_KEY')) {\n    console.error('Get a Google AI Studio key and set GEMINI_API_KEY in ~/.agentmemory/.env');\n    process.exit(1);\n  }\n  throw err;\n}","preventionTips":["Whenever config.type === 'gemini', ensure GEMINI_API_KEY/GOOGLE_API_KEY is provisioned first","Use exact variable names from the library, not common variants","Validate provider config + keys together in a startup checklist","If targeting Google directly is expected, confirm the routing (gemini type goes through OpenRouterProvider) before provisioning keys"],"tags":["api-key","missing-env-var","gemini","configuration"],"backgroundTag":"missing-api-key","analyzedSha":"e04ba88819c365c9acf9d6661ea802143e728bd6","analyzedAt":"2026-08-30T01:07:40.754Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}