UNPKG

@n8n/n8n-nodes-langchain

Version:

![Banner image](https://user-images.githubusercontent.com/10284570/173569848-c624317f-42b1-45a6-ab09-f0ea3c247648.png)

251 lines 10.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EmbeddingsOpenAi = void 0; const openai_1 = require("@langchain/openai"); const config_1 = require("@n8n/config"); const di_1 = require("@n8n/di"); const n8n_workflow_1 = require("n8n-workflow"); const checkDomainRestrictions_1 = require("../../../utils/checkDomainRestrictions"); const helpers_1 = require("../../../utils/helpers"); const ai_utilities_1 = require("@n8n/ai-utilities"); const modelParameter = { displayName: 'Model', name: 'model', type: 'options', description: 'The model which will generate the embeddings. <a href="https://platform.openai.com/docs/models/overview">Learn more</a>.', typeOptions: { loadOptions: { routing: { request: { method: 'GET', url: '={{ $parameter.options?.baseURL?.split("/").slice(-1).pop() || $credentials?.url?.split("/").slice(-1).pop() || "v1" }}/models', }, output: { postReceive: [ { type: 'rootProperty', properties: { property: 'data', }, }, { type: 'filter', properties: { pass: `={{ ($parameter.options?.baseURL && !$parameter.options?.baseURL?.startsWith('https://api.openai.com/')) || ($credentials?.url && !$credentials.url.startsWith('https://api.openai.com/')) || $responseItem.id.includes('embed') }}`, }, }, { type: 'setKeyValue', properties: { name: '={{$responseItem.id}}', value: '={{$responseItem.id}}', }, }, { type: 'sort', properties: { key: 'name', }, }, ], }, }, }, }, routing: { send: { type: 'body', property: 'model', }, }, default: 'text-embedding-3-small', }; class EmbeddingsOpenAi { constructor() { this.description = { displayName: 'Embeddings OpenAI', name: 'embeddingsOpenAi', icon: { light: 'file:openAiLight.svg', dark: 'file:openAiLight.dark.svg' }, credentials: [ { name: 'openAiApi', required: true, }, ], group: ['transform'], version: [1, 1.1, 1.2], description: 'Use Embeddings OpenAI', defaults: { name: 'Embeddings OpenAI', }, codex: { categories: ['AI'], subcategories: { AI: ['Embeddings'], }, resources: { primaryDocumentation: [ { url: 'https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.embeddingsopenai/', }, ], }, }, inputs: [], outputs: [n8n_workflow_1.NodeConnectionTypes.AiEmbedding], outputNames: ['Embeddings'], requestDefaults: { ignoreHttpStatusErrors: true, baseURL: '={{ $parameter.options?.baseURL?.split("/").slice(0,-1).join("/") || $credentials.url?.split("/").slice(0,-1).join("/") || "https://api.openai.com" }}', }, properties: [ (0, ai_utilities_1.getConnectionHintNoticeField)([n8n_workflow_1.NodeConnectionTypes.AiVectorStore]), { ...modelParameter, default: 'text-embedding-ada-002', displayOptions: { show: { '@version': [1], }, }, }, { ...modelParameter, displayOptions: { hide: { '@version': [1], }, }, }, { displayName: 'Options', name: 'options', placeholder: 'Add Option', description: 'Additional options to add', type: 'collection', default: {}, options: [ { displayName: 'Dimensions', name: 'dimensions', default: 1536, description: 'The number of dimensions the resulting output embeddings should have. Only supported in text-embedding-3 and later models.', type: 'options', options: [ { name: '256', value: 256, }, { name: '512', value: 512, }, { name: '1024', value: 1024, }, { name: '1536', value: 1536, }, { name: '3072', value: 3072, }, ], }, { displayName: 'Base URL', name: 'baseURL', default: 'https://api.openai.com/v1', description: 'Override the default base URL for the API', type: 'string', displayOptions: { hide: { '@version': [{ _cnd: { gte: 1.2 } }], }, }, }, { displayName: 'Batch Size', name: 'batchSize', default: 512, typeOptions: { maxValue: 2048 }, description: 'Maximum number of documents to send in each request', type: 'number', }, { displayName: 'Strip New Lines', name: 'stripNewLines', default: true, description: 'Whether to strip new lines from the input text', type: 'boolean', }, { displayName: 'Timeout', name: 'timeout', default: -1, description: 'Maximum amount of time a request is allowed to take in seconds. Set to -1 for no timeout.', type: 'number', }, { displayName: 'Encoding Format', name: 'encodingFormat', type: 'options', description: 'The format to return the embeddings in', default: 'float', options: [ { name: 'Float', value: 'float', }, { name: 'Base64', value: 'base64', }, ], }, ], }, ], }; } async supplyData(itemIndex) { this.logger.debug('Supply data for embeddings'); const credentials = await this.getCredentials('openAiApi'); const options = this.getNodeParameter('options', itemIndex, {}); if (options.timeout === -1) { options.timeout = undefined; } const { openAiDefaultHeaders: defaultHeaders } = di_1.Container.get(config_1.AiConfig); const configuration = { defaultHeaders, }; if (options.baseURL) { (0, checkDomainRestrictions_1.checkDomainRestrictions)(this, credentials, options.baseURL); configuration.baseURL = options.baseURL; } else if (credentials.url) { configuration.baseURL = credentials.url; } configuration.fetchOptions = { dispatcher: (0, ai_utilities_1.getProxyAgent)(configuration.baseURL ?? 'https://api.openai.com/v1', {}), }; configuration.defaultHeaders = (0, helpers_1.mergeCustomHeaders)(credentials, (configuration.defaultHeaders ?? {})); const embeddings = new openai_1.OpenAIEmbeddings({ model: this.getNodeParameter('model', itemIndex, 'text-embedding-3-small'), apiKey: credentials.apiKey, ...options, configuration, }); return { response: (0, ai_utilities_1.logWrapper)(embeddings, this), }; } } exports.EmbeddingsOpenAi = EmbeddingsOpenAi; //# sourceMappingURL=EmbeddingsOpenAi.node.js.map