{"record":{"id":"360ff021173fe66d","repo":"Mintplex-Labs/anything-llm","slug":"genericopenai-failed-to-embed-error-message","errorCode":null,"errorMessage":"GenericOpenAI Failed to embed: ${error.message}","messagePattern":"GenericOpenAI Failed to embed: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"server/utils/EmbeddingEngines/genericOpenAi/index.js","lineNumber":156,"sourceCode":"          .create({\n            model: this.model,\n            input: chunk,\n          })\n          .then((result) => resolve({ data: result?.data, error: null }))\n          .catch((e) => {\n            e.type =\n              e?.response?.data?.error?.code ||\n              e?.response?.status ||\n              \"failed_to_embed\";\n            e.message = e?.response?.data?.error?.message || e.message;\n            resolve({ data: [], error: e });\n          });\n      });\n\n      // If any errors were returned from OpenAI abort the entire sequence because the embeddings\n      // will be incomplete.\n      if (error)\n        throw new Error(`GenericOpenAI Failed to embed: ${error.message}`);\n      allResults.push(...(data || []));\n      reportEmbeddingProgress(allResults.length, textChunks.length);\n      if (this.apiRequestDelay) await this.runDelay();\n    }\n\n    return allResults.length > 0 &&\n      allResults.every((embd) => embd.hasOwnProperty(\"embedding\"))\n      ? allResults.map((embd) => embd.embedding)\n      : null;\n  }\n}\n\nmodule.exports = {\n  GenericOpenAiEmbedder,\n};\n","sourceCodeStart":138,"sourceCodeEnd":172,"githubUrl":"https://github.com/Mintplex-Labs/anything-llm/blob/526360e320da9d1b36074be5ed64fe76e5bbfbbd/server/utils/EmbeddingEngines/genericOpenAi/index.js#L138-L172","documentation":"Thrown inside the embedChunks loop when a batch returns an error. Unlike the Azure/Cohere/Gemini embedders, this is a single per-batch error (error.message), not an aggregated set, and the loop aborts on the first batch that fails. The message is prefixed 'GenericOpenAI Failed to embed:'.","triggerScenarios":"Upstream at EMBEDDING_BASE_PATH returns non-200 (auth required but key unset/invalid, model not loaded, internal error); EMBEDDING_MODEL_PREF names a model the server does not expose; chunks exceed the server's max tokens; network/timeout to the local or remote generic endpoint.","commonSituations":"Local LLM server (Ollama/LM Studio/vLLM) not running or model not pulled; GENERIC_OPEN_AI_EMBEDDING_API_KEY required by the proxy but unset; mistyped model id; proxy rate limiting.","solutions":["Read error.message: 'model not found' -> pull/load the model and set EMBEDDING_MODEL_PREF correctly; 'unauthorized' -> set GENERIC_OPEN_AI_EMBEDDING_API_KEY; connection errors -> confirm the server is up at EMBEDDING_BASE_PATH.","GET <EMBEDDING_BASE_PATH>/models to confirm the model id is exposed before embedding.","Shorten chunks to fit the local model's context; reduce concurrency if the server is resource-limited.","Retry transient local-server errors after the server is healthy."],"exampleFix":"// before\nif (error) throw new Error(`GenericOpenAI Failed to embed: ${error.message}`);\n\n// after (retry once on transient, then surface)\nif (error) {\n  if (isTransient(error)) { /* retry batch */ }\n  else throw new Error(`GenericOpenAI Failed to embed: ${error.message}`);\n}","handlingStrategy":"try-catch","validationCode":"// Pre-flight: confirm the upstream exposes the model before bulk embedding\nconst { OpenAI } = require('openai');\nconst client = new OpenAI({ baseURL: process.env.EMBEDDING_BASE_PATH, apiKey: process.env.GENERIC_OPEN_AI_EMBEDDING_API_KEY ?? null });\nconst list = await client.models.list();\nif (!list.body.some((m) => m.id === process.env.EMBEDDING_MODEL_PREF)) {\n  throw new Error(`Generic upstream does not expose model ${process.env.EMBEDDING_MODEL_PREF}`);\n}","typeGuard":null,"tryCatchPattern":"try {\n  await embedder.embedChunks(chunks);\n} catch (e) {\n  const msg = e.message;\n  if (/model.*not|404/i.test(msg)) loadModel();\n  else if (/unauthorized|401/i.test(msg)) setApiKey();\n  else if (/econnrefused|timeout|socket/i.test(msg)) waitForServer();\n  else throw e;\n}","preventionTips":["Pre-flight models.list() to confirm the upstream exposes your model id.","Keep the local/generic server running and the model loaded before embedding.","Set GENERIC_OPEN_AI_EMBEDDING_API_KEY if the proxy enforces auth."],"tags":["generic-openai","embeddings","local-llm","network","batch"],"backgroundTag":null,"analyzedSha":"526360e320da9d1b36074be5ed64fe76e5bbfbbd","analyzedAt":"2026-08-13T01:45:47.170Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}