Further loglevel updates 1. Fix missed endpoints 2. Exclude console.log from loglevel

0c8a11e28b7aae3cd89af7638eb15bcd7028c92b

Cohee <18619528+Cohee1207@users.noreply.github.com>

12 files changed, +48 -49Showing whitespace changes
src/endpoints/backends/chat-completions.js+9 -9
@@ -179,7 +179,7 @@ async function sendClaudeRequest(request, response) {
179 additionalHeaders['anthropic-beta'] = 'prompt-caching-2024-07-31';179 additionalHeaders['anthropic-beta'] = 'prompt-caching-2024-07-31';
180 }180 }
181181
182 console.log('Claude request:', requestBody);182 console.debug('Claude request:', requestBody);
183183
184 const generateResponse = await fetch(apiUrl + '/messages', {184 const generateResponse = await fetch(apiUrl + '/messages', {
185 method: 'POST',185 method: 'POST',
@@ -199,21 +199,21 @@ async function sendClaudeRequest(request, response) {
199 } else {199 } else {
200 if (!generateResponse.ok) {200 if (!generateResponse.ok) {
201 const generateResponseText = await generateResponse.text();201 const generateResponseText = await generateResponse.text();
202 console.log(color.red(`Claude API returned error: ${generateResponse.status} ${generateResponse.statusText}\n${generateResponseText}\n${divider}`));202 console.warn(color.red(`Claude API returned error: ${generateResponse.status} ${generateResponse.statusText}\n${generateResponseText}\n${divider}`));
203 return response.status(generateResponse.status).send({ error: true });203 return response.status(generateResponse.status).send({ error: true });
204 }204 }
205205
206 /** @type {any} */206 /** @type {any} */
207 const generateResponseJson = await generateResponse.json();207 const generateResponseJson = await generateResponse.json();
208 const responseText = generateResponseJson?.content?.[0]?.text || '';208 const responseText = generateResponseJson?.content?.[0]?.text || '';
209 console.log('Claude response:', generateResponseJson);209 console.debug('Claude response:', generateResponseJson);
210210
211 // Wrap it back to OAI format + save the original content211 // Wrap it back to OAI format + save the original content
212 const reply = { choices: [{ 'message': { 'content': responseText } }], content: generateResponseJson.content };212 const reply = { choices: [{ 'message': { 'content': responseText } }], content: generateResponseJson.content };
213 return response.send(reply);213 return response.send(reply);
214 }214 }
215 } catch (error) {215 } catch (error) {
216 console.log(color.red(`Error communicating with Claude: ${error}\n${divider}`));216 console.error(color.red(`Error communicating with Claude: ${error}\n${divider}`));
217 if (!response.headersSent) {217 if (!response.headersSent) {
218 return response.status(500).send({ error: true });218 return response.status(500).send({ error: true });
219 }219 }
@@ -383,7 +383,7 @@ async function sendMakerSuiteRequest(request, response) {
383 const candidates = generateResponseJson?.candidates;383 const candidates = generateResponseJson?.candidates;
384 if (!candidates || candidates.length === 0) {384 if (!candidates || candidates.length === 0) {
385 let message = 'Google AI Studio API returned no candidate';385 let message = 'Google AI Studio API returned no candidate';
386 console.log(message, generateResponseJson);386 console.warn(message, generateResponseJson);
387 if (generateResponseJson?.promptFeedback?.blockReason) {387 if (generateResponseJson?.promptFeedback?.blockReason) {
388 message += `\nPrompt was blocked due to : ${generateResponseJson.promptFeedback.blockReason}`;388 message += `\nPrompt was blocked due to : ${generateResponseJson.promptFeedback.blockReason}`;
389 }389 }
@@ -699,7 +699,7 @@ async function sendDeepSeekRequest(request, response) {
699 signal: controller.signal,699 signal: controller.signal,
700 };700 };
701701
702 console.log('DeepSeek request:', requestBody);702 console.debug('DeepSeek request:', requestBody);
703703
704 const generateResponse = await fetch(apiUrl + '/chat/completions', config);704 const generateResponse = await fetch(apiUrl + '/chat/completions', config);
705705
@@ -708,16 +708,16 @@ async function sendDeepSeekRequest(request, response) {
708 } else {708 } else {
709 if (!generateResponse.ok) {709 if (!generateResponse.ok) {
710 const errorText = await generateResponse.text();710 const errorText = await generateResponse.text();
711 console.log(`DeepSeek API returned error: ${generateResponse.status} ${generateResponse.statusText} ${errorText}`);711 console.warn(`DeepSeek API returned error: ${generateResponse.status} ${generateResponse.statusText} ${errorText}`);
712 const errorJson = tryParse(errorText) ?? { error: true };712 const errorJson = tryParse(errorText) ?? { error: true };
713 return response.status(500).send(errorJson);713 return response.status(500).send(errorJson);
714 }714 }
715 const generateResponseJson = await generateResponse.json();715 const generateResponseJson = await generateResponse.json();
716 console.log('DeepSeek response:', generateResponseJson);716 console.debug('DeepSeek response:', generateResponseJson);
717 return response.send(generateResponseJson);717 return response.send(generateResponseJson);
718 }718 }
719 } catch (error) {719 } catch (error) {
720 console.log('Error communicating with DeepSeek API: ', error);720 console.error('Error communicating with DeepSeek API: ', error);
721 if (!response.headersSent) {721 if (!response.headersSent) {
722 response.send({ error: true });722 response.send({ error: true });
723 } else {723 } else {
src/endpoints/translate.js+8 -8
@@ -301,12 +301,12 @@ router.post('/onering', jsonParser, async (request, response) => {
301 const url = secretUrl || ONERING_URL_DEFAULT;301 const url = secretUrl || ONERING_URL_DEFAULT;
302302
303 if (!url) {303 if (!url) {
304 console.log('OneRing URL is not configured.');304 console.warn('OneRing URL is not configured.');
305 return response.sendStatus(400);305 return response.sendStatus(400);
306 }306 }
307307
308 if (!secretUrl && url === ONERING_URL_DEFAULT) {308 if (!secretUrl && url === ONERING_URL_DEFAULT) {
309 console.log('OneRing URL is using default value.', ONERING_URL_DEFAULT);309 console.info('OneRing URL is using default value.', ONERING_URL_DEFAULT);
310 }310 }
311311
312 if (request.body.lang === 'pt-BR' || request.body.lang === 'pt-PT') {312 if (request.body.lang === 'pt-BR' || request.body.lang === 'pt-PT') {
@@ -326,7 +326,7 @@ router.post('/onering', jsonParser, async (request, response) => {
326 params.append('from_lang', from_lang);326 params.append('from_lang', from_lang);
327 params.append('to_lang', to_lang);327 params.append('to_lang', to_lang);
328328
329 console.log('Input text: ' + text);329 console.debug('Input text: ' + text);
330330
331 const fetchUrl = new URL(url);331 const fetchUrl = new URL(url);
332 fetchUrl.search = params.toString();332 fetchUrl.search = params.toString();
@@ -337,17 +337,17 @@ router.post('/onering', jsonParser, async (request, response) => {
337337
338 if (!result.ok) {338 if (!result.ok) {
339 const error = await result.text();339 const error = await result.text();
340 console.log('OneRing error: ', result.statusText, error);340 console.warn('OneRing error: ', result.statusText, error);
341 return response.sendStatus(500);341 return response.sendStatus(500);
342 }342 }
343343
344 /** @type {any} */344 /** @type {any} */
345 const data = await result.json();345 const data = await result.json();
346 console.log('Translated text: ' + data.result);346 console.debug('Translated text: ' + data.result);
347347
348 return response.send(data.result);348 return response.send(data.result);
349 } catch (error) {349 } catch (error) {
350 console.log('Translation error: ' + error.message);350 console.error('Translation error: ' + error.message);
351 return response.sendStatus(500);351 return response.sendStatus(500);
352 }352 }
353});353});
@@ -358,12 +358,12 @@ router.post('/deeplx', jsonParser, async (request, response) => {
358 const url = secretUrl || DEEPLX_URL_DEFAULT;358 const url = secretUrl || DEEPLX_URL_DEFAULT;
359359
360 if (!url) {360 if (!url) {
361 console.log('DeepLX URL is not configured.');361 console.warn('DeepLX URL is not configured.');
362 return response.sendStatus(400);362 return response.sendStatus(400);
363 }363 }
364364
365 if (!secretUrl && url === DEEPLX_URL_DEFAULT) {365 if (!secretUrl && url === DEEPLX_URL_DEFAULT) {
366 console.log('DeepLX URL is using default value.', DEEPLX_URL_DEFAULT);366 console.info('DeepLX URL is using default value.', DEEPLX_URL_DEFAULT);
367 }367 }
368368
369 const text = request.body.text;369 const text = request.body.text;
src/endpoints/users-private.js+3 -3
@@ -211,9 +211,9 @@ router.post('/change-name', jsonParser, async (request, response) => {
211router.post('/reset-step1', jsonParser, async (request, response) => {211router.post('/reset-step1', jsonParser, async (request, response) => {
212 try {212 try {
213 const resetCode = String(crypto.randomInt(1000, 9999));213 const resetCode = String(crypto.randomInt(1000, 9999));
214 console.info();214 console.log();
215 console.info(color.magenta(`${request.user.profile.name}, your account reset code is: `) + color.red(resetCode));215 console.log(color.magenta(`${request.user.profile.name}, your account reset code is: `) + color.red(resetCode));
216 console.info();216 console.log();
217 RESET_CACHE.set(request.user.profile.handle, resetCode);217 RESET_CACHE.set(request.user.profile.handle, resetCode);
218 return response.sendStatus(204);218 return response.sendStatus(204);
219 } catch (error) {219 } catch (error) {
src/endpoints/users-public.js+3 -3
@@ -125,9 +125,9 @@ router.post('/recover-step1', jsonParser, async (request, response) => {
125 }125 }
126126
127 const mfaCode = String(crypto.randomInt(1000, 9999));127 const mfaCode = String(crypto.randomInt(1000, 9999));
128 console.info();128 console.log();
129 console.info(color.blue(`${user.name}, your password recovery code is: `) + color.magenta(mfaCode));129 console.log(color.blue(`${user.name}, your password recovery code is: `) + color.magenta(mfaCode));
130 console.info();130 console.log();
131 MFA_CACHE.set(user.handle, mfaCode);131 MFA_CACHE.set(user.handle, mfaCode);
132 return response.sendStatus(204);132 return response.sendStatus(204);
133 } catch (error) {133 } catch (error) {
src/middleware/whitelist.js+2 -2
@@ -63,7 +63,7 @@ export default function whitelistMiddleware(whitelistMode, listen) {
63 const userAgent = req.headers['user-agent'];63 const userAgent = req.headers['user-agent'];
6464
65 if (listen && !knownIPs.has(clientIp)) {65 if (listen && !knownIPs.has(clientIp)) {
66 console.log(color.yellow(`New connection from ${clientIp}; User Agent: ${userAgent}\n`));66 console.info(color.yellow(`New connection from ${clientIp}; User Agent: ${userAgent}\n`));
67 knownIPs.add(clientIp);67 knownIPs.add(clientIp);
6868
69 // Write access log69 // Write access log
@@ -84,7 +84,7 @@ export default function whitelistMiddleware(whitelistMode, listen) {
84 const ipDetails = forwardedIp84 const ipDetails = forwardedIp
85 ? `${clientIp} (forwarded from ${forwardedIp})`85 ? `${clientIp} (forwarded from ${forwardedIp})`
86 : clientIp;86 : clientIp;
87 console.log(87 console.warn(
88 color.red(88 color.red(
89 `Blocked connection from ${clientIp}; User Agent: ${userAgent}\n\tTo allow this connection, add its IP address to the whitelist or disable whitelist mode by editing config.yaml in the root directory of your SillyTavern installation.\n`,89 `Blocked connection from ${clientIp}; User Agent: ${userAgent}\n\tTo allow this connection, add its IP address to the whitelist or disable whitelist mode by editing config.yaml in the root directory of your SillyTavern installation.\n`,
90 ),90 ),
src/users.js+2 -2
@@ -840,7 +840,7 @@ export function requireAdminMiddleware(request, response, next) {
840export async function createBackupArchive(handle, response) {840export async function createBackupArchive(handle, response) {
841 const directories = getUserDirectories(handle);841 const directories = getUserDirectories(handle);
842842
843 console.log('Backup requested for', handle);843 console.info('Backup requested for', handle);
844 const archive = archiver('zip');844 const archive = archiver('zip');
845845
846 archive.on('error', function (err) {846 archive.on('error', function (err) {
@@ -849,7 +849,7 @@ export async function createBackupArchive(handle, response) {
849849
850 // On stream closed we can end the request850 // On stream closed we can end the request
851 archive.on('end', function () {851 archive.on('end', function () {
852 console.log('Archive wrote %d bytes', archive.pointer());852 console.info('Archive wrote %d bytes', archive.pointer());
853 response.end(); // End the Express response853 response.end(); // End the Express response
854 });854 });
855855
src/util.js+5 -6
@@ -170,7 +170,7 @@ export async function extractFileFromZipBuffer(archiveBuffer, fileExtension) {
170 zipfile.readEntry();170 zipfile.readEntry();
171 zipfile.on('entry', (entry) => {171 zipfile.on('entry', (entry) => {
172 if (entry.fileName.endsWith(fileExtension) && !entry.fileName.startsWith('__MACOSX')) {172 if (entry.fileName.endsWith(fileExtension) && !entry.fileName.startsWith('__MACOSX')) {
173 console.log(`Extracting ${entry.fileName}`);173 console.info(`Extracting ${entry.fileName}`);
174 zipfile.openReadStream(entry, (err, readStream) => {174 zipfile.openReadStream(entry, (err, readStream) => {
175 if (err) {175 if (err) {
176 reject(err);176 reject(err);
@@ -218,7 +218,7 @@ export async function getImageBuffers(zipFilePath) {
218 zipfile.on('entry', (entry) => {218 zipfile.on('entry', (entry) => {
219 const mimeType = mime.lookup(entry.fileName);219 const mimeType = mime.lookup(entry.fileName);
220 if (mimeType && mimeType.startsWith('image/') && !entry.fileName.startsWith('__MACOSX')) {220 if (mimeType && mimeType.startsWith('image/') && !entry.fileName.startsWith('__MACOSX')) {
221 console.log(`Extracting ${entry.fileName}`);221 console.info(`Extracting ${entry.fileName}`);
222 zipfile.openReadStream(entry, (err, readStream) => {222 zipfile.openReadStream(entry, (err, readStream) => {
223 if (err) {223 if (err) {
224 reject(err);224 reject(err);
@@ -448,7 +448,7 @@ export function forwardFetchResponse(from, to) {
448 let statusText = from.statusText;448 let statusText = from.statusText;
449449
450 if (!from.ok) {450 if (!from.ok) {
451 console.log(`Streaming request failed with status ${statusCode} ${statusText}`);451 console.warn(`Streaming request failed with status ${statusCode} ${statusText}`);
452 }452 }
453453
454 // Avoid sending 401 responses as they reset the client Basic auth.454 // Avoid sending 401 responses as they reset the client Basic auth.
@@ -473,7 +473,7 @@ export function forwardFetchResponse(from, to) {
473 });473 });
474474
475 from.body.on('end', function () {475 from.body.on('end', function () {
476 console.log('Streaming request finished');476 console.info('Streaming request finished');
477 to.end();477 to.end();
478 });478 });
479 } else {479 } else {
@@ -518,7 +518,7 @@ export function makeHttp2Request(endpoint, method, body, headers) {
518 });518 });
519519
520 req.on('end', () => {520 req.on('end', () => {
521 console.log(data);521 console.debug(data);
522 resolve(data);522 resolve(data);
523 });523 });
524 });524 });
@@ -701,7 +701,6 @@ export function setupLogLevel() {
701 const logLevel = getConfigValue('minLogLevel', LOG_LEVELS.DEBUG);701 const logLevel = getConfigValue('minLogLevel', LOG_LEVELS.DEBUG);
702702
703 globalThis.console.debug = logLevel <= LOG_LEVELS.DEBUG ? console.debug : () => {};703 globalThis.console.debug = logLevel <= LOG_LEVELS.DEBUG ? console.debug : () => {};
704 globalThis.console.log = logLevel <= LOG_LEVELS.INFO ? console.log : () => {};
705 globalThis.console.info = logLevel <= LOG_LEVELS.INFO ? console.info : () => {};704 globalThis.console.info = logLevel <= LOG_LEVELS.INFO ? console.info : () => {};
706 globalThis.console.warn = logLevel <= LOG_LEVELS.WARN ? console.warn : () => {};705 globalThis.console.warn = logLevel <= LOG_LEVELS.WARN ? console.warn : () => {};
707 globalThis.console.error = logLevel <= LOG_LEVELS.ERROR ? console.error : () => {};706 globalThis.console.error = logLevel <= LOG_LEVELS.ERROR ? console.error : () => {};
src/vectors/cohere-vectors.js+3 -3
@@ -13,7 +13,7 @@ export async function getCohereBatchVector(texts, isQuery, directories, model) {
13 const key = readSecret(directories, SECRET_KEYS.COHERE);13 const key = readSecret(directories, SECRET_KEYS.COHERE);
1414
15 if (!key) {15 if (!key) {
16 console.log('No API key found');16 console.warn('No API key found');
17 throw new Error('No API key found');17 throw new Error('No API key found');
18 }18 }
1919
@@ -34,14 +34,14 @@ export async function getCohereBatchVector(texts, isQuery, directories, model) {
3434
35 if (!response.ok) {35 if (!response.ok) {
36 const text = await response.text();36 const text = await response.text();
37 console.log('API request failed', response.statusText, text);37 console.warn('API request failed', response.statusText, text);
38 throw new Error('API request failed');38 throw new Error('API request failed');
39 }39 }
4040
41 /** @type {any} */41 /** @type {any} */
42 const data = await response.json();42 const data = await response.json();
43 if (!Array.isArray(data?.embeddings?.float)) {43 if (!Array.isArray(data?.embeddings?.float)) {
44 console.log('API response was not an array');44 console.warn('API response was not an array');
45 throw new Error('API response was not an array');45 throw new Error('API response was not an array');
46 }46 }
4747
src/vectors/extras-vectors.js+3 -3
@@ -36,8 +36,8 @@ async function getExtrasVectorImpl(text, apiUrl, apiKey) {
36 url.pathname = '/api/embeddings/compute';36 url.pathname = '/api/embeddings/compute';
37 }37 }
38 catch (error) {38 catch (error) {
39 console.log('Failed to set up Extras API call:', error);39 console.error('Failed to set up Extras API call:', error);
40 console.log('Extras API URL given was:', apiUrl);40 console.debug('Extras API URL given was:', apiUrl);
41 throw error;41 throw error;
42 }42 }
4343
@@ -62,7 +62,7 @@ async function getExtrasVectorImpl(text, apiUrl, apiKey) {
6262
63 if (!response.ok) {63 if (!response.ok) {
64 const text = await response.text();64 const text = await response.text();
65 console.log('Extras request failed', response.statusText, text);65 console.warn('Extras request failed', response.statusText, text);
66 throw new Error('Extras request failed');66 throw new Error('Extras request failed');
67 }67 }
6868
src/vectors/makersuite-vectors.js+2 -2
@@ -23,7 +23,7 @@ export async function getMakerSuiteVector(text, directories) {
23 const key = readSecret(directories, SECRET_KEYS.MAKERSUITE);23 const key = readSecret(directories, SECRET_KEYS.MAKERSUITE);
2424
25 if (!key) {25 if (!key) {
26 console.log('No Google AI Studio key found');26 console.warn('No Google AI Studio key found');
27 throw new Error('No Google AI Studio key found');27 throw new Error('No Google AI Studio key found');
28 }28 }
2929
@@ -48,7 +48,7 @@ export async function getMakerSuiteVector(text, directories) {
4848
49 if (!response.ok) {49 if (!response.ok) {
50 const text = await response.text();50 const text = await response.text();
51 console.log('Google AI Studio request failed', response.statusText, text);51 console.warn('Google AI Studio request failed', response.statusText, text);
52 throw new Error('Google AI Studio request failed');52 throw new Error('Google AI Studio request failed');
53 }53 }
5454
src/vectors/nomicai-vectors.js+4 -4
@@ -20,14 +20,14 @@ export async function getNomicAIBatchVector(texts, source, directories) {
20 const config = SOURCES[source];20 const config = SOURCES[source];
2121
22 if (!config) {22 if (!config) {
23 console.log('Unknown source', source);23 console.error('Unknown source', source);
24 throw new Error('Unknown source');24 throw new Error('Unknown source');
25 }25 }
2626
27 const key = readSecret(directories, config.secretKey);27 const key = readSecret(directories, config.secretKey);
2828
29 if (!key) {29 if (!key) {
30 console.log('No API key found');30 console.warn('No API key found');
31 throw new Error('No API key found');31 throw new Error('No API key found');
32 }32 }
3333
@@ -47,14 +47,14 @@ export async function getNomicAIBatchVector(texts, source, directories) {
4747
48 if (!response.ok) {48 if (!response.ok) {
49 const text = await response.text();49 const text = await response.text();
50 console.log('API request failed', response.statusText, text);50 console.warn('API request failed', response.statusText, text);
51 throw new Error('API request failed');51 throw new Error('API request failed');
52 }52 }
5353
54 /** @type {any} */54 /** @type {any} */
55 const data = await response.json();55 const data = await response.json();
56 if (!Array.isArray(data?.embeddings)) {56 if (!Array.isArray(data?.embeddings)) {
57 console.log('API response was not an array');57 console.warn('API response was not an array');
58 throw new Error('API response was not an array');58 throw new Error('API response was not an array');
59 }59 }
6060
src/vectors/openai-vectors.js+4 -4
@@ -31,14 +31,14 @@ export async function getOpenAIBatchVector(texts, source, directories, model = '
31 const config = SOURCES[source];31 const config = SOURCES[source];
3232
33 if (!config) {33 if (!config) {
34 console.log('Unknown source', source);34 console.error('Unknown source', source);
35 throw new Error('Unknown source');35 throw new Error('Unknown source');
36 }36 }
3737
38 const key = readSecret(directories, config.secretKey);38 const key = readSecret(directories, config.secretKey);
3939
40 if (!key) {40 if (!key) {
41 console.log('No API key found');41 console.warn('No API key found');
42 throw new Error('No API key found');42 throw new Error('No API key found');
43 }43 }
4444
@@ -57,7 +57,7 @@ export async function getOpenAIBatchVector(texts, source, directories, model = '
5757
58 if (!response.ok) {58 if (!response.ok) {
59 const text = await response.text();59 const text = await response.text();
60 console.log('API request failed', response.statusText, text);60 console.warn('API request failed', response.statusText, text);
61 throw new Error('API request failed');61 throw new Error('API request failed');
62 }62 }
6363
@@ -65,7 +65,7 @@ export async function getOpenAIBatchVector(texts, source, directories, model = '
65 const data = await response.json();65 const data = await response.json();
6666
67 if (!Array.isArray(data?.data)) {67 if (!Array.isArray(data?.data)) {
68 console.log('API response was not an array');68 console.warn('API response was not an array');
69 throw new Error('API response was not an array');69 throw new Error('API response was not an array');
70 }70 }
7171