feat: save error message into database.

This commit is contained in:
Wentao Lyu 2023-03-14 03:38:47 +08:00
parent d9e5464b3b
commit 0fa19bb6ad
6 changed files with 37 additions and 10 deletions

View file

@ -36,20 +36,25 @@ const messageSchema = mongoose.Schema({
type: Boolean, type: Boolean,
required: true, required: true,
default: false default: false
} },
error: {
type: Boolean,
default: false
},
}, { timestamps: true }); }, { timestamps: true });
const Message = mongoose.models.Message || mongoose.model('Message', messageSchema); const Message = mongoose.models.Message || mongoose.model('Message', messageSchema);
module.exports = { module.exports = {
saveMessage: async ({ messageId, conversationId, parentMessageId, sender, text, isCreatedByUser=false }) => { saveMessage: async ({ messageId, conversationId, parentMessageId, sender, text, isCreatedByUser=false, error }) => {
try { try {
await Message.findOneAndUpdate({ messageId }, { await Message.findOneAndUpdate({ messageId }, {
conversationId, conversationId,
parentMessageId, parentMessageId,
sender, sender,
text, text,
isCreatedByUser isCreatedByUser,
error
}, { upsert: true, new: true }); }, { upsert: true, new: true });
return { messageId, conversationId, parentMessageId, sender, text, isCreatedByUser }; return { messageId, conversationId, parentMessageId, sender, text, isCreatedByUser };
} catch (error) { } catch (error) {

View file

@ -131,6 +131,10 @@ router.post('/', async (req, res) => {
gptResponse.text.toLowerCase().includes('no response') || gptResponse.text.toLowerCase().includes('no response') ||
gptResponse.text.toLowerCase().includes('no answer') 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'); return handleError(res, 'Prompt empty or too short');
} }
@ -165,6 +169,10 @@ router.post('/', async (req, res) => {
} catch (error) { } catch (error) {
console.log(error); console.log(error);
// await deleteMessages({ messageId: userMessageId }); // await deleteMessages({ messageId: userMessageId });
await saveMessage({
messageId: crypto.randomUUID(), sender: model,
conversationId, parentMessageId: userMessageId,
error: true, text: error.message});
handleError(res, error.message); handleError(res, error.message);
} }
}); });

View file

@ -107,6 +107,10 @@ router.post('/', async (req, res) => {
} catch (error) { } catch (error) {
console.log(error); console.log(error);
// await deleteMessages({ messageId: userMessageId }); // await deleteMessages({ messageId: userMessageId });
await saveMessage({
messageId: crypto.randomUUID(), sender: model,
conversationId, parentMessageId: userMessageId,
error: true, text: error.message});
handleError(res, error.message); handleError(res, error.message);
} }
}); });

View file

@ -117,6 +117,10 @@ router.post('/', async (req, res) => {
} catch (error) { } catch (error) {
console.log(error); console.log(error);
// await deleteMessages({ messageId: userMessageId }); // await deleteMessages({ messageId: userMessageId });
await saveMessage({
messageId: crypto.randomUUID(), sender: model,
conversationId, parentMessageId: userMessageId,
error: true, text: error.message});
handleError(res, error.message); handleError(res, error.message);
} }
}); });

View file

@ -128,13 +128,14 @@ export default function TextChat({ messages }) {
dispatch(setSubmitState(false)); dispatch(setSubmitState(false));
}; };
const errorHandler = (event, currentState) => { const errorHandler = (event, currentState, currentMsg) => {
const { initialResponse, messages, currentMsg, message } = currentState; const { initialResponse, messages, _currentMsg, message } = currentState;
console.log('Error:', event); console.log('Error:', event);
const errorResponse = { const errorResponse = {
...initialResponse, ...initialResponse,
text: `An error occurred. Please try again in a few moments.\n\nError message: ${event.data}`, text: `${event.data}`,
error: true error: true,
parentMessageId: currentMsg?.messageId,
}; };
setErrorMessage(event.data); setErrorMessage(event.data);
dispatch(setSubmitState(false)); dispatch(setSubmitState(false));
@ -264,7 +265,7 @@ export default function TextChat({ messages }) {
events.onerror = function (e) { events.onerror = function (e) {
console.log('error in opening conn.'); console.log('error in opening conn.');
events.close(); events.close();
errorHandler(e, currentState); errorHandler(e, currentState, currentMsg);
}; };
events.stream(); events.stream();
@ -306,6 +307,7 @@ export default function TextChat({ messages }) {
const changeHandler = (e) => { const changeHandler = (e) => {
const { value } = e.target; const { value } = e.target;
console.log(value)
if (isSubmitting && (value === '' || value === '\n')) { if (isSubmitting && (value === '' || value === '\n')) {
return; return;
} }

View file

@ -166,7 +166,11 @@ export default function Message({
// this is not a real messageId, it is used as placeholder before real messageId returned // this is not a real messageId, it is used as placeholder before real messageId returned
const fakeMessageId = crypto.randomUUID(); const fakeMessageId = crypto.randomUUID();
const isCustomModel = model === 'chatgptCustom' || !initial[model]; 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 sender = model === 'chatgptCustom' ? chatGptLabel : model;
const initialResponse = { sender, text: '', parentMessageId: fakeMessageId, submitting: true }; const initialResponse = { sender, text: '', parentMessageId: fakeMessageId, submitting: true };
@ -217,7 +221,7 @@ export default function Message({
{error ? ( {error ? (
<div className="flex flex min-h-[20px] flex-col flex-grow items-start gap-4 gap-2 whitespace-pre-wrap text-red-500"> <div className="flex flex min-h-[20px] flex-col flex-grow items-start gap-4 gap-2 whitespace-pre-wrap text-red-500">
<div className="rounded-md border border-red-500 bg-red-500/10 py-2 px-3 text-sm text-gray-600 dark:text-gray-100"> <div className="rounded-md border border-red-500 bg-red-500/10 py-2 px-3 text-sm text-gray-600 dark:text-gray-100">
{text} {`An error occurred. Please try again in a few moments.\n\nError message: ${text}`}
</div> </div>
</div> </div>
) : ) :