braintrust 0.0.181 → 0.0.183

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.
@@ -1274,6 +1274,7 @@ declare class SpanImpl implements Span {
1274
1274
  declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY_DATASET> extends ObjectFetcher<DatasetRecord<IsLegacyDataset>> {
1275
1275
  private state;
1276
1276
  private readonly lazyMetadata;
1277
+ private readonly __braintrust_dataset_marker;
1277
1278
  constructor(state: BraintrustState, lazyMetadata: LazyValue<ProjectDatasetMetadata>, pinnedVersion?: string, legacy?: IsLegacyDataset);
1278
1279
  get id(): Promise<string>;
1279
1280
  get name(): Promise<string>;
@@ -1343,6 +1344,7 @@ declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY
1343
1344
  * @deprecated This function is deprecated. You can simply remove it from your code.
1344
1345
  */
1345
1346
  close(): Promise<string>;
1347
+ static isDataset(data: unknown): data is Dataset;
1346
1348
  }
1347
1349
  type CompiledPromptParams = Omit<NonNullable<PromptData["options"]>["params"], "use_cache"> & {
1348
1350
  model: NonNullable<NonNullable<PromptData["options"]>["model"]>;
@@ -1845,6 +1847,7 @@ interface ChatLike {
1845
1847
  interface OpenAILike {
1846
1848
  chat: ChatLike;
1847
1849
  embeddings: any;
1850
+ moderations: any;
1848
1851
  beta?: BetaLike;
1849
1852
  }
1850
1853
  declare global {
package/dist/browser.d.ts CHANGED
@@ -1274,6 +1274,7 @@ declare class SpanImpl implements Span {
1274
1274
  declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY_DATASET> extends ObjectFetcher<DatasetRecord<IsLegacyDataset>> {
1275
1275
  private state;
1276
1276
  private readonly lazyMetadata;
1277
+ private readonly __braintrust_dataset_marker;
1277
1278
  constructor(state: BraintrustState, lazyMetadata: LazyValue<ProjectDatasetMetadata>, pinnedVersion?: string, legacy?: IsLegacyDataset);
1278
1279
  get id(): Promise<string>;
1279
1280
  get name(): Promise<string>;
@@ -1343,6 +1344,7 @@ declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY
1343
1344
  * @deprecated This function is deprecated. You can simply remove it from your code.
1344
1345
  */
1345
1346
  close(): Promise<string>;
1347
+ static isDataset(data: unknown): data is Dataset;
1346
1348
  }
1347
1349
  type CompiledPromptParams = Omit<NonNullable<PromptData["options"]>["params"], "use_cache"> & {
1348
1350
  model: NonNullable<NonNullable<PromptData["options"]>["model"]>;
@@ -1845,6 +1847,7 @@ interface ChatLike {
1845
1847
  interface OpenAILike {
1846
1848
  chat: ChatLike;
1847
1849
  embeddings: any;
1850
+ moderations: any;
1848
1851
  beta?: BetaLike;
1849
1852
  }
1850
1853
  declare global {
package/dist/browser.js CHANGED
@@ -3437,6 +3437,7 @@ var Dataset = class extends ObjectFetcher {
3437
3437
  this.lazyMetadata = lazyMetadata;
3438
3438
  }
3439
3439
  lazyMetadata;
3440
+ __braintrust_dataset_marker = true;
3440
3441
  get id() {
3441
3442
  return (async () => {
3442
3443
  return (await this.lazyMetadata.get()).dataset.id;
@@ -3639,6 +3640,9 @@ var Dataset = class extends ObjectFetcher {
3639
3640
  );
3640
3641
  return this.id;
3641
3642
  }
3643
+ static isDataset(data) {
3644
+ return typeof data === "object" && data !== null && "__braintrust_dataset_marker" in data;
3645
+ }
3642
3646
  };
3643
3647
  function renderMessage(render, message) {
3644
3648
  return {
@@ -3990,16 +3994,11 @@ function wrapOpenAI(openai) {
3990
3994
  }
3991
3995
  globalThis.__inherited_braintrust_wrap_openai = wrapOpenAI;
3992
3996
  function wrapOpenAIv4(openai) {
3993
- let completionProxy = new Proxy(openai.chat.completions, {
3994
- get(target, name, receiver) {
3995
- const baseVal = Reflect.get(target, name, receiver);
3996
- if (name === "create") {
3997
- return wrapChatCompletion(baseVal.bind(target));
3998
- }
3999
- return baseVal;
4000
- }
4001
- });
4002
- let chatProxy = new Proxy(openai.chat, {
3997
+ const completionProxy = createEndpointProxy(
3998
+ openai.chat.completions,
3999
+ wrapChatCompletion
4000
+ );
4001
+ const chatProxy = new Proxy(openai.chat, {
4003
4002
  get(target, name, receiver) {
4004
4003
  if (name === "completions") {
4005
4004
  return completionProxy;
@@ -4007,18 +4006,11 @@ function wrapOpenAIv4(openai) {
4007
4006
  return Reflect.get(target, name, receiver);
4008
4007
  }
4009
4008
  });
4010
- let embeddingProxy = new Proxy(openai.embeddings, {
4011
- get(target, name, receiver) {
4012
- const baseVal = Reflect.get(target, name, receiver);
4013
- if (name === "create") {
4014
- return wrapEmbeddings(baseVal.bind(target));
4015
- }
4016
- return baseVal;
4017
- }
4018
- });
4009
+ const embeddingProxy = createEndpointProxy(openai.embeddings, wrapEmbeddings);
4010
+ const moderationProxy = createEndpointProxy(openai.moderations, wrapModerations);
4019
4011
  let betaProxy;
4020
4012
  if (openai.beta?.chat?.completions?.stream) {
4021
- let betaChatCompletionProxy = new Proxy(openai?.beta?.chat.completions, {
4013
+ const betaChatCompletionProxy = new Proxy(openai?.beta?.chat.completions, {
4022
4014
  get(target, name, receiver) {
4023
4015
  const baseVal = Reflect.get(target, name, receiver);
4024
4016
  if (name === "parse") {
@@ -4029,7 +4021,7 @@ function wrapOpenAIv4(openai) {
4029
4021
  return baseVal;
4030
4022
  }
4031
4023
  });
4032
- let betaChatProxy = new Proxy(openai.beta.chat, {
4024
+ const betaChatProxy = new Proxy(openai.beta.chat, {
4033
4025
  get(target, name, receiver) {
4034
4026
  if (name === "completions") {
4035
4027
  return betaChatCompletionProxy;
@@ -4046,7 +4038,7 @@ function wrapOpenAIv4(openai) {
4046
4038
  }
4047
4039
  });
4048
4040
  }
4049
- let proxy = new Proxy(openai, {
4041
+ return new Proxy(openai, {
4050
4042
  get(target, name, receiver) {
4051
4043
  if (name === "chat") {
4052
4044
  return chatProxy;
@@ -4054,13 +4046,15 @@ function wrapOpenAIv4(openai) {
4054
4046
  if (name === "embeddings") {
4055
4047
  return embeddingProxy;
4056
4048
  }
4049
+ if (name === "moderations") {
4050
+ return moderationProxy;
4051
+ }
4057
4052
  if (name === "beta" && betaProxy) {
4058
4053
  return betaProxy;
4059
4054
  }
4060
4055
  return Reflect.get(target, name, receiver);
4061
4056
  }
4062
4057
  });
4063
- return proxy;
4064
4058
  }
4065
4059
  function logCompletionResponse(startTime, response, span) {
4066
4060
  span.log({
@@ -4209,7 +4203,7 @@ function wrapChatCompletion(completion) {
4209
4203
  }
4210
4204
  };
4211
4205
  }
4212
- function parseChatCompletionParams(allParams) {
4206
+ function parseBaseParams(allParams, inputField) {
4213
4207
  const { span_info, ...params } = allParams;
4214
4208
  const { metadata: spanInfoMetadata, ...spanInfoRest } = span_info ?? {};
4215
4209
  let ret = {
@@ -4218,10 +4212,12 @@ function parseChatCompletionParams(allParams) {
4218
4212
  metadata: spanInfoMetadata
4219
4213
  }
4220
4214
  };
4221
- const { messages, ...paramsRest } = params;
4222
- return (0, import_core3.mergeDicts)(ret, { event: { input: messages, metadata: paramsRest } });
4215
+ const input = params[inputField];
4216
+ const paramsRest = { ...params };
4217
+ delete paramsRest[inputField];
4218
+ return (0, import_core3.mergeDicts)(ret, { event: { input, metadata: paramsRest } });
4223
4219
  }
4224
- function wrapEmbeddings(create) {
4220
+ function createApiWrapper(name, create, processResponse, parseParams) {
4225
4221
  return async (allParams, options) => {
4226
4222
  const { span_info: _, ...params } = allParams;
4227
4223
  return traced(
@@ -4231,42 +4227,61 @@ function wrapEmbeddings(create) {
4231
4227
  options
4232
4228
  ).withResponse();
4233
4229
  logHeaders(response, span);
4234
- const embedding_length = result.data[0].embedding.length;
4235
- span.log({
4236
- // TODO: Add a flag to control whether to log the full embedding vector,
4237
- // possibly w/ JSON compression.
4238
- output: { embedding_length },
4239
- metrics: {
4240
- tokens: result.usage?.total_tokens,
4241
- prompt_tokens: result.usage?.prompt_tokens
4242
- }
4243
- });
4230
+ processResponse(result, span);
4244
4231
  return result;
4245
4232
  },
4246
4233
  (0, import_core3.mergeDicts)(
4247
4234
  {
4248
- name: "Embedding",
4235
+ name,
4249
4236
  spanAttributes: {
4250
4237
  type: import_core2.SpanTypeAttribute.LLM
4251
4238
  }
4252
4239
  },
4253
- parseEmbeddingParams(allParams)
4240
+ parseParams(allParams)
4254
4241
  )
4255
4242
  );
4256
4243
  };
4257
4244
  }
4258
- function parseEmbeddingParams(allParams) {
4259
- const { span_info, ...params } = allParams;
4260
- const { metadata: spanInfoMetadata, ...spanInfoRest } = span_info ?? {};
4261
- let ret = {
4262
- ...spanInfoRest,
4263
- event: {
4264
- metadata: spanInfoMetadata
4245
+ function createEndpointProxy(target, wrapperFn) {
4246
+ return new Proxy(target, {
4247
+ get(target2, name, receiver) {
4248
+ const baseVal = Reflect.get(target2, name, receiver);
4249
+ if (name === "create") {
4250
+ return wrapperFn(baseVal.bind(target2));
4251
+ }
4252
+ return baseVal;
4265
4253
  }
4266
- };
4267
- const { input, ...paramsRest } = params;
4268
- return (0, import_core3.mergeDicts)(ret, { event: { input, metadata: paramsRest } });
4254
+ });
4255
+ }
4256
+ function parseChatCompletionParams(params) {
4257
+ return parseBaseParams(params, "messages");
4258
+ }
4259
+ function processEmbeddingResponse(result, span) {
4260
+ span.log({
4261
+ output: { embedding_length: result.data[0].embedding.length },
4262
+ metrics: {
4263
+ tokens: result.usage?.total_tokens,
4264
+ prompt_tokens: result.usage?.prompt_tokens
4265
+ }
4266
+ });
4267
+ }
4268
+ function processModerationResponse(result, span) {
4269
+ span.log({
4270
+ output: result.results
4271
+ });
4269
4272
  }
4273
+ var wrapEmbeddings = (create) => createApiWrapper(
4274
+ "Embedding",
4275
+ create,
4276
+ processEmbeddingResponse,
4277
+ (params) => parseBaseParams(params, "input")
4278
+ );
4279
+ var wrapModerations = (create) => createApiWrapper(
4280
+ "Moderation",
4281
+ create,
4282
+ processModerationResponse,
4283
+ (params) => parseBaseParams(params, "input")
4284
+ );
4270
4285
  function postprocessStreamingResults(allResults) {
4271
4286
  let role = void 0;
4272
4287
  let content = void 0;
package/dist/browser.mjs CHANGED
@@ -3385,6 +3385,7 @@ var Dataset = class extends ObjectFetcher {
3385
3385
  this.lazyMetadata = lazyMetadata;
3386
3386
  }
3387
3387
  lazyMetadata;
3388
+ __braintrust_dataset_marker = true;
3388
3389
  get id() {
3389
3390
  return (async () => {
3390
3391
  return (await this.lazyMetadata.get()).dataset.id;
@@ -3587,6 +3588,9 @@ var Dataset = class extends ObjectFetcher {
3587
3588
  );
3588
3589
  return this.id;
3589
3590
  }
3591
+ static isDataset(data) {
3592
+ return typeof data === "object" && data !== null && "__braintrust_dataset_marker" in data;
3593
+ }
3590
3594
  };
3591
3595
  function renderMessage(render, message) {
3592
3596
  return {
@@ -3940,16 +3944,11 @@ function wrapOpenAI(openai) {
3940
3944
  }
3941
3945
  globalThis.__inherited_braintrust_wrap_openai = wrapOpenAI;
3942
3946
  function wrapOpenAIv4(openai) {
3943
- let completionProxy = new Proxy(openai.chat.completions, {
3944
- get(target, name, receiver) {
3945
- const baseVal = Reflect.get(target, name, receiver);
3946
- if (name === "create") {
3947
- return wrapChatCompletion(baseVal.bind(target));
3948
- }
3949
- return baseVal;
3950
- }
3951
- });
3952
- let chatProxy = new Proxy(openai.chat, {
3947
+ const completionProxy = createEndpointProxy(
3948
+ openai.chat.completions,
3949
+ wrapChatCompletion
3950
+ );
3951
+ const chatProxy = new Proxy(openai.chat, {
3953
3952
  get(target, name, receiver) {
3954
3953
  if (name === "completions") {
3955
3954
  return completionProxy;
@@ -3957,18 +3956,11 @@ function wrapOpenAIv4(openai) {
3957
3956
  return Reflect.get(target, name, receiver);
3958
3957
  }
3959
3958
  });
3960
- let embeddingProxy = new Proxy(openai.embeddings, {
3961
- get(target, name, receiver) {
3962
- const baseVal = Reflect.get(target, name, receiver);
3963
- if (name === "create") {
3964
- return wrapEmbeddings(baseVal.bind(target));
3965
- }
3966
- return baseVal;
3967
- }
3968
- });
3959
+ const embeddingProxy = createEndpointProxy(openai.embeddings, wrapEmbeddings);
3960
+ const moderationProxy = createEndpointProxy(openai.moderations, wrapModerations);
3969
3961
  let betaProxy;
3970
3962
  if (openai.beta?.chat?.completions?.stream) {
3971
- let betaChatCompletionProxy = new Proxy(openai?.beta?.chat.completions, {
3963
+ const betaChatCompletionProxy = new Proxy(openai?.beta?.chat.completions, {
3972
3964
  get(target, name, receiver) {
3973
3965
  const baseVal = Reflect.get(target, name, receiver);
3974
3966
  if (name === "parse") {
@@ -3979,7 +3971,7 @@ function wrapOpenAIv4(openai) {
3979
3971
  return baseVal;
3980
3972
  }
3981
3973
  });
3982
- let betaChatProxy = new Proxy(openai.beta.chat, {
3974
+ const betaChatProxy = new Proxy(openai.beta.chat, {
3983
3975
  get(target, name, receiver) {
3984
3976
  if (name === "completions") {
3985
3977
  return betaChatCompletionProxy;
@@ -3996,7 +3988,7 @@ function wrapOpenAIv4(openai) {
3996
3988
  }
3997
3989
  });
3998
3990
  }
3999
- let proxy = new Proxy(openai, {
3991
+ return new Proxy(openai, {
4000
3992
  get(target, name, receiver) {
4001
3993
  if (name === "chat") {
4002
3994
  return chatProxy;
@@ -4004,13 +3996,15 @@ function wrapOpenAIv4(openai) {
4004
3996
  if (name === "embeddings") {
4005
3997
  return embeddingProxy;
4006
3998
  }
3999
+ if (name === "moderations") {
4000
+ return moderationProxy;
4001
+ }
4007
4002
  if (name === "beta" && betaProxy) {
4008
4003
  return betaProxy;
4009
4004
  }
4010
4005
  return Reflect.get(target, name, receiver);
4011
4006
  }
4012
4007
  });
4013
- return proxy;
4014
4008
  }
4015
4009
  function logCompletionResponse(startTime, response, span) {
4016
4010
  span.log({
@@ -4159,7 +4153,7 @@ function wrapChatCompletion(completion) {
4159
4153
  }
4160
4154
  };
4161
4155
  }
4162
- function parseChatCompletionParams(allParams) {
4156
+ function parseBaseParams(allParams, inputField) {
4163
4157
  const { span_info, ...params } = allParams;
4164
4158
  const { metadata: spanInfoMetadata, ...spanInfoRest } = span_info ?? {};
4165
4159
  let ret = {
@@ -4168,10 +4162,12 @@ function parseChatCompletionParams(allParams) {
4168
4162
  metadata: spanInfoMetadata
4169
4163
  }
4170
4164
  };
4171
- const { messages, ...paramsRest } = params;
4172
- return mergeDicts2(ret, { event: { input: messages, metadata: paramsRest } });
4165
+ const input = params[inputField];
4166
+ const paramsRest = { ...params };
4167
+ delete paramsRest[inputField];
4168
+ return mergeDicts2(ret, { event: { input, metadata: paramsRest } });
4173
4169
  }
4174
- function wrapEmbeddings(create) {
4170
+ function createApiWrapper(name, create, processResponse, parseParams) {
4175
4171
  return async (allParams, options) => {
4176
4172
  const { span_info: _, ...params } = allParams;
4177
4173
  return traced(
@@ -4181,42 +4177,61 @@ function wrapEmbeddings(create) {
4181
4177
  options
4182
4178
  ).withResponse();
4183
4179
  logHeaders(response, span);
4184
- const embedding_length = result.data[0].embedding.length;
4185
- span.log({
4186
- // TODO: Add a flag to control whether to log the full embedding vector,
4187
- // possibly w/ JSON compression.
4188
- output: { embedding_length },
4189
- metrics: {
4190
- tokens: result.usage?.total_tokens,
4191
- prompt_tokens: result.usage?.prompt_tokens
4192
- }
4193
- });
4180
+ processResponse(result, span);
4194
4181
  return result;
4195
4182
  },
4196
4183
  mergeDicts2(
4197
4184
  {
4198
- name: "Embedding",
4185
+ name,
4199
4186
  spanAttributes: {
4200
4187
  type: SpanTypeAttribute2.LLM
4201
4188
  }
4202
4189
  },
4203
- parseEmbeddingParams(allParams)
4190
+ parseParams(allParams)
4204
4191
  )
4205
4192
  );
4206
4193
  };
4207
4194
  }
4208
- function parseEmbeddingParams(allParams) {
4209
- const { span_info, ...params } = allParams;
4210
- const { metadata: spanInfoMetadata, ...spanInfoRest } = span_info ?? {};
4211
- let ret = {
4212
- ...spanInfoRest,
4213
- event: {
4214
- metadata: spanInfoMetadata
4195
+ function createEndpointProxy(target, wrapperFn) {
4196
+ return new Proxy(target, {
4197
+ get(target2, name, receiver) {
4198
+ const baseVal = Reflect.get(target2, name, receiver);
4199
+ if (name === "create") {
4200
+ return wrapperFn(baseVal.bind(target2));
4201
+ }
4202
+ return baseVal;
4215
4203
  }
4216
- };
4217
- const { input, ...paramsRest } = params;
4218
- return mergeDicts2(ret, { event: { input, metadata: paramsRest } });
4204
+ });
4205
+ }
4206
+ function parseChatCompletionParams(params) {
4207
+ return parseBaseParams(params, "messages");
4208
+ }
4209
+ function processEmbeddingResponse(result, span) {
4210
+ span.log({
4211
+ output: { embedding_length: result.data[0].embedding.length },
4212
+ metrics: {
4213
+ tokens: result.usage?.total_tokens,
4214
+ prompt_tokens: result.usage?.prompt_tokens
4215
+ }
4216
+ });
4217
+ }
4218
+ function processModerationResponse(result, span) {
4219
+ span.log({
4220
+ output: result.results
4221
+ });
4219
4222
  }
4223
+ var wrapEmbeddings = (create) => createApiWrapper(
4224
+ "Embedding",
4225
+ create,
4226
+ processEmbeddingResponse,
4227
+ (params) => parseBaseParams(params, "input")
4228
+ );
4229
+ var wrapModerations = (create) => createApiWrapper(
4230
+ "Moderation",
4231
+ create,
4232
+ processModerationResponse,
4233
+ (params) => parseBaseParams(params, "input")
4234
+ );
4220
4235
  function postprocessStreamingResults(allResults) {
4221
4236
  let role = void 0;
4222
4237
  let content = void 0;
package/dist/cli.js CHANGED
@@ -1236,7 +1236,7 @@ var require_package = __commonJS({
1236
1236
  "package.json"(exports2, module2) {
1237
1237
  module2.exports = {
1238
1238
  name: "braintrust",
1239
- version: "0.0.181",
1239
+ version: "0.0.183",
1240
1240
  description: "SDK for integrating Braintrust",
1241
1241
  repository: {
1242
1242
  type: "git",
@@ -1311,7 +1311,7 @@ var require_package = __commonJS({
1311
1311
  },
1312
1312
  dependencies: {
1313
1313
  "@ai-sdk/provider": "^1.0.1",
1314
- "@braintrust/core": "0.0.75",
1314
+ "@braintrust/core": "0.0.77",
1315
1315
  "@next/env": "^14.2.3",
1316
1316
  "@vercel/functions": "^1.0.2",
1317
1317
  ai: "^3.2.16",
@@ -4404,6 +4404,7 @@ var Dataset = class extends ObjectFetcher {
4404
4404
  this.lazyMetadata = lazyMetadata;
4405
4405
  }
4406
4406
  lazyMetadata;
4407
+ __braintrust_dataset_marker = true;
4407
4408
  get id() {
4408
4409
  return (async () => {
4409
4410
  return (await this.lazyMetadata.get()).dataset.id;
@@ -4606,6 +4607,9 @@ var Dataset = class extends ObjectFetcher {
4606
4607
  );
4607
4608
  return this.id;
4608
4609
  }
4610
+ static isDataset(data) {
4611
+ return typeof data === "object" && data !== null && "__braintrust_dataset_marker" in data;
4612
+ }
4609
4613
  };
4610
4614
  function renderMessage(render, message) {
4611
4615
  return {
@@ -6099,7 +6103,7 @@ async function runEvaluatorInternal(experiment, evaluator, progressReporter, fil
6099
6103
  const q = queue(
6100
6104
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
6101
6105
  async (datum) => {
6102
- const eventDataset = experiment ? experiment.dataset : evaluator.data instanceof Dataset ? evaluator.data : void 0;
6106
+ const eventDataset = experiment ? experiment.dataset : Dataset.isDataset(evaluator.data) ? evaluator.data : void 0;
6103
6107
  const baseEvent = {
6104
6108
  name: "eval",
6105
6109
  spanAttributes: {
@@ -7821,7 +7825,7 @@ async function initExperiment2(evaluator, evaluatorData) {
7821
7825
  baseExperimentId: evaluator.baseExperimentId,
7822
7826
  gitMetadataSettings: evaluator.gitMetadataSettings,
7823
7827
  repoInfo: evaluator.repoInfo,
7824
- dataset: data instanceof Dataset ? data : void 0,
7828
+ dataset: Dataset.isDataset(data) ? data : void 0,
7825
7829
  setCurrent: false
7826
7830
  });
7827
7831
  const info = await logger.summarize({ summarizeScores: false });
package/dist/index.d.mts CHANGED
@@ -1276,6 +1276,7 @@ declare class SpanImpl implements Span {
1276
1276
  declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY_DATASET> extends ObjectFetcher<DatasetRecord<IsLegacyDataset>> {
1277
1277
  private state;
1278
1278
  private readonly lazyMetadata;
1279
+ private readonly __braintrust_dataset_marker;
1279
1280
  constructor(state: BraintrustState, lazyMetadata: LazyValue<ProjectDatasetMetadata>, pinnedVersion?: string, legacy?: IsLegacyDataset);
1280
1281
  get id(): Promise<string>;
1281
1282
  get name(): Promise<string>;
@@ -1345,6 +1346,7 @@ declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY
1345
1346
  * @deprecated This function is deprecated. You can simply remove it from your code.
1346
1347
  */
1347
1348
  close(): Promise<string>;
1349
+ static isDataset(data: unknown): data is Dataset;
1348
1350
  }
1349
1351
  type CompiledPromptParams = Omit<NonNullable<PromptData["options"]>["params"], "use_cache"> & {
1350
1352
  model: NonNullable<NonNullable<PromptData["options"]>["model"]>;
@@ -2200,6 +2202,7 @@ interface ChatLike {
2200
2202
  interface OpenAILike {
2201
2203
  chat: ChatLike;
2202
2204
  embeddings: any;
2205
+ moderations: any;
2203
2206
  beta?: BetaLike;
2204
2207
  }
2205
2208
  declare global {
package/dist/index.d.ts CHANGED
@@ -1276,6 +1276,7 @@ declare class SpanImpl implements Span {
1276
1276
  declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY_DATASET> extends ObjectFetcher<DatasetRecord<IsLegacyDataset>> {
1277
1277
  private state;
1278
1278
  private readonly lazyMetadata;
1279
+ private readonly __braintrust_dataset_marker;
1279
1280
  constructor(state: BraintrustState, lazyMetadata: LazyValue<ProjectDatasetMetadata>, pinnedVersion?: string, legacy?: IsLegacyDataset);
1280
1281
  get id(): Promise<string>;
1281
1282
  get name(): Promise<string>;
@@ -1345,6 +1346,7 @@ declare class Dataset<IsLegacyDataset extends boolean = typeof DEFAULT_IS_LEGACY
1345
1346
  * @deprecated This function is deprecated. You can simply remove it from your code.
1346
1347
  */
1347
1348
  close(): Promise<string>;
1349
+ static isDataset(data: unknown): data is Dataset;
1348
1350
  }
1349
1351
  type CompiledPromptParams = Omit<NonNullable<PromptData["options"]>["params"], "use_cache"> & {
1350
1352
  model: NonNullable<NonNullable<PromptData["options"]>["model"]>;
@@ -2200,6 +2202,7 @@ interface ChatLike {
2200
2202
  interface OpenAILike {
2201
2203
  chat: ChatLike;
2202
2204
  embeddings: any;
2205
+ moderations: any;
2203
2206
  beta?: BetaLike;
2204
2207
  }
2205
2208
  declare global {
package/dist/index.js CHANGED
@@ -3673,6 +3673,7 @@ var Dataset = class extends ObjectFetcher {
3673
3673
  this.lazyMetadata = lazyMetadata;
3674
3674
  }
3675
3675
  lazyMetadata;
3676
+ __braintrust_dataset_marker = true;
3676
3677
  get id() {
3677
3678
  return (async () => {
3678
3679
  return (await this.lazyMetadata.get()).dataset.id;
@@ -3875,6 +3876,9 @@ var Dataset = class extends ObjectFetcher {
3875
3876
  );
3876
3877
  return this.id;
3877
3878
  }
3879
+ static isDataset(data) {
3880
+ return typeof data === "object" && data !== null && "__braintrust_dataset_marker" in data;
3881
+ }
3878
3882
  };
3879
3883
  function renderMessage(render, message) {
3880
3884
  return {
@@ -5485,7 +5489,7 @@ async function Eval(name, evaluator, reporterOrOpts) {
5485
5489
  baseExperimentId: evaluator.baseExperimentId,
5486
5490
  gitMetadataSettings: evaluator.gitMetadataSettings,
5487
5491
  repoInfo: evaluator.repoInfo,
5488
- dataset: data instanceof Dataset ? data : void 0
5492
+ dataset: Dataset.isDataset(data) ? data : void 0
5489
5493
  });
5490
5494
  if (experiment && options.onStart) {
5491
5495
  const summary = await experiment.summarize({ summarizeScores: false });
@@ -5636,7 +5640,7 @@ async function runEvaluatorInternal(experiment, evaluator, progressReporter, fil
5636
5640
  const q = queue(
5637
5641
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
5638
5642
  async (datum) => {
5639
- const eventDataset = experiment ? experiment.dataset : evaluator.data instanceof Dataset ? evaluator.data : void 0;
5643
+ const eventDataset = experiment ? experiment.dataset : Dataset.isDataset(evaluator.data) ? evaluator.data : void 0;
5640
5644
  const baseEvent = {
5641
5645
  name: "eval",
5642
5646
  spanAttributes: {
@@ -6190,16 +6194,11 @@ function wrapOpenAI(openai) {
6190
6194
  }
6191
6195
  globalThis.__inherited_braintrust_wrap_openai = wrapOpenAI;
6192
6196
  function wrapOpenAIv4(openai) {
6193
- let completionProxy = new Proxy(openai.chat.completions, {
6194
- get(target, name, receiver) {
6195
- const baseVal = Reflect.get(target, name, receiver);
6196
- if (name === "create") {
6197
- return wrapChatCompletion(baseVal.bind(target));
6198
- }
6199
- return baseVal;
6200
- }
6201
- });
6202
- let chatProxy = new Proxy(openai.chat, {
6197
+ const completionProxy = createEndpointProxy(
6198
+ openai.chat.completions,
6199
+ wrapChatCompletion
6200
+ );
6201
+ const chatProxy = new Proxy(openai.chat, {
6203
6202
  get(target, name, receiver) {
6204
6203
  if (name === "completions") {
6205
6204
  return completionProxy;
@@ -6207,18 +6206,11 @@ function wrapOpenAIv4(openai) {
6207
6206
  return Reflect.get(target, name, receiver);
6208
6207
  }
6209
6208
  });
6210
- let embeddingProxy = new Proxy(openai.embeddings, {
6211
- get(target, name, receiver) {
6212
- const baseVal = Reflect.get(target, name, receiver);
6213
- if (name === "create") {
6214
- return wrapEmbeddings(baseVal.bind(target));
6215
- }
6216
- return baseVal;
6217
- }
6218
- });
6209
+ const embeddingProxy = createEndpointProxy(openai.embeddings, wrapEmbeddings);
6210
+ const moderationProxy = createEndpointProxy(openai.moderations, wrapModerations);
6219
6211
  let betaProxy;
6220
6212
  if (openai.beta?.chat?.completions?.stream) {
6221
- let betaChatCompletionProxy = new Proxy(openai?.beta?.chat.completions, {
6213
+ const betaChatCompletionProxy = new Proxy(openai?.beta?.chat.completions, {
6222
6214
  get(target, name, receiver) {
6223
6215
  const baseVal = Reflect.get(target, name, receiver);
6224
6216
  if (name === "parse") {
@@ -6229,7 +6221,7 @@ function wrapOpenAIv4(openai) {
6229
6221
  return baseVal;
6230
6222
  }
6231
6223
  });
6232
- let betaChatProxy = new Proxy(openai.beta.chat, {
6224
+ const betaChatProxy = new Proxy(openai.beta.chat, {
6233
6225
  get(target, name, receiver) {
6234
6226
  if (name === "completions") {
6235
6227
  return betaChatCompletionProxy;
@@ -6246,7 +6238,7 @@ function wrapOpenAIv4(openai) {
6246
6238
  }
6247
6239
  });
6248
6240
  }
6249
- let proxy = new Proxy(openai, {
6241
+ return new Proxy(openai, {
6250
6242
  get(target, name, receiver) {
6251
6243
  if (name === "chat") {
6252
6244
  return chatProxy;
@@ -6254,13 +6246,15 @@ function wrapOpenAIv4(openai) {
6254
6246
  if (name === "embeddings") {
6255
6247
  return embeddingProxy;
6256
6248
  }
6249
+ if (name === "moderations") {
6250
+ return moderationProxy;
6251
+ }
6257
6252
  if (name === "beta" && betaProxy) {
6258
6253
  return betaProxy;
6259
6254
  }
6260
6255
  return Reflect.get(target, name, receiver);
6261
6256
  }
6262
6257
  });
6263
- return proxy;
6264
6258
  }
6265
6259
  function logCompletionResponse(startTime, response, span) {
6266
6260
  span.log({
@@ -6409,7 +6403,7 @@ function wrapChatCompletion(completion) {
6409
6403
  }
6410
6404
  };
6411
6405
  }
6412
- function parseChatCompletionParams(allParams) {
6406
+ function parseBaseParams(allParams, inputField) {
6413
6407
  const { span_info, ...params } = allParams;
6414
6408
  const { metadata: spanInfoMetadata, ...spanInfoRest } = span_info ?? {};
6415
6409
  let ret = {
@@ -6418,10 +6412,12 @@ function parseChatCompletionParams(allParams) {
6418
6412
  metadata: spanInfoMetadata
6419
6413
  }
6420
6414
  };
6421
- const { messages, ...paramsRest } = params;
6422
- return (0, import_core4.mergeDicts)(ret, { event: { input: messages, metadata: paramsRest } });
6415
+ const input = params[inputField];
6416
+ const paramsRest = { ...params };
6417
+ delete paramsRest[inputField];
6418
+ return (0, import_core4.mergeDicts)(ret, { event: { input, metadata: paramsRest } });
6423
6419
  }
6424
- function wrapEmbeddings(create) {
6420
+ function createApiWrapper(name, create, processResponse, parseParams) {
6425
6421
  return async (allParams, options) => {
6426
6422
  const { span_info: _, ...params } = allParams;
6427
6423
  return traced(
@@ -6431,42 +6427,61 @@ function wrapEmbeddings(create) {
6431
6427
  options
6432
6428
  ).withResponse();
6433
6429
  logHeaders(response, span);
6434
- const embedding_length = result.data[0].embedding.length;
6435
- span.log({
6436
- // TODO: Add a flag to control whether to log the full embedding vector,
6437
- // possibly w/ JSON compression.
6438
- output: { embedding_length },
6439
- metrics: {
6440
- tokens: result.usage?.total_tokens,
6441
- prompt_tokens: result.usage?.prompt_tokens
6442
- }
6443
- });
6430
+ processResponse(result, span);
6444
6431
  return result;
6445
6432
  },
6446
6433
  (0, import_core4.mergeDicts)(
6447
6434
  {
6448
- name: "Embedding",
6435
+ name,
6449
6436
  spanAttributes: {
6450
6437
  type: import_core3.SpanTypeAttribute.LLM
6451
6438
  }
6452
6439
  },
6453
- parseEmbeddingParams(allParams)
6440
+ parseParams(allParams)
6454
6441
  )
6455
6442
  );
6456
6443
  };
6457
6444
  }
6458
- function parseEmbeddingParams(allParams) {
6459
- const { span_info, ...params } = allParams;
6460
- const { metadata: spanInfoMetadata, ...spanInfoRest } = span_info ?? {};
6461
- let ret = {
6462
- ...spanInfoRest,
6463
- event: {
6464
- metadata: spanInfoMetadata
6445
+ function createEndpointProxy(target, wrapperFn) {
6446
+ return new Proxy(target, {
6447
+ get(target2, name, receiver) {
6448
+ const baseVal = Reflect.get(target2, name, receiver);
6449
+ if (name === "create") {
6450
+ return wrapperFn(baseVal.bind(target2));
6451
+ }
6452
+ return baseVal;
6465
6453
  }
6466
- };
6467
- const { input, ...paramsRest } = params;
6468
- return (0, import_core4.mergeDicts)(ret, { event: { input, metadata: paramsRest } });
6454
+ });
6455
+ }
6456
+ function parseChatCompletionParams(params) {
6457
+ return parseBaseParams(params, "messages");
6458
+ }
6459
+ function processEmbeddingResponse(result, span) {
6460
+ span.log({
6461
+ output: { embedding_length: result.data[0].embedding.length },
6462
+ metrics: {
6463
+ tokens: result.usage?.total_tokens,
6464
+ prompt_tokens: result.usage?.prompt_tokens
6465
+ }
6466
+ });
6467
+ }
6468
+ function processModerationResponse(result, span) {
6469
+ span.log({
6470
+ output: result.results
6471
+ });
6469
6472
  }
6473
+ var wrapEmbeddings = (create) => createApiWrapper(
6474
+ "Embedding",
6475
+ create,
6476
+ processEmbeddingResponse,
6477
+ (params) => parseBaseParams(params, "input")
6478
+ );
6479
+ var wrapModerations = (create) => createApiWrapper(
6480
+ "Moderation",
6481
+ create,
6482
+ processModerationResponse,
6483
+ (params) => parseBaseParams(params, "input")
6484
+ );
6470
6485
  function postprocessStreamingResults(allResults) {
6471
6486
  let role = void 0;
6472
6487
  let content = void 0;
package/dist/index.mjs CHANGED
@@ -3605,6 +3605,7 @@ var Dataset = class extends ObjectFetcher {
3605
3605
  this.lazyMetadata = lazyMetadata;
3606
3606
  }
3607
3607
  lazyMetadata;
3608
+ __braintrust_dataset_marker = true;
3608
3609
  get id() {
3609
3610
  return (async () => {
3610
3611
  return (await this.lazyMetadata.get()).dataset.id;
@@ -3807,6 +3808,9 @@ var Dataset = class extends ObjectFetcher {
3807
3808
  );
3808
3809
  return this.id;
3809
3810
  }
3811
+ static isDataset(data) {
3812
+ return typeof data === "object" && data !== null && "__braintrust_dataset_marker" in data;
3813
+ }
3810
3814
  };
3811
3815
  function renderMessage(render, message) {
3812
3816
  return {
@@ -5419,7 +5423,7 @@ async function Eval(name, evaluator, reporterOrOpts) {
5419
5423
  baseExperimentId: evaluator.baseExperimentId,
5420
5424
  gitMetadataSettings: evaluator.gitMetadataSettings,
5421
5425
  repoInfo: evaluator.repoInfo,
5422
- dataset: data instanceof Dataset ? data : void 0
5426
+ dataset: Dataset.isDataset(data) ? data : void 0
5423
5427
  });
5424
5428
  if (experiment && options.onStart) {
5425
5429
  const summary = await experiment.summarize({ summarizeScores: false });
@@ -5570,7 +5574,7 @@ async function runEvaluatorInternal(experiment, evaluator, progressReporter, fil
5570
5574
  const q = queue(
5571
5575
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
5572
5576
  async (datum) => {
5573
- const eventDataset = experiment ? experiment.dataset : evaluator.data instanceof Dataset ? evaluator.data : void 0;
5577
+ const eventDataset = experiment ? experiment.dataset : Dataset.isDataset(evaluator.data) ? evaluator.data : void 0;
5574
5578
  const baseEvent = {
5575
5579
  name: "eval",
5576
5580
  spanAttributes: {
@@ -6126,16 +6130,11 @@ function wrapOpenAI(openai) {
6126
6130
  }
6127
6131
  globalThis.__inherited_braintrust_wrap_openai = wrapOpenAI;
6128
6132
  function wrapOpenAIv4(openai) {
6129
- let completionProxy = new Proxy(openai.chat.completions, {
6130
- get(target, name, receiver) {
6131
- const baseVal = Reflect.get(target, name, receiver);
6132
- if (name === "create") {
6133
- return wrapChatCompletion(baseVal.bind(target));
6134
- }
6135
- return baseVal;
6136
- }
6137
- });
6138
- let chatProxy = new Proxy(openai.chat, {
6133
+ const completionProxy = createEndpointProxy(
6134
+ openai.chat.completions,
6135
+ wrapChatCompletion
6136
+ );
6137
+ const chatProxy = new Proxy(openai.chat, {
6139
6138
  get(target, name, receiver) {
6140
6139
  if (name === "completions") {
6141
6140
  return completionProxy;
@@ -6143,18 +6142,11 @@ function wrapOpenAIv4(openai) {
6143
6142
  return Reflect.get(target, name, receiver);
6144
6143
  }
6145
6144
  });
6146
- let embeddingProxy = new Proxy(openai.embeddings, {
6147
- get(target, name, receiver) {
6148
- const baseVal = Reflect.get(target, name, receiver);
6149
- if (name === "create") {
6150
- return wrapEmbeddings(baseVal.bind(target));
6151
- }
6152
- return baseVal;
6153
- }
6154
- });
6145
+ const embeddingProxy = createEndpointProxy(openai.embeddings, wrapEmbeddings);
6146
+ const moderationProxy = createEndpointProxy(openai.moderations, wrapModerations);
6155
6147
  let betaProxy;
6156
6148
  if (openai.beta?.chat?.completions?.stream) {
6157
- let betaChatCompletionProxy = new Proxy(openai?.beta?.chat.completions, {
6149
+ const betaChatCompletionProxy = new Proxy(openai?.beta?.chat.completions, {
6158
6150
  get(target, name, receiver) {
6159
6151
  const baseVal = Reflect.get(target, name, receiver);
6160
6152
  if (name === "parse") {
@@ -6165,7 +6157,7 @@ function wrapOpenAIv4(openai) {
6165
6157
  return baseVal;
6166
6158
  }
6167
6159
  });
6168
- let betaChatProxy = new Proxy(openai.beta.chat, {
6160
+ const betaChatProxy = new Proxy(openai.beta.chat, {
6169
6161
  get(target, name, receiver) {
6170
6162
  if (name === "completions") {
6171
6163
  return betaChatCompletionProxy;
@@ -6182,7 +6174,7 @@ function wrapOpenAIv4(openai) {
6182
6174
  }
6183
6175
  });
6184
6176
  }
6185
- let proxy = new Proxy(openai, {
6177
+ return new Proxy(openai, {
6186
6178
  get(target, name, receiver) {
6187
6179
  if (name === "chat") {
6188
6180
  return chatProxy;
@@ -6190,13 +6182,15 @@ function wrapOpenAIv4(openai) {
6190
6182
  if (name === "embeddings") {
6191
6183
  return embeddingProxy;
6192
6184
  }
6185
+ if (name === "moderations") {
6186
+ return moderationProxy;
6187
+ }
6193
6188
  if (name === "beta" && betaProxy) {
6194
6189
  return betaProxy;
6195
6190
  }
6196
6191
  return Reflect.get(target, name, receiver);
6197
6192
  }
6198
6193
  });
6199
- return proxy;
6200
6194
  }
6201
6195
  function logCompletionResponse(startTime, response, span) {
6202
6196
  span.log({
@@ -6345,7 +6339,7 @@ function wrapChatCompletion(completion) {
6345
6339
  }
6346
6340
  };
6347
6341
  }
6348
- function parseChatCompletionParams(allParams) {
6342
+ function parseBaseParams(allParams, inputField) {
6349
6343
  const { span_info, ...params } = allParams;
6350
6344
  const { metadata: spanInfoMetadata, ...spanInfoRest } = span_info ?? {};
6351
6345
  let ret = {
@@ -6354,10 +6348,12 @@ function parseChatCompletionParams(allParams) {
6354
6348
  metadata: spanInfoMetadata
6355
6349
  }
6356
6350
  };
6357
- const { messages, ...paramsRest } = params;
6358
- return mergeDicts3(ret, { event: { input: messages, metadata: paramsRest } });
6351
+ const input = params[inputField];
6352
+ const paramsRest = { ...params };
6353
+ delete paramsRest[inputField];
6354
+ return mergeDicts3(ret, { event: { input, metadata: paramsRest } });
6359
6355
  }
6360
- function wrapEmbeddings(create) {
6356
+ function createApiWrapper(name, create, processResponse, parseParams) {
6361
6357
  return async (allParams, options) => {
6362
6358
  const { span_info: _, ...params } = allParams;
6363
6359
  return traced(
@@ -6367,42 +6363,61 @@ function wrapEmbeddings(create) {
6367
6363
  options
6368
6364
  ).withResponse();
6369
6365
  logHeaders(response, span);
6370
- const embedding_length = result.data[0].embedding.length;
6371
- span.log({
6372
- // TODO: Add a flag to control whether to log the full embedding vector,
6373
- // possibly w/ JSON compression.
6374
- output: { embedding_length },
6375
- metrics: {
6376
- tokens: result.usage?.total_tokens,
6377
- prompt_tokens: result.usage?.prompt_tokens
6378
- }
6379
- });
6366
+ processResponse(result, span);
6380
6367
  return result;
6381
6368
  },
6382
6369
  mergeDicts3(
6383
6370
  {
6384
- name: "Embedding",
6371
+ name,
6385
6372
  spanAttributes: {
6386
6373
  type: SpanTypeAttribute3.LLM
6387
6374
  }
6388
6375
  },
6389
- parseEmbeddingParams(allParams)
6376
+ parseParams(allParams)
6390
6377
  )
6391
6378
  );
6392
6379
  };
6393
6380
  }
6394
- function parseEmbeddingParams(allParams) {
6395
- const { span_info, ...params } = allParams;
6396
- const { metadata: spanInfoMetadata, ...spanInfoRest } = span_info ?? {};
6397
- let ret = {
6398
- ...spanInfoRest,
6399
- event: {
6400
- metadata: spanInfoMetadata
6381
+ function createEndpointProxy(target, wrapperFn) {
6382
+ return new Proxy(target, {
6383
+ get(target2, name, receiver) {
6384
+ const baseVal = Reflect.get(target2, name, receiver);
6385
+ if (name === "create") {
6386
+ return wrapperFn(baseVal.bind(target2));
6387
+ }
6388
+ return baseVal;
6401
6389
  }
6402
- };
6403
- const { input, ...paramsRest } = params;
6404
- return mergeDicts3(ret, { event: { input, metadata: paramsRest } });
6390
+ });
6391
+ }
6392
+ function parseChatCompletionParams(params) {
6393
+ return parseBaseParams(params, "messages");
6394
+ }
6395
+ function processEmbeddingResponse(result, span) {
6396
+ span.log({
6397
+ output: { embedding_length: result.data[0].embedding.length },
6398
+ metrics: {
6399
+ tokens: result.usage?.total_tokens,
6400
+ prompt_tokens: result.usage?.prompt_tokens
6401
+ }
6402
+ });
6403
+ }
6404
+ function processModerationResponse(result, span) {
6405
+ span.log({
6406
+ output: result.results
6407
+ });
6405
6408
  }
6409
+ var wrapEmbeddings = (create) => createApiWrapper(
6410
+ "Embedding",
6411
+ create,
6412
+ processEmbeddingResponse,
6413
+ (params) => parseBaseParams(params, "input")
6414
+ );
6415
+ var wrapModerations = (create) => createApiWrapper(
6416
+ "Moderation",
6417
+ create,
6418
+ processModerationResponse,
6419
+ (params) => parseBaseParams(params, "input")
6420
+ );
6406
6421
  function postprocessStreamingResults(allResults) {
6407
6422
  let role = void 0;
6408
6423
  let content = void 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braintrust",
3
- "version": "0.0.181",
3
+ "version": "0.0.183",
4
4
  "description": "SDK for integrating Braintrust",
5
5
  "repository": {
6
6
  "type": "git",
@@ -75,7 +75,7 @@
75
75
  },
76
76
  "dependencies": {
77
77
  "@ai-sdk/provider": "^1.0.1",
78
- "@braintrust/core": "0.0.75",
78
+ "@braintrust/core": "0.0.77",
79
79
  "@next/env": "^14.2.3",
80
80
  "@vercel/functions": "^1.0.2",
81
81
  "ai": "^3.2.16",
package/turbo.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "extends": ["//"],
3
- "pipeline": {
3
+ "tasks": {
4
4
  "build": {
5
5
  "outputs": ["**/dist/**"]
6
6
  },