braintrust 3.30.0 → 3.31.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.
@@ -520,6 +520,9 @@ interface Score {
520
520
  */
521
521
  error?: unknown;
522
522
  }
523
+ type SingleScore = Omit<Score, "name"> & {
524
+ name?: string;
525
+ };
523
526
 
524
527
  declare const spanComponentsV4Schema: z.ZodIntersection<z.ZodIntersection<z.ZodObject<{
525
528
  object_type: z.ZodNativeEnum<typeof SpanObjectTypeV3>;
@@ -15436,7 +15439,7 @@ type EvalScorerArgs<Input, Output, Expected, Metadata extends BaseMetadata = Def
15436
15439
  output: Output;
15437
15440
  trace?: Trace;
15438
15441
  };
15439
- type OneOrMoreScores = Score | number | null | Array<Score>;
15442
+ type OneOrMoreScores = SingleScore | number | null | Array<Score>;
15440
15443
  type EvalScorer<Input, Output, Expected, Metadata extends BaseMetadata = DefaultMetadataType> = (args: EvalScorerArgs<Input, Output, Expected, Metadata>) => OneOrMoreScores | Promise<OneOrMoreScores>;
15441
15444
  type OneOrMoreClassifications = Classification | Classification[] | null;
15442
15445
  type EvalClassifier<Input, Output, Expected, Metadata extends BaseMetadata = DefaultMetadataType> = (args: EvalScorerArgs<Input, Output, Expected, Metadata>) => OneOrMoreClassifications | Promise<OneOrMoreClassifications>;
@@ -520,6 +520,9 @@ interface Score {
520
520
  */
521
521
  error?: unknown;
522
522
  }
523
+ type SingleScore = Omit<Score, "name"> & {
524
+ name?: string;
525
+ };
523
526
 
524
527
  declare const spanComponentsV4Schema: z.ZodIntersection<z.ZodIntersection<z.ZodObject<{
525
528
  object_type: z.ZodNativeEnum<typeof SpanObjectTypeV3>;
@@ -15436,7 +15439,7 @@ type EvalScorerArgs<Input, Output, Expected, Metadata extends BaseMetadata = Def
15436
15439
  output: Output;
15437
15440
  trace?: Trace;
15438
15441
  };
15439
- type OneOrMoreScores = Score | number | null | Array<Score>;
15442
+ type OneOrMoreScores = SingleScore | number | null | Array<Score>;
15440
15443
  type EvalScorer<Input, Output, Expected, Metadata extends BaseMetadata = DefaultMetadataType> = (args: EvalScorerArgs<Input, Output, Expected, Metadata>) => OneOrMoreScores | Promise<OneOrMoreScores>;
15441
15444
  type OneOrMoreClassifications = Classification | Classification[] | null;
15442
15445
  type EvalClassifier<Input, Output, Expected, Metadata extends BaseMetadata = DefaultMetadataType> = (args: EvalScorerArgs<Input, Output, Expected, Metadata>) => OneOrMoreClassifications | Promise<OneOrMoreClassifications>;
package/dev/dist/index.js CHANGED
@@ -4118,6 +4118,7 @@ var ProjectSettings = _v3.z.union([
4118
4118
  ]),
4119
4119
  disable_realtime_queries: _v3.z.union([_v3.z.boolean(), _v3.z.null()]),
4120
4120
  monitor_charts_use_metrics_start: _v3.z.union([_v3.z.boolean(), _v3.z.null()]),
4121
+ blind_reviews: _v3.z.union([_v3.z.boolean(), _v3.z.null()]),
4121
4122
  default_preprocessor: NullableSavedFunctionId
4122
4123
  }).partial(),
4123
4124
  _v3.z.null()
@@ -4179,6 +4180,7 @@ var WindowedAutomationConfig = _v3.z.object({
4179
4180
  auto_approve_tools: _v3.z.array(_v3.z.string().min(1)).optional().default([]),
4180
4181
  harness: _v3.z.enum(["native", "codex", "claude-code"]).optional(),
4181
4182
  model: _v3.z.string().min(1).optional(),
4183
+ endpoint_name: _v3.z.string().min(1).optional(),
4182
4184
  reasoning_effort: _v3.z.enum(["none", "minimal", "low", "medium", "high", "xhigh", "max"]).optional()
4183
4185
  }).optional(),
