braintrust 3.26.0 → 3.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dev/dist/index.js +2440 -1067
  2. package/dev/dist/index.mjs +1644 -271
  3. package/dist/apply-auto-instrumentation.js +320 -261
  4. package/dist/apply-auto-instrumentation.mjs +118 -59
  5. package/dist/auto-instrumentations/bundler/esbuild.cjs +377 -59
  6. package/dist/auto-instrumentations/bundler/esbuild.mjs +5 -4
  7. package/dist/auto-instrumentations/bundler/next.cjs +379 -61
  8. package/dist/auto-instrumentations/bundler/next.mjs +6 -5
  9. package/dist/auto-instrumentations/bundler/rollup.cjs +377 -59
  10. package/dist/auto-instrumentations/bundler/rollup.mjs +5 -4
  11. package/dist/auto-instrumentations/bundler/vite.cjs +406 -60
  12. package/dist/auto-instrumentations/bundler/vite.mjs +34 -5
  13. package/dist/auto-instrumentations/bundler/webpack-loader.cjs +363 -59
  14. package/dist/auto-instrumentations/bundler/webpack.cjs +377 -59
  15. package/dist/auto-instrumentations/bundler/webpack.mjs +6 -5
  16. package/dist/auto-instrumentations/{chunk-AKKPLXTP.mjs → chunk-2AMDGD65.mjs} +160 -57
  17. package/dist/auto-instrumentations/{chunk-V5LEODRX.mjs → chunk-BW33ULMW.mjs} +1 -1
  18. package/dist/auto-instrumentations/{chunk-XYN63IG5.mjs → chunk-I55G56ZL.mjs} +21 -58
  19. package/dist/auto-instrumentations/{chunk-NRE4QUQR.mjs → chunk-JPUFNW7X.mjs} +140 -0
  20. package/dist/auto-instrumentations/{chunk-6E22MYSW.mjs → chunk-XEYKUBLY.mjs} +30 -4
  21. package/dist/auto-instrumentations/{chunk-XZHHE4Y3.mjs → chunk-ZNHTSSGI.mjs} +155 -2
  22. package/dist/auto-instrumentations/hook.mjs +161 -3
  23. package/dist/auto-instrumentations/index.cjs +296 -1
  24. package/dist/auto-instrumentations/index.d.mts +5 -1
  25. package/dist/auto-instrumentations/index.d.ts +5 -1
  26. package/dist/auto-instrumentations/index.mjs +6 -2
  27. package/dist/auto-instrumentations/loader/cjs-patch.cjs +105 -57
  28. package/dist/auto-instrumentations/loader/cjs-patch.mjs +2 -2
  29. package/dist/auto-instrumentations/loader/esm-hook.mjs +1 -1
  30. package/dist/browser.d.mts +57 -5
  31. package/dist/browser.d.ts +57 -5
  32. package/dist/browser.js +1855 -285
  33. package/dist/browser.mjs +1855 -285
  34. package/dist/{chunk-PN7EWK66.mjs → chunk-CZM5JIQL.mjs} +209 -1
  35. package/dist/{chunk-VYNNEKSA.js → chunk-MF7NU6BT.js} +216 -8
  36. package/dist/{chunk-VRZZQPAA.js → chunk-QRHGVBKU.js} +2403 -1220
  37. package/dist/{chunk-XIZOM2HO.mjs → chunk-YKD22IMR.mjs} +1454 -271
  38. package/dist/cli.js +1645 -272
  39. package/dist/edge-light.d.mts +1 -1
  40. package/dist/edge-light.d.ts +1 -1
  41. package/dist/edge-light.js +1855 -285
  42. package/dist/edge-light.mjs +1855 -285
  43. package/dist/index.d.mts +57 -5
  44. package/dist/index.d.ts +57 -5
  45. package/dist/index.js +600 -413
  46. package/dist/index.mjs +201 -14
  47. package/dist/instrumentation/index.d.mts +8 -0
  48. package/dist/instrumentation/index.d.ts +8 -0
  49. package/dist/instrumentation/index.js +1839 -466
  50. package/dist/instrumentation/index.mjs +1839 -466
  51. package/dist/vitest-evals-reporter.js +45 -43
  52. package/dist/vitest-evals-reporter.mjs +5 -3
  53. package/dist/workerd.d.mts +1 -1
  54. package/dist/workerd.d.ts +1 -1
  55. package/dist/workerd.js +1855 -285
  56. package/dist/workerd.mjs +1855 -285
  57. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -63,6 +63,7 @@ import {
63
63
  braintrustFlueObserver,
64
64
  braintrustStreamChunkSchema,
65
65
  buildBedrockRuntimeSpanInfo,
66
+ collectAnthropicSession,
66
67
  configureInstrumentation,
67
68
  configureNode,
68
69
  constructLogs3OverflowRequest,
@@ -140,7 +141,7 @@ import {
140
141
  wrapMastraAgent,
141
142
  wrapTraced,
142
143
  zodToJsonSchema
143
- } from "./chunk-XIZOM2HO.mjs";
144
+ } from "./chunk-YKD22IMR.mjs";
144
145
  import {
145
146
  INSTRUMENTATION_NAMES,
146
147
  __export,
@@ -149,6 +150,7 @@ import {
149
150
  bedrockRuntimeChannels,
150
151
  claudeAgentSDKChannels,
151
152
  cloudflareAgentsChannels,
153
+ cloudflareThinkChannels,
152
154
  cohereChannels,
153
155
  cursorSDKChannels,
154
156
  genkitChannels,
@@ -163,6 +165,7 @@ import {
163
165
  isomorph_default,
164
166
  langSmithChannels,
165
167
  mistralChannels,
168
+ ollamaChannels,
166
169
  openAIChannels,
167
170
  openAICodexChannels,
168
171
  openRouterAgentChannels,
@@ -170,7 +173,7 @@ import {
170
173
  piCodingAgentChannels,
171
174
  strandsAgentSDKChannels,
172
175
  withSpanInstrumentationName
173
- } from "./chunk-PN7EWK66.mjs";
176
+ } from "./chunk-CZM5JIQL.mjs";
174
177
 
175
178
  // src/exports.ts
176
179
  var exports_exports = {};
@@ -244,6 +247,7 @@ __export(exports_exports, {
244
247
  braintrustFlueObserver: () => braintrustFlueObserver,
245
248
  braintrustStreamChunkSchema: () => braintrustStreamChunkSchema,
246
249
  buildLocalSummary: () => buildLocalSummary,
250
+ collectAnthropicSession: () => collectAnthropicSession,
247
251
  configureInstrumentation: () => configureInstrumentation,
248
252
  constructLogs3OverflowRequest: () => constructLogs3OverflowRequest,
249
253
  createFinalValuePassThroughStream: () => createFinalValuePassThroughStream,
@@ -323,6 +327,7 @@ __export(exports_exports, {
323
327
  wrapClaudeAgentSDK: () => wrapClaudeAgentSDK,
324
328
  wrapCloudflareAIChat: () => wrapCloudflareAIChat,
325
329
  wrapCloudflareAgent: () => wrapCloudflareAgent,
330
+ wrapCloudflareThink: () => wrapCloudflareThink,
326
331
  wrapCohere: () => wrapCohere,
327
332
  wrapCopilotClient: () => wrapCopilotClient,
328
333
  wrapCursorSDK: () => wrapCursorSDK,
@@ -337,6 +342,7 @@ __export(exports_exports, {
337
342
  wrapLangSmithTraceable: () => wrapLangSmithTraceable,
338
343
  wrapMastraAgent: () => wrapMastraAgent,
339
344
  wrapMistral: () => wrapMistral,
345
+ wrapOllama: () => wrapOllama,
340
346
  wrapOpenAI: () => wrapOpenAI,
341
347
  wrapOpenAICodexSDK: () => wrapOpenAICodexSDK,
342
348
  wrapOpenAIv4: () => wrapOpenAIv4,
@@ -3541,6 +3547,66 @@ function betaProxy(beta, anthropic) {
3541
3547
  if (prop === "messages") {
3542
3548
  return betaMessagesProxy(target.messages, anthropic);
3543
3549
  }
3550
+ if (prop === "sessions") {
3551
+ return target.sessions ? betaSessionsProxy(target.sessions) : target.sessions;
3552
+ }
3553
+ return Reflect.get(target, prop, receiver);
3554
+ }
3555
+ });
3556
+ }
3557
+ function betaSessionsProxy(sessions) {
3558
+ return new Proxy(sessions, {
3559
+ get(target, prop, receiver) {
3560
+ if (prop === "events") {
3561
+ return betaSessionEventsProxy(target.events);
3562
+ }
3563
+ if (prop === "threads") {
3564
+ return target.threads ? betaSessionThreadsProxy(target.threads) : target.threads;
3565
+ }
3566
+ return Reflect.get(target, prop, receiver);
3567
+ }
3568
+ });
3569
+ }
3570
+ function betaSessionEventsProxy(events) {
3571
+ return new Proxy(events, {
3572
+ get(target, prop, receiver) {
3573
+ if (prop === "stream") {
3574
+ return new TypedApplyProxy(target.stream, {
3575
+ apply(stream, thisArg, argArray) {
3576
+ return anthropicChannels.betaSessionsEventsStream.tracePromise(
3577
+ () => Reflect.apply(stream, thisArg, argArray),
3578
+ { arguments: argArray }
3579
+ );
3580
+ }
3581
+ });
3582
+ }
3583
+ return Reflect.get(target, prop, receiver);
3584
+ }
3585
+ });
3586
+ }
3587
+ function betaSessionThreadsProxy(threads) {
3588
+ return new Proxy(threads, {
3589
+ get(target, prop, receiver) {
3590
+ if (prop === "events") {
3591
+ return betaSessionThreadEventsProxy(target.events);
3592
+ }
3593
+ return Reflect.get(target, prop, receiver);
3594
+ }
3595
+ });
3596
+ }
3597
+ function betaSessionThreadEventsProxy(events) {
3598
+ return new Proxy(events, {
3599
+ get(target, prop, receiver) {
3600
+ if (prop === "stream") {
3601
+ return new TypedApplyProxy(target.stream, {
3602
+ apply(stream, thisArg, argArray) {
3603
+ return anthropicChannels.betaSessionsThreadsEventsStream.tracePromise(
3604
+ () => Reflect.apply(stream, thisArg, argArray),
3605
+ { arguments: argArray }
3606
+ );
3607
+ }
3608
+ });
3609
+ }
3544
3610
  return Reflect.get(target, prop, receiver);
3545
3611
  }
3546
3612
  });
@@ -3734,6 +3800,52 @@ function claudeAgentSDKProxy(sdk) {
3734
3800
  });
3735
3801
  }
3736
3802
 
3803
+ // src/wrappers/cloudflare-think.ts
3804
+ var WRAPPED_THINK = /* @__PURE__ */ Symbol.for("braintrust.cloudflare-think.wrapped");
3805
+ function wrapCloudflareThink(sdk) {
3806
+ if (!sdk || typeof sdk !== "object") {
3807
+ return sdk;
3808
+ }
3809
+ const thinkModule = sdk;
3810
+ if (typeof thinkModule.Think !== "function") {
3811
+ return sdk;
3812
+ }
3813
+ patchThinkClass(thinkModule.Think);
3814
+ return sdk;
3815
+ }
3816
+ function patchThinkClass(Think) {
3817
+ const prototype = Think.prototype;
3818
+ if (!prototype || prototype[WRAPPED_THINK]) {
3819
+ return;
3820
+ }
3821
+ const descriptor = Object.getOwnPropertyDescriptor(
3822
+ prototype,
3823
+ "_runInferenceLoop"
3824
+ );
3825
+ if (!descriptor || typeof descriptor.value !== "function") {
3826
+ return;
3827
+ }
3828
+ const original = descriptor.value;
3829
+ Object.defineProperty(prototype, "_runInferenceLoop", {
3830
+ ...descriptor,
3831
+ value: function wrappedCloudflareThinkRunInferenceLoop(input) {
3832
+ const args = [input];
3833
+ return cloudflareThinkChannels.runInferenceLoop.tracePromise(
3834
+ () => Reflect.apply(original, this, args),
3835
+ {
3836
+ arguments: args,
3837
+ self: this
3838
+ }
3839
+ );
3840
+ }
3841
+ });
3842
+ Object.defineProperty(prototype, WRAPPED_THINK, {
3843
+ configurable: false,
3844
+ enumerable: false,
3845
+ value: true
3846
+ });
3847
+ }
3848
+
3737
3849
  // src/wrappers/openai-codex.ts
3738
3850
  var WRAPPED_CLIENT = /* @__PURE__ */ Symbol.for("braintrust.openai-codex.wrapped-client");
3739
3851
  var WRAPPED_THREAD = /* @__PURE__ */ Symbol.for("braintrust.openai-codex.wrapped-thread");
@@ -4026,14 +4138,9 @@ function patchAgentSessionClass(AgentSession) {
4026
4138
  ...descriptor,
4027
4139
  value: function wrappedPiCodingAgentPrompt(text, options) {
4028
4140
  const args = [text, options];
4029
- return piCodingAgentChannels.prompt.tracePromise(
4030
- () => Reflect.apply(originalPrompt, this, args),
4031
- {
4032
- arguments: args,
4033
- self: this,
4034
- session: this
4035
- }
4036
- );
4141
+ return piCodingAgentChannels.prompt.invoke(originalPrompt, this, args, {
4142
+ session: this
4143
+ });
4037
4144
  }
4038
4145
  });
4039
4146
  Object.defineProperty(prototype, WRAPPED_PROMPT, {
@@ -5473,6 +5580,83 @@ function wrapAgentsStream(stream) {
5473
5580
  });
5474
5581
  }
5475
5582
 
5583
+ // src/wrappers/ollama.ts
5584
+ function wrapOllama(ollama) {
5585
+ if (isSupportedOllamaClient(ollama)) {
5586
+ return ollamaProxy(ollama);
5587
+ }
5588
+ debugLogger.warn("Unsupported Ollama library. Not wrapping.");
5589
+ return ollama;
5590
+ }
5591
+ var ollamaProxyCache = /* @__PURE__ */ new WeakMap();
5592
+ function isSupportedOllamaClient(value) {
5593
+ return isObject(value) && ["chat", "generate", "embed"].some(
5594
+ (name) => typeof value[name] === "function"
5595
+ );
5596
+ }
5597
+ function ollamaProxy(ollama) {
5598
+ const cached = ollamaProxyCache.get(ollama);
5599
+ if (cached) {
5600
+ return cached;
5601
+ }
5602
+ let chatSource;
5603
+ let wrappedChat;
5604
+ let generateSource;
5605
+ let wrappedGenerate;
5606
+ let embedSource;
5607
+ let wrappedEmbed;
5608
+ const proxy = new Proxy(ollama, {
5609
+ get(target, prop, receiver) {
5610
+ switch (prop) {
5611
+ case "chat": {
5612
+ const source = target.chat;
5613
+ if (source !== chatSource) {
5614
+ chatSource = source;
5615
+ wrappedChat = typeof source === "function" ? wrapChat(source.bind(target)) : source;
5616
+ }
5617
+ return wrappedChat;
5618
+ }
5619
+ case "generate": {
5620
+ const source = target.generate;
5621
+ if (source !== generateSource) {
5622
+ generateSource = source;
5623
+ wrappedGenerate = typeof source === "function" ? wrapGenerate2(source.bind(target)) : source;
5624
+ }
5625
+ return wrappedGenerate;
5626
+ }
5627
+ case "embed": {
5628
+ const source = target.embed;
5629
+ if (source !== embedSource) {
5630
+ embedSource = source;
5631
+ wrappedEmbed = typeof source === "function" ? wrapEmbed3(source.bind(target)) : source;
5632
+ }
5633
+ return wrappedEmbed;
5634
+ }
5635
+ default:
5636
+ return Reflect.get(target, prop, receiver);
5637
+ }
5638
+ }
5639
+ });
5640
+ ollamaProxyCache.set(ollama, proxy);
5641
+ ollamaProxyCache.set(proxy, proxy);
5642
+ return proxy;
5643
+ }
5644
+ function wrapChat(chat) {
5645
+ return (request) => ollamaChannels.chat.tracePromise(() => chat(request), {
5646
+ arguments: [request]
5647
+ });
5648
+ }
5649
+ function wrapGenerate2(generate) {
5650
+ return (request) => ollamaChannels.generate.tracePromise(() => generate(request), {
5651
+ arguments: [request]
5652
+ });
5653
+ }
5654
+ function wrapEmbed3(embed) {
5655
+ return (request) => ollamaChannels.embed.tracePromise(() => embed(request), {
5656
+ arguments: [request]
5657
+ });
5658
+ }
5659
+
5476
5660
  // src/wrappers/cohere.ts
5477
5661
  function wrapCohere(cohere) {
5478
5662
  if (isSupportedCohereClient(cohere)) {
@@ -5503,11 +5687,11 @@ function cohereProxy(cohere) {
5503
5687
  get(target, prop, receiver) {
5504
5688
  switch (prop) {
5505
5689
  case "chat":
5506
- return typeof target.chat === "function" ? wrapChat(target.chat.bind(target)) : target.chat;
5690
+ return typeof target.chat === "function" ? wrapChat2(target.chat.bind(target)) : target.chat;
5507
5691
  case "chatStream":
5508
5692
  return typeof target.chatStream === "function" ? wrapChatStream2(target.chatStream.bind(target)) : target.chatStream;
5509
5693
  case "embed":
5510
- return typeof target.embed === "function" ? wrapEmbed3(target.embed.bind(target)) : target.embed;
5694
+ return typeof target.embed === "function" ? wrapEmbed4(target.embed.bind(target)) : target.embed;
5511
5695
  case "rerank":
5512
5696
  return typeof target.rerank === "function" ? wrapRerank3(target.rerank.bind(target)) : target.rerank;
5513
5697
  default: {
@@ -5520,7 +5704,7 @@ function cohereProxy(cohere) {
5520
5704
  cohereProxyCache.set(cohere, proxy);
5521
5705
  return proxy;
5522
5706
  }
5523
- function wrapChat(chat) {
5707
+ function wrapChat2(chat) {
5524
5708
  return (request, options) => cohereChannels.chat.tracePromise(() => chat(request, options), {
5525
5709
  arguments: [request]
5526
5710
  });
@@ -5530,7 +5714,7 @@ function wrapChatStream2(chatStream) {
5530
5714
  arguments: [request]
5531
5715
  });
5532
5716
  }
5533
- function wrapEmbed3(embed) {
5717
+ function wrapEmbed4(embed) {
5534
5718
  return (request, options) => cohereChannels.embed.tracePromise(() => embed(request, options), {
5535
5719
  arguments: [request]
5536
5720
  });
@@ -10382,6 +10566,7 @@ export {
10382
10566
  braintrustFlueObserver,
10383
10567
  braintrustStreamChunkSchema,
10384
10568
  buildLocalSummary,
10569
+ collectAnthropicSession,
10385
10570
  configureInstrumentation,
10386
10571
  constructLogs3OverflowRequest,
10387
10572
  createFinalValuePassThroughStream,
@@ -10462,6 +10647,7 @@ export {
10462
10647
  wrapClaudeAgentSDK,
10463
10648
  wrapCloudflareAIChat,
10464
10649
  wrapCloudflareAgent,
10650
+ wrapCloudflareThink,
10465
10651
  wrapCohere,
10466
10652
  wrapCopilotClient,
10467
10653
  wrapCursorSDK,
@@ -10476,6 +10662,7 @@ export {
10476
10662
  wrapLangSmithTraceable,
10477
10663
  wrapMastraAgent,
10478
10664
  wrapMistral,
10665
+ wrapOllama,
10479
10666
  wrapOpenAI,
10480
10667
  wrapOpenAICodexSDK,
10481
10668
  wrapOpenAIv4,
@@ -6857,6 +6857,7 @@ interface InstrumentationIntegrationsConfig {
6857
6857
  huggingface?: boolean;
6858
6858
  claudeAgentSDK?: boolean;
6859
6859
  cloudflareAIChat?: boolean;
6860
+ cloudflareThink?: boolean;
6860
6861
  cursor?: boolean;
6861
6862
  cursorSDK?: boolean;
6862
6863
  flue?: boolean;
@@ -6865,6 +6866,7 @@ interface InstrumentationIntegrationsConfig {
6865
6866
  openrouter?: boolean;
6866
6867
  openrouterAgent?: boolean;
6867
6868
  mistral?: boolean;
6869
+ ollama?: boolean;
6868
6870
  cohere?: boolean;
6869
6871
  groq?: boolean;
6870
6872
  bedrock?: boolean;
@@ -6903,6 +6905,7 @@ interface BraintrustPluginConfig {
6903
6905
  * - HuggingFace Inference SDK
6904
6906
  * - LangChain.js and LangGraph
6905
6907
  * - Mistral SDK
6908
+ * - Ollama SDK
6906
6909
  * - Cohere SDK
6907
6910
  *
6908
6911
  * The plugin is automatically enabled when the Braintrust library is loaded.
@@ -6915,6 +6918,7 @@ declare class BraintrustPlugin extends BasePlugin {
6915
6918
  private anthropicPlugin;
6916
6919
  private aiSDKPlugin;
6917
6920
  private claudeAgentSDKPlugin;
6921
+ private cloudflareThinkPlugin;
6918
6922
  private cursorSDKPlugin;
6919
6923
  private openAIAgentsPlugin;
6920
6924
  private googleGenAIPlugin;
@@ -6923,6 +6927,7 @@ declare class BraintrustPlugin extends BasePlugin {
6923
6927
  private openRouterPlugin;
6924
6928
  private openRouterAgentPlugin;
6925
6929
  private mistralPlugin;
6930
+ private ollamaPlugin;
6926
6931
  private googleADKPlugin;
6927
6932
  private coherePlugin;
6928
6933
  private groqPlugin;
@@ -9042,6 +9047,9 @@ type FlueExecutionOperation = {
9042
9047
  } | {
9043
9048
  type: "task";
9044
9049
  taskId: string;
9050
+ } | {
9051
+ type: "coordinator";
9052
+ phase: "reconcile";
9045
9053
  };
9046
9054
  interface FlueTraceCarrier {
9047
9055
  traceparent: string;
@@ -6857,6 +6857,7 @@ interface InstrumentationIntegrationsConfig {
6857
6857
  huggingface?: boolean;
6858
6858
  claudeAgentSDK?: boolean;
6859
6859
  cloudflareAIChat?: boolean;
6860
+ cloudflareThink?: boolean;
6860
6861
  cursor?: boolean;
6861
6862
  cursorSDK?: boolean;
6862
6863
  flue?: boolean;
@@ -6865,6 +6866,7 @@ interface InstrumentationIntegrationsConfig {
6865
6866
  openrouter?: boolean;
6866
6867
  openrouterAgent?: boolean;
6867
6868
  mistral?: boolean;
6869
+ ollama?: boolean;
6868
6870
  cohere?: boolean;
6869
6871
  groq?: boolean;
6870
6872
  bedrock?: boolean;
@@ -6903,6 +6905,7 @@ interface BraintrustPluginConfig {
6903
6905
  * - HuggingFace Inference SDK
6904
6906
  * - LangChain.js and LangGraph
6905
6907
  * - Mistral SDK
6908
+ * - Ollama SDK
6906
6909
  * - Cohere SDK
6907
6910
  *
6908
6911
  * The plugin is automatically enabled when the Braintrust library is loaded.
@@ -6915,6 +6918,7 @@ declare class BraintrustPlugin extends BasePlugin {
6915
6918
  private anthropicPlugin;
6916
6919
  private aiSDKPlugin;
6917
6920
  private claudeAgentSDKPlugin;
6921
+ private cloudflareThinkPlugin;
6918
6922
  private cursorSDKPlugin;
6919
6923
  private openAIAgentsPlugin;
6920
6924
  private googleGenAIPlugin;
@@ -6923,6 +6927,7 @@ declare class BraintrustPlugin extends BasePlugin {
6923
6927
  private openRouterPlugin;
6924
6928
  private openRouterAgentPlugin;
6925
6929
  private mistralPlugin;
6930
+ private ollamaPlugin;
6926
6931
  private googleADKPlugin;
6927
6932
  private coherePlugin;
6928
6933
  private groqPlugin;
@@ -9042,6 +9047,9 @@ type FlueExecutionOperation = {
9042
9047
  } | {
9043
9048
  type: "task";
9044
9049
  taskId: string;
9050
+ } | {
9051
+ type: "coordinator";
9052
+ phase: "reconcile";
9045
9053
  };
9046
9054
  interface FlueTraceCarrier {
9047
9055
  traceparent: string;