🌿 fix: Message Route Improvements pt. 2 (#3379)

* 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
This commit is contained in:
Danny Avila 2024-07-18 13:56:19 -04:00 committed by GitHub
parent 1acd47a0f6
commit f6125ccd59
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 61 additions and 15 deletions

View file

@ -612,12 +612,16 @@ class BaseClient {
throw new Error('User mismatch.');
}
const savedMessage = await saveMessage(this.options.req, {
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 };

View file

@ -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') {

View file

@ -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<TMessage>} 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;
}

View file

@ -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) {

View file

@ -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();

View file

@ -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) {

View file

@ -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, {

View file

@ -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' });
}

View file

@ -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();
}

View file

@ -681,6 +681,8 @@ export enum Time {
TEN_MINUTES = 600000,
FIVE_MINUTES = 300000,
TWO_MINUTES = 120000,
ONE_MINUTE = 60000,
THIRTY_SECONDS = 30000,
}
/**