@n8n/n8n-nodes-langchain 1.105.3 → 1.106.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/credentials/HuggingFaceApi.credentials.js +2 -2
  2. package/dist/credentials/HuggingFaceApi.credentials.js.map +1 -1
  3. package/dist/credentials/OllamaApi.credentials.js +18 -1
  4. package/dist/credentials/OllamaApi.credentials.js.map +1 -1
  5. package/dist/nodes/agents/Agent/V1/AgentV1.node.js +14 -0
  6. package/dist/nodes/agents/Agent/V1/AgentV1.node.js.map +1 -1
  7. package/dist/nodes/agents/Agent/V2/AgentV2.node.js +14 -0
  8. package/dist/nodes/agents/Agent/V2/AgentV2.node.js.map +1 -1
  9. package/dist/nodes/embeddings/EmbeddingsHuggingFaceInference/EmbeddingsHuggingFaceInference.node.js +14 -0
  10. package/dist/nodes/embeddings/EmbeddingsHuggingFaceInference/EmbeddingsHuggingFaceInference.node.js.map +1 -1
  11. package/dist/nodes/embeddings/EmbeddingsOllama/EmbeddingsOllama.node.js +5 -1
  12. package/dist/nodes/embeddings/EmbeddingsOllama/EmbeddingsOllama.node.js.map +1 -1
  13. package/dist/nodes/llms/LMChatOllama/LmChatOllama.node.js +5 -1
  14. package/dist/nodes/llms/LMChatOllama/LmChatOllama.node.js.map +1 -1
  15. package/dist/nodes/llms/LMOllama/LmOllama.node.js +5 -1
  16. package/dist/nodes/llms/LMOllama/LmOllama.node.js.map +1 -1
  17. package/dist/nodes/llms/LMOpenHuggingFaceInference/LmOpenHuggingFaceInference.node.js +1 -1
  18. package/dist/nodes/llms/LMOpenHuggingFaceInference/LmOpenHuggingFaceInference.node.js.map +1 -1
  19. package/dist/nodes/rerankers/RerankerCohere/RerankerCohere.node.js +10 -1
  20. package/dist/nodes/rerankers/RerankerCohere/RerankerCohere.node.js.map +1 -1
  21. package/dist/nodes/trigger/ChatTrigger/ChatTrigger.node.js +34 -4
  22. package/dist/nodes/trigger/ChatTrigger/ChatTrigger.node.js.map +1 -1
  23. package/dist/nodes/trigger/ChatTrigger/templates.js +31 -4
  24. package/dist/nodes/trigger/ChatTrigger/templates.js.map +1 -1
  25. package/dist/nodes/trigger/ChatTrigger/types.js +21 -0
  26. package/dist/nodes/trigger/ChatTrigger/types.js.map +1 -1
  27. package/dist/nodes/vector_store/shared/createVectorStoreNode/createVectorStoreNode.js +2 -1
  28. package/dist/nodes/vector_store/shared/createVectorStoreNode/createVectorStoreNode.js.map +1 -1
  29. package/dist/types/credentials.json +2 -2
  30. package/dist/types/nodes.json +14 -14
  31. package/dist/utils/N8nBinaryLoader.js.map +1 -1
  32. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"sources":["../../utils/N8nBinaryLoader.ts"],"sourcesContent":["import { CSVLoader } from '@langchain/community/document_loaders/fs/csv';\nimport { DocxLoader } from '@langchain/community/document_loaders/fs/docx';\nimport { EPubLoader } from '@langchain/community/document_loaders/fs/epub';\nimport { PDFLoader } from '@langchain/community/document_loaders/fs/pdf';\nimport type { Document } from '@langchain/core/documents';\nimport type { TextSplitter } from '@langchain/textsplitters';\nimport { createWriteStream } from 'fs';\nimport { JSONLoader } from 'langchain/document_loaders/fs/json';\nimport { TextLoader } from 'langchain/document_loaders/fs/text';\nimport type {\n\tIBinaryData,\n\tIExecuteFunctions,\n\tINodeExecutionData,\n\tISupplyDataFunctions,\n} from 'n8n-workflow';\nimport { NodeOperationError, BINARY_ENCODING } from 'n8n-workflow';\nimport { pipeline } from 'stream/promises';\nimport { file as tmpFile, type DirectoryResult } from 'tmp-promise';\n\nimport { getMetadataFiltersValues } from './helpers';\n\nconst SUPPORTED_MIME_TYPES = {\n\tauto: ['*/*'],\n\tpdfLoader: ['application/pdf'],\n\tcsvLoader: ['text/csv'],\n\tepubLoader: ['application/epub+zip'],\n\tdocxLoader: ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n\ttextLoader: ['text/plain', 'text/mdx', 'text/md'],\n\tjsonLoader: ['application/json'],\n};\n\nexport class N8nBinaryLoader {\n\tconstructor(\n\t\tprivate context: IExecuteFunctions | ISupplyDataFunctions,\n\t\tprivate optionsPrefix = '',\n\t\tprivate binaryDataKey = '',\n\t\tprivate textSplitter?: TextSplitter,\n\t) {}\n\n\tasync processAll(items?: INodeExecutionData[]): Promise<Document[]> {\n\t\tconst docs: Document[] = [];\n\n\t\tif (!items) return [];\n\n\t\tfor (let itemIndex = 0; itemIndex < items.length; itemIndex++) {\n\t\t\tconst processedDocuments = await this.processItem(items[itemIndex], itemIndex);\n\n\t\t\tdocs.push(...processedDocuments);\n\t\t}\n\n\t\treturn docs;\n\t}\n\n\tprivate async validateMimeType(\n\t\tmimeType: string,\n\t\tselectedLoader: keyof typeof SUPPORTED_MIME_TYPES,\n\t): Promise<void> {\n\t\t// Check if loader matches the mime-type of the data\n\t\tif (selectedLoader !== 'auto' && !SUPPORTED_MIME_TYPES[selectedLoader].includes(mimeType)) {\n\t\t\tconst neededLoader = Object.keys(SUPPORTED_MIME_TYPES).find((loader) =>\n\t\t\t\tSUPPORTED_MIME_TYPES[loader as keyof typeof SUPPORTED_MIME_TYPES].includes(mimeType),\n\t\t\t);\n\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.context.getNode(),\n\t\t\t\t`Mime type doesn't match selected loader. Please select under \"Loader Type\": ${neededLoader}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!Object.values(SUPPORTED_MIME_TYPES).flat().includes(mimeType)) {\n\t\t\tthrow new NodeOperationError(this.context.getNode(), `Unsupported mime type: ${mimeType}`);\n\t\t}\n\n\t\tif (\n\t\t\t!SUPPORTED_MIME_TYPES[selectedLoader].includes(mimeType) &&\n\t\t\tselectedLoader !== 'textLoader' &&\n\t\t\tselectedLoader !== 'auto'\n\t\t) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.context.getNode(),\n\t\t\t\t`Unsupported mime type: ${mimeType} for selected loader: ${selectedLoader}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async getFilePathOrBlob(\n\t\tbinaryData: IBinaryData,\n\t\tmimeType: string,\n\t): Promise<string | Blob> {\n\t\tif (binaryData.id) {\n\t\t\tconst binaryBuffer = await this.context.helpers.binaryToBuffer(\n\t\t\t\tawait this.context.helpers.getBinaryStream(binaryData.id),\n\t\t\t);\n\t\t\treturn new Blob([binaryBuffer], {\n\t\t\t\ttype: mimeType,\n\t\t\t});\n\t\t} else {\n\t\t\treturn new Blob([Buffer.from(binaryData.data, BINARY_ENCODING)], {\n\t\t\t\ttype: mimeType,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async getLoader(\n\t\tmimeType: string,\n\t\tfilePathOrBlob: string | Blob,\n\t\titemIndex: number,\n\t): Promise<PDFLoader | CSVLoader | EPubLoader | DocxLoader | TextLoader | JSONLoader> {\n\t\tswitch (mimeType) {\n\t\t\tcase 'application/pdf':\n\t\t\t\tconst splitPages = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}splitPages`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\tfalse,\n\t\t\t\t) as boolean;\n\t\t\t\treturn new PDFLoader(filePathOrBlob, { splitPages });\n\t\t\tcase 'text/csv':\n\t\t\t\tconst column = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}column`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\tnull,\n\t\t\t\t) as string;\n\t\t\t\tconst separator = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}separator`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\t',',\n\t\t\t\t) as string;\n\t\t\t\treturn new CSVLoader(filePathOrBlob, { column: column ?? undefined, separator });\n\t\t\tcase 'application/epub+zip':\n\t\t\t\t// EPubLoader currently does not accept Blobs https://github.com/langchain-ai/langchainjs/issues/1623\n\t\t\t\tlet filePath: string;\n\t\t\t\tif (filePathOrBlob instanceof Blob) {\n\t\t\t\t\tconst tmpFileData = await tmpFile({ prefix: 'epub-loader-' });\n\t\t\t\t\tconst bufferData = await filePathOrBlob.arrayBuffer();\n\t\t\t\t\tawait pipeline([new Uint8Array(bufferData)], createWriteStream(tmpFileData.path));\n\t\t\t\t\treturn new EPubLoader(tmpFileData.path);\n\t\t\t\t} else {\n\t\t\t\t\tfilePath = filePathOrBlob;\n\t\t\t\t}\n\t\t\t\treturn new EPubLoader(filePath);\n\t\t\tcase 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':\n\t\t\t\treturn new DocxLoader(filePathOrBlob);\n\t\t\tcase 'text/plain':\n\t\t\t\treturn new TextLoader(filePathOrBlob);\n\t\t\tcase 'application/json':\n\t\t\t\tconst pointers = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}pointers`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\t'',\n\t\t\t\t) as string;\n\t\t\t\tconst pointersArray = pointers.split(',').map((pointer) => pointer.trim());\n\t\t\t\treturn new JSONLoader(filePathOrBlob, pointersArray);\n\t\t\tdefault:\n\t\t\t\treturn new TextLoader(filePathOrBlob);\n\t\t}\n\t}\n\n\tprivate async loadDocuments(\n\t\tloader: PDFLoader | CSVLoader | EPubLoader | DocxLoader | TextLoader | JSONLoader,\n\t): Promise<Document[]> {\n\t\treturn this.textSplitter\n\t\t\t? await this.textSplitter.splitDocuments(await loader.load())\n\t\t\t: await loader.load();\n\t}\n\n\tprivate async cleanupTmpFileIfNeeded(\n\t\tcleanupTmpFile: DirectoryResult['cleanup'] | undefined,\n\t): Promise<void> {\n\t\tif (cleanupTmpFile) {\n\t\t\tawait cleanupTmpFile();\n\t\t}\n\t}\n\n\tasync processItem(item: INodeExecutionData, itemIndex: number): Promise<Document[]> {\n\t\tconst docs: Document[] = [];\n\t\tconst binaryMode = this.context.getNodeParameter('binaryMode', itemIndex, 'allInputData');\n\t\tif (binaryMode === 'allInputData') {\n\t\t\tconst binaryData = this.context.getInputData();\n\n\t\t\tfor (const data of binaryData) {\n\t\t\t\tif (data.binary) {\n\t\t\t\t\tconst binaryDataKeys = Object.keys(data.binary);\n\n\t\t\t\t\tfor (const fileKey of binaryDataKeys) {\n\t\t\t\t\t\tconst processedDocuments = await this.processItemByKey(item, itemIndex, fileKey);\n\t\t\t\t\t\tdocs.push(...processedDocuments);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst processedDocuments = await this.processItemByKey(item, itemIndex, this.binaryDataKey);\n\t\t\tdocs.push(...processedDocuments);\n\t\t}\n\n\t\treturn docs;\n\t}\n\n\tasync processItemByKey(\n\t\titem: INodeExecutionData,\n\t\titemIndex: number,\n\t\tbinaryKey: string,\n\t): Promise<Document[]> {\n\t\tconst selectedLoader: keyof typeof SUPPORTED_MIME_TYPES = this.context.getNodeParameter(\n\t\t\t'loader',\n\t\t\titemIndex,\n\t\t\t'auto',\n\t\t) as keyof typeof SUPPORTED_MIME_TYPES;\n\n\t\tconst docs: Document[] = [];\n\t\tconst metadata = getMetadataFiltersValues(this.context, itemIndex);\n\n\t\tif (!item) return [];\n\n\t\tconst binaryData = this.context.helpers.assertBinaryData(itemIndex, binaryKey);\n\t\tconst { mimeType } = binaryData;\n\n\t\tawait this.validateMimeType(mimeType, selectedLoader);\n\n\t\tconst filePathOrBlob = await this.getFilePathOrBlob(binaryData, mimeType);\n\t\tconst cleanupTmpFile: DirectoryResult['cleanup'] | undefined = undefined;\n\t\tconst loader = await this.getLoader(mimeType, filePathOrBlob, itemIndex);\n\t\tconst loadedDoc = await this.loadDocuments(loader);\n\n\t\tdocs.push(...loadedDoc);\n\n\t\tif (metadata) {\n\t\t\tdocs.forEach((document) => {\n\t\t\t\tdocument.metadata = {\n\t\t\t\t\t...document.metadata,\n\t\t\t\t\t...metadata,\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\n\t\tawait this.cleanupTmpFileIfNeeded(cleanupTmpFile);\n\n\t\treturn docs;\n\t}\n}\n"],"mappings":"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","names":["tmpFile"]}
