diff --git a/api/models/Message.js b/api/models/Message.js index a886c02859..a3749f6f26 100644 --- a/api/models/Message.js +++ b/api/models/Message.js @@ -1,33 +1,60 @@ const Message = require('./schema/messageSchema'); module.exports = { Message, - saveMessage: async ({ messageId, conversationId, parentMessageId, sender, text, isCreatedByUser=false, error }) => { + saveMessage: async ({ + messageId, + newMessageId, + conversationId, + parentMessageId, + sender, + text, + isCreatedByUser = false, + error + }) => { try { - await Message.findOneAndUpdate({ messageId }, { - conversationId, - parentMessageId, - sender, - text, - isCreatedByUser, - error - }, { upsert: true, new: true }); + await Message.findOneAndUpdate( + { messageId }, + { + messageId: newMessageId || messageId, + conversationId, + parentMessageId, + sender, + text, + isCreatedByUser, + error + }, + { upsert: true, new: true } + ); return { messageId, conversationId, parentMessageId, sender, text, isCreatedByUser }; } catch (error) { console.error(error); return { message: 'Error saving message' }; } }, - saveBingMessage: async ({ messageId, oldMessageId = messageId, conversationId, parentMessageId, sender, text, isCreatedByUser=false, error }) => { + saveBingMessage: async ({ + messageId, + newMessageId, + conversationId, + parentMessageId, + sender, + text, + isCreatedByUser = false, + error + }) => { try { - await Message.findOneAndUpdate({ messageId: oldMessageId }, { - messageId, - conversationId, - parentMessageId, - sender, - text, - isCreatedByUser, - error - }, { upsert: true, new: true }); + await Message.findOneAndUpdate( + { messageId }, + { + messageId: newMessageId || messageId, + conversationId, + parentMessageId, + sender, + text, + isCreatedByUser, + error + }, + { upsert: true, new: true } + ); return { messageId, conversationId, parentMessageId, sender, text, isCreatedByUser }; } catch (error) { console.error(error); @@ -36,29 +63,31 @@ module.exports = { }, deleteMessagesSince: async ({ messageId, conversationId }) => { try { - const message = await Message.findOne({ messageId }).exec() + const message = await Message.findOne({ messageId }).exec(); - if (message) - return await Message.find({ conversationId }).deleteMany({ createdAt: { $gt: message.createdAt } }).exec(); + if (message) + return await Message.find({ conversationId }) + .deleteMany({ createdAt: { $gt: message.createdAt } }) + .exec(); } catch (error) { console.error(error); return { message: 'Error deleting messages' }; } }, - getMessages: async (filter) => { + getMessages: async filter => { try { - return await Message.find(filter).sort({createdAt: 1}).exec() + return await Message.find(filter).sort({ createdAt: 1 }).exec(); } catch (error) { console.error(error); return { message: 'Error getting messages' }; } }, - deleteMessages: async (filter) => { + deleteMessages: async filter => { try { - return await Message.deleteMany(filter).exec() + return await Message.deleteMany(filter).exec(); } catch (error) { console.error(error); return { message: 'Error deleting messages' }; } } -} \ No newline at end of file +}; diff --git a/api/server/routes/askBingAI.js b/api/server/routes/askBingAI.js index b13cbe8e65..eb6e18e328 100644 --- a/api/server/routes/askBingAI.js +++ b/api/server/routes/askBingAI.js @@ -111,23 +111,31 @@ const ask = async ({ console.log('BING RESPONSE', response); - userMessage.conversationSignature = - endpointOption.conversationSignature || response.conversationSignature; - userMessage.conversationId = response.conversationId || conversationId; - userMessage.invocationId = endpointOption.invocationId; - userMessage.messageId = response.details.requestId || userMessageId; - if (!overrideParentMessageId) await saveBingMessage({ oldMessageId: userMessageId, ...userMessage }); - + // STEP1 update the convosation // Bing API will not use our conversationId at the first time, // so change the placeholder conversationId to the real one. // Attition: the api will also create new conversationId while using invalid userMessage.parentMessageId, // but in this situation, don't change the conversationId, but create new convo. - if (conversationId != userMessage.conversationId && isNewConversation) + if (conversationId != response.conversationId && isNewConversation) await saveConvo(req?.session?.user?.username, { conversationId: conversationId, - newConversationId: userMessage.conversationId + newConversationId: response.conversationId || conversationId }); - conversationId = userMessage.conversationId; + conversationId = response.conversationId || conversationId; + + // STEP2 update the user message + userMessage.conversationSignature = + endpointOption.conversationSignature || response.conversationSignature; + userMessage.conversationId = conversationId; + userMessage.invocationId = endpointOption.invocationId; + userMessage.messageId = response.details.requestId || userMessageId; + + // If response has parentMessageId, the fake userMessage.messageId should be updated to the real one. + if (!overrideParentMessageId) { + const oldUserMessageId = userMessageId; + userMessageId = response.details.requestId; + await saveBingMessage({ ...userMessage, messageId: oldUserMessageId, newMessageId: userMessageId }); + } response.text = response.response || response.details.spokenText || '**Bing refused to answer.**'; // delete response.response; diff --git a/api/server/routes/askOpenAI.js b/api/server/routes/askOpenAI.js index eb7c2bfa07..2d27f263ce 100644 --- a/api/server/routes/askOpenAI.js +++ b/api/server/routes/askOpenAI.js @@ -77,7 +77,7 @@ const ask = async ({ req, res }) => { - const { text, parentMessageId: userParentMessageId, messageId: userMessageId } = userMessage; + let { text, parentMessageId: userParentMessageId, messageId: userMessageId } = userMessage; const client = askClient; @@ -107,23 +107,22 @@ const ask = async ({ gptResponse.text = gptResponse.response; console.log('CLIENT RESPONSE', gptResponse); - if (!gptResponse.parentMessageId) { - gptResponse.parentMessageId = overrideParentMessageId || userMessageId; + if (gptResponse.parentMessageId) { + // If gptResponse has parentMessageId, the fake userMessage.messageId should be updated to the real one. + if (!overrideParentMessageId) { + const oldUserMessageId = userMessageId; + userMessageId = gptResponse.parentMessageId; + userMessage.messageId = userMessageId; + await saveMessage({ ...userMessage, messageId: oldUserMessageId, newMessageId: userMessageId }); + } + } else { delete gptResponse.response; } + gptResponse.parentMessageId = overrideParentMessageId || userMessageId; gptResponse.sender = endpointOption?.chatGptLabel || 'ChatGPT'; // gptResponse.model = model; gptResponse.text = await handleText(gptResponse); - // if (convo.chatGptLabel?.length > 0 && model === 'chatgptCustom') { - // gptResponse.chatGptLabel = convo.chatGptLabel; - // } - - // if (convo.promptPrefix?.length > 0 && model === 'chatgptCustom') { - // gptResponse.promptPrefix = convo.promptPrefix; - // } - - gptResponse.parentMessageId = overrideParentMessageId || userMessageId; await saveMessage(gptResponse); await updateConvo(req?.session?.user?.username, { diff --git a/api/server/routes/presets.js b/api/server/routes/presets.js index 2e872fd84d..53a3801d6e 100644 --- a/api/server/routes/presets.js +++ b/api/server/routes/presets.js @@ -29,10 +29,13 @@ router.post('/', async (req, res) => { }); router.post('/delete', async (req, res) => { - const { arg } = req.body; + let filter = {}; + const { presetId } = req.body.arg || {}; + + if (presetId) filter = { presetId }; try { - await deletePresets(req?.session?.user?.username, arg); + await deletePresets(req?.session?.user?.username, filter); const presets = (await getPresets(req?.session?.user?.username)).map(preset => { return preset.toObject();