bitfab 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
@@ -491,6 +491,7 @@ __export(index_exports, {
491
491
  ReplayEnvironment: () => ReplayEnvironment,
492
492
  SUPPORTED_PROVIDERS: () => SUPPORTED_PROVIDERS,
493
493
  __version__: () => __version__,
494
+ finalizers: () => finalizers,
494
495
  flushTraces: () => flushTraces,
495
496
  getCurrentSpan: () => getCurrentSpan,
496
497
  getCurrentTrace: () => getCurrentTrace
@@ -498,7 +499,7 @@ __export(index_exports, {
498
499
  module.exports = __toCommonJS(index_exports);
499
500
 
500
501
  // src/version.generated.ts
501
- var __version__ = "0.20.0";
502
+ var __version__ = "0.21.1";
502
503
 
503
504
  // src/constants.ts
504
505
  var DEFAULT_SERVICE_URL = "https://bitfab.ai";
@@ -2431,9 +2432,15 @@ var BitfabOpenAITracingProcessor = class {
2431
2432
  * Extract and add input/response to serialized span, updating errors list.
2432
2433
  */
2433
2434
  extractSpanInputResponse(span, serializedSpan, errors) {
2435
+ if (span.spanData?.type !== "response") {
2436
+ return;
2437
+ }
2434
2438
  const spanData = serializedSpan.span_data;
2435
2439
  try {
2436
- spanData.input = span.spanData?._input || [];
2440
+ const input = span.spanData?._input;
2441
+ if (input !== void 0) {
2442
+ spanData.input = input;
2443
+ }
2437
2444
  } catch (error) {
2438
2445
  errors.push({
2439
2446
  source: "sdk",
@@ -2442,7 +2449,10 @@ var BitfabOpenAITracingProcessor = class {
2442
2449
  });
2443
2450
  }
2444
2451
  try {
2445
- spanData.response = span.spanData?._response || null;
2452
+ const response = span.spanData?._response;
2453
+ if (response !== void 0) {
2454
+ spanData.response = response;
2455
+ }
2446
2456
  } catch (error) {
2447
2457
  errors.push({
2448
2458
  source: "sdk",
@@ -3156,11 +3166,11 @@ var Bitfab = class {
3156
3166
  startedAt,
3157
3167
  spanType: options.type ?? "custom"
3158
3168
  };
3159
- const sendSpan = async (params) => {
3169
+ const sendSpan = async (params, spanOpts) => {
3160
3170
  const replayCtx = getReplayContext();
3161
3171
  const persistenceCollector = isRootSpan ? replayCtx?.pendingPersistence : void 0;
3162
3172
  let resolvePersistence;
3163
- if (persistenceCollector) {
3173
+ if (persistenceCollector && !spanOpts?.skipPersistenceRegistration) {
3164
3174
  persistenceCollector.push(
3165
3175
  new Promise((resolve) => {
3166
3176
  resolvePersistence = resolve;
@@ -3260,11 +3270,41 @@ var Bitfab = class {
3260
3270
  }
3261
3271
  }
3262
3272
  }
3273
+ const recordSpan = (result) => {
3274
+ if (options.finalize) {
3275
+ const replayCtx = getReplayContext();
3276
+ const persistenceCollector = isRootSpan ? replayCtx?.pendingPersistence : void 0;
3277
+ let resolvePersistence;
3278
+ if (persistenceCollector) {
3279
+ persistenceCollector.push(
3280
+ new Promise((resolve) => {
3281
+ resolvePersistence = resolve;
3282
+ })
3283
+ );
3284
+ }
3285
+ void Promise.resolve().then(() => options.finalize(result)).then(
3286
+ (output) => sendSpan(
3287
+ { result: output },
3288
+ { skipPersistenceRegistration: true }
3289
+ )
3290
+ ).catch(
3291
+ (error) => sendSpan(
3292
+ {
3293
+ result: void 0,
3294
+ error: error instanceof Error ? `finalize failed: ${error.message}` : `finalize failed: ${String(error)}`
3295
+ },
3296
+ { skipPersistenceRegistration: true }
3297
+ )
3298
+ ).finally(() => resolvePersistence?.());
3299
+ } else {
3300
+ void sendSpan({ result });
3301
+ }
3302
+ };
3263
3303
  const executeWithContext = () => {
3264
3304
  const result = fn(...args);
3265
3305
  if (result instanceof Promise) {
3266
3306
  return result.then((resolvedResult) => {
3267
- void sendSpan({ result: resolvedResult });
3307
+ recordSpan(resolvedResult);
3268
3308
  return resolvedResult;
3269
3309
  }).catch((error) => {
3270
3310
  void sendSpan({
@@ -3277,7 +3317,7 @@ var Bitfab = class {
3277
3317
  if (isAsyncGenerator(result)) {
3278
3318
  return wrapAsyncGenerator(result, newStack, sendSpan);
3279
3319
  }
3280
- void sendSpan({ result });
3320
+ recordSpan(result);
3281
3321
  return result;
3282
3322
  };
3283
3323
  return runWithSpanStack(newStack, executeWithContext);
@@ -3560,6 +3600,54 @@ var BitfabFunction = class {
3560
3600
  );
3561
3601
  }
3562
3602
  };
3603
+
3604
+ // src/finalizers.ts
3605
+ async function settle(value) {
3606
+ try {
3607
+ return await value;
3608
+ } catch {
3609
+ return void 0;
3610
+ }
3611
+ }
3612
+ async function aiSdk(result) {
3613
+ const r = result ?? {};
3614
+ const [text, usage, totalUsage, finishReason, toolCalls, toolResults] = await Promise.all([
3615
+ settle(r.text),
3616
+ settle(r.usage),
3617
+ settle(r.totalUsage),
3618
+ settle(r.finishReason),
3619
+ settle(r.toolCalls),
3620
+ settle(r.toolResults)
3621
+ ]);
3622
+ return {
3623
+ text,
3624
+ usage: totalUsage ?? usage,
3625
+ finishReason,
3626
+ toolCalls,
3627
+ toolResults
3628
+ };
3629
+ }
3630
+ async function readableStream(stream, onLive) {
3631
+ const [live, copy] = stream.tee();
3632
+ onLive(live);
3633
+ const chunks = [];
3634
+ const reader = copy.getReader();
3635
+ try {
3636
+ for (; ; ) {
3637
+ const { done, value } = await reader.read();
3638
+ if (done) {
3639
+ break;
3640
+ }
3641
+ chunks.push(value);
3642
+ }
3643
+ } catch {
3644
+ }
3645
+ return { chunks };
3646
+ }
3647
+ var finalizers = {
3648
+ aiSdk,
3649
+ readableStream
3650
+ };
3563
3651
  // Annotate the CommonJS export names for ESM import in node:
3564
3652
  0 && (module.exports = {
3565
3653
  Bitfab,
@@ -3573,6 +3661,7 @@ var BitfabFunction = class {
3573
3661
  ReplayEnvironment,
3574
3662
  SUPPORTED_PROVIDERS,
3575
3663
  __version__,
3664
+ finalizers,
3576
3665
  flushTraces,
3577
3666
  getCurrentSpan,
3578
3667
  getCurrentTrace