1
+ {"version":3,"sources":["../../utils/N8nBinaryLoader.ts"],"sourcesContent":["import { CSVLoader } from '@langchain/community/document_loaders/fs/csv';\nimport { DocxLoader } from '@langchain/community/document_loaders/fs/docx';\nimport { EPubLoader } from '@langchain/community/document_loaders/fs/epub';\nimport { PDFLoader } from '@langchain/community/document_loaders/fs/pdf';\nimport type { Document } from '@langchain/core/documents';\nimport type { TextSplitter } from '@langchain/textsplitters';\nimport { createWriteStream } from 'fs';\nimport { JSONLoader } from 'langchain/document_loaders/fs/json';\nimport { TextLoader } from 'langchain/document_loaders/fs/text';\nimport type {\n\tIBinaryData,\n\tIExecuteFunctions,\n\tINodeExecutionData,\n\tISupplyDataFunctions,\n} from 'n8n-workflow';\nimport { NodeOperationError, BINARY_ENCODING } from 'n8n-workflow';\nimport { pipeline } from 'stream/promises';\nimport { file as tmpFile, type DirectoryResult } from 'tmp-promise';\n\nimport { getMetadataFiltersValues } from './helpers';\n\nconst SUPPORTED_MIME_TYPES = {\n\tauto: ['*/*'],\n\tpdfLoader: ['application/pdf'],\n\tcsvLoader: ['text/csv'],\n\tepubLoader: ['application/epub+zip'],\n\tdocxLoader: ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n\ttextLoader: ['text/plain', 'text/mdx', 'text/md'],\n\tjsonLoader: ['application/json'],\n};\n\nexport class N8nBinaryLoader {\n\tconstructor(\n\t\tprivate context: IExecuteFunctions | ISupplyDataFunctions,\n\t\tprivate optionsPrefix = '',\n\t\tprivate binaryDataKey = '',\n\t\tprivate textSplitter?: TextSplitter,\n\t) {}\n\n\tasync processAll(items?: INodeExecutionData[]): Promise<Document[]> {\n\t\tconst docs: Document[] = [];\n\n\t\tif (!items) return [];\n\n\t\tfor (let itemIndex = 0; itemIndex < items.length; itemIndex++) {\n\t\t\tconst processedDocuments = await this.processItem(items[itemIndex], itemIndex);\n\n\t\t\tdocs.push(...processedDocuments);\n\t\t}\n\n\t\treturn docs;\n\t}\n\n\tprivate async validateMimeType(\n\t\tmimeType: string,\n\t\tselectedLoader: keyof typeof SUPPORTED_MIME_TYPES,\n\t): Promise<void> {\n\t\t// Check if loader matches the mime-type of the data\n\t\tif (selectedLoader !== 'auto' && !SUPPORTED_MIME_TYPES[selectedLoader].includes(mimeType)) {\n\t\t\tconst neededLoader = Object.keys(SUPPORTED_MIME_TYPES).find((loader) =>\n\t\t\t\tSUPPORTED_MIME_TYPES[loader as keyof typeof SUPPORTED_MIME_TYPES].includes(mimeType),\n\t\t\t);\n\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.context.getNode(),\n\t\t\t\t`Mime type doesn't match selected loader. Please select under \"Loader Type\": ${neededLoader}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!Object.values(SUPPORTED_MIME_TYPES).flat().includes(mimeType)) {\n\t\t\tthrow new NodeOperationError(this.context.getNode(), `Unsupported mime type: ${mimeType}`);\n\t\t}\n\n\t\tif (\n\t\t\t!SUPPORTED_MIME_TYPES[selectedLoader].includes(mimeType) &&\n\t\t\tselectedLoader !== 'textLoader' &&\n\t\t\tselectedLoader !== 'auto'\n\t\t) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.context.getNode(),\n\t\t\t\t`Unsupported mime type: ${mimeType} for selected loader: ${selectedLoader}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async getFilePathOrBlob(\n\t\tbinaryData: IBinaryData,\n\t\tmimeType: string,\n\t): Promise<string | Blob> {\n\t\tif (binaryData.id) {\n\t\t\tconst binaryBuffer = await this.context.helpers.binaryToBuffer(\n\t\t\t\tawait this.context.helpers.getBinaryStream(binaryData.id),\n\t\t\t);\n\t\t\treturn new Blob([binaryBuffer as BlobPart], {\n\t\t\t\ttype: mimeType,\n\t\t\t});\n\t\t} else {\n\t\t\treturn new Blob([Buffer.from(binaryData.data, BINARY_ENCODING)], {\n\t\t\t\ttype: mimeType,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async getLoader(\n\t\tmimeType: string,\n\t\tfilePathOrBlob: string | Blob,\n\t\titemIndex: number,\n\t): Promise<PDFLoader | CSVLoader | EPubLoader | DocxLoader | TextLoader | JSONLoader> {\n\t\tswitch (mimeType) {\n\t\t\tcase 'application/pdf':\n\t\t\t\tconst splitPages = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}splitPages`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\tfalse,\n\t\t\t\t) as boolean;\n\t\t\t\treturn new PDFLoader(filePathOrBlob, { splitPages });\n\t\t\tcase 'text/csv':\n\t\t\t\tconst column = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}column`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\tnull,\n\t\t\t\t) as string;\n\t\t\t\tconst separator = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}separator`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\t',',\n\t\t\t\t) as string;\n\t\t\t\treturn new CSVLoader(filePathOrBlob, { column: column ?? undefined, separator });\n\t\t\tcase 'application/epub+zip':\n\t\t\t\t// EPubLoader currently does not accept Blobs https://github.com/langchain-ai/langchainjs/issues/1623\n\t\t\t\tlet filePath: string;\n\t\t\t\tif (filePathOrBlob instanceof Blob) {\n\t\t\t\t\tconst tmpFileData = await tmpFile({ prefix: 'epub-loader-' });\n\t\t\t\t\tconst bufferData = await filePathOrBlob.arrayBuffer();\n\t\t\t\t\tawait pipeline([new Uint8Array(bufferData)], createWriteStream(tmpFileData.path));\n\t\t\t\t\treturn new EPubLoader(tmpFileData.path);\n\t\t\t\t} else {\n\t\t\t\t\tfilePath = filePathOrBlob;\n\t\t\t\t}\n\t\t\t\treturn new EPubLoader(filePath);\n\t\t\tcase 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':\n\t\t\t\treturn new DocxLoader(filePathOrBlob);\n\t\t\tcase 'text/plain':\n\t\t\t\treturn new TextLoader(filePathOrBlob);\n\t\t\tcase 'application/json':\n\t\t\t\tconst pointers = this.context.getNodeParameter(\n\t\t\t\t\t`${this.optionsPrefix}pointers`,\n\t\t\t\t\titemIndex,\n\t\t\t\t\t'',\n\t\t\t\t) as string;\n\t\t\t\tconst pointersArray = pointers.split(',').map((pointer) => pointer.trim());\n\t\t\t\treturn new JSONLoader(filePathOrBlob, pointersArray);\n\t\t\tdefault:\n\t\t\t\treturn new TextLoader(filePathOrBlob);\n\t\t}\n\t}\n\n\tprivate async loadDocuments(\n\t\tloader: PDFLoader | CSVLoader | EPubLoader | DocxLoader | TextLoader | JSONLoader,\n\t): Promise<Document[]> {\n\t\treturn this.textSplitter\n\t\t\t? await this.textSplitter.splitDocuments(await loader.load())\n\t\t\t: await loader.load();\n\t}\n\n\tprivate async cleanupTmpFileIfNeeded(\n\t\tcleanupTmpFile: DirectoryResult['cleanup'] | undefined,\n\t): Promise<void> {\n\t\tif (cleanupTmpFile) {\n\t\t\tawait cleanupTmpFile();\n\t\t}\n\t}\n\n\tasync processItem(item: INodeExecutionData, itemIndex: number): Promise<Document[]> {\n\t\tconst docs: Document[] = [];\n\t\tconst binaryMode = this.context.getNodeParameter('binaryMode', itemIndex, 'allInputData');\n\t\tif (binaryMode === 'allInputData') {\n\t\t\tconst binaryData = this.context.getInputData();\n\n\t\t\tfor (const data of binaryData) {\n\t\t\t\tif (data.binary) {\n\t\t\t\t\tconst binaryDataKeys = Object.keys(data.binary);\n\n\t\t\t\t\tfor (const fileKey of binaryDataKeys) {\n\t\t\t\t\t\tconst processedDocuments = await this.processItemByKey(item, itemIndex, fileKey);\n\t\t\t\t\t\tdocs.push(...processedDocuments);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst processedDocuments = await this.processItemByKey(item, itemIndex, this.binaryDataKey);\n\t\t\tdocs.push(...processedDocuments);\n\t\t}\n\n\t\treturn docs;\n\t}\n\n\tasync processItemByKey(\n\t\titem: INodeExecutionData,\n\t\titemIndex: number,\n\t\tbinaryKey: string,\n\t): Promise<Document[]> {\n\t\tconst selectedLoader: keyof typeof SUPPORTED_MIME_TYPES = this.context.getNodeParameter(\n\t\t\t'loader',\n\t\t\titemIndex,\n\t\t\t'auto',\n\t\t) as keyof typeof SUPPORTED_MIME_TYPES;\n\n\t\tconst docs: Document[] = [];\n\t\tconst metadata = getMetadataFiltersValues(this.context, itemIndex);\n\n\t\tif (!item) return [];\n\n\t\tconst binaryData = this.context.helpers.assertBinaryData(itemIndex, binaryKey);\n\t\tconst { mimeType } = binaryData;\n\n\t\tawait this.validateMimeType(mimeType, selectedLoader);\n\n\t\tconst filePathOrBlob = await this.getFilePathOrBlob(binaryData, mimeType);\n\t\tconst cleanupTmpFile: DirectoryResult['cleanup'] | undefined = undefined;\n\t\tconst loader = await this.getLoader(mimeType, filePathOrBlob, itemIndex);\n\t\tconst loadedDoc = await this.loadDocuments(loader);\n\n\t\tdocs.push(...loadedDoc);\n\n\t\tif (metadata) {\n\t\t\tdocs.forEach((document) => {\n\t\t\t\tdocument.metadata = {\n\t\t\t\t\t...document.metadata,\n\t\t\t\t\t...metadata,\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\n\t\tawait this.cleanupTmpFileIfNeeded(cleanupTmpFile);\n\n\t\treturn docs;\n\t}\n}\n"],"mappings":"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","names":["tmpFile"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@n8n/n8n-nodes-langchain",
3
- "version": "1.105.3",
3
+ "version": "1.106.0",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -148,7 +148,7 @@
148
148
  "fast-glob": "3.2.12",
149
149
  "jest-mock-extended": "^3.0.4",
150
150
  "tsup": "^8.5.0",
151
- "n8n-core": "1.105.3"
151
+ "n8n-core": "1.106.0"
152
152
  },
153
153
  "dependencies": {
154
154
  "@aws-sdk/client-sso-oidc": "3.808.0",
@@ -158,7 +158,7 @@
158
158
  "@google-ai/generativelanguage": "2.6.0",
159
159
  "@google-cloud/resource-manager": "5.3.0",
160
160
  "@google/generative-ai": "0.21.0",
161
- "@huggingface/inference": "2.8.0",
161
+ "@huggingface/inference": "4.0.5",
162
162
  "@langchain/anthropic": "0.3.23",
163
163
  "@langchain/aws": "0.1.11",
164
164
  "@langchain/cohere": "0.3.4",
@@ -216,11 +216,11 @@
216
216
  "zod": "3.25.67",
217
217
  "zod-to-json-schema": "3.23.3",
218
218
  "@n8n/client-oauth2": "0.28.0",
219
- "@n8n/typescript-config": "1.3.0",
220
- "@n8n/json-schema-to-zod": "1.5.0",
221
- "n8n-workflow": "1.103.3",
222
219
  "@n8n/errors": "^0.4.0",
223
- "n8n-nodes-base": "1.104.3"
220
+ "@n8n/json-schema-to-zod": "1.5.0",
221
+ "@n8n/typescript-config": "1.3.0",
222
+ "n8n-nodes-base": "1.105.0",
223
+ "n8n-workflow": "1.104.0"
224
224
  },
225
225
  "license": "SEE LICENSE IN LICENSE.md",
226
226
  "homepage": "https://n8n.io",