{"record":{"id":"64a0b37d66afde5c","repo":"Mintplex-Labs/anything-llm","slug":"no-gemini-api-key-was-set-64a0b3","errorCode":null,"errorMessage":"No Gemini API key was set.","messagePattern":"No Gemini API key was set\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"server/utils/EmbeddingEngines/gemini/index.js","lineNumber":10,"sourceCode":"const { toChunks, reportEmbeddingProgress } = require(\"../../helpers\");\n\nconst MODEL_MAP = {\n  \"gemini-embedding-001\": 2048,\n};\n\nclass GeminiEmbedder {\n  constructor() {\n    if (!process.env.GEMINI_EMBEDDING_API_KEY)\n      throw new Error(\"No Gemini API key was set.\");\n\n    this.className = \"GeminiEmbedder\";\n    const { OpenAI: OpenAIApi } = require(\"openai\");\n    this.model = process.env.EMBEDDING_MODEL_PREF || \"gemini-embedding-001\";\n    this.openai = new OpenAIApi({\n      apiKey: process.env.GEMINI_EMBEDDING_API_KEY,\n      // Even models that are v1 in gemini API can be used with v1beta/openai/ endpoint and nobody knows why.\n      baseURL: \"https://generativelanguage.googleapis.com/v1beta/openai/\",\n    });\n\n    this.maxConcurrentChunks = 4;\n\n    // https://ai.google.dev/gemini-api/docs/models/gemini#text-embedding-and-embedding\n    this.embeddingMaxChunkLength = MODEL_MAP[this.model] || 2_048;\n    this.log(\n      `Initialized with ${this.model} - Max Size: ${this.embeddingMaxChunkLength}` +\n        (this.outputDimensions\n          ? ` - Output Dimensions: ${this.outputDimensions}`","sourceCodeStart":1,"sourceCodeEnd":28,"githubUrl":"https://github.com/Mintplex-Labs/anything-llm/blob/526360e320da9d1b36074be5ed64fe76e5bbfbbd/server/utils/EmbeddingEngines/gemini/index.js#L1-L28","documentation":"Thrown in the GeminiEmbedder constructor when process.env.GEMINI_EMBEDDING_API_KEY is falsy. Note the specific var name includes the EMBEDDING segment; it is separate from a general Gemini LLM key. The embedder targets Google's OpenAI-compatible endpoint https://generativelanguage.googleapis.com/v1beta/openai/.","triggerScenarios":"Constructing GeminiEmbedder while GEMINI_EMBEDDING_API_KEY is unset; reusing GEMINI_API_KEY (LLM) name instead of GEMINI_EMBEDDING_API_KEY; API key restricted to an API that excludes the Generative Language API.","commonSituations":"Setting GEMINI_API_KEY for chat but forgetting the EMBEDDING-specific var; Google API key with HTTP referrer/IP restrictions that block the server; key disabled in Google Cloud Console; test env missing the secret.","solutions":["Set GEMINI_EMBEDDING_API_KEY (exact name, with the _EMBEDDING_ segment) to a Google AI Studio / Generative Language API key.","Ensure the key has access to the Generative Language API and is not IP/referrer-restricted for server use.","Optionally set EMBEDDING_MODEL_PREF (defaults to gemini-embedding-001) and restart the process.","Verify the var is loaded in the running process."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"function assertGeminiEmbedEnv() {\n  if (!process.env.GEMINI_EMBEDDING_API_KEY) {\n    throw new Error('Missing env GEMINI_EMBEDDING_API_KEY (note the _EMBEDDING_ segment)');\n  }\n}\nassertGeminiEmbedEnv();","typeGuard":null,"tryCatchPattern":"try {\n  new GeminiEmbedder();\n} catch (e) {\n  if (/gemini api key/i.test(e.message)) { /* surface config error */ }\n  throw e;\n}","preventionTips":["Use GEMINI_EMBEDDING_API_KEY, not GEMINI_API_KEY, for embeddings.","Ensure the key is not IP/referrer-restricted for server use.","Restart after editing .env."],"tags":["gemini","google","embeddings","config","env","auth","startup"],"backgroundTag":null,"analyzedSha":"526360e320da9d1b36074be5ed64fe76e5bbfbbd","analyzedAt":"2026-08-13T01:45:47.170Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}