braintrust 3.0.0 → 3.1.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.
package/dist/index.mjs CHANGED
@@ -6497,6 +6497,7 @@ function init(projectOrOptions, optionalOptions) {
6497
6497
  forceLogin,
6498
6498
  fetch: fetch2,
6499
6499
  metadata,
6500
+ tags,
6500
6501
  gitMetadataSettings,
6501
6502
  projectId,
6502
6503
  baseExperimentId,
@@ -6609,6 +6610,10 @@ function init(projectOrOptions, optionalOptions) {
6609
6610
  if (metadata) {
6610
6611
  args["metadata"] = metadata;
6611
6612
  }
6613
+ if (tags) {
6614
+ validateTags(tags);
6615
+ args["tags"] = tags;
6616
+ }
6612
6617
  let response = null;
6613
6618
  while (true) {
6614
6619
  try {
@@ -7555,6 +7560,7 @@ function validateTags(tags) {
7555
7560
  if (seen.has(tag)) {
7556
7561
  throw new Error(`duplicate tag: ${tag}`);
7557
7562
  }
7563
+ seen.add(tag);
7558
7564
  }
7559
7565
  }
7560
7566
  function validateAndSanitizeExperimentLogPartialArgs(event) {
@@ -9279,6 +9285,7 @@ var _exportsForTestingOnly = {
9279
9285
  isGeneratorFunction,
9280
9286
  isAsyncGeneratorFunction,
9281
9287
  resetIdGenStateForTests,
9288
+ validateTags,
9282
9289
  isomorph: isomorph_default
9283
9290
  // Expose isomorph for build type detection
9284
9291
  };
@@ -10630,9 +10637,13 @@ var makeGenerateTextWrapper = (name, options, generateText, aiSDK) => {
10630
10637
  const processedInput = await processInputAttachments2(params);
10631
10638
  return traced(
10632
10639
  async (span) => {
10640
+ const { wrappedModel, getMetrics } = wrapModelAndGetMetrics(
10641
+ params.model,
10642
+ aiSDK
10643
+ );
10633
10644
  const result = await generateText({
10634
10645
  ...params,
10635
- model: wrapModel(params.model, aiSDK),
10646
+ model: wrappedModel,
10636
10647
  tools: wrapTools(params.tools)
10637
10648
  });
10638
10649
  const gatewayInfo = extractGatewayRoutingInfo(result);
@@ -10645,7 +10656,7 @@ var makeGenerateTextWrapper = (name, options, generateText, aiSDK) => {
10645
10656
  }
10646
10657
  span.log({
10647
10658
  output: await processOutput(result, options.denyOutputPaths),
10648
- metrics: extractTokenMetrics(result),
10659
+ metrics: getMetrics(result),
10649
10660
  ...Object.keys(resolvedMetadata).length > 0 ? { metadata: resolvedMetadata } : {}
10650
10661
  });
10651
10662
  return result;
@@ -10866,6 +10877,14 @@ var wrapModel = (model, ai) => {
10866
10877
  var wrapGenerateText = (generateText, options = {}, aiSDK) => {
10867
10878
  return makeGenerateTextWrapper("generateText", options, generateText, aiSDK);
10868
10879
  };
10880
+ var wrapModelAndGetMetrics = (model, aiSDK) => {
10881
+ const wrappedModel = wrapModel(model, aiSDK);
10882
+ const modelIsWrapped = wrappedModel?._braintrustWrapped === true;
10883
+ return {
10884
+ wrappedModel,
10885
+ getMetrics: (result) => modelIsWrapped ? void 0 : extractTokenMetrics(result)
10886
+ };
10887
+ };
10869
10888
  var wrapGenerateObject = (generateObject, options = {}, aiSDK) => {
10870
10889
  return async function generateObjectWrapper(allParams) {
10871
10890
  const { span_info, ...params } = allParams;
@@ -10878,9 +10897,13 @@ var wrapGenerateObject = (generateObject, options = {}, aiSDK) => {
10878
10897
  const processedInput = await processInputAttachments2(params);
10879
10898
  return traced(
10880
10899
  async (span) => {
10900
+ const { wrappedModel, getMetrics } = wrapModelAndGetMetrics(
10901
+ params.model,
10902
+ aiSDK
10903
+ );
10881
10904
  const result = await generateObject({
10882
10905
  ...params,
10883
- model: wrapModel(params.model, aiSDK),
10906
+ model: wrappedModel,
10884
10907
  tools: wrapTools(params.tools)
10885
10908
  });
10886
10909
  const output = await processOutput(result, options.denyOutputPaths);
@@ -10894,7 +10917,7 @@ var wrapGenerateObject = (generateObject, options = {}, aiSDK) => {
10894
10917
  }
10895
10918
  span.log({
10896
10919
  output,
10897
- metrics: extractTokenMetrics(result),
10920
+ metrics: getMetrics(result),
10898
10921
  ...Object.keys(resolvedMetadata).length > 0 ? { metadata: resolvedMetadata } : {}
10899
10922
  });
10900
10923
  return result;
@@ -10959,11 +10982,15 @@ var makeStreamTextWrapper = (name, options, streamText, aiSDK) => {
10959
10982
  try {
10960
10983
  const startTime = Date.now();
10961
10984
  let receivedFirst = false;
10985
+ const { wrappedModel, getMetrics } = wrapModelAndGetMetrics(
10986
+ params.model,
10987
+ aiSDK
10988
+ );
10962
10989
  const result = withCurrent(
10963
10990
  span,
10964
10991
  () => streamText({
10965
10992
  ...params,
10966
- model: wrapModel(params.model, aiSDK),
10993
+ model: wrappedModel,
10967
10994
  tools: wrapTools(params.tools),
10968
10995
  onChunk: (chunk) => {
10969
10996
  if (!receivedFirst) {
@@ -10988,7 +11015,7 @@ var makeStreamTextWrapper = (name, options, streamText, aiSDK) => {
10988
11015
  }
10989
11016
  span.log({
10990
11017
  output: await processOutput(event, options.denyOutputPaths),
10991
- metrics: extractTokenMetrics(event),
11018
+ metrics: getMetrics(event),
10992
11019
  ...Object.keys(resolvedMetadata).length > 0 ? { metadata: resolvedMetadata } : {}
10993
11020
  });
10994
11021
  span.end();
@@ -11083,11 +11110,15 @@ var wrapStreamObject = (streamObject, options = {}, aiSDK) => {
11083
11110
  try {
11084
11111
  const startTime = Date.now();
11085
11112
  let receivedFirst = false;
11113
+ const { wrappedModel, getMetrics } = wrapModelAndGetMetrics(
11114
+ params.model,
11115
+ aiSDK
11116
+ );
11086
11117
  const result = withCurrent(
11087
11118
  span,
11088
11119
  () => streamObject({
11089
11120
  ...params,
11090
- model: wrapModel(params.model, aiSDK),
11121
+ model: wrappedModel,
11091
11122
  tools: wrapTools(params.tools),
11092
11123
  onChunk: (chunk) => {
11093
11124
  if (!receivedFirst) {
@@ -11112,7 +11143,7 @@ var wrapStreamObject = (streamObject, options = {}, aiSDK) => {
11112
11143
  }
11113
11144
  span.log({
11114
11145
  output: await processOutput(event, options.denyOutputPaths),
11115
- metrics: extractTokenMetrics(event),
11146
+ metrics: getMetrics(event),
11116
11147
  ...Object.keys(resolvedMetadata).length > 0 ? { metadata: resolvedMetadata } : {}
11117
11148
  });
11118
11149
  span.end();
@@ -15706,6 +15737,7 @@ async function Eval(name, evaluator, reporterOrOpts) {
15706
15737
  experiment: evaluator.experimentName,
15707
15738
  description: evaluator.description,
15708
15739
  metadata: evaluator.metadata,
15740
+ tags: evaluator.tags,
15709
15741
  isPublic: evaluator.isPublic,
15710
15742
  update: evaluator.update,
15711
15743
  baseExperiment: evaluator.baseExperimentName ?? defaultBaseExperiment,
package/dist/workerd.js CHANGED
@@ -6429,6 +6429,7 @@ function init(projectOrOptions, optionalOptions) {
6429
6429
  forceLogin,
6430
6430
  fetch: fetch2,
6431
6431
  metadata,
6432
+ tags,
6432
6433
  gitMetadataSettings,
6433
6434
  projectId,
6434
6435
  baseExperimentId,
@@ -6541,6 +6542,10 @@ function init(projectOrOptions, optionalOptions) {
6541
6542
  if (metadata) {
6542
6543
  args["metadata"] = metadata;
6543
6544
  }
6545
+ if (tags) {
6546
+ validateTags(tags);
6547
+ args["tags"] = tags;
6548
+ }
6544
6549
  let response = null;
6545
6550
  while (true) {
6546
6551
  try {
@@ -7487,6 +7492,7 @@ function validateTags(tags) {
7487
7492
  if (seen.has(tag)) {
7488
7493
  throw new Error(`duplicate tag: ${tag}`);
7489
7494
  }
7495
+ seen.add(tag);
7490
7496
  }
7491
7497
  }
7492
7498
  function validateAndSanitizeExperimentLogPartialArgs(event) {
@@ -9211,6 +9217,7 @@ var _exportsForTestingOnly = {
9211
9217
  isGeneratorFunction,
9212
9218
  isAsyncGeneratorFunction,
9213
9219
  resetIdGenStateForTests,
9220
+ validateTags,
9214
9221
  isomorph: isomorph_default
9215
9222
  // Expose isomorph for build type detection
9216
9223
  };
@@ -10559,9 +10566,13 @@ var makeGenerateTextWrapper = (name, options, generateText, aiSDK) => {
10559
10566
  const processedInput = await processInputAttachments2(params);
10560
10567
  return traced(
10561
10568
  async (span) => {
10569
+ const { wrappedModel, getMetrics } = wrapModelAndGetMetrics(
10570
+ params.model,
10571
+ aiSDK
10572
+ );
10562
10573
  const result = await generateText({
10563
10574
  ...params,
10564
- model: wrapModel(params.model, aiSDK),
10575
+ model: wrappedModel,
10565
10576
  tools: wrapTools(params.tools)
10566
10577
  });
10567
10578
  const gatewayInfo = extractGatewayRoutingInfo(result);
@@ -10574,7 +10585,7 @@ var makeGenerateTextWrapper = (name, options, generateText, aiSDK) => {
10574
10585
  }
10575
10586
  span.log({
10576
10587
  output: await processOutput(result, options.denyOutputPaths),
10577
- metrics: extractTokenMetrics(result),
10588
+ metrics: getMetrics(result),
10578
10589
  ...Object.keys(resolvedMetadata).length > 0 ? { metadata: resolvedMetadata } : {}
10579
10590
  });
10580
10591
  return result;
@@ -10795,6 +10806,14 @@ var wrapModel = (model, ai) => {
10795
10806
  var wrapGenerateText = (generateText, options = {}, aiSDK) => {
10796
10807
  return makeGenerateTextWrapper("generateText", options, generateText, aiSDK);
10797
10808
  };
10809
+ var wrapModelAndGetMetrics = (model, aiSDK) => {
10810
+ const wrappedModel = wrapModel(model, aiSDK);
10811
+ const modelIsWrapped = wrappedModel?._braintrustWrapped === true;
10812
+ return {
10813
+ wrappedModel,
10814
+ getMetrics: (result) => modelIsWrapped ? void 0 : extractTokenMetrics(result)
10815
+ };
10816
+ };
10798
10817
  var wrapGenerateObject = (generateObject, options = {}, aiSDK) => {
10799
10818
  return async function generateObjectWrapper(allParams) {
10800
10819
  const { span_info, ...params } = allParams;
@@ -10807,9 +10826,13 @@ var wrapGenerateObject = (generateObject, options = {}, aiSDK) => {
10807
10826
  const processedInput = await processInputAttachments2(params);
10808
10827
  return traced(
10809
10828
  async (span) => {
10829
+ const { wrappedModel, getMetrics } = wrapModelAndGetMetrics(
10830
+ params.model,
10831
+ aiSDK
10832
+ );
10810
10833
  const result = await generateObject({
10811
10834
  ...params,
10812
- model: wrapModel(params.model, aiSDK),
10835
+ model: wrappedModel,
10813
10836
  tools: wrapTools(params.tools)
10814
10837
  });
10815
10838
  const output = await processOutput(result, options.denyOutputPaths);
@@ -10823,7 +10846,7 @@ var wrapGenerateObject = (generateObject, options = {}, aiSDK) => {
10823
10846
  }
10824
10847
  span.log({
10825
10848
  output,
10826
- metrics: extractTokenMetrics(result),
10849
+ metrics: getMetrics(result),
10827
10850
  ...Object.keys(resolvedMetadata).length > 0 ? { metadata: resolvedMetadata } : {}
10828
10851
  });
10829
10852
  return result;
@@ -10888,11 +10911,15 @@ var makeStreamTextWrapper = (name, options, streamText, aiSDK) => {
10888
10911
  try {
10889
10912
  const startTime = Date.now();
10890
10913
  let receivedFirst = false;
10914
+ const { wrappedModel, getMetrics } = wrapModelAndGetMetrics(
10915
+ params.model,
10916
+ aiSDK
10917
+ );
10891
10918
  const result = withCurrent(
10892
10919
  span,
10893
10920
  () => streamText({
10894
10921
  ...params,
10895
- model: wrapModel(params.model, aiSDK),
10922
+ model: wrappedModel,
10896
10923
  tools: wrapTools(params.tools),
10897
10924
  onChunk: (chunk) => {
10898
10925
  if (!receivedFirst) {
@@ -10917,7 +10944,7 @@ var makeStreamTextWrapper = (name, options, streamText, aiSDK) => {
10917
10944
  }
10918
10945
  span.log({
10919
10946
  output: await processOutput(event, options.denyOutputPaths),
10920
- metrics: extractTokenMetrics(event),
10947
+ metrics: getMetrics(event),
10921
10948
  ...Object.keys(resolvedMetadata).length > 0 ? { metadata: resolvedMetadata } : {}
10922
10949
  });
10923
10950
  span.end();
@@ -11012,11 +11039,15 @@ var wrapStreamObject = (streamObject, options = {}, aiSDK) => {
11012
11039
  try {
11013
11040
  const startTime = Date.now();
11014
11041
  let receivedFirst = false;
11042
+ const { wrappedModel, getMetrics } = wrapModelAndGetMetrics(
11043
+ params.model,
11044
+ aiSDK
11045
+ );
11015
11046
  const result = withCurrent(
11016
11047
  span,
11017
11048
  () => streamObject({
11018
11049
  ...params,
11019
- model: wrapModel(params.model, aiSDK),
11050
+ model: wrappedModel,
11020
11051
  tools: wrapTools(params.tools),
11021
11052
  onChunk: (chunk) => {
11022
11053
  if (!receivedFirst) {
@@ -11041,7 +11072,7 @@ var wrapStreamObject = (streamObject, options = {}, aiSDK) => {
11041
11072
  }
11042
11073
  span.log({
11043
11074
  output: await processOutput(event, options.denyOutputPaths),
11044
- metrics: extractTokenMetrics(event),
11075
+ metrics: getMetrics(event),
11045
11076
  ...Object.keys(resolvedMetadata).length > 0 ? { metadata: resolvedMetadata } : {}
11046
11077
  });
11047
11078
  span.end();
@@ -15635,6 +15666,7 @@ async function Eval(name, evaluator, reporterOrOpts) {
15635
15666
  experiment: evaluator.experimentName,
15636
15667
  description: evaluator.description,
15637
15668
  metadata: evaluator.metadata,
15669
+ tags: evaluator.tags,
15638
15670
  isPublic: evaluator.isPublic,
15639
15671
  update: evaluator.update,
15640
15672
  baseExperiment: evaluator.baseExperimentName ?? defaultBaseExperiment,
package/dist/workerd.mjs CHANGED
@@ -6273,6 +6273,7 @@ function init(projectOrOptions, optionalOptions) {
6273
6273
  forceLogin,
6274
6274
  fetch: fetch2,
6275
6275
  metadata,
6276
+ tags,
6276
6277
  gitMetadataSettings,
6277
6278
  projectId,
6278
6279
  baseExperimentId,
@@ -6385,6 +6386,10 @@ function init(projectOrOptions, optionalOptions) {
6385
6386
  if (metadata) {
6386
6387
  args["metadata"] = metadata;
6387
6388
  }
6389
+ if (tags) {
6390
+ validateTags(tags);
6391
+ args["tags"] = tags;
6392
+ }
6388
6393
  let response = null;
6389
6394
  while (true) {
6390
6395
  try {
@@ -7331,6 +7336,7 @@ function validateTags(tags) {
7331
7336
  if (seen.has(tag)) {
7332
7337
  throw new Error(`duplicate tag: ${tag}`);
7333
7338
  }
7339
+ seen.add(tag);
7334
7340
  }
7335
7341
  }
7336
7342
  function validateAndSanitizeExperimentLogPartialArgs(event) {
@@ -9055,6 +9061,7 @@ var _exportsForTestingOnly = {
9055
9061
  isGeneratorFunction,
9056
9062
  isAsyncGeneratorFunction,
9057
9063
  resetIdGenStateForTests,
9064
+ validateTags,
9058
9065
  isomorph: isomorph_default
9059
9066
  // Expose isomorph for build type detection
9060
9067
  };
@@ -10403,9 +10410,13 @@ var makeGenerateTextWrapper = (name, options, generateText, aiSDK) => {
10403
10410
  const processedInput = await processInputAttachments2(params);
10404
10411
  return traced(
10405
10412
  async (span) => {
10413
+ const { wrappedModel, getMetrics } = wrapModelAndGetMetrics(
10414
+ params.model,
10415
+ aiSDK
10416
+ );
10406
10417
  const result = await generateText({
10407
10418
  ...params,
10408
- model: wrapModel(params.model, aiSDK),
10419
+ model: wrappedModel,
10409
10420
  tools: wrapTools(params.tools)
10410
10421
  });
10411
10422
  const gatewayInfo = extractGatewayRoutingInfo(result);
@@ -10418,7 +10429,7 @@ var makeGenerateTextWrapper = (name, options, generateText, aiSDK) => {
10418
10429
  }
10419
10430
  span.log({
10420
10431
  output: await processOutput(result, options.denyOutputPaths),
10421
- metrics: extractTokenMetrics(result),
10432
+ metrics: getMetrics(result),
10422
10433
  ...Object.keys(resolvedMetadata).length > 0 ? { metadata: resolvedMetadata } : {}
10423
10434
  });
10424
10435
  return result;
@@ -10639,6 +10650,14 @@ var wrapModel = (model, ai) => {
10639
10650
  var wrapGenerateText = (generateText, options = {}, aiSDK) => {
10640
10651
  return makeGenerateTextWrapper("generateText", options, generateText, aiSDK);
10641
10652
  };
10653
+ var wrapModelAndGetMetrics = (model, aiSDK) => {
10654
+ const wrappedModel = wrapModel(model, aiSDK);
10655
+ const modelIsWrapped = wrappedModel?._braintrustWrapped === true;
10656
+ return {
10657
+ wrappedModel,
10658
+ getMetrics: (result) => modelIsWrapped ? void 0 : extractTokenMetrics(result)
10659
+ };
10660
+ };
10642
10661
  var wrapGenerateObject = (generateObject, options = {}, aiSDK) => {
10643
10662
  return async function generateObjectWrapper(allParams) {
10644
10663
  const { span_info, ...params } = allParams;
@@ -10651,9 +10670,13 @@ var wrapGenerateObject = (generateObject, options = {}, aiSDK) => {
10651
10670
  const processedInput = await processInputAttachments2(params);
10652
10671
  return traced(
10653
10672
  async (span) => {
10673
+ const { wrappedModel, getMetrics } = wrapModelAndGetMetrics(
10674
+ params.model,
10675
+ aiSDK
10676
+ );
10654
10677
  const result = await generateObject({
10655
10678
  ...params,
10656
- model: wrapModel(params.model, aiSDK),
10679
+ model: wrappedModel,
10657
10680
  tools: wrapTools(params.tools)
10658
10681
  });
10659
10682
  const output = await processOutput(result, options.denyOutputPaths);
@@ -10667,7 +10690,7 @@ var wrapGenerateObject = (generateObject, options = {}, aiSDK) => {
10667
10690
  }
10668
10691
  span.log({
10669
10692
  output,
10670
- metrics: extractTokenMetrics(result),
10693
+ metrics: getMetrics(result),
10671
10694
  ...Object.keys(resolvedMetadata).length > 0 ? { metadata: resolvedMetadata } : {}
10672
10695
  });
10673
10696
  return result;
@@ -10732,11 +10755,15 @@ var makeStreamTextWrapper = (name, options, streamText, aiSDK) => {
10732
10755
  try {
10733
10756
  const startTime = Date.now();
10734
10757
  let receivedFirst = false;
10758
+ const { wrappedModel, getMetrics } = wrapModelAndGetMetrics(
10759
+ params.model,
10760
+ aiSDK
10761
+ );
10735
10762
  const result = withCurrent(
10736
10763
  span,
10737
10764
  () => streamText({
10738
10765
  ...params,
10739
- model: wrapModel(params.model, aiSDK),
10766
+ model: wrappedModel,
10740
10767
  tools: wrapTools(params.tools),
10741
10768
  onChunk: (chunk) => {
10742
10769
  if (!receivedFirst) {
@@ -10761,7 +10788,7 @@ var makeStreamTextWrapper = (name, options, streamText, aiSDK) => {
10761
10788
  }
10762
10789
  span.log({
10763
10790
  output: await processOutput(event, options.denyOutputPaths),
10764
- metrics: extractTokenMetrics(event),
10791
+ metrics: getMetrics(event),
10765
10792
  ...Object.keys(resolvedMetadata).length > 0 ? { metadata: resolvedMetadata } : {}
10766
10793
  });
10767
10794
  span.end();
@@ -10856,11 +10883,15 @@ var wrapStreamObject = (streamObject, options = {}, aiSDK) => {
10856
10883
  try {
10857
10884
  const startTime = Date.now();
10858
10885
  let receivedFirst = false;
10886
+ const { wrappedModel, getMetrics } = wrapModelAndGetMetrics(
10887
+ params.model,
10888
+ aiSDK
10889
+ );
10859
10890
  const result = withCurrent(
10860
10891
  span,
10861
10892
  () => streamObject({
10862
10893
  ...params,
10863
- model: wrapModel(params.model, aiSDK),
10894
+ model: wrappedModel,
10864
10895
  tools: wrapTools(params.tools),
10865
10896
  onChunk: (chunk) => {
10866
10897
  if (!receivedFirst) {
@@ -10885,7 +10916,7 @@ var wrapStreamObject = (streamObject, options = {}, aiSDK) => {
10885
10916
  }
10886
10917
  span.log({
10887
10918
  output: await processOutput(event, options.denyOutputPaths),
10888
- metrics: extractTokenMetrics(event),
10919
+ metrics: getMetrics(event),
10889
10920
  ...Object.keys(resolvedMetadata).length > 0 ? { metadata: resolvedMetadata } : {}
10890
10921
  });
10891
10922
  span.end();
@@ -15479,6 +15510,7 @@ async function Eval(name, evaluator, reporterOrOpts) {
15479
15510
  experiment: evaluator.experimentName,
15480
15511
  description: evaluator.description,
15481
15512
  metadata: evaluator.metadata,
15513
+ tags: evaluator.tags,
15482
15514
  isPublic: evaluator.isPublic,
15483
15515
  update: evaluator.update,
15484
15516
  baseExperiment: evaluator.baseExperimentName ?? defaultBaseExperiment,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braintrust",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "SDK for integrating Braintrust",
5
5
  "repository": {
6
6
  "type": "git",