diff --git a/models/Conversation.js b/models/Conversation.js index 1096a6dcc2..d964f1874c 100644 --- a/models/Conversation.js +++ b/models/Conversation.js @@ -27,25 +27,25 @@ const Conversation = module.exports = { saveConvo: async ({ conversationId, parentMessageId, title }) => { - const messages = await getMessages({ conversationId }); - const update = { parentMessageId, messages }; - if (title) { - update.title = title; - } + try { + const messages = await getMessages({ conversationId }); + const update = { parentMessageId, messages }; + if (title) { + update.title = title; + } - await Conversation.findOneAndUpdate( - { conversationId }, - { $set: update }, - { new: true, upsert: true } - ).exec(); + return await Conversation.findOneAndUpdate( + { conversationId }, + { $set: update }, + { new: true, upsert: true } + ).exec(); + } catch (error) { + console.log(error); + return { message: 'Error saving conversation' }; + } }, getConvos: async () => await Conversation.find({}).exec(), deleteConvos: async (filter) => { - // const filter = {}; - - // if (!!conversationId) { - // filter = conversationId; - // } let deleteCount = await Conversation.deleteMany(filter).exec(); deleteCount.messages = await deleteMessages(filter); diff --git a/models/Message.js b/models/Message.js index 9b4e339c0d..93ca0e453b 100644 --- a/models/Message.js +++ b/models/Message.js @@ -32,13 +32,19 @@ const Message = mongoose.models.Message || mongoose.model('Message', messageSche module.exports = { saveMessage: async ({ id, conversationId, parentMessageId, sender, text }) => { - await Message.create({ - id, - conversationId, - parentMessageId, - sender, - text - }); + try { + await Message.create({ + id, + conversationId, + parentMessageId, + sender, + text + }); + return { id, conversationId, parentMessageId, sender, text }; + } catch (error) { + console.error(error); + return { message: 'Error saving message' }; + } }, getMessages: async (filter) => await Message.find(filter).exec(), deleteMessages: async (filter) => await Message.deleteMany(filter).exec() diff --git a/server/index.js b/server/index.js index c6ae9c651e..4d51f0d30e 100644 --- a/server/index.js +++ b/server/index.js @@ -52,6 +52,8 @@ app.post('/ask', async (req, res) => { const userMessageId = crypto.randomUUID(); let userMessage = { id: userMessageId, sender: 'User', text }; + console.log(userMessage, req.body); + res.writeHead(200, { Connection: 'keep-alive', 'Content-Type': 'text/event-stream', @@ -61,22 +63,23 @@ app.post('/ask', async (req, res) => { }); // res.write(`event: message\ndata: ${JSON.stringify('')}\n\n`); - - let i = 0; - const progressCallback = async (partial) => { - // console.log('partial', partial); - if (i === 0) { - userMessage.parentMessageId = parentMessageId ? parentMessageId : partial.id; - userMessage.conversationId = conversationId ? conversationId : partial.conversationId; - await saveMessage(userMessage); - res.write(`event: message\ndata: ${JSON.stringify({ ...partial, initial: true })}\n\n`); - i++; - } - const data = JSON.stringify({ ...partial, message: true }); - res.write(`event: message\ndata: ${data}\n\n`); - }; - try { + let i = 0; + const progressCallback = async (partial) => { + // console.log('partial', partial); + if (i === 0) { + userMessage.parentMessageId = parentMessageId ? parentMessageId : partial.id; + userMessage.conversationId = conversationId ? conversationId : partial.conversationId; + await saveMessage(userMessage); + res.write( + `event: message\ndata: ${JSON.stringify({ ...partial, initial: true })}\n\n` + ); + i++; + } + const data = JSON.stringify({ ...partial, message: true }); + res.write(`event: message\ndata: ${data}\n\n`); + }; + let gptResponse = await ask(text, progressCallback, { parentMessageId, conversationId }); if (!!parentMessageId) { gptResponse = { ...gptResponse, parentMessageId }; @@ -84,6 +87,12 @@ app.post('/ask', async (req, res) => { gptResponse.title = await titleConversation(text, gptResponse.text); } + if (gptResponse.text.includes('2023')) { + res.status(500).write('event: error\ndata: empty string error?'); + res.end(); + return; + } + gptResponse.sender = 'GPT'; await saveMessage(gptResponse); await saveConvo(gptResponse); @@ -91,8 +100,9 @@ app.post('/ask', async (req, res) => { res.write(`event: message\ndata: ${JSON.stringify(gptResponse)}\n\n`); res.end(); } catch (error) { - console.error(error); - res.status(500).send(error); + console.log(error); + res.status(500).write('event: error\ndata: ' + error.message); + res.end(); } }); diff --git a/src/components/Nav/ClearConvos.jsx b/src/components/Nav/ClearConvos.jsx index ff5426e413..0b070ff2ba 100644 --- a/src/components/Nav/ClearConvos.jsx +++ b/src/components/Nav/ClearConvos.jsx @@ -18,7 +18,10 @@ export default function ClearConvos() { } ); - const clickHandler = () => trigger({}); + const clickHandler = () => { + console.log('Clearing conversations...'); + trigger({}); + }; return ( state.submit); const props = { className: @@ -18,10 +18,20 @@ export default function Message({ sender, text, last = false}) {
{sender}:
- - {text} - {isSubmitting && last && sender === 'GPT' && } - +
+ {!!error ? ( +
+
+ {text} +
+
+ ) : ( + + {text} + {isSubmitting && last && sender === 'GPT' && } + + )} +
diff --git a/src/components/main/Messages.jsx b/src/components/main/Messages.jsx index bcd67f1b32..f14a56fae3 100644 --- a/src/components/main/Messages.jsx +++ b/src/components/main/Messages.jsx @@ -32,6 +32,7 @@ export default function Messages({ messages }) { sender={message.sender} text={message.text} last={i === messages.length - 1} + error={!!message.error ? true : false} /> ))}
diff --git a/src/components/main/TextChat.jsx b/src/components/main/TextChat.jsx index ce3084fc1d..f74d3cf5c8 100644 --- a/src/components/main/TextChat.jsx +++ b/src/components/main/TextChat.jsx @@ -35,8 +35,20 @@ export default function TextChat({ messages, reloadConvos }) { reloadConvos(); dispatch(setSubmitState(false)); }; + + const errorHandler = (data) => { + console.log('Error:', data); + const errorResponse = { + ...initialResponse, + text: 'An error occurred. Please try again in a few moments.', + error: true + }; + dispatch(setSubmitState(false)); + dispatch(setMessages([...messages, currentMsg, errorResponse])); + return; + }; console.log('User Input:', payload); - handleSubmit(payload, messageHandler, convo, convoHandler); + handleSubmit({ text: payload, messageHandler, convo, convoHandler, errorHandler }); }; const handleKeyPress = (e) => { diff --git a/src/utils/handleSubmit.js b/src/utils/handleSubmit.js index 1c6c09792b..16e9a0160d 100644 --- a/src/utils/handleSubmit.js +++ b/src/utils/handleSubmit.js @@ -1,6 +1,12 @@ import { SSE } from '../../app/sse'; -export default function handleSubmit(text, messageHandler, convo, convoHandler) { +export default function handleSubmit({ + text, + convo, + messageHandler, + convoHandler, + errorHandler +}) { let payload = { text }; if (convo.conversationId && convo.parentMessageId) { payload = { @@ -34,7 +40,8 @@ export default function handleSubmit(text, messageHandler, convo, convoHandler) events.onerror = function (e) { console.log(e, 'error in opening conn.'); events.close(); + errorHandler(e); }; events.stream(); -}; \ No newline at end of file +}