4184
4186
  actions: _v3.z.array(
@@ -5972,7 +5974,7 @@ var INSTRUMENTATION_NAMES = {
5972
5974
  var INTERNAL_SPAN_INSTRUMENTATION_NAME = /* @__PURE__ */ Symbol.for(
5973
5975
  "braintrust.spanInstrumentationName"
5974
5976
  );
5975
- var SDK_VERSION = true ? "3.30.0" : "0.0.0";
5977
+ var SDK_VERSION = true ? "3.31.0" : "0.0.0";
5976
5978
  function withSpanInstrumentationName(args, instrumentationName) {
5977
5979
  return {
5978
5980
  ...args,
@@ -19197,6 +19199,12 @@ function prepareAISDKChildTracing(params, self, parentSpan, denyOutputPaths, aiS
19197
19199
  if (!activeEntry) {
19198
19200
  return result;
19199
19201
  }
19202
+ const executionOptions = args[1];
19203
+ const toolCallId = isObject(executionOptions) ? executionOptions.toolCallId : void 0;
19204
+ const toolInput = {
19205
+ input: serializeToolExecutionInput(args),
19206
+ ...typeof toolCallId === "string" ? { metadata: { toolCallId } } : {}
19207
+ };
19200
19208
  if (isAsyncGenerator(result)) {
19201
19209
  return (async function* () {
19202
19210
  const span = activeEntry.parentSpan.startSpan(
@@ -19210,7 +19218,7 @@ function prepareAISDKChildTracing(params, self, parentSpan, denyOutputPaths, aiS
19210
19218
  INSTRUMENTATION_NAMES.AI_SDK
19211
19219
  )
19212
19220
  );
19213
- span.log({ input: serializeToolExecutionInput(args) });
19221
+ span.log(toolInput);
19214
19222
  try {
19215
19223
  let lastValue;
19216
19224
  for await (const value of result) {
@@ -19228,7 +19236,7 @@ function prepareAISDKChildTracing(params, self, parentSpan, denyOutputPaths, aiS
19228
19236
  }
19229
19237
  return activeEntry.parentSpan.traced(
19230
19238
  async (span) => {
19231
- span.log({ input: serializeToolExecutionInput(args) });
19239
+ span.log(toolInput);
19232
19240
  const awaitedResult = await result;
19233
19241
  span.log({ output: awaitedResult });
19234
19242
  return awaitedResult;
@@ -33350,14 +33358,17 @@ function getMetricsFromResponse(response) {
33350
33358
  if (!isRecord(usageMetadata)) {
33351
33359
  continue;
33352
33360
  }
33353
- const inputTokenDetails = usageMetadata.input_token_details;
33361
+ const inputTokenDetails = isRecord(usageMetadata.input_token_details) ? usageMetadata.input_token_details : {};
33354
33362
  const outputTokenDetails = usageMetadata.output_token_details;
33355
33363
  return normalizeTokenMetrics({
33356
33364
  total_tokens: usageMetadata.total_tokens,
33357
33365
  prompt_tokens: usageMetadata.input_tokens,
33358
33366
  completion_tokens: usageMetadata.output_tokens,
33359
- prompt_cache_creation_tokens: isRecord(inputTokenDetails) ? inputTokenDetails.cache_creation : void 0,
33360
- prompt_cached_tokens: isRecord(inputTokenDetails) ? inputTokenDetails.cache_read : void 0,
33367
+ // Prefer TTL-specific cache writes over the aggregate when available.
33368
+ prompt_cache_creation_tokens: inputTokenDetails.ephemeral_5m_input_tokens == null && inputTokenDetails.ephemeral_1h_input_tokens == null ? inputTokenDetails.cache_creation : void 0,
33369
+ prompt_cache_creation_5m_tokens: inputTokenDetails.ephemeral_5m_input_tokens,
33370
+ prompt_cache_creation_1h_tokens: inputTokenDetails.ephemeral_1h_input_tokens,
33371
+ prompt_cached_tokens: inputTokenDetails.cache_read,
33361
33372
  completion_reasoning_tokens: isRecord(outputTokenDetails) ? outputTokenDetails.reasoning : void 0
33362
33373
  });
33363
33374
  }
@@ -39371,19 +39382,29 @@ function buildSpanScores(results) {
39371
39382
  function _internalPrepareEvaluatorScore(scoreValue, name) {
39372
39383
  if (scoreValue === null) return { results: null };
39373
39384
  if (Array.isArray(scoreValue)) {
39385
+ const names = /* @__PURE__ */ new Set();
39374
39386
  for (const score of scoreValue) {
39375
39387
  if (!(typeof score === "object" && !isEmpty2(score))) {
39376
39388
  throw new Error(
39377
39389
  `When returning an array of scores, each score must be a non-empty object. Got: ${JSON.stringify(score)}`
39378
39390
  );
39379
39391
  }
39392
+ if (typeof score.name !== "string") {
39393
+ throw new Error(
39394
+ `When returning an array of scores, each score must have a name. Got: ${JSON.stringify(score)}`
39395
+ );
39396
+ }
39397
+ if (names.has(score.name)) {
39398
+ throw new Error(`Duplicate score name '${score.name}' in score array`);
39399
+ }
39400
+ names.add(score.name);
39380
39401
  }
39381
39402
  }
39382
39403
  let results;
39383
39404
  if (Array.isArray(scoreValue)) {
39384
39405
  results = scoreValue;
39385
39406
  } else if (typeof scoreValue === "object" && !isEmpty2(scoreValue)) {
39386
- results = [scoreValue];
39407
+ results = [{ ...scoreValue, name: _nullishCoalesce(scoreValue.name, () => ( name)) }];
39387
39408
  } else {
39388
39409
  results = [{ name, score: scoreValue }];
39389
39410
  }
@@ -4118,6 +4118,7 @@ var ProjectSettings = z6.union([
4118
4118
  ]),
4119
4119
  disable_realtime_queries: z6.union([z6.boolean(), z6.null()]),
4120
4120
  monitor_charts_use_metrics_start: z6.union([z6.boolean(), z6.null()]),
4121
+ blind_reviews: z6.union([z6.boolean(), z6.null()]),
4121
4122
  default_preprocessor: NullableSavedFunctionId
4122
4123
  }).partial(),
4123
4124
  z6.null()
@@ -4179,6 +4180,7 @@ var WindowedAutomationConfig = z6.object({
4179
4180
  auto_approve_tools: z6.array(z6.string().min(1)).optional().default([]),
4180
4181
  harness: z6.enum(["native", "codex", "claude-code"]).optional(),
4181
4182
  model: z6.string().min(1).optional(),
4183
+ endpoint_name: z6.string().min(1).optional(),
4182
4184
  reasoning_effort: z6.enum(["none", "minimal", "low", "medium", "high", "xhigh", "max"]).optional()
4183
4185
  }).optional(),
4184
4186
  actions: z6.array(
@@ -5972,7 +5974,7 @@ var INSTRUMENTATION_NAMES = {
5972
5974
  var INTERNAL_SPAN_INSTRUMENTATION_NAME = /* @__PURE__ */ Symbol.for(
5973
5975
  "braintrust.spanInstrumentationName"
5974
5976
  );
5975
- var SDK_VERSION = true ? "3.30.0" : "0.0.0";
5977
+ var SDK_VERSION = true ? "3.31.0" : "0.0.0";
5976
5978
  function withSpanInstrumentationName(args, instrumentationName) {
5977
5979
  return {
5978
5980
  ...args,
@@ -19197,6 +19199,12 @@ function prepareAISDKChildTracing(params, self, parentSpan, denyOutputPaths, aiS
19197
19199
  if (!activeEntry) {
19198
19200
  return result;
19199
19201
  }
19202
+ const executionOptions = args[1];
19203
+ const toolCallId = isObject(executionOptions) ? executionOptions.toolCallId : void 0;
19204
+ const toolInput = {
19205
+ input: serializeToolExecutionInput(args),
19206
+ ...typeof toolCallId === "string" ? { metadata: { toolCallId } } : {}
19207
+ };
19200
19208
  if (isAsyncGenerator(result)) {
19201
19209
  return (async function* () {
19202
19210
  const span = activeEntry.parentSpan.startSpan(
@@ -19210,7 +19218,7 @@ function prepareAISDKChildTracing(params, self, parentSpan, denyOutputPaths, aiS
19210
19218
  INSTRUMENTATION_NAMES.AI_SDK
19211
19219
  )
19212
19220
  );
19213
- span.log({ input: serializeToolExecutionInput(args) });
19221
+ span.log(toolInput);
19214
19222
  try {
19215
19223
  let lastValue;
19216
19224
  for await (const value of result) {
@@ -19228,7 +19236,7 @@ function prepareAISDKChildTracing(params, self, parentSpan, denyOutputPaths, aiS
19228
19236
  }
19229
19237
  return activeEntry.parentSpan.traced(
19230
19238
  async (span) => {
19231
- span.log({ input: serializeToolExecutionInput(args) });
19239
+ span.log(toolInput);
19232
19240
  const awaitedResult = await result;
19233
19241
  span.log({ output: awaitedResult });
19234
19242
  return awaitedResult;
@@ -33350,14 +33358,17 @@ function getMetricsFromResponse(response) {
33350
33358
  if (!isRecord(usageMetadata)) {
33351
33359
  continue;
33352
33360
  }
33353
- const inputTokenDetails = usageMetadata.input_token_details;
33361
+ const inputTokenDetails = isRecord(usageMetadata.input_token_details) ? usageMetadata.input_token_details : {};
33354
33362
  const outputTokenDetails = usageMetadata.output_token_details;
33355
33363
  return normalizeTokenMetrics({
33356
33364
  total_tokens: usageMetadata.total_tokens,
33357
33365
  prompt_tokens: usageMetadata.input_tokens,
33358
33366
  completion_tokens: usageMetadata.output_tokens,
33359
- prompt_cache_creation_tokens: isRecord(inputTokenDetails) ? inputTokenDetails.cache_creation : void 0,
33360
- prompt_cached_tokens: isRecord(inputTokenDetails) ? inputTokenDetails.cache_read : void 0,
33367
+ // Prefer TTL-specific cache writes over the aggregate when available.
33368
+ prompt_cache_creation_tokens: inputTokenDetails.ephemeral_5m_input_tokens == null && inputTokenDetails.ephemeral_1h_input_tokens == null ? inputTokenDetails.cache_creation : void 0,
33369
+ prompt_cache_creation_5m_tokens: inputTokenDetails.ephemeral_5m_input_tokens,
33370
+ prompt_cache_creation_1h_tokens: inputTokenDetails.ephemeral_1h_input_tokens,
33371
+ prompt_cached_tokens: inputTokenDetails.cache_read,
33361
33372
  completion_reasoning_tokens: isRecord(outputTokenDetails) ? outputTokenDetails.reasoning : void 0
33362
33373
  });
33363
33374
  }
@@ -39371,19 +39382,29 @@ function buildSpanScores(results) {
39371
39382
  function _internalPrepareEvaluatorScore(scoreValue, name) {
39372
39383
  if (scoreValue === null) return { results: null };
39373
39384
  if (Array.isArray(scoreValue)) {
39385
+ const names = /* @__PURE__ */ new Set();
39374
39386
  for (const score of scoreValue) {
39375
39387
  if (!(typeof score === "object" && !isEmpty2(score))) {
39376
39388
  throw new Error(
39377
39389
  `When returning an array of scores, each score must be a non-empty object. Got: ${JSON.stringify(score)}`
39378
39390
  );
39379
39391
  }
39392
+ if (typeof score.name !== "string") {
39393
+ throw new Error(
39394
+ `When returning an array of scores, each score must have a name. Got: ${JSON.stringify(score)}`
39395
+ );
39396
+ }
39397
+ if (names.has(score.name)) {
39398
+ throw new Error(`Duplicate score name '${score.name}' in score array`);
39399
+ }
39400
+ names.add(score.name);
39380
39401
  }
39381
39402
  }
39382
39403
  let results;
39383
39404
  if (Array.isArray(scoreValue)) {
39384
39405
  results = scoreValue;
39385
39406
  } else if (typeof scoreValue === "object" && !isEmpty2(scoreValue)) {
39386
- results = [scoreValue];
39407
+ results = [{ ...scoreValue, name: scoreValue.name ?? name }];
39387
39408
  } else {
39388
39409
  results = [{ name, score: scoreValue }];
39389
39410
  }