Spaces:
Sleeping
Sleeping
| const require_client = require("./utils/client.cjs"); | |
| const require_azure = require("./utils/azure.cjs"); | |
| let openai = require("openai"); | |
| let _langchain_core_utils_env = require("@langchain/core/utils/env"); | |
| let _langchain_core_utils_chunk_array = require("@langchain/core/utils/chunk_array"); | |
| let _langchain_core_embeddings = require("@langchain/core/embeddings"); | |
| //#region src/embeddings.ts | |
| /** | |
| * Class for generating embeddings using the OpenAI API. | |
| * | |
| * To use with Azure, import the `AzureOpenAIEmbeddings` class. | |
| * | |
| * @example | |
| * ```typescript | |
| * // Embed a query using OpenAIEmbeddings to generate embeddings for a given text | |
| * const model = new OpenAIEmbeddings(); | |
| * const res = await model.embedQuery( | |
| * "What would be a good company name for a company that makes colorful socks?", | |
| * ); | |
| * console.log({ res }); | |
| * | |
| * ``` | |
| */ | |
| var OpenAIEmbeddings = class extends _langchain_core_embeddings.Embeddings { | |
| model = "text-embedding-ada-002"; | |
| /** @deprecated Use "model" instead */ | |
| modelName; | |
| batchSize = 512; | |
| stripNewLines = true; | |
| /** | |
| * The number of dimensions the resulting output embeddings should have. | |
| * Only supported in `text-embedding-3` and later models. | |
| */ | |
| dimensions; | |
| timeout; | |
| organization; | |
| encodingFormat; | |
| client; | |
| clientConfig; | |
| apiKey; | |
| constructor(fields) { | |
| const fieldsWithDefaults = { | |
| maxConcurrency: 2, | |
| ...fields | |
| }; | |
| super(fieldsWithDefaults); | |
| const apiKey = fieldsWithDefaults?.apiKey ?? fieldsWithDefaults?.openAIApiKey ?? (0, _langchain_core_utils_env.getEnvironmentVariable)("OPENAI_API_KEY"); | |
| this.organization = fieldsWithDefaults?.configuration?.organization ?? (0, _langchain_core_utils_env.getEnvironmentVariable)("OPENAI_ORGANIZATION"); | |
| this.model = fieldsWithDefaults?.model ?? fieldsWithDefaults?.modelName ?? this.model; | |
| this.modelName = this.model; | |
| this.batchSize = fieldsWithDefaults?.batchSize ?? this.batchSize; | |
| this.stripNewLines = fieldsWithDefaults?.stripNewLines ?? this.stripNewLines; | |
| this.timeout = fieldsWithDefaults?.timeout; | |
| this.dimensions = fieldsWithDefaults?.dimensions; | |
| this.encodingFormat = fieldsWithDefaults?.encodingFormat; | |
| this.clientConfig = { | |
| apiKey, | |
| organization: this.organization, | |
| dangerouslyAllowBrowser: true, | |
| ...fields?.configuration | |
| }; | |
| } | |
| /** | |
| * Method to generate embeddings for an array of documents. Splits the | |
| * documents into batches and makes requests to the OpenAI API to generate | |
| * embeddings. | |
| * @param texts Array of documents to generate embeddings for. | |
| * @returns Promise that resolves to a 2D array of embeddings for each document. | |
| */ | |
| async embedDocuments(texts) { | |
| const batches = (0, _langchain_core_utils_chunk_array.chunkArray)(this.stripNewLines ? texts.map((t) => t.replace(/\n/g, " ")) : texts, this.batchSize); | |
| const batchRequests = batches.map((batch) => { | |
| const params = { | |
| model: this.model, | |
| input: batch | |
| }; | |
| if (this.dimensions) params.dimensions = this.dimensions; | |
| if (this.encodingFormat) params.encoding_format = this.encodingFormat; | |
| return this.embeddingWithRetry(params); | |
| }); | |
| const batchResponses = await Promise.all(batchRequests); | |
| const embeddings = []; | |
| for (let i = 0; i < batchResponses.length; i += 1) { | |
| const batch = batches[i]; | |
| const { data: batchResponse } = batchResponses[i]; | |
| for (let j = 0; j < batch.length; j += 1) embeddings.push(batchResponse[j].embedding); | |
| } | |
| return embeddings; | |
| } | |
| /** | |
| * Method to generate an embedding for a single document. Calls the | |
| * embeddingWithRetry method with the document as the input. | |
| * @param text Document to generate an embedding for. | |
| * @returns Promise that resolves to an embedding for the document. | |
| */ | |
| async embedQuery(text) { | |
| const params = { | |
| model: this.model, | |
| input: this.stripNewLines ? text.replace(/\n/g, " ") : text | |
| }; | |
| if (this.dimensions) params.dimensions = this.dimensions; | |
| if (this.encodingFormat) params.encoding_format = this.encodingFormat; | |
| const { data } = await this.embeddingWithRetry(params); | |
| return data[0].embedding; | |
| } | |
| /** | |
| * Private method to make a request to the OpenAI API to generate | |
| * embeddings. Handles the retry logic and returns the response from the | |
| * API. | |
| * @param request Request to send to the OpenAI API. | |
| * @returns Promise that resolves to the response from the API. | |
| */ | |
| async embeddingWithRetry(request) { | |
| if (!this.client) { | |
| const endpoint = require_azure.getEndpoint({ baseURL: this.clientConfig.baseURL }); | |
| const params = { | |
| ...this.clientConfig, | |
| baseURL: endpoint, | |
| timeout: this.timeout, | |
| maxRetries: 0 | |
| }; | |
| if (!params.baseURL) delete params.baseURL; | |
| params.defaultHeaders = require_azure.getHeadersWithUserAgent(params.defaultHeaders); | |
| this.client = new openai.OpenAI(params); | |
| } | |
| const requestOptions = {}; | |
| return this.caller.call(async () => { | |
| try { | |
| return await this.client.embeddings.create(request, requestOptions); | |
| } catch (e) { | |
| throw require_client.wrapOpenAIClientError(e); | |
| } | |
| }); | |
| } | |
| }; | |
| //#endregion | |
| exports.OpenAIEmbeddings = OpenAIEmbeddings; | |
| //# sourceMappingURL=embeddings.cjs.map |