@bitfab/sdk 0.39.0 → 0.41.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.
@@ -6,7 +6,7 @@ import {
6
6
  flushTraces,
7
7
  parseRetryAfterMs,
8
8
  serializePayloadBody
9
- } from "./chunk-RH4K4RSS.js";
9
+ } from "./chunk-VEA6JOKL.js";
10
10
  export {
11
11
  BitfabError,
12
12
  HttpClient,
@@ -16,4 +16,4 @@ export {
16
16
  parseRetryAfterMs,
17
17
  serializePayloadBody
18
18
  };
19
- //# sourceMappingURL=http-GJZJKNZZ.js.map
19
+ //# sourceMappingURL=http-JSBWHPNA.js.map
@@ -6,7 +6,7 @@ import {
6
6
  flushTraces,
7
7
  parseRetryAfterMs,
8
8
  serializePayloadBody
9
- } from "./chunk-2JQSYJJR.js";
9
+ } from "./chunk-IFYX3KW6.js";
10
10
  import "./chunk-H6LZRFMN.js";
11
11
  export {
12
12
  BitfabError,
@@ -17,4 +17,4 @@ export {
17
17
  parseRetryAfterMs,
18
18
  serializePayloadBody
19
19
  };
20
- //# sourceMappingURL=http-PRCLI43J.js.map
20
+ //# sourceMappingURL=http-UCJCOKW7.js.map
package/dist/index.cjs CHANGED
@@ -42,7 +42,7 @@ var __version__, __packageName__;
42
42
  var init_version_generated = __esm({
43
43
  "src/version.generated.ts"() {
44
44
  "use strict";
45
- __version__ = "0.39.0";
45
+ __version__ = "0.41.0";
46
46
  __packageName__ = "@bitfab/sdk";
47
47
  }
48
48
  });
@@ -1732,6 +1732,10 @@ var init_http = __esm({
1732
1732
  const response = await this.get(endpoint);
1733
1733
  return response.span;
1734
1734
  }
1735
+ /**
1736
+ * GET a JSON endpoint on the service with the client's API key. Throws a
1737
+ * `BitfabError` carrying the status text for any non-2xx response.
1738
+ */
1735
1739
  async get(endpoint) {
1736
1740
  const url = `${this.serviceUrl}${endpoint}`;
1737
1741
  const controller = new AbortController();
@@ -1745,7 +1749,10 @@ var init_http = __esm({
1745
1749
  if (!response.ok) {
1746
1750
  const errorText = await response.text();
1747
1751
  throw new BitfabError(
1748
- `HTTP ${response.status}: ${errorText.slice(0, 500)}`
1752
+ `HTTP ${response.status}: ${errorText.slice(0, 500)}`,
1753
+ void 0,
1754
+ response.status,
1755
+ parseRetryAfterMs(readHeader(response, "retry-after"))
1749
1756
  );
1750
1757
  }
1751
1758
  return await response.json();
@@ -3197,6 +3204,7 @@ __export(index_exports, {
3197
3204
  BitfabOpenAITracingProcessor: () => BitfabOpenAITracingProcessor,
3198
3205
  BitfabVercelAiHandler: () => BitfabVercelAiHandler,
3199
3206
  DEFAULT_SERVICE_URL: () => DEFAULT_SERVICE_URL,
3207
+ DatasetsClient: () => DatasetsClient,
3200
3208
  DbBranchReplayError: () => DbBranchReplayError,
3201
3209
  HttpClient: () => HttpClient,
3202
3210
  NO_MOCK_OVERRIDE: () => NO_MOCK_OVERRIDE,
@@ -3515,8 +3523,7 @@ var BitfabClaudeAgentHandler = class {
3515
3523
  const externalTrace = {
3516
3524
  id: traceId,
3517
3525
  started_at: this.traceStartedAt ?? nowIso(),
3518
- ended_at: endedAt ?? nowIso(),
3519
- workflow_name: this.traceFunctionKey
3526
+ ended_at: endedAt ?? nowIso()
3520
3527
  };
3521
3528
  if (metadata) {
3522
3529
  externalTrace.metadata = metadata;
@@ -4276,6 +4283,131 @@ async function runFunctionWithBaml(bamlSource, inputs, providers, envVars) {
4276
4283
  // src/client.ts
4277
4284
  init_constants();
4278
4285
 
4286
+ // src/datasets.ts
4287
+ var DEFAULT_RERUN_TIMEOUT_MS = 9e4;
4288
+ var DEFAULT_RERUN_POLL_INTERVAL_MS = 1e3;
4289
+ var TERMINAL_RERUN_STATUSES = /* @__PURE__ */ new Set([
4290
+ "completed",
4291
+ "errored"
4292
+ ]);
4293
+ function sleep(ms) {
4294
+ return new Promise((resolve) => setTimeout(resolve, ms));
4295
+ }
4296
+ function datasetPath(datasetId, suffix = "") {
4297
+ return `/api/sdk/datasets/${encodeURIComponent(datasetId)}${suffix}`;
4298
+ }
4299
+ var DatasetsClient = class {
4300
+ constructor(httpClient) {
4301
+ this.httpClient = httpClient;
4302
+ }
4303
+ /**
4304
+ * Create a dataset, or update the one already named this way under the same
4305
+ * trace function. `created` reports which happened. An omitted description
4306
+ * leaves an existing one untouched.
4307
+ */
4308
+ async save(params) {
4309
+ return this.httpClient.request("/api/sdk/datasets", {
4310
+ traceFunctionKey: params.traceFunctionKey,
4311
+ name: params.name,
4312
+ ...params.description === void 0 ? {} : { description: params.description }
4313
+ });
4314
+ }
4315
+ /**
4316
+ * List datasets, scoped to one trace function when `traceFunctionKey` is
4317
+ * given and organization-wide otherwise.
4318
+ */
4319
+ async list(params = {}) {
4320
+ const query = params.traceFunctionKey === void 0 ? "" : `?traceFunctionKey=${encodeURIComponent(params.traceFunctionKey)}`;
4321
+ const response = await this.httpClient.get(
4322
+ `/api/sdk/datasets${query}`
4323
+ );
4324
+ return response.datasets;
4325
+ }
4326
+ /** Fetch one dataset by id. Rejects with a 404 `BitfabError` when it is not in this organization. */
4327
+ async get(datasetId) {
4328
+ const response = await this.httpClient.get(
4329
+ datasetPath(datasetId)
4330
+ );
4331
+ return response.dataset;
4332
+ }
4333
+ /** The ids of every trace in the dataset, the same membership a replay with `datasetId` selects. */
4334
+ async listTraces(datasetId) {
4335
+ return this.httpClient.get(
4336
+ datasetPath(datasetId, "/traces")
4337
+ );
4338
+ }
4339
+ /**
4340
+ * Add traces to the dataset (1 to 100 ids per call). Traces outside the
4341
+ * organization or under another trace function are reported in
4342
+ * `skippedTraceIds` rather than failing the call.
4343
+ */
4344
+ async addTraces(datasetId, traceIds) {
4345
+ return this.httpClient.request(
4346
+ datasetPath(datasetId, "/traces"),
4347
+ { traceIds }
4348
+ );
4349
+ }
4350
+ /** Remove traces from the dataset. The traces themselves are never deleted. */
4351
+ async removeTraces(datasetId, traceIds) {
4352
+ return this.httpClient.request(
4353
+ datasetPath(datasetId, "/removeTraces"),
4354
+ { traceIds }
4355
+ );
4356
+ }
4357
+ /**
4358
+ * Assign graders to the dataset (1 to 100 ids per call). Graders outside the
4359
+ * organization or under another trace function are reported in
4360
+ * `skippedGraderIds` rather than failing the call.
4361
+ */
4362
+ async addGraders(datasetId, graderIds) {
4363
+ return this.httpClient.request(
4364
+ datasetPath(datasetId, "/graders"),
4365
+ { graderIds }
4366
+ );
4367
+ }
4368
+ /** Unassign graders from the dataset. */
4369
+ async removeGraders(datasetId, graderIds) {
4370
+ return this.httpClient.request(
4371
+ datasetPath(datasetId, "/removeGraders"),
4372
+ { graderIds }
4373
+ );
4374
+ }
4375
+ /**
4376
+ * Re-run graders over every trace in the dataset. Defaults to every assigned
4377
+ * grader; an unassigned id is rejected. Waits for the run to finish (up to
4378
+ * `timeoutMs`, default 90s) unless `wait` is `false`, and returns the last
4379
+ * run state seen either way. A request matching an in-flight run joins it.
4380
+ */
4381
+ async rerunGraders(datasetId, options = {}) {
4382
+ const started = await this.httpClient.request(
4383
+ datasetPath(datasetId, "/rerunGraders"),
4384
+ options.graderIds === void 0 ? {} : { graderIds: options.graderIds }
4385
+ );
4386
+ if (options.wait === false) {
4387
+ return started;
4388
+ }
4389
+ const deadline = Date.now() + (options.timeoutMs ?? DEFAULT_RERUN_TIMEOUT_MS);
4390
+ const interval = options.pollIntervalMs ?? DEFAULT_RERUN_POLL_INTERVAL_MS;
4391
+ let run = started.run;
4392
+ while (!TERMINAL_RERUN_STATUSES.has(run.status) && Date.now() < deadline) {
4393
+ await sleep(interval);
4394
+ run = await this.getGraderRerun(datasetId, run.id) ?? run;
4395
+ }
4396
+ return { run, joinedExisting: started.joinedExisting };
4397
+ }
4398
+ /**
4399
+ * The dataset's active grader re-run, or the run named by `runId`. Returns
4400
+ * `null` when nothing is active or the run does not belong to this dataset.
4401
+ */
4402
+ async getGraderRerun(datasetId, runId) {
4403
+ const query = runId === void 0 ? "" : `?runId=${encodeURIComponent(runId)}`;
4404
+ const response = await this.httpClient.get(
4405
+ datasetPath(datasetId, `/rerunGraders${query}`)
4406
+ );
4407
+ return response.run;
4408
+ }
4409
+ };
4410
+
4279
4411
  // src/dbSnapshot.ts
4280
4412
  init_errors();
4281
4413
  var SUPPORTED_PROVIDERS = ["neon"];
@@ -4685,8 +4817,7 @@ var BitfabLangGraphCallbackHandler = class {
4685
4817
  externalTrace: {
4686
4818
  id: rootSpan.traceId,
4687
4819
  started_at: rootSpan.startedAt,
4688
- ended_at: rootSpan.endedAt ?? nowIso2(),
4689
- workflow_name: this.traceFunctionKey
4820
+ ended_at: rootSpan.endedAt ?? nowIso2()
4690
4821
  },
4691
4822
  completed
4692
4823
  };
@@ -4704,8 +4835,7 @@ var BitfabLangGraphCallbackHandler = class {
4704
4835
  traceFunctionKey: this.traceFunctionKey,
4705
4836
  externalTrace: {
4706
4837
  id: rootSpan.traceId,
4707
- started_at: rootSpan.startedAt,
4708
- workflow_name: this.traceFunctionKey
4838
+ started_at: rootSpan.startedAt
4709
4839
  },
4710
4840
  completed: false
4711
4841
  };
@@ -5863,6 +5993,8 @@ var noOpSpan = {
5863
5993
  var noOpTrace = {
5864
5994
  setSessionId() {
5865
5995
  },
5996
+ setName() {
5997
+ },
5866
5998
  setMetadata() {
5867
5999
  },
5868
6000
  addContext() {
@@ -5937,6 +6069,15 @@ function getCurrentTrace() {
5937
6069
  } catch {
5938
6070
  }
5939
6071
  },
6072
+ setName(name) {
6073
+ if (typeof name !== "string" || name.length === 0) {
6074
+ return;
6075
+ }
6076
+ try {
6077
+ getOrCreateTraceState().name = name;
6078
+ } catch {
6079
+ }
6080
+ },
5940
6081
  setMetadata(metadata) {
5941
6082
  try {
5942
6083
  if (typeof metadata !== "object" || metadata === null) {
@@ -6011,6 +6152,7 @@ var Bitfab = class {
6011
6152
  serviceUrl: this.serviceUrl,
6012
6153
  timeout: this.timeout
6013
6154
  });
6155
+ this.datasets = new DatasetsClient(this.httpClient);
6014
6156
  }
6015
6157
  /**
6016
6158
  * Decorate a class method as an automatically expanded trace root.
@@ -6915,6 +7057,7 @@ var Bitfab = class {
6915
7057
  startedAt: traceState?.startedAt ?? startedAt,
6916
7058
  endedAt,
6917
7059
  sessionId: traceState?.sessionId,
7060
+ name: traceState?.name,
6918
7061
  metadata: traceState?.metadata,
6919
7062
  contexts: traceState?.contexts ?? [],
6920
7063
  testRunId: traceState?.testRunId,
@@ -7233,6 +7376,15 @@ var Bitfab = class {
7233
7376
  return Promise.resolve();
7234
7377
  }
7235
7378
  return this.httpClient.patchTrace(traceId, { setSessionId: sessionId });
7379
+ },
7380
+ setName: (name) => {
7381
+ if (!this.isTracingEnabled()) {
7382
+ return Promise.resolve();
7383
+ }
7384
+ if (typeof name !== "string" || name.length === 0) {
7385
+ return Promise.resolve();
7386
+ }
7387
+ return this.httpClient.patchTrace(traceId, { setName: name });
7236
7388
  }
7237
7389
  };
7238
7390
  }
@@ -7293,9 +7445,11 @@ var Bitfab = class {
7293
7445
  const rawTrace = {
7294
7446
  id: params.traceId,
7295
7447
  started_at: params.startedAt,
7296
- ended_at: params.endedAt,
7297
- workflow_name: params.traceFunctionKey
7448
+ ended_at: params.endedAt
7298
7449
  };
7450
+ if (params.name) {
7451
+ rawTrace.name = params.name;
7452
+ }
7299
7453
  if (params.metadata && Object.keys(params.metadata).length > 0) {
7300
7454
  rawTrace.metadata = params.metadata;
7301
7455
  }
@@ -7488,6 +7642,7 @@ var Bitfab = class {
7488
7642
  contexts: [],
7489
7643
  ingestionType: "seeded",
7490
7644
  ...options.sessionId !== void 0 && { sessionId: options.sessionId },
7645
+ ...options.name !== void 0 && { name: options.name },
7491
7646
  ...options.metadata !== void 0 && { metadata: options.metadata }
7492
7647
  });
7493
7648
  try {
@@ -7510,6 +7665,7 @@ var Bitfab = class {
7510
7665
  startedAt,
7511
7666
  endedAt: startedAt,
7512
7667
  sessionId: options.sessionId,
7668
+ name: options.name,
7513
7669
  metadata: options.metadata,
7514
7670
  contexts: [],
7515
7671
  ingestionType: "seeded"
@@ -7824,6 +7980,7 @@ function resolveTraceFunctionKey(registration) {
7824
7980
  BitfabOpenAITracingProcessor,
7825
7981
  BitfabVercelAiHandler,
7826
7982
  DEFAULT_SERVICE_URL,
7983
+ DatasetsClient,
7827
7984
  DbBranchReplayError,
7828
7985
  HttpClient,
7829
7986
  NO_MOCK_OVERRIDE,