@bitfab/sdk 0.20.0 → 0.21.1

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/index.cjs CHANGED
@@ -482,6 +482,7 @@ __export(index_exports, {
482
482
  ReplayEnvironment: () => ReplayEnvironment,
483
483
  SUPPORTED_PROVIDERS: () => SUPPORTED_PROVIDERS,
484
484
  __version__: () => __version__,
485
+ finalizers: () => finalizers,
485
486
  flushTraces: () => flushTraces,
486
487
  getCurrentSpan: () => getCurrentSpan,
487
488
  getCurrentTrace: () => getCurrentTrace
@@ -489,7 +490,7 @@ __export(index_exports, {
489
490
  module.exports = __toCommonJS(index_exports);
490
491
 
491
492
  // src/version.generated.ts
492
- var __version__ = "0.20.0";
493
+ var __version__ = "0.21.1";
493
494
 
494
495
  // src/constants.ts
495
496
  var DEFAULT_SERVICE_URL = "https://bitfab.ai";
@@ -2422,9 +2423,15 @@ var BitfabOpenAITracingProcessor = class {
2422
2423
  * Extract and add input/response to serialized span, updating errors list.
2423
2424
  */
2424
2425
  extractSpanInputResponse(span, serializedSpan, errors) {
2426
+ if (span.spanData?.type !== "response") {
2427
+ return;
2428
+ }
2425
2429
  const spanData = serializedSpan.span_data;
2426
2430
  try {
2427
- spanData.input = span.spanData?._input || [];
2431
+ const input = span.spanData?._input;
2432
+ if (input !== void 0) {
2433
+ spanData.input = input;
2434
+ }
2428
2435
  } catch (error) {
2429
2436
  errors.push({
2430
2437
  source: "sdk",
@@ -2433,7 +2440,10 @@ var BitfabOpenAITracingProcessor = class {
2433
2440
  });
2434
2441
  }
2435
2442
  try {
2436
- spanData.response = span.spanData?._response || null;
2443
+ const response = span.spanData?._response;
2444
+ if (response !== void 0) {
2445
+ spanData.response = response;
2446
+ }
2437
2447
  } catch (error) {
2438
2448
  errors.push({
2439
2449
  source: "sdk",
@@ -3147,11 +3157,11 @@ var Bitfab = class {
3147
3157
  startedAt,
3148
3158
  spanType: options.type ?? "custom"
3149
3159
  };
3150
- const sendSpan = async (params) => {
3160
+ const sendSpan = async (params, spanOpts) => {
3151
3161
  const replayCtx = getReplayContext();
3152
3162
  const persistenceCollector = isRootSpan ? replayCtx?.pendingPersistence : void 0;
3153
3163
  let resolvePersistence;
3154
- if (persistenceCollector) {
3164
+ if (persistenceCollector && !spanOpts?.skipPersistenceRegistration) {
3155
3165
  persistenceCollector.push(
3156
3166
  new Promise((resolve) => {
3157
3167
  resolvePersistence = resolve;
@@ -3251,11 +3261,41 @@ var Bitfab = class {
3251
3261
  }
3252
3262
  }
3253
3263
  }
3264
+ const recordSpan = (result) => {
3265
+ if (options.finalize) {
3266
+ const replayCtx = getReplayContext();
3267
+ const persistenceCollector = isRootSpan ? replayCtx?.pendingPersistence : void 0;
3268
+ let resolvePersistence;
3269
+ if (persistenceCollector) {
3270
+ persistenceCollector.push(
3271
+ new Promise((resolve) => {
3272
+ resolvePersistence = resolve;
3273
+ })
3274
+ );
3275
+ }
3276
+ void Promise.resolve().then(() => options.finalize(result)).then(
3277
+ (output) => sendSpan(
3278
+ { result: output },
3279
+ { skipPersistenceRegistration: true }
3280
+ )
3281
+ ).catch(
3282
+ (error) => sendSpan(
3283
+ {
3284
+ result: void 0,
3285
+ error: error instanceof Error ? `finalize failed: ${error.message}` : `finalize failed: ${String(error)}`
3286
+ },
3287
+ { skipPersistenceRegistration: true }
3288
+ )
3289
+ ).finally(() => resolvePersistence?.());
3290
+ } else {
3291
+ void sendSpan({ result });
3292
+ }
3293
+ };
3254
3294
  const executeWithContext = () => {
3255
3295
  const result = fn(...args);
3256
3296
  if (result instanceof Promise) {
3257
3297
  return result.then((resolvedResult) => {
3258
- void sendSpan({ result: resolvedResult });
3298
+ recordSpan(resolvedResult);
3259
3299
  return resolvedResult;
3260
3300
  }).catch((error) => {
3261
3301
  void sendSpan({
@@ -3268,7 +3308,7 @@ var Bitfab = class {
3268
3308
  if (isAsyncGenerator(result)) {
3269
3309
  return wrapAsyncGenerator(result, newStack, sendSpan);
3270
3310
  }
3271
- void sendSpan({ result });
3311
+ recordSpan(result);
3272
3312
  return result;
3273
3313
  };
3274
3314
  return runWithSpanStack(newStack, executeWithContext);
@@ -3551,6 +3591,54 @@ var BitfabFunction = class {
3551
3591
  );
3552
3592
  }
3553
3593
  };
3594
+
3595
+ // src/finalizers.ts
3596
+ async function settle(value) {
3597
+ try {
3598
+ return await value;
3599
+ } catch {
3600
+ return void 0;
3601
+ }
3602
+ }
3603
+ async function aiSdk(result) {
3604
+ const r = result ?? {};
3605
+ const [text, usage, totalUsage, finishReason, toolCalls, toolResults] = await Promise.all([
3606
+ settle(r.text),
3607
+ settle(r.usage),
3608
+ settle(r.totalUsage),
3609
+ settle(r.finishReason),
3610
+ settle(r.toolCalls),
3611
+ settle(r.toolResults)
3612
+ ]);
3613
+ return {
3614
+ text,
3615
+ usage: totalUsage ?? usage,
3616
+ finishReason,
3617
+ toolCalls,
3618
+ toolResults
3619
+ };
3620
+ }
3621
+ async function readableStream(stream, onLive) {
3622
+ const [live, copy] = stream.tee();
3623
+ onLive(live);
3624
+ const chunks = [];
3625
+ const reader = copy.getReader();
3626
+ try {
3627
+ for (; ; ) {
3628
+ const { done, value } = await reader.read();
3629
+ if (done) {
3630
+ break;
3631
+ }
3632
+ chunks.push(value);
3633
+ }
3634
+ } catch {
3635
+ }
3636
+ return { chunks };
3637
+ }
3638
+ var finalizers = {
3639
+ aiSdk,
3640
+ readableStream
3641
+ };
3554
3642
  // Annotate the CommonJS export names for ESM import in node:
3555
3643
  0 && (module.exports = {
3556
3644
  Bitfab,
@@ -3564,6 +3652,7 @@ var BitfabFunction = class {
3564
3652
  ReplayEnvironment,
3565
3653
  SUPPORTED_PROVIDERS,
3566
3654
  __version__,
3655
+ finalizers,
3567
3656
  flushTraces,
3568
3657
  getCurrentSpan,
3569
3658
  getCurrentTrace