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/browser.js +224 -178
- package/dist/cli.js +148 -110
- package/dist/index.js +227 -179
- package/dist/logger.d.ts +7 -6
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/util.d.ts +6 -0
- package/package.json +1 -1
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.
|
|
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
|
|
10942
|
+
const itemLazyValues = this.items;
|
|
10928
10943
|
this.items = [];
|
|
10929
|
-
const allItems =
|
|
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 =
|
|
11010
|
-
|
|
11011
|
-
|
|
11012
|
-
|
|
11013
|
-
|
|
11014
|
-
|
|
11015
|
-
|
|
11016
|
-
|
|
11017
|
-
|
|
11018
|
-
|
|
11019
|
-
|
|
11020
|
-
|
|
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
|
-
|
|
11034
|
-
|
|
11035
|
-
|
|
11036
|
-
|
|
11037
|
-
|
|
11038
|
-
|
|
11039
|
-
|
|
11040
|
-
|
|
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
|
-
|
|
11073
|
-
|
|
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 =
|
|
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(
|
|
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 =
|
|
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(
|
|
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 {
|