Skip to content

Commit ef0dfb9

Browse files
authored
refactor(api): Central Logging 📜 (danny-avila#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
1 parent 9135c67 commit ef0dfb9

File tree

110 files changed

+1143
-996
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+1143
-996
lines changed

app/bingai.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require('dotenv').config();
22
const { KeyvFile } = require('keyv-file');
3-
const { getUserKey, checkUserKeyExpiry } = require('../server/services/UserService');
3+
const { getUserKey, checkUserKeyExpiry } = require('~/server/services/UserService');
4+
const { logger } = require('~/config');
45

56
const askBing = async ({
67
text,
@@ -100,7 +101,7 @@ const askBing = async ({
100101
}
101102
}
102103

103-
console.log('bing options', options);
104+
logger.debug('bing options', options);
104105

105106
const res = await bingAIClient.sendMessage(text, options);
106107

app/clients/AnthropicClient.js

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const { encoding_for_model: encodingForModel, get_encoding: getEncoding } = requ
33
const { getResponseSender, EModelEndpoint } = require('librechat-data-provider');
44
const { getModelMaxTokens } = require('~/utils');
55
const BaseClient = require('./BaseClient');
6+
const { logger } = require('~/config');
67

78
const HUMAN_PROMPT = '\n\nHuman:';
89
const AI_PROMPT = '\n\nAssistant:';
@@ -103,9 +104,8 @@ class AnthropicClient extends BaseClient {
103104
messages,
104105
parentMessageId,
105106
});
106-
if (this.options.debug) {
107-
console.debug('AnthropicClient: orderedMessages', orderedMessages, parentMessageId);
108-
}
107+
108+
logger.debug('[AnthropicClient] orderedMessages', { orderedMessages, parentMessageId });
109109

110110
const formattedMessages = orderedMessages.map((message) => ({
111111
author: message.isCreatedByUser ? this.userLabel : this.assistantLabel,
@@ -247,7 +247,7 @@ class AnthropicClient extends BaseClient {
247247
}
248248

249249
getCompletion() {
250-
console.log('AnthropicClient doesn\'t use getCompletion (all handled in sendCompletion)');
250+
logger.debug('AnthropicClient doesn\'t use getCompletion (all handled in sendCompletion)');
251251
}
252252

253253
async sendCompletion(payload, { onProgress, abortController }) {
@@ -262,12 +262,7 @@ class AnthropicClient extends BaseClient {
262262
modelOptions.stream = true;
263263
}
264264

265-
const { debug } = this.options;
266-
if (debug) {
267-
console.debug();
268-
console.debug(modelOptions);
269-
console.debug();
270-
}
265+
logger.debug('modelOptions', { modelOptions });
271266

272267
const client = this.getClient();
273268
const metadata = {
@@ -295,32 +290,23 @@ class AnthropicClient extends BaseClient {
295290
top_p,
296291
top_k,
297292
};
298-
if (this.options.debug) {
299-
console.log('AnthropicClient: requestOptions');
300-
console.dir(requestOptions, { depth: null });
301-
}
293+
logger.debug('[AnthropicClient]', { requestOptions });
302294
const response = await client.completions.create(requestOptions);
303295

304296
signal.addEventListener('abort', () => {
305-
if (this.options.debug) {
306-
console.log('AnthropicClient: message aborted!');
307-
}
297+
logger.debug('[AnthropicClient] message aborted!');
308298
response.controller.abort();
309299
});
310300

311301
for await (const completion of response) {
312-
if (this.options.debug) {
313-
// Uncomment to debug message stream
314-
// console.debug(completion);
315-
}
302+
// Uncomment to debug message stream
303+
// logger.debug(completion);
316304
text += completion.completion;
317305
onProgress(completion.completion);
318306
}
319307

320308
signal.removeEventListener('abort', () => {
321-
if (this.options.debug) {
322-
console.log('AnthropicClient: message aborted!');
323-
}
309+
logger.debug('[AnthropicClient] message aborted!');
324310
response.controller.abort();
325311
});
326312

@@ -336,9 +322,7 @@ class AnthropicClient extends BaseClient {
336322
}
337323

338324
getBuildMessagesOptions() {
339-
if (this.options.debug) {
340-
console.log('AnthropicClient doesn\'t use getBuildMessagesOptions');
341-
}
325+
logger.debug('AnthropicClient doesn\'t use getBuildMessagesOptions');
342326
}
343327

344328
static getTokenizer(encoding, isModelName = false, extendSpecialTokens = {}) {

app/clients/BaseClient.js

Lines changed: 38 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const TextStream = require('./TextStream');
33
const { getConvo, getMessages, saveMessage, updateMessage, saveConvo } = require('~/models');
44
const { addSpaceIfNeeded, isEnabled } = require('~/server/utils');
55
const checkBalance = require('~/models/checkBalance');
6+
const { logger } = require('~/config');
67

78
class BaseClient {
89
constructor(apiKey, options = {}) {
@@ -41,15 +42,14 @@ class BaseClient {
4142
}
4243

4344
async getTokenCountForResponse(response) {
44-
if (this.options.debug) {
45-
console.debug('`recordTokenUsage` not implemented.', response);
46-
}
45+
logger.debug('`[BaseClient] recordTokenUsage` not implemented.', response);
4746
}
4847

4948
async recordTokenUsage({ promptTokens, completionTokens }) {
50-
if (this.options.debug) {
51-
console.debug('`recordTokenUsage` not implemented.', { promptTokens, completionTokens });
52-
}
49+
logger.debug('`[BaseClient] recordTokenUsage` not implemented.', {
50+
promptTokens,
51+
completionTokens,
52+
});
5353
}
5454

5555
getBuildMessagesOptions() {
@@ -194,14 +194,14 @@ class BaseClient {
194194
const update = {};
195195

196196
if (messageId === tokenCountMap.summaryMessage?.messageId) {
197-
this.options.debug && console.debug(`Adding summary props to ${messageId}.`);
197+
logger.debug(`[BaseClient] Adding summary props to ${messageId}.`);
198198

199199
update.summary = tokenCountMap.summaryMessage.content;
200200
update.summaryTokenCount = tokenCountMap.summaryMessage.tokenCount;
201201
}
202202

203203
if (message.tokenCount && !update.summaryTokenCount) {
204-
this.options.debug && console.debug(`Skipping ${messageId}: already had a token count.`);
204+
logger.debug(`[BaseClient] Skipping ${messageId}: already had a token count.`);
205205
continue;
206206
}
207207

@@ -278,19 +278,17 @@ class BaseClient {
278278
if (instructions) {
279279
({ tokenCount, ..._instructions } = instructions);
280280
}
281-
this.options.debug && _instructions && console.debug('instructions tokenCount', tokenCount);
281+
_instructions && logger.debug('[BaseClient] instructions tokenCount: ' + tokenCount);
282282
let payload = this.addInstructions(formattedMessages, _instructions);
283283
let orderedWithInstructions = this.addInstructions(orderedMessages, instructions);
284284

285285
let { context, remainingContextTokens, messagesToRefine, summaryIndex } =
286286
await this.getMessagesWithinTokenLimit(orderedWithInstructions);
287287

288-
this.options.debug &&
289-
console.debug(
290-
'remainingContextTokens, this.maxContextTokens (1/2)',
291-
remainingContextTokens,
292-
this.maxContextTokens,
293-
);
288+
logger.debug('[BaseClient] Context Count (1/2)', {
289+
remainingContextTokens,
290+
maxContextTokens: this.maxContextTokens,
291+
});
294292

295293
let summaryMessage;
296294
let summaryTokenCount;
@@ -308,10 +306,9 @@ class BaseClient {
308306

309307
if (diff > 0) {
310308
payload = payload.slice(diff);
311-
this.options.debug &&
312-
console.debug(
313-
`Difference between original payload (${length}) and context (${context.length}): ${diff}`,
314-
);
309+
logger.debug(
310+
`[BaseClient] Difference between original payload (${length}) and context (${context.length}): ${diff}`,
311+
);
315312
}
316313

317314
const latestMessage = orderedWithInstructions[orderedWithInstructions.length - 1];
@@ -338,12 +335,10 @@ class BaseClient {
338335
// Make sure to only continue summarization logic if the summary message was generated
339336
shouldSummarize = summaryMessage && shouldSummarize;
340337

341-
this.options.debug &&
342-
console.debug(
343-
'remainingContextTokens, this.maxContextTokens (2/2)',
344-
remainingContextTokens,
345-
this.maxContextTokens,
346-
);
338+
logger.debug('[BaseClient] Context Count (2/2)', {
339+
remainingContextTokens,
340+
maxContextTokens: this.maxContextTokens,
341+
});
347342

348343
let tokenCountMap = orderedWithInstructions.reduce((map, message, index) => {
349344
const { messageId } = message;
@@ -361,19 +356,13 @@ class BaseClient {
361356

362357
const promptTokens = this.maxContextTokens - remainingContextTokens;
363358

364-
if (this.options.debug) {
365-
console.debug('<-------------------------PAYLOAD/TOKEN COUNT MAP------------------------->');
366-
console.debug('Payload:', payload);
367-
console.debug('Token Count Map:', tokenCountMap);
368-
console.debug(
369-
'Prompt Tokens',
370-
promptTokens,
371-
'remainingContextTokens',
372-
remainingContextTokens,
373-
'this.maxContextTokens',
374-
this.maxContextTokens,
375-
);
376-
}
359+
logger.debug('[BaseClient] Payload size:', payload.length);
360+
logger.debug('[BaseClient] tokenCountMap:', tokenCountMap);
361+
logger.debug('[BaseClient]', {
362+
promptTokens,
363+
remainingContextTokens,
364+
maxContextTokens: this.maxContextTokens,
365+
});
377366

378367
return { payload, tokenCountMap, promptTokens, messages: orderedWithInstructions };
379368
}
@@ -421,11 +410,11 @@ class BaseClient {
421410
);
422411

423412
if (tokenCountMap) {
424-
console.dir(tokenCountMap, { depth: null });
413+
logger.debug('[BaseClient] tokenCountMap', tokenCountMap);
425414
if (tokenCountMap[userMessage.messageId]) {
426415
userMessage.tokenCount = tokenCountMap[userMessage.messageId];
427-
console.log('userMessage.tokenCount', userMessage.tokenCount);
428-
console.log('userMessage', userMessage);
416+
logger.debug('[BaseClient] userMessage.tokenCount', userMessage.tokenCount);
417+
logger.debug('[BaseClient] userMessage', userMessage);
429418
}
430419

431420
this.handleTokenCountMap(tokenCountMap);
@@ -443,7 +432,6 @@ class BaseClient {
443432
user: this.user,
444433
tokenType: 'prompt',
445434
amount: promptTokens,
446-
debug: this.options.debug,
447435
model: this.modelOptions.model,
448436
endpoint: this.options.endpoint,
449437
},
@@ -483,9 +471,7 @@ class BaseClient {
483471
}
484472

485473
async loadHistory(conversationId, parentMessageId = null) {
486-
if (this.options.debug) {
487-
console.debug('Loading history for conversation', conversationId, parentMessageId);
488-
}
474+
logger.debug('[BaseClient] Loading history:', { conversationId, parentMessageId });
489475

490476
const messages = (await getMessages({ conversationId })) ?? [];
491477

@@ -516,9 +502,14 @@ class BaseClient {
516502
}
517503
}
518504

519-
if (this.options.debug && this.previous_summary) {
505+
if (this.previous_summary) {
520506
const { messageId, summary, tokenCount, summaryTokenCount } = this.previous_summary;
521-
console.debug('Previous summary:', { messageId, summary, tokenCount, summaryTokenCount });
507+
logger.debug('[BaseClient] Previous summary:', {
508+
messageId,
509+
summary,
510+
tokenCount,
511+
summaryTokenCount,
512+
});
522513
}
523514

524515
return orderedMessages;

app/clients/GoogleClient.js

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const { getResponseSender, EModelEndpoint, endpointSettings } = require('librech
88
const { getModelMaxTokens } = require('~/utils');
99
const { formatMessage } = require('./prompts');
1010
const BaseClient = require('./BaseClient');
11+
const { logger } = require('~/config');
1112

1213
const loc = 'us-central1';
1314
const publisher = 'google';
@@ -42,8 +43,7 @@ class GoogleClient extends BaseClient {
4243

4344
jwtClient.authorize((err) => {
4445
if (err) {
45-
console.error('Error: jwtClient failed to authorize');
46-
console.error(err.message);
46+
logger.error('jwtClient failed to authorize', err);
4747
throw err;
4848
}
4949
});
@@ -58,11 +58,9 @@ class GoogleClient extends BaseClient {
5858
return new Promise((resolve, reject) => {
5959
jwtClient.authorize((err, tokens) => {
6060
if (err) {
61-
console.error('Error: jwtClient failed to authorize');
62-
console.error(err.message);
61+
logger.error('jwtClient failed to authorize', err);
6362
reject(err);
6463
} else {
65-
console.log('Access Token:', tokens.access_token);
6664
resolve(tokens.access_token);
6765
}
6866
});
@@ -213,8 +211,7 @@ class GoogleClient extends BaseClient {
213211
}
214212

215213
if (this.options.debug) {
216-
console.debug('GoogleClient buildMessages');
217-
console.dir(payload, { depth: null });
214+
logger.debug('GoogleClient buildMessages', payload);
218215
}
219216

220217
return { prompt: payload };
@@ -226,7 +223,10 @@ class GoogleClient extends BaseClient {
226223
parentMessageId,
227224
});
228225
if (this.options.debug) {
229-
console.debug('GoogleClient: orderedMessages', orderedMessages, parentMessageId);
226+
logger.debug('GoogleClient: orderedMessages, parentMessageId', {
227+
orderedMessages,
228+
parentMessageId,
229+
});
230230
}
231231

232232
const formattedMessages = orderedMessages.map((message) => ({
@@ -377,10 +377,7 @@ class GoogleClient extends BaseClient {
377377
const { debug } = this.options;
378378
const url = this.completionsUrl;
379379
if (debug) {
380-
console.debug();
381-
console.debug(url);
382-
console.debug(this.modelOptions);
383-
console.debug();
380+
logger.debug('GoogleClient _getCompletion', { url, payload });
384381
}
385382
const opts = {
386383
method: 'POST',
@@ -397,7 +394,7 @@ class GoogleClient extends BaseClient {
397394

398395
const client = await this.getClient();
399396
const res = await client.request({ url, method: 'POST', data: payload });
400-
console.dir(res.data, { depth: null });
397+
logger.debug('GoogleClient _getCompletion', { res });
401398
return res.data;
402399
}
403400

@@ -476,21 +473,18 @@ class GoogleClient extends BaseClient {
476473
}
477474

478475
getBuildMessagesOptions() {
479-
// console.log('GoogleClient doesn\'t use getBuildMessagesOptions');
476+
// logger.debug('GoogleClient doesn\'t use getBuildMessagesOptions');
480477
}
481478

482479
async sendCompletion(payload, opts = {}) {
483480
let reply = '';
484481
try {
485482
reply = await this.getCompletion(payload, opts);
486483
if (this.options.debug) {
487-
console.debug('result');
488-
console.debug(reply);
484+
logger.debug('GoogleClient sendCompletion', { reply });
489485
}
490486
} catch (err) {
491-
console.error('Error: failed to send completion to Google');
492-
console.error(err);
493-
console.error(err.message);
487+
logger.error('failed to send completion to Google', err);
494488
}
495489
return reply.trim();
496490
}

0 commit comments

Comments
 (0)