From 0fa19bb6ad4558173ed102d36855747513ef4dcf Mon Sep 17 00:00:00 2001 From: Wentao Lyu <35-wentao.lyu@users.noreply.git.stereye.tech> Date: Tue, 14 Mar 2023 03:38:47 +0800 Subject: [PATCH] feat: save error message into database. --- api/models/Message.js | 11 ++++++++--- api/server/routes/ask.js | 8 ++++++++ api/server/routes/askBing.js | 4 ++++ api/server/routes/askSydney.js | 4 ++++ client/src/components/Main/TextChat.jsx | 12 +++++++----- client/src/components/Messages/Message.jsx | 8 ++++++-- 6 files changed, 37 insertions(+), 10 deletions(-) diff --git a/api/models/Message.js b/api/models/Message.js index db1746924b..9e281a9f16 100644 --- a/api/models/Message.js +++ b/api/models/Message.js @@ -36,20 +36,25 @@ const messageSchema = mongoose.Schema({ type: Boolean, required: true, default: false - } + }, + error: { + type: Boolean, + default: false + }, }, { timestamps: true }); const Message = mongoose.models.Message || mongoose.model('Message', messageSchema); module.exports = { - saveMessage: async ({ messageId, conversationId, parentMessageId, sender, text, isCreatedByUser=false }) => { + saveMessage: async ({ messageId, conversationId, parentMessageId, sender, text, isCreatedByUser=false, error }) => { try { await Message.findOneAndUpdate({ messageId }, { conversationId, parentMessageId, sender, text, - isCreatedByUser + isCreatedByUser, + error }, { upsert: true, new: true }); return { messageId, conversationId, parentMessageId, sender, text, isCreatedByUser }; } catch (error) { diff --git a/api/server/routes/ask.js b/api/server/routes/ask.js index d21f8be263..d644af1624 100644 --- a/api/server/routes/ask.js +++ b/api/server/routes/ask.js @@ -131,6 +131,10 @@ router.post('/', async (req, res) => { gptResponse.text.toLowerCase().includes('no response') || gptResponse.text.toLowerCase().includes('no answer') ) { + await saveMessage({ + messageId: crypto.randomUUID(), sender: model, + conversationId, parentMessageId: userMessageId, + error: true, text: 'Prompt empty or too short'}); return handleError(res, 'Prompt empty or too short'); } @@ -165,6 +169,10 @@ router.post('/', async (req, res) => { } catch (error) { console.log(error); // await deleteMessages({ messageId: userMessageId }); + await saveMessage({ + messageId: crypto.randomUUID(), sender: model, + conversationId, parentMessageId: userMessageId, + error: true, text: error.message}); handleError(res, error.message); } }); diff --git a/api/server/routes/askBing.js b/api/server/routes/askBing.js index f2722bb248..7b5ca44185 100644 --- a/api/server/routes/askBing.js +++ b/api/server/routes/askBing.js @@ -107,6 +107,10 @@ router.post('/', async (req, res) => { } catch (error) { console.log(error); // await deleteMessages({ messageId: userMessageId }); + await saveMessage({ + messageId: crypto.randomUUID(), sender: model, + conversationId, parentMessageId: userMessageId, + error: true, text: error.message}); handleError(res, error.message); } }); diff --git a/api/server/routes/askSydney.js b/api/server/routes/askSydney.js index a90dd39555..cdf571fbfe 100644 --- a/api/server/routes/askSydney.js +++ b/api/server/routes/askSydney.js @@ -117,6 +117,10 @@ router.post('/', async (req, res) => { } catch (error) { console.log(error); // await deleteMessages({ messageId: userMessageId }); + await saveMessage({ + messageId: crypto.randomUUID(), sender: model, + conversationId, parentMessageId: userMessageId, + error: true, text: error.message}); handleError(res, error.message); } }); diff --git a/client/src/components/Main/TextChat.jsx b/client/src/components/Main/TextChat.jsx index 50b80b3b74..fe2c7b08eb 100644 --- a/client/src/components/Main/TextChat.jsx +++ b/client/src/components/Main/TextChat.jsx @@ -128,13 +128,14 @@ export default function TextChat({ messages }) { dispatch(setSubmitState(false)); }; - const errorHandler = (event, currentState) => { - const { initialResponse, messages, currentMsg, message } = currentState; + const errorHandler = (event, currentState, currentMsg) => { + const { initialResponse, messages, _currentMsg, message } = currentState; console.log('Error:', event); const errorResponse = { ...initialResponse, - text: `An error occurred. Please try again in a few moments.\n\nError message: ${event.data}`, - error: true + text: `${event.data}`, + error: true, + parentMessageId: currentMsg?.messageId, }; setErrorMessage(event.data); dispatch(setSubmitState(false)); @@ -264,7 +265,7 @@ export default function TextChat({ messages }) { events.onerror = function (e) { console.log('error in opening conn.'); events.close(); - errorHandler(e, currentState); + errorHandler(e, currentState, currentMsg); }; events.stream(); @@ -306,6 +307,7 @@ export default function TextChat({ messages }) { const changeHandler = (e) => { const { value } = e.target; + console.log(value) if (isSubmitting && (value === '' || value === '\n')) { return; } diff --git a/client/src/components/Messages/Message.jsx b/client/src/components/Messages/Message.jsx index 4f8a266891..3d5c576059 100644 --- a/client/src/components/Messages/Message.jsx +++ b/client/src/components/Messages/Message.jsx @@ -166,7 +166,11 @@ export default function Message({ // this is not a real messageId, it is used as placeholder before real messageId returned const fakeMessageId = crypto.randomUUID(); const isCustomModel = model === 'chatgptCustom' || !initial[model]; - const currentMsg = { ...message, sender: 'User', text: text.trim(), current: true, isCreatedByUser: true, messageId: fakeMessageId }; + const currentMsg = { + sender: 'User', text: text.trim(), current: true, isCreatedByUser: true, + parentMessageId: message?.parentMessageId, + conversationId: message?.conversationId, + messageId: fakeMessageId }; const sender = model === 'chatgptCustom' ? chatGptLabel : model; const initialResponse = { sender, text: '', parentMessageId: fakeMessageId, submitting: true }; @@ -217,7 +221,7 @@ export default function Message({ {error ? (
- {text} + {`An error occurred. Please try again in a few moments.\n\nError message: ${text}`}
) :