braintrust 3.23.0 → 3.24.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/dev/dist/index.d.mts +6 -0
- package/dev/dist/index.d.ts +6 -0
- package/dev/dist/index.js +902 -588
- package/dev/dist/index.mjs +320 -6
- package/dist/apply-auto-instrumentation.js +211 -189
- package/dist/apply-auto-instrumentation.mjs +23 -1
- package/dist/auto-instrumentations/bundler/esbuild.cjs +40 -0
- package/dist/auto-instrumentations/bundler/esbuild.mjs +2 -2
- package/dist/auto-instrumentations/bundler/next.cjs +40 -0
- package/dist/auto-instrumentations/bundler/next.mjs +3 -3
- package/dist/auto-instrumentations/bundler/rollup.cjs +40 -0
- package/dist/auto-instrumentations/bundler/rollup.mjs +2 -2
- package/dist/auto-instrumentations/bundler/vite.cjs +40 -0
- package/dist/auto-instrumentations/bundler/vite.d.mts +1 -1
- package/dist/auto-instrumentations/bundler/vite.d.ts +1 -1
- package/dist/auto-instrumentations/bundler/vite.mjs +2 -2
- package/dist/auto-instrumentations/bundler/webpack-loader.cjs +40 -0
- package/dist/auto-instrumentations/bundler/webpack.cjs +40 -0
- package/dist/auto-instrumentations/bundler/webpack.mjs +3 -3
- package/dist/auto-instrumentations/{chunk-KIMLYPRW.mjs → chunk-BURMPO7L.mjs} +1 -1
- package/dist/auto-instrumentations/{chunk-YXLNSAMJ.mjs → chunk-F43DNLPD.mjs} +40 -0
- package/dist/auto-instrumentations/{chunk-EXY7QCJD.mjs → chunk-GSZHTAQW.mjs} +1 -1
- package/dist/auto-instrumentations/hook.mjs +150 -1
- package/dist/auto-instrumentations/index.cjs +40 -0
- package/dist/auto-instrumentations/index.mjs +1 -1
- package/dist/browser.d.mts +131 -9
- package/dist/browser.d.ts +131 -9
- package/dist/browser.js +703 -67
- package/dist/browser.mjs +703 -67
- package/dist/{chunk-CDIKAHDZ.js → chunk-7AUY2XWX.js} +21 -1
- package/dist/{chunk-36IPYKMG.mjs → chunk-7F6GCRHH.mjs} +20 -0
- package/dist/{chunk-FZWPFCVE.js → chunk-SU6EHKJV.js} +1085 -801
- package/dist/{chunk-IXL4PMY4.mjs → chunk-XE5FS7QY.mjs} +291 -7
- package/dist/cli.js +328 -10
- package/dist/edge-light.js +703 -67
- package/dist/edge-light.mjs +703 -67
- package/dist/index.d.mts +131 -9
- package/dist/index.d.ts +131 -9
- package/dist/index.js +891 -532
- package/dist/index.mjs +423 -64
- package/dist/instrumentation/index.d.mts +130 -9
- package/dist/instrumentation/index.d.ts +130 -9
- package/dist/instrumentation/index.js +601 -67
- package/dist/instrumentation/index.mjs +601 -67
- package/dist/vitest-evals-reporter.js +17 -16
- package/dist/vitest-evals-reporter.mjs +3 -2
- package/dist/workerd.js +703 -67
- package/dist/workerd.mjs +703 -67
- package/package.json +3 -3
- package/util/dist/index.js +4 -0
- package/util/dist/index.mjs +4 -0
package/dist/cli.js
CHANGED
|
@@ -7,7 +7,11 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
|
7
7
|
var __getProtoOf = Object.getPrototypeOf;
|
|
8
8
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
9
|
var __commonJS = (cb, mod) => function __require() {
|
|
10
|
-
|
|
10
|
+
try {
|
|
11
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
12
|
+
} catch (e) {
|
|
13
|
+
throw mod = 0, e;
|
|
14
|
+
}
|
|
11
15
|
};
|
|
12
16
|
var __export = (target, all) => {
|
|
13
17
|
for (var name in all)
|
|
@@ -1232,7 +1236,7 @@ var require_package = __commonJS({
|
|
|
1232
1236
|
"package.json"(exports2, module2) {
|
|
1233
1237
|
module2.exports = {
|
|
1234
1238
|
name: "braintrust",
|
|
1235
|
-
version: "3.
|
|
1239
|
+
version: "3.24.0",
|
|
1236
1240
|
description: "SDK for integrating Braintrust",
|
|
1237
1241
|
repository: {
|
|
1238
1242
|
type: "git",
|
|
@@ -1438,7 +1442,7 @@ var require_package = __commonJS({
|
|
|
1438
1442
|
typedoc: "^0.25.13",
|
|
1439
1443
|
"typedoc-plugin-markdown": "^3.17.1",
|
|
1440
1444
|
typescript: "5.4.4",
|
|
1441
|
-
vite: "^
|
|
1445
|
+
vite: "^8.1.5",
|
|
1442
1446
|
"vite-tsconfig-paths": "^4.3.2",
|
|
1443
1447
|
vitest: "4.1.5",
|
|
1444
1448
|
webpack: "^5.106.2",
|
|
@@ -1458,7 +1462,7 @@ var require_package = __commonJS({
|
|
|
1458
1462
|
cors: "^2.8.5",
|
|
1459
1463
|
"dc-browser": "^1.0.4",
|
|
1460
1464
|
dotenv: "^16.4.5",
|
|
1461
|
-
esbuild: "0.28.
|
|
1465
|
+
esbuild: "0.28.1",
|
|
1462
1466
|
esquery: "^1.7.0",
|
|
1463
1467
|
"eventsource-parser": "^1.1.2",
|
|
1464
1468
|
express: "^5.2.1",
|
|
@@ -1537,6 +1541,7 @@ var DefaultChannel = class {
|
|
|
1537
1541
|
constructor(name) {
|
|
1538
1542
|
this.name = name;
|
|
1539
1543
|
}
|
|
1544
|
+
name;
|
|
1540
1545
|
hasSubscribers = false;
|
|
1541
1546
|
subscribe(_subscription) {
|
|
1542
1547
|
}
|
|
@@ -2586,6 +2591,7 @@ var SpanComponentsV3 = class _SpanComponentsV3 {
|
|
|
2586
2591
|
constructor(data) {
|
|
2587
2592
|
this.data = data;
|
|
2588
2593
|
}
|
|
2594
|
+
data;
|
|
2589
2595
|
toStr() {
|
|
2590
2596
|
const jsonObj = {
|
|
2591
2597
|
compute_object_metadata_args: this.data.compute_object_metadata_args || void 0,
|
|
@@ -3104,6 +3110,7 @@ var SpanComponentsV4 = class _SpanComponentsV4 {
|
|
|
3104
3110
|
constructor(data) {
|
|
3105
3111
|
this.data = data;
|
|
3106
3112
|
}
|
|
3113
|
+
data;
|
|
3107
3114
|
toStr() {
|
|
3108
3115
|
const jsonObj = {
|
|
3109
3116
|
compute_object_metadata_args: this.data.compute_object_metadata_args || void 0,
|
|
@@ -6353,6 +6360,97 @@ var SpanCache = class {
|
|
|
6353
6360
|
}
|
|
6354
6361
|
};
|
|
6355
6362
|
|
|
6363
|
+
// src/span-origin.ts
|
|
6364
|
+
var SDK_VERSION = true ? "3.24.0" : "0.0.0";
|
|
6365
|
+
function detectSpanOriginEnvironment(explicit) {
|
|
6366
|
+
if (explicit) return explicit;
|
|
6367
|
+
const envType = isomorph_default.getEnv("BRAINTRUST_ENVIRONMENT_TYPE");
|
|
6368
|
+
const envName = isomorph_default.getEnv("BRAINTRUST_ENVIRONMENT_NAME");
|
|
6369
|
+
if (envType || envName) {
|
|
6370
|
+
return {
|
|
6371
|
+
...envType ? { type: envType } : {},
|
|
6372
|
+
...envName ? { name: envName } : {}
|
|
6373
|
+
};
|
|
6374
|
+
}
|
|
6375
|
+
const ci = firstPresent([
|
|
6376
|
+
["GITHUB_ACTIONS", "github_actions"],
|
|
6377
|
+
["GITLAB_CI", "gitlab_ci"],
|
|
6378
|
+
["CIRCLECI", "circleci"],
|
|
6379
|
+
["BUILDKITE", "buildkite"],
|
|
6380
|
+
["JENKINS_URL", "jenkins"],
|
|
6381
|
+
["JENKINS_HOME", "jenkins"],
|
|
6382
|
+
["TF_BUILD", "azure_pipelines"],
|
|
6383
|
+
["TEAMCITY_VERSION", "teamcity"],
|
|
6384
|
+
["TRAVIS", "travis"],
|
|
6385
|
+
["BITBUCKET_BUILD_NUMBER", "bitbucket"]
|
|
6386
|
+
]);
|
|
6387
|
+
if (ci) return { type: "ci", name: ci };
|
|
6388
|
+
if (isomorph_default.getEnv("CI")) return { type: "ci", name: "ci" };
|
|
6389
|
+
const earlyServer = firstPresent([
|
|
6390
|
+
["VERCEL", "vercel"],
|
|
6391
|
+
["NETLIFY", "netlify"]
|
|
6392
|
+
]);
|
|
6393
|
+
if (earlyServer) return { type: "server", name: earlyServer };
|
|
6394
|
+
if (isomorph_default.getEnv("ECS_CONTAINER_METADATA_URI") || isomorph_default.getEnv("ECS_CONTAINER_METADATA_URI_V4")) {
|
|
6395
|
+
return { type: "server", name: "ecs" };
|
|
6396
|
+
}
|
|
6397
|
+
const awsExecutionEnv = isomorph_default.getEnv("AWS_EXECUTION_ENV");
|
|
6398
|
+
if (awsExecutionEnv?.startsWith("AWS_ECS_")) {
|
|
6399
|
+
return { type: "server", name: "ecs" };
|
|
6400
|
+
}
|
|
6401
|
+
if (awsExecutionEnv?.startsWith("AWS_Lambda_")) {
|
|
6402
|
+
return { type: "server", name: "aws_lambda" };
|
|
6403
|
+
}
|
|
6404
|
+
if (isomorph_default.getEnv("AWS_LAMBDA_FUNCTION_NAME")) {
|
|
6405
|
+
return { type: "server", name: "aws_lambda" };
|
|
6406
|
+
}
|
|
6407
|
+
const server = firstPresent([
|
|
6408
|
+
["K_SERVICE", "cloud_run"],
|
|
6409
|
+
["FUNCTION_TARGET", "gcp_functions"],
|
|
6410
|
+
["KUBERNETES_SERVICE_HOST", "kubernetes"],
|
|
6411
|
+
["DYNO", "heroku"],
|
|
6412
|
+
["FLY_APP_NAME", "fly"],
|
|
6413
|
+
["RAILWAY_ENVIRONMENT", "railway"],
|
|
6414
|
+
["RENDER_SERVICE_NAME", "render"]
|
|
6415
|
+
]);
|
|
6416
|
+
if (server) return { type: "server", name: server };
|
|
6417
|
+
return deploymentModeEnvironment("NODE_ENV", isomorph_default.getEnv("NODE_ENV"));
|
|
6418
|
+
}
|
|
6419
|
+
function makeSpanOrigin(instrumentationName, environment) {
|
|
6420
|
+
return {
|
|
6421
|
+
name: "braintrust.sdk.javascript",
|
|
6422
|
+
version: SDK_VERSION,
|
|
6423
|
+
instrumentation: { name: instrumentationName },
|
|
6424
|
+
...environment ? { environment } : {}
|
|
6425
|
+
};
|
|
6426
|
+
}
|
|
6427
|
+
function mergeSpanOriginContext(context2, instrumentationName, environment) {
|
|
6428
|
+
const next = { ...context2 ?? {} };
|
|
6429
|
+
const current = isObject2(next.span_origin) ? { ...next.span_origin } : {};
|
|
6430
|
+
next.span_origin = {
|
|
6431
|
+
...makeSpanOrigin(instrumentationName, environment),
|
|
6432
|
+
...current
|
|
6433
|
+
};
|
|
6434
|
+
return next;
|
|
6435
|
+
}
|
|
6436
|
+
function firstPresent(entries) {
|
|
6437
|
+
return entries.find(([key]) => Boolean(isomorph_default.getEnv(key)))?.[1];
|
|
6438
|
+
}
|
|
6439
|
+
function deploymentModeEnvironment(_key, value) {
|
|
6440
|
+
if (!value) return void 0;
|
|
6441
|
+
const normalized = value.toLowerCase();
|
|
6442
|
+
if (normalized === "production" || normalized === "staging") {
|
|
6443
|
+
return { type: "server", name: normalized };
|
|
6444
|
+
}
|
|
6445
|
+
if (normalized === "development" || normalized === "local") {
|
|
6446
|
+
return { type: "local", name: normalized };
|
|
6447
|
+
}
|
|
6448
|
+
return { name: value };
|
|
6449
|
+
}
|
|
6450
|
+
function isObject2(value) {
|
|
6451
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6452
|
+
}
|
|
6453
|
+
|
|
6356
6454
|
// src/logger.ts
|
|
6357
6455
|
var BRAINTRUST_ATTACHMENT = BraintrustAttachmentReference.shape.type.value;
|
|
6358
6456
|
var EXTERNAL_ATTACHMENT = ExternalAttachmentReference.shape.type.value;
|
|
@@ -6401,6 +6499,7 @@ var LoginInvalidOrgError = class extends Error {
|
|
|
6401
6499
|
super(message);
|
|
6402
6500
|
this.message = message;
|
|
6403
6501
|
}
|
|
6502
|
+
message;
|
|
6404
6503
|
};
|
|
6405
6504
|
var REDACTION_FIELDS = [
|
|
6406
6505
|
"input",
|
|
@@ -6416,6 +6515,8 @@ var MaskingError = class {
|
|
|
6416
6515
|
this.fieldName = fieldName;
|
|
6417
6516
|
this.errorType = errorType;
|
|
6418
6517
|
}
|
|
6518
|
+
fieldName;
|
|
6519
|
+
errorType;
|
|
6419
6520
|
get errorMsg() {
|
|
6420
6521
|
return `ERROR: Failed to mask field '${this.fieldName}' - ${this.errorType}`;
|
|
6421
6522
|
}
|
|
@@ -6625,7 +6726,9 @@ var BraintrustState = class _BraintrustState {
|
|
|
6625
6726
|
diskCache: parametersDiskCache
|
|
6626
6727
|
});
|
|
6627
6728
|
this.spanCache = new SpanCache({ disabled: loginParams.disableSpanCache });
|
|
6729
|
+
this.spanOriginEnvironment = detectSpanOriginEnvironment();
|
|
6628
6730
|
}
|
|
6731
|
+
loginParams;
|
|
6629
6732
|
id;
|
|
6630
6733
|
currentExperiment;
|
|
6631
6734
|
// Note: the value of IsAsyncFlush doesn't really matter here, since we
|
|
@@ -6660,6 +6763,7 @@ var BraintrustState = class _BraintrustState {
|
|
|
6660
6763
|
_idGenerator = null;
|
|
6661
6764
|
_contextManager = null;
|
|
6662
6765
|
_otelFlushCallback = null;
|
|
6766
|
+
spanOriginEnvironment;
|
|
6663
6767
|
resetLoginInfo() {
|
|
6664
6768
|
this.appUrl = null;
|
|
6665
6769
|
this.appPublicUrl = null;
|
|
@@ -9013,6 +9117,7 @@ function initLogger(options = {}) {
|
|
|
9013
9117
|
orgName,
|
|
9014
9118
|
forceLogin,
|
|
9015
9119
|
debugLogLevel,
|
|
9120
|
+
environment,
|
|
9016
9121
|
fetch: fetch2,
|
|
9017
9122
|
state: stateArg
|
|
9018
9123
|
} = options || {};
|
|
@@ -9029,6 +9134,7 @@ function initLogger(options = {}) {
|
|
|
9029
9134
|
};
|
|
9030
9135
|
const state = stateArg ?? _globalState;
|
|
9031
9136
|
state.setDebugLogLevel(debugLogLevel);
|
|
9137
|
+
state.spanOriginEnvironment = detectSpanOriginEnvironment(environment);
|
|
9032
9138
|
state.enforceQueueSizeLimit(true);
|
|
9033
9139
|
const lazyMetadata = new LazyValue(
|
|
9034
9140
|
async () => {
|
|
@@ -9737,6 +9843,11 @@ var ObjectFetcher = class {
|
|
|
9737
9843
|
this._internal_btql = _internal_btql;
|
|
9738
9844
|
this._internalBrainstoreRealtime = _internalBrainstoreRealtime;
|
|
9739
9845
|
}
|
|
9846
|
+
objectType;
|
|
9847
|
+
pinnedVersion;
|
|
9848
|
+
mutateRecord;
|
|
9849
|
+
_internal_btql;
|
|
9850
|
+
_internalBrainstoreRealtime;
|
|
9740
9851
|
_fetchedData = void 0;
|
|
9741
9852
|
get id() {
|
|
9742
9853
|
throw new Error("ObjectFetcher subclasses must have an 'id' attribute");
|
|
@@ -10175,6 +10286,8 @@ var ReadonlyExperiment = class extends ObjectFetcher {
|
|
|
10175
10286
|
this.state = state;
|
|
10176
10287
|
this.lazyMetadata = lazyMetadata;
|
|
10177
10288
|
}
|
|
10289
|
+
state;
|
|
10290
|
+
lazyMetadata;
|
|
10178
10291
|
get id() {
|
|
10179
10292
|
return (async () => {
|
|
10180
10293
|
return (await this.lazyMetadata.get()).experiment.id;
|
|
@@ -10297,7 +10410,11 @@ var SpanImpl = class _SpanImpl {
|
|
|
10297
10410
|
metrics: {
|
|
10298
10411
|
start: args.startTime ?? getCurrentUnixTimestamp()
|
|
10299
10412
|
},
|
|
10300
|
-
context:
|
|
10413
|
+
context: mergeSpanOriginContext(
|
|
10414
|
+
{ ...callerLocation },
|
|
10415
|
+
"braintrust-js-logger",
|
|
10416
|
+
this._state.spanOriginEnvironment
|
|
10417
|
+
),
|
|
10301
10418
|
span_attributes: {
|
|
10302
10419
|
name,
|
|
10303
10420
|
type,
|
|
@@ -10671,6 +10788,7 @@ var Dataset2 = class extends ObjectFetcher {
|
|
|
10671
10788
|
this.pinnedEnvironment = pinState?.pinnedEnvironment;
|
|
10672
10789
|
this.pinnedSnapshotName = pinState?.pinnedSnapshotName;
|
|
10673
10790
|
}
|
|
10791
|
+
state;
|
|
10674
10792
|
lazyMetadata;
|
|
10675
10793
|
__braintrust_dataset_marker = true;
|
|
10676
10794
|
newRecords = 0;
|
|
@@ -11182,6 +11300,9 @@ var Prompt2 = class _Prompt {
|
|
|
11182
11300
|
this.noTrace = noTrace;
|
|
11183
11301
|
void this.__braintrust_prompt_marker;
|
|
11184
11302
|
}
|
|
11303
|
+
metadata;
|
|
11304
|
+
defaults;
|
|
11305
|
+
noTrace;
|
|
11185
11306
|
parsedPromptData;
|
|
11186
11307
|
hasParsedPromptData = false;
|
|
11187
11308
|
__braintrust_prompt_marker = true;
|
|
@@ -11419,6 +11540,7 @@ var RemoteEvalParameters = class {
|
|
|
11419
11540
|
this.metadata = metadata;
|
|
11420
11541
|
void this.__braintrust_parameters_marker;
|
|
11421
11542
|
}
|
|
11543
|
+
metadata;
|
|
11422
11544
|
__braintrust_parameters_marker = true;
|
|
11423
11545
|
get id() {
|
|
11424
11546
|
return this.metadata.id;
|
|
@@ -12663,6 +12785,10 @@ var SpanFetcher = class _SpanFetcher extends ObjectFetcher {
|
|
|
12663
12785
|
this._state = _state;
|
|
12664
12786
|
this.spanTypeFilter = spanTypeFilter;
|
|
12665
12787
|
}
|
|
12788
|
+
_objectId;
|
|
12789
|
+
rootSpanId;
|
|
12790
|
+
_state;
|
|
12791
|
+
spanTypeFilter;
|
|
12666
12792
|
static buildFilter(rootSpanId, spanTypeFilter, includeScorers = false) {
|
|
12667
12793
|
const children = [
|
|
12668
12794
|
// Base filter: root_span_id = 'value'
|
|
@@ -13097,6 +13223,8 @@ var EvalResultWithSummary = class {
|
|
|
13097
13223
|
this.summary = summary;
|
|
13098
13224
|
this.results = results;
|
|
13099
13225
|
}
|
|
13226
|
+
summary;
|
|
13227
|
+
results;
|
|
13100
13228
|
/**
|
|
13101
13229
|
* @deprecated Use `summary` instead.
|
|
13102
13230
|
*/
|
|
@@ -18877,6 +19005,24 @@ var aiSDKChannels = defineChannels("ai", {
|
|
|
18877
19005
|
kind: "sync-stream"
|
|
18878
19006
|
})
|
|
18879
19007
|
});
|
|
19008
|
+
var harnessAgentChannels = defineChannels("@ai-sdk/harness", {
|
|
19009
|
+
generate: channel({
|
|
19010
|
+
channelName: "HarnessAgent.generate",
|
|
19011
|
+
kind: "async"
|
|
19012
|
+
}),
|
|
19013
|
+
stream: channel({
|
|
19014
|
+
channelName: "HarnessAgent.stream",
|
|
19015
|
+
kind: "async"
|
|
19016
|
+
}),
|
|
19017
|
+
continueGenerate: channel({
|
|
19018
|
+
channelName: "HarnessAgent.continueGenerate",
|
|
19019
|
+
kind: "async"
|
|
19020
|
+
}),
|
|
19021
|
+
continueStream: channel({
|
|
19022
|
+
channelName: "HarnessAgent.continueStream",
|
|
19023
|
+
kind: "async"
|
|
19024
|
+
})
|
|
19025
|
+
});
|
|
18880
19026
|
|
|
18881
19027
|
// src/instrumentation/plugins/ai-sdk-plugin.ts
|
|
18882
19028
|
var DEFAULT_DENY_OUTPUT_PATHS = [
|
|
@@ -19145,6 +19291,84 @@ var AISDKPlugin = class extends BasePlugin {
|
|
|
19145
19291
|
})
|
|
19146
19292
|
})
|
|
19147
19293
|
);
|
|
19294
|
+
this.unsubscribers.push(
|
|
19295
|
+
traceStreamingChannel(harnessAgentChannels.generate, {
|
|
19296
|
+
name: "HarnessAgent.generate",
|
|
19297
|
+
type: "task" /* TASK */,
|
|
19298
|
+
extractInput: ([params], event) => prepareAISDKHarnessAgentInput(params, event.self),
|
|
19299
|
+
extractOutput: (result, endEvent) => processAISDKOutput(
|
|
19300
|
+
result,
|
|
19301
|
+
resolveDenyOutputPaths(endEvent, denyOutputPaths)
|
|
19302
|
+
),
|
|
19303
|
+
extractMetrics: (result) => extractTokenMetrics(result),
|
|
19304
|
+
aggregateChunks: aggregateAISDKChunks
|
|
19305
|
+
})
|
|
19306
|
+
);
|
|
19307
|
+
this.unsubscribers.push(
|
|
19308
|
+
traceStreamingChannel(harnessAgentChannels.stream, {
|
|
19309
|
+
name: "HarnessAgent.stream",
|
|
19310
|
+
type: "task" /* TASK */,
|
|
19311
|
+
extractInput: ([params], event) => prepareAISDKHarnessAgentInput(params, event.self),
|
|
19312
|
+
extractOutput: (result, endEvent) => processAISDKOutput(
|
|
19313
|
+
result,
|
|
19314
|
+
resolveDenyOutputPaths(endEvent, denyOutputPaths)
|
|
19315
|
+
),
|
|
19316
|
+
extractMetrics: (result, startTime) => ({
|
|
19317
|
+
...extractTokenMetrics(result),
|
|
19318
|
+
...startTime === void 0 ? {} : {
|
|
19319
|
+
time_to_first_token: getCurrentUnixTimestamp() - startTime
|
|
19320
|
+
}
|
|
19321
|
+
}),
|
|
19322
|
+
aggregateChunks: aggregateAISDKChunks,
|
|
19323
|
+
patchResult: ({ endEvent, result, span, startTime }) => patchAISDKStreamingResult({
|
|
19324
|
+
defaultDenyOutputPaths: denyOutputPaths,
|
|
19325
|
+
endEvent,
|
|
19326
|
+
result,
|
|
19327
|
+
resolvePromiseUsage: true,
|
|
19328
|
+
span,
|
|
19329
|
+
startTime
|
|
19330
|
+
})
|
|
19331
|
+
})
|
|
19332
|
+
);
|
|
19333
|
+
this.unsubscribers.push(
|
|
19334
|
+
traceStreamingChannel(harnessAgentChannels.continueGenerate, {
|
|
19335
|
+
name: "HarnessAgent.continueGenerate",
|
|
19336
|
+
type: "task" /* TASK */,
|
|
19337
|
+
extractInput: ([params], event) => prepareAISDKHarnessAgentInput(params, event.self),
|
|
19338
|
+
extractOutput: (result, endEvent) => processAISDKOutput(
|
|
19339
|
+
result,
|
|
19340
|
+
resolveDenyOutputPaths(endEvent, denyOutputPaths)
|
|
19341
|
+
),
|
|
19342
|
+
extractMetrics: (result) => extractTokenMetrics(result),
|
|
19343
|
+
aggregateChunks: aggregateAISDKChunks
|
|
19344
|
+
})
|
|
19345
|
+
);
|
|
19346
|
+
this.unsubscribers.push(
|
|
19347
|
+
traceStreamingChannel(harnessAgentChannels.continueStream, {
|
|
19348
|
+
name: "HarnessAgent.continueStream",
|
|
19349
|
+
type: "task" /* TASK */,
|
|
19350
|
+
extractInput: ([params], event) => prepareAISDKHarnessAgentInput(params, event.self),
|
|
19351
|
+
extractOutput: (result, endEvent) => processAISDKOutput(
|
|
19352
|
+
result,
|
|
19353
|
+
resolveDenyOutputPaths(endEvent, denyOutputPaths)
|
|
19354
|
+
),
|
|
19355
|
+
extractMetrics: (result, startTime) => ({
|
|
19356
|
+
...extractTokenMetrics(result),
|
|
19357
|
+
...startTime === void 0 ? {} : {
|
|
19358
|
+
time_to_first_token: getCurrentUnixTimestamp() - startTime
|
|
19359
|
+
}
|
|
19360
|
+
}),
|
|
19361
|
+
aggregateChunks: aggregateAISDKChunks,
|
|
19362
|
+
patchResult: ({ endEvent, result, span, startTime }) => patchAISDKStreamingResult({
|
|
19363
|
+
defaultDenyOutputPaths: denyOutputPaths,
|
|
19364
|
+
endEvent,
|
|
19365
|
+
result,
|
|
19366
|
+
resolvePromiseUsage: true,
|
|
19367
|
+
span,
|
|
19368
|
+
startTime
|
|
19369
|
+
})
|
|
19370
|
+
})
|
|
19371
|
+
);
|
|
19148
19372
|
this.unsubscribers.push(
|
|
19149
19373
|
traceStreamingChannel(aiSDKChannels.toolLoopAgentGenerate, {
|
|
19150
19374
|
name: "ToolLoopAgent.generate",
|
|
@@ -19675,6 +19899,45 @@ function prepareAISDKCallInput(params, event, span, defaultDenyOutputPaths, chil
|
|
|
19675
19899
|
metadata
|
|
19676
19900
|
};
|
|
19677
19901
|
}
|
|
19902
|
+
function prepareAISDKHarnessAgentInput(params, self) {
|
|
19903
|
+
if (isObject(self)) {
|
|
19904
|
+
try {
|
|
19905
|
+
if (isObject(self.settings)) {
|
|
19906
|
+
const settings = self.settings;
|
|
19907
|
+
if (settings.telemetry === void 0) {
|
|
19908
|
+
Reflect.set(self, "settings", { ...settings, telemetry: {} });
|
|
19909
|
+
}
|
|
19910
|
+
}
|
|
19911
|
+
} catch {
|
|
19912
|
+
}
|
|
19913
|
+
}
|
|
19914
|
+
const selectedInput = {};
|
|
19915
|
+
if (params.prompt !== void 0) {
|
|
19916
|
+
selectedInput.prompt = params.prompt;
|
|
19917
|
+
}
|
|
19918
|
+
if (params.messages !== void 0) {
|
|
19919
|
+
selectedInput.messages = params.messages;
|
|
19920
|
+
}
|
|
19921
|
+
if (params.toolApprovalContinuations !== void 0) {
|
|
19922
|
+
selectedInput.toolApprovalContinuations = params.toolApprovalContinuations;
|
|
19923
|
+
}
|
|
19924
|
+
const metadata = extractMetadataFromCallParams({}, self);
|
|
19925
|
+
if (isObject(params.session) && typeof params.session.sessionId === "string") {
|
|
19926
|
+
metadata.sessionId = params.session.sessionId;
|
|
19927
|
+
}
|
|
19928
|
+
if (isObject(self)) {
|
|
19929
|
+
if (typeof self.harnessId === "string") {
|
|
19930
|
+
metadata.harnessId = self.harnessId;
|
|
19931
|
+
}
|
|
19932
|
+
if (typeof self.permissionMode === "string") {
|
|
19933
|
+
metadata.permissionMode = self.permissionMode;
|
|
19934
|
+
}
|
|
19935
|
+
}
|
|
19936
|
+
return {
|
|
19937
|
+
input: processAISDKCallInput(selectedInput).input,
|
|
19938
|
+
metadata
|
|
19939
|
+
};
|
|
19940
|
+
}
|
|
19678
19941
|
function prepareAISDKWorkflowAgentStreamInput(params, event, span, defaultDenyOutputPaths) {
|
|
19679
19942
|
registerWorkflowAgentWrapperSpan(span);
|
|
19680
19943
|
const { input } = processAISDKWorkflowAgentCallInput(params);
|
|
@@ -20522,6 +20785,7 @@ function patchAISDKStreamingResult(args) {
|
|
|
20522
20785
|
endEvent,
|
|
20523
20786
|
onComplete,
|
|
20524
20787
|
result,
|
|
20788
|
+
resolvePromiseUsage,
|
|
20525
20789
|
span,
|
|
20526
20790
|
startTime
|
|
20527
20791
|
} = args;
|
|
@@ -20548,6 +20812,22 @@ function patchAISDKStreamingResult(args) {
|
|
|
20548
20812
|
outputLogged = true;
|
|
20549
20813
|
try {
|
|
20550
20814
|
const metrics = extractTopLevelAISDKMetrics(result, endEvent);
|
|
20815
|
+
if (resolvePromiseUsage) {
|
|
20816
|
+
try {
|
|
20817
|
+
const resultRecord2 = result;
|
|
20818
|
+
const pendingUsage = resultRecord2.totalUsage ?? resultRecord2.usage;
|
|
20819
|
+
if (isPromiseLike(pendingUsage)) {
|
|
20820
|
+
const usage = await Promise.resolve(pendingUsage);
|
|
20821
|
+
if (isObject(usage)) {
|
|
20822
|
+
Object.assign(
|
|
20823
|
+
metrics,
|
|
20824
|
+
extractTokenMetrics({ usage })
|
|
20825
|
+
);
|
|
20826
|
+
}
|
|
20827
|
+
}
|
|
20828
|
+
} catch {
|
|
20829
|
+
}
|
|
20830
|
+
}
|
|
20551
20831
|
if (metrics.time_to_first_token === void 0 && firstChunkTime !== void 0) {
|
|
20552
20832
|
metrics.time_to_first_token = firstChunkTime - startTime;
|
|
20553
20833
|
}
|
|
@@ -21778,8 +22058,6 @@ function filterSerializableOptions(options) {
|
|
|
21778
22058
|
"additionalDirectories",
|
|
21779
22059
|
"permissionMode",
|
|
21780
22060
|
"debug",
|
|
21781
|
-
"apiKey",
|
|
21782
|
-
"apiKeySource",
|
|
21783
22061
|
"agentName",
|
|
21784
22062
|
"instructions"
|
|
21785
22063
|
];
|
|
@@ -32807,6 +33085,16 @@ function cleanObject(obj) {
|
|
|
32807
33085
|
})
|
|
32808
33086
|
);
|
|
32809
33087
|
}
|
|
33088
|
+
function normalizeTokenMetrics(obj) {
|
|
33089
|
+
const metrics = cleanObject(obj);
|
|
33090
|
+
if (metrics.total_tokens !== void 0) {
|
|
33091
|
+
metrics.tokens = metrics.total_tokens;
|
|
33092
|
+
} else if (metrics.prompt_tokens !== void 0 && metrics.completion_tokens !== void 0) {
|
|
33093
|
+
metrics.tokens = metrics.prompt_tokens + metrics.completion_tokens;
|
|
33094
|
+
}
|
|
33095
|
+
delete metrics.total_tokens;
|
|
33096
|
+
return metrics;
|
|
33097
|
+
}
|
|
32810
33098
|
function walkGenerations(response) {
|
|
32811
33099
|
const result = [];
|
|
32812
33100
|
const generations = response.generations || [];
|
|
@@ -32853,7 +33141,7 @@ function getMetricsFromResponse(response) {
|
|
|
32853
33141
|
continue;
|
|
32854
33142
|
}
|
|
32855
33143
|
const inputTokenDetails = usageMetadata.input_token_details;
|
|
32856
|
-
return
|
|
33144
|
+
return normalizeTokenMetrics({
|
|
32857
33145
|
total_tokens: usageMetadata.total_tokens,
|
|
32858
33146
|
prompt_tokens: usageMetadata.input_tokens,
|
|
32859
33147
|
completion_tokens: usageMetadata.output_tokens,
|
|
@@ -32863,7 +33151,7 @@ function getMetricsFromResponse(response) {
|
|
|
32863
33151
|
}
|
|
32864
33152
|
const llmOutput = response.llmOutput || {};
|
|
32865
33153
|
const tokenUsage = isRecord(llmOutput.tokenUsage) ? llmOutput.tokenUsage : isRecord(llmOutput.estimatedTokens) ? llmOutput.estimatedTokens : {};
|
|
32866
|
-
return
|
|
33154
|
+
return normalizeTokenMetrics({
|
|
32867
33155
|
total_tokens: tokenUsage.totalTokens,
|
|
32868
33156
|
prompt_tokens: tokenUsage.promptTokens,
|
|
32869
33157
|
completion_tokens: tokenUsage.completionTokens
|
|
@@ -35973,7 +36261,13 @@ function configureNode() {
|
|
|
35973
36261
|
isomorph_default.getPastNAncestors = getPastNAncestors;
|
|
35974
36262
|
isomorph_default.getEnv = (name) => {
|
|
35975
36263
|
const value = process.env[name];
|
|
35976
|
-
|
|
36264
|
+
if (name === "BRAINTRUST_API_KEY") {
|
|
36265
|
+
return value?.trim() ? value : void 0;
|
|
36266
|
+
}
|
|
36267
|
+
if ((name === "BRAINTRUST_ENVIRONMENT_TYPE" || name === "BRAINTRUST_ENVIRONMENT_NAME") && !value?.trim()) {
|
|
36268
|
+
return getNearestBraintrustEnvValue(name);
|
|
36269
|
+
}
|
|
36270
|
+
return value;
|
|
35977
36271
|
};
|
|
35978
36272
|
isomorph_default.getBraintrustApiKey = async () => {
|
|
35979
36273
|
const value = process.env.BRAINTRUST_API_KEY;
|
|
@@ -36058,6 +36352,24 @@ function configureNode() {
|
|
|
36058
36352
|
}
|
|
36059
36353
|
registry.enable();
|
|
36060
36354
|
}
|
|
36355
|
+
function getNearestBraintrustEnvValue(name) {
|
|
36356
|
+
for (let dir2 = process.cwd(), depth = 0; depth <= BRAINTRUST_ENV_SEARCH_PARENT_LIMIT; dir2 = path.dirname(dir2), depth++) {
|
|
36357
|
+
const envPath = path.join(dir2, ".env.braintrust");
|
|
36358
|
+
try {
|
|
36359
|
+
const parsed = dotenv.parse(fsSync.readFileSync(envPath, "utf8"));
|
|
36360
|
+
const value = parsed[name];
|
|
36361
|
+
return value?.trim() ? value : void 0;
|
|
36362
|
+
} catch (e) {
|
|
36363
|
+
if (typeof e !== "object" || e === null || !("code" in e) || e.code !== "ENOENT") {
|
|
36364
|
+
return void 0;
|
|
36365
|
+
}
|
|
36366
|
+
}
|
|
36367
|
+
if (path.dirname(dir2) === dir2) {
|
|
36368
|
+
break;
|
|
36369
|
+
}
|
|
36370
|
+
}
|
|
36371
|
+
return void 0;
|
|
36372
|
+
}
|
|
36061
36373
|
|
|
36062
36374
|
// src/cli/index.ts
|
|
36063
36375
|
var import_env2 = require("@next/env");
|
|
@@ -36390,6 +36702,7 @@ var ToolBuilder = class {
|
|
|
36390
36702
|
constructor(project) {
|
|
36391
36703
|
this.project = project;
|
|
36392
36704
|
}
|
|
36705
|
+
project;
|
|
36393
36706
|
taskCounter = 0;
|
|
36394
36707
|
// This type definition is just a catch all so that the implementation can be
|
|
36395
36708
|
// less specific than the two more specific declarations above.
|
|
@@ -36420,6 +36733,7 @@ var ScorerBuilder = class {
|
|
|
36420
36733
|
constructor(project) {
|
|
36421
36734
|
this.project = project;
|
|
36422
36735
|
}
|
|
36736
|
+
project;
|
|
36423
36737
|
taskCounter = 0;
|
|
36424
36738
|
create(opts) {
|
|
36425
36739
|
this.taskCounter++;
|
|
@@ -36479,6 +36793,7 @@ var ClassifierBuilder = class {
|
|
|
36479
36793
|
constructor(project) {
|
|
36480
36794
|
this.project = project;
|
|
36481
36795
|
}
|
|
36796
|
+
project;
|
|
36482
36797
|
taskCounter = 0;
|
|
36483
36798
|
create(opts) {
|
|
36484
36799
|
this.taskCounter++;
|
|
@@ -36514,6 +36829,7 @@ var CodeFunction = class {
|
|
|
36514
36829
|
throw new Error("parameters are required if return type is defined");
|
|
36515
36830
|
}
|
|
36516
36831
|
}
|
|
36832
|
+
project;
|
|
36517
36833
|
handler;
|
|
36518
36834
|
name;
|
|
36519
36835
|
slug;
|
|
@@ -36601,6 +36917,7 @@ var PromptBuilder = class {
|
|
|
36601
36917
|
constructor(project) {
|
|
36602
36918
|
this.project = project;
|
|
36603
36919
|
}
|
|
36920
|
+
project;
|
|
36604
36921
|
create(opts) {
|
|
36605
36922
|
const toolFunctions = [];
|
|
36606
36923
|
const rawTools = [];
|
|
@@ -36677,6 +36994,7 @@ var ParametersBuilder = class {
|
|
|
36677
36994
|
constructor(project) {
|
|
36678
36995
|
this.project = project;
|
|
36679
36996
|
}
|
|
36997
|
+
project;
|
|
36680
36998
|
create(opts) {
|
|
36681
36999
|
const slug = opts.slug ?? slugify(opts.name, { lower: true, strict: true });
|
|
36682
37000
|
const codeParameters = new CodeParameters(this.project, {
|