braintrust 0.0.93 → 0.0.94

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/cli.js CHANGED
@@ -9065,7 +9065,7 @@ var require_package = __commonJS({
9065
9065
  "package.json"(exports2, module2) {
9066
9066
  module2.exports = {
9067
9067
  name: "braintrust",
9068
- version: "0.0.93",
9068
+ version: "0.0.94",
9069
9069
  description: "SDK for integrating Braintrust",
9070
9070
  main: "./dist/index.js",
9071
9071
  browser: {
@@ -10644,6 +10644,21 @@ function getCurrentUnixTimestamp() {
10644
10644
  function isEmpty(a) {
10645
10645
  return a === void 0 || a === null;
10646
10646
  }
10647
+ var LazyValue = class {
10648
+ constructor(callable) {
10649
+ this.value = {
10650
+ hasComputed: false
10651
+ };
10652
+ this.callable = callable;
10653
+ }
10654
+ async get() {
10655
+ if (this.value.hasComputed) {
10656
+ return this.value.val;
10657
+ }
10658
+ this.value = { hasComputed: true, val: await this.callable() };
10659
+ return this.value.val;
10660
+ }
10661
+ };
10647
10662
 
10648
10663
  // src/logger.ts
10649
10664
  var NoopSpan = class {
@@ -10858,25 +10873,25 @@ function logFeedbackImpl(bgLogger, parentIds, {
10858
10873
  updateEvent = Object.fromEntries(
10859
10874
  Object.entries(updateEvent).filter(([_, v]) => !isEmpty(v))
10860
10875
  );
10861
- const trueParentIds = (async () => {
10862
- const { kind, ...ids } = await parentIds;
10876
+ const trueParentIds = new LazyValue(async () => {
10877
+ const { kind, ...ids } = await parentIds.get();
10863
10878
  return ids;
10864
- })();
10879
+ });
10865
10880
  if (Object.keys(updateEvent).length > 0) {
10866
- const record = (async () => {
10881
+ const record = new LazyValue(async () => {
10867
10882
  return {
10868
10883
  id,
10869
10884
  ...updateEvent,
10870
- ...await trueParentIds,
10885
+ ...await trueParentIds.get(),
10871
10886
  [AUDIT_SOURCE_FIELD]: source,
10872
10887
  [AUDIT_METADATA_FIELD]: metadata,
10873
10888
  [IS_MERGE_FIELD]: true
10874
10889
  };
10875
- })();
10890
+ });
10876
10891
  bgLogger.log([record]);
10877
10892
  }
10878
10893
  if (!isEmpty(comment)) {
10879
- const record = (async () => {
10894
+ const record = new LazyValue(async () => {
10880
10895
  return {
10881
10896
  id: v4_default(),
10882
10897
  created: (/* @__PURE__ */ new Date()).toISOString(),
@@ -10888,11 +10903,11 @@ function logFeedbackImpl(bgLogger, parentIds, {
10888
10903
  comment: {
10889
10904
  text: comment
10890
10905
  },
10891
- ...await trueParentIds,
10906
+ ...await trueParentIds.get(),
10892
10907
  [AUDIT_SOURCE_FIELD]: source,
10893
10908
  [AUDIT_METADATA_FIELD]: metadata
10894
10909
  };
10895
- })();
10910
+ });
10896
10911
  bgLogger.log([record]);
10897
10912
  }
10898
10913
  }
@@ -10924,9 +10939,20 @@ var BackgroundLogger = class {
10924
10939
  }
10925
10940
  async flush_once(batchSize = DefaultBatchSize) {
10926
10941
  this.active_flush_resolved = false;
10927
- const itemPromises = this.items;
10942
+ const itemLazyValues = this.items;
10928
10943
  this.items = [];
10929
- const allItems = mergeRowBatch(await Promise.all(itemPromises)).reverse();
10944
+ const allItems = await (async () => {
10945
+ try {
10946
+ const itemPromises = itemLazyValues.map((x) => x.get());
10947
+ return mergeRowBatch(await Promise.all(itemPromises)).reverse();
10948
+ } catch (e) {
10949
+ console.warn(
10950
+ "Encountered error when constructing records to flush:\n",
10951
+ e
10952
+ );
10953
+ return [];
10954
+ }
10955
+ })();
10930
10956
  let postPromises = [];
10931
10957
  while (true) {
10932
10958
  const items = [];
@@ -10951,9 +10977,7 @@ var BackgroundLogger = class {
10951
10977
  for (let i = 0; i < NumRetries; i++) {
10952
10978
  const startTime = now();
10953
10979
  try {
10954
- return (await (await this.logConn).post_json("logs", itemsS)).map(
10955
- (res) => res.id
10956
- );
10980
+ return (await (await this.logConn.get()).post_json("logs", itemsS)).map((res) => res.id);
10957
10981
  } catch (e) {
10958
10982
  const retryingText = i + 1 === NumRetries ? "" : " Retrying";
10959
10983
  const errMsg = (() => {
@@ -11006,82 +11030,86 @@ function init(project, options = {}) {
11006
11030
  metadata,
11007
11031
  gitMetadataSettings
11008
11032
  } = options || {};
11009
- const lazyMetadata = (async () => {
11010
- await login({
11011
- orgName,
11012
- apiKey,
11013
- appUrl
11014
- });
11015
- const args = {
11016
- project_name: project,
11017
- org_id: _state.orgId
11018
- };
11019
- if (experiment) {
11020
- args["experiment_name"] = experiment;
11021
- }
11022
- if (description) {
11023
- args["description"] = description;
11024
- }
11025
- if (update) {
11026
- args["update"] = update;
11027
- }
11028
- let mergedGitMetadataSettings = {
11029
- ..._state.gitMetadataSettings || {
11030
- collect: "all"
11033
+ const lazyMetadata = new LazyValue(
11034
+ async () => {
11035
+ await login({
11036
+ orgName,
11037
+ apiKey,
11038
+ appUrl
11039
+ });
11040
+ const args = {
11041
+ project_name: project,
11042
+ org_id: _state.orgId
11043
+ };
11044
+ if (experiment) {
11045
+ args["experiment_name"] = experiment;
11031
11046
  }
11032
- };
11033
- if (gitMetadataSettings) {
11034
- mergedGitMetadataSettings = mergeGitMetadataSettings(
11035
- mergedGitMetadataSettings,
11036
- gitMetadataSettings
11037
- );
11038
- }
11039
- const repoStatus2 = await isomorph_default.getRepoStatus(gitMetadataSettings);
11040
- if (repoStatus2) {
11041
- args["repo_info"] = repoStatus2;
11042
- }
11043
- if (baseExperiment) {
11044
- args["base_experiment"] = baseExperiment;
11045
- } else {
11046
- args["ancestor_commits"] = await isomorph_default.getPastNAncestors();
11047
- }
11048
- if (dataset !== void 0) {
11049
- args["dataset_id"] = dataset.id;
11050
- args["dataset_version"] = await dataset.version();
11051
- }
11052
- if (isPublic !== void 0) {
11053
- args["public"] = isPublic;
11054
- }
11055
- if (metadata) {
11056
- args["metadata"] = metadata;
11057
- }
11058
- let response = null;
11059
- while (true) {
11060
- try {
11061
- response = await _state.apiConn().post_json("api/experiment/register", args);
11062
- break;
11063
- } catch (e) {
11064
- if (args["base_experiment"] && `${"data" in e && e.data}`.includes("base experiment")) {
11065
- console.warn(`Base experiment ${args["base_experiment"]} not found.`);
11066
- delete args["base_experiment"];
11067
- } else {
11068
- throw e;
11047
+ if (description) {
11048
+ args["description"] = description;
11049
+ }
11050
+ if (update) {
11051
+ args["update"] = update;
11052
+ }
11053
+ let mergedGitMetadataSettings = {
11054
+ ..._state.gitMetadataSettings || {
11055
+ collect: "all"
11069
11056
  }
11057
+ };
11058
+ if (gitMetadataSettings) {
11059
+ mergedGitMetadataSettings = mergeGitMetadataSettings(
11060
+ mergedGitMetadataSettings,
11061
+ gitMetadataSettings
11062
+ );
11070
11063
  }
11071
- }
11072
- return {
11073
- project: {
11074
- id: response.project.id,
11075
- name: response.project.name,
11076
- fullInfo: response.project
11077
- },
11078
- experiment: {
11079
- id: response.experiment.id,
11080
- name: response.experiment.name,
11081
- fullInfo: response.experiment
11064
+ const repoStatus2 = await isomorph_default.getRepoStatus(gitMetadataSettings);
11065
+ if (repoStatus2) {
11066
+ args["repo_info"] = repoStatus2;
11082
11067
  }
11083
- };
11084
- })();
11068
+ if (baseExperiment) {
11069
+ args["base_experiment"] = baseExperiment;
11070
+ } else {
11071
+ args["ancestor_commits"] = await isomorph_default.getPastNAncestors();
11072
+ }
11073
+ if (dataset !== void 0) {
11074
+ args["dataset_id"] = dataset.id;
11075
+ args["dataset_version"] = await dataset.version();
11076
+ }
11077
+ if (isPublic !== void 0) {
11078
+ args["public"] = isPublic;
11079
+ }
11080
+ if (metadata) {
11081
+ args["metadata"] = metadata;
11082
+ }
11083
+ let response = null;
11084
+ while (true) {
11085
+ try {
11086
+ response = await _state.apiConn().post_json("api/experiment/register", args);
11087
+ break;
11088
+ } catch (e) {
11089
+ if (args["base_experiment"] && `${"data" in e && e.data}`.includes("base experiment")) {
11090
+ console.warn(
11091
+ `Base experiment ${args["base_experiment"]} not found.`
11092
+ );
11093
+ delete args["base_experiment"];
11094
+ } else {
11095
+ throw e;
11096
+ }
11097
+ }
11098
+ }
11099
+ return {
11100
+ project: {
11101
+ id: response.project.id,
11102
+ name: response.project.name,
11103
+ fullInfo: response.project
11104
+ },
11105
+ experiment: {
11106
+ id: response.experiment.id,
11107
+ name: response.experiment.name,
11108
+ fullInfo: response.experiment
11109
+ }
11110
+ };
11111
+ }
11112
+ );
11085
11113
  const ret = new Experiment(lazyMetadata, dataset);
11086
11114
  if (options.setCurrent ?? true) {
11087
11115
  _state.currentExperiment = ret;
@@ -11232,27 +11260,29 @@ var Experiment = class {
11232
11260
  this.kind = "experiment";
11233
11261
  this.lazyMetadata = lazyMetadata;
11234
11262
  this.dataset = dataset;
11235
- const logConn = this.getState().then((state) => state.logConn());
11263
+ const logConn = new LazyValue(
11264
+ () => this.getState().then((state) => state.logConn())
11265
+ );
11236
11266
  this.bgLogger = new BackgroundLogger(logConn);
11237
11267
  this.lastStartTime = getCurrentUnixTimestamp();
11238
11268
  }
11239
11269
  get id() {
11240
11270
  return (async () => {
11241
- return (await this.lazyMetadata).experiment.id;
11271
+ return (await this.lazyMetadata.get()).experiment.id;
11242
11272
  })();
11243
11273
  }
11244
11274
  get name() {
11245
11275
  return (async () => {
11246
- return (await this.lazyMetadata).experiment.name;
11276
+ return (await this.lazyMetadata.get()).experiment.name;
11247
11277
  })();
11248
11278
  }
11249
11279
  get project() {
11250
11280
  return (async () => {
11251
- return (await this.lazyMetadata).project;
11281
+ return (await this.lazyMetadata.get()).project;
11252
11282
  })();
11253
11283
  }
11254
11284
  async getState() {
11255
- await this.lazyMetadata;
11285
+ await this.lazyMetadata.get();
11256
11286
  return _state;
11257
11287
  }
11258
11288
  /**
@@ -11312,7 +11342,7 @@ var Experiment = class {
11312
11342
  startSpan(args) {
11313
11343
  const { name, ...argsRest } = args ?? {};
11314
11344
  return new SpanImpl({
11315
- parentIds: this.lazyParentIds(),
11345
+ parentIds: new LazyValue(() => this.lazyParentIds()),
11316
11346
  bgLogger: this.bgLogger,
11317
11347
  name: name ?? "root",
11318
11348
  ...argsRest
@@ -11386,7 +11416,11 @@ var Experiment = class {
11386
11416
  * @param event.source (Optional) the source of the feedback. Must be one of "external" (default), "app", or "api".
11387
11417
  */
11388
11418
  logFeedback(event) {
11389
- logFeedbackImpl(this.bgLogger, this.lazyParentIds(), event);
11419
+ logFeedbackImpl(
11420
+ this.bgLogger,
11421
+ new LazyValue(() => this.lazyParentIds()),
11422
+ event
11423
+ );
11390
11424
  }
11391
11425
  /**
11392
11426
  * Flush any pending rows to the server.
@@ -11467,18 +11501,18 @@ var SpanImpl = class _SpanImpl {
11467
11501
  if (sanitizedAndInternalData.metrics?.end) {
11468
11502
  this.loggedEndTime = sanitizedAndInternalData.metrics?.end;
11469
11503
  }
11470
- const parentIds = (async () => {
11471
- const { kind, ...ids } = await this.parentIds;
11504
+ const parentIds = new LazyValue(async () => {
11505
+ const { kind, ...ids } = await this.parentIds.get();
11472
11506
  return ids;
11473
- })();
11474
- const record = (async () => {
11507
+ });
11508
+ const record = new LazyValue(async () => {
11475
11509
  return {
11476
11510
  ...sanitizedAndInternalData,
11477
11511
  ...this.rowIds,
11478
- ...await parentIds,
11512
+ ...await parentIds.get(),
11479
11513
  [IS_MERGE_FIELD]: this.isMerge
11480
11514
  };
11481
- })();
11515
+ });
11482
11516
  this.bgLogger.log([record]);
11483
11517
  }
11484
11518
  logFeedback(event) {
@@ -11532,26 +11566,28 @@ var Dataset = class {
11532
11566
  this._fetchedData = void 0;
11533
11567
  this.lazyMetadata = lazyMetadata;
11534
11568
  this.pinnedVersion = pinnedVersion;
11535
- const logConn = this.getState().then((state) => state.logConn());
11569
+ const logConn = new LazyValue(
11570
+ () => this.getState().then((state) => state.logConn())
11571
+ );
11536
11572
  this.bgLogger = new BackgroundLogger(logConn);
11537
11573
  }
11538
11574
  get id() {
11539
11575
  return (async () => {
11540
- return (await this.lazyMetadata).dataset.id;
11576
+ return (await this.lazyMetadata.get()).dataset.id;
11541
11577
  })();
11542
11578
  }
11543
11579
  get name() {
11544
11580
  return (async () => {
11545
- return (await this.lazyMetadata).dataset.name;
11581
+ return (await this.lazyMetadata.get()).dataset.name;
11546
11582
  })();
11547
11583
  }
11548
11584
  get project() {
11549
11585
  return (async () => {
11550
- return (await this.lazyMetadata).project;
11586
+ return (await this.lazyMetadata.get()).project;
11551
11587
  })();
11552
11588
  }
11553
11589
  async getState() {
11554
- await this.lazyMetadata;
11590
+ await this.lazyMetadata.get();
11555
11591
  return _state;
11556
11592
  }
11557
11593
  /**
@@ -11582,7 +11618,7 @@ var Dataset = class {
11582
11618
  }
11583
11619
  }
11584
11620
  const rowId = id || v4_default();
11585
- const args = (async () => ({
11621
+ const args = new LazyValue(async () => ({
11586
11622
  id: rowId,
11587
11623
  inputs: input,
11588
11624
  output,
@@ -11590,18 +11626,18 @@ var Dataset = class {
11590
11626
  dataset_id: await this.id,
11591
11627
  created: (/* @__PURE__ */ new Date()).toISOString(),
11592
11628
  metadata
11593
- }))();
11629
+ }));
11594
11630
  this.bgLogger.log([args]);
11595
11631
  return rowId;
11596
11632
  }
11597
11633
  delete(id) {
11598
- const args = (async () => ({
11634
+ const args = new LazyValue(async () => ({
11599
11635
  id,
11600
11636
  project_id: (await this.project).id,
11601
11637
  dataset_id: await this.id,
11602
11638
  created: (/* @__PURE__ */ new Date()).toISOString(),
11603
11639
  _object_delete: true
11604
- }))();
11640
+ }));
11605
11641
  this.bgLogger.log([args]);
11606
11642
  return id;
11607
11643
  }
@@ -16054,7 +16090,9 @@ async function getBaseBranchAncestor(remote = void 0) {
16054
16090
  if (git === null) {
16055
16091
  throw new Error("Not in a git repo");
16056
16092
  }
16057
- const { remote: remoteName, branch: baseBranch } = await getBaseBranch(remote);
16093
+ const { remote: remoteName, branch: baseBranch } = await getBaseBranch(
16094
+ remote
16095
+ );
16058
16096
  const isDirty = (await git.diffSummary()).files.length > 0;
16059
16097
  const head = isDirty ? "HEAD" : "HEAD^";
16060
16098
  try {