From 769b4ea567baa8e78ed3e4ac0466aea7036c6c51 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 25 May 2023 13:50:11 +0100 Subject: [PATCH] add multi retrieval qa chain --- .../MultiRetrievalQAChain.ts | 68 ++ .../chains/MultiRetrievalQAChain/chain.svg | 6 + .../VectorStoreRetriever.ts | 61 ++ .../VectorStoreRetriever/vectorretriever.svg | 9 + packages/components/src/Interface.ts | 19 + .../Multi Retrieval QA Chain.json | 859 ++++++++++++++++++ .../marketplaces/Multiple VectorDB.json | 2 +- 7 files changed, 1023 insertions(+), 1 deletion(-) create mode 100644 packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts create mode 100644 packages/components/nodes/chains/MultiRetrievalQAChain/chain.svg create mode 100644 packages/components/nodes/retrievers/VectorStoreRetriever/VectorStoreRetriever.ts create mode 100644 packages/components/nodes/retrievers/VectorStoreRetriever/vectorretriever.svg create mode 100644 packages/server/marketplaces/Multi Retrieval QA Chain.json diff --git a/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts b/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts new file mode 100644 index 00000000000..7b8778f10e2 --- /dev/null +++ b/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts @@ -0,0 +1,68 @@ +import { BaseLanguageModel } from 'langchain/base_language' +import { INode, INodeData, INodeParams, VectorStoreRetriever } from '../../../src/Interface' +import { getBaseClasses } from '../../../src/utils' +import { MultiRetrievalQAChain } from 'langchain/chains' + +class MultiRetrievalQAChain_Chains implements INode { + label: string + name: string + type: string + icon: string + category: string + baseClasses: string[] + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Multi Retrieval QA Chain' + this.name = 'multiRetrievalQAChain' + this.type = 'MultiRetrievalQAChain' + this.icon = 'chain.svg' + this.category = 'Chains' + this.description = 'QA Chain that automatically picks an appropriate vector store from multiple retrievers' + this.baseClasses = [this.type, ...getBaseClasses(MultiRetrievalQAChain)] + this.inputs = [ + { + label: 'Language Model', + name: 'model', + type: 'BaseLanguageModel' + }, + { + label: 'Vector Store Retriever', + name: 'vectorStoreRetriever', + type: 'VectorStoreRetriever', + list: true + } + ] + } + + async init(nodeData: INodeData): Promise { + const model = nodeData.inputs?.model as BaseLanguageModel + const vectorStoreRetriever = nodeData.inputs?.vectorStoreRetriever as VectorStoreRetriever[] + const retrieverNames = [] + const retrieverDescriptions = [] + const retrievers = [] + + for (const vs of vectorStoreRetriever) { + retrieverNames.push(vs.name) + retrieverDescriptions.push(vs.description) + retrievers.push(vs.vectorStore.asRetriever()) + } + + const chain = MultiRetrievalQAChain.fromRetrievers(model, retrieverNames, retrieverDescriptions, retrievers, undefined, { + verbose: process.env.DEBUG === 'true' ? true : false + } as any) + + return chain + } + + async run(nodeData: INodeData, input: string): Promise { + const chain = nodeData.instance as MultiRetrievalQAChain + + const res = await chain.call({ input }) + + return res?.text + } +} + +module.exports = { nodeClass: MultiRetrievalQAChain_Chains } diff --git a/packages/components/nodes/chains/MultiRetrievalQAChain/chain.svg b/packages/components/nodes/chains/MultiRetrievalQAChain/chain.svg new file mode 100644 index 00000000000..a5b32f90aa3 --- /dev/null +++ b/packages/components/nodes/chains/MultiRetrievalQAChain/chain.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/packages/components/nodes/retrievers/VectorStoreRetriever/VectorStoreRetriever.ts b/packages/components/nodes/retrievers/VectorStoreRetriever/VectorStoreRetriever.ts new file mode 100644 index 00000000000..2ccfc995dff --- /dev/null +++ b/packages/components/nodes/retrievers/VectorStoreRetriever/VectorStoreRetriever.ts @@ -0,0 +1,61 @@ +import { VectorStore } from 'langchain/vectorstores/base' +import { INode, INodeData, INodeParams, VectorStoreRetriever, VectorStoreRetrieverInput } from '../../../src/Interface' + +class VectorStoreRetriever_Retrievers implements INode { + label: string + name: string + description: string + type: string + icon: string + category: string + baseClasses: string[] + inputs: INodeParams[] + + constructor() { + this.label = 'Vector Store Retriever' + this.name = 'vectorStoreRetriever' + this.type = 'VectorStoreRetriever' + this.icon = 'vectorretriever.svg' + this.category = 'Retrievers' + this.description = 'Store vector store as retriever to be later queried by MultiRetrievalQAChain' + this.baseClasses = [this.type] + this.inputs = [ + { + label: 'Vector Store', + name: 'vectorStore', + type: 'VectorStore' + }, + { + label: 'Retriever Name', + name: 'name', + type: 'string', + placeholder: 'netflix movies' + }, + { + label: 'Retriever Description', + name: 'description', + type: 'string', + rows: 3, + description: 'Description of when to use the vector store retriever', + placeholder: 'Good for answering questions about netflix movies' + } + ] + } + + async init(nodeData: INodeData): Promise { + const name = nodeData.inputs?.name as string + const description = nodeData.inputs?.description as string + const vectorStore = nodeData.inputs?.vectorStore as VectorStore + + const obj = { + name, + description, + vectorStore + } as VectorStoreRetrieverInput + + const retriever = new VectorStoreRetriever(obj) + return retriever + } +} + +module.exports = { nodeClass: VectorStoreRetriever_Retrievers } diff --git a/packages/components/nodes/retrievers/VectorStoreRetriever/vectorretriever.svg b/packages/components/nodes/retrievers/VectorStoreRetriever/vectorretriever.svg new file mode 100644 index 00000000000..da3a9f207e4 --- /dev/null +++ b/packages/components/nodes/retrievers/VectorStoreRetriever/vectorretriever.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/packages/components/src/Interface.ts b/packages/components/src/Interface.ts index ea3d1f0d4aa..c14119399b2 100644 --- a/packages/components/src/Interface.ts +++ b/packages/components/src/Interface.ts @@ -95,6 +95,7 @@ export interface IMessage { */ import { PromptTemplate as LangchainPromptTemplate, PromptTemplateInput } from 'langchain/prompts' +import { VectorStore } from 'langchain/vectorstores/base' export class PromptTemplate extends LangchainPromptTemplate { promptValues: ICommonObject @@ -124,3 +125,21 @@ export class PromptRetriever { this.systemMessage = `${fields.systemMessage}\n${fixedTemplate}` } } + +export interface VectorStoreRetrieverInput { + name: string + description: string + vectorStore: VectorStore +} + +export class VectorStoreRetriever { + name: string + description: string + vectorStore: VectorStore + + constructor(fields: VectorStoreRetrieverInput) { + this.name = fields.name + this.description = fields.description + this.vectorStore = fields.vectorStore + } +} diff --git a/packages/server/marketplaces/Multi Retrieval QA Chain.json b/packages/server/marketplaces/Multi Retrieval QA Chain.json new file mode 100644 index 00000000000..48cddbf49e9 --- /dev/null +++ b/packages/server/marketplaces/Multi Retrieval QA Chain.json @@ -0,0 +1,859 @@ +{ + "description": "A chain that automatically picks an appropriate retriever from multiple different vector databases", + "nodes": [ + { + "width": 300, + "height": 505, + "id": "vectorStoreRetriever_0", + "position": { + "x": 712.9322670298264, + "y": 860.5462810572917 + }, + "type": "customNode", + "data": { + "id": "vectorStoreRetriever_0", + "label": "Vector Store Retriever", + "name": "vectorStoreRetriever", + "type": "VectorStoreRetriever", + "baseClasses": ["VectorStoreRetriever"], + "category": "Retrievers", + "description": "Store vector store as retriever. Used with MultiRetrievalQAChain", + "inputParams": [ + { + "label": "Retriever Name", + "name": "name", + "type": "string", + "placeholder": "netflix movies", + "id": "vectorStoreRetriever_0-input-name-string" + }, + { + "label": "Retriever Description", + "name": "description", + "type": "string", + "rows": 3, + "description": "Description of when to use the vector store retriever", + "placeholder": "Good for answering questions about netflix movies", + "id": "vectorStoreRetriever_0-input-description-string" + } + ], + "inputAnchors": [ + { + "label": "Vector Store", + "name": "vectorStore", + "type": "VectorStore", + "id": "vectorStoreRetriever_0-input-vectorStore-VectorStore" + } + ], + "inputs": { + "vectorStore": "{{supabaseExistingIndex_0.data.instance}}", + "name": "aqua teen", + "description": "Good for answering questions about Aqua Teen Hunger Force theme song" + }, + "outputAnchors": [ + { + "id": "vectorStoreRetriever_0-output-vectorStoreRetriever-VectorStoreRetriever", + "name": "vectorStoreRetriever", + "label": "VectorStoreRetriever", + "type": "VectorStoreRetriever" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 712.9322670298264, + "y": 860.5462810572917 + }, + "dragging": false + }, + { + "width": 300, + "height": 280, + "id": "multiRetrievalQAChain_0", + "position": { + "x": 1563.0150452201099, + "y": 460.78375893303934 + }, + "type": "customNode", + "data": { + "id": "multiRetrievalQAChain_0", + "label": "Multi Retrieval QA Chain", + "name": "multiRetrievalQAChain", + "type": "MultiRetrievalQAChain", + "baseClasses": ["MultiRetrievalQAChain", "MultiRouteChain", "BaseChain", "BaseLangChain"], + "category": "Chains", + "description": "QA Chain that automatically picks an appropriate vector store from multiple retrievers", + "inputParams": [], + "inputAnchors": [ + { + "label": "Language Model", + "name": "model", + "type": "BaseLanguageModel", + "id": "multiRetrievalQAChain_0-input-model-BaseLanguageModel" + }, + { + "label": "Vector Store Retriever", + "name": "vectorStoreRetriever", + "type": "VectorStoreRetriever", + "list": true, + "id": "multiRetrievalQAChain_0-input-vectorStoreRetriever-VectorStoreRetriever" + } + ], + "inputs": { + "model": "{{chatOpenAI_0.data.instance}}", + "vectorStoreRetriever": [ + "{{vectorStoreRetriever_0.data.instance}}", + "{{vectorStoreRetriever_1.data.instance}}", + "{{vectorStoreRetriever_2.data.instance}}" + ] + }, + "outputAnchors": [ + { + "id": "multiRetrievalQAChain_0-output-multiRetrievalQAChain-MultiRetrievalQAChain|MultiRouteChain|BaseChain|BaseLangChain", + "name": "multiRetrievalQAChain", + "label": "MultiRetrievalQAChain", + "type": "MultiRetrievalQAChain | MultiRouteChain | BaseChain | BaseLangChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1563.0150452201099, + "y": 460.78375893303934 + }, + "dragging": false + }, + { + "width": 300, + "height": 505, + "id": "vectorStoreRetriever_1", + "position": { + "x": 711.4902931206071, + "y": 315.2414600651632 + }, + "type": "customNode", + "data": { + "id": "vectorStoreRetriever_1", + "label": "Vector Store Retriever", + "name": "vectorStoreRetriever", + "type": "VectorStoreRetriever", + "baseClasses": ["VectorStoreRetriever"], + "category": "Retrievers", + "description": "Store vector store as retriever. Used with MultiRetrievalQAChain", + "inputParams": [ + { + "label": "Retriever Name", + "name": "name", + "type": "string", + "placeholder": "netflix movies", + "id": "vectorStoreRetriever_1-input-name-string" + }, + { + "label": "Retriever Description", + "name": "description", + "type": "string", + "rows": 3, + "description": "Description of when to use the vector store retriever", + "placeholder": "Good for answering questions about netflix movies", + "id": "vectorStoreRetriever_1-input-description-string" + } + ], + "inputAnchors": [ + { + "label": "Vector Store", + "name": "vectorStore", + "type": "VectorStore", + "id": "vectorStoreRetriever_1-input-vectorStore-VectorStore" + } + ], + "inputs": { + "vectorStore": "{{chromaExistingIndex_0.data.instance}}", + "name": "mst3k", + "description": "Good for answering questions about Mystery Science Theater 3000 theme song" + }, + "outputAnchors": [ + { + "id": "vectorStoreRetriever_1-output-vectorStoreRetriever-VectorStoreRetriever", + "name": "vectorStoreRetriever", + "label": "VectorStoreRetriever", + "type": "VectorStoreRetriever" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 711.4902931206071, + "y": 315.2414600651632 + }, + "dragging": false + }, + { + "width": 300, + "height": 505, + "id": "vectorStoreRetriever_2", + "position": { + "x": 706.0716220151372, + "y": -217.51566869136752 + }, + "type": "customNode", + "data": { + "id": "vectorStoreRetriever_2", + "label": "Vector Store Retriever", + "name": "vectorStoreRetriever", + "type": "VectorStoreRetriever", + "baseClasses": ["VectorStoreRetriever"], + "category": "Retrievers", + "description": "Store vector store as retriever. Used with MultiRetrievalQAChain", + "inputParams": [ + { + "label": "Retriever Name", + "name": "name", + "type": "string", + "placeholder": "netflix movies", + "id": "vectorStoreRetriever_2-input-name-string" + }, + { + "label": "Retriever Description", + "name": "description", + "type": "string", + "rows": 3, + "description": "Description of when to use the vector store retriever", + "placeholder": "Good for answering questions about netflix movies", + "id": "vectorStoreRetriever_2-input-description-string" + } + ], + "inputAnchors": [ + { + "label": "Vector Store", + "name": "vectorStore", + "type": "VectorStore", + "id": "vectorStoreRetriever_2-input-vectorStore-VectorStore" + } + ], + "inputs": { + "vectorStore": "{{pineconeExistingIndex_0.data.instance}}", + "name": "animaniacs", + "description": "Good for answering questions about Animaniacs theme song" + }, + "outputAnchors": [ + { + "id": "vectorStoreRetriever_2-output-vectorStoreRetriever-VectorStoreRetriever", + "name": "vectorStoreRetriever", + "label": "VectorStoreRetriever", + "type": "VectorStoreRetriever" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 706.0716220151372, + "y": -217.51566869136752 + }, + "dragging": false + }, + { + "width": 300, + "height": 524, + "id": "chatOpenAI_0", + "position": { + "x": 1206.027762600755, + "y": -212.35338654620222 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_0", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "OpenAI Api Key", + "name": "openAIApiKey", + "type": "password", + "id": "chatOpenAI_0-input-openAIApiKey-password" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0314", + "name": "gpt-4-0314" + }, + { + "label": "gpt-4-32k-0314", + "name": "gpt-4-32k-0314" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0301", + "name": "gpt-3.5-turbo-0301" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_0-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-timeout-number" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": 0.9, + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1206.027762600755, + "y": -212.35338654620222 + }, + "dragging": false + }, + { + "width": 300, + "height": 330, + "id": "openAIEmbeddings_0", + "position": { + "x": -254.88737984323413, + "y": 279.72801937636154 + }, + "type": "customNode", + "data": { + "id": "openAIEmbeddings_0", + "label": "OpenAI Embeddings", + "name": "openAIEmbeddings", + "type": "OpenAIEmbeddings", + "baseClasses": ["OpenAIEmbeddings", "Embeddings"], + "category": "Embeddings", + "description": "OpenAI API to generate embeddings for a given text", + "inputParams": [ + { + "label": "OpenAI Api Key", + "name": "openAIApiKey", + "type": "password", + "id": "openAIEmbeddings_0-input-openAIApiKey-password" + }, + { + "label": "Strip New Lines", + "name": "stripNewLines", + "type": "boolean", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-stripNewLines-boolean" + }, + { + "label": "Batch Size", + "name": "batchSize", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-batchSize-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-timeout-number" + } + ], + "inputAnchors": [], + "inputs": { + "stripNewLines": "", + "batchSize": "", + "timeout": "" + }, + "outputAnchors": [ + { + "id": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "name": "openAIEmbeddings", + "label": "OpenAIEmbeddings", + "type": "OpenAIEmbeddings | Embeddings" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": -254.88737984323413, + "y": 279.72801937636154 + }, + "dragging": false + }, + { + "width": 300, + "height": 703, + "id": "pineconeExistingIndex_0", + "position": { + "x": 271.2513182410521, + "y": -410.32709109501735 + }, + "type": "customNode", + "data": { + "id": "pineconeExistingIndex_0", + "label": "Pinecone Load Existing Index", + "name": "pineconeExistingIndex", + "type": "Pinecone", + "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Load existing index from Pinecone (i.e: Document has been upserted)", + "inputParams": [ + { + "label": "Pinecone Api Key", + "name": "pineconeApiKey", + "type": "password", + "id": "pineconeExistingIndex_0-input-pineconeApiKey-password" + }, + { + "label": "Pinecone Environment", + "name": "pineconeEnv", + "type": "string", + "id": "pineconeExistingIndex_0-input-pineconeEnv-string" + }, + { + "label": "Pinecone Index", + "name": "pineconeIndex", + "type": "string", + "id": "pineconeExistingIndex_0-input-pineconeIndex-string" + }, + { + "label": "Pinecone Namespace", + "name": "pineconeNamespace", + "type": "string", + "placeholder": "my-first-namespace", + "optional": true, + "id": "pineconeExistingIndex_0-input-pineconeNamespace-string" + }, + { + "label": "Pinecone Metadata Filter", + "name": "pineconeMetadataFilter", + "type": "json", + "optional": true, + "additionalParams": true, + "id": "pineconeExistingIndex_0-input-pineconeMetadataFilter-json" + } + ], + "inputAnchors": [ + { + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "pineconeExistingIndex_0-input-embeddings-Embeddings" + } + ], + "inputs": { + "embeddings": "{{openAIEmbeddings_0.data.instance}}", + "pineconeEnv": "", + "pineconeIndex": "", + "pineconeNamespace": "", + "pineconeMetadataFilter": "" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Pinecone Retriever", + "type": "Pinecone | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore", + "name": "vectorStore", + "label": "Pinecone Vector Store", + "type": "Pinecone | VectorStore" + } + ], + "default": "retriever" + } + ], + "outputs": { + "output": "vectorStore" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 271.2513182410521, + "y": -410.32709109501735 + }, + "dragging": false + }, + { + "width": 300, + "height": 454, + "id": "chromaExistingIndex_0", + "position": { + "x": 274.1430731555137, + "y": 335.15344698725556 + }, + "type": "customNode", + "data": { + "id": "chromaExistingIndex_0", + "label": "Chroma Load Existing Index", + "name": "chromaExistingIndex", + "type": "Chroma", + "baseClasses": ["Chroma", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Load existing index from Chroma (i.e: Document has been upserted)", + "inputParams": [ + { + "label": "Collection Name", + "name": "collectionName", + "type": "string", + "id": "chromaExistingIndex_0-input-collectionName-string" + }, + { + "label": "Chroma URL", + "name": "chromaURL", + "type": "string", + "optional": true, + "id": "chromaExistingIndex_0-input-chromaURL-string" + } + ], + "inputAnchors": [ + { + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "chromaExistingIndex_0-input-embeddings-Embeddings" + } + ], + "inputs": { + "embeddings": "{{openAIEmbeddings_0.data.instance}}", + "collectionName": "", + "chromaURL": "" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "chromaExistingIndex_0-output-retriever-Chroma|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Chroma Retriever", + "type": "Chroma | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "chromaExistingIndex_0-output-vectorStore-Chroma|VectorStore", + "name": "vectorStore", + "label": "Chroma Vector Store", + "type": "Chroma | VectorStore" + } + ], + "default": "retriever" + } + ], + "outputs": { + "output": "vectorStore" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 274.1430731555137, + "y": 335.15344698725556 + }, + "dragging": false + }, + { + "width": 300, + "height": 703, + "id": "supabaseExistingIndex_0", + "position": { + "x": 273.7097153973373, + "y": 821.872758974335 + }, + "type": "customNode", + "data": { + "id": "supabaseExistingIndex_0", + "label": "Supabase Load Existing Index", + "name": "supabaseExistingIndex", + "type": "Supabase", + "baseClasses": ["Supabase", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Load existing index from Supabase (i.e: Document has been upserted)", + "inputParams": [ + { + "label": "Supabase API Key", + "name": "supabaseApiKey", + "type": "password", + "id": "supabaseExistingIndex_0-input-supabaseApiKey-password" + }, + { + "label": "Supabase Project URL", + "name": "supabaseProjUrl", + "type": "string", + "id": "supabaseExistingIndex_0-input-supabaseProjUrl-string" + }, + { + "label": "Table Name", + "name": "tableName", + "type": "string", + "id": "supabaseExistingIndex_0-input-tableName-string" + }, + { + "label": "Query Name", + "name": "queryName", + "type": "string", + "id": "supabaseExistingIndex_0-input-queryName-string" + }, + { + "label": "Supabase Metadata Filter", + "name": "supabaseMetadataFilter", + "type": "json", + "optional": true, + "additionalParams": true, + "id": "supabaseExistingIndex_0-input-supabaseMetadataFilter-json" + } + ], + "inputAnchors": [ + { + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "supabaseExistingIndex_0-input-embeddings-Embeddings" + } + ], + "inputs": { + "embeddings": "{{openAIEmbeddings_0.data.instance}}", + "supabaseProjUrl": "", + "tableName": "", + "queryName": "", + "supabaseMetadataFilter": "" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "supabaseExistingIndex_0-output-retriever-Supabase|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Supabase Retriever", + "type": "Supabase | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "supabaseExistingIndex_0-output-vectorStore-Supabase|VectorStore", + "name": "vectorStore", + "label": "Supabase Vector Store", + "type": "Supabase | VectorStore" + } + ], + "default": "retriever" + } + ], + "outputs": { + "output": "vectorStore" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 273.7097153973373, + "y": 821.872758974335 + }, + "dragging": false + } + ], + "edges": [ + { + "source": "vectorStoreRetriever_0", + "sourceHandle": "vectorStoreRetriever_0-output-vectorStoreRetriever-VectorStoreRetriever", + "target": "multiRetrievalQAChain_0", + "targetHandle": "multiRetrievalQAChain_0-input-vectorStoreRetriever-VectorStoreRetriever", + "type": "buttonedge", + "id": "vectorStoreRetriever_0-vectorStoreRetriever_0-output-vectorStoreRetriever-VectorStoreRetriever-multiRetrievalQAChain_0-multiRetrievalQAChain_0-input-vectorStoreRetriever-VectorStoreRetriever", + "data": { + "label": "" + } + }, + { + "source": "vectorStoreRetriever_1", + "sourceHandle": "vectorStoreRetriever_1-output-vectorStoreRetriever-VectorStoreRetriever", + "target": "multiRetrievalQAChain_0", + "targetHandle": "multiRetrievalQAChain_0-input-vectorStoreRetriever-VectorStoreRetriever", + "type": "buttonedge", + "id": "vectorStoreRetriever_1-vectorStoreRetriever_1-output-vectorStoreRetriever-VectorStoreRetriever-multiRetrievalQAChain_0-multiRetrievalQAChain_0-input-vectorStoreRetriever-VectorStoreRetriever", + "data": { + "label": "" + } + }, + { + "source": "vectorStoreRetriever_2", + "sourceHandle": "vectorStoreRetriever_2-output-vectorStoreRetriever-VectorStoreRetriever", + "target": "multiRetrievalQAChain_0", + "targetHandle": "multiRetrievalQAChain_0-input-vectorStoreRetriever-VectorStoreRetriever", + "type": "buttonedge", + "id": "vectorStoreRetriever_2-vectorStoreRetriever_2-output-vectorStoreRetriever-VectorStoreRetriever-multiRetrievalQAChain_0-multiRetrievalQAChain_0-input-vectorStoreRetriever-VectorStoreRetriever", + "data": { + "label": "" + } + }, + { + "source": "chatOpenAI_0", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "target": "multiRetrievalQAChain_0", + "targetHandle": "multiRetrievalQAChain_0-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-multiRetrievalQAChain_0-multiRetrievalQAChain_0-input-model-BaseLanguageModel", + "data": { + "label": "" + } + }, + { + "source": "pineconeExistingIndex_0", + "sourceHandle": "pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore", + "target": "vectorStoreRetriever_2", + "targetHandle": "vectorStoreRetriever_2-input-vectorStore-VectorStore", + "type": "buttonedge", + "id": "pineconeExistingIndex_0-pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore-vectorStoreRetriever_2-vectorStoreRetriever_2-input-vectorStore-VectorStore", + "data": { + "label": "" + } + }, + { + "source": "openAIEmbeddings_0", + "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "target": "pineconeExistingIndex_0", + "targetHandle": "pineconeExistingIndex_0-input-embeddings-Embeddings", + "type": "buttonedge", + "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeExistingIndex_0-pineconeExistingIndex_0-input-embeddings-Embeddings", + "data": { + "label": "" + } + }, + { + "source": "chromaExistingIndex_0", + "sourceHandle": "chromaExistingIndex_0-output-vectorStore-Chroma|VectorStore", + "target": "vectorStoreRetriever_1", + "targetHandle": "vectorStoreRetriever_1-input-vectorStore-VectorStore", + "type": "buttonedge", + "id": "chromaExistingIndex_0-chromaExistingIndex_0-output-vectorStore-Chroma|VectorStore-vectorStoreRetriever_1-vectorStoreRetriever_1-input-vectorStore-VectorStore", + "data": { + "label": "" + } + }, + { + "source": "openAIEmbeddings_0", + "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "target": "chromaExistingIndex_0", + "targetHandle": "chromaExistingIndex_0-input-embeddings-Embeddings", + "type": "buttonedge", + "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-chromaExistingIndex_0-chromaExistingIndex_0-input-embeddings-Embeddings", + "data": { + "label": "" + } + }, + { + "source": "openAIEmbeddings_0", + "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "target": "supabaseExistingIndex_0", + "targetHandle": "supabaseExistingIndex_0-input-embeddings-Embeddings", + "type": "buttonedge", + "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-supabaseExistingIndex_0-supabaseExistingIndex_0-input-embeddings-Embeddings", + "data": { + "label": "" + } + }, + { + "source": "supabaseExistingIndex_0", + "sourceHandle": "supabaseExistingIndex_0-output-vectorStore-Supabase|VectorStore", + "target": "vectorStoreRetriever_0", + "targetHandle": "vectorStoreRetriever_0-input-vectorStore-VectorStore", + "type": "buttonedge", + "id": "supabaseExistingIndex_0-supabaseExistingIndex_0-output-vectorStore-Supabase|VectorStore-vectorStoreRetriever_0-vectorStoreRetriever_0-input-vectorStore-VectorStore", + "data": { + "label": "" + } + } + ] +} diff --git a/packages/server/marketplaces/Multiple VectorDB.json b/packages/server/marketplaces/Multiple VectorDB.json index 72eb3081cb7..05223e29507 100644 --- a/packages/server/marketplaces/Multiple VectorDB.json +++ b/packages/server/marketplaces/Multiple VectorDB.json @@ -1,5 +1,5 @@ { - "description": "Use the agent to choose between multiple different vector databases", + "description": "Use the agent to choose between multiple different vector databases, with the ability to use other tools", "nodes": [ { "width": 300,