diff --git a/packages/server/src/Interface.ts b/packages/server/src/Interface.ts index f57c8311..36e02bee 100644 --- a/packages/server/src/Interface.ts +++ b/packages/server/src/Interface.ts @@ -2,6 +2,10 @@ import { ICommonObject, INode, INodeData as INodeDataFromComponent, INodeParams export type MessageType = 'apiMessage' | 'userMessage' +export enum chatType { + INTERNAL = 'INTERNAL', + EXTERNAL = 'EXTERNAL' +} /** * Databases */ diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index db5ecf38..78efe657 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -16,7 +16,8 @@ import { IReactFlowObject, INodeData, IDatabaseExport, - ICredentialReturnResponse + ICredentialReturnResponse, + chatType } from './Interface' import { getNodeModulesPackagePath, @@ -404,12 +405,7 @@ export class App { // Add chatmessages for chatflowid this.app.post('/api/v1/chatmessage/:id', async (req: Request, res: Response) => { const body = req.body - const newChatMessage = new ChatMessage() - Object.assign(newChatMessage, body) - - const chatmessage = this.AppDataSource.getRepository(ChatMessage).create(newChatMessage) - const results = await this.AppDataSource.getRepository(ChatMessage).save(chatmessage) - + const results = await this.addChatMessage(body) return res.json(results) }) @@ -818,6 +814,18 @@ export class App { } } + /** + * Add Chat Message + * @param {any} chatMessage + */ + async addChatMessage(chatMessage: any) { + const newChatMessage = new ChatMessage() + Object.assign(newChatMessage, chatMessage) + + const chatmessage = this.AppDataSource.getRepository(ChatMessage).create(newChatMessage) + return await this.AppDataSource.getRepository(ChatMessage).save(chatmessage) + } + /** * Process Prediction * @param {Request} req @@ -844,6 +852,13 @@ export class App { await this.validateKey(req, res, chatflow) } + await this.addChatMessage({ + role: 'userMessage', + content: incomingInput.question, + chatflowid: chatflowid, + chatType: isInternal ? chatType.INTERNAL : chatType.EXTERNAL + }) + let isStreamValid = false const files = (req.files as any[]) || [] @@ -991,6 +1006,15 @@ export class App { analytic: chatflow.analytic }) + const apiMessage: any = { + role: 'apiMessage', + content: typeof result === 'string' ? result : result.text, + chatflowid: chatflowid, + chatType: isInternal ? chatType.INTERNAL : chatType.EXTERNAL + } + if (result?.sourceDocuments) apiMessage.sourceDocuments = JSON.stringify(result.sourceDocuments) + await this.addChatMessage(apiMessage) + logger.debug(`[server]: Finished running ${nodeToExecuteData.label} (${nodeToExecuteData.id})`) return res.json(result) } catch (e: any) { diff --git a/packages/ui/src/api/chatmessage.js b/packages/ui/src/api/chatmessage.js index d93068e6..72a186a6 100644 --- a/packages/ui/src/api/chatmessage.js +++ b/packages/ui/src/api/chatmessage.js @@ -2,12 +2,9 @@ import client from './client' const getChatmessageFromChatflow = (id) => client.get(`/chatmessage/${id}`) -const createNewChatmessage = (id, body) => client.post(`/chatmessage/${id}`, body) - const deleteChatmessage = (id) => client.delete(`/chatmessage/${id}`) export default { getChatmessageFromChatflow, - createNewChatmessage, deleteChatmessage } diff --git a/packages/ui/src/views/chatmessage/ChatMessage.js b/packages/ui/src/views/chatmessage/ChatMessage.js index 7a15d9ff..cf5cea6c 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.js +++ b/packages/ui/src/views/chatmessage/ChatMessage.js @@ -104,20 +104,6 @@ export const ChatMessage = ({ open, chatflowid, isDialog }) => { const onChange = useCallback((e) => setUserInput(e.target.value), [setUserInput]) - const addChatMessage = async (message, type, sourceDocuments) => { - try { - const newChatMessageBody = { - role: type, - content: message, - chatflowid: chatflowid - } - if (sourceDocuments) newChatMessageBody.sourceDocuments = JSON.stringify(sourceDocuments) - await chatmessageApi.createNewChatmessage(chatflowid, newChatMessageBody) - } catch (error) { - console.error(error) - } - } - const updateLastMessage = (text) => { setMessages((prevMessages) => { let allMessages = [...cloneDeep(prevMessages)] @@ -140,7 +126,6 @@ export const ChatMessage = ({ open, chatflowid, isDialog }) => { const handleError = (message = 'Oops! There seems to be an error. Please try again.') => { message = message.replace(`Unable to parse JSON response from chat agent.\n\n`, '') setMessages((prevMessages) => [...prevMessages, { message, type: 'apiMessage' }]) - addChatMessage(message, 'apiMessage') setLoading(false) setUserInput('') setTimeout(() => { @@ -158,8 +143,6 @@ export const ChatMessage = ({ open, chatflowid, isDialog }) => { setLoading(true) setMessages((prevMessages) => [...prevMessages, { message: userInput, type: 'userMessage' }]) - // waiting for first chatmessage saved, the first chatmessage will be used in sendMessageAndGetPrediction - await addChatMessage(userInput, 'userMessage') // Send user question and history to API try { @@ -183,12 +166,10 @@ export const ChatMessage = ({ open, chatflowid, isDialog }) => { { message: data.text, sourceDocuments: data.sourceDocuments, type: 'apiMessage' } ]) } - addChatMessage(data.text, 'apiMessage', data.sourceDocuments) } else { if (!isChatFlowAvailableToStream) { setMessages((prevMessages) => [...prevMessages, { message: data, type: 'apiMessage' }]) } - addChatMessage(data, 'apiMessage') } setLoading(false) setUserInput('')