From b4c2550c77dc28cc7c96c8a8a48a6b9234d1fa60 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 17 Aug 2023 21:23:40 +0100 Subject: [PATCH] add Milvus --- .../credentials/MilvusAuth.credential.ts | 31 ++ .../vectorstores/Milvus/Milvus_Existing.ts | 185 ++++++++++++ .../vectorstores/Milvus/Milvus_Upsert.ts | 281 ++++++++++++++++++ .../nodes/vectorstores/Milvus/milvus.svg | 5 + .../Milvus_Existing/Milvus_Existing.ts | 132 -------- .../vectorstores/Milvus_Existing/milvus.jpg | Bin 9320 -> 0 bytes .../Milvus_Upsert/Milvus_Upsert.ts | 148 --------- .../vectorstores/Milvus_Upsert/milvus.jpg | Bin 9320 -> 0 bytes packages/components/package.json | 1 + 9 files changed, 503 insertions(+), 280 deletions(-) create mode 100644 packages/components/credentials/MilvusAuth.credential.ts create mode 100644 packages/components/nodes/vectorstores/Milvus/Milvus_Existing.ts create mode 100644 packages/components/nodes/vectorstores/Milvus/Milvus_Upsert.ts create mode 100644 packages/components/nodes/vectorstores/Milvus/milvus.svg delete mode 100644 packages/components/nodes/vectorstores/Milvus_Existing/Milvus_Existing.ts delete mode 100644 packages/components/nodes/vectorstores/Milvus_Existing/milvus.jpg delete mode 100644 packages/components/nodes/vectorstores/Milvus_Upsert/Milvus_Upsert.ts delete mode 100644 packages/components/nodes/vectorstores/Milvus_Upsert/milvus.jpg diff --git a/packages/components/credentials/MilvusAuth.credential.ts b/packages/components/credentials/MilvusAuth.credential.ts new file mode 100644 index 000000000..b94e1fc8d --- /dev/null +++ b/packages/components/credentials/MilvusAuth.credential.ts @@ -0,0 +1,31 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class MilvusCredential implements INodeCredential { + label: string + name: string + version: number + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Milvus Auth' + this.name = 'milvusAuth' + this.version = 1.0 + this.description = + 'You can find the Milvus Authentication from here page.' + this.inputs = [ + { + label: 'Milvus User', + name: 'milvusUser', + type: 'string' + }, + { + label: 'Milvus Password', + name: 'milvusPassword', + type: 'password' + } + ] + } +} + +module.exports = { credClass: MilvusCredential } diff --git a/packages/components/nodes/vectorstores/Milvus/Milvus_Existing.ts b/packages/components/nodes/vectorstores/Milvus/Milvus_Existing.ts new file mode 100644 index 000000000..514fdc732 --- /dev/null +++ b/packages/components/nodes/vectorstores/Milvus/Milvus_Existing.ts @@ -0,0 +1,185 @@ +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { DataType, ErrorCode } from '@zilliz/milvus2-sdk-node' +import { MilvusLibArgs, Milvus } from 'langchain/vectorstores/milvus' +import { Embeddings } from 'langchain/embeddings/base' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' +import { Document } from 'langchain/document' + +class Milvus_Existing_VectorStores implements INode { + label: string + name: string + version: number + description: string + type: string + icon: string + category: string + baseClasses: string[] + inputs: INodeParams[] + credential: INodeParams + outputs: INodeOutputsValue[] + + constructor() { + this.label = 'Milvus Load Existing collection' + this.name = 'milvusExistingCollection' + this.version = 1.0 + this.type = 'Milvus' + this.icon = 'milvus.svg' + this.category = 'Vector Stores' + this.description = 'Load existing collection from Milvus (i.e: Document has been upserted)' + this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + optional: true, + credentialNames: ['milvusAuth'] + } + this.inputs = [ + { + label: 'Embeddings', + name: 'embeddings', + type: 'Embeddings' + }, + { + label: 'Milvus Server URL', + name: 'milvusServerUrl', + type: 'string', + placeholder: 'http://localhost:19530' + }, + { + label: 'Milvus Collection Name', + name: 'milvusCollection', + type: 'string' + } + ] + this.outputs = [ + { + label: 'Milvus Retriever', + name: 'retriever', + baseClasses: this.baseClasses + }, + { + label: 'Milvus Vector Store', + name: 'vectorStore', + baseClasses: [this.type, ...getBaseClasses(Milvus)] + } + ] + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + // server setup + const address = nodeData.inputs?.milvusServerUrl as string + const collectionName = nodeData.inputs?.milvusCollection as string + + // embeddings + const embeddings = nodeData.inputs?.embeddings as Embeddings + const topK = nodeData.inputs?.topK as string + + // output + const output = nodeData.outputs?.output as string + + // format data + const k = topK ? parseInt(topK, 10) : 4 + + // credential + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const milvusUser = getCredentialParam('milvusUser', credentialData, nodeData) + const milvusPassword = getCredentialParam('milvusPassword', credentialData, nodeData) + + // init MilvusLibArgs + const milVusArgs: MilvusLibArgs = { + url: address, + collectionName: collectionName + } + + if (milvusUser) milVusArgs.username = milvusUser + if (milvusPassword) milVusArgs.password = milvusPassword + + const vectorStore = await Milvus.fromExistingCollection(embeddings, milVusArgs) + + // Avoid Illegal Invocation + vectorStore.similaritySearchVectorWithScore = async (query: number[], k: number, filter?: string) => { + const hasColResp = await vectorStore.client.hasCollection({ + collection_name: vectorStore.collectionName + }) + if (hasColResp.status.error_code !== ErrorCode.SUCCESS) { + throw new Error(`Error checking collection: ${hasColResp}`) + } + if (hasColResp.value === false) { + throw new Error(`Collection not found: ${vectorStore.collectionName}, please create collection before search.`) + } + + const filterStr = filter ?? '' + + await vectorStore.grabCollectionFields() + + const loadResp = await vectorStore.client.loadCollectionSync({ + collection_name: vectorStore.collectionName + }) + + if (loadResp.error_code !== ErrorCode.SUCCESS) { + throw new Error(`Error loading collection: ${loadResp}`) + } + + const outputFields = vectorStore.fields.filter((field) => field !== vectorStore.vectorField) + + const searchResp = await vectorStore.client.search({ + collection_name: vectorStore.collectionName, + search_params: { + anns_field: vectorStore.vectorField, + topk: k.toString(), + metric_type: vectorStore.indexCreateParams.metric_type, + params: vectorStore.indexSearchParams + }, + output_fields: outputFields, + vector_type: DataType.FloatVector, + vectors: [query], + filter: filterStr + }) + if (searchResp.status.error_code !== ErrorCode.SUCCESS) { + throw new Error(`Error searching data: ${JSON.stringify(searchResp)}`) + } + const results: [Document, number][] = [] + searchResp.results.forEach((result) => { + const fields = { + pageContent: '', + metadata: {} as Record + } + Object.keys(result).forEach((key) => { + if (key === vectorStore.textField) { + fields.pageContent = result[key] + } else if (vectorStore.fields.includes(key) || key === vectorStore.primaryField) { + if (typeof result[key] === 'string') { + const { isJson, obj } = checkJsonString(result[key]) + fields.metadata[key] = isJson ? obj : result[key] + } else { + fields.metadata[key] = result[key] + } + } + }) + results.push([new Document(fields), result.score]) + }) + return results + } + + if (output === 'retriever') { + const retriever = vectorStore.asRetriever(k) + return retriever + } else if (output === 'vectorStore') { + ;(vectorStore as any).k = k + return vectorStore + } + return vectorStore + } +} + +function checkJsonString(value: string): { isJson: boolean; obj: any } { + try { + const result = JSON.parse(value) + return { isJson: true, obj: result } + } catch (e) { + return { isJson: false, obj: null } + } +} + +module.exports = { nodeClass: Milvus_Existing_VectorStores } diff --git a/packages/components/nodes/vectorstores/Milvus/Milvus_Upsert.ts b/packages/components/nodes/vectorstores/Milvus/Milvus_Upsert.ts new file mode 100644 index 000000000..ca69cb395 --- /dev/null +++ b/packages/components/nodes/vectorstores/Milvus/Milvus_Upsert.ts @@ -0,0 +1,281 @@ +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { DataType, ErrorCode, MetricType, IndexType } from '@zilliz/milvus2-sdk-node' +import { MilvusLibArgs, Milvus } from 'langchain/vectorstores/milvus' +import { Embeddings } from 'langchain/embeddings/base' +import { Document } from 'langchain/document' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' +import { flatten } from 'lodash' + +interface InsertRow { + [x: string]: string | number[] +} + +class Milvus_Upsert_VectorStores implements INode { + label: string + name: string + version: number + description: string + type: string + icon: string + category: string + baseClasses: string[] + inputs: INodeParams[] + credential: INodeParams + outputs: INodeOutputsValue[] + + constructor() { + this.label = 'Milvus Upsert Document' + this.name = 'milvusUpsert' + this.version = 1.0 + this.type = 'Milvus' + this.icon = 'milvus.svg' + this.category = 'Vector Stores' + this.description = 'Upsert documents to Milvus' + this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + optional: true, + credentialNames: ['milvusAuth'] + } + this.inputs = [ + { + label: 'Document', + name: 'document', + type: 'Document', + list: true + }, + { + label: 'Embeddings', + name: 'embeddings', + type: 'Embeddings' + }, + { + label: 'Milvus Server URL', + name: 'milvusServerUrl', + type: 'string', + placeholder: 'http://localhost:19530' + }, + { + label: 'Milvus Collection Name', + name: 'milvusCollection', + type: 'string' + } + ] + this.outputs = [ + { + label: 'Milvus Retriever', + name: 'retriever', + baseClasses: this.baseClasses + }, + { + label: 'Milvus Vector Store', + name: 'vectorStore', + baseClasses: [this.type, ...getBaseClasses(Milvus)] + } + ] + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + // server setup + const address = nodeData.inputs?.milvusServerUrl as string + const collectionName = nodeData.inputs?.milvusCollection as string + + // embeddings + const docs = nodeData.inputs?.document as Document[] + const embeddings = nodeData.inputs?.embeddings as Embeddings + const topK = nodeData.inputs?.topK as string + + // output + const output = nodeData.outputs?.output as string + + // format data + const k = topK ? parseInt(topK, 10) : 4 + + // credential + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const milvusUser = getCredentialParam('milvusUser', credentialData, nodeData) + const milvusPassword = getCredentialParam('milvusPassword', credentialData, nodeData) + + // init MilvusLibArgs + const milVusArgs: MilvusLibArgs = { + url: address, + collectionName: collectionName + } + + if (milvusUser) milVusArgs.username = milvusUser + if (milvusPassword) milVusArgs.password = milvusPassword + + const flattenDocs = docs && docs.length ? flatten(docs) : [] + const finalDocs = [] + for (let i = 0; i < flattenDocs.length; i += 1) { + finalDocs.push(new Document(flattenDocs[i])) + } + + const vectorStore = await MilvusUpsert.fromDocuments(finalDocs, embeddings, milVusArgs) + + // Avoid Illegal Invocation + vectorStore.similaritySearchVectorWithScore = async (query: number[], k: number, filter?: string) => { + const hasColResp = await vectorStore.client.hasCollection({ + collection_name: vectorStore.collectionName + }) + if (hasColResp.status.error_code !== ErrorCode.SUCCESS) { + throw new Error(`Error checking collection: ${hasColResp}`) + } + if (hasColResp.value === false) { + throw new Error(`Collection not found: ${vectorStore.collectionName}, please create collection before search.`) + } + + const filterStr = filter ?? '' + + await vectorStore.grabCollectionFields() + + const loadResp = await vectorStore.client.loadCollectionSync({ + collection_name: vectorStore.collectionName + }) + if (loadResp.error_code !== ErrorCode.SUCCESS) { + throw new Error(`Error loading collection: ${loadResp}`) + } + + const outputFields = vectorStore.fields.filter((field) => field !== vectorStore.vectorField) + + const searchResp = await vectorStore.client.search({ + collection_name: vectorStore.collectionName, + search_params: { + anns_field: vectorStore.vectorField, + topk: k.toString(), + metric_type: vectorStore.indexCreateParams.metric_type, + params: vectorStore.indexSearchParams + }, + output_fields: outputFields, + vector_type: DataType.FloatVector, + vectors: [query], + filter: filterStr + }) + if (searchResp.status.error_code !== ErrorCode.SUCCESS) { + throw new Error(`Error searching data: ${JSON.stringify(searchResp)}`) + } + const results: [Document, number][] = [] + searchResp.results.forEach((result) => { + const fields = { + pageContent: '', + metadata: {} as Record + } + Object.keys(result).forEach((key) => { + if (key === vectorStore.textField) { + fields.pageContent = result[key] + } else if (vectorStore.fields.includes(key) || key === vectorStore.primaryField) { + if (typeof result[key] === 'string') { + const { isJson, obj } = checkJsonString(result[key]) + fields.metadata[key] = isJson ? obj : result[key] + } else { + fields.metadata[key] = result[key] + } + } + }) + results.push([new Document(fields), result.score]) + }) + return results + } + + if (output === 'retriever') { + const retriever = vectorStore.asRetriever(k) + return retriever + } else if (output === 'vectorStore') { + ;(vectorStore as any).k = k + return vectorStore + } + return vectorStore + } +} + +function checkJsonString(value: string): { isJson: boolean; obj: any } { + try { + const result = JSON.parse(value) + return { isJson: true, obj: result } + } catch (e) { + return { isJson: false, obj: null } + } +} + +class MilvusUpsert extends Milvus { + async addVectors(vectors: number[][], documents: Document[]): Promise { + if (vectors.length === 0) { + return + } + await this.ensureCollection(vectors, documents) + + const insertDatas: InsertRow[] = [] + + for (let index = 0; index < vectors.length; index++) { + const vec = vectors[index] + const doc = documents[index] + const data: InsertRow = { + [this.textField]: doc.pageContent, + [this.vectorField]: vec + } + this.fields.forEach((field) => { + switch (field) { + case this.primaryField: + if (!this.autoId) { + if (doc.metadata[this.primaryField] === undefined) { + throw new Error( + `The Collection's primaryField is configured with autoId=false, thus its value must be provided through metadata.` + ) + } + data[field] = doc.metadata[this.primaryField] + } + break + case this.textField: + data[field] = doc.pageContent + break + case this.vectorField: + data[field] = vec + break + default: // metadata fields + if (doc.metadata[field] === undefined) { + throw new Error(`The field "${field}" is not provided in documents[${index}].metadata.`) + } else if (typeof doc.metadata[field] === 'object') { + data[field] = JSON.stringify(doc.metadata[field]) + } else { + data[field] = doc.metadata[field] + } + break + } + }) + + insertDatas.push(data) + } + + const descIndexResp = await this.client.describeIndex({ + collection_name: this.collectionName + }) + + if (descIndexResp.status.error_code === ErrorCode.INDEX_NOT_EXIST) { + const resp = await this.client.createIndex({ + collection_name: this.collectionName, + field_name: this.vectorField, + index_name: `myindex_${Date.now().toString()}`, + index_type: IndexType.AUTOINDEX, + metric_type: MetricType.L2 + }) + if (resp.error_code !== ErrorCode.SUCCESS) { + throw new Error(`Error creating index`) + } + } + + const insertResp = await this.client.insert({ + collection_name: this.collectionName, + fields_data: insertDatas + }) + + if (insertResp.status.error_code !== ErrorCode.SUCCESS) { + throw new Error(`Error inserting data: ${JSON.stringify(insertResp)}`) + } + + await this.client.flushSync({ collection_names: [this.collectionName] }) + } +} + +module.exports = { nodeClass: Milvus_Upsert_VectorStores } diff --git a/packages/components/nodes/vectorstores/Milvus/milvus.svg b/packages/components/nodes/vectorstores/Milvus/milvus.svg new file mode 100644 index 000000000..68dfef66c --- /dev/null +++ b/packages/components/nodes/vectorstores/Milvus/milvus.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/components/nodes/vectorstores/Milvus_Existing/Milvus_Existing.ts b/packages/components/nodes/vectorstores/Milvus_Existing/Milvus_Existing.ts deleted file mode 100644 index ebfd566c7..000000000 --- a/packages/components/nodes/vectorstores/Milvus_Existing/Milvus_Existing.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' -import { Milvus, MilvusLibArgs } from 'langchain/vectorstores/milvus' -import { Embeddings } from 'langchain/embeddings/base' -import { getBaseClasses } from '../../../src/utils' - -class Milvus_Existing_VectorStores implements INode { - label: string - name: string - description: string - type: string - icon: string - category: string - baseClasses: string[] - inputs: INodeParams[] - outputs: INodeOutputsValue[] - - constructor() { - this.label = 'Milvus Load Existing Index' - this.name = 'milvusExistingIndex' - this.type = 'Milvus' - this.icon = 'milvus.jpg' - this.category = 'Vector Stores' - this.description = 'Load existing index from Milvus (i.e: Document has been upserted)' - this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] - this.inputs = [ - { - label: 'Embeddings', - name: 'embeddings', - type: 'Embeddings' - }, - { - label: 'Collection Name', - name: 'milvusCollectionName', - type: 'string', - placeholder: 'my-milvus-collection' - }, - { - label: 'Milvus URL', - name: 'milvusURL', - type: 'string', - placeholder: 'http://localhost:19530' - }, - { - label: 'Primary Field', - name: 'milvusPrimaryField', - type: 'string', - optional: true, - additionalParams: true - }, - { - label: 'Vector Field', - name: 'milvusVectorField', - type: 'string', - optional: true, - additionalParams: true - }, - { - label: 'Vector Text Field', - name: 'milvusTextField', - type: 'string', - optional: true, - additionalParams: true - }, - { - label: 'SSL', - name: 'milvusSSL', - type: 'boolean', - optional: true, - additionalParams: true - }, - { - label: 'Username', - name: 'milvusUsername', - type: 'string', - optional: true, - additionalParams: true - }, - { - label: 'Password', - name: 'milvusPassword', - type: 'password', - optional: true, - additionalParams: true - } - ] - this.outputs = [ - { - label: 'Milvus Retriever', - name: 'retriever', - baseClasses: this.baseClasses - }, - { - label: 'Milvus Vector Store', - name: 'vectorStore', - baseClasses: [this.type, ...getBaseClasses(Milvus)] - } - ] - } - - async init(nodeData: INodeData): Promise { - const collectionName = nodeData.inputs?.milvusCollectionName as string - const embeddings = nodeData.inputs?.embeddings as Embeddings - const milvusURL = nodeData.inputs?.milvusURL as string - const milvusPrimaryField = nodeData.inputs?.milvusPrimaryField as string - const milvusVectorField = nodeData.inputs?.milvusVectorField as string - const milvusTextField = nodeData.inputs?.milvusTextField as string - const milvusSSL = nodeData.inputs?.milvusSSL as boolean - const milvusUsername = nodeData.inputs?.milvusUsername as string - const milvusPassword = nodeData.inputs?.milvusPassword as string - const output = nodeData.outputs?.output as string - - const obj: MilvusLibArgs = { collectionName, url: milvusURL } - if (milvusPrimaryField) obj.primaryField = milvusPrimaryField - if (milvusVectorField) obj.vectorField = milvusVectorField - if (milvusTextField) obj.textField = milvusTextField - if (milvusSSL) obj.ssl = milvusSSL - if (milvusUsername) obj.username = milvusUsername - if (milvusPassword) obj.password = milvusPassword - - const vectorStore = await Milvus.fromExistingCollection(embeddings, obj) - - if (output === 'retriever') { - const retriever = vectorStore.asRetriever() - return retriever - } else if (output === 'vectorStore') { - return vectorStore - } - return vectorStore - } -} - -module.exports = { nodeClass: Milvus_Existing_VectorStores } diff --git a/packages/components/nodes/vectorstores/Milvus_Existing/milvus.jpg b/packages/components/nodes/vectorstores/Milvus_Existing/milvus.jpg deleted file mode 100644 index 20b6c3499cbcf1e451afa25cfc60887e38ab49a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9320 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 MV<_L`Jz!`ChE9Cxxxqn>pp7! zzD3u&z~sL9x+2qs5{=I7n}m)W)c_3A0e8G5<%RHn!j|kIQCq>MB=0UI9!y{MxpC;Z z%2|wfu6g5#h+@Ega4nWd2B{J`@+X}Q@y`$q;2lQ;EKFWfM8hb1P=YROJ$-YETR4Np z;I>@Ru$0qopabsa!OvbSKcg=m(Ew9GOD+bd7oK*^932-BW4}5&#OnI>#j50r-cSce zH6%$oNSXk&&PE!OR(m)}j+8agz+wbKMFT`F6dfr>mLy~u@hqx_)_N=5Ia&p%@1XYb zCrBc*Ss!B)TYE$?%7>2m$YA2zio|WSg#!%pUSN0KA=e7k$Wy*Pe`Blaf}tK1KhsBg z7)Iane)*Kz(GG#B%p#pp@o0Q$Zd9qXN`S6w+v z9Ywzu=j_+1;9ue3_wxK#DhPgMy6aT1lN(tzx-YH$uS^j9%+V%>#>r1DBLZx+^3azK zEGLCJ95tT4<#(v3=vVB1-XV#o9H%?qQ6R2VRC-0+zLaF5s~;>f;iNd0b240@hP{7r z@I615ect^0No6AJ!%$6J+3m=gB4!n5yzDP0Q>BJ#u16z^1A6b zGSiN7=slkjos-x`RA&lb0d8Fh+5p{HO+WZ#HFRBOU*H#K6}1SzMDJX0{zjnB z7Zu@$Sj2$><@EwxTOoT|T@ecVMOBR1ql$2D9m{A8Ci@zzS~pTdv{)Mc@Odb~xGRlU z)S&1?&s?H2&)x`EAEC;>wRuPW()Nf71=1kKD_jwhVPa8S)T4*?T)+8wSmvHxcYzSi z6zLv%x9rV&1%?Qp*bB4?(H@GlEC=hv2C4OxZD4hZru&eM^;vn@%P&3Db0o-BWFhluE0_7qe z-16_aJY|Zs-NKf^B8E5q7)c+Q^9r8}YdJVr@Nsy22aaiiRnlr%#s)7Pso@VdKD=2) zT?f9Aqj5)#uz6>RrRRb|gt-hT)NX5`k(%2N&OaJn;v!(FcLVU>fj(4S5%8GIA8X`r zgp3RWT0MJj75;8{KD51Xo?F_!N=y%+V{oXfWW}?VGx?fo>@k%hGy9}p75BwTqK=M^ z3VMUmGh%rwZbYX}O(o(|gWNR6@Wh;_WP$@`gZx39q+n<;>`oLbV=DR8hzbhKtCWyA zWbB^BbZIx`e2Xq1uH2sQp}HopLB`1LOnJ)lqP|^ zB;^d{fsW5HHzmS0e^L#rWQ7=~j;~#~u(Ef)EOPRmNmR)|Mz-igyse$U>8BrC;D`h) zcEx$i%O8=}LOS12_pOX*6Obu!bqwJuAP%+3u8plAl8zIO544VZ>mg39H1dobYJqU* z$`y8Il7^ZLRP0R1-6*Tg9UiX>!p)UWucBHaOiTIh__lOp@pKtm8y&jjOPeSoEpJ8D zfX017QnG?H_awY&X5B}bVBsjjUuTaS3sd07IL#a zdBR2NCv8lC%1`)4*;oXth`Ur#d?hT@T`aagCx?MM#_X}VZ_g{OQtH>N@f_@}0v(@d z2VS$Ll&mGB{g`;i-6gjtEsbhNsm`WQfomzwrd1kNy50bI60e;+ynp$jGKZ&k?T>*N z3{UME(*@{rHHw6%c2`Zb3D|Ujbw%uicg8D68sPzXPsdH+$zdX*ZnjPrVl+U(#nBMH&7*si;Tuh}2+k@yOl7h{=2 zf$7xKn>TcWnN%~>7Es#Kyz&#GB6ecy=%h^u*Uph5A0maI;IAY$bRmyj+4WZYvhYU( z(t+s4ulL&c&)!_#7T6&Zc5XOKD2da6EtRENo1iGr@mCbjH#HT}N; Dh=sww diff --git a/packages/components/nodes/vectorstores/Milvus_Upsert/Milvus_Upsert.ts b/packages/components/nodes/vectorstores/Milvus_Upsert/Milvus_Upsert.ts deleted file mode 100644 index 373327b50..000000000 --- a/packages/components/nodes/vectorstores/Milvus_Upsert/Milvus_Upsert.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' -import { Milvus, MilvusLibArgs } from 'langchain/vectorstores/milvus' -import { Embeddings } from 'langchain/embeddings/base' -import { getBaseClasses } from '../../../src/utils' -import { Document } from 'langchain/document' - -class Milvus_Upsert_VectorStores implements INode { - label: string - name: string - description: string - type: string - icon: string - category: string - baseClasses: string[] - inputs: INodeParams[] - outputs: INodeOutputsValue[] - - constructor() { - this.label = 'Milvus Upsert Document' - this.name = 'milvusUpsert' - this.type = 'Milvus' - this.icon = 'milvus.jpg' - this.category = 'Vector Stores' - this.description = 'Upsert documents to Milvus' - this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] - this.inputs = [ - { - label: 'Document', - name: 'document', - type: 'Document', - list: true - }, - { - label: 'Embeddings', - name: 'embeddings', - type: 'Embeddings' - }, - { - label: 'Collection Name', - name: 'milvusCollectionName', - type: 'string', - placeholder: 'my_milvus_collection' - }, - { - label: 'Milvus URL', - name: 'milvusURL', - type: 'string', - placeholder: 'http://localhost:19530' - }, - { - label: 'Primary Field', - name: 'milvusPrimaryField', - type: 'string', - optional: true, - additionalParams: true - }, - { - label: 'Vector Field', - name: 'milvusVectorField', - type: 'string', - optional: true, - additionalParams: true - }, - { - label: 'Vector Text Field', - name: 'milvusTextField', - type: 'string', - optional: true, - additionalParams: true - }, - { - label: 'SSL', - name: 'milvusSSL', - type: 'boolean', - optional: true, - additionalParams: true - }, - { - label: 'Username', - name: 'milvusUsername', - type: 'string', - placeholder: 'db_admin', - optional: true, - additionalParams: true - }, - { - label: 'Password', - name: 'milvusPassword', - type: 'password', - optional: true, - additionalParams: true - } - ] - this.outputs = [ - { - label: 'Milvus Retriever', - name: 'retriever', - baseClasses: this.baseClasses - }, - { - label: 'Milvus Vector Store', - name: 'vectorStore', - baseClasses: [this.type, ...getBaseClasses(Milvus)] - } - ] - } - - async init(nodeData: INodeData): Promise { - const collectionName = nodeData.inputs?.milvusCollectionName as string - const embeddings = nodeData.inputs?.embeddings as Embeddings - const milvusURL = nodeData.inputs?.milvusURL as string - const milvusPrimaryField = nodeData.inputs?.milvusPrimaryField as string - const milvusVectorField = nodeData.inputs?.milvusVectorField as string - const milvusTextField = nodeData.inputs?.milvusTextField as string - const milvusSSL = nodeData.inputs?.milvusSSL as boolean - const milvusUsername = nodeData.inputs?.milvusUsername as string - const milvusPassword = nodeData.inputs?.milvusPassword as string - const output = nodeData.outputs?.output as string - const docs = nodeData.inputs?.document as Document[] - - const flattenDocs = docs && docs.length ? docs.flat() : [] - const finalDocs = [] - for (let i = 0; i < flattenDocs.length; i += 1) { - finalDocs.push(new Document(flattenDocs[i])) - } - - const obj: MilvusLibArgs = { collectionName, url: milvusURL } - if (milvusPrimaryField) obj.primaryField = milvusPrimaryField - if (milvusVectorField) obj.vectorField = milvusVectorField - if (milvusTextField) obj.textField = milvusTextField - if (milvusSSL) obj.ssl = milvusSSL - if (milvusUsername) obj.username = milvusUsername - if (milvusPassword) obj.password = milvusPassword - - const vectorStore = await Milvus.fromDocuments(finalDocs, embeddings, obj) - console.log('vectorStore = ', vectorStore) - - if (output === 'retriever') { - const retriever = vectorStore.asRetriever() - return retriever - } else if (output === 'vectorStore') { - return vectorStore - } - return vectorStore - } -} - -module.exports = { nodeClass: Milvus_Upsert_VectorStores } diff --git a/packages/components/nodes/vectorstores/Milvus_Upsert/milvus.jpg b/packages/components/nodes/vectorstores/Milvus_Upsert/milvus.jpg deleted file mode 100644 index 20b6c3499cbcf1e451afa25cfc60887e38ab49a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9320 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 MV<_L`Jz!`ChE9Cxxxqn>pp7! zzD3u&z~sL9x+2qs5{=I7n}m)W)c_3A0e8G5<%RHn!j|kIQCq>MB=0UI9!y{MxpC;Z z%2|wfu6g5#h+@Ega4nWd2B{J`@+X}Q@y`$q;2lQ;EKFWfM8hb1P=YROJ$-YETR4Np z;I>@Ru$0qopabsa!OvbSKcg=m(Ew9GOD+bd7oK*^932-BW4}5&#OnI>#j50r-cSce zH6%$oNSXk&&PE!OR(m)}j+8agz+wbKMFT`F6dfr>mLy~u@hqx_)_N=5Ia&p%@1XYb zCrBc*Ss!B)TYE$?%7>2m$YA2zio|WSg#!%pUSN0KA=e7k$Wy*Pe`Blaf}tK1KhsBg z7)Iane)*Kz(GG#B%p#pp@o0Q$Zd9qXN`S6w+v z9Ywzu=j_+1;9ue3_wxK#DhPgMy6aT1lN(tzx-YH$uS^j9%+V%>#>r1DBLZx+^3azK zEGLCJ95tT4<#(v3=vVB1-XV#o9H%?qQ6R2VRC-0+zLaF5s~;>f;iNd0b240@hP{7r z@I615ect^0No6AJ!%$6J+3m=gB4!n5yzDP0Q>BJ#u16z^1A6b zGSiN7=slkjos-x`RA&lb0d8Fh+5p{HO+WZ#HFRBOU*H#K6}1SzMDJX0{zjnB z7Zu@$Sj2$><@EwxTOoT|T@ecVMOBR1ql$2D9m{A8Ci@zzS~pTdv{)Mc@Odb~xGRlU z)S&1?&s?H2&)x`EAEC;>wRuPW()Nf71=1kKD_jwhVPa8S)T4*?T)+8wSmvHxcYzSi z6zLv%x9rV&1%?Qp*bB4?(H@GlEC=hv2C4OxZD4hZru&eM^;vn@%P&3Db0o-BWFhluE0_7qe z-16_aJY|Zs-NKf^B8E5q7)c+Q^9r8}YdJVr@Nsy22aaiiRnlr%#s)7Pso@VdKD=2) zT?f9Aqj5)#uz6>RrRRb|gt-hT)NX5`k(%2N&OaJn;v!(FcLVU>fj(4S5%8GIA8X`r zgp3RWT0MJj75;8{KD51Xo?F_!N=y%+V{oXfWW}?VGx?fo>@k%hGy9}p75BwTqK=M^ z3VMUmGh%rwZbYX}O(o(|gWNR6@Wh;_WP$@`gZx39q+n<;>`oLbV=DR8hzbhKtCWyA zWbB^BbZIx`e2Xq1uH2sQp}HopLB`1LOnJ)lqP|^ zB;^d{fsW5HHzmS0e^L#rWQ7=~j;~#~u(Ef)EOPRmNmR)|Mz-igyse$U>8BrC;D`h) zcEx$i%O8=}LOS12_pOX*6Obu!bqwJuAP%+3u8plAl8zIO544VZ>mg39H1dobYJqU* z$`y8Il7^ZLRP0R1-6*Tg9UiX>!p)UWucBHaOiTIh__lOp@pKtm8y&jjOPeSoEpJ8D zfX017QnG?H_awY&X5B}bVBsjjUuTaS3sd07IL#a zdBR2NCv8lC%1`)4*;oXth`Ur#d?hT@T`aagCx?MM#_X}VZ_g{OQtH>N@f_@}0v(@d z2VS$Ll&mGB{g`;i-6gjtEsbhNsm`WQfomzwrd1kNy50bI60e;+ynp$jGKZ&k?T>*N z3{UME(*@{rHHw6%c2`Zb3D|Ujbw%uicg8D68sPzXPsdH+$zdX*ZnjPrVl+U(#nBMH&7*si;Tuh}2+k@yOl7h{=2 zf$7xKn>TcWnN%~>7Es#Kyz&#GB6ecy=%h^u*Uph5A0maI;IAY$bRmyj+4WZYvhYU( z(t+s4ulL&c&)!_#7T6&Zc5XOKD2da6EtRENo1iGr@mCbjH#HT}N; Dh=sww diff --git a/packages/components/package.json b/packages/components/package.json index 2192dba8c..a1de20d70 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -28,6 +28,7 @@ "@types/js-yaml": "^4.0.5", "apify-client": "^2.7.1", "@types/jsdom": "^21.1.1", + "@zilliz/milvus2-sdk-node": "^2.2.24", "axios": "^0.27.2", "cheerio": "^1.0.0-rc.12", "chromadb": "^1.5.3",