Skip to content
This repository was archived by the owner on Sep 29, 2025. It is now read-only.

Commit 2755410

Browse files
mongodbenBen Perlmutter
andauthored
(EAI-921): fix braintrust logger issue (#704)
* should be working * fix build err * Update packages/chatbot-server-mongodb-public/src/config.ts * Clean up --------- Co-authored-by: Ben Perlmutter <mongodben@mongodb.com>
1 parent 215a533 commit 2755410

File tree

9 files changed

+67
-49
lines changed

9 files changed

+67
-49
lines changed

packages/chatbot-server-mongodb-public/src/config.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import {
5050
makeRateMessageUpdateTrace,
5151
} from "./tracing/routesUpdateTraceHandlers";
5252
import { useSegmentIds } from "./middleware/useSegmentIds";
53+
import { makeBraintrustLogger } from "mongodb-rag-core/braintrust";
5354
import { makeMongoDbScrubbedMessageStore } from "./tracing/scrubbedMessages/MongoDbScrubbedMessageStore";
5455
import { MessageAnalysis } from "./tracing/scrubbedMessages/analyzeMessage";
5556
import { createAzure } from "mongodb-rag-core/aiSdk";
@@ -84,6 +85,11 @@ const {
8485
SEGMENT_WRITE_KEY,
8586
} = process.env;
8687

88+
export const braintrustLogger = makeBraintrustLogger({
89+
apiKey: process.env.BRAINTRUST_TRACING_API_KEY,
90+
projectName: process.env.BRAINTRUST_CHATBOT_TRACING_PROJECT_NAME,
91+
});
92+
8793
const allowedOrigins = process.env.ALLOWED_ORIGINS?.split(",") || [];
8894

8995
export const openAiClient = wrapOpenAI(
@@ -298,6 +304,7 @@ export const config: AppConfig = {
298304
percentToJudge: isProduction ? 0.1 : 1,
299305
},
300306
segment: segmentConfig,
307+
braintrustLogger,
301308
embeddingModelName: OPENAI_RETRIEVAL_EMBEDDING_DEPLOYMENT,
302309
scrubbedMessageStore,
303310
analyzerModel: wrapAISDKModel(
@@ -308,6 +315,7 @@ export const config: AppConfig = {
308315
llmAsAJudge: llmAsAJudgeConfig,
309316
segment: segmentConfig,
310317
scrubbedMessageStore,
318+
braintrustLogger,
311319
}),
312320
commentMessageUpdateTrace: makeCommentMessageUpdateTrace({
313321
openAiClient,
@@ -329,13 +337,15 @@ export const config: AppConfig = {
329337
: undefined,
330338
segment: segmentConfig,
331339
scrubbedMessageStore,
340+
braintrustLogger,
332341
}),
333342
generateUserPrompt,
334343
systemPrompt,
335344
maxUserMessagesInConversation: 50,
336345
maxUserCommentLength: 500,
337346
conversations,
338347
maxInputLengthCharacters: 3000,
348+
braintrustLogger,
339349
},
340350
maxRequestTimeoutMs: 60000,
341351
corsOptions: {

packages/chatbot-server-mongodb-public/src/tracing/routesUpdateTraceHandlers.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
TraceSegmentEventParams,
1616
} from "./segment";
1717
import { logRequest } from "../utils";
18+
import { Logger } from "mongodb-rag-core/braintrust";
1819
import { ScrubbedMessageStore } from "./scrubbedMessages/ScrubbedMessageStore";
1920
import { LanguageModel } from "mongodb-rag-core/aiSdk";
2021
import { makeScrubbedMessagesFromTracingData } from "./scrubbedMessages/makeScrubbedMessagesFromTracingData";
@@ -25,6 +26,7 @@ export function makeAddMessageToConversationUpdateTrace({
2526
k,
2627
llmAsAJudge,
2728
segment,
29+
braintrustLogger,
2830
scrubbedMessageStore,
2931
analyzerModel,
3032
embeddingModelName,
@@ -37,6 +39,7 @@ export function makeAddMessageToConversationUpdateTrace({
3739
percentToJudge: number;
3840
};
3941
segment?: TraceSegmentEventParams;
42+
braintrustLogger: Logger<true>;
4043
scrubbedMessageStore: ScrubbedMessageStore<MessageAnalysis>;
4144
analyzerModel: LanguageModel;
4245
embeddingModelName: string;
@@ -55,7 +58,7 @@ export function makeAddMessageToConversationUpdateTrace({
5558
})
5659
: undefined;
5760

58-
return async function ({ traceId, conversation, logger, reqId }) {
61+
return async function ({ traceId, conversation, reqId }) {
5962
const tracingData = extractTracingData(
6063
conversation.messages,
6164
ObjectId.createFromHexString(traceId),
@@ -146,7 +149,7 @@ export function makeAddMessageToConversationUpdateTrace({
146149
}
147150

148151
try {
149-
logger.updateSpan({
152+
braintrustLogger.updateSpan({
150153
id: traceId,
151154
tags: tracingData.tags,
152155
scores: {
@@ -200,18 +203,20 @@ export function makeRateMessageUpdateTrace({
200203
llmAsAJudge,
201204
segment,
202205
scrubbedMessageStore,
206+
braintrustLogger,
203207
}: {
204208
llmAsAJudge: LlmAsAJudge;
205209
segment?: TraceSegmentEventParams;
206210
scrubbedMessageStore: ScrubbedMessageStore<MessageAnalysis>;
211+
braintrustLogger: Logger<true>;
207212
}): UpdateTraceFunc {
208213
const segmentTrackUserRatedMessage = segment
209214
? makeTrackUserRatedMessage({
210215
writeKey: segment.writeKey,
211216
})
212217
: undefined;
213218

214-
return async function ({ traceId, conversation, logger }) {
219+
return async function ({ traceId, conversation }) {
215220
const tracingData = extractTracingData(
216221
conversation.messages,
217222
ObjectId.createFromHexString(traceId),
@@ -274,7 +279,7 @@ export function makeRateMessageUpdateTrace({
274279
}
275280

276281
try {
277-
logger.updateSpan({
282+
braintrustLogger.updateSpan({
278283
id: traceId,
279284
scores: {
280285
...(await getLlmAsAJudgeScores(llmAsAJudge, tracingData)),
@@ -296,6 +301,7 @@ export function makeCommentMessageUpdateTrace({
296301
judgeLlm,
297302
slack,
298303
segment,
304+
braintrustLogger,
299305
scrubbedMessageStore,
300306
}: {
301307
openAiClient: OpenAI;
@@ -310,6 +316,7 @@ export function makeCommentMessageUpdateTrace({
310316
};
311317
};
312318
segment?: TraceSegmentEventParams;
319+
braintrustLogger: Logger<true>;
313320
scrubbedMessageStore: ScrubbedMessageStore<MessageAnalysis>;
314321
}): UpdateTraceFunc {
315322
const judgeMongoDbChatbotCommentSentiment =
@@ -321,7 +328,7 @@ export function makeCommentMessageUpdateTrace({
321328
})
322329
: undefined;
323330

324-
return async function ({ traceId, conversation, logger }) {
331+
return async function ({ traceId, conversation }) {
325332
const tracingData = extractTracingData(
326333
conversation.messages,
327334
ObjectId.createFromHexString(traceId),
@@ -401,7 +408,7 @@ export function makeCommentMessageUpdateTrace({
401408
}
402409

403410
try {
404-
logger.updateSpan({
411+
braintrustLogger.updateSpan({
405412
id: traceId,
406413
scores: {
407414
HasComment: 1,

packages/mongodb-chatbot-server/src/app.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import { ObjectId } from "mongodb-rag-core/mongodb";
1717
import { getRequestId, logRequest, sendErrorResponse } from "./utils";
1818
import { CorsOptions } from "cors";
1919
import cloneDeep from "lodash.clonedeep";
20-
import { braintrustLogger } from "mongodb-rag-core/braintrust";
2120

2221
/**
2322
Configuration for the server Express.js app.
@@ -126,14 +125,6 @@ export const makeApp = async (config: AppConfig): Promise<Express> => {
126125
stringifyFunctions(cloneDeep(config) as unknown as Record<string, unknown>)
127126
);
128127

129-
// Initialize the Braintrust logger if it exists
130-
if (process.env.BRAINTRUST_TRACING_API_KEY !== undefined) {
131-
const braintrustLoggerId = await braintrustLogger.id;
132-
logger.info(`Using Braintrust logger with ID: ${braintrustLoggerId}`);
133-
} else {
134-
logger.info("Braintrust logger not initialized");
135-
}
136-
137128
const app = express();
138129

139130
// Instantiate additional server logic, if it exists.
@@ -175,7 +166,10 @@ export const makeApp = async (config: AppConfig): Promise<Express> => {
175166
/**
176167
Helper function to stringify functions when logging the config object.
177168
*/
178-
function stringifyFunctions(obj: Record<string, unknown>) {
169+
function stringifyFunctions(obj: Record<string, unknown>, depth = 0) {
170+
if (depth > 10) {
171+
return "...";
172+
}
179173
if (typeof obj === "function") {
180174
return (obj as (...args: unknown[]) => unknown)
181175
.toString()
@@ -187,7 +181,10 @@ function stringifyFunctions(obj: Record<string, unknown>) {
187181
if (typeof obj === "object" && obj !== null) {
188182
const newObj: Record<string, unknown> = {};
189183
for (const key in obj) {
190-
newObj[key] = stringifyFunctions(obj[key] as Record<string, unknown>);
184+
newObj[key] = stringifyFunctions(
185+
obj[key] as Record<string, unknown>,
186+
depth + 1
187+
);
191188
}
192189
return newObj;
193190
}

packages/mongodb-chatbot-server/src/routes/conversations/UpdateTraceFunc.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import { Conversation, ConversationsService } from "mongodb-rag-core";
2-
import { braintrustLogger } from "mongodb-rag-core/braintrust";
32
import { ObjectId } from "mongodb-rag-core/mongodb";
43

54
export type UpdateTraceFuncParams = {
65
reqId: string;
76
traceId: string;
8-
logger: typeof braintrustLogger;
97
conversation: Conversation;
108
};
119

@@ -33,7 +31,6 @@ export async function updateTraceIfExists({
3331
await updateTrace({
3432
reqId,
3533
traceId: assistantResponseMessageId.toHexString(),
36-
logger: braintrustLogger,
3734
conversation: updatedConversationForTrace,
3835
});
3936
}

packages/mongodb-chatbot-server/src/routes/conversations/addMessageToConversation.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import { GenerateUserPromptFunc } from "../../processors/GenerateUserPromptFunc"
3535
import { FilterPreviousMessages } from "../../processors/FilterPreviousMessages";
3636
import { filterOnlySystemPrompt } from "../../processors/filterOnlySystemPrompt";
3737
import { generateResponse, GenerateResponseParams } from "../generateResponse";
38-
import { wrapTraced } from "mongodb-rag-core/braintrust";
38+
import { wrapTraced, Logger } from "mongodb-rag-core/braintrust";
3939
import { UpdateTraceFunc, updateTraceIfExists } from "./UpdateTraceFunc";
4040

4141
export const DEFAULT_MAX_INPUT_LENGTH = 3000; // magic number for max input size for LLM
@@ -99,6 +99,7 @@ export interface AddMessageToConversationRouteParams {
9999
Can add additional tags, scores, etc.
100100
*/
101101
updateTrace?: UpdateTraceFunc;
102+
braintrustLogger?: Logger<true>;
102103
}
103104

104105
type MakeTracedResponseParams = Pick<

packages/mongodb-chatbot-server/src/routes/conversations/commentMessage.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
import { getRequestId, logRequest, sendErrorResponse } from "../../utils";
99
import { z } from "zod";
1010
import { SomeExpressRequest } from "../../middleware/validateRequestSchema";
11-
import { braintrustLogger } from "mongodb-rag-core/braintrust";
11+
import { Logger } from "mongodb-rag-core/braintrust";
1212
import { UpdateTraceFunc, updateTraceIfExists } from "./UpdateTraceFunc";
1313

1414
export type CommentMessageRequest = z.infer<typeof CommentMessageRequest>;
@@ -32,12 +32,14 @@ export interface CommentMessageRouteParams {
3232
conversations: ConversationsService;
3333
maxCommentLength?: number;
3434
updateTrace?: UpdateTraceFunc;
35+
braintrustLogger?: Logger<true>;
3536
}
3637

3738
export function makeCommentMessageRoute({
3839
conversations,
3940
maxCommentLength,
4041
updateTrace,
42+
braintrustLogger,
4143
}: CommentMessageRouteParams) {
4244
return async (
4345
req: ExpressRequest,
@@ -147,10 +149,12 @@ export function makeCommentMessageRoute({
147149
message: `Added a user comment to ${messageIdStr} in conversation ${conversationIdStr}: "${comment}"`,
148150
});
149151
const traceId = messageId.toHexString();
150-
braintrustLogger.logFeedback({
151-
id: traceId,
152-
comment,
153-
});
152+
if (braintrustLogger) {
153+
braintrustLogger.logFeedback({
154+
id: traceId,
155+
comment,
156+
});
157+
}
154158
await updateTraceIfExists({
155159
updateTrace,
156160
reqId,

packages/mongodb-chatbot-server/src/routes/conversations/conversationsRouter.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import {
3535
makeGetConversationRoute,
3636
} from "./getConversation";
3737
import { UpdateTraceFunc } from "./UpdateTraceFunc";
38+
import { Logger } from "mongodb-rag-core/braintrust";
3839

3940
/**
4041
Configuration for rate limiting on the /conversations/* routes.
@@ -206,6 +207,7 @@ export interface ConversationsRouterParams {
206207
@default true
207208
*/
208209
createConversationOnNullMessageId?: boolean;
210+
braintrustLogger?: Logger<true>;
209211
}
210212

211213
export const rateLimitResponse = {
@@ -283,6 +285,7 @@ export function makeConversationsRouter({
283285
commentMessageUpdateTrace,
284286
maxUserCommentLength,
285287
createConversationOnNullMessageId = true,
288+
braintrustLogger,
286289
}: ConversationsRouterParams) {
287290
const conversationsRouter = Router();
288291
// Set the customData and conversations on the response locals
@@ -378,6 +381,7 @@ export function makeConversationsRouter({
378381
}
379382
: undefined,
380383
updateTrace: addMessageToConversationUpdateTrace,
384+
braintrustLogger,
381385
});
382386
conversationsRouter.post(
383387
"/:conversationId/messages",
@@ -398,7 +402,11 @@ export function makeConversationsRouter({
398402
conversationsRouter.post(
399403
"/:conversationId/messages/:messageId/rating",
400404
validateRequestSchema(RateMessageRequest),
401-
makeRateMessageRoute({ conversations, updateTrace: rateMessageUpdateTrace })
405+
makeRateMessageRoute({
406+
conversations,
407+
updateTrace: rateMessageUpdateTrace,
408+
braintrustLogger,
409+
})
402410
);
403411

404412
// Comment on a message.
@@ -409,6 +417,7 @@ export function makeConversationsRouter({
409417
conversations,
410418
maxCommentLength: maxUserCommentLength,
411419
updateTrace: commentMessageUpdateTrace,
420+
braintrustLogger,
412421
})
413422
);
414423

packages/mongodb-chatbot-server/src/routes/conversations/rateMessage.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import {
88
import { getRequestId, logRequest, sendErrorResponse } from "../../utils";
99
import { z } from "zod";
1010
import { SomeExpressRequest } from "../../middleware/validateRequestSchema";
11-
import { braintrustLogger } from "mongodb-rag-core/braintrust";
1211
import { UpdateTraceFunc, updateTraceIfExists } from "./UpdateTraceFunc";
12+
import { Logger } from "mongodb-rag-core/braintrust";
1313

1414
export type RateMessageRequest = z.infer<typeof RateMessageRequest>;
1515

@@ -31,11 +31,13 @@ export const RateMessageRequest = SomeExpressRequest.merge(
3131
export interface RateMessageRouteParams {
3232
conversations: ConversationsService;
3333
updateTrace?: UpdateTraceFunc;
34+
braintrustLogger?: Logger<true>;
3435
}
3536

3637
export function makeRateMessageRoute({
3738
conversations,
3839
updateTrace,
40+
braintrustLogger,
3941
}: RateMessageRouteParams) {
4042
return async (
4143
req: ExpressRequest,
@@ -113,12 +115,14 @@ export function makeRateMessageRoute({
113115
message: `Rated message ${messageIdStr} in conversation ${conversationIdStr} with rating ${rating}`,
114116
});
115117
const traceId = messageId.toHexString();
116-
braintrustLogger.logFeedback({
117-
id: traceId,
118-
scores: {
119-
UserRating: rating === true ? 1 : 0,
120-
},
121-
});
118+
if (braintrustLogger) {
119+
braintrustLogger.logFeedback({
120+
id: traceId,
121+
scores: {
122+
UserRating: rating === true ? 1 : 0,
123+
},
124+
});
125+
}
122126
await updateTraceIfExists({
123127
updateTrace,
124128
reqId,

0 commit comments

Comments
 (0)