mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-01-05 01:58:50 +01:00
refactor(api): Central Logging 📜 (#1348)
* WIP: initial logging changes add several transports in ~/config/winston omit messages in logs, truncate long strings add short blurb in dotenv for debug logging GoogleClient: using logger OpenAIClient: using logger, handleOpenAIErrors Adding typedef for payload message bumped winston and using winston-daily-rotate-file moved config for server paths to ~/config dir Added `DEBUG_LOGGING=true` to .env.example * WIP: Refactor logging statements in code * WIP: Refactor logging statements and import configurations * WIP: Refactor logging statements and import configurations * refactor: broadcast Redis initialization message with `info` not `debug` * refactor: complete Refactor logging statements and import configurations * chore: delete unused tools * fix: circular dependencies due to accessing logger * refactor(handleText): handle booleans and write tests * refactor: redact sensitive values, better formatting * chore: improve log formatting, avoid passing strings to 2nd arg * fix(ci): fix jest tests due to logger changes * refactor(getAvailablePluginsController): cache plugins as they are static and avoids async addOpenAPISpecs call every time * chore: update docs * chore: update docs * chore: create separate meiliSync logger, clean up logs to avoid being unnecessarily verbose * chore: spread objects where they are commonly logged to allow string truncation * chore: improve error log formatting
This commit is contained in:
parent
49571ac635
commit
ea1dd59ef4
115 changed files with 1271 additions and 1001 deletions
|
|
@ -1,7 +1,8 @@
|
|||
const { getResponseSender } = require('librechat-data-provider');
|
||||
const { sendMessage, createOnProgress } = require('~/server/utils');
|
||||
const { saveMessage, getConvoTitle, getConvo } = require('~/models');
|
||||
const { getResponseSender } = require('librechat-data-provider');
|
||||
const { createAbortController, handleAbortError } = require('~/server/middleware');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const AskController = async (req, res, next, initializeClient) => {
|
||||
let {
|
||||
|
|
@ -11,8 +12,7 @@ const AskController = async (req, res, next, initializeClient) => {
|
|||
parentMessageId = null,
|
||||
overrideParentMessageId = null,
|
||||
} = req.body;
|
||||
console.log('ask log');
|
||||
console.dir({ text, conversationId, endpointOption }, { depth: null });
|
||||
logger.debug('[AskController]', { text, conversationId, ...endpointOption });
|
||||
let metadata;
|
||||
let userMessage;
|
||||
let promptTokens;
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
const crypto = require('crypto');
|
||||
const cookies = require('cookie');
|
||||
const jwt = require('jsonwebtoken');
|
||||
const { Session, User } = require('../../models');
|
||||
const { Session, User } = require('~/models');
|
||||
const {
|
||||
registerUser,
|
||||
requestPasswordReset,
|
||||
resetPassword,
|
||||
setAuthTokens,
|
||||
} = require('../services/AuthService');
|
||||
requestPasswordReset,
|
||||
} = require('~/server/services/AuthService');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const registrationController = async (req, res) => {
|
||||
try {
|
||||
|
|
@ -27,7 +28,7 @@ const registrationController = async (req, res) => {
|
|||
res.status(status).send({ message });
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
logger.error('[registrationController]', err);
|
||||
return res.status(500).json({ message: err.message });
|
||||
}
|
||||
};
|
||||
|
|
@ -45,7 +46,7 @@ const resetPasswordRequestController = async (req, res) => {
|
|||
return res.status(200).json(resetService);
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
logger.error('[resetPasswordRequestController]', e);
|
||||
return res.status(400).json({ message: e.message });
|
||||
}
|
||||
};
|
||||
|
|
@ -63,7 +64,7 @@ const resetPasswordController = async (req, res) => {
|
|||
return res.status(200).json(resetPasswordService);
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
logger.error('[resetPasswordController]', e);
|
||||
return res.status(400).json({ message: e.message });
|
||||
}
|
||||
};
|
||||
|
|
@ -108,8 +109,7 @@ const refreshController = async (req, res) => {
|
|||
res.status(401).send('Refresh token expired or not found for this user');
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Refresh token error', refreshToken);
|
||||
console.error(err);
|
||||
logger.error(`[refreshController] Refresh token: ${refreshToken}`, err);
|
||||
res.status(403).send('Invalid refresh token');
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
const { getResponseSender } = require('librechat-data-provider');
|
||||
const { sendMessage, createOnProgress } = require('~/server/utils');
|
||||
const { saveMessage, getConvoTitle, getConvo } = require('~/models');
|
||||
const { getResponseSender } = require('librechat-data-provider');
|
||||
const { createAbortController, handleAbortError } = require('~/server/middleware');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const EditController = async (req, res, next, initializeClient) => {
|
||||
let {
|
||||
|
|
@ -14,8 +15,13 @@ const EditController = async (req, res, next, initializeClient) => {
|
|||
parentMessageId = null,
|
||||
overrideParentMessageId = null,
|
||||
} = req.body;
|
||||
console.log('edit log');
|
||||
console.dir({ text, generation, isContinued, conversationId, endpointOption }, { depth: null });
|
||||
logger.debug('[EditController]', {
|
||||
text,
|
||||
generation,
|
||||
isContinued,
|
||||
conversationId,
|
||||
...endpointOption,
|
||||
});
|
||||
let metadata;
|
||||
let userMessage;
|
||||
let promptTokens;
|
||||
|
|
|
|||
|
|
@ -1,15 +1,17 @@
|
|||
const { logger } = require('~/config');
|
||||
|
||||
//handle duplicates
|
||||
const handleDuplicateKeyError = (err, res) => {
|
||||
logger.error('Duplicate key error:', err.keyValue);
|
||||
const field = Object.keys(err.keyValue);
|
||||
const code = 409;
|
||||
const error = `An document with that ${field} already exists.`;
|
||||
console.log('congrats you hit the duped keys error');
|
||||
res.status(code).send({ messages: error, fields: field });
|
||||
};
|
||||
|
||||
//handle validation errors
|
||||
const handleValidationError = (err, res) => {
|
||||
console.log('congrats you hit the validation middleware');
|
||||
logger.error('Validation error:', err.errors);
|
||||
let errors = Object.values(err.errors).map((el) => el.message);
|
||||
let fields = Object.values(err.errors).map((el) => el.path);
|
||||
let code = 400;
|
||||
|
|
@ -24,7 +26,6 @@ const handleValidationError = (err, res) => {
|
|||
// eslint-disable-next-line no-unused-vars
|
||||
module.exports = (err, req, res, next) => {
|
||||
try {
|
||||
console.log('congrats you hit the error middleware');
|
||||
if (err.name === 'ValidationError') {
|
||||
return (err = handleValidationError(err, res));
|
||||
}
|
||||
|
|
@ -32,6 +33,7 @@ module.exports = (err, req, res, next) => {
|
|||
return (err = handleDuplicateKeyError(err, res));
|
||||
}
|
||||
} catch (err) {
|
||||
logger.error('ErrorController => error', err);
|
||||
res.status(500).send('An unknown error occurred.');
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
const { promises: fs } = require('fs');
|
||||
const path = require('path');
|
||||
const { addOpenAPISpecs } = require('../../app/clients/tools/util/addOpenAPISpecs');
|
||||
const { promises: fs } = require('fs');
|
||||
const { addOpenAPISpecs } = require('~/app/clients/tools/util/addOpenAPISpecs');
|
||||
const { CacheKeys } = require('~/common/enums');
|
||||
const { getLogStores } = require('~/cache');
|
||||
|
||||
const filterUniquePlugins = (plugins) => {
|
||||
const seen = new Set();
|
||||
|
|
@ -27,6 +29,13 @@ const isPluginAuthenticated = (plugin) => {
|
|||
|
||||
const getAvailablePluginsController = async (req, res) => {
|
||||
try {
|
||||
const cache = getLogStores(CacheKeys.CONFIG);
|
||||
const cachedPlugins = await cache.get(CacheKeys.PLUGINS);
|
||||
if (cachedPlugins) {
|
||||
res.status(200).json(cachedPlugins);
|
||||
return;
|
||||
}
|
||||
|
||||
const manifestFile = await fs.readFile(
|
||||
path.join(__dirname, '..', '..', 'app', 'clients', 'tools', 'manifest.json'),
|
||||
'utf8',
|
||||
|
|
@ -42,6 +51,7 @@ const getAvailablePluginsController = async (req, res) => {
|
|||
}
|
||||
});
|
||||
const plugins = await addOpenAPISpecs(authenticatedPlugins);
|
||||
await cache.set(CacheKeys.PLUGINS, plugins);
|
||||
res.status(200).json(plugins);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
const { updateUserPluginsService } = require('../services/UserService');
|
||||
const { updateUserPluginAuth, deleteUserPluginAuth } = require('../services/PluginService');
|
||||
const { updateUserPluginsService } = require('~/server/services/UserService');
|
||||
const { updateUserPluginAuth, deleteUserPluginAuth } = require('~/server/services/PluginService');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const getUserController = async (req, res) => {
|
||||
res.status(200).send(req.user);
|
||||
|
|
@ -13,7 +14,7 @@ const updateUserPluginsController = async (req, res) => {
|
|||
const userPluginsService = await updateUserPluginsService(user, pluginKey, action);
|
||||
|
||||
if (userPluginsService instanceof Error) {
|
||||
console.log(userPluginsService);
|
||||
logger.error('[userPluginsService]', userPluginsService);
|
||||
const { status, message } = userPluginsService;
|
||||
res.status(status).send({ message });
|
||||
}
|
||||
|
|
@ -24,7 +25,7 @@ const updateUserPluginsController = async (req, res) => {
|
|||
for (let i = 0; i < keys.length; i++) {
|
||||
authService = await updateUserPluginAuth(user.id, keys[i], pluginKey, values[i]);
|
||||
if (authService instanceof Error) {
|
||||
console.log(authService);
|
||||
logger.error('[authService]', authService);
|
||||
const { status, message } = authService;
|
||||
res.status(status).send({ message });
|
||||
}
|
||||
|
|
@ -34,7 +35,7 @@ const updateUserPluginsController = async (req, res) => {
|
|||
for (let i = 0; i < keys.length; i++) {
|
||||
authService = await deleteUserPluginAuth(user.id, keys[i]);
|
||||
if (authService instanceof Error) {
|
||||
console.log(authService);
|
||||
logger.error('[authService]', authService);
|
||||
const { status, message } = authService;
|
||||
res.status(status).send({ message });
|
||||
}
|
||||
|
|
@ -44,7 +45,7 @@ const updateUserPluginsController = async (req, res) => {
|
|||
|
||||
res.status(200).send();
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
logger.error('[updateUserPluginsController]', err);
|
||||
res.status(500).json({ message: err.message });
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
const User = require('../../../models/User');
|
||||
const { setAuthTokens } = require('../../services/AuthService');
|
||||
const User = require('~/models/User');
|
||||
const { setAuthTokens } = require('~/server/services/AuthService');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const loginController = async (req, res) => {
|
||||
try {
|
||||
|
|
@ -15,7 +16,7 @@ const loginController = async (req, res) => {
|
|||
|
||||
return res.status(200).send({ token, user });
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
logger.error('[loginController]', err);
|
||||
}
|
||||
|
||||
// Generic error messages are safer
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
const { logoutUser } = require('../../services/AuthService');
|
||||
const cookies = require('cookie');
|
||||
const { logoutUser } = require('~/server/services/AuthService');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const logoutController = async (req, res) => {
|
||||
const refreshToken = req.headers.cookie ? cookies.parse(req.headers.cookie).refreshToken : null;
|
||||
|
|
@ -9,7 +10,7 @@ const logoutController = async (req, res) => {
|
|||
res.clearCookie('refreshToken');
|
||||
return res.status(status).send({ message });
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
logger.error('[logoutController]', err);
|
||||
return res.status(500).json({ message: err.message });
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -6,8 +6,10 @@ const passport = require('passport');
|
|||
const mongoSanitize = require('express-mongo-sanitize');
|
||||
const errorController = require('./controllers/ErrorController');
|
||||
const configureSocialLogins = require('./socialLogins');
|
||||
const { connectDb, indexSync } = require('../lib/db');
|
||||
const config = require('../config');
|
||||
const { connectDb, indexSync } = require('~/lib/db');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const paths = require('~/config/paths');
|
||||
const routes = require('./routes');
|
||||
|
||||
const { PORT, HOST, ALLOW_SOCIAL_LOGIN } = process.env ?? {};
|
||||
|
|
@ -15,15 +17,15 @@ const { PORT, HOST, ALLOW_SOCIAL_LOGIN } = process.env ?? {};
|
|||
const port = Number(PORT) || 3080;
|
||||
const host = HOST || 'localhost';
|
||||
const projectPath = path.join(__dirname, '..', '..', 'client');
|
||||
const { jwtLogin, passportLogin } = require('../strategies');
|
||||
const { jwtLogin, passportLogin } = require('~/strategies');
|
||||
|
||||
const startServer = async () => {
|
||||
await connectDb();
|
||||
console.log('Connected to MongoDB');
|
||||
logger.info('Connected to MongoDB');
|
||||
await indexSync();
|
||||
|
||||
const app = express();
|
||||
app.locals.config = config;
|
||||
app.locals.config = paths;
|
||||
|
||||
// Middleware
|
||||
app.use(errorController);
|
||||
|
|
@ -77,11 +79,11 @@ const startServer = async () => {
|
|||
|
||||
app.listen(port, host, () => {
|
||||
if (host == '0.0.0.0') {
|
||||
console.log(
|
||||
logger.info(
|
||||
`Server listening on all interfaces at port ${port}. Use http://localhost:${port} to access it`,
|
||||
);
|
||||
} else {
|
||||
console.log(`Server listening at http://${host == '0.0.0.0' ? 'localhost' : host}:${port}`);
|
||||
logger.info(`Server listening at http://${host == '0.0.0.0' ? 'localhost' : host}:${port}`);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
|
@ -91,13 +93,12 @@ startServer();
|
|||
let messageCount = 0;
|
||||
process.on('uncaughtException', (err) => {
|
||||
if (!err.message.includes('fetch failed')) {
|
||||
console.error('There was an uncaught error:');
|
||||
console.error(err);
|
||||
logger.error('There was an uncaught error:', err);
|
||||
}
|
||||
|
||||
if (err.message.includes('fetch failed')) {
|
||||
if (messageCount === 0) {
|
||||
console.error('Meilisearch error, search will be disabled');
|
||||
logger.warn('Meilisearch error, search will be disabled');
|
||||
messageCount++;
|
||||
}
|
||||
|
||||
|
|
@ -105,7 +106,7 @@ process.on('uncaughtException', (err) => {
|
|||
}
|
||||
|
||||
if (err.message.includes('OpenAIError') || err.message.includes('ChatCompletionMessage')) {
|
||||
console.error(
|
||||
logger.error(
|
||||
'\n\nAn Uncaught `OpenAIError` error may be due to your reverse-proxy setup or stream configuration, or a bug in the `openai` node package.',
|
||||
);
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ const { saveMessage, getConvo, getConvoTitle } = require('~/models');
|
|||
const clearPendingReq = require('~/cache/clearPendingReq');
|
||||
const abortControllers = require('./abortControllers');
|
||||
const spendTokens = require('~/models/spendTokens');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
async function abortMessage(req, res) {
|
||||
const { abortKey } = req.body;
|
||||
|
|
@ -13,7 +14,7 @@ async function abortMessage(req, res) {
|
|||
|
||||
const { abortController } = abortControllers.get(abortKey);
|
||||
const ret = await abortController.abortCompletion();
|
||||
console.log('Aborted request', abortKey);
|
||||
logger.debug('[abortMessage] Aborted request', { abortKey });
|
||||
abortControllers.delete(abortKey);
|
||||
res.send(JSON.stringify(ret));
|
||||
}
|
||||
|
|
@ -26,7 +27,7 @@ const handleAbort = () => {
|
|||
}
|
||||
return await abortMessage(req, res);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
logger.error('[abortMessage] handleAbort error', err);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
|
@ -82,7 +83,7 @@ const createAbortController = (req, res, getAbortData) => {
|
|||
};
|
||||
|
||||
const handleAbortError = async (res, req, error, data) => {
|
||||
console.error(error);
|
||||
logger.error('[handleAbortError] response error and aborting request', error);
|
||||
const { sender, conversationId, messageId, parentMessageId, partialText } = data;
|
||||
|
||||
const respondWithError = async () => {
|
||||
|
|
@ -110,7 +111,7 @@ const handleAbortError = async (res, req, error, data) => {
|
|||
try {
|
||||
return await abortMessage(req, res);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
logger.error('[handleAbortError] error while trying to abort message', err);
|
||||
return respondWithError();
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
const Keyv = require('keyv');
|
||||
const { KeyvFile } = require('keyv-file');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const addToCache = async ({ endpoint, endpointOption, userMessage, responseMessage }) => {
|
||||
try {
|
||||
|
|
@ -57,7 +58,7 @@ const addToCache = async ({ endpoint, endpointOption, userMessage, responseMessa
|
|||
|
||||
await conversationsCache.set(conversationId, conversation);
|
||||
} catch (error) {
|
||||
console.error('Trouble adding to cache', error);
|
||||
logger.error('[addToCache] Error adding conversation to cache', error);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
const express = require('express');
|
||||
const crypto = require('crypto');
|
||||
const express = require('express');
|
||||
const { saveMessage, getConvoTitle, saveConvo, getConvo } = require('~/models');
|
||||
const { handleError, sendMessage, createOnProgress, handleText } = require('~/server/utils');
|
||||
const { setHeaders } = require('~/server/middleware');
|
||||
const { browserClient } = require('~/app/');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const router = express.Router();
|
||||
const { browserClient } = require('../../../app/');
|
||||
const { saveMessage, getConvoTitle, saveConvo, getConvo } = require('../../../models');
|
||||
const { handleError, sendMessage, createOnProgress, handleText } = require('../../utils');
|
||||
const { setHeaders } = require('../../middleware');
|
||||
|
||||
router.post('/', setHeaders, async (req, res) => {
|
||||
const {
|
||||
|
|
@ -41,10 +43,10 @@ router.post('/', setHeaders, async (req, res) => {
|
|||
key: req.body?.key ?? null,
|
||||
};
|
||||
|
||||
console.log('ask log', {
|
||||
logger.debug('[/ask/chatGPTBrowser]', {
|
||||
userMessage,
|
||||
endpointOption,
|
||||
conversationId,
|
||||
...endpointOption,
|
||||
});
|
||||
|
||||
if (!overrideParentMessageId) {
|
||||
|
|
@ -136,7 +138,7 @@ const ask = async ({
|
|||
},
|
||||
});
|
||||
|
||||
console.log('CLIENT RESPONSE', response);
|
||||
logger.debug('[/ask/chatGPTBrowser]', response);
|
||||
|
||||
const newConversationId = response.conversationId || conversationId;
|
||||
const newUserMassageId = response.parentMessageId || userMessageId;
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
const express = require('express');
|
||||
const crypto = require('crypto');
|
||||
const { handleError, sendMessage, createOnProgress, handleText } = require('~/server/utils');
|
||||
const { saveMessage, getConvoTitle, saveConvo, getConvo } = require('~/models');
|
||||
const { setHeaders } = require('~/server/middleware');
|
||||
const { titleConvoBing, askBing } = require('~/app');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const router = express.Router();
|
||||
const { titleConvoBing, askBing } = require('../../../app');
|
||||
const { saveMessage, getConvoTitle, saveConvo, getConvo } = require('../../../models');
|
||||
const { handleError, sendMessage, createOnProgress, handleText } = require('../../utils');
|
||||
const { setHeaders } = require('../../middleware');
|
||||
|
||||
router.post('/', setHeaders, async (req, res) => {
|
||||
const {
|
||||
|
|
@ -60,7 +62,7 @@ router.post('/', setHeaders, async (req, res) => {
|
|||
};
|
||||
}
|
||||
|
||||
console.log('ask log', {
|
||||
logger.debug('[/ask/bingAI] ask log', {
|
||||
userMessage,
|
||||
endpointOption,
|
||||
conversationId,
|
||||
|
|
@ -153,10 +155,10 @@ const ask = async ({
|
|||
abortController,
|
||||
});
|
||||
|
||||
console.log('BING RESPONSE', response);
|
||||
logger.debug('[/ask/bingAI] BING RESPONSE', response);
|
||||
|
||||
if (response.details && response.details.scores) {
|
||||
console.log('SCORES', response.details.scores);
|
||||
logger.debug('[/ask/bingAI] SCORES', response.details.scores);
|
||||
}
|
||||
|
||||
const newConversationId = endpointOption?.jailbreak
|
||||
|
|
@ -250,7 +252,7 @@ const ask = async ({
|
|||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
logger.error('[/ask/bingAI] Error handling BingAI response', error);
|
||||
const partialText = getPartialText();
|
||||
if (partialText?.length > 2) {
|
||||
const responseMessage = {
|
||||
|
|
@ -276,7 +278,7 @@ const ask = async ({
|
|||
responseMessage: responseMessage,
|
||||
};
|
||||
} else {
|
||||
console.log(error);
|
||||
logger.error('[/ask/bingAI] Error handling BingAI response', error);
|
||||
const errorMessage = {
|
||||
messageId: responseMessageId,
|
||||
sender: model,
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ const {
|
|||
validateEndpoint,
|
||||
buildEndpointOption,
|
||||
} = require('~/server/middleware');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
router.post('/abort', handleAbort());
|
||||
|
||||
|
|
@ -25,8 +26,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
|||
parentMessageId = null,
|
||||
overrideParentMessageId = null,
|
||||
} = req.body;
|
||||
console.log('ask log');
|
||||
console.dir({ text, conversationId, endpointOption }, { depth: null });
|
||||
logger.debug('[/ask/gptPlugins]', { text, conversationId, ...endpointOption });
|
||||
let metadata;
|
||||
let userMessage;
|
||||
let promptTokens;
|
||||
|
|
@ -189,8 +189,8 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
|||
response = { ...response, ...metadata };
|
||||
}
|
||||
|
||||
console.log('CLIENT RESPONSE');
|
||||
console.dir(response, { depth: null });
|
||||
logger.debug('[/ask/gptPlugins]', response);
|
||||
|
||||
response.plugins = plugins.map((p) => ({ ...p, loading: false }));
|
||||
await saveMessage({ ...response, user });
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ const {
|
|||
validateEndpoint,
|
||||
buildEndpointOption,
|
||||
} = require('~/server/middleware');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
router.post('/abort', handleAbort());
|
||||
|
||||
|
|
@ -23,8 +24,9 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
|||
parentMessageId = null,
|
||||
overrideParentMessageId = null,
|
||||
} = req.body;
|
||||
console.log('ask log');
|
||||
console.dir({ text, conversationId, endpointOption }, { depth: null });
|
||||
|
||||
logger.debug('[/ask/openAI]', { text, conversationId, ...endpointOption });
|
||||
|
||||
let metadata;
|
||||
let userMessage;
|
||||
let promptTokens;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
const OpenAI = require('openai');
|
||||
const express = require('express');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
/**
|
||||
|
|
@ -13,7 +15,7 @@ router.post('/', async (req, res) => {
|
|||
const openai = new OpenAI(process.env.OPENAI_API_KEY);
|
||||
const assistantData = req.body;
|
||||
const assistant = await openai.beta.assistants.create(assistantData);
|
||||
console.log(assistant);
|
||||
logger.debug('/assistants/', assistant);
|
||||
res.status(201).json(assistant);
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
const crypto = require('crypto');
|
||||
const OpenAI = require('openai');
|
||||
const { logger } = require('~/config');
|
||||
const { sendMessage } = require('../../utils');
|
||||
const { initThread, createRun, handleRun } = require('../../services/AssistantService');
|
||||
const express = require('express');
|
||||
|
|
@ -23,7 +24,7 @@ const {
|
|||
*/
|
||||
router.post('/', setHeaders, async (req, res) => {
|
||||
try {
|
||||
console.log(req.body);
|
||||
logger.debug('[/assistants/chat/] req.body', req.body);
|
||||
// test message:
|
||||
// How many polls of 500 ms intervals are there in 18 seconds?
|
||||
|
||||
|
|
@ -100,7 +101,7 @@ router.post('/', setHeaders, async (req, res) => {
|
|||
res.end();
|
||||
} catch (error) {
|
||||
// res.status(500).json({ error: error.message });
|
||||
console.error(error);
|
||||
logger.error('[/assistants/chat/]', error);
|
||||
res.end();
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
const express = require('express');
|
||||
const { isEnabled } = require('~/server/utils');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const router = express.Router();
|
||||
const { isEnabled } = require('../utils');
|
||||
const emailLoginEnabled =
|
||||
process.env.ALLOW_EMAIL_LOGIN === undefined || isEnabled(process.env.ALLOW_EMAIL_LOGIN);
|
||||
|
||||
|
|
@ -38,7 +40,7 @@ router.get('/', async function (req, res) {
|
|||
|
||||
return res.status(200).send(payload);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
logger.error('Error in startup config', err);
|
||||
return res.status(500).send({ error: err.message });
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const { getConvo, saveConvo } = require('../../models');
|
||||
const { getConvosByPage, deleteConvos } = require('../../models/Conversation');
|
||||
const requireJwtAuth = require('../middleware/requireJwtAuth');
|
||||
const { getConvosByPage, deleteConvos } = require('~/models/Conversation');
|
||||
const requireJwtAuth = require('~/server/middleware/requireJwtAuth');
|
||||
const { getConvo, saveConvo } = require('~/models');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
router.use(requireJwtAuth);
|
||||
|
||||
|
|
@ -30,7 +31,7 @@ router.post('/clear', async (req, res) => {
|
|||
}
|
||||
|
||||
// for debugging deletion source
|
||||
// console.log('source:', source);
|
||||
// logger.debug('source:', source);
|
||||
|
||||
if (source === 'button' && !conversationId) {
|
||||
return res.status(200).send('No conversationId provided');
|
||||
|
|
@ -40,7 +41,7 @@ router.post('/clear', async (req, res) => {
|
|||
const dbResponse = await deleteConvos(req.user.id, filter);
|
||||
res.status(201).send(dbResponse);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
logger.error('Error clearing conversations', error);
|
||||
res.status(500).send(error);
|
||||
}
|
||||
});
|
||||
|
|
@ -52,7 +53,7 @@ router.post('/update', async (req, res) => {
|
|||
const dbResponse = await saveConvo(req.user.id, update);
|
||||
res.status(201).send(dbResponse);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
logger.error('Error updating conversation', error);
|
||||
res.status(500).send(error);
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const { validateTools } = require('~/app');
|
||||
const { saveMessage, getConvoTitle, getConvo } = require('~/models');
|
||||
const { getResponseSender } = require('librechat-data-provider');
|
||||
const { saveMessage, getConvoTitle, getConvo } = require('~/models');
|
||||
const { initializeClient } = require('~/server/services/Endpoints/gptPlugins');
|
||||
const { sendMessage, createOnProgress, formatSteps, formatAction } = require('~/server/utils');
|
||||
const {
|
||||
|
|
@ -13,6 +13,7 @@ const {
|
|||
validateEndpoint,
|
||||
buildEndpointOption,
|
||||
} = require('~/server/middleware');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
router.post('/abort', handleAbort());
|
||||
|
||||
|
|
@ -27,8 +28,14 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
|||
parentMessageId = null,
|
||||
overrideParentMessageId = null,
|
||||
} = req.body;
|
||||
console.log('edit log');
|
||||
console.dir({ text, generation, isContinued, conversationId, endpointOption }, { depth: null });
|
||||
|
||||
logger.debug('[/edit/gptPlugins]', {
|
||||
text,
|
||||
generation,
|
||||
isContinued,
|
||||
conversationId,
|
||||
...endpointOption,
|
||||
});
|
||||
let metadata;
|
||||
let userMessage;
|
||||
let promptTokens;
|
||||
|
|
@ -102,7 +109,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
|||
saveMessage({ ...userMessage, user });
|
||||
}
|
||||
sendIntermediateMessage(res, { plugin });
|
||||
// console.log('PLUGIN ACTION', formattedAction);
|
||||
// logger.debug('PLUGIN ACTION', formattedAction);
|
||||
};
|
||||
|
||||
const onChainEnd = (data) => {
|
||||
|
|
@ -111,7 +118,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
|||
plugin.loading = false;
|
||||
saveMessage({ ...userMessage, user });
|
||||
sendIntermediateMessage(res, { plugin });
|
||||
// console.log('CHAIN END', plugin.outputs);
|
||||
// logger.debug('CHAIN END', plugin.outputs);
|
||||
};
|
||||
|
||||
const getAbortData = () => ({
|
||||
|
|
@ -162,8 +169,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
|||
response = { ...response, ...metadata };
|
||||
}
|
||||
|
||||
console.log('CLIENT RESPONSE');
|
||||
console.dir(response, { depth: null });
|
||||
logger.debug('[/edit/gptPlugins] CLIENT RESPONSE', response);
|
||||
response.plugin = { ...plugin, loading: false };
|
||||
await saveMessage({ ...response, user });
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ const {
|
|||
validateEndpoint,
|
||||
buildEndpointOption,
|
||||
} = require('~/server/middleware');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
router.post('/abort', handleAbort());
|
||||
|
||||
|
|
@ -26,8 +27,15 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
|||
parentMessageId = null,
|
||||
overrideParentMessageId = null,
|
||||
} = req.body;
|
||||
console.log('edit log');
|
||||
console.dir({ text, generation, isContinued, conversationId, endpointOption }, { depth: null });
|
||||
|
||||
logger.debug('[/edit/openAI]', {
|
||||
text,
|
||||
generation,
|
||||
isContinued,
|
||||
conversationId,
|
||||
...endpointOption,
|
||||
});
|
||||
|
||||
let metadata;
|
||||
let userMessage;
|
||||
let promptTokens;
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
const { z } = require('zod');
|
||||
const path = require('path');
|
||||
const fs = require('fs').promises;
|
||||
const express = require('express');
|
||||
const { deleteFiles } = require('~/models');
|
||||
const path = require('path');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
|
|
@ -55,7 +56,7 @@ router.delete('/', async (req, res) => {
|
|||
await Promise.all(promises);
|
||||
res.status(200).json({ message: 'Files deleted successfully' });
|
||||
} catch (error) {
|
||||
console.error('Error deleting files:', error);
|
||||
logger.error('[/files] Error deleting files:', error);
|
||||
res.status(400).json({ message: 'Error in request', error: error.message });
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ const fs = require('fs').promises;
|
|||
const express = require('express');
|
||||
const upload = require('./multer');
|
||||
const { localStrategy } = require('~/server/services/Files');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
|
|
@ -35,11 +36,11 @@ router.post('/', upload.single('file'), async (req, res) => {
|
|||
metadata.file_id = req.file_id;
|
||||
await localStrategy({ req, res, file, metadata });
|
||||
} catch (error) {
|
||||
console.error('Error processing file:', error);
|
||||
logger.error('[/files/images] Error processing file:', error);
|
||||
try {
|
||||
await fs.unlink(file.path);
|
||||
} catch (error) {
|
||||
console.error('Error deleting file:', error);
|
||||
logger.error('[/files/images] Error deleting file:', error);
|
||||
}
|
||||
res.status(500).json({ message: 'Error processing file' });
|
||||
}
|
||||
|
|
@ -49,7 +50,7 @@ router.post('/', upload.single('file'), async (req, res) => {
|
|||
// try {
|
||||
// // await fs.unlink(file.path);
|
||||
// } catch (error) {
|
||||
// console.error('Error deleting file:', error);
|
||||
// logger.error('[/files/images] Error deleting file:', error);
|
||||
|
||||
// }
|
||||
// }
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
const passport = require('passport');
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const { setAuthTokens } = require('../services/AuthService');
|
||||
const { loginLimiter, checkBan } = require('../middleware');
|
||||
const { setAuthTokens } = require('~/server/services/AuthService');
|
||||
const { loginLimiter, checkBan } = require('~/server/middleware');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const domains = {
|
||||
client: process.env.DOMAIN_CLIENT,
|
||||
server: process.env.DOMAIN_SERVER,
|
||||
|
|
@ -19,7 +21,7 @@ const oauthHandler = async (req, res) => {
|
|||
await setAuthTokens(req.user._id, res);
|
||||
res.redirect(domains.client);
|
||||
} catch (err) {
|
||||
console.error('Error in setting authentication tokens:', err);
|
||||
logger.error('Error in setting authentication tokens:', err);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const { getPresets, savePreset, deletePresets } = require('../../models');
|
||||
const crypto = require('crypto');
|
||||
const requireJwtAuth = require('../middleware/requireJwtAuth');
|
||||
const { getPresets, savePreset, deletePresets } = require('~/models');
|
||||
const requireJwtAuth = require('~/server/middleware/requireJwtAuth');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
router.get('/', requireJwtAuth, async (req, res) => {
|
||||
const presets = (await getPresets(req.user.id)).map((preset) => preset);
|
||||
|
|
@ -18,7 +20,7 @@ router.post('/', requireJwtAuth, async (req, res) => {
|
|||
const preset = await savePreset(req.user.id, update);
|
||||
res.status(201).send(preset);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
logger.error('[/presets] error saving preset', error);
|
||||
res.status(500).send(error);
|
||||
}
|
||||
});
|
||||
|
|
@ -31,13 +33,13 @@ router.post('/delete', requireJwtAuth, async (req, res) => {
|
|||
filter = { presetId };
|
||||
}
|
||||
|
||||
console.log('delete preset filter', filter);
|
||||
logger.debug('[/presets/delete] delete preset filter', filter);
|
||||
|
||||
try {
|
||||
const deleteCount = await deletePresets(req.user.id, filter);
|
||||
res.status(201).send(deleteCount);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
logger.error('[/presets/delete] error deleting presets', error);
|
||||
res.status(500).send(error);
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,14 +1,16 @@
|
|||
const Keyv = require('keyv');
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const { MeiliSearch } = require('meilisearch');
|
||||
const { Message } = require('../../models/Message');
|
||||
const { Conversation, getConvosQueried } = require('../../models/Conversation');
|
||||
const { reduceHits } = require('../../lib/utils/reduceHits');
|
||||
const { cleanUpPrimaryKeyValue } = require('../../lib/utils/misc');
|
||||
const requireJwtAuth = require('../middleware/requireJwtAuth');
|
||||
const keyvRedis = require('../../cache/keyvRedis');
|
||||
const { isEnabled } = require('../utils');
|
||||
const { Conversation, getConvosQueried } = require('~/models/Conversation');
|
||||
const requireJwtAuth = require('~/server/middleware/requireJwtAuth');
|
||||
const { cleanUpPrimaryKeyValue } = require('~/lib/utils/misc');
|
||||
const { reduceHits } = require('~/lib/utils/reduceHits');
|
||||
const { isEnabled } = require('~/server/utils');
|
||||
const { Message } = require('~/models/Message');
|
||||
const keyvRedis = require('~/cache/keyvRedis');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
const expiration = 60 * 1000;
|
||||
const cache = isEnabled(process.env.USE_REDIS)
|
||||
|
|
@ -31,7 +33,7 @@ router.get('/', async function (req, res) {
|
|||
const key = `${user}:search:${q}`;
|
||||
const cached = await cache.get(key);
|
||||
if (cached) {
|
||||
console.log('cache hit', key);
|
||||
logger.debug('[/search] cache hit: ' + key);
|
||||
const { pages, pageSize, messages } = cached;
|
||||
res
|
||||
.status(200)
|
||||
|
|
@ -39,7 +41,6 @@ router.get('/', async function (req, res) {
|
|||
return;
|
||||
}
|
||||
|
||||
// const message = await Message.meiliSearch(q);
|
||||
const messages = (
|
||||
await Message.meiliSearch(
|
||||
q,
|
||||
|
|
@ -61,8 +62,8 @@ router.get('/', async function (req, res) {
|
|||
const titles = (await Conversation.meiliSearch(q)).hits;
|
||||
const sortedHits = reduceHits(messages, titles);
|
||||
// debugging:
|
||||
// console.log('user:', user, 'message hits:', messages.length, 'convo hits:', titles.length);
|
||||
// console.log('sorted hits:', sortedHits.length);
|
||||
// logger.debug('user:', user, 'message hits:', messages.length, 'convo hits:', titles.length);
|
||||
// logger.debug('sorted hits:', sortedHits.length);
|
||||
const result = await getConvosQueried(user, sortedHits, pageNumber);
|
||||
|
||||
const activeMessages = [];
|
||||
|
|
@ -86,10 +87,10 @@ router.get('/', async function (req, res) {
|
|||
}
|
||||
delete result.convoMap;
|
||||
// for debugging
|
||||
// console.log(result, messages.length);
|
||||
// logger.debug(result, messages.length);
|
||||
res.status(200).send(result);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logger.error('[/search] Error while searching messages & conversations', error);
|
||||
res.status(500).send({ message: 'Error searching' });
|
||||
}
|
||||
});
|
||||
|
|
@ -114,11 +115,9 @@ router.get('/enable', async function (req, res) {
|
|||
});
|
||||
|
||||
const { status } = await client.health();
|
||||
// console.log(`Meilisearch: ${status}`);
|
||||
result = status === 'available' && !!process.env.SEARCH;
|
||||
return res.send(result);
|
||||
} catch (error) {
|
||||
// console.error(error);
|
||||
return res.send(false);
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const { countTokens } = require('../utils');
|
||||
const requireJwtAuth = require('../middleware/requireJwtAuth');
|
||||
const requireJwtAuth = require('~/server/middleware/requireJwtAuth');
|
||||
const { countTokens } = require('~/server/utils');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
router.post('/', requireJwtAuth, async (req, res) => {
|
||||
try {
|
||||
|
|
@ -9,7 +10,7 @@ router.post('/', requireJwtAuth, async (req, res) => {
|
|||
const count = await countTokens(arg?.text ?? arg);
|
||||
res.send({ count });
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
logger.error('[/tokenizer] Error counting tokens', e);
|
||||
res.status(500).send(e.message);
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
const crypto = require('crypto');
|
||||
const bcrypt = require('bcryptjs');
|
||||
const User = require('../../models/User');
|
||||
const Session = require('../../models/Session');
|
||||
const Token = require('../../models/schema/tokenSchema');
|
||||
const { registerSchema, errorsToString } = require('../../strategies/validators');
|
||||
const { sendEmail } = require('../utils');
|
||||
const { registerSchema, errorsToString } = require('~/strategies/validators');
|
||||
const Token = require('~/models/schema/tokenSchema');
|
||||
const { sendEmail } = require('~/server/utils');
|
||||
const Session = require('~/models/Session');
|
||||
const { logger } = require('~/config');
|
||||
const User = require('~/models/User');
|
||||
|
||||
const domains = {
|
||||
client: process.env.DOMAIN_CLIENT,
|
||||
server: process.env.DOMAIN_SERVER,
|
||||
|
|
@ -29,7 +31,7 @@ const logoutUser = async (userId, refreshToken) => {
|
|||
try {
|
||||
await Session.deleteOne({ _id: session._id });
|
||||
} catch (deleteErr) {
|
||||
console.error(deleteErr);
|
||||
logger.error('[logoutUser] Failed to delete session.', deleteErr);
|
||||
return { status: 500, message: 'Failed to delete session.' };
|
||||
}
|
||||
}
|
||||
|
|
@ -50,7 +52,7 @@ const registerUser = async (user) => {
|
|||
const { error } = registerSchema.safeParse(user);
|
||||
if (error) {
|
||||
const errorMessage = errorsToString(error.errors);
|
||||
console.info(
|
||||
logger.info(
|
||||
'Route: register - Validation Error',
|
||||
{ name: 'Request params:', value: user },
|
||||
{ name: 'Validation error:', value: errorMessage },
|
||||
|
|
@ -65,7 +67,7 @@ const registerUser = async (user) => {
|
|||
const existingUser = await User.findOne({ email }).lean();
|
||||
|
||||
if (existingUser) {
|
||||
console.info(
|
||||
logger.info(
|
||||
'Register User - Email in use',
|
||||
{ name: 'Request params:', value: user },
|
||||
{ name: 'Existing user:', value: existingUser },
|
||||
|
|
@ -229,7 +231,7 @@ const setAuthTokens = async (userId, res, sessionId = null) => {
|
|||
|
||||
return token;
|
||||
} catch (error) {
|
||||
console.log('Error in setting authentication tokens:', error);
|
||||
logger.error('[setAuthTokens] Error in setting authentication tokens:', error);
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
/**
|
||||
* Saves a file to a specified output path with a new filename.
|
||||
|
|
@ -24,7 +25,7 @@ async function saveFile(file, outputPath, outputFilename) {
|
|||
|
||||
return outputFilePath;
|
||||
} catch (error) {
|
||||
console.error('Error while saving the file:', error);
|
||||
logger.error('[saveFile] Error while saving the file:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,13 @@
|
|||
const HttpsProxyAgent = require('https-proxy-agent');
|
||||
const axios = require('axios');
|
||||
const Keyv = require('keyv');
|
||||
const axios = require('axios');
|
||||
const HttpsProxyAgent = require('https-proxy-agent');
|
||||
const { isEnabled } = require('~/server/utils');
|
||||
const { extractBaseURL } = require('~/utils');
|
||||
const keyvRedis = require('~/cache/keyvRedis');
|
||||
const { extractBaseURL } = require('~/utils');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
// const { getAzureCredentials, genAzureChatCompletion } = require('~/utils/');
|
||||
|
||||
const { openAIApiKey, userProvidedOpenAI } = require('./Config/EndpointService').config;
|
||||
|
||||
const modelsCache = isEnabled(process.env.USE_REDIS)
|
||||
|
|
@ -54,9 +57,9 @@ const fetchOpenAIModels = async (opts = { azure: false, plugins: false }, _model
|
|||
const res = await axios.get(`${basePath}${opts.azure ? '' : '/models'}`, payload);
|
||||
|
||||
models = res.data.data.map((item) => item.id);
|
||||
// console.log(`Fetched ${models.length} models from ${opts.azure ? 'Azure ' : ''}OpenAI API`);
|
||||
// logger.debug(`Fetched ${models.length} models from ${opts.azure ? 'Azure ' : ''}OpenAI API`);
|
||||
} catch (err) {
|
||||
console.log(`Failed to fetch models from ${opts.azure ? 'Azure ' : ''}OpenAI API`);
|
||||
logger.error(`Failed to fetch models from ${opts.azure ? 'Azure ' : ''}OpenAI API`, err);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
const PluginAuth = require('../../models/schema/pluginAuthSchema');
|
||||
const { encrypt, decrypt } = require('../utils/');
|
||||
const PluginAuth = require('~/models/schema/pluginAuthSchema');
|
||||
const { encrypt, decrypt } = require('~/server/utils/');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const getUserPluginAuthValue = async (user, authField) => {
|
||||
try {
|
||||
|
|
@ -11,7 +12,7 @@ const getUserPluginAuthValue = async (user, authField) => {
|
|||
const decryptedValue = decrypt(pluginAuth.value);
|
||||
return decryptedValue;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
logger.error('[getUserPluginAuthValue]', err);
|
||||
return err;
|
||||
}
|
||||
};
|
||||
|
|
@ -36,7 +37,7 @@ const getUserPluginAuthValue = async (user, authField) => {
|
|||
|
||||
// return pluginAuth;
|
||||
// } catch (err) {
|
||||
// console.log(err);
|
||||
// logger.error('[getUserPluginAuthValue]', err);
|
||||
// return err;
|
||||
// }
|
||||
// };
|
||||
|
|
@ -62,7 +63,7 @@ const updateUserPluginAuth = async (userId, authField, pluginKey, value) => {
|
|||
return newPluginAuth;
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
logger.error('[updateUserPluginAuth]', err);
|
||||
return err;
|
||||
}
|
||||
};
|
||||
|
|
@ -72,7 +73,7 @@ const deleteUserPluginAuth = async (userId, authField) => {
|
|||
const response = await PluginAuth.deleteOne({ userId, authField });
|
||||
return response;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
logger.error('[deleteUserPluginAuth]', err);
|
||||
return err;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
const { logger } = require('~/config');
|
||||
|
||||
/**
|
||||
* @typedef {import('openai').OpenAI} OpenAI
|
||||
* @typedef {import('../AssistantService').RunStep} RunStep
|
||||
|
|
@ -84,8 +86,12 @@ class RunManager {
|
|||
return await this.handlers['final']({ step, runStatus, stepsByStatus: this.stepsByStatus });
|
||||
}
|
||||
|
||||
console.log(`Default handler for ${step.id} with status \`${runStatus}\``);
|
||||
console.dir({ step, runStatus, final, isLast }, { depth: null });
|
||||
logger.debug(`[RunManager] Default handler for ${step.id} with status \`${runStatus}\``, {
|
||||
step,
|
||||
runStatus,
|
||||
final,
|
||||
isLast,
|
||||
});
|
||||
return step;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
const { User, Key } = require('../../models');
|
||||
const { encrypt, decrypt } = require('../utils');
|
||||
const { User, Key } = require('~/models');
|
||||
const { encrypt, decrypt } = require('~/server/utils');
|
||||
const { logger } = require('~/config');
|
||||
|
||||
const updateUserPluginsService = async (user, pluginKey, action) => {
|
||||
try {
|
||||
|
|
@ -15,7 +16,7 @@ const updateUserPluginsService = async (user, pluginKey, action) => {
|
|||
);
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
logger.error('[updateUserPluginsService]', err);
|
||||
return err;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
const { Tiktoken } = require('tiktoken/lite');
|
||||
const { load } = require('tiktoken/load');
|
||||
const { Tiktoken } = require('tiktoken/lite');
|
||||
const registry = require('tiktoken/registry.json');
|
||||
const models = require('tiktoken/model_to_encoding.json');
|
||||
const logger = require('~/config/winston');
|
||||
|
||||
const countTokens = async (text = '', modelName = 'gpt-3.5-turbo') => {
|
||||
let encoder = null;
|
||||
|
|
@ -12,7 +13,7 @@ const countTokens = async (text = '', modelName = 'gpt-3.5-turbo') => {
|
|||
encoder.free();
|
||||
return tokens.length;
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
logger.error('[countTokens]', e);
|
||||
if (encoder) {
|
||||
encoder.free();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
require('dotenv').config();
|
||||
|
||||
const crypto = require('crypto');
|
||||
const key = Buffer.from(process.env.CREDS_KEY, 'hex');
|
||||
const iv = Buffer.from(process.env.CREDS_IV, 'hex');
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
const partialRight = require('lodash/partialRight');
|
||||
const { getCitations, citeText } = require('./citations');
|
||||
const { sendMessage } = require('./streamResponse');
|
||||
const { getCitations, citeText } = require('./citations');
|
||||
const cursor = '<span className="result-streaming">█</span>';
|
||||
const citationRegex = /\[\^\d+?\^]/g;
|
||||
|
||||
|
|
@ -138,21 +138,31 @@ function formatAction(action) {
|
|||
}
|
||||
|
||||
/**
|
||||
* Checks if the given string value is truthy by comparing it to the string 'true' (case-insensitive).
|
||||
* Checks if the given value is truthy by being either the boolean `true` or a string
|
||||
* that case-insensitively matches 'true'.
|
||||
*
|
||||
* @function
|
||||
* @param {string|null|undefined} value - The string value to check.
|
||||
* @returns {boolean} Returns `true` if the value is a case-insensitive match for the string 'true', otherwise returns `false`.
|
||||
* @param {string|boolean|null|undefined} value - The value to check.
|
||||
* @returns {boolean} Returns `true` if the value is the boolean `true` or a case-insensitive
|
||||
* match for the string 'true', otherwise returns `false`.
|
||||
* @example
|
||||
*
|
||||
* isEnabled("True"); // returns true
|
||||
* isEnabled("TRUE"); // returns true
|
||||
* isEnabled(true); // returns true
|
||||
* isEnabled("false"); // returns false
|
||||
* isEnabled(false); // returns false
|
||||
* isEnabled(null); // returns false
|
||||
* isEnabled(); // returns false
|
||||
*/
|
||||
function isEnabled(value) {
|
||||
return value?.toLowerCase()?.trim() === 'true';
|
||||
if (typeof value === 'boolean') {
|
||||
return value;
|
||||
}
|
||||
if (typeof value === 'string') {
|
||||
return value.toLowerCase().trim() === 'true';
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
|
|
|||
51
api/server/utils/handleText.spec.js
Normal file
51
api/server/utils/handleText.spec.js
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
const { isEnabled } = require('./handleText');
|
||||
|
||||
describe('isEnabled', () => {
|
||||
test('should return true when input is "true"', () => {
|
||||
expect(isEnabled('true')).toBe(true);
|
||||
});
|
||||
|
||||
test('should return true when input is "TRUE"', () => {
|
||||
expect(isEnabled('TRUE')).toBe(true);
|
||||
});
|
||||
|
||||
test('should return true when input is true', () => {
|
||||
expect(isEnabled(true)).toBe(true);
|
||||
});
|
||||
|
||||
test('should return false when input is "false"', () => {
|
||||
expect(isEnabled('false')).toBe(false);
|
||||
});
|
||||
|
||||
test('should return false when input is false', () => {
|
||||
expect(isEnabled(false)).toBe(false);
|
||||
});
|
||||
|
||||
test('should return false when input is null', () => {
|
||||
expect(isEnabled(null)).toBe(false);
|
||||
});
|
||||
|
||||
test('should return false when input is undefined', () => {
|
||||
expect(isEnabled()).toBe(false);
|
||||
});
|
||||
|
||||
test('should return false when input is an empty string', () => {
|
||||
expect(isEnabled('')).toBe(false);
|
||||
});
|
||||
|
||||
test('should return false when input is a whitespace string', () => {
|
||||
expect(isEnabled(' ')).toBe(false);
|
||||
});
|
||||
|
||||
test('should return false when input is a number', () => {
|
||||
expect(isEnabled(123)).toBe(false);
|
||||
});
|
||||
|
||||
test('should return false when input is an object', () => {
|
||||
expect(isEnabled({})).toBe(false);
|
||||
});
|
||||
|
||||
test('should return false when input is an array', () => {
|
||||
expect(isEnabled([])).toBe(false);
|
||||
});
|
||||
});
|
||||
|
|
@ -38,8 +38,7 @@ function math(str, fallbackValue) {
|
|||
if (fallback) {
|
||||
return fallbackValue;
|
||||
}
|
||||
console.error('str', str);
|
||||
throw new Error(`str did not evaluate to a number but to a ${typeof value}`);
|
||||
throw new Error(`[math] str did not evaluate to a number but to a ${typeof value}`);
|
||||
}
|
||||
|
||||
return value;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
const nodemailer = require('nodemailer');
|
||||
const handlebars = require('handlebars');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const nodemailer = require('nodemailer');
|
||||
const handlebars = require('handlebars');
|
||||
const logger = require('~/config/winston');
|
||||
|
||||
const sendEmail = async (email, subject, payload, template) => {
|
||||
try {
|
||||
|
|
@ -58,15 +59,15 @@ const sendEmail = async (email, subject, payload, template) => {
|
|||
// Send email
|
||||
transporter.sendMail(options(), (error, info) => {
|
||||
if (error) {
|
||||
console.log(error);
|
||||
logger.error('[sendEmail]', error);
|
||||
return error;
|
||||
} else {
|
||||
console.log(info);
|
||||
logger.debug('[sendEmail]', info);
|
||||
return info;
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logger.error('[sendEmail]', error);
|
||||
return error;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
const crypto = require('crypto');
|
||||
const { saveMessage } = require('../../models/Message');
|
||||
const { saveMessage } = require('~/models/Message');
|
||||
|
||||
/**
|
||||
* Sends error data in Server Sent Events format and ends the response.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue