mongodb-rag-core
Version:
Common elements used by MongoDB Chatbot Framework components.
66 lines • 3.26 kB
JavaScript
;
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