From 086be60b0a717aaf2c9a2b95ac1c0f809bf21e3b Mon Sep 17 00:00:00 2001 From: Saket Aryan <94069182+whysosaket@users.noreply.github.com> Date: Wed, 9 Apr 2025 16:30:33 +0530 Subject: [PATCH 1/3] Adds Current Message Param in getChatMessages to use Mem0 more effectively --- .../chains/ConversationChain/ConversationChain.ts | 13 ++++++++++--- packages/components/nodes/memory/Mem0/Mem0.ts | 10 ++++++++-- packages/components/src/Interface.ts | 3 ++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts index f0d3de7aa55..7a0459328bd 100644 --- a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts +++ b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts @@ -24,7 +24,8 @@ import { INodeData, INodeParams, MessageContentImageUrl, - IServerSideEventStreamer + IServerSideEventStreamer, + IMessage } from '../../../src/Interface' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { getBaseClasses, handleEscapeCharacters, transformBracesWithColon } from '../../../src/utils' @@ -260,8 +261,14 @@ const prepareChain = async (nodeData: INodeData, options: ICommonObject, session const conversationChain = RunnableSequence.from([ { [inputKey]: (input: { input: string }) => input.input, - [memoryKey]: async () => { - const history = await memory.getChatMessages(sessionId, true, prependMessages) + [memoryKey]: async (input: { input: string }) => { + const currentMessages = [ + { + message: input.input, + type: 'userMessage' + } + ] as IMessage[] + const history = await memory.getChatMessages(sessionId, true, prependMessages, currentMessages) return history }, ...promptVariables diff --git a/packages/components/nodes/memory/Mem0/Mem0.ts b/packages/components/nodes/memory/Mem0/Mem0.ts index ba7960163dc..4f425dabaff 100644 --- a/packages/components/nodes/memory/Mem0/Mem0.ts +++ b/packages/components/nodes/memory/Mem0/Mem0.ts @@ -290,7 +290,8 @@ class Mem0MemoryExtended extends BaseMem0Memory implements MemoryMethods { async getChatMessages( overrideUserId = '', returnBaseMessages = false, - prependMessages?: IMessage[] + prependMessages?: IMessage[], + currentMessages?: IMessage[] ): Promise { const flowiseSessionId = overrideUserId if (!flowiseSessionId) { @@ -322,7 +323,12 @@ class Mem0MemoryExtended extends BaseMem0Memory implements MemoryMethods { } if (returnBaseMessages) { - const memoryVariables = await this.loadMemoryVariables({}, overrideUserId) + const memoryVariables = await this.loadMemoryVariables( + { + [this.inputKey]: currentMessages?.[0]?.message ?? '' + }, + overrideUserId + ) const mem0History = memoryVariables[this.memoryKey] if (mem0History && typeof mem0History === 'string') { diff --git a/packages/components/src/Interface.ts b/packages/components/src/Interface.ts index 194e83582f7..9c0317e25a9 100644 --- a/packages/components/src/Interface.ts +++ b/packages/components/src/Interface.ts @@ -347,7 +347,8 @@ export abstract class FlowiseMemory extends BufferMemory implements MemoryMethod abstract getChatMessages( overrideSessionId?: string, returnBaseMessages?: boolean, - prependMessages?: IMessage[] + prependMessages?: IMessage[], + currentMessages?: IMessage[] ): Promise abstract addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId?: string): Promise abstract clearChatMessages(overrideSessionId?: string): Promise From 2772003065d400350242b45d976ce64485afcf8d Mon Sep 17 00:00:00 2001 From: Saket Aryan <94069182+whysosaket@users.noreply.github.com> Date: Mon, 12 May 2025 15:27:22 +0530 Subject: [PATCH 2/3] Revert "Adds Current Message Param in getChatMessages to use Mem0 more effectively" This reverts commit 086be60b0a717aaf2c9a2b95ac1c0f809bf21e3b. --- .../chains/ConversationChain/ConversationChain.ts | 13 +++---------- packages/components/nodes/memory/Mem0/Mem0.ts | 10 ++-------- packages/components/src/Interface.ts | 3 +-- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts index 7a0459328bd..f0d3de7aa55 100644 --- a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts +++ b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts @@ -24,8 +24,7 @@ import { INodeData, INodeParams, MessageContentImageUrl, - IServerSideEventStreamer, - IMessage + IServerSideEventStreamer } from '../../../src/Interface' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { getBaseClasses, handleEscapeCharacters, transformBracesWithColon } from '../../../src/utils' @@ -261,14 +260,8 @@ const prepareChain = async (nodeData: INodeData, options: ICommonObject, session const conversationChain = RunnableSequence.from([ { [inputKey]: (input: { input: string }) => input.input, - [memoryKey]: async (input: { input: string }) => { - const currentMessages = [ - { - message: input.input, - type: 'userMessage' - } - ] as IMessage[] - const history = await memory.getChatMessages(sessionId, true, prependMessages, currentMessages) + [memoryKey]: async () => { + const history = await memory.getChatMessages(sessionId, true, prependMessages) return history }, ...promptVariables diff --git a/packages/components/nodes/memory/Mem0/Mem0.ts b/packages/components/nodes/memory/Mem0/Mem0.ts index 4f425dabaff..ba7960163dc 100644 --- a/packages/components/nodes/memory/Mem0/Mem0.ts +++ b/packages/components/nodes/memory/Mem0/Mem0.ts @@ -290,8 +290,7 @@ class Mem0MemoryExtended extends BaseMem0Memory implements MemoryMethods { async getChatMessages( overrideUserId = '', returnBaseMessages = false, - prependMessages?: IMessage[], - currentMessages?: IMessage[] + prependMessages?: IMessage[] ): Promise { const flowiseSessionId = overrideUserId if (!flowiseSessionId) { @@ -323,12 +322,7 @@ class Mem0MemoryExtended extends BaseMem0Memory implements MemoryMethods { } if (returnBaseMessages) { - const memoryVariables = await this.loadMemoryVariables( - { - [this.inputKey]: currentMessages?.[0]?.message ?? '' - }, - overrideUserId - ) + const memoryVariables = await this.loadMemoryVariables({}, overrideUserId) const mem0History = memoryVariables[this.memoryKey] if (mem0History && typeof mem0History === 'string') { diff --git a/packages/components/src/Interface.ts b/packages/components/src/Interface.ts index 9c0317e25a9..194e83582f7 100644 --- a/packages/components/src/Interface.ts +++ b/packages/components/src/Interface.ts @@ -347,8 +347,7 @@ export abstract class FlowiseMemory extends BufferMemory implements MemoryMethod abstract getChatMessages( overrideSessionId?: string, returnBaseMessages?: boolean, - prependMessages?: IMessage[], - currentMessages?: IMessage[] + prependMessages?: IMessage[] ): Promise abstract addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId?: string): Promise abstract clearChatMessages(overrideSessionId?: string): Promise From b7feccc13d0c6184d88b94e8c54bb50020f954f3 Mon Sep 17 00:00:00 2001 From: Saket Aryan <94069182+whysosaket@users.noreply.github.com> Date: Mon, 12 May 2025 15:31:18 +0530 Subject: [PATCH 3/3] Used the input param for Getting the Input text inside of Mem0 Node --- packages/components/nodes/memory/Mem0/Mem0.ts | 61 +++++++++++-------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/packages/components/nodes/memory/Mem0/Mem0.ts b/packages/components/nodes/memory/Mem0/Mem0.ts index ba7960163dc..456cbba7f45 100644 --- a/packages/components/nodes/memory/Mem0/Mem0.ts +++ b/packages/components/nodes/memory/Mem0/Mem0.ts @@ -15,6 +15,12 @@ interface BufferMemoryExtendedInput { chatflowid: string } +interface NodeFields extends Mem0MemoryInput, Mem0MemoryExtendedInput, BufferMemoryExtendedInput { + searchOnly: boolean + useFlowiseChatId: boolean + input: string +} + class Mem0_Memory implements INode { label: string name: string @@ -143,12 +149,12 @@ class Mem0_Memory implements INode { ] } - async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { - return await initializeMem0(nodeData, options) + async init(nodeData: INodeData, input: string, options: ICommonObject): Promise { + return await initializeMem0(nodeData, input, options) } } -const initializeMem0 = async (nodeData: INodeData, options: ICommonObject): Promise => { +const initializeMem0 = async (nodeData: INodeData, input: string, options: ICommonObject): Promise => { const initialUserId = nodeData.inputs?.user_id as string const useFlowiseChatId = nodeData.inputs?.useFlowiseChatId as boolean @@ -183,23 +189,23 @@ const initializeMem0 = async (nodeData: INodeData, options: ICommonObject): Prom filters: (nodeData.inputs?.filters as Record) || {} } - const obj: Mem0MemoryInput & Mem0MemoryExtendedInput & BufferMemoryExtendedInput & { searchOnly: boolean; useFlowiseChatId: boolean } = - { - apiKey: apiKey, - humanPrefix: nodeData.inputs?.humanPrefix as string, - aiPrefix: nodeData.inputs?.aiPrefix as string, - inputKey: nodeData.inputs?.inputKey as string, - sessionId: constructorSessionId, - mem0Options: mem0Options, - memoryOptions: memoryOptions, - separateMessages: false, - returnMessages: false, - appDataSource: options.appDataSource as DataSource, - databaseEntities: options.databaseEntities as IDatabaseEntity, - chatflowid: options.chatflowid as string, - searchOnly: (nodeData.inputs?.searchOnly as boolean) || false, - useFlowiseChatId: useFlowiseChatId - } + const obj: NodeFields = { + apiKey: apiKey, + humanPrefix: nodeData.inputs?.humanPrefix as string, + aiPrefix: nodeData.inputs?.aiPrefix as string, + inputKey: nodeData.inputs?.inputKey as string, + sessionId: constructorSessionId, + mem0Options: mem0Options, + memoryOptions: memoryOptions, + separateMessages: false, + returnMessages: false, + appDataSource: options.appDataSource as DataSource, + databaseEntities: options.databaseEntities as IDatabaseEntity, + chatflowid: options.chatflowid as string, + searchOnly: (nodeData.inputs?.searchOnly as boolean) || false, + useFlowiseChatId: useFlowiseChatId, + input: input + } return new Mem0MemoryExtended(obj) } @@ -219,10 +225,9 @@ class Mem0MemoryExtended extends BaseMem0Memory implements MemoryMethods { chatflowid: string searchOnly: boolean useFlowiseChatId: boolean + input: string - constructor( - fields: Mem0MemoryInput & Mem0MemoryExtendedInput & BufferMemoryExtendedInput & { searchOnly: boolean; useFlowiseChatId: boolean } - ) { + constructor(fields: NodeFields) { super(fields) this.initialUserId = fields.memoryOptions?.user_id ?? '' this.userId = this.initialUserId @@ -233,6 +238,7 @@ class Mem0MemoryExtended extends BaseMem0Memory implements MemoryMethods { this.chatflowid = fields.chatflowid this.searchOnly = fields.searchOnly this.useFlowiseChatId = fields.useFlowiseChatId + this.input = fields.input } // Selects Mem0 user_id based on toggle state (Flowise chat ID or input field) @@ -318,11 +324,16 @@ class Mem0MemoryExtended extends BaseMem0Memory implements MemoryMethods { if (prependMessages?.length) { returnIMessages.unshift(...prependMessages) // Reverted to original simpler unshift - chatMessage.unshift(...(prependMessages as any)) // Cast as any + chatMessage.unshift(...(prependMessages as any)) } if (returnBaseMessages) { - const memoryVariables = await this.loadMemoryVariables({}, overrideUserId) + const memoryVariables = await this.loadMemoryVariables( + { + [this.inputKey]: this.input ?? '' + }, + overrideUserId + ) const mem0History = memoryVariables[this.memoryKey] if (mem0History && typeof mem0History === 'string') {