{"record":{"id":"0f679ed7ccee4b03","repo":"mem0ai/mem0","slug":"sarvam-llm-failed-message","errorCode":null,"errorMessage":"Sarvam LLM failed: ${message}","messagePattern":"Sarvam LLM failed: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"mem0-ts/src/oss/src/llms/sarvam.ts","lineNumber":40,"sourceCode":"      apiKey,\n      baseURL:\n        config.baseURL ||\n        process.env.SARVAM_API_BASE ||\n        \"https://api.sarvam.ai/v1\",\n      model: config.model || \"sarvam-m\",\n    });\n  }\n\n  async generateResponse(\n    messages: Message[],\n    responseFormat?: { type: string },\n    tools?: any[],\n  ): Promise<string | LLMResponse> {\n    try {\n      return await super.generateResponse(messages, responseFormat, tools);\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      throw new Error(`Sarvam LLM failed: ${message}`);\n    }\n  }\n\n  async generateChat(messages: Message[]): Promise<LLMResponse> {\n    try {\n      return await super.generateChat(messages);\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      throw new Error(`Sarvam LLM failed: ${message}`);\n    }\n  }\n}\n","sourceCodeStart":22,"sourceCodeEnd":53,"githubUrl":"https://github.com/mem0ai/mem0/blob/001c235229be8795e3834520467bd0d661ed8f34/mem0-ts/src/oss/src/llms/sarvam.ts#L22-L53","documentation":"Thrown by SarvamLLM.generateResponse when the underlying request to Sarvam's OpenAI-compatible endpoint (default https://api.sarvam.ai/v1) fails. The suffix after 'Sarvam LLM failed:' preserves the raw Sarvam API error — typically 401 invalid key, 429 rate limit, subscription/quota issues, or invalid model.","triggerScenarios":"Calling generateResponse() with an invalid/expired Sarvam key, exhausted API credits, a wrong model name (default 'sarvam-m'), an unsupported responseFormat for the model, or when api.sarvam.ai / a custom SARVAM_API_BASE is unreachable.","commonSituations":"See trigger scenarios.","solutions":["Read the suffix: 401 → fix SARVAM_API_KEY; 429/quota → back off or top up the Sarvam plan; invalid model → correct the identifier.","Verify the key with a direct call: curl https://api.sarvam.ai/v1/models -H \"Authorization: Bearer $SARVAM_API_KEY\".","Retry transient (429/5xx/network) failures with exponential backoff; treat 401 as fatal.","If routing through a custom base, confirm the gateway is up and OpenAI-compatible."],"exampleFix":"// before\nawait sarvamLlm.generateResponse(messages, { type: 'json_object' });\n// Sarvam LLM failed: 401 Unauthorized\n\n// after\ntry {\n  await sarvamLlm.generateResponse(messages, { type: 'json_object' });\n} catch (e) {\n  if (/401/.test(String(e))) throw new ConfigError('Sarvam key invalid');\n  throw e;\n}","handlingStrategy":"retry","validationCode":"async function sarvamAuthed(key = process.env.SARVAM_API_KEY, base = 'https://api.sarvam.ai/v1') {\n  const r = await fetch(`${base}/models`, { headers: { Authorization: `Bearer ${key}` } });\n  if (r.status === 401) throw new Error('Sarvam key invalid');\n  return r.ok;\n}","typeGuard":"const isSarvamFatal = (e: unknown): boolean =>\n  e instanceof Error && e.message.startsWith('Sarvam LLM failed:') && /401|quota|credit/i.test(e.message);","tryCatchPattern":"try {\n  return await sarvamLlm.generateResponse(messages, responseFormat);\n} catch (err) {\n  if (isSarvamFatal(err)) throw err;\n  if (/429|timeout|ECONN/i.test(String(err))) return withRetry(fn, { retries: 3 });\n  throw err;\n}","preventionTips":["Validate the key with a direct /v1/models call during smoke tests.","Top up Sarvam credits before batch memory-ingestion jobs.","Retry only transient errors; auth failures need config changes."],"tags":["sarvam","llm","network","api-key","typescript"],"backgroundTag":null,"analyzedSha":"001c235229be8795e3834520467bd0d661ed8f34","analyzedAt":"2026-08-15T01:55:42.685Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}