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.
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-EQI6ZJC3.js";
11
11
 
12
12
  // src/version.generated.ts
13
- var __version__ = "0.20.0";
13
+ var __version__ = "0.21.1";
14
14
 
15
15
  // src/constants.ts
16
16
  var DEFAULT_SERVICE_URL = "https://bitfab.ai";
@@ -1929,9 +1929,15 @@ var BitfabOpenAITracingProcessor = class {
1929
1929
  * Extract and add input/response to serialized span, updating errors list.
1930
1930
  */
1931
1931
  extractSpanInputResponse(span, serializedSpan, errors) {
1932
+ if (span.spanData?.type !== "response") {
1933
+ return;
1934
+ }
1932
1935
  const spanData = serializedSpan.span_data;
1933
1936
  try {
1934
- spanData.input = span.spanData?._input || [];
1937
+ const input = span.spanData?._input;
1938
+ if (input !== void 0) {
1939
+ spanData.input = input;
1940
+ }
1935
1941
  } catch (error) {
1936
1942
  errors.push({
1937
1943
  source: "sdk",
@@ -1940,7 +1946,10 @@ var BitfabOpenAITracingProcessor = class {
1940
1946
  });
1941
1947
  }
1942
1948
  try {
1943
- spanData.response = span.spanData?._response || null;
1949
+ const response = span.spanData?._response;
1950
+ if (response !== void 0) {
1951
+ spanData.response = response;
1952
+ }
1944
1953
  } catch (error) {
1945
1954
  errors.push({
1946
1955
  source: "sdk",
@@ -2654,11 +2663,11 @@ var Bitfab = class {
2654
2663
  startedAt,
2655
2664
  spanType: options.type ?? "custom"
2656
2665
  };
2657
- const sendSpan = async (params) => {
2666
+ const sendSpan = async (params, spanOpts) => {
2658
2667
  const replayCtx = getReplayContext();
2659
2668
  const persistenceCollector = isRootSpan ? replayCtx?.pendingPersistence : void 0;
2660
2669
  let resolvePersistence;
2661
- if (persistenceCollector) {
2670
+ if (persistenceCollector && !spanOpts?.skipPersistenceRegistration) {
2662
2671
  persistenceCollector.push(
2663
2672
  new Promise((resolve) => {
2664
2673
  resolvePersistence = resolve;
@@ -2758,11 +2767,41 @@ var Bitfab = class {
2758
2767
  }
2759
2768
  }
2760
2769
  }
2770
+ const recordSpan = (result) => {
2771
+ if (options.finalize) {
2772
+ const replayCtx = getReplayContext();
2773
+ const persistenceCollector = isRootSpan ? replayCtx?.pendingPersistence : void 0;
2774
+ let resolvePersistence;
2775
+ if (persistenceCollector) {
2776
+ persistenceCollector.push(
2777
+ new Promise((resolve) => {
2778
+ resolvePersistence = resolve;
2779
+ })
2780
+ );
2781
+ }
2782
+ void Promise.resolve().then(() => options.finalize(result)).then(
2783
+ (output) => sendSpan(
2784
+ { result: output },
2785
+ { skipPersistenceRegistration: true }
2786
+ )
2787
+ ).catch(
2788
+ (error) => sendSpan(
2789
+ {
2790
+ result: void 0,
2791
+ error: error instanceof Error ? `finalize failed: ${error.message}` : `finalize failed: ${String(error)}`
2792
+ },
2793
+ { skipPersistenceRegistration: true }
2794
+ )
2795
+ ).finally(() => resolvePersistence?.());
2796
+ } else {
2797
+ void sendSpan({ result });
2798
+ }
2799
+ };
2761
2800
  const executeWithContext = () => {
2762
2801
  const result = fn(...args);
2763
2802
  if (result instanceof Promise) {
2764
2803
  return result.then((resolvedResult) => {
2765
- void sendSpan({ result: resolvedResult });
2804
+ recordSpan(resolvedResult);
2766
2805
  return resolvedResult;
2767
2806
  }).catch((error) => {
2768
2807
  void sendSpan({
@@ -2775,7 +2814,7 @@ var Bitfab = class {
2775
2814
  if (isAsyncGenerator(result)) {
2776
2815
  return wrapAsyncGenerator(result, newStack, sendSpan);
2777
2816
  }
2778
- void sendSpan({ result });
2817
+ recordSpan(result);
2779
2818
  return result;
2780
2819
  };
2781
2820
  return runWithSpanStack(newStack, executeWithContext);
@@ -3059,6 +3098,54 @@ var BitfabFunction = class {
3059
3098
  }
3060
3099
  };
3061
3100
 
3101
+ // src/finalizers.ts
3102
+ async function settle(value) {
3103
+ try {
3104
+ return await value;
3105
+ } catch {
3106
+ return void 0;
3107
+ }
3108
+ }
3109
+ async function aiSdk(result) {
3110
+ const r = result ?? {};
3111
+ const [text, usage, totalUsage, finishReason, toolCalls, toolResults] = await Promise.all([
3112
+ settle(r.text),
3113
+ settle(r.usage),
3114
+ settle(r.totalUsage),
3115
+ settle(r.finishReason),
3116
+ settle(r.toolCalls),
3117
+ settle(r.toolResults)
3118
+ ]);
3119
+ return {
3120
+ text,
3121
+ usage: totalUsage ?? usage,
3122
+ finishReason,
3123
+ toolCalls,
3124
+ toolResults
3125
+ };
3126
+ }
3127
+ async function readableStream(stream, onLive) {
3128
+ const [live, copy] = stream.tee();
3129
+ onLive(live);
3130
+ const chunks = [];
3131
+ const reader = copy.getReader();
3132
+ try {
3133
+ for (; ; ) {
3134
+ const { done, value } = await reader.read();
3135
+ if (done) {
3136
+ break;
3137
+ }
3138
+ chunks.push(value);
3139
+ }
3140
+ } catch {
3141
+ }
3142
+ return { chunks };
3143
+ }
3144
+ var finalizers = {
3145
+ aiSdk,
3146
+ readableStream
3147
+ };
3148
+
3062
3149
  export {
3063
3150
  __version__,
3064
3151
  DEFAULT_SERVICE_URL,
@@ -3071,6 +3158,7 @@ export {
3071
3158
  getCurrentSpan,
3072
3159
  getCurrentTrace,
3073
3160
  Bitfab,
3074
- BitfabFunction
3161
+ BitfabFunction,
3162
+ finalizers
3075
3163
  };
3076
- //# sourceMappingURL=chunk-IUZIGC6T.js.map
3164
+ //# sourceMappingURL=chunk-75LZO6JS.js.map