{"record":{"id":"b70d2908f5f3c750","repo":"mastra-ai/mastra","slug":"api-key-not-found-for-provider-normalizedconfig","errorCode":null,"errorMessage":"API key not found for provider ${normalizedConfig.providerId}. Set ${envVarDisplay}","messagePattern":"API key not found for provider (.+?)\\. Set (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/core/src/llm/model/embedding-router.ts","lineNumber":243,"sourceCode":"      let apiKey = normalizedConfig.apiKey;\n      if (!apiKey) {\n        const apiKeyEnvVar = providerConfig.apiKeyEnvVar;\n        if (Array.isArray(apiKeyEnvVar)) {\n          // Try each possible environment variable\n          for (const envVar of apiKeyEnvVar) {\n            apiKey = process.env[envVar];\n            if (apiKey) break;\n          }\n        } else {\n          apiKey = process.env[apiKeyEnvVar];\n        }\n      }\n\n      if (!apiKey) {\n        const envVarDisplay = Array.isArray(providerConfig.apiKeyEnvVar)\n          ? providerConfig.apiKeyEnvVar.join(' or ')\n          : providerConfig.apiKeyEnvVar;\n        throw new Error(`API key not found for provider ${normalizedConfig.providerId}. Set ${envVarDisplay}`);\n      }\n\n      // Initialize the provider model directly in constructor\n      if (normalizedConfig.providerId === 'openai') {\n        this.providerModel = createOpenAI({ apiKey }).embeddingModel(normalizedConfig.modelId);\n      } else if (normalizedConfig.providerId === 'google') {\n        this.providerModel = createGoogleGenerativeAI({ apiKey }).embeddingModel(normalizedConfig.modelId);\n      } else {\n        // Use OpenAI-compatible provider for other providers\n        if (!providerConfig.url) {\n          throw new Error(`Provider ${normalizedConfig.providerId} does not have a URL configured`);\n        }\n        this.providerModel = createOpenAICompatible({\n          name: normalizedConfig.providerId,\n          apiKey,\n          baseURL: providerConfig.url,\n        }).embeddingModel(normalizedConfig.modelId);\n      }","sourceCodeStart":225,"sourceCodeEnd":261,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/core/src/llm/model/embedding-router.ts#L225-L261","documentation":"After resolving the provider's configured apiKeyEnvVar name(s) from the registry, the router checks config apiKey first, then those environment variables. If none is set, it throws, listing the expected env var(s). This ensures requests are never sent without credentials.","triggerScenarios":"new EmbeddingRouter(\"openai/text-embedding-3-small\") without OPENAI_API_KEY set (and no apiKey option); google models without the Google API key env var; array-valued apiKeyEnvVar providers where none of the alternatives is present.","commonSituations":"Key set only in the shell profile but the app runs under a service manager/CI without it; .env not loaded before construction; wrong var name (e.g. OPEN_AI_API_KEY vs OPENAI_API_KEY); using the embedding router in tests where env is sanitized.","solutions":["Set the env var named in the error message (e.g. export OPENAI_API_KEY=sk-...).","Pass apiKey directly in the constructor config object.","Ensure .env is loaded (dotenv) before any EmbeddingRouter is instantiated.","For providers accepting multiple env vars, set at least one of the listed alternatives."],"exampleFix":"// before\nconst router = new EmbeddingRouter(\"openai/text-embedding-3-small\"); // OPENAI_API_KEY unset\n// after\nconst router = new EmbeddingRouter({\n  providerId: \"openai\",\n  modelId: \"text-embedding-3-small\",\n  apiKey: process.env.OPENAI_API_KEY,\n});","handlingStrategy":"try-catch","validationCode":"const envVars = ['OPENAI_API_KEY', 'GOOGLE_GENERATIVE_AI_API_KEY'];\nif (!config.apiKey && envVars.every((v) => !process.env[v])) {\n  throw new Error(`Set one of ${envVars.join(' or ')} for provider ${providerId}`);\n}","typeGuard":"const hasApiKey = (config) => typeof config?.apiKey === 'string' && config.apiKey.length > 0;","tryCatchPattern":"try {\n  router = new EmbeddingRouter(config);\n} catch (e) {\n  if (e instanceof Error && e.message.includes('API key not found for provider')) {\n    console.error(`Missing provider API key: ${e.message}`); // shows which env var to set\n    process.exit(1);\n  } else throw e;\n}","preventionTips":["Document and automate required env vars per deployment (env templates, secret managers).","Run an env-var presence check at application boot.","Never rely on shell-profile env vars for services/CI; inject them explicitly."],"tags":["authentication","api-key","environment"],"backgroundTag":"missing-env-var","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}