{"record":{"id":"3963f8ed73153afb","repo":"rohitg00/agentmemory","slug":"openrouter-api-key-is-required","errorCode":null,"errorMessage":"OPENROUTER_API_KEY is required","messagePattern":"OPENROUTER_API_KEY is required","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/providers/embedding/openrouter.ts","lineNumber":18,"sourceCode":"import type { EmbeddingProvider } from \"../../types.js\";\nimport { getEnvVar } from \"../../config.js\";\nimport { fetchWithTimeout } from \"../_fetch.js\";\nimport { resolveDimensions } from \"./_dimensions.js\";\n\nconst API_URL = \"https://openrouter.ai/api/v1/embeddings\";\n\nconst DEFAULT_MODEL = \"openai/text-embedding-3-small\";\n\nexport class OpenRouterEmbeddingProvider implements EmbeddingProvider {\n  readonly name = \"openrouter\";\n  readonly dimensions: number;\n  private apiKey: string;\n  private model: string;\n\n  constructor(apiKey?: string) {\n    this.apiKey = apiKey || getEnvVar(\"OPENROUTER_API_KEY\") || \"\";\n    if (!this.apiKey) throw new Error(\"OPENROUTER_API_KEY is required\");\n    this.model = getEnvVar(\"OPENROUTER_EMBEDDING_MODEL\") || DEFAULT_MODEL;\n    this.dimensions = resolveDimensions(\n      this.model,\n      getEnvVar(\"OPENROUTER_EMBEDDING_DIMENSIONS\"),\n      \"OPENROUTER_EMBEDDING_DIMENSIONS\",\n    );\n  }\n\n  async embed(text: string): Promise<Float32Array> {\n    const [result] = await this.embedBatch([text]);\n    return result;\n  }\n\n  async embedBatch(texts: string[]): Promise<Float32Array[]> {\n    const response = await fetchWithTimeout(API_URL, {\n      method: \"POST\",\n      headers: {\n        Authorization: `Bearer ${this.apiKey}`,","sourceCodeStart":1,"sourceCodeEnd":36,"githubUrl":"https://github.com/rohitg00/agentmemory/blob/e04ba88819c365c9acf9d6661ea802143e728bd6/src/providers/embedding/openrouter.ts#L1-L36","documentation":"OpenRouterEmbeddingProvider needs an OpenRouter API key, taken from the constructor argument or the OPENROUTER_API_KEY environment variable. With neither present the constructor throws this message before any network activity.","triggerScenarios":"Calling `new OpenRouterEmbeddingProvider()` (directly or via the provider factory when config.type is 'openrouter') with no argument and OPENROUTER_API_KEY unset in env / ~/.agentmemory/.env.","commonSituations":"Switching providers from openai to openrouter without migrating env vars; CI/production secrets not provisioned; .env not loaded because the file lives in the project dir instead of ~/.agentmemory/.env; key present under a differently-named variable.","solutions":["Set OPENROUTER_API_KEY in the environment or ~/.agentmemory/.env","Pass the key explicitly: new OpenRouterEmbeddingProvider(key)","Check the variable name casing and that your dotenv loading actually populates process.env before provider construction","For the gemini-via-OpenRouter path, note it reads GEMINI_API_KEY/GOOGLE_API_KEY instead — set whichever the chosen provider type requires"],"exampleFix":"// before\n// (no OPENROUTER_API_KEY set)\nconst provider = new OpenRouterEmbeddingProvider();\n// after\n// export OPENROUTER_API_KEY=sk-or-v1-...\nconst provider = new OpenRouterEmbeddingProvider();","handlingStrategy":"validation","validationCode":"const key = process.env.OPENROUTER_API_KEY;\nif (!key) throw new Error('Set OPENROUTER_API_KEY before using the openrouter embedding provider');\nconst provider = new OpenRouterEmbeddingProvider(key);","typeGuard":"const isNonEmptyString = (v: unknown): v is string => typeof v === 'string' && v.trim().length > 0;","tryCatchPattern":"try {\n  provider = new OpenRouterEmbeddingProvider();\n} catch (err) {\n  if (err instanceof Error && err.message === 'OPENROUTER_API_KEY is required') {\n    console.error('Set OPENROUTER_API_KEY in env or ~/.agentmemory/.env');\n    process.exit(1);\n  }\n  throw err;\n}","preventionTips":["Pre-flight env check at startup listing every required provider key","Migrate all provider keys together when switching provider types","Keep one canonical .env at ~/.agentmemory/.env loaded before any provider construction","Name secrets exactly as the library reads them (OPENROUTER_API_KEY)"],"tags":["api-key","missing-env-var","openrouter","configuration"],"backgroundTag":"missing-api-key","analyzedSha":"e04ba88819c365c9acf9d6661ea802143e728bd6","analyzedAt":"2026-08-30T01:07:40.754Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}