diff --git a/packages/components/credentials/UpstashRedisMemoryApi.credential.ts b/packages/components/credentials/UpstashRedisMemoryApi.credential.ts
new file mode 100644
index 00000000..8d3e9528
--- /dev/null
+++ b/packages/components/credentials/UpstashRedisMemoryApi.credential.ts
@@ -0,0 +1,26 @@
+import { INodeParams, INodeCredential } from '../src/Interface'
+
+class UpstashRedisMemoryApi implements INodeCredential {
+ label: string
+ name: string
+ version: number
+ description: string
+ inputs: INodeParams[]
+
+ constructor() {
+ this.label = 'Upstash Redis Memory API'
+ this.name = 'upstashRedisMemoryApi'
+ this.version = 1.0
+ this.description =
+ 'Refer to official guide on how to create redis instance and get redis REST Token'
+ this.inputs = [
+ {
+ label: 'Upstash Redis REST Token',
+ name: 'upstashRestToken',
+ type: 'password'
+ }
+ ]
+ }
+}
+
+module.exports = { credClass: UpstashRedisMemoryApi }
diff --git a/packages/components/nodes/memory/UpstashRedisBackedChatMemory/UpstashRedisBackedChatMemory.ts b/packages/components/nodes/memory/UpstashRedisBackedChatMemory/UpstashRedisBackedChatMemory.ts
new file mode 100644
index 00000000..6b5fdf66
--- /dev/null
+++ b/packages/components/nodes/memory/UpstashRedisBackedChatMemory/UpstashRedisBackedChatMemory.ts
@@ -0,0 +1,118 @@
+import { INode, INodeData, INodeParams } from '../../../src/Interface'
+import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils'
+import { ICommonObject } from '../../../src'
+import { BufferMemory, BufferMemoryInput } from 'langchain/memory'
+import { UpstashRedisChatMessageHistory } from 'langchain/stores/message/upstash_redis'
+
+class UpstashRedisBackedChatMemory_Memory implements INode {
+ label: string
+ name: string
+ version: number
+ description: string
+ type: string
+ icon: string
+ category: string
+ baseClasses: string[]
+ credential: INodeParams
+ inputs: INodeParams[]
+
+ constructor() {
+ this.label = 'Upstash Redis-Backed Chat Memory'
+ this.name = 'upstashRedisBackedChatMemory'
+ this.version = 1.0
+ this.type = 'UpstashRedisBackedChatMemory'
+ this.icon = 'upstash.svg'
+ this.category = 'Memory'
+ this.description = 'Summarizes the conversation and stores the memory in Upstash Redis server'
+ this.baseClasses = [this.type, ...getBaseClasses(BufferMemory)]
+ this.credential = {
+ label: 'Connect Credential',
+ name: 'credential',
+ type: 'credential',
+ description: 'Configure password authentication on your upstash redis instance',
+ credentialNames: ['upstashRedisMemoryApi']
+ }
+ this.inputs = [
+ {
+ label: 'Upstash Redis REST URL',
+ name: 'baseURL',
+ type: 'string',
+ placeholder: 'https://.upstash.io'
+ },
+ {
+ label: 'Session Id',
+ name: 'sessionId',
+ type: 'string',
+ description: 'If not specified, the first CHAT_MESSAGE_ID will be used as sessionId',
+ default: '',
+ additionalParams: true,
+ optional: true
+ },
+ {
+ label: 'Session Timeouts',
+ name: 'sessionTTL',
+ type: 'number',
+ description: 'Omit this parameter to make sessions never expire',
+ additionalParams: true,
+ optional: true
+ }
+ ]
+ }
+
+ async init(nodeData: INodeData, _: string, options: ICommonObject): Promise {
+ return initalizeUpstashRedis(nodeData, options)
+ }
+
+ async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise {
+ const redis = await initalizeUpstashRedis(nodeData, options)
+ const sessionId = nodeData.inputs?.sessionId as string
+ const chatId = options?.chatId as string
+ options.logger.info(`Clearing Upstash Redis memory session ${sessionId ? sessionId : chatId}`)
+ await redis.clear()
+ options.logger.info(`Successfully cleared Upstash Redis memory session ${sessionId ? sessionId : chatId}`)
+ }
+}
+
+const initalizeUpstashRedis = async (nodeData: INodeData, options: ICommonObject): Promise => {
+ const baseURL = nodeData.inputs?.baseURL as string
+ const sessionId = nodeData.inputs?.sessionId as string
+ const sessionTTL = nodeData.inputs?.sessionTTL as string
+ const chatId = options?.chatId as string
+
+ let isSessionIdUsingChatMessageId = false
+ if (!sessionId && chatId) isSessionIdUsingChatMessageId = true
+
+ const credentialData = await getCredentialData(nodeData.credential ?? '', options)
+ const upstashRestToken = getCredentialParam('upstashRestToken', credentialData, nodeData)
+
+ const redisChatMessageHistory = new UpstashRedisChatMessageHistory({
+ sessionId: sessionId ? sessionId : chatId,
+ sessionTTL: sessionTTL ? parseInt(sessionTTL, 10) : undefined,
+ config: {
+ url: baseURL,
+ token: upstashRestToken
+ }
+ })
+
+ const memory = new BufferMemoryExtended({
+ chatHistory: redisChatMessageHistory,
+ isSessionIdUsingChatMessageId
+ })
+
+ return memory
+}
+
+interface BufferMemoryExtendedInput {
+ isSessionIdUsingChatMessageId: boolean
+}
+
+class BufferMemoryExtended extends BufferMemory {
+ isSessionIdUsingChatMessageId? = false
+
+ constructor(fields: BufferMemoryInput & Partial) {
+ super(fields)
+ this.isSessionIdUsingChatMessageId = fields.isSessionIdUsingChatMessageId
+ }
+}
+
+module.exports = { nodeClass: UpstashRedisBackedChatMemory_Memory }
diff --git a/packages/components/nodes/memory/UpstashRedisBackedChatMemory/upstash.svg b/packages/components/nodes/memory/UpstashRedisBackedChatMemory/upstash.svg
new file mode 100644
index 00000000..a0fb96a7
--- /dev/null
+++ b/packages/components/nodes/memory/UpstashRedisBackedChatMemory/upstash.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/packages/components/package.json b/packages/components/package.json
index ba63cb92..a3bd992c 100644
--- a/packages/components/package.json
+++ b/packages/components/package.json
@@ -28,6 +28,7 @@
"@supabase/supabase-js": "^2.29.0",
"@types/js-yaml": "^4.0.5",
"@types/jsdom": "^21.1.1",
+ "@upstash/redis": "^1.22.1",
"@zilliz/milvus2-sdk-node": "^2.2.24",
"apify-client": "^2.7.1",
"axios": "^0.27.2",