From f6125ccd59fa9495be77cc4b322b0496b5e5b0ed Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Thu, 18 Jul 2024 13:56:19 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=BF=20fix:=20Message=20Route=20Improve?= =?UTF-8?q?ments=20pt.=202=20(#3379)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: edge case with debugTraverse function in parsers.js * chore: Update error message in audio stream processing * refactor: Add ONE_MINUTE and THIRTY_SECONDS options to Time enum * fix: logging --- api/app/clients/BaseClient.js | 16 ++++++++++------ api/config/parsers.js | 8 ++++++++ api/models/Message.js | 14 ++++++++++++-- api/server/controllers/AskController.js | 10 ++++++++-- api/server/controllers/EditController.js | 6 +++++- api/server/middleware/abortMiddleware.js | 6 +++++- api/server/middleware/denyRequest.js | 6 +++++- api/server/routes/messages.js | 6 +++++- api/server/services/Files/Audio/textToSpeech.js | 2 +- packages/data-provider/src/config.ts | 2 ++ 10 files changed, 61 insertions(+), 15 deletions(-) diff --git a/api/app/clients/BaseClient.js b/api/app/clients/BaseClient.js index b09a6a5d95..0a0d8bf2d1 100644 --- a/api/app/clients/BaseClient.js +++ b/api/app/clients/BaseClient.js @@ -612,12 +612,16 @@ class BaseClient { throw new Error('User mismatch.'); } - const savedMessage = await saveMessage(this.options.req, { - ...message, - endpoint: this.options.endpoint, - unfinished: false, - user, - }); + const savedMessage = await saveMessage( + this.options.req, + { + ...message, + endpoint: this.options.endpoint, + unfinished: false, + user, + }, + { context: 'api/app/clients/BaseClient.js - saveMessageToDatabase' }, + ); if (this.skipSaveConvo) { return { message: savedMessage }; diff --git a/api/config/parsers.js b/api/config/parsers.js index 7c04a17cae..9de54c2ae9 100644 --- a/api/config/parsers.js +++ b/api/config/parsers.js @@ -109,6 +109,14 @@ const condenseArray = (item) => { * @returns {string} - The formatted log message. */ const debugTraverse = winston.format.printf(({ level, message, timestamp, ...metadata }) => { + if (!message) { + return `${timestamp} ${level}`; + } + + if (!message?.trim || typeof message !== 'string') { + return `${timestamp} ${level}: ${JSON.stringify(message)}`; + } + let msg = `${timestamp} ${level}: ${truncateLongStrings(message?.trim(), 150)}`; try { if (level !== 'debug') { diff --git a/api/models/Message.js b/api/models/Message.js index 76a566d9f9..838d20f4c6 100644 --- a/api/models/Message.js +++ b/api/models/Message.js @@ -29,10 +29,12 @@ const idSchema = z.string().uuid(); * @param {string} [params.plugin] - Plugin associated with the message. * @param {string[]} [params.plugins] - An array of plugins associated with the message. * @param {string} [params.model] - The model used to generate the message. + * @param {Object} [metadata] - Additional metadata for this operation + * @param {string} [metadata.context] - The context of the operation * @returns {Promise} The updated or newly inserted message document. * @throws {Error} If there is an error in saving the message. */ -async function saveMessage(req, params) { +async function saveMessage(req, params, metadata) { try { if (!req || !req.user || !req.user.id) { throw new Error('User not authenticated'); @@ -61,8 +63,16 @@ async function saveMessage(req, params) { const validConvoId = idSchema.safeParse(conversationId); if (!validConvoId.success) { + if (metadata && metadata?.context) { + logger.info(`\`saveMessage\` context: ${metadata.context}`); + } + logger.warn(`Invalid conversation ID: ${conversationId}`); - logger.info(params); + logger.info(`Invalid conversation ID Params: + +${JSON.stringify(params, null, 2)} + +`); return; } diff --git a/api/server/controllers/AskController.js b/api/server/controllers/AskController.js index 674c22a834..ce6e0fb172 100644 --- a/api/server/controllers/AskController.js +++ b/api/server/controllers/AskController.js @@ -150,11 +150,17 @@ const AskController = async (req, res, next, initializeClient, addTitle) => { }); res.end(); - await saveMessage(req, { ...response, user }); + await saveMessage( + req, + { ...response, user }, + { context: 'api/server/controllers/AskController.js - response end' }, + ); } if (!client.skipSaveUserMessage) { - await saveMessage(req, userMessage); + await saveMessage(req, userMessage, { + context: 'api/server/controllers/AskController.js - don\'t skip saving user message', + }); } if (addTitle && parentMessageId === Constants.NO_PARENT && newConvo) { diff --git a/api/server/controllers/EditController.js b/api/server/controllers/EditController.js index e8be7f3e7a..b3b94fcebb 100644 --- a/api/server/controllers/EditController.js +++ b/api/server/controllers/EditController.js @@ -145,7 +145,11 @@ const EditController = async (req, res, next, initializeClient) => { }); res.end(); - await saveMessage(req, { ...response, user }); + await saveMessage( + req, + { ...response, user }, + { context: 'api/server/controllers/EditController.js - response end' }, + ); } } catch (error) { const partialText = getPartialText(); diff --git a/api/server/middleware/abortMiddleware.js b/api/server/middleware/abortMiddleware.js index a8ef269c9f..71af96c532 100644 --- a/api/server/middleware/abortMiddleware.js +++ b/api/server/middleware/abortMiddleware.js @@ -119,7 +119,11 @@ const createAbortController = (req, res, getAbortData, getReqData) => { { promptTokens, completionTokens }, ); - saveMessage(req, { ...responseMessage, user }); + saveMessage( + req, + { ...responseMessage, user }, + { context: 'api/server/middleware/abortMiddleware.js' }, + ); let conversation; if (userMessagePromise) { diff --git a/api/server/middleware/denyRequest.js b/api/server/middleware/denyRequest.js index 8e89bccee0..62efb1aeaf 100644 --- a/api/server/middleware/denyRequest.js +++ b/api/server/middleware/denyRequest.js @@ -41,7 +41,11 @@ const denyRequest = async (req, res, errorMessage) => { const shouldSaveMessage = _convoId && parentMessageId && parentMessageId !== Constants.NO_PARENT; if (shouldSaveMessage) { - await saveMessage(req, { ...userMessage, user: req.user.id }); + await saveMessage( + req, + { ...userMessage, user: req.user.id }, + { context: `api/server/middleware/denyRequest.js - ${responseText}` }, + ); } return await sendError(req, res, { diff --git a/api/server/routes/messages.js b/api/server/routes/messages.js index 99c098e9ed..cfc189af63 100644 --- a/api/server/routes/messages.js +++ b/api/server/routes/messages.js @@ -22,7 +22,11 @@ router.get('/:conversationId', validateMessageReq, async (req, res) => { router.post('/:conversationId', validateMessageReq, async (req, res) => { try { const message = req.body; - const savedMessage = await saveMessage(req, { ...message, user: req.user.id }); + const savedMessage = await saveMessage( + req, + { ...message, user: req.user.id }, + { context: 'POST /api/messages/:conversationId' }, + ); if (!savedMessage) { return res.status(400).json({ error: 'Message not saved' }); } diff --git a/api/server/services/Files/Audio/textToSpeech.js b/api/server/services/Files/Audio/textToSpeech.js index d5d0fc41be..2d04a75236 100644 --- a/api/server/services/Files/Audio/textToSpeech.js +++ b/api/server/services/Files/Audio/textToSpeech.js @@ -442,7 +442,7 @@ async function streamAudio(req, res) { break; } } catch (innerError) { - logger.error('Error processing update:', update, innerError); + logger.error('Error processing audio stream update:', update, innerError); if (!res.headersSent) { res.status(500).end(); } diff --git a/packages/data-provider/src/config.ts b/packages/data-provider/src/config.ts index 1f149aa638..cacfdd7b0b 100644 --- a/packages/data-provider/src/config.ts +++ b/packages/data-provider/src/config.ts @@ -681,6 +681,8 @@ export enum Time { TEN_MINUTES = 600000, FIVE_MINUTES = 300000, TWO_MINUTES = 120000, + ONE_MINUTE = 60000, + THIRTY_SECONDS = 30000, } /**