UNPKG

mongodb-rag-core

Version:

Common elements used by MongoDB Chatbot Framework components.

66 lines 3.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.makeOpenAiEmbedder = void 0; const logger_1 = require("../logger"); const common_tags_1 = require("common-tags"); const exponential_backoff_1 = require("exponential-backoff"); /** Constructor for implementation of the {@link Embedder} using [OpenAI Embeddings API](https://platform.openai.com/docs/guides/embeddings). */ const makeOpenAiEmbedder = ({ backoffOptions: backoffOptionsIn, deployment, openAiClient, }) => { const backoffOptions = backoffOptionsIn ?? { jitter: "full", maxDelay: 10000, }; const DEFAULT_WAIT_SECONDS = 5; return { async embed({ text }) { return (0, exponential_backoff_1.backOff)(async () => { const response = await openAiClient.embeddings.create({ model: deployment, input: [text], }); return { embedding: response.data[0].embedding }; }, { ...backoffOptions, async retry(err, attemptNumber) { // Catch errors if response 4XX or 5XX if (err.code === undefined) { logger_1.logger.error(`OpenAI Embedding API request failed with unknown error: ${JSON.stringify(err)}`); return false; } const { code: codeString, message } = err; const code = parseInt(codeString); const errorMessage = message ?? "Unknown error"; if (code === 429) { logger_1.logger.info(`OpenAI Embedding API rate limited (attempt ${attemptNumber - 1}): ${errorMessage}`); // Quick optimization for retry where we wait as long as it tells us // to (if it does) const matches = /retry after ([0-9]+) seconds/.exec(errorMessage); const waitSeconds = matches ? parseInt(matches[1]) : DEFAULT_WAIT_SECONDS; if (waitSeconds) { await new Promise((resolve) => setTimeout(resolve, waitSeconds * 1000)); } return true; // Keep trying until max attempts } // Azure OpenAI service returns 5XX errors for rate limiting in addition to 429 if (code >= 500) { logger_1.logger.info(`OpenAI Embedding API unavailable (attempt ${attemptNumber - 1}): ${errorMessage}`); await new Promise((resolve) => setTimeout(resolve, DEFAULT_WAIT_SECONDS * 1000)); return true; // Keep trying until max attempts } const resultMessage = (0, common_tags_1.stripIndent) `OpenAI Embedding API returned an error: - code: ${code} - message: ${errorMessage}`; logger_1.logger.error(resultMessage); return false; }, }); }, }; }; exports.makeOpenAiEmbedder = makeOpenAiEmbedder; //# sourceMappingURL=OpenAiEmbedder.js.map