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.js 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 = _optionalChain([wrappedModel, 'optionalAccess', _162 => _162._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,23 +10897,27 @@ 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);
10887
10910
  const gatewayInfo = extractGatewayRoutingInfo(result);
10888
10911
  const resolvedMetadata = {};
10889
- if (_optionalChain([gatewayInfo, 'optionalAccess', _162 => _162.provider])) {
10912
+ if (_optionalChain([gatewayInfo, 'optionalAccess', _163 => _163.provider])) {
10890
10913
  resolvedMetadata.provider = gatewayInfo.provider;
10891
10914
  }
10892
- if (_optionalChain([gatewayInfo, 'optionalAccess', _163 => _163.model])) {
10915
+ if (_optionalChain([gatewayInfo, 'optionalAccess', _164 => _164.model])) {
10893
10916
  resolvedMetadata.model = gatewayInfo.model;
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) {
@@ -10974,27 +11001,27 @@ var makeStreamTextWrapper = (name, options, streamText, aiSDK) => {
10974
11001
  }
10975
11002
  });
10976
11003
  }
10977
- _optionalChain([params, 'access', _164 => _164.onChunk, 'optionalCall', _165 => _165(chunk)]);
11004
+ _optionalChain([params, 'access', _165 => _165.onChunk, 'optionalCall', _166 => _166(chunk)]);
10978
11005
  },
10979
11006
  onFinish: async (event) => {
10980
- _optionalChain([params, 'access', _166 => _166.onFinish, 'optionalCall', _167 => _167(event)]);
11007
+ _optionalChain([params, 'access', _167 => _167.onFinish, 'optionalCall', _168 => _168(event)]);
10981
11008
  const gatewayInfo = extractGatewayRoutingInfo(event);
10982
11009
  const resolvedMetadata = {};
10983
- if (_optionalChain([gatewayInfo, 'optionalAccess', _168 => _168.provider])) {
11010
+ if (_optionalChain([gatewayInfo, 'optionalAccess', _169 => _169.provider])) {
10984
11011
  resolvedMetadata.provider = gatewayInfo.provider;
10985
11012
  }
10986
- if (_optionalChain([gatewayInfo, 'optionalAccess', _169 => _169.model])) {
11013
+ if (_optionalChain([gatewayInfo, 'optionalAccess', _170 => _170.model])) {
10987
11014
  resolvedMetadata.model = gatewayInfo.model;
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();
10995
11022
  },
10996
11023
  onError: async (err) => {
10997
- _optionalChain([params, 'access', _170 => _170.onError, 'optionalCall', _171 => _171(err)]);
11024
+ _optionalChain([params, 'access', _171 => _171.onError, 'optionalCall', _172 => _172(err)]);
10998
11025
  span.log({
10999
11026
  error: serializeError(err)
11000
11027
  });
@@ -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) {
@@ -11098,27 +11129,27 @@ var wrapStreamObject = (streamObject, options = {}, aiSDK) => {
11098
11129
  }
11099
11130
  });
11100
11131
  }
11101
- _optionalChain([params, 'access', _172 => _172.onChunk, 'optionalCall', _173 => _173(chunk)]);
11132
+ _optionalChain([params, 'access', _173 => _173.onChunk, 'optionalCall', _174 => _174(chunk)]);
11102
11133
  },
11103
11134
  onFinish: async (event) => {
11104
- _optionalChain([params, 'access', _174 => _174.onFinish, 'optionalCall', _175 => _175(event)]);
11135
+ _optionalChain([params, 'access', _175 => _175.onFinish, 'optionalCall', _176 => _176(event)]);
11105
11136
  const gatewayInfo = extractGatewayRoutingInfo(event);
11106
11137
  const resolvedMetadata = {};
11107
- if (_optionalChain([gatewayInfo, 'optionalAccess', _176 => _176.provider])) {
11138
+ if (_optionalChain([gatewayInfo, 'optionalAccess', _177 => _177.provider])) {
11108
11139
  resolvedMetadata.provider = gatewayInfo.provider;
11109
11140
  }
11110
- if (_optionalChain([gatewayInfo, 'optionalAccess', _177 => _177.model])) {
11141
+ if (_optionalChain([gatewayInfo, 'optionalAccess', _178 => _178.model])) {
11111
11142
  resolvedMetadata.model = gatewayInfo.model;
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();
11119
11150
  },
11120
11151
  onError: async (err) => {
11121
- _optionalChain([params, 'access', _178 => _178.onError, 'optionalCall', _179 => _179(err)]);
11152
+ _optionalChain([params, 'access', _179 => _179.onError, 'optionalCall', _180 => _180(err)]);
11122
11153
  span.log({
11123
11154
  error: serializeError(err)
11124
11155
  });
@@ -11299,8 +11330,8 @@ function parseGatewayModelString(modelString) {
11299
11330
  return { model: modelString };
11300
11331
  }
11301
11332
  function serializeModelWithProvider(model) {
11302
- const modelId = typeof model === "string" ? model : _optionalChain([model, 'optionalAccess', _180 => _180.modelId]);
11303
- const explicitProvider = typeof model === "object" ? _optionalChain([model, 'optionalAccess', _181 => _181.provider]) : void 0;
11333
+ const modelId = typeof model === "string" ? model : _optionalChain([model, 'optionalAccess', _181 => _181.modelId]);
11334
+ const explicitProvider = typeof model === "object" ? _optionalChain([model, 'optionalAccess', _182 => _182.provider]) : void 0;
11304
11335
  if (!modelId) {
11305
11336
  return { model: modelId, provider: explicitProvider };
11306
11337
  }
@@ -11311,8 +11342,8 @@ function serializeModelWithProvider(model) {
11311
11342
  };
11312
11343
  }
11313
11344
  function extractGatewayRoutingInfo(result) {
11314
- if (_optionalChain([result, 'optionalAccess', _182 => _182.steps]) && Array.isArray(result.steps) && result.steps.length > 0) {
11315
- const routing2 = _optionalChain([result, 'access', _183 => _183.steps, 'access', _184 => _184[0], 'optionalAccess', _185 => _185.providerMetadata, 'optionalAccess', _186 => _186.gateway, 'optionalAccess', _187 => _187.routing]);
11345
+ if (_optionalChain([result, 'optionalAccess', _183 => _183.steps]) && Array.isArray(result.steps) && result.steps.length > 0) {
11346
+ const routing2 = _optionalChain([result, 'access', _184 => _184.steps, 'access', _185 => _185[0], 'optionalAccess', _186 => _186.providerMetadata, 'optionalAccess', _187 => _187.gateway, 'optionalAccess', _188 => _188.routing]);
11316
11347
  if (routing2) {
11317
11348
  return {
11318
11349
  provider: routing2.resolvedProvider || routing2.finalProvider,
@@ -11320,7 +11351,7 @@ function extractGatewayRoutingInfo(result) {
11320
11351
  };
11321
11352
  }
11322
11353
  }
11323
- const routing = _optionalChain([result, 'optionalAccess', _188 => _188.providerMetadata, 'optionalAccess', _189 => _189.gateway, 'optionalAccess', _190 => _190.routing]);
11354
+ const routing = _optionalChain([result, 'optionalAccess', _189 => _189.providerMetadata, 'optionalAccess', _190 => _190.gateway, 'optionalAccess', _191 => _191.routing]);
11324
11355
  if (routing) {
11325
11356
  return {
11326
11357
  provider: routing.resolvedProvider || routing.finalProvider,
@@ -11592,7 +11623,7 @@ var convertImageToAttachment = (image, explicitMimeType) => {
11592
11623
  try {
11593
11624
  if (typeof image === "string" && image.startsWith("data:")) {
11594
11625
  const [mimeTypeSection, base64Data] = image.split(",");
11595
- const mimeType = _optionalChain([mimeTypeSection, 'access', _191 => _191.match, 'call', _192 => _192(/data:(.*?);/), 'optionalAccess', _193 => _193[1]]);
11626
+ const mimeType = _optionalChain([mimeTypeSection, 'access', _192 => _192.match, 'call', _193 => _193(/data:(.*?);/), 'optionalAccess', _194 => _194[1]]);
11596
11627
  if (mimeType && base64Data) {
11597
11628
  const blob = convertDataToBlob(base64Data, mimeType);
11598
11629
  if (blob) {
@@ -11759,7 +11790,7 @@ function firstNumber(...values) {
11759
11790
  }
11760
11791
  function extractTokenMetrics(result) {
11761
11792
  const metrics = {};
11762
- let usage = _optionalChain([result, 'optionalAccess', _194 => _194.totalUsage]) || _optionalChain([result, 'optionalAccess', _195 => _195.usage]);
11793
+ let usage = _optionalChain([result, 'optionalAccess', _195 => _195.totalUsage]) || _optionalChain([result, 'optionalAccess', _196 => _196.usage]);
11763
11794
  if (!usage && result) {
11764
11795
  try {
11765
11796
  if ("totalUsage" in result && typeof result.totalUsage !== "function") {
@@ -11774,7 +11805,7 @@ function extractTokenMetrics(result) {
11774
11805
  return metrics;
11775
11806
  }
11776
11807
  const promptTokens = firstNumber(
11777
- _optionalChain([usage, 'access', _196 => _196.inputTokens, 'optionalAccess', _197 => _197.total]),
11808
+ _optionalChain([usage, 'access', _197 => _197.inputTokens, 'optionalAccess', _198 => _198.total]),
11778
11809
  usage.inputTokens,
11779
11810
  usage.promptTokens,
11780
11811
  usage.prompt_tokens
@@ -11783,7 +11814,7 @@ function extractTokenMetrics(result) {
11783
11814
  metrics.prompt_tokens = promptTokens;
11784
11815
  }
11785
11816
  const completionTokens = firstNumber(
11786
- _optionalChain([usage, 'access', _198 => _198.outputTokens, 'optionalAccess', _199 => _199.total]),
11817
+ _optionalChain([usage, 'access', _199 => _199.outputTokens, 'optionalAccess', _200 => _200.total]),
11787
11818
  usage.outputTokens,
11788
11819
  usage.completionTokens,
11789
11820
  usage.completion_tokens
@@ -11800,7 +11831,7 @@ function extractTokenMetrics(result) {
11800
11831
  metrics.tokens = totalTokens;
11801
11832
  }
11802
11833
  const promptCachedTokens = firstNumber(
11803
- _optionalChain([usage, 'access', _200 => _200.inputTokens, 'optionalAccess', _201 => _201.cacheRead]),
11834
+ _optionalChain([usage, 'access', _201 => _201.inputTokens, 'optionalAccess', _202 => _202.cacheRead]),
11804
11835
  usage.cachedInputTokens,
11805
11836
  usage.promptCachedTokens,
11806
11837
  usage.prompt_cached_tokens
@@ -11830,7 +11861,7 @@ function extractTokenMetrics(result) {
11830
11861
  metrics.completion_cached_tokens = completionCachedTokens;
11831
11862
  }
11832
11863
  const reasoningTokenCount = firstNumber(
11833
- _optionalChain([usage, 'access', _202 => _202.outputTokens, 'optionalAccess', _203 => _203.reasoning]),
11864
+ _optionalChain([usage, 'access', _203 => _203.outputTokens, 'optionalAccess', _204 => _204.reasoning]),
11834
11865
  usage.reasoningTokens,
11835
11866
  usage.completionReasoningTokens,
11836
11867
  usage.completion_reasoning_tokens,
@@ -11856,12 +11887,12 @@ function extractTokenMetrics(result) {
11856
11887
  return metrics;
11857
11888
  }
11858
11889
  function extractCostFromResult(result) {
11859
- if (_optionalChain([result, 'optionalAccess', _204 => _204.steps]) && Array.isArray(result.steps) && result.steps.length > 0) {
11890
+ if (_optionalChain([result, 'optionalAccess', _205 => _205.steps]) && Array.isArray(result.steps) && result.steps.length > 0) {
11860
11891
  let totalCost = 0;
11861
11892
  let foundCost = false;
11862
11893
  for (const step of result.steps) {
11863
- const gateway2 = _optionalChain([step, 'optionalAccess', _205 => _205.providerMetadata, 'optionalAccess', _206 => _206.gateway]);
11864
- const stepCost = parseGatewayCost(_optionalChain([gateway2, 'optionalAccess', _207 => _207.cost])) || parseGatewayCost(_optionalChain([gateway2, 'optionalAccess', _208 => _208.marketCost]));
11894
+ const gateway2 = _optionalChain([step, 'optionalAccess', _206 => _206.providerMetadata, 'optionalAccess', _207 => _207.gateway]);
11895
+ const stepCost = parseGatewayCost(_optionalChain([gateway2, 'optionalAccess', _208 => _208.cost])) || parseGatewayCost(_optionalChain([gateway2, 'optionalAccess', _209 => _209.marketCost]));
11865
11896
  if (stepCost !== void 0 && stepCost > 0) {
11866
11897
  totalCost += stepCost;
11867
11898
  foundCost = true;
@@ -11871,8 +11902,8 @@ function extractCostFromResult(result) {
11871
11902
  return totalCost;
11872
11903
  }
11873
11904
  }
11874
- const gateway = _optionalChain([result, 'optionalAccess', _209 => _209.providerMetadata, 'optionalAccess', _210 => _210.gateway]);
11875
- const directCost = parseGatewayCost(_optionalChain([gateway, 'optionalAccess', _211 => _211.cost])) || parseGatewayCost(_optionalChain([gateway, 'optionalAccess', _212 => _212.marketCost]));
11905
+ const gateway = _optionalChain([result, 'optionalAccess', _210 => _210.providerMetadata, 'optionalAccess', _211 => _211.gateway]);
11906
+ const directCost = parseGatewayCost(_optionalChain([gateway, 'optionalAccess', _212 => _212.cost])) || parseGatewayCost(_optionalChain([gateway, 'optionalAccess', _213 => _213.marketCost]));
11876
11907
  if (directCost !== void 0 && directCost > 0) {
11877
11908
  return directCost;
11878
11909
  }
@@ -11966,7 +11997,7 @@ var omit = (obj, paths) => {
11966
11997
  // src/wrappers/ai-sdk/deprecated/wrapAISDKModel.ts
11967
11998
  function wrapAISDKModel(model) {
11968
11999
  const m = model;
11969
- if (_optionalChain([m, 'optionalAccess', _213 => _213.specificationVersion]) === "v1" && typeof _optionalChain([m, 'optionalAccess', _214 => _214.provider]) === "string" && typeof _optionalChain([m, 'optionalAccess', _215 => _215.modelId]) === "string") {
12000
+ if (_optionalChain([m, 'optionalAccess', _214 => _214.specificationVersion]) === "v1" && typeof _optionalChain([m, 'optionalAccess', _215 => _215.provider]) === "string" && typeof _optionalChain([m, 'optionalAccess', _216 => _216.modelId]) === "string") {
11970
12001
  return new BraintrustLanguageModelWrapper(m);
11971
12002
  } else {
11972
12003
  console.warn("Unsupported AI SDK model. Not wrapping.");
@@ -12023,10 +12054,10 @@ var BraintrustLanguageModelWrapper = class {
12023
12054
  metrics: {
12024
12055
  time_to_first_token: getCurrentUnixTimestamp() - startTime,
12025
12056
  tokens: !isEmpty2(ret.usage) ? ret.usage.promptTokens + ret.usage.completionTokens : void 0,
12026
- prompt_tokens: _optionalChain([ret, 'access', _216 => _216.usage, 'optionalAccess', _217 => _217.promptTokens]),
12027
- completion_tokens: _optionalChain([ret, 'access', _218 => _218.usage, 'optionalAccess', _219 => _219.completionTokens]),
12057
+ prompt_tokens: _optionalChain([ret, 'access', _217 => _217.usage, 'optionalAccess', _218 => _218.promptTokens]),
12058
+ completion_tokens: _optionalChain([ret, 'access', _219 => _219.usage, 'optionalAccess', _220 => _220.completionTokens]),
12028
12059
  cached: parseCachedHeader(
12029
- _nullishCoalesce(_optionalChain([ret, 'access', _220 => _220.rawResponse, 'optionalAccess', _221 => _221.headers, 'optionalAccess', _222 => _222[X_CACHED_HEADER]]), () => ( _optionalChain([ret, 'access', _223 => _223.rawResponse, 'optionalAccess', _224 => _224.headers, 'optionalAccess', _225 => _225[LEGACY_CACHED_HEADER]])))
12060
+ _nullishCoalesce(_optionalChain([ret, 'access', _221 => _221.rawResponse, 'optionalAccess', _222 => _222.headers, 'optionalAccess', _223 => _223[X_CACHED_HEADER]]), () => ( _optionalChain([ret, 'access', _224 => _224.rawResponse, 'optionalAccess', _225 => _225.headers, 'optionalAccess', _226 => _226[LEGACY_CACHED_HEADER]])))
12030
12061
  )
12031
12062
  }
12032
12063
  });
@@ -12118,10 +12149,10 @@ var BraintrustLanguageModelWrapper = class {
12118
12149
  metrics: {
12119
12150
  time_to_first_token,
12120
12151
  tokens: !isEmpty2(usage) ? usage.promptTokens + usage.completionTokens : void 0,
12121
- prompt_tokens: _optionalChain([usage, 'optionalAccess', _226 => _226.promptTokens]),
12122
- completion_tokens: _optionalChain([usage, 'optionalAccess', _227 => _227.completionTokens]),
12152
+ prompt_tokens: _optionalChain([usage, 'optionalAccess', _227 => _227.promptTokens]),
12153
+ completion_tokens: _optionalChain([usage, 'optionalAccess', _228 => _228.completionTokens]),
12123
12154
  cached: parseCachedHeader(
12124
- _nullishCoalesce(_optionalChain([ret, 'access', _228 => _228.rawResponse, 'optionalAccess', _229 => _229.headers, 'optionalAccess', _230 => _230[X_CACHED_HEADER]]), () => ( _optionalChain([ret, 'access', _231 => _231.rawResponse, 'optionalAccess', _232 => _232.headers, 'optionalAccess', _233 => _233[LEGACY_CACHED_HEADER]])))
12155
+ _nullishCoalesce(_optionalChain([ret, 'access', _229 => _229.rawResponse, 'optionalAccess', _230 => _230.headers, 'optionalAccess', _231 => _231[X_CACHED_HEADER]]), () => ( _optionalChain([ret, 'access', _232 => _232.rawResponse, 'optionalAccess', _233 => _233.headers, 'optionalAccess', _234 => _234[LEGACY_CACHED_HEADER]])))
12125
12156
  )
12126
12157
  }
12127
12158
  });
@@ -12165,7 +12196,7 @@ function postProcessPrompt(prompt) {
12165
12196
  return [
12166
12197
  {
12167
12198
  role: "assistant",
12168
- content: _optionalChain([textPart, 'optionalAccess', _234 => _234.text]),
12199
+ content: _optionalChain([textPart, 'optionalAccess', _235 => _235.text]),
12169
12200
  ...toolCallParts.length > 0 ? {
12170
12201
  tool_calls: toolCallParts.map((part) => ({
12171
12202
  id: part.toolCallId,
@@ -12258,23 +12289,23 @@ function extractAnthropicCacheTokens(cacheReadTokens = 0, cacheCreationTokens =
12258
12289
 
12259
12290
  // src/wrappers/ai-sdk/deprecated/BraintrustMiddleware.ts
12260
12291
  function detectProviderFromResult(result) {
12261
- if (!_optionalChain([result, 'optionalAccess', _235 => _235.providerMetadata])) {
12292
+ if (!_optionalChain([result, 'optionalAccess', _236 => _236.providerMetadata])) {
12262
12293
  return void 0;
12263
12294
  }
12264
12295
  const keys = Object.keys(result.providerMetadata);
12265
- return _optionalChain([keys, 'optionalAccess', _236 => _236.at, 'call', _237 => _237(0)]);
12296
+ return _optionalChain([keys, 'optionalAccess', _237 => _237.at, 'call', _238 => _238(0)]);
12266
12297
  }
12267
12298
  function extractModelFromResult(result) {
12268
- if (_optionalChain([result, 'optionalAccess', _238 => _238.response, 'optionalAccess', _239 => _239.modelId])) {
12299
+ if (_optionalChain([result, 'optionalAccess', _239 => _239.response, 'optionalAccess', _240 => _240.modelId])) {
12269
12300
  return result.response.modelId;
12270
12301
  }
12271
- if (_optionalChain([result, 'optionalAccess', _240 => _240.request, 'optionalAccess', _241 => _241.body, 'optionalAccess', _242 => _242.model])) {
12302
+ if (_optionalChain([result, 'optionalAccess', _241 => _241.request, 'optionalAccess', _242 => _242.body, 'optionalAccess', _243 => _243.model])) {
12272
12303
  return result.request.body.model;
12273
12304
  }
12274
12305
  return void 0;
12275
12306
  }
12276
12307
  function extractModelFromWrapGenerateCallback(model) {
12277
- return _optionalChain([model, 'optionalAccess', _243 => _243.modelId]);
12308
+ return _optionalChain([model, 'optionalAccess', _244 => _244.modelId]);
12278
12309
  }
12279
12310
  function camelToSnake(str) {
12280
12311
  return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
@@ -12319,7 +12350,7 @@ function normalizeUsageMetrics(usage, provider, providerMetadata) {
12319
12350
  metrics.prompt_cached_tokens = cachedInputTokens;
12320
12351
  }
12321
12352
  if (provider === "anthropic") {
12322
- const anthropicMetadata = _optionalChain([providerMetadata, 'optionalAccess', _244 => _244.anthropic]);
12353
+ const anthropicMetadata = _optionalChain([providerMetadata, 'optionalAccess', _245 => _245.anthropic]);
12323
12354
  if (anthropicMetadata) {
12324
12355
  const cacheReadTokens = getNumberProperty(anthropicMetadata.usage, "cache_read_input_tokens") || 0;
12325
12356
  const cacheCreationTokens = getNumberProperty(
@@ -12345,7 +12376,7 @@ function buildAssistantOutputWithToolCalls(result, toolCalls) {
12345
12376
  {
12346
12377
  index: 0,
12347
12378
  logprobs: null,
12348
- finish_reason: _nullishCoalesce(normalizeFinishReason(_optionalChain([result, 'optionalAccess', _245 => _245.finishReason])), () => ( (toolCalls.length ? "tool_calls" : void 0))),
12379
+ finish_reason: _nullishCoalesce(normalizeFinishReason(_optionalChain([result, 'optionalAccess', _246 => _246.finishReason])), () => ( (toolCalls.length ? "tool_calls" : void 0))),
12349
12380
  message: {
12350
12381
  role: "assistant",
12351
12382
  tool_calls: toolCalls.length > 0 ? toolCalls : void 0
@@ -12358,7 +12389,7 @@ function extractToolCallsFromSteps(steps) {
12358
12389
  if (!Array.isArray(steps)) return toolCalls;
12359
12390
  let idx = 0;
12360
12391
  for (const step of steps) {
12361
- const blocks = _optionalChain([step, 'optionalAccess', _246 => _246.content]);
12392
+ const blocks = _optionalChain([step, 'optionalAccess', _247 => _247.content]);
12362
12393
  if (!Array.isArray(blocks)) continue;
12363
12394
  for (const block of blocks) {
12364
12395
  if (block && typeof block === "object" && block.type === "tool-call") {
@@ -12381,7 +12412,7 @@ function extractToolCallsFromBlocks(blocks) {
12381
12412
  return extractToolCallsFromSteps([{ content: blocks }]);
12382
12413
  }
12383
12414
  function extractInput(params) {
12384
- return _nullishCoalesce(_nullishCoalesce(_optionalChain([params, 'optionalAccess', _247 => _247.prompt]), () => ( _optionalChain([params, 'optionalAccess', _248 => _248.messages]))), () => ( _optionalChain([params, 'optionalAccess', _249 => _249.system])));
12415
+ return _nullishCoalesce(_nullishCoalesce(_optionalChain([params, 'optionalAccess', _248 => _248.prompt]), () => ( _optionalChain([params, 'optionalAccess', _249 => _249.messages]))), () => ( _optionalChain([params, 'optionalAccess', _250 => _250.system])));
12385
12416
  }
12386
12417
  var V2_EXCLUDE_KEYS = /* @__PURE__ */ new Set([
12387
12418
  "prompt",
@@ -12405,16 +12436,16 @@ function BraintrustMiddleware(config = {}) {
12405
12436
  const rawInput = extractInput(params);
12406
12437
  const processedInput = processInputAttachments(rawInput);
12407
12438
  const spanArgs = {
12408
- name: _optionalChain([config, 'access', _250 => _250.spanInfo, 'optionalAccess', _251 => _251.name]) || "ai-sdk.doGenerate",
12439
+ name: _optionalChain([config, 'access', _251 => _251.spanInfo, 'optionalAccess', _252 => _252.name]) || "ai-sdk.doGenerate",
12409
12440
  spanAttributes: {
12410
12441
  type: "llm" /* LLM */,
12411
- ..._optionalChain([config, 'access', _252 => _252.spanInfo, 'optionalAccess', _253 => _253.spanAttributes]) || {}
12442
+ ..._optionalChain([config, 'access', _253 => _253.spanInfo, 'optionalAccess', _254 => _254.spanAttributes]) || {}
12412
12443
  },
12413
12444
  event: {
12414
12445
  input: processedInput,
12415
12446
  metadata: {
12416
12447
  ...extractModelParameters(params, V2_EXCLUDE_KEYS),
12417
- ..._optionalChain([config, 'access', _254 => _254.spanInfo, 'optionalAccess', _255 => _255.metadata]) || {}
12448
+ ..._optionalChain([config, 'access', _255 => _255.spanInfo, 'optionalAccess', _256 => _256.metadata]) || {}
12418
12449
  }
12419
12450
  }
12420
12451
  };
@@ -12440,12 +12471,12 @@ function BraintrustMiddleware(config = {}) {
12440
12471
  metadata.model = modelId;
12441
12472
  }
12442
12473
  }
12443
- let toolCalls = extractToolCallsFromSteps(_optionalChain([result, 'optionalAccess', _256 => _256.steps]));
12474
+ let toolCalls = extractToolCallsFromSteps(_optionalChain([result, 'optionalAccess', _257 => _257.steps]));
12444
12475
  if (!toolCalls || toolCalls.length === 0) {
12445
- toolCalls = extractToolCallsFromBlocks(_optionalChain([result, 'optionalAccess', _257 => _257.content]));
12476
+ toolCalls = extractToolCallsFromBlocks(_optionalChain([result, 'optionalAccess', _258 => _258.content]));
12446
12477
  }
12447
12478
  span.log({
12448
- output: toolCalls.length > 0 ? buildAssistantOutputWithToolCalls(result, toolCalls) : _optionalChain([result, 'optionalAccess', _258 => _258.content]),
12479
+ output: toolCalls.length > 0 ? buildAssistantOutputWithToolCalls(result, toolCalls) : _optionalChain([result, 'optionalAccess', _259 => _259.content]),
12449
12480
  metadata,
12450
12481
  metrics: normalizeUsageMetrics(
12451
12482
  result.usage,
@@ -12467,16 +12498,16 @@ function BraintrustMiddleware(config = {}) {
12467
12498
  const rawInput = extractInput(params);
12468
12499
  const processedInput = processInputAttachments(rawInput);
12469
12500
  const spanArgs = {
12470
- name: _optionalChain([config, 'access', _259 => _259.spanInfo, 'optionalAccess', _260 => _260.name]) || "ai-sdk.doStream",
12501
+ name: _optionalChain([config, 'access', _260 => _260.spanInfo, 'optionalAccess', _261 => _261.name]) || "ai-sdk.doStream",
12471
12502
  spanAttributes: {
12472
12503
  type: "llm" /* LLM */,
12473
- ..._optionalChain([config, 'access', _261 => _261.spanInfo, 'optionalAccess', _262 => _262.spanAttributes]) || {}
12504
+ ..._optionalChain([config, 'access', _262 => _262.spanInfo, 'optionalAccess', _263 => _263.spanAttributes]) || {}
12474
12505
  },
12475
12506
  event: {
12476
12507
  input: processedInput,
12477
12508
  metadata: {
12478
12509
  ...extractModelParameters(params, V2_EXCLUDE_KEYS),
12479
- ..._optionalChain([config, 'access', _263 => _263.spanInfo, 'optionalAccess', _264 => _264.metadata]) || {}
12510
+ ..._optionalChain([config, 'access', _264 => _264.spanInfo, 'optionalAccess', _265 => _265.metadata]) || {}
12480
12511
  }
12481
12512
  }
12482
12513
  };
@@ -12747,9 +12778,9 @@ function streamNextProxy(stream, sspan) {
12747
12778
  }
12748
12779
  const item = result.value;
12749
12780
  const blockIndex = item.index;
12750
- switch (_optionalChain([item, 'optionalAccess', _265 => _265.type])) {
12781
+ switch (_optionalChain([item, 'optionalAccess', _266 => _266.type])) {
12751
12782
  case "message_start":
12752
- const msg = _optionalChain([item, 'optionalAccess', _266 => _266.message]);
12783
+ const msg = _optionalChain([item, 'optionalAccess', _267 => _267.message]);
12753
12784
  if (msg) {
12754
12785
  const event = parseEventFromMessage(msg);
12755
12786
  totals = { ...totals, ...event.metrics };
@@ -12766,23 +12797,23 @@ function streamNextProxy(stream, sspan) {
12766
12797
  if (!contentBlockDeltas[blockIndex]) {
12767
12798
  contentBlockDeltas[blockIndex] = [];
12768
12799
  }
12769
- if (_optionalChain([item, 'optionalAccess', _267 => _267.delta, 'optionalAccess', _268 => _268.type]) === "text_delta") {
12770
- const text2 = _optionalChain([item, 'optionalAccess', _269 => _269.delta, 'optionalAccess', _270 => _270.text]);
12800
+ if (_optionalChain([item, 'optionalAccess', _268 => _268.delta, 'optionalAccess', _269 => _269.type]) === "text_delta") {
12801
+ const text2 = _optionalChain([item, 'optionalAccess', _270 => _270.delta, 'optionalAccess', _271 => _271.text]);
12771
12802
  if (text2) {
12772
12803
  contentBlockDeltas[blockIndex].push(text2);
12773
12804
  }
12774
- } else if (_optionalChain([item, 'optionalAccess', _271 => _271.delta, 'optionalAccess', _272 => _272.type]) === "input_json_delta") {
12775
- const partialJson = _optionalChain([item, 'optionalAccess', _273 => _273.delta, 'optionalAccess', _274 => _274.partial_json]);
12805
+ } else if (_optionalChain([item, 'optionalAccess', _272 => _272.delta, 'optionalAccess', _273 => _273.type]) === "input_json_delta") {
12806
+ const partialJson = _optionalChain([item, 'optionalAccess', _274 => _274.delta, 'optionalAccess', _275 => _275.partial_json]);
12776
12807
  if (partialJson) {
12777
12808
  contentBlockDeltas[blockIndex].push(partialJson);
12778
12809
  }
12779
12810
  }
12780
12811
  break;
12781
12812
  case "content_block_stop":
12782
- const text = _optionalChain([contentBlockDeltas, 'access', _275 => _275[blockIndex], 'optionalAccess', _276 => _276.join, 'call', _277 => _277("")]);
12813
+ const text = _optionalChain([contentBlockDeltas, 'access', _276 => _276[blockIndex], 'optionalAccess', _277 => _277.join, 'call', _278 => _278("")]);
12783
12814
  if (!text) break;
12784
12815
  const block = contentBlocks[blockIndex];
12785
- if (_optionalChain([block, 'optionalAccess', _278 => _278.type]) === "tool_use") {
12816
+ if (_optionalChain([block, 'optionalAccess', _279 => _279.type]) === "tool_use") {
12786
12817
  try {
12787
12818
  span.log({
12788
12819
  output: {
@@ -12798,12 +12829,12 @@ function streamNextProxy(stream, sspan) {
12798
12829
  }
12799
12830
  break;
12800
12831
  case "message_delta":
12801
- const usage = _optionalChain([item, 'optionalAccess', _279 => _279.usage]);
12832
+ const usage = _optionalChain([item, 'optionalAccess', _280 => _280.usage]);
12802
12833
  if (usage) {
12803
12834
  const metrics = parseMetricsFromUsage2(usage);
12804
12835
  totals = { ...totals, ...metrics };
12805
12836
  }
12806
- const delta = _optionalChain([item, 'optionalAccess', _280 => _280.delta]);
12837
+ const delta = _optionalChain([item, 'optionalAccess', _281 => _281.delta]);
12807
12838
  if (delta) {
12808
12839
  metadata = { ...metadata, ...delta };
12809
12840
  }
@@ -12816,7 +12847,7 @@ function streamNextProxy(stream, sspan) {
12816
12847
  }
12817
12848
  function parseEventFromMessage(message) {
12818
12849
  const output = message ? { role: message.role, content: message.content } : null;
12819
- const metrics = parseMetricsFromUsage2(_optionalChain([message, 'optionalAccess', _281 => _281.usage]));
12850
+ const metrics = parseMetricsFromUsage2(_optionalChain([message, 'optionalAccess', _282 => _282.usage]));
12820
12851
  const metas = ["stop_reason", "stop_sequence"];
12821
12852
  const metadata = {};
12822
12853
  for (const m of metas) {
@@ -12990,17 +13021,17 @@ function createToolTracingHooks(resolveParentSpan, activeToolSpans, mcpServers,
12990
13021
  try {
12991
13022
  const response = input.tool_response;
12992
13023
  const metadata = {};
12993
- if (_optionalChain([response, 'optionalAccess', _282 => _282.status])) {
13024
+ if (_optionalChain([response, 'optionalAccess', _283 => _283.status])) {
12994
13025
  metadata["claude_agent_sdk.status"] = response.status;
12995
13026
  }
12996
- if (_optionalChain([response, 'optionalAccess', _283 => _283.totalDurationMs])) {
13027
+ if (_optionalChain([response, 'optionalAccess', _284 => _284.totalDurationMs])) {
12997
13028
  metadata["claude_agent_sdk.duration_ms"] = response.totalDurationMs;
12998
13029
  }
12999
- if (_optionalChain([response, 'optionalAccess', _284 => _284.totalToolUseCount]) !== void 0) {
13030
+ if (_optionalChain([response, 'optionalAccess', _285 => _285.totalToolUseCount]) !== void 0) {
13000
13031
  metadata["claude_agent_sdk.tool_use_count"] = response.totalToolUseCount;
13001
13032
  }
13002
13033
  subAgentSpan.log({
13003
- output: _optionalChain([response, 'optionalAccess', _285 => _285.content]),
13034
+ output: _optionalChain([response, 'optionalAccess', _286 => _286.content]),
13004
13035
  metadata
13005
13036
  });
13006
13037
  } finally {
@@ -13139,7 +13170,7 @@ function wrapClaudeAgentQuery(queryFn, defaultThis) {
13139
13170
  yield msg;
13140
13171
  }
13141
13172
  } finally {
13142
- _optionalChain([resolvePromptDone, 'optionalCall', _286 => _286()]);
13173
+ _optionalChain([resolvePromptDone, 'optionalCall', _287 => _287()]);
13143
13174
  }
13144
13175
  })();
13145
13176
  promptForQuery = capturingPrompt;
@@ -13161,7 +13192,7 @@ function wrapClaudeAgentQuery(queryFn, defaultThis) {
13161
13192
  let currentMessageStartTime = getCurrentUnixTimestamp();
13162
13193
  const currentMessages = [];
13163
13194
  const createLLMSpan = async () => {
13164
- const parentToolUseId = _nullishCoalesce(_optionalChain([currentMessages, 'access', _287 => _287[0], 'optionalAccess', _288 => _288.parent_tool_use_id]), () => ( null));
13195
+ const parentToolUseId = _nullishCoalesce(_optionalChain([currentMessages, 'access', _288 => _288[0], 'optionalAccess', _289 => _289.parent_tool_use_id]), () => ( null));
13165
13196
  let parentSpanExport;
13166
13197
  if (parentToolUseId) {
13167
13198
  const subAgentSpan = subAgentSpans.get(parentToolUseId);
@@ -13182,7 +13213,7 @@ function wrapClaudeAgentQuery(queryFn, defaultThis) {
13182
13213
  finalResults.push(finalMessageContent);
13183
13214
  }
13184
13215
  const lastMessage = currentMessages[currentMessages.length - 1];
13185
- if (_optionalChain([lastMessage, 'optionalAccess', _289 => _289.message, 'optionalAccess', _290 => _290.usage])) {
13216
+ if (_optionalChain([lastMessage, 'optionalAccess', _290 => _290.message, 'optionalAccess', _291 => _291.usage])) {
13186
13217
  const outputTokens = getNumberProperty2(lastMessage.message.usage, "output_tokens") || 0;
13187
13218
  accumulatedOutputTokens += outputTokens;
13188
13219
  }
@@ -13226,12 +13257,12 @@ function wrapClaudeAgentQuery(queryFn, defaultThis) {
13226
13257
  try {
13227
13258
  for await (const message of originalGenerator) {
13228
13259
  const currentTime = getCurrentUnixTimestamp();
13229
- if (message.type === "assistant" && Array.isArray(_optionalChain([message, 'access', _291 => _291.message, 'optionalAccess', _292 => _292.content]))) {
13260
+ if (message.type === "assistant" && Array.isArray(_optionalChain([message, 'access', _292 => _292.message, 'optionalAccess', _293 => _293.content]))) {
13230
13261
  const parentToolUseId = _nullishCoalesce(message.parent_tool_use_id, () => ( null));
13231
13262
  for (const block of message.message.content) {
13232
13263
  if (block.type === "tool_use" && block.id) {
13233
13264
  toolUseToParent.set(block.id, parentToolUseId);
13234
- if (block.name === "Task" && _optionalChain([block, 'access', _293 => _293.input, 'optionalAccess', _294 => _294.subagent_type])) {
13265
+ if (block.name === "Task" && _optionalChain([block, 'access', _294 => _294.input, 'optionalAccess', _295 => _295.subagent_type])) {
13235
13266
  pendingSubAgentNames.set(
13236
13267
  block.id,
13237
13268
  block.input.subagent_type
@@ -13261,20 +13292,20 @@ function wrapClaudeAgentQuery(queryFn, defaultThis) {
13261
13292
  subAgentSpans.set(parentToolUseId, subAgentSpan);
13262
13293
  }
13263
13294
  }
13264
- const messageId = _optionalChain([message, 'access', _295 => _295.message, 'optionalAccess', _296 => _296.id]);
13295
+ const messageId = _optionalChain([message, 'access', _296 => _296.message, 'optionalAccess', _297 => _297.id]);
13265
13296
  if (messageId && messageId !== currentMessageId) {
13266
13297
  await createLLMSpan();
13267
13298
  currentMessageId = messageId;
13268
13299
  currentMessageStartTime = currentTime;
13269
13300
  }
13270
- if (message.type === "assistant" && _optionalChain([message, 'access', _297 => _297.message, 'optionalAccess', _298 => _298.usage])) {
13301
+ if (message.type === "assistant" && _optionalChain([message, 'access', _298 => _298.message, 'optionalAccess', _299 => _299.usage])) {
13271
13302
  currentMessages.push(message);
13272
13303
  }
13273
13304
  if (message.type === "result" && message.usage) {
13274
13305
  finalUsageMetrics = _extractUsageFromMessage(message);
13275
13306
  if (currentMessages.length > 0 && finalUsageMetrics.completion_tokens !== void 0) {
13276
13307
  const lastMessage = currentMessages[currentMessages.length - 1];
13277
- if (_optionalChain([lastMessage, 'optionalAccess', _299 => _299.message, 'optionalAccess', _300 => _300.usage])) {
13308
+ if (_optionalChain([lastMessage, 'optionalAccess', _300 => _300.message, 'optionalAccess', _301 => _301.usage])) {
13278
13309
  const adjustedTokens = finalUsageMetrics.completion_tokens - accumulatedOutputTokens;
13279
13310
  if (adjustedTokens >= 0) {
13280
13311
  lastMessage.message.usage.output_tokens = adjustedTokens;
@@ -13355,8 +13386,8 @@ function _buildLLMInput(prompt, conversationHistory, capturedPromptMessages) {
13355
13386
  promptMessages.push({ content: prompt, role: "user" });
13356
13387
  } else if (capturedPromptMessages && capturedPromptMessages.length > 0) {
13357
13388
  for (const msg of capturedPromptMessages) {
13358
- const role = _optionalChain([msg, 'access', _301 => _301.message, 'optionalAccess', _302 => _302.role]);
13359
- const content = _optionalChain([msg, 'access', _303 => _303.message, 'optionalAccess', _304 => _304.content]);
13389
+ const role = _optionalChain([msg, 'access', _302 => _302.message, 'optionalAccess', _303 => _303.role]);
13390
+ const content = _optionalChain([msg, 'access', _304 => _304.message, 'optionalAccess', _305 => _305.content]);
13360
13391
  if (role && content !== void 0) {
13361
13392
  promptMessages.push({ content, role });
13362
13393
  }
@@ -13372,7 +13403,7 @@ function _extractUsageFromMessage(message) {
13372
13403
  const metrics = {};
13373
13404
  let usage;
13374
13405
  if (message.type === "assistant") {
13375
- usage = _optionalChain([message, 'access', _305 => _305.message, 'optionalAccess', _306 => _306.usage]);
13406
+ usage = _optionalChain([message, 'access', _306 => _306.message, 'optionalAccess', _307 => _307.usage]);
13376
13407
  } else if (message.type === "result") {
13377
13408
  usage = message.usage;
13378
13409
  }
@@ -13404,7 +13435,7 @@ function _extractUsageFromMessage(message) {
13404
13435
  async function _createLLMSpanForMessages(messages, prompt, conversationHistory, options, startTime, capturedPromptMessages, parentSpan) {
13405
13436
  if (messages.length === 0) return void 0;
13406
13437
  const lastMessage = messages[messages.length - 1];
13407
- if (lastMessage.type !== "assistant" || !_optionalChain([lastMessage, 'access', _307 => _307.message, 'optionalAccess', _308 => _308.usage])) {
13438
+ if (lastMessage.type !== "assistant" || !_optionalChain([lastMessage, 'access', _308 => _308.message, 'optionalAccess', _309 => _309.usage])) {
13408
13439
  return void 0;
13409
13440
  }
13410
13441
  const model = lastMessage.message.model || options.model;
@@ -13415,7 +13446,7 @@ async function _createLLMSpanForMessages(messages, prompt, conversationHistory,
13415
13446
  capturedPromptMessages
13416
13447
  );
13417
13448
  const outputs = messages.map(
13418
- (m) => _optionalChain([m, 'access', _309 => _309.message, 'optionalAccess', _310 => _310.content]) && _optionalChain([m, 'access', _311 => _311.message, 'optionalAccess', _312 => _312.role]) ? { content: m.message.content, role: m.message.role } : void 0
13449
+ (m) => _optionalChain([m, 'access', _310 => _310.message, 'optionalAccess', _311 => _311.content]) && _optionalChain([m, 'access', _312 => _312.message, 'optionalAccess', _313 => _313.role]) ? { content: m.message.content, role: m.message.role } : void 0
13419
13450
  ).filter((c) => c !== void 0);
13420
13451
  await traced(
13421
13452
  (llmSpan) => {
@@ -13435,7 +13466,7 @@ async function _createLLMSpanForMessages(messages, prompt, conversationHistory,
13435
13466
  parent: parentSpan
13436
13467
  }
13437
13468
  );
13438
- return _optionalChain([lastMessage, 'access', _313 => _313.message, 'optionalAccess', _314 => _314.content]) && _optionalChain([lastMessage, 'access', _315 => _315.message, 'optionalAccess', _316 => _316.role]) ? { content: lastMessage.message.content, role: lastMessage.message.role } : void 0;
13469
+ return _optionalChain([lastMessage, 'access', _314 => _314.message, 'optionalAccess', _315 => _315.content]) && _optionalChain([lastMessage, 'access', _316 => _316.message, 'optionalAccess', _317 => _317.role]) ? { content: lastMessage.message.content, role: lastMessage.message.role } : void 0;
13439
13470
  }
13440
13471
  function wrapClaudeAgentSDK(sdk) {
13441
13472
  const cache = /* @__PURE__ */ new Map();
@@ -13709,7 +13740,7 @@ function serializePart(part) {
13709
13740
  return part;
13710
13741
  }
13711
13742
  function serializeTools(params) {
13712
- if (!_optionalChain([params, 'access', _317 => _317.config, 'optionalAccess', _318 => _318.tools])) {
13743
+ if (!_optionalChain([params, 'access', _318 => _318.config, 'optionalAccess', _319 => _319.tools])) {
13713
13744
  return null;
13714
13745
  }
13715
13746
  try {
@@ -13792,7 +13823,7 @@ function aggregateGenerateContentChunks(chunks, start, firstTokenTime) {
13792
13823
  }
13793
13824
  if (chunk.candidates && Array.isArray(chunk.candidates)) {
13794
13825
  for (const candidate of chunk.candidates) {
13795
- if (_optionalChain([candidate, 'access', _319 => _319.content, 'optionalAccess', _320 => _320.parts])) {
13826
+ if (_optionalChain([candidate, 'access', _320 => _320.content, 'optionalAccess', _321 => _321.parts])) {
13796
13827
  for (const part of candidate.content.parts) {
13797
13828
  if (part.text !== void 0) {
13798
13829
  if (part.thought) {
@@ -13823,7 +13854,7 @@ function aggregateGenerateContentChunks(chunks, start, firstTokenTime) {
13823
13854
  parts.push({ text });
13824
13855
  }
13825
13856
  parts.push(...otherParts);
13826
- if (parts.length > 0 && _optionalChain([lastResponse, 'optionalAccess', _321 => _321.candidates])) {
13857
+ if (parts.length > 0 && _optionalChain([lastResponse, 'optionalAccess', _322 => _322.candidates])) {
13827
13858
  const candidates = [];
13828
13859
  for (const candidate of lastResponse.candidates) {
13829
13860
  const candidateDict = {
@@ -15280,7 +15311,7 @@ var CachedSpanFetcher = (_class19 = class {
15280
15311
  spanType
15281
15312
  );
15282
15313
  const rows = await fetcher.fetchedData();
15283
- return rows.filter((row) => _optionalChain([row, 'access', _322 => _322.span_attributes, 'optionalAccess', _323 => _323.purpose]) !== "scorer").map((row) => ({
15314
+ return rows.filter((row) => _optionalChain([row, 'access', _323 => _323.span_attributes, 'optionalAccess', _324 => _324.purpose]) !== "scorer").map((row) => ({
15284
15315
  input: row.input,
15285
15316
  output: row.output,
15286
15317
  metadata: row.metadata,
@@ -15314,7 +15345,7 @@ var CachedSpanFetcher = (_class19 = class {
15314
15345
  async fetchSpans(spanType) {
15315
15346
  const spans = await this.fetchFn(spanType);
15316
15347
  for (const span of spans) {
15317
- const type = _nullishCoalesce(_optionalChain([span, 'access', _324 => _324.span_attributes, 'optionalAccess', _325 => _325.type]), () => ( ""));
15348
+ const type = _nullishCoalesce(_optionalChain([span, 'access', _325 => _325.span_attributes, 'optionalAccess', _326 => _326.type]), () => ( ""));
15318
15349
  const existing = _nullishCoalesce(this.spanCache.get(type), () => ( []));
15319
15350
  existing.push(span);
15320
15351
  this.spanCache.set(type, existing);
@@ -15394,11 +15425,11 @@ var LocalTrace = (_class20 = class {
15394
15425
  const cachedSpans = this.state.spanCache.getByRootSpanId(this.rootSpanId);
15395
15426
  if (cachedSpans && cachedSpans.length > 0) {
15396
15427
  let spans = cachedSpans.filter(
15397
- (span) => _optionalChain([span, 'access', _326 => _326.span_attributes, 'optionalAccess', _327 => _327.purpose]) !== "scorer"
15428
+ (span) => _optionalChain([span, 'access', _327 => _327.span_attributes, 'optionalAccess', _328 => _328.purpose]) !== "scorer"
15398
15429
  );
15399
15430
  if (spanType && spanType.length > 0) {
15400
15431
  spans = spans.filter(
15401
- (span) => spanType.includes(_nullishCoalesce(_optionalChain([span, 'access', _328 => _328.span_attributes, 'optionalAccess', _329 => _329.type]), () => ( "")))
15432
+ (span) => spanType.includes(_nullishCoalesce(_optionalChain([span, 'access', _329 => _329.span_attributes, 'optionalAccess', _330 => _330.type]), () => ( "")))
15402
15433
  );
15403
15434
  }
15404
15435
  return spans.map((span) => ({
@@ -15417,7 +15448,7 @@ var LocalTrace = (_class20 = class {
15417
15448
  * Calls the API with the project_default preprocessor (which falls back to "thread").
15418
15449
  */
15419
15450
  async getThread(options) {
15420
- const cacheKey = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _330 => _330.preprocessor]), () => ( "project_default"));
15451
+ const cacheKey = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _331 => _331.preprocessor]), () => ( "project_default"));
15421
15452
  if (!this.threadCache.has(cacheKey)) {
15422
15453
  const promise = this.fetchThread(options);
15423
15454
  this.threadCache.set(cacheKey, promise);
@@ -15428,7 +15459,7 @@ var LocalTrace = (_class20 = class {
15428
15459
  await this.ensureSpansReady();
15429
15460
  await this.state.login({});
15430
15461
  const result = await invoke({
15431
- globalFunction: _nullishCoalesce(_optionalChain([options, 'optionalAccess', _331 => _331.preprocessor]), () => ( "project_default")),
15462
+ globalFunction: _nullishCoalesce(_optionalChain([options, 'optionalAccess', _332 => _332.preprocessor]), () => ( "project_default")),
15432
15463
  functionType: "preprocessor",
15433
15464
  input: {
15434
15465
  trace_ref: {
@@ -15587,10 +15618,10 @@ function validateParametersWithJsonSchema(parameters, schema) {
15587
15618
  const ajv = new (0, _ajv2.default)({ coerceTypes: true, useDefaults: true, strict: false });
15588
15619
  const validate = ajv.compile(schema);
15589
15620
  if (!validate(parameters)) {
15590
- const errorMessages = _optionalChain([validate, 'access', _332 => _332.errors, 'optionalAccess', _333 => _333.map, 'call', _334 => _334((err) => {
15621
+ const errorMessages = _optionalChain([validate, 'access', _333 => _333.errors, 'optionalAccess', _334 => _334.map, 'call', _335 => _335((err) => {
15591
15622
  const path2 = err.instancePath || "root";
15592
15623
  return `${path2}: ${err.message}`;
15593
- }), 'access', _335 => _335.join, 'call', _336 => _336(", ")]);
15624
+ }), 'access', _336 => _336.join, 'call', _337 => _337(", ")]);
15594
15625
  throw Error(`Invalid parameters: ${errorMessages}`);
15595
15626
  }
15596
15627
  return parameters;
@@ -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: _nullishCoalesce(evaluator.baseExperimentName, () => ( defaultBaseExperiment)),
@@ -15831,7 +15863,7 @@ var defaultErrorScoreHandler = ({
15831
15863
  };
15832
15864
  async function runEvaluatorInternal(experiment, evaluator, progressReporter, filters, stream, parameters, collectResults, enableCache) {
15833
15865
  if (enableCache) {
15834
- _optionalChain([(_nullishCoalesce(evaluator.state, () => ( _internalGetGlobalState()))), 'optionalAccess', _337 => _337.spanCache, 'optionalAccess', _338 => _338.start, 'call', _339 => _339()]);
15866
+ _optionalChain([(_nullishCoalesce(evaluator.state, () => ( _internalGetGlobalState()))), 'optionalAccess', _338 => _338.spanCache, 'optionalAccess', _339 => _339.start, 'call', _340 => _340()]);
15835
15867
  }
15836
15868
  try {
15837
15869
  if (typeof evaluator.data === "string") {
@@ -15942,7 +15974,7 @@ async function runEvaluatorInternal(experiment, evaluator, progressReporter, fil
15942
15974
  objectType: parentComponents ? spanObjectTypeV3ToTypedString(
15943
15975
  parentComponents.data.object_type
15944
15976
  ) : "experiment",
15945
- objectId: await _asyncNullishCoalesce(await _asyncOptionalChain([parentComponents, 'optionalAccess', async _340 => _340.data, 'access', async _341 => _341.object_id]), async () => ( (experimentIdPromise ? await _asyncNullishCoalesce(await experimentIdPromise, async () => ( "")) : ""))),
15977
+ objectId: await _asyncNullishCoalesce(await _asyncOptionalChain([parentComponents, 'optionalAccess', async _341 => _341.data, 'access', async _342 => _342.object_id]), async () => ( (experimentIdPromise ? await _asyncNullishCoalesce(await experimentIdPromise, async () => ( "")) : ""))),
15946
15978
  rootSpanId: rootSpan.rootSpanId,
15947
15979
  ensureSpansFlushed,
15948
15980
  state
@@ -15968,10 +16000,10 @@ async function runEvaluatorInternal(experiment, evaluator, progressReporter, fil
15968
16000
  span,
15969
16001
  parameters: _nullishCoalesce(parameters, () => ( {})),
15970
16002
  reportProgress: (event) => {
15971
- _optionalChain([stream, 'optionalCall', _342 => _342({
16003
+ _optionalChain([stream, 'optionalCall', _343 => _343({
15972
16004
  ...event,
15973
16005
  id: rootSpan.id,
15974
- origin: _optionalChain([baseEvent, 'access', _343 => _343.event, 'optionalAccess', _344 => _344.origin]),
16006
+ origin: _optionalChain([baseEvent, 'access', _344 => _344.event, 'optionalAccess', _345 => _345.origin]),
15975
16007
  name: evaluator.evalName,
15976
16008
  object_type: "task"
15977
16009
  })]);
@@ -16135,7 +16167,7 @@ async function runEvaluatorInternal(experiment, evaluator, progressReporter, fil
16135
16167
  metadata,
16136
16168
  scores: mergedScores,
16137
16169
  error,
16138
- origin: _optionalChain([baseEvent, 'access', _345 => _345.event, 'optionalAccess', _346 => _346.origin])
16170
+ origin: _optionalChain([baseEvent, 'access', _346 => _346.event, 'optionalAccess', _347 => _347.origin])
16139
16171
  });
16140
16172
  }
16141
16173
  };
@@ -16168,7 +16200,7 @@ async function runEvaluatorInternal(experiment, evaluator, progressReporter, fil
16168
16200
  break;
16169
16201
  }
16170
16202
  scheduledTrials++;
16171
- _optionalChain([progressReporter, 'access', _347 => _347.setTotal, 'optionalCall', _348 => _348(evaluator.evalName, scheduledTrials)]);
16203
+ _optionalChain([progressReporter, 'access', _348 => _348.setTotal, 'optionalCall', _349 => _349(evaluator.evalName, scheduledTrials)]);
16172
16204
  q.push({ datum, trialIndex });
16173
16205
  }
16174
16206
  }
@@ -16243,9 +16275,9 @@ async function runEvaluatorInternal(experiment, evaluator, progressReporter, fil
16243
16275
  );
16244
16276
  } finally {
16245
16277
  if (enableCache) {
16246
- const spanCache = _optionalChain([(_nullishCoalesce(evaluator.state, () => ( _internalGetGlobalState()))), 'optionalAccess', _349 => _349.spanCache]);
16247
- _optionalChain([spanCache, 'optionalAccess', _350 => _350.dispose, 'call', _351 => _351()]);
16248
- _optionalChain([spanCache, 'optionalAccess', _352 => _352.stop, 'call', _353 => _353()]);
16278
+ const spanCache = _optionalChain([(_nullishCoalesce(evaluator.state, () => ( _internalGetGlobalState()))), 'optionalAccess', _350 => _350.spanCache]);
16279
+ _optionalChain([spanCache, 'optionalAccess', _351 => _351.dispose, 'call', _352 => _352()]);
16280
+ _optionalChain([spanCache, 'optionalAccess', _353 => _353.stop, 'call', _354 => _354()]);
16249
16281
  }
16250
16282
  }
16251
16283
  }