From 913b3439562e8ad7bbeae6ffcfe530736c593de6 Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 16 Aug 2023 23:26:18 +0100 Subject: [PATCH] add Zep VS and update Zep Memory --- .../nodes/memory/ZepMemory/ZepMemory.ts | 20 +- .../components/nodes/memory/ZepMemory/zep.png | Bin 17169 -> 25127 bytes .../nodes/vectorstores/Zep/Zep_Existing.ts | 235 ++++++++++++++++++ .../nodes/vectorstores/Zep/Zep_Upsert.ts | 133 ++++++++++ .../components/nodes/vectorstores/Zep/zep.png | Bin 0 -> 25127 bytes packages/components/package.json | 4 +- 6 files changed, 372 insertions(+), 20 deletions(-) create mode 100644 packages/components/nodes/vectorstores/Zep/Zep_Existing.ts create mode 100644 packages/components/nodes/vectorstores/Zep/Zep_Upsert.ts create mode 100644 packages/components/nodes/vectorstores/Zep/zep.png diff --git a/packages/components/nodes/memory/ZepMemory/ZepMemory.ts b/packages/components/nodes/memory/ZepMemory/ZepMemory.ts index f2a47852..0c05563a 100644 --- a/packages/components/nodes/memory/ZepMemory/ZepMemory.ts +++ b/packages/components/nodes/memory/ZepMemory/ZepMemory.ts @@ -120,7 +120,8 @@ class ZepMemory_Memory implements INode { zep.loadMemoryVariables = async (values) => { let data = await tmpFunc.bind(zep, values)() if (autoSummary && zep.returnMessages && data[zep.memoryKey] && data[zep.memoryKey].length) { - const memory = await zep.zepClient.getMemory(zep.sessionId, parseInt(k, 10) ?? 10) + const zepClient = await zep.zepClientPromise + const memory = await zepClient.memory.getMemory(zep.sessionId, parseInt(k, 10) ?? 10) if (memory?.summary) { let summary = autoSummaryTemplate.replace(/{summary}/g, memory.summary.content) // eslint-disable-next-line no-console @@ -190,23 +191,6 @@ class ZepMemoryExtended extends ZepMemory { super(fields) this.isSessionIdUsingChatMessageId = fields.isSessionIdUsingChatMessageId } - - async clear(): Promise { - // Only clear when sessionId is using chatId - // If sessionId is specified, clearing and inserting again will error because the sessionId has been soft deleted - // If using chatId, it will not be a problem because the sessionId will always be the new chatId - if (this.isSessionIdUsingChatMessageId) { - try { - await this.zepClient.deleteMemory(this.sessionId) - } catch (error) { - console.error('Error deleting session: ', error) - } - - // Clear the superclass's chat history - await super.clear() - } - await this.chatHistory.clear() - } } module.exports = { nodeClass: ZepMemory_Memory } diff --git a/packages/components/nodes/memory/ZepMemory/zep.png b/packages/components/nodes/memory/ZepMemory/zep.png index 293be6f6de9a238631d52059b16c90aa8e395fdb..2fdb238271c40ec0de48c196b92f14115c944dbf 100644 GIT binary patch literal 25127 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 Y|Gacjls{jx3;+NC07*qoM6N<$f`z|uM*si- diff --git a/packages/components/nodes/vectorstores/Zep/Zep_Existing.ts b/packages/components/nodes/vectorstores/Zep/Zep_Existing.ts new file mode 100644 index 00000000..a2c2261f --- /dev/null +++ b/packages/components/nodes/vectorstores/Zep/Zep_Existing.ts @@ -0,0 +1,235 @@ +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { ZepVectorStore, IZepConfig } from 'langchain/vectorstores/zep' +import { Embeddings } from 'langchain/embeddings/base' +import { Document } from 'langchain/document' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' +import { IDocument, ZepClient } from '@getzep/zep-js' + +class Zep_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 = 'Zep Load Existing Index' + this.name = 'zepExistingIndex' + this.version = 1.0 + this.type = 'Zep' + this.icon = 'zep.png' + this.category = 'Vector Stores' + this.description = 'Load existing index from Zep (i.e: Document has been upserted)' + this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + optional: true, + description: 'Configure JWT authentication on your Zep instance (Optional)', + credentialNames: ['zepMemoryApi'] + } + this.inputs = [ + { + label: 'Embeddings', + name: 'embeddings', + type: 'Embeddings' + }, + { + label: 'Base URL', + name: 'baseURL', + type: 'string', + default: 'http://127.0.0.1:8000' + }, + { + label: 'Zep Collection', + name: 'zepCollection', + type: 'string', + placeholder: 'my-first-collection' + }, + { + label: 'Zep Metadata Filter', + name: 'zepMetadataFilter', + type: 'json', + optional: true, + additionalParams: true + }, + { + label: 'Embedding Dimension', + name: 'dimension', + type: 'number', + default: 1536, + additionalParams: true + }, + { + label: 'Top K', + name: 'topK', + description: 'Number of top results to fetch. Default to 4', + placeholder: '4', + type: 'number', + additionalParams: true, + optional: true + } + ] + this.outputs = [ + { + label: 'Pinecone Retriever', + name: 'retriever', + baseClasses: this.baseClasses + }, + { + label: 'Pinecone Vector Store', + name: 'vectorStore', + baseClasses: [this.type, ...getBaseClasses(ZepVectorStore)] + } + ] + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const baseURL = nodeData.inputs?.baseURL as string + const zepCollection = nodeData.inputs?.zepCollection as string + const zepMetadataFilter = nodeData.inputs?.zepMetadataFilter + const dimension = nodeData.inputs?.dimension as number + const embeddings = nodeData.inputs?.embeddings as Embeddings + const output = nodeData.outputs?.output as string + const topK = nodeData.inputs?.topK as string + const k = topK ? parseFloat(topK) : 4 + + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const apiKey = getCredentialParam('apiKey', credentialData, nodeData) + + const zepConfig: IZepConfig & Partial = { + apiUrl: baseURL, + collectionName: zepCollection, + embeddingDimensions: dimension, + isAutoEmbedded: false + } + if (apiKey) zepConfig.apiKey = apiKey + if (zepMetadataFilter) { + const metadatafilter = typeof zepMetadataFilter === 'object' ? zepMetadataFilter : JSON.parse(zepMetadataFilter) + zepConfig.filter = metadatafilter + } + + const vectorStore = await ZepExistingVS.fromExistingIndex(embeddings, zepConfig) + + if (output === 'retriever') { + const retriever = vectorStore.asRetriever(k) + return retriever + } else if (output === 'vectorStore') { + ;(vectorStore as any).k = k + return vectorStore + } + return vectorStore + } +} + +interface ZepFilter { + filter: Record +} + +function zepDocsToDocumentsAndScore(results: IDocument[]): [Document, number][] { + return results.map((d) => [ + new Document({ + pageContent: d.content, + metadata: d.metadata + }), + d.score ? d.score : 0 + ]) +} + +function assignMetadata(value: string | Record | object | undefined): Record | undefined { + if (typeof value === 'object' && value !== null) { + return value as Record + } + if (value !== undefined) { + console.warn('Metadata filters must be an object, Record, or undefined.') + } + return undefined +} + +class ZepExistingVS extends ZepVectorStore { + filter?: Record + args?: IZepConfig & Partial + + constructor(embeddings: Embeddings, args: IZepConfig & Partial) { + super(embeddings, args) + this.filter = args.filter + this.args = args + } + + async initalizeCollection(args: IZepConfig & Partial) { + this.client = await ZepClient.init(args.apiUrl, args.apiKey) + try { + this.collection = await this.client.document.getCollection(args.collectionName) + } catch (err) { + if (err instanceof Error) { + if (err.name === 'NotFoundError') { + await this.createNewCollection(args) + } else { + throw err + } + } + } + } + + async createNewCollection(args: IZepConfig & Partial) { + if (!args.embeddingDimensions) { + throw new Error( + `Collection ${args.collectionName} not found. You can create a new Collection by providing embeddingDimensions.` + ) + } + + this.collection = await this.client.document.addCollection({ + name: args.collectionName, + description: args.description, + metadata: args.metadata, + embeddingDimensions: args.embeddingDimensions, + isAutoEmbedded: false + }) + } + + async similaritySearchVectorWithScore( + query: number[], + k: number, + filter?: Record | undefined + ): Promise<[Document, number][]> { + if (filter && this.filter) { + throw new Error('cannot provide both `filter` and `this.filter`') + } + const _filters = filter ?? this.filter + const ANDFilters = [] + for (const filterKey in _filters) { + let filterVal = _filters[filterKey] + if (typeof filterVal === 'string') filterVal = `"${filterVal}"` + ANDFilters.push({ jsonpath: `$[*] ? (@.${filterKey} == ${filterVal})` }) + } + const newfilter = { + where: { and: ANDFilters } + } + await this.initalizeCollection(this.args!).catch((err) => { + console.error('Error initializing collection:', err) + throw err + }) + const results = await this.collection.search( + { + embedding: new Float32Array(query), + metadata: assignMetadata(newfilter) + }, + k + ) + return zepDocsToDocumentsAndScore(results) + } + + static async fromExistingIndex(embeddings: Embeddings, dbConfig: IZepConfig & Partial): Promise { + const instance = new this(embeddings, dbConfig) + return instance + } +} + +module.exports = { nodeClass: Zep_Existing_VectorStores } diff --git a/packages/components/nodes/vectorstores/Zep/Zep_Upsert.ts b/packages/components/nodes/vectorstores/Zep/Zep_Upsert.ts new file mode 100644 index 00000000..0f976d2b --- /dev/null +++ b/packages/components/nodes/vectorstores/Zep/Zep_Upsert.ts @@ -0,0 +1,133 @@ +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { ZepVectorStore, IZepConfig } from 'langchain/vectorstores/zep' +import { Embeddings } from 'langchain/embeddings/base' +import { Document } from 'langchain/document' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' +import { flatten } from 'lodash' + +class Zep_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 = 'Zep Upsert Document' + this.name = 'zepUpsert' + this.version = 1.0 + this.type = 'Zep' + this.icon = 'zep.png' + this.category = 'Vector Stores' + this.description = 'Upsert documents to Zep' + this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + optional: true, + description: 'Configure JWT authentication on your Zep instance (Optional)', + credentialNames: ['zepMemoryApi'] + } + this.inputs = [ + { + label: 'Document', + name: 'document', + type: 'Document', + list: true + }, + { + label: 'Embeddings', + name: 'embeddings', + type: 'Embeddings' + }, + { + label: 'Base URL', + name: 'baseURL', + type: 'string', + default: 'http://127.0.0.1:8000' + }, + { + label: 'Zep Collection', + name: 'zepCollection', + type: 'string', + placeholder: 'my-first-collection' + }, + { + label: 'Embedding Dimension', + name: 'dimension', + type: 'number', + default: 1536, + additionalParams: true + }, + { + label: 'Top K', + name: 'topK', + description: 'Number of top results to fetch. Default to 4', + placeholder: '4', + type: 'number', + additionalParams: true, + optional: true + } + ] + this.outputs = [ + { + label: 'Zep Retriever', + name: 'retriever', + baseClasses: this.baseClasses + }, + { + label: 'Zep Vector Store', + name: 'vectorStore', + baseClasses: [this.type, ...getBaseClasses(ZepVectorStore)] + } + ] + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const baseURL = nodeData.inputs?.baseURL as string + const zepCollection = nodeData.inputs?.zepCollection as string + const dimension = (nodeData.inputs?.dimension as number) ?? 1536 + const docs = nodeData.inputs?.document as Document[] + const embeddings = nodeData.inputs?.embeddings as Embeddings + const topK = nodeData.inputs?.topK as string + const k = topK ? parseFloat(topK) : 4 + const output = nodeData.outputs?.output as string + + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const apiKey = getCredentialParam('apiKey', credentialData, nodeData) + + 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 zepConfig: IZepConfig = { + apiUrl: baseURL, + collectionName: zepCollection, + embeddingDimensions: dimension, + isAutoEmbedded: false + } + if (apiKey) zepConfig.apiKey = apiKey + + const vectorStore = await ZepVectorStore.fromDocuments(finalDocs, embeddings, zepConfig) + + if (output === 'retriever') { + const retriever = vectorStore.asRetriever(k) + return retriever + } else if (output === 'vectorStore') { + ;(vectorStore as any).k = k + return vectorStore + } + return vectorStore + } +} + +module.exports = { nodeClass: Zep_Upsert_VectorStores } diff --git a/packages/components/nodes/vectorstores/Zep/zep.png b/packages/components/nodes/vectorstores/Zep/zep.png new file mode 100644 index 0000000000000000000000000000000000000000..2fdb238271c40ec0de48c196b92f14115c944dbf GIT binary patch literal 25127 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 av;QB=>6btFOcTZc0000