From 3d466921e464c7eefdce962eabcb766c7f163151 Mon Sep 17 00:00:00 2001 From: lforst <8118419+lforst@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:27:18 +0000 Subject: [PATCH 1/2] fix: Don't ignore `noTraceIO` for `wrapTraced` around plain functions --- js/src/logger.test.ts | 65 +++++++++++++++++++++++++++++++++++++++++++ js/src/logger.ts | 8 +++--- 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/js/src/logger.test.ts b/js/src/logger.test.ts index 86a3a1a5c..fa296a650 100644 --- a/js/src/logger.test.ts +++ b/js/src/logger.test.ts @@ -2495,6 +2495,71 @@ describe("isGeneratorFunction and isAsyncGeneratorFunction utilities", () => { }); }); +describe("wrapTraced noTraceIO", () => { + let memoryLogger: any; + + beforeEach(async () => { + await _exportsForTestingOnly.simulateLoginForTests(); + memoryLogger = _exportsForTestingOnly.useTestBackgroundLogger(); + }); + + afterEach(() => { + _exportsForTestingOnly.clearTestBackgroundLogger(); + _exportsForTestingOnly.simulateLogoutForTests(); + }); + + test("preserves manually logged input and output for async functions", async () => { + initLogger({ projectName: "test", projectId: "test-project-id" }); + + const callModel = wrapTraced( + async (request: { input: string }) => { + const response = { output: "manual output", metadata: "extra" }; + currentSpan().log({ + input: request.input, + output: response.output, + }); + return response; + }, + { noTraceIO: true }, + ); + + await callModel({ input: "manual input" }); + + await memoryLogger.flush(); + const logs = await memoryLogger.drain(); + expect(logs).toHaveLength(1); + expect(logs[0].input).toBe("manual input"); + expect(logs[0].output).toBe("manual output"); + }); + + test("preserves manually logged input and output for synchronous functions", async () => { + initLogger({ projectName: "test", projectId: "test-project-id" }); + + const callModel = wrapTraced( + (request: { input: string }) => { + const response = { output: "manual output", metadata: "extra" }; + currentSpan().log({ + input: request.input, + output: response.output, + }); + return response; + }, + { noTraceIO: true, asyncFlush: true }, + ); + + expect(callModel({ input: "manual input" })).toEqual({ + output: "manual output", + metadata: "extra", + }); + + await memoryLogger.flush(); + const logs = await memoryLogger.drain(); + expect(logs).toHaveLength(1); + expect(logs[0].input).toBe("manual input"); + expect(logs[0].output).toBe("manual output"); + }); +}); + describe("wrapTraced generator support", () => { let memoryLogger: any; let originalEnv: string | undefined; diff --git a/js/src/logger.ts b/js/src/logger.ts index 9733c3030..bb68d41c2 100644 --- a/js/src/logger.ts +++ b/js/src/logger.ts @@ -6289,13 +6289,13 @@ export function wrapTraced< if (args?.asyncFlush) { return ((...fnArgs: Parameters) => traced((span) => { - if (!hasExplicitInput) { + if (!args?.noTraceIO && !hasExplicitInput) { span.log({ input: fnArgs }); } const output = fn(...fnArgs); - if (!hasExplicitOutput) { + if (!args?.noTraceIO && !hasExplicitOutput) { if (output instanceof Promise) { return (async () => { const result = await output; @@ -6312,7 +6312,7 @@ export function wrapTraced< } else { return ((...fnArgs: Parameters) => traced(async (span) => { - if (!hasExplicitInput) { + if (!args?.noTraceIO && !hasExplicitInput) { span.log({ input: fnArgs }); } @@ -6320,7 +6320,7 @@ export function wrapTraced< const output = await outputResult; - if (!hasExplicitOutput) { + if (!args?.noTraceIO && !hasExplicitOutput) { span.log({ output }); } From ac1b16c7dea1a69da0b79ed19e2852aab171809a Mon Sep 17 00:00:00 2001 From: lforst <8118419+lforst@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:54:50 +0000 Subject: [PATCH 2/2] Update PR #2376 --- .changeset/fix-wrap-traced-no-trace-io.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fix-wrap-traced-no-trace-io.md diff --git a/.changeset/fix-wrap-traced-no-trace-io.md b/.changeset/fix-wrap-traced-no-trace-io.md new file mode 100644 index 000000000..c61185996 --- /dev/null +++ b/.changeset/fix-wrap-traced-no-trace-io.md @@ -0,0 +1,5 @@ +--- +"braintrust": patch +--- + +fix: Don't ignore `noTraceIO` for `wrapTraced` around plain functions