mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 08:50:15 +01:00
server fix: code refactor
This commit is contained in:
parent
ea88e9b981
commit
dae0c2d5e3
4 changed files with 90 additions and 51 deletions
|
|
@ -1,33 +1,60 @@
|
||||||
const Message = require('./schema/messageSchema');
|
const Message = require('./schema/messageSchema');
|
||||||
module.exports = {
|
module.exports = {
|
||||||
Message,
|
Message,
|
||||||
saveMessage: async ({ messageId, conversationId, parentMessageId, sender, text, isCreatedByUser=false, error }) => {
|
saveMessage: async ({
|
||||||
|
messageId,
|
||||||
|
newMessageId,
|
||||||
|
conversationId,
|
||||||
|
parentMessageId,
|
||||||
|
sender,
|
||||||
|
text,
|
||||||
|
isCreatedByUser = false,
|
||||||
|
error
|
||||||
|
}) => {
|
||||||
try {
|
try {
|
||||||
await Message.findOneAndUpdate({ messageId }, {
|
await Message.findOneAndUpdate(
|
||||||
conversationId,
|
{ messageId },
|
||||||
parentMessageId,
|
{
|
||||||
sender,
|
messageId: newMessageId || messageId,
|
||||||
text,
|
conversationId,
|
||||||
isCreatedByUser,
|
parentMessageId,
|
||||||
error
|
sender,
|
||||||
}, { upsert: true, new: true });
|
text,
|
||||||
|
isCreatedByUser,
|
||||||
|
error
|
||||||
|
},
|
||||||
|
{ upsert: true, new: true }
|
||||||
|
);
|
||||||
return { messageId, conversationId, parentMessageId, sender, text, isCreatedByUser };
|
return { messageId, conversationId, parentMessageId, sender, text, isCreatedByUser };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
return { message: 'Error saving message' };
|
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 {
|
try {
|
||||||
await Message.findOneAndUpdate({ messageId: oldMessageId }, {
|
await Message.findOneAndUpdate(
|
||||||
messageId,
|
{ messageId },
|
||||||
conversationId,
|
{
|
||||||
parentMessageId,
|
messageId: newMessageId || messageId,
|
||||||
sender,
|
conversationId,
|
||||||
text,
|
parentMessageId,
|
||||||
isCreatedByUser,
|
sender,
|
||||||
error
|
text,
|
||||||
}, { upsert: true, new: true });
|
isCreatedByUser,
|
||||||
|
error
|
||||||
|
},
|
||||||
|
{ upsert: true, new: true }
|
||||||
|
);
|
||||||
return { messageId, conversationId, parentMessageId, sender, text, isCreatedByUser };
|
return { messageId, conversationId, parentMessageId, sender, text, isCreatedByUser };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
|
@ -36,29 +63,31 @@ module.exports = {
|
||||||
},
|
},
|
||||||
deleteMessagesSince: async ({ messageId, conversationId }) => {
|
deleteMessagesSince: async ({ messageId, conversationId }) => {
|
||||||
try {
|
try {
|
||||||
const message = await Message.findOne({ messageId }).exec()
|
const message = await Message.findOne({ messageId }).exec();
|
||||||
|
|
||||||
if (message)
|
if (message)
|
||||||
return await Message.find({ conversationId }).deleteMany({ createdAt: { $gt: message.createdAt } }).exec();
|
return await Message.find({ conversationId })
|
||||||
|
.deleteMany({ createdAt: { $gt: message.createdAt } })
|
||||||
|
.exec();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
return { message: 'Error deleting messages' };
|
return { message: 'Error deleting messages' };
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
getMessages: async (filter) => {
|
getMessages: async filter => {
|
||||||
try {
|
try {
|
||||||
return await Message.find(filter).sort({createdAt: 1}).exec()
|
return await Message.find(filter).sort({ createdAt: 1 }).exec();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
return { message: 'Error getting messages' };
|
return { message: 'Error getting messages' };
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
deleteMessages: async (filter) => {
|
deleteMessages: async filter => {
|
||||||
try {
|
try {
|
||||||
return await Message.deleteMany(filter).exec()
|
return await Message.deleteMany(filter).exec();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
return { message: 'Error deleting messages' };
|
return { message: 'Error deleting messages' };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
|
||||||
|
|
@ -111,23 +111,31 @@ const ask = async ({
|
||||||
|
|
||||||
console.log('BING RESPONSE', response);
|
console.log('BING RESPONSE', response);
|
||||||
|
|
||||||
userMessage.conversationSignature =
|
// STEP1 update the convosation
|
||||||
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 });
|
|
||||||
|
|
||||||
// Bing API will not use our conversationId at the first time,
|
// Bing API will not use our conversationId at the first time,
|
||||||
// so change the placeholder conversationId to the real one.
|
// so change the placeholder conversationId to the real one.
|
||||||
// Attition: the api will also create new conversationId while using invalid userMessage.parentMessageId,
|
// 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.
|
// 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, {
|
await saveConvo(req?.session?.user?.username, {
|
||||||
conversationId: conversationId,
|
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.**';
|
response.text = response.response || response.details.spokenText || '**Bing refused to answer.**';
|
||||||
// delete response.response;
|
// delete response.response;
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ const ask = async ({
|
||||||
req,
|
req,
|
||||||
res
|
res
|
||||||
}) => {
|
}) => {
|
||||||
const { text, parentMessageId: userParentMessageId, messageId: userMessageId } = userMessage;
|
let { text, parentMessageId: userParentMessageId, messageId: userMessageId } = userMessage;
|
||||||
|
|
||||||
const client = askClient;
|
const client = askClient;
|
||||||
|
|
||||||
|
|
@ -107,23 +107,22 @@ const ask = async ({
|
||||||
gptResponse.text = gptResponse.response;
|
gptResponse.text = gptResponse.response;
|
||||||
console.log('CLIENT RESPONSE', gptResponse);
|
console.log('CLIENT RESPONSE', gptResponse);
|
||||||
|
|
||||||
if (!gptResponse.parentMessageId) {
|
if (gptResponse.parentMessageId) {
|
||||||
gptResponse.parentMessageId = overrideParentMessageId || userMessageId;
|
// 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;
|
delete gptResponse.response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gptResponse.parentMessageId = overrideParentMessageId || userMessageId;
|
||||||
gptResponse.sender = endpointOption?.chatGptLabel || 'ChatGPT';
|
gptResponse.sender = endpointOption?.chatGptLabel || 'ChatGPT';
|
||||||
// gptResponse.model = model;
|
// gptResponse.model = model;
|
||||||
gptResponse.text = await handleText(gptResponse);
|
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 saveMessage(gptResponse);
|
||||||
await updateConvo(req?.session?.user?.username, {
|
await updateConvo(req?.session?.user?.username, {
|
||||||
|
|
|
||||||
|
|
@ -29,10 +29,13 @@ router.post('/', async (req, res) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
router.post('/delete', 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 {
|
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 => {
|
const presets = (await getPresets(req?.session?.user?.username)).map(preset => {
|
||||||
return preset.toObject();
|
return preset.toObject();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue