feat: unique chat id

This commit is contained in:
Jeffrey-Wang
2023-06-11 13:14:53 +08:00
parent 011f6afcb3
commit 023967e0c2
5 changed files with 19 additions and 11 deletions
@@ -2,6 +2,7 @@ import { SystemChatMessage } from 'langchain/schema'
import { INode, INodeData, INodeParams } from '../../../src/Interface' import { INode, INodeData, INodeParams } from '../../../src/Interface'
import { getBaseClasses } from '../../../src/utils' import { getBaseClasses } from '../../../src/utils'
import { ZepMemory, ZepMemoryInput } from 'langchain/memory/zep' import { ZepMemory, ZepMemoryInput } from 'langchain/memory/zep'
import { ICommonObject } from '../../../src'
class ZepMemory_Memory implements INode { class ZepMemory_Memory implements INode {
label: string label: string
@@ -28,13 +29,6 @@ class ZepMemory_Memory implements INode {
type: 'string', type: 'string',
default: 'http://127.0.0.1:8000' default: 'http://127.0.0.1:8000'
}, },
{
label: 'Session Id',
name: 'sessionId',
type: 'string',
placeholder: 'unique and manually change in every conversion!',
default: ''
},
{ {
label: 'Auto Summary', label: 'Auto Summary',
name: 'autoSummary', name: 'autoSummary',
@@ -86,15 +80,15 @@ class ZepMemory_Memory implements INode {
] ]
} }
async init(nodeData: INodeData): Promise<any> { async init(nodeData: INodeData, _: string, options: ICommonObject): Promise<any> {
const baseURL = nodeData.inputs?.baseURL as string const baseURL = nodeData.inputs?.baseURL as string
const sessionId = nodeData.inputs?.sessionId as string
const aiPrefix = nodeData.inputs?.aiPrefix as string const aiPrefix = nodeData.inputs?.aiPrefix as string
const humanPrefix = nodeData.inputs?.humanPrefix as string const humanPrefix = nodeData.inputs?.humanPrefix as string
const memoryKey = nodeData.inputs?.memoryKey as string const memoryKey = nodeData.inputs?.memoryKey as string
const inputKey = nodeData.inputs?.inputKey as string const inputKey = nodeData.inputs?.inputKey as string
const autoSummaryTemplate = nodeData.inputs?.autoSummaryTemplate as string const autoSummaryTemplate = nodeData.inputs?.autoSummaryTemplate as string
const autoSummary = nodeData.inputs?.autoSummary as boolean const autoSummary = nodeData.inputs?.autoSummary as boolean
const sessionId = options?.chatId as string
const obj: ZepMemoryInput = { const obj: ZepMemoryInput = {
baseURL, baseURL,
+1
View File
@@ -83,6 +83,7 @@ export class ChildProcess {
depthQueue, depthQueue,
componentNodes, componentNodes,
incomingInput.question, incomingInput.question,
'',
incomingInput?.overrideConfig incomingInput?.overrideConfig
) )
+11
View File
@@ -506,6 +506,16 @@ export class App {
}) })
if (!chatflow) return res.status(404).send(`Chatflow ${chatflowid} not found`) if (!chatflow) return res.status(404).send(`Chatflow ${chatflowid} not found`)
// first chatmessage id as the unique chat id
const firstChatMessage = await this.AppDataSource.getRepository(ChatMessage)
.createQueryBuilder('cm')
.select('cm.id')
.where('chatflowid = :chatflowid', { chatflowid })
.orderBy('cm.createdDate', 'ASC')
.getOne()
if (!firstChatMessage) return res.status(500).send(`Chatflow ${chatflowid} first message not found`)
const chatId = firstChatMessage.id
if (!isInternal) { if (!isInternal) {
await this.validateKey(req, res, chatflow) await this.validateKey(req, res, chatflow)
} }
@@ -618,6 +628,7 @@ export class App {
depthQueue, depthQueue,
this.nodesPool.componentNodes, this.nodesPool.componentNodes,
incomingInput.question, incomingInput.question,
chatId,
incomingInput?.overrideConfig incomingInput?.overrideConfig
) )
+2 -1
View File
@@ -182,6 +182,7 @@ export const buildLangchain = async (
depthQueue: IDepthQueue, depthQueue: IDepthQueue,
componentNodes: IComponentNodes, componentNodes: IComponentNodes,
question: string, question: string,
chatId: string,
overrideConfig?: ICommonObject overrideConfig?: ICommonObject
) => { ) => {
const flowNodes = cloneDeep(reactFlowNodes) const flowNodes = cloneDeep(reactFlowNodes)
@@ -214,7 +215,7 @@ export const buildLangchain = async (
if (overrideConfig) flowNodeData = replaceInputsWithConfig(flowNodeData, overrideConfig) if (overrideConfig) flowNodeData = replaceInputsWithConfig(flowNodeData, overrideConfig)
const reactFlowNodeData: INodeData = resolveVariables(flowNodeData, flowNodes, question) const reactFlowNodeData: INodeData = resolveVariables(flowNodeData, flowNodes, question)
flowNodes[nodeIndex].data.instance = await newNodeInstance.init(reactFlowNodeData, question) flowNodes[nodeIndex].data.instance = await newNodeInstance.init(reactFlowNodeData, question, { chatId })
} catch (e: any) { } catch (e: any) {
console.error(e) console.error(e)
throw new Error(e) throw new Error(e)
@@ -118,7 +118,8 @@ export const ChatMessage = ({ open, chatflowid, isDialog }) => {
setLoading(true) setLoading(true)
setMessages((prevMessages) => [...prevMessages, { message: userInput, type: 'userMessage' }]) setMessages((prevMessages) => [...prevMessages, { message: userInput, type: 'userMessage' }])
addChatMessage(userInput, 'userMessage') // waiting for first chatmessage uploaded, the first chatmessage id will be chatId for every components
await addChatMessage(userInput, 'userMessage')
// Send user question and history to API // Send user question and history to API
try { try {