@bitfab/sdk 0.76.6 → 0.76.7

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.
Files changed (34) hide show
  1. package/dist/{autoTrace-B0HsiBQB.cjs → autoTrace-BtiEpHTN.cjs} +40 -3
  2. package/dist/autoTrace-BtiEpHTN.cjs.map +1 -0
  3. package/dist/{autoTrace-g3y0sLPq.js → autoTrace-RWUOk1WF.js} +17 -4
  4. package/dist/autoTrace-RWUOk1WF.js.map +1 -0
  5. package/dist/autoTrace.cjs +1 -1
  6. package/dist/autoTrace.js +1 -1
  7. package/dist/{http-C6oeysq-.cjs → http-7FhAoWen.cjs} +3 -3
  8. package/dist/{http-C6oeysq-.cjs.map → http-7FhAoWen.cjs.map} +1 -1
  9. package/dist/{http-DZlsxUgc.js → http-DoS4PUm6.js} +3 -3
  10. package/dist/{http-DZlsxUgc.js.map → http-DoS4PUm6.js.map} +1 -1
  11. package/dist/{index-DjGNdF9p.d.cts → index-C-3LPlPg.d.cts} +1 -1
  12. package/dist/{index-DjGNdF9p.d.ts → index-C-3LPlPg.d.ts} +1 -1
  13. package/dist/index.cjs +2 -2
  14. package/dist/index.d.cts +1 -1
  15. package/dist/index.d.ts +1 -1
  16. package/dist/index.js +2 -2
  17. package/dist/node.cjs +3 -3
  18. package/dist/node.d.cts +1 -1
  19. package/dist/node.d.ts +1 -1
  20. package/dist/node.js +3 -3
  21. package/dist/{registryCommand-UEUDL6JV.js → registryCommand-D9EkYtKh.js} +6 -3
  22. package/dist/registryCommand-D9EkYtKh.js.map +1 -0
  23. package/dist/replayCli.js +1 -1
  24. package/dist/seedCli.js +1 -1
  25. package/dist/{src-CI_xliRE.cjs → src-C0Mz9eoA.cjs} +113 -62
  26. package/dist/src-C0Mz9eoA.cjs.map +1 -0
  27. package/dist/{src-DIJP4CNn.js → src-Cm9Jdgfh.js} +113 -62
  28. package/dist/src-Cm9Jdgfh.js.map +1 -0
  29. package/package.json +1 -1
  30. package/dist/autoTrace-B0HsiBQB.cjs.map +0 -1
  31. package/dist/autoTrace-g3y0sLPq.js.map +0 -1
  32. package/dist/registryCommand-UEUDL6JV.js.map +0 -1
  33. package/dist/src-CI_xliRE.cjs.map +0 -1
  34. package/dist/src-DIJP4CNn.js.map +0 -1
@@ -242,6 +242,7 @@ var StreamFinalizationError = class extends Error {
242
242
  //#endregion
243
243
  //#region src/clientCalls.ts
244
244
  const OPENROUTER_HOSTNAME = "openrouter.ai";
245
+ const ANTHROPIC_HOSTNAME = "anthropic.com";
245
246
  const CLIENT_CALL_WATCH_STORAGE_SYMBOL = Symbol.for("bitfab.clientCallWatchStorage");
246
247
  const RESPONSE_DONE_EVENTS = [
247
248
  "response.completed",
@@ -336,15 +337,21 @@ function clientClassStatic(receiver, name) {
336
337
  return;
337
338
  }
338
339
  }
339
- function isOpenRouterBaseUrl(baseUrl) {
340
+ function baseUrlHostIs(baseUrl, hostname) {
340
341
  if (typeof baseUrl !== "string") return false;
341
342
  try {
342
343
  const host = new URL(baseUrl).hostname;
343
- return host === OPENROUTER_HOSTNAME || host.endsWith(`.${OPENROUTER_HOSTNAME}`);
344
+ return host === hostname || host.endsWith(`.${hostname}`);
344
345
  } catch {
345
346
  return false;
346
347
  }
347
348
  }
349
+ function isOpenRouterBaseUrl(baseUrl) {
350
+ return baseUrlHostIs(baseUrl, OPENROUTER_HOSTNAME);
351
+ }
352
+ function isAnthropicBaseUrl(baseUrl) {
353
+ return baseUrlHostIs(baseUrl, ANTHROPIC_HOSTNAME);
354
+ }
348
355
  function isOpenRouterResource(receiver) {
349
356
  try {
350
357
  return isOpenRouterBaseUrl(field(clientOf(receiver), "baseURL"));
@@ -741,6 +748,12 @@ const CLIENT_CALL_PROVIDERS = [
741
748
  GEMINI_EMBEDDINGS
742
749
  ];
743
750
  const CLIENT_CALL_PROVIDERS_BY_KEY = new Map(CLIENT_CALL_PROVIDERS.map((provider) => [provider.key, provider]));
751
+ const ANTHROPIC_CACHE_USAGE_KEYS = ["cache_read_input_tokens", "cache_creation_input_tokens"];
752
+ const CHAT_COMPLETION_USAGE_KEYS = ["prompt_tokens", "completion_tokens"];
753
+ function clientCallProviderForUsage(usage) {
754
+ if (ANTHROPIC_CACHE_USAGE_KEYS.some((key) => key in usage)) return ANTHROPIC;
755
+ return CHAT_COMPLETION_USAGE_KEYS.some((key) => key in usage) ? OPENAI_CHAT : OPENAI_RESPONSES;
756
+ }
744
757
  function clientCallProvider(key) {
745
758
  return key === void 0 ? void 0 : CLIENT_CALL_PROVIDERS_BY_KEY.get(key);
746
759
  }
@@ -1310,6 +1323,12 @@ Object.defineProperty(exports, "GEMINI_EMBEDDINGS", {
1310
1323
  return GEMINI_EMBEDDINGS;
1311
1324
  }
1312
1325
  });
1326
+ Object.defineProperty(exports, "MODEL_CALL_SPAN_TYPES", {
1327
+ enumerable: true,
1328
+ get: function() {
1329
+ return MODEL_CALL_SPAN_TYPES;
1330
+ }
1331
+ });
1313
1332
  Object.defineProperty(exports, "OPENAI_CHAT", {
1314
1333
  enumerable: true,
1315
1334
  get: function() {
@@ -1424,6 +1443,12 @@ Object.defineProperty(exports, "clientCallProvider", {
1424
1443
  return clientCallProvider;
1425
1444
  }
1426
1445
  });
1446
+ Object.defineProperty(exports, "clientCallProviderForUsage", {
1447
+ enumerable: true,
1448
+ get: function() {
1449
+ return clientCallProviderForUsage;
1450
+ }
1451
+ });
1427
1452
  Object.defineProperty(exports, "clientCallStreams", {
1428
1453
  enumerable: true,
1429
1454
  get: function() {
@@ -1478,6 +1503,12 @@ Object.defineProperty(exports, "invokeThroughAutoTraceEntries", {
1478
1503
  return invokeThroughAutoTraceEntries;
1479
1504
  }
1480
1505
  });
1506
+ Object.defineProperty(exports, "isAnthropicBaseUrl", {
1507
+ enumerable: true,
1508
+ get: function() {
1509
+ return isAnthropicBaseUrl;
1510
+ }
1511
+ });
1481
1512
  Object.defineProperty(exports, "isAsyncStorageInitDone", {
1482
1513
  enumerable: true,
1483
1514
  get: function() {
@@ -1490,6 +1521,12 @@ Object.defineProperty(exports, "isCaptureSuppressed", {
1490
1521
  return isCaptureSuppressed;
1491
1522
  }
1492
1523
  });
1524
+ Object.defineProperty(exports, "isOpenRouterBaseUrl", {
1525
+ enumerable: true,
1526
+ get: function() {
1527
+ return isOpenRouterBaseUrl;
1528
+ }
1529
+ });
1493
1530
  Object.defineProperty(exports, "mapOpenAiAgentsTrace", {
1494
1531
  enumerable: true,
1495
1532
  get: function() {
@@ -1605,4 +1642,4 @@ Object.defineProperty(exports, "writeOnce", {
1605
1642
  }
1606
1643
  });
1607
1644
 
1608
- //# sourceMappingURL=autoTrace-B0HsiBQB.cjs.map
1645
+ //# sourceMappingURL=autoTrace-BtiEpHTN.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoTrace-BtiEpHTN.cjs","names":["importOptionalPeer","target"],"sources":["../src/asyncStorage.ts","../src/captureSuppression.ts","../src/warnOnce.ts","../src/langchainRunScope.ts","../src/openaiAgentsSpanContext.ts","../src/streamFinalizationError.ts","../src/clientCalls.ts","../src/autoTrace.ts"],"sourcesContent":["/**\n * Shared AsyncLocalStorage loader.\n *\n * Provides two ways to initialize AsyncLocalStorage:\n *\n * 1. **Synchronous registration** (preferred for Node.js):\n * `asyncStorageNode.ts` calls `registerAsyncLocalStorageClass()` at module\n * evaluation time, so the class is available immediately - no async gap.\n * The `node.ts` entry point imports it before anything else.\n *\n * 2. **Async dynamic import** (fallback for the default entry point):\n * Loads `node:async_hooks` via a bundler-safe dynamic import. This is used\n * by the default `index.ts` entry point so the SDK works in browsers\n * (where the import silently fails) and in Node.js when imported via the\n * default entry point.\n *\n * ## Why the dynamic import looks like this\n *\n * We need to handle three environments:\n *\n * 1. **Pure Node.js** - `import(\"node:async_hooks\")` works natively.\n * 2. **Webpack/Turbopack (Next.js server)** - The bundler processes\n * `import()` calls at build time. The `webpackIgnore` magic comment tells\n * webpack (and turbopack) to emit a native `import()` call instead of\n * trying to resolve it, so Node.js handles it at runtime.\n * 3. **Browsers / Edge** - The `process.versions?.node` guard prevents\n * execution entirely. If it somehow runs, `.catch(() => {})` swallows\n * the failure.\n */\n\nexport interface AsyncLocalStorageLike<T> {\n getStore(): T | undefined\n run<R>(store: T, fn: () => R): R\n}\n\nlet AsyncLocalStorageClass: (new () => AsyncLocalStorageLike<unknown>) | null =\n null\nlet initDone = false\n\n/**\n * Register the AsyncLocalStorage class synchronously.\n *\n * Called by `asyncStorageNode.ts` at module evaluation time so the class\n * is available before any span is created - no async gap, no race condition.\n *\n * Safe to call multiple times; subsequent calls are no-ops.\n */\nexport function registerAsyncLocalStorageClass(\n cls: new () => AsyncLocalStorageLike<unknown>,\n): void {\n if (!AsyncLocalStorageClass) {\n AsyncLocalStorageClass = cls\n }\n initDone = true\n}\n\n/**\n * Assert that AsyncLocalStorage was registered successfully.\n *\n * Called by `node.ts` after importing `asyncStorageNode.ts` to catch\n * import-order bugs at startup rather than silently degrading to the\n * browser fallback (flat spans with no nesting).\n *\n * This should ONLY be called from the Node.js entry point where we\n * know `node:async_hooks` must be available.\n */\nexport function assertAsyncStorageRegistered(): void {\n if (!AsyncLocalStorageClass) {\n console.warn(\n \"Bitfab: AsyncLocalStorage not available - nested span context will not propagate.\",\n )\n }\n}\n\nexport const asyncStorageReady: Promise<void> = (\n typeof process !== \"undefined\" && process.versions?.node\n ? // The join trick hides \"node:async_hooks\" from static analysis so\n // bundlers that ban Node.js built-ins don't fail at build time.\n // webpackIgnore tells webpack/turbopack to emit a native import()\n // so Node.js can resolve the module at runtime.\n import(\n /* webpackIgnore: true */\n [\"node\", \"async_hooks\"].join(\":\")\n )\n .then(\n (mod: {\n AsyncLocalStorage: new () => AsyncLocalStorageLike<unknown>\n }) => {\n registerAsyncLocalStorageClass(mod.AsyncLocalStorage)\n },\n )\n .catch(() => {})\n : Promise.resolve()\n).then(() => {\n initDone = true\n})\n\nexport function isAsyncStorageInitDone(): boolean {\n return initDone\n}\n\nexport function createAsyncLocalStorage<T>(): AsyncLocalStorageLike<T> | null {\n return AsyncLocalStorageClass\n ? (new AsyncLocalStorageClass() as AsyncLocalStorageLike<T>)\n : null\n}\n","interface CaptureSuppressionState {\n depth: number\n}\n\ninterface CaptureSuppressionGlobal {\n __bitfabCaptureSuppressionV1?: CaptureSuppressionState\n}\n\nconst suppressionGlobal = globalThis as unknown as CaptureSuppressionGlobal\nconst suppressionState: CaptureSuppressionState =\n suppressionGlobal.__bitfabCaptureSuppressionV1 ?? { depth: 0 }\nsuppressionGlobal.__bitfabCaptureSuppressionV1 = suppressionState\n\nexport function isCaptureSuppressed(): boolean {\n return suppressionState.depth > 0\n}\n\nexport function runWithCaptureSuppressed<T>(fn: () => T): T {\n suppressionState.depth += 1\n try {\n return fn()\n } finally {\n suppressionState.depth -= 1\n }\n}\n","/**\n * Emit a `console.warn` at most once per distinct `key` for the life of the\n * process.\n *\n * The SDK must NEVER crash a host app, so every failure on the user's path\n * degrades silently (a span is dropped, a call runs untraced, a payload is\n * stubbed). Silent is safe but undebuggable: a user who suddenly has no traces,\n * or sees `<unserializable>` in a span, has no signal as to why. A one-time\n * warning per distinct issue restores that signal without spamming the console\n * from a hot path.\n *\n * Keys should identify the specific degradation (e.g. include the traced\n * function key) so each distinct issue warns once, not just the first one seen.\n */\nconst warned = new Set<string>()\n\nexport function warn(message: string): void {\n try {\n console.warn(`[bitfab] ${message}`)\n } catch {\n // Logging must never crash the host app (e.g. a closed/replaced console).\n }\n}\n\nexport function warnOnce(key: string, message: string): void {\n if (warned.has(key)) {\n return\n }\n warned.add(key)\n warn(message)\n}\n\nexport function writeOnce(\n key: string,\n line: string,\n write: (line: string) => void = console.warn,\n): void {\n if (warned.has(key)) {\n return\n }\n warned.add(key)\n try {\n write(line)\n } catch {}\n}\n\n/** Test-only: clear the dedup set so a warning can fire again. */\nexport function _resetWarnOnce(): void {\n warned.clear()\n}\n","import {\n type AsyncLocalStorageLike,\n createAsyncLocalStorage,\n} from \"./asyncStorage.js\"\nimport { importOptionalPeer } from \"./optionalPeer.js\"\n\nconst RUN_SCOPE_STORAGE_SYMBOL = Symbol.for(\"bitfab.langchainRunScopeStorage\")\nconst SCOPED_GENERATE_SYMBOL = Symbol.for(\"bitfab.langchainScopedGenerate\")\nconst UNSCOPED_RUNS_SYMBOL = Symbol.for(\"bitfab.langchainUnscopedRuns\")\nconst MODEL_CLASSES = [\n {\n specifierParts: [\"@langchain\", \"core\", \"language_models\", \"chat_models\"],\n name: \"BaseChatModel\",\n },\n {\n specifierParts: [\"@langchain\", \"core\", \"language_models\", \"llms\"],\n name: \"BaseLLM\",\n },\n] as const\n\ninterface LangChainRunScope {\n recordedByHandler: boolean\n}\n\ntype Generate = ((...args: unknown[]) => unknown) & {\n [SCOPED_GENERATE_SYMBOL]?: true\n}\n\ntype StreamIterator = ((...args: unknown[]) => AsyncIterator<unknown>) & {\n [SCOPED_GENERATE_SYMBOL]?: true\n}\n\ninterface ModelPrototype {\n generate?: Generate\n _streamIterator?: StreamIterator\n}\n\nlet runScopeStorage: AsyncLocalStorageLike<LangChainRunScope> | null = null\nlet installation: Promise<void> | null = null\n\nfunction storage(): AsyncLocalStorageLike<LangChainRunScope> | null {\n if (runScopeStorage) {\n return runScopeStorage\n }\n const shared = globalThis as typeof globalThis & Record<symbol, unknown>\n const existing = shared[RUN_SCOPE_STORAGE_SYMBOL] as\n | AsyncLocalStorageLike<LangChainRunScope>\n | undefined\n runScopeStorage = existing ?? createAsyncLocalStorage<LangChainRunScope>()\n if (runScopeStorage && !existing) {\n shared[RUN_SCOPE_STORAGE_SYMBOL] = runScopeStorage\n }\n return runScopeStorage\n}\n\nfunction unscopedRuns(): Set<string> {\n const shared = globalThis as typeof globalThis & Record<symbol, unknown>\n const existing = shared[UNSCOPED_RUNS_SYMBOL] as Set<string> | undefined\n if (existing) {\n return existing\n }\n const created = new Set<string>()\n shared[UNSCOPED_RUNS_SYMBOL] = created\n return created\n}\n\nfunction scopedIterator(\n runStorage: AsyncLocalStorageLike<LangChainRunScope>,\n iterator: AsyncIterator<unknown>,\n): AsyncIterableIterator<unknown> {\n const scope: LangChainRunScope = { recordedByHandler: false }\n const inScope = <T>(step: () => Promise<T>): Promise<T> =>\n runStorage.run(scope, step)\n return {\n next: (...args: [] | [unknown]) => inScope(() => iterator.next(...args)),\n return: (value?: unknown) =>\n inScope(() =>\n iterator.return === undefined\n ? Promise.resolve({ done: true as const, value })\n : iterator.return(value),\n ),\n throw: (error?: unknown) =>\n inScope(() =>\n iterator.throw === undefined\n ? Promise.reject(error)\n : iterator.throw(error),\n ),\n [Symbol.asyncIterator]() {\n return this\n },\n }\n}\n\nfunction scopeStreamIterator(prototype: ModelPrototype): void {\n const original = prototype._streamIterator\n if (typeof original !== \"function\" || original[SCOPED_GENERATE_SYMBOL]) {\n return\n }\n const scoped: StreamIterator = function (this: unknown, ...args: unknown[]) {\n const runStorage = storage()\n const iterator = original.apply(this, args)\n return runStorage ? scopedIterator(runStorage, iterator) : iterator\n }\n scoped[SCOPED_GENERATE_SYMBOL] = true\n prototype._streamIterator = scoped\n}\n\nfunction scopeGenerate(prototype: ModelPrototype): void {\n const original = prototype.generate\n if (typeof original !== \"function\" || original[SCOPED_GENERATE_SYMBOL]) {\n return\n }\n const scoped: Generate = function (this: unknown, ...args: unknown[]) {\n const runStorage = storage()\n if (!runStorage) {\n return original.apply(this, args)\n }\n return runStorage.run({ recordedByHandler: false }, () =>\n original.apply(this, args),\n )\n }\n scoped[SCOPED_GENERATE_SYMBOL] = true\n prototype.generate = scoped\n}\n\nasync function scopeModelClass(\n specifierParts: readonly string[],\n name: string,\n): Promise<void> {\n try {\n const module =\n await importOptionalPeer<Record<string, unknown>>(specifierParts)\n const modelClass = module[name] as { prototype?: ModelPrototype }\n if (modelClass?.prototype) {\n scopeGenerate(modelClass.prototype)\n scopeStreamIterator(modelClass.prototype)\n }\n } catch {}\n}\n\nexport function installLangChainRunScopes(): Promise<void> {\n installation ??= Promise.all(\n MODEL_CLASSES.map(({ specifierParts, name }) =>\n scopeModelClass(specifierParts, name),\n ),\n ).then(() => undefined)\n return installation\n}\n\nexport function markLangChainRunRecorded(runId: string): void {\n const scope = storage()?.getStore()\n if (scope) {\n scope.recordedByHandler = true\n return\n }\n unscopedRuns().add(runId)\n}\n\nexport function forgetLangChainRun(runId: string): void {\n unscopedRuns().delete(runId)\n}\n\nexport function langChainHandlerRecordsCall(): boolean {\n const scope = storage()?.getStore()\n if (scope) {\n return scope.recordedByHandler\n }\n return unscopedRuns().size > 0\n}\n","const OPENAI_AGENTS_CONTEXT_STORAGE = Symbol.for(\n \"openai.agents.core.asyncLocalStorage\",\n)\nconst MAX_OPENAI_AGENTS_SPAN_CHAIN = 64\nexport const MODEL_CALL_SPAN_TYPES: ReadonlySet<string> = new Set([\n \"generation\",\n \"response\",\n])\n\ninterface OpenAiAgentsSpanLike {\n spanId?: unknown\n traceId?: unknown\n spanData?: { type?: unknown } | null\n previousSpan?: OpenAiAgentsSpanLike | null\n}\n\ninterface OpenAiAgentsContextStore {\n active?: unknown\n span?: OpenAiAgentsSpanLike | null\n}\n\ninterface OpenAiAgentsContextStorage {\n getStore(): OpenAiAgentsContextStore | undefined\n}\n\ninterface OpenAiAgentsSpanState {\n bitfabTraceIds: Map<string, string>\n endedSpanIds: Map<string, Set<string>>\n}\n\ninterface OpenAiAgentsSpanGlobal {\n __bitfabOpenAiAgentsSpansV1?: OpenAiAgentsSpanState\n}\n\nconst spanGlobal = globalThis as unknown as OpenAiAgentsSpanGlobal &\n Record<symbol, unknown>\nconst state: OpenAiAgentsSpanState = spanGlobal.__bitfabOpenAiAgentsSpansV1 ?? {\n bitfabTraceIds: new Map(),\n endedSpanIds: new Map(),\n}\nspanGlobal.__bitfabOpenAiAgentsSpansV1 = state\n\nexport function mapOpenAiAgentsTrace(\n agentsTraceId: string,\n bitfabTraceId: string,\n): void {\n state.bitfabTraceIds.set(agentsTraceId, bitfabTraceId)\n}\n\nexport function unmapOpenAiAgentsTrace(agentsTraceId: string): void {\n state.bitfabTraceIds.delete(agentsTraceId)\n state.endedSpanIds.delete(agentsTraceId)\n}\n\nexport function endOpenAiAgentsSpan(\n agentsTraceId: string,\n spanId: string,\n): void {\n if (!state.bitfabTraceIds.has(agentsTraceId)) {\n return\n }\n const ended = state.endedSpanIds.get(agentsTraceId) ?? new Set<string>()\n ended.add(spanId)\n state.endedSpanIds.set(agentsTraceId, ended)\n}\n\nfunction isOpenAiAgentsContextStorage(\n value: unknown,\n): value is OpenAiAgentsContextStorage {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as { getStore?: unknown }).getStore === \"function\"\n )\n}\n\nfunction currentOpenAiAgentsSpan(): OpenAiAgentsSpanLike | undefined {\n const storage = spanGlobal[OPENAI_AGENTS_CONTEXT_STORAGE]\n if (!isOpenAiAgentsContextStorage(storage)) {\n return undefined\n }\n try {\n const store = storage.getStore()\n return store?.active === true ? (store.span ?? undefined) : undefined\n } catch {\n return undefined\n }\n}\n\nfunction currentOpenAiAgentsSpans(): OpenAiAgentsSpanLike[] {\n const spans: OpenAiAgentsSpanLike[] = []\n let span = currentOpenAiAgentsSpan()\n while (span !== undefined && spans.length < MAX_OPENAI_AGENTS_SPAN_CHAIN) {\n spans.push(span)\n span = span.previousSpan ?? undefined\n }\n return spans\n}\n\nexport function openAiAgentsSpanChain(): string[] {\n if (state.bitfabTraceIds.size === 0) {\n return []\n }\n return currentOpenAiAgentsSpans()\n .map((span) => span.spanId)\n .filter((spanId): spanId is string => typeof spanId === \"string\")\n}\n\nexport function openAiAgentsParentSpanId(\n bitfabTraceId: string,\n enclosingSpanIds: readonly string[] | undefined,\n): string | undefined {\n if (state.bitfabTraceIds.size === 0) {\n return undefined\n }\n for (const span of currentOpenAiAgentsSpans()) {\n if (typeof span.spanId !== \"string\" || typeof span.traceId !== \"string\") {\n return undefined\n }\n if (state.bitfabTraceIds.get(span.traceId) !== bitfabTraceId) {\n return undefined\n }\n if (enclosingSpanIds?.includes(span.spanId)) {\n return undefined\n }\n if (!state.endedSpanIds.get(span.traceId)?.has(span.spanId)) {\n return span.spanId\n }\n }\n return undefined\n}\n\nexport function openAiAgentsModelCallOpen(): boolean {\n if (state.bitfabTraceIds.size === 0) {\n return false\n }\n return currentOpenAiAgentsSpans().some(\n (span) =>\n typeof span.traceId === \"string\" &&\n typeof span.spanId === \"string\" &&\n state.bitfabTraceIds.has(span.traceId) &&\n MODEL_CALL_SPAN_TYPES.has(String(span.spanData?.type)) &&\n !state.endedSpanIds.get(span.traceId)?.has(span.spanId),\n )\n}\n","export class StreamFinalizationError extends Error {\n constructor(\n message: string,\n readonly output: unknown,\n ) {\n super(message)\n this.name = \"StreamFinalizationError\"\n }\n}\n","import {\n type AsyncLocalStorageLike,\n createAsyncLocalStorage,\n} from \"./asyncStorage.js\"\nimport { langChainHandlerRecordsCall } from \"./langchainRunScope.js\"\nimport { openAiAgentsModelCallOpen } from \"./openaiAgentsSpanContext.js\"\nimport { StreamFinalizationError } from \"./streamFinalizationError.js\"\n\nconst OPENROUTER_HOSTNAME = \"openrouter.ai\"\nconst ANTHROPIC_HOSTNAME = \"anthropic.com\"\nconst CLIENT_CALL_WATCH_STORAGE_SYMBOL = Symbol.for(\n \"bitfab.clientCallWatchStorage\",\n)\nconst RESPONSE_DONE_EVENTS = [\n \"response.completed\",\n \"response.incomplete\",\n \"response.failed\",\n] as const\nconst TRANSCRIPT_DONE_EVENT = \"transcript.text.done\"\nconst STREAM_END_EVENT = \"end\"\n\nexport type ClientCallEndpoint =\n | \"chat.completions\"\n | \"embeddings\"\n | \"audio.transcriptions\"\n | \"messages\"\n | \"responses\"\n | \"models\"\n\nexport interface ClientCallProvider {\n key: string\n provider: string\n library: string\n endpoint: ClientCallEndpoint\n methods: readonly string[]\n streamMethods: readonly string[]\n streamEvents: readonly string[]\n spanMethods?: Readonly<Record<string, string>>\n matchesReceiver(receiver: unknown): boolean\n isResponse(response: unknown): boolean\n prompt(body: unknown): string | undefined\n usage(body: unknown, response: unknown): Record<string, unknown>\n streamSummary?(events: unknown[]): unknown\n}\n\ninterface ClientCallWatch {\n recorded: boolean\n parent: ClientCallWatch | null\n}\n\ninterface ClientCallSpan {\n addContext(context: Record<string, unknown>): void\n setPrompt(prompt: string): void\n}\n\ninterface PromptEntry {\n role: string\n content: string\n}\n\ninterface ToolCallSlot {\n name?: string\n arguments: string\n}\n\ninterface EventStreamLike {\n on(event: string, listener: (...args: unknown[]) => void): unknown\n readonly errored?: boolean\n readonly aborted?: boolean\n}\n\ninterface IteratorStreamLike {\n iterator: () => AsyncIterator<unknown>\n}\n\nconst responsesRecordedByAutoTrace = new WeakSet<object>()\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null\n}\n\nfunction field(value: unknown, name: string): unknown {\n return isRecord(value) ? value[name] : undefined\n}\n\nfunction numberField(value: unknown, name: string): number | undefined {\n const found = field(value, name)\n return typeof found === \"number\" && Number.isFinite(found) ? found : undefined\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value !== \"\" ? value : undefined\n}\n\nfunction presentFields(\n values: Record<string, unknown>,\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(values).filter(([, value]) => value !== undefined),\n )\n}\n\nfunction sumOfPresent(values: Array<number | undefined>): number | undefined {\n const present = values.filter((value) => value !== undefined)\n return present.length > 0\n ? present.reduce((total, value) => total + value, 0)\n : undefined\n}\n\nfunction textOf(content: unknown): string {\n return typeof content === \"string\" ? content : JSON.stringify(content)\n}\n\nfunction roleEntries(items: unknown[]): PromptEntry[] {\n return items.flatMap((item) => {\n const role = field(item, \"role\")\n if (typeof role !== \"string\") {\n return []\n }\n return [{ role, content: textOf(field(item, \"content\")) }]\n })\n}\n\nfunction isNil(value: unknown): value is null | undefined {\n return value === undefined || value === null\n}\n\nfunction isBlank(content: unknown): boolean {\n return (\n isNil(content) ||\n content === \"\" ||\n (Array.isArray(content) && content.length === 0)\n )\n}\n\nfunction systemEntry(content: unknown): PromptEntry[] {\n return isBlank(content) ? [] : [{ role: \"system\", content: textOf(content) }]\n}\n\nfunction userEntries(content: unknown): PromptEntry[] {\n if (isBlank(content)) {\n return []\n }\n if (\n Array.isArray(content) &&\n content.every((item) => typeof item === \"string\")\n ) {\n return content.map((item) => ({ role: \"user\", content: item }))\n }\n return [{ role: \"user\", content: textOf(content) }]\n}\n\nfunction renderedPrompt(entries: PromptEntry[]): string | undefined {\n return entries.length > 0 ? JSON.stringify(entries) : undefined\n}\n\nfunction modelOf(body: unknown, response: unknown): string | undefined {\n return (\n nonEmptyString(field(response, \"model\")) ??\n nonEmptyString(field(body, \"model\"))\n )\n}\n\nfunction lastMatching(\n items: unknown[],\n matches: (item: unknown) => boolean,\n): unknown {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n if (matches(items[index])) {\n return items[index]\n }\n }\n return undefined\n}\n\nfunction lastWith(events: unknown[], name: string): unknown {\n return lastMatching(events, (event) => !isNil(field(event, name)))\n}\n\nfunction clientOf(receiver: unknown): unknown {\n try {\n return field(receiver, \"_client\")\n } catch {\n return undefined\n }\n}\n\nfunction clientClassStatic(receiver: unknown, name: string): unknown {\n const client = clientOf(receiver)\n if (!isRecord(client)) {\n return undefined\n }\n try {\n const clientClass: unknown = client.constructor\n return typeof clientClass === \"function\"\n ? (clientClass as unknown as Record<string, unknown>)[name]\n : undefined\n } catch {\n return undefined\n }\n}\n\nfunction baseUrlHostIs(baseUrl: unknown, hostname: string): boolean {\n if (typeof baseUrl !== \"string\") {\n return false\n }\n try {\n const host = new URL(baseUrl).hostname\n return host === hostname || host.endsWith(`.${hostname}`)\n } catch {\n return false\n }\n}\n\nexport function isOpenRouterBaseUrl(baseUrl: unknown): boolean {\n return baseUrlHostIs(baseUrl, OPENROUTER_HOSTNAME)\n}\n\nexport function isAnthropicBaseUrl(baseUrl: unknown): boolean {\n return baseUrlHostIs(baseUrl, ANTHROPIC_HOSTNAME)\n}\n\nfunction isOpenRouterResource(receiver: unknown): boolean {\n try {\n return isOpenRouterBaseUrl(field(clientOf(receiver), \"baseURL\"))\n } catch {\n return false\n }\n}\n\nfunction isAnthropicResource(receiver: unknown): boolean {\n return (\n typeof clientClassStatic(receiver, \"AnthropicError\") === \"function\" ||\n typeof clientClassStatic(receiver, \"HUMAN_PROMPT\") === \"string\"\n )\n}\n\nfunction isOpenAIResource(receiver: unknown): boolean {\n return typeof clientClassStatic(receiver, \"OpenAI\") === \"function\"\n}\n\nfunction isGeminiModels(receiver: unknown): boolean {\n try {\n return (\n isRecord(receiver) &&\n isRecord(receiver.apiClient) &&\n typeof receiver.generateContent === \"function\" &&\n typeof receiver.generateContentStream === \"function\"\n )\n } catch {\n return false\n }\n}\n\nfunction isChatCompletion(response: unknown): boolean {\n return isRecord(response) && Array.isArray(response.choices)\n}\n\nfunction chatCompletionPrompt(body: unknown): string | undefined {\n const messages = field(body, \"messages\")\n return Array.isArray(messages)\n ? renderedPrompt(roleEntries(messages))\n : undefined\n}\n\nfunction chatCompletionUsage(\n body: unknown,\n response: unknown,\n): Record<string, unknown> {\n const usage = field(response, \"usage\")\n return {\n model: modelOf(body, response),\n upstreamProvider: nonEmptyString(field(response, \"provider\")),\n inputTokens: numberField(usage, \"prompt_tokens\"),\n outputTokens: numberField(usage, \"completion_tokens\"),\n cachedInputTokens: numberField(\n field(usage, \"prompt_tokens_details\"),\n \"cached_tokens\",\n ),\n reasoningTokens: numberField(\n field(usage, \"completion_tokens_details\"),\n \"reasoning_tokens\",\n ),\n costUsd: numberField(usage, \"cost\"),\n }\n}\n\nfunction chatToolCalls(chunks: unknown[]): unknown[] {\n const slots = new Map<number, ToolCallSlot>()\n for (const chunk of chunks) {\n const delta = field(firstChoice(chunk), \"delta\")\n const toolCalls = field(delta, \"tool_calls\")\n if (!Array.isArray(toolCalls)) {\n continue\n }\n for (const toolCall of toolCalls) {\n const index = numberField(toolCall, \"index\") ?? 0\n const slot = slots.get(index) ?? { arguments: \"\" }\n const fn = field(toolCall, \"function\")\n const name = nonEmptyString(field(fn, \"name\"))\n const args = nonEmptyString(field(fn, \"arguments\"))\n slots.set(index, {\n name: name ?? slot.name,\n arguments: slot.arguments + (args ?? \"\"),\n })\n }\n }\n return [...slots.entries()]\n .sort(([left], [right]) => left - right)\n .map(([, slot]) => ({\n type: \"function\",\n function: { name: slot.name, arguments: slot.arguments },\n }))\n}\n\nfunction firstChoice(chunk: unknown): unknown {\n const choices = field(chunk, \"choices\")\n return Array.isArray(choices) ? choices[0] : undefined\n}\n\nfunction chatStreamSummary(chunks: unknown[]): unknown {\n if (chunks.length === 0) {\n return undefined\n }\n const last = lastWith(chunks, \"usage\") ?? chunks[chunks.length - 1]\n const text = chunks\n .map((chunk) => field(field(firstChoice(chunk), \"delta\"), \"content\"))\n .filter((content): content is string => typeof content === \"string\")\n .join(\"\")\n const finishReason = lastMatching(\n chunks.map((chunk) => field(firstChoice(chunk), \"finish_reason\")),\n (reason) => typeof reason === \"string\",\n )\n const toolCalls = chatToolCalls(chunks)\n return {\n object: \"chat.completion\",\n model: field(last, \"model\"),\n provider: field(last, \"provider\"),\n choices: [\n {\n index: 0,\n message: {\n role: \"assistant\",\n content: text,\n ...(toolCalls.length > 0 && { tool_calls: toolCalls }),\n },\n finish_reason: finishReason ?? null,\n },\n ],\n usage: field(last, \"usage\"),\n }\n}\n\nfunction isEmbeddingList(response: unknown): boolean {\n return (\n field(response, \"object\") === \"list\" &&\n Array.isArray(field(response, \"data\"))\n )\n}\n\nfunction embeddingPrompt(body: unknown): string | undefined {\n return renderedPrompt(userEntries(field(body, \"input\")))\n}\n\nfunction embeddingUsage(\n body: unknown,\n response: unknown,\n): Record<string, unknown> {\n const usage = field(response, \"usage\")\n const inputTokens = numberField(usage, \"prompt_tokens\")\n return {\n model: modelOf(body, response),\n upstreamProvider: nonEmptyString(field(response, \"provider\")),\n inputTokens,\n outputTokens: inputTokens === undefined ? undefined : 0,\n costUsd: numberField(usage, \"cost\"),\n }\n}\n\nfunction isTranscription(response: unknown): boolean {\n return typeof field(response, \"text\") === \"string\"\n}\n\nfunction transcriptionPrompt(body: unknown): string | undefined {\n return renderedPrompt(userEntries(field(body, \"prompt\")))\n}\n\nfunction transcriptionUsage(\n body: unknown,\n response: unknown,\n): Record<string, unknown> {\n const usage = field(response, \"usage\")\n return {\n model: modelOf(body, response),\n inputTokens: numberField(usage, \"input_tokens\"),\n outputTokens: numberField(usage, \"output_tokens\"),\n audioSeconds: numberField(usage, \"seconds\"),\n }\n}\n\nfunction transcriptionStreamSummary(events: unknown[]): unknown {\n return lastMatching(\n events,\n (event) => field(event, \"type\") === TRANSCRIPT_DONE_EVENT,\n )\n}\n\nfunction isAnthropicMessage(response: unknown): boolean {\n return (\n field(response, \"type\") === \"message\" &&\n Array.isArray(field(response, \"content\"))\n )\n}\n\nfunction anthropicPrompt(body: unknown): string | undefined {\n const messages = field(body, \"messages\")\n return renderedPrompt([\n ...systemEntry(field(body, \"system\")),\n ...(Array.isArray(messages) ? roleEntries(messages) : []),\n ])\n}\n\nfunction anthropicUsage(\n body: unknown,\n response: unknown,\n): Record<string, unknown> {\n const usage = field(response, \"usage\")\n const cacheRead = numberField(usage, \"cache_read_input_tokens\")\n return {\n model: modelOf(body, response),\n inputTokens: sumOfPresent([\n numberField(usage, \"input_tokens\"),\n cacheRead,\n numberField(usage, \"cache_creation_input_tokens\"),\n ]),\n outputTokens: numberField(usage, \"output_tokens\"),\n cachedInputTokens: cacheRead,\n }\n}\n\nfunction anthropicStreamSummary(events: unknown[]): unknown {\n const message = field(\n events.find((event) => field(event, \"type\") === \"message_start\"),\n \"message\",\n )\n if (!isRecord(message)) {\n return undefined\n }\n let usage: Record<string, unknown> = {\n ...(isRecord(message.usage) ? message.usage : {}),\n }\n let stopReason: unknown = null\n const text: string[] = []\n for (const event of events) {\n const type = field(event, \"type\")\n if (type === \"message_delta\") {\n const deltaUsage = field(event, \"usage\")\n usage = {\n ...usage,\n ...(isRecord(deltaUsage) ? presentFields(deltaUsage) : {}),\n }\n stopReason = field(field(event, \"delta\"), \"stop_reason\") ?? stopReason\n }\n if (type === \"content_block_delta\") {\n const deltaText = field(field(event, \"delta\"), \"text\")\n if (typeof deltaText === \"string\") {\n text.push(deltaText)\n }\n }\n }\n return {\n type: \"message\",\n role: \"assistant\",\n model: message.model,\n content: [{ type: \"text\", text: text.join(\"\") }],\n stop_reason: stopReason,\n usage,\n }\n}\n\nfunction isOpenAIResponse(response: unknown): boolean {\n return field(response, \"object\") === \"response\"\n}\n\nfunction openAIResponsesPrompt(body: unknown): string | undefined {\n const input = field(body, \"input\")\n return renderedPrompt([\n ...systemEntry(field(body, \"instructions\")),\n ...(typeof input === \"string\" ? [{ role: \"user\", content: input }] : []),\n ...(Array.isArray(input) ? roleEntries(input) : []),\n ])\n}\n\nfunction openAIResponsesUsage(\n body: unknown,\n response: unknown,\n): Record<string, unknown> {\n const usage = field(response, \"usage\")\n return {\n model: modelOf(body, response),\n inputTokens: numberField(usage, \"input_tokens\"),\n outputTokens: numberField(usage, \"output_tokens\"),\n cachedInputTokens: numberField(\n field(usage, \"input_tokens_details\"),\n \"cached_tokens\",\n ),\n reasoningTokens: numberField(\n field(usage, \"output_tokens_details\"),\n \"reasoning_tokens\",\n ),\n costUsd: numberField(usage, \"cost\"),\n }\n}\n\nfunction openAIResponsesStreamSummary(events: unknown[]): unknown {\n return field(\n lastMatching(events, (event) =>\n RESPONSE_DONE_EVENTS.some((type) => field(event, \"type\") === type),\n ),\n \"response\",\n )\n}\n\nfunction isGeminiResponse(response: unknown): boolean {\n return (\n field(response, \"usageMetadata\") !== undefined ||\n Array.isArray(field(response, \"candidates\"))\n )\n}\n\nfunction geminiContentText(content: unknown): string | undefined {\n if (isNil(content)) {\n return undefined\n }\n if (typeof content === \"string\") {\n return content\n }\n const parts = field(content, \"parts\")\n if (Array.isArray(parts)) {\n const texts = parts.map((part) => field(part, \"text\"))\n if (texts.every((text) => typeof text === \"string\")) {\n return texts.join(\"\")\n }\n }\n const text = field(content, \"text\")\n return typeof text === \"string\" ? text : textOf(content)\n}\n\nfunction geminiEntries(contents: unknown): PromptEntry[] {\n if (isNil(contents)) {\n return []\n }\n const items = Array.isArray(contents) ? contents : [contents]\n return items.map((item) => ({\n role: nonEmptyString(field(item, \"role\")) ?? \"user\",\n content: geminiContentText(item) ?? \"\",\n }))\n}\n\nfunction geminiPrompt(body: unknown): string | undefined {\n return renderedPrompt([\n ...systemEntry(\n geminiContentText(field(field(body, \"config\"), \"systemInstruction\")),\n ),\n ...geminiEntries(field(body, \"contents\")),\n ])\n}\n\nfunction geminiModel(body: unknown, response: unknown): string | undefined {\n const model =\n nonEmptyString(field(response, \"modelVersion\")) ??\n nonEmptyString(field(body, \"model\"))\n return model === undefined\n ? undefined\n : model.slice(model.lastIndexOf(\"/\") + 1)\n}\n\nfunction geminiUsage(\n body: unknown,\n response: unknown,\n): Record<string, unknown> {\n const usage = field(response, \"usageMetadata\")\n const thoughts = numberField(usage, \"thoughtsTokenCount\")\n return {\n model: geminiModel(body, response),\n inputTokens: sumOfPresent([\n numberField(usage, \"promptTokenCount\"),\n numberField(usage, \"toolUsePromptTokenCount\"),\n ]),\n outputTokens: sumOfPresent([\n numberField(usage, \"candidatesTokenCount\"),\n thoughts,\n ]),\n cachedInputTokens: numberField(usage, \"cachedContentTokenCount\"),\n reasoningTokens: thoughts,\n }\n}\n\nfunction isGeminiEmbeddingResponse(response: unknown): boolean {\n return Array.isArray(field(response, \"embeddings\"))\n}\n\nfunction geminiEmbeddingPrompt(body: unknown): string | undefined {\n return renderedPrompt(geminiEntries(field(body, \"contents\")))\n}\n\nfunction geminiEmbeddingUsage(\n body: unknown,\n response: unknown,\n): Record<string, unknown> {\n const embeddings = field(response, \"embeddings\")\n const inputTokens = sumOfPresent(\n (Array.isArray(embeddings) ? embeddings : []).map((embedding) =>\n numberField(field(embedding, \"statistics\"), \"tokenCount\"),\n ),\n )\n return {\n model: geminiModel(body, response),\n inputTokens,\n outputTokens: inputTokens === undefined ? undefined : 0,\n }\n}\n\nfunction geminiChunkText(chunk: unknown): string {\n const candidates = field(chunk, \"candidates\")\n return Array.isArray(candidates)\n ? (geminiContentText(field(candidates[0], \"content\")) ?? \"\")\n : \"\"\n}\n\nfunction geminiStreamSummary(chunks: unknown[]): unknown {\n if (chunks.length === 0) {\n return undefined\n }\n const last = lastWith(chunks, \"usageMetadata\") ?? chunks[chunks.length - 1]\n return {\n modelVersion: field(last, \"modelVersion\"),\n text: chunks.map(geminiChunkText).join(\"\"),\n usageMetadata: field(last, \"usageMetadata\"),\n }\n}\n\nexport const OPENROUTER: ClientCallProvider = {\n key: \"openrouter\",\n provider: \"openrouter\",\n library: \"openai\",\n endpoint: \"chat.completions\",\n methods: [\"create\", \"parse\"],\n streamMethods: [\"stream\"],\n streamEvents: [\"chunk\"],\n spanMethods: { stream: \"create\" },\n matchesReceiver: isOpenRouterResource,\n isResponse: isChatCompletion,\n prompt: chatCompletionPrompt,\n usage: chatCompletionUsage,\n streamSummary: chatStreamSummary,\n}\n\nexport const OPENAI_CHAT: ClientCallProvider = {\n ...OPENROUTER,\n key: \"openai-chat\",\n provider: \"openai\",\n matchesReceiver: isOpenAIResource,\n}\n\nconst OPENROUTER_EMBEDDINGS: ClientCallProvider = {\n key: \"openrouter-embeddings\",\n provider: \"openrouter\",\n library: \"openai\",\n endpoint: \"embeddings\",\n methods: [\"create\"],\n streamMethods: [],\n streamEvents: [],\n matchesReceiver: isOpenRouterResource,\n isResponse: isEmbeddingList,\n prompt: embeddingPrompt,\n usage: embeddingUsage,\n}\n\nexport const OPENAI_EMBEDDINGS: ClientCallProvider = {\n ...OPENROUTER_EMBEDDINGS,\n key: \"openai-embeddings\",\n provider: \"openai\",\n matchesReceiver: isOpenAIResource,\n}\n\nexport const OPENAI_TRANSCRIPTIONS: ClientCallProvider = {\n key: \"openai-transcriptions\",\n provider: \"openai\",\n library: \"openai\",\n endpoint: \"audio.transcriptions\",\n methods: [\"create\"],\n streamMethods: [],\n streamEvents: [],\n matchesReceiver: isOpenAIResource,\n isResponse: isTranscription,\n prompt: transcriptionPrompt,\n usage: transcriptionUsage,\n streamSummary: transcriptionStreamSummary,\n}\n\nexport const ANTHROPIC: ClientCallProvider = {\n key: \"anthropic\",\n provider: \"anthropic\",\n library: \"@anthropic-ai/sdk\",\n endpoint: \"messages\",\n methods: [\"create\", \"parse\"],\n streamMethods: [\"stream\"],\n streamEvents: [\"streamEvent\"],\n matchesReceiver: isAnthropicResource,\n isResponse: isAnthropicMessage,\n prompt: anthropicPrompt,\n usage: anthropicUsage,\n streamSummary: anthropicStreamSummary,\n}\n\nexport const OPENAI_RESPONSES: ClientCallProvider = {\n key: \"openai-responses\",\n provider: \"openai\",\n library: \"openai\",\n endpoint: \"responses\",\n methods: [\"create\", \"parse\"],\n streamMethods: [\"stream\"],\n streamEvents: RESPONSE_DONE_EVENTS,\n spanMethods: { stream: \"create\" },\n matchesReceiver: isOpenAIResource,\n isResponse: isOpenAIResponse,\n prompt: openAIResponsesPrompt,\n usage: openAIResponsesUsage,\n streamSummary: openAIResponsesStreamSummary,\n}\n\nexport const GEMINI: ClientCallProvider = {\n key: \"gemini\",\n provider: \"gemini\",\n library: \"@google/genai\",\n endpoint: \"models\",\n methods: [\"generateContent\"],\n streamMethods: [\"generateContentStream\"],\n streamEvents: [],\n matchesReceiver: isGeminiModels,\n isResponse: isGeminiResponse,\n prompt: geminiPrompt,\n usage: geminiUsage,\n streamSummary: geminiStreamSummary,\n}\n\nexport const GEMINI_EMBEDDINGS: ClientCallProvider = {\n key: \"gemini-embeddings\",\n provider: \"gemini\",\n library: \"@google/genai\",\n endpoint: \"models\",\n methods: [\"embedContent\"],\n streamMethods: [],\n streamEvents: [],\n matchesReceiver: isGeminiModels,\n isResponse: isGeminiEmbeddingResponse,\n prompt: geminiEmbeddingPrompt,\n usage: geminiEmbeddingUsage,\n}\n\nconst CLIENT_CALL_PROVIDERS: readonly ClientCallProvider[] = [\n OPENROUTER,\n OPENAI_CHAT,\n OPENROUTER_EMBEDDINGS,\n OPENAI_EMBEDDINGS,\n OPENAI_TRANSCRIPTIONS,\n ANTHROPIC,\n OPENAI_RESPONSES,\n GEMINI,\n GEMINI_EMBEDDINGS,\n]\n\nconst CLIENT_CALL_PROVIDERS_BY_KEY = new Map(\n CLIENT_CALL_PROVIDERS.map((provider) => [provider.key, provider]),\n)\n\nconst ANTHROPIC_CACHE_USAGE_KEYS = [\n \"cache_read_input_tokens\",\n \"cache_creation_input_tokens\",\n]\nconst CHAT_COMPLETION_USAGE_KEYS = [\"prompt_tokens\", \"completion_tokens\"]\n\nexport function clientCallProviderForUsage(\n usage: Record<string, unknown>,\n): ClientCallProvider {\n if (ANTHROPIC_CACHE_USAGE_KEYS.some((key) => key in usage)) {\n return ANTHROPIC\n }\n return CHAT_COMPLETION_USAGE_KEYS.some((key) => key in usage)\n ? OPENAI_CHAT\n : OPENAI_RESPONSES\n}\n\nexport function clientCallProvider(\n key: string | undefined,\n): ClientCallProvider | undefined {\n return key === undefined ? undefined : CLIENT_CALL_PROVIDERS_BY_KEY.get(key)\n}\n\nexport function providerForClientCall(\n endpoint: string,\n method: string,\n receiver: unknown,\n): ClientCallProvider | undefined {\n return CLIENT_CALL_PROVIDERS.find(\n (provider) =>\n provider.endpoint === endpoint &&\n (provider.methods.includes(method) ||\n provider.streamMethods.includes(method)) &&\n provider.matchesReceiver(receiver),\n )\n}\n\nexport function clientCallStreams(\n provider: ClientCallProvider,\n method: string,\n body: unknown,\n): boolean {\n return (\n provider.streamMethods.includes(method) || field(body, \"stream\") === true\n )\n}\n\nexport function clientCallContext(\n provider: ClientCallProvider,\n body: unknown,\n response: unknown,\n durationMs: number,\n): Record<string, unknown> {\n return {\n provider: provider.provider,\n ...presentFields(provider.usage(body, response)),\n durationMs,\n }\n}\n\nfunction recordClientCall(\n provider: ClientCallProvider,\n span: ClientCallSpan,\n body: unknown,\n response: unknown,\n durationMs: number,\n): void {\n try {\n const prompt = provider.prompt(body)\n if (prompt !== undefined) {\n span.setPrompt(prompt)\n }\n span.addContext(clientCallContext(provider, body, response, durationMs))\n } catch {}\n}\n\nlet clientCallWatchStorage: AsyncLocalStorageLike<ClientCallWatch> | null = null\n\nfunction watchStorage(): AsyncLocalStorageLike<ClientCallWatch> | null {\n if (clientCallWatchStorage) {\n return clientCallWatchStorage\n }\n const shared = globalThis as typeof globalThis & Record<symbol, unknown>\n const existing = shared[CLIENT_CALL_WATCH_STORAGE_SYMBOL] as\n | AsyncLocalStorageLike<ClientCallWatch>\n | undefined\n clientCallWatchStorage =\n existing ?? createAsyncLocalStorage<ClientCallWatch>()\n if (clientCallWatchStorage && !existing) {\n shared[CLIENT_CALL_WATCH_STORAGE_SYMBOL] = clientCallWatchStorage\n }\n return clientCallWatchStorage\n}\n\nexport function watchClientCall<T>(fn: () => T): {\n watch: ClientCallWatch\n result: T\n} {\n const storage = watchStorage()\n const watch: ClientCallWatch = {\n recorded: false,\n parent: storage?.getStore() ?? null,\n }\n const result = storage ? storage.run(watch, fn) : fn()\n return { watch, result }\n}\n\nfunction markEnclosingWatches(watch: ClientCallWatch): void {\n for (let current = watch.parent; current; current = current.parent) {\n current.recorded = true\n }\n}\n\nfunction markCurrentWatches(): void {\n markEnclosingWatches({\n recorded: true,\n parent: watchStorage()?.getStore() ?? null,\n })\n}\n\nexport function frameworkRecordsClientCall(): boolean {\n return langChainHandlerRecordsCall() || openAiAgentsModelCallOpen()\n}\n\nfunction isRecordedByAutoTrace(response: unknown): boolean {\n return isRecord(response) && responsesRecordedByAutoTrace.has(response)\n}\n\nexport function recordWatchedClientCall(\n provider: ClientCallProvider,\n span: ClientCallSpan,\n watch: ClientCallWatch,\n body: unknown,\n response: unknown,\n durationMs: number,\n): void {\n if (watch.recorded || isRecordedByAutoTrace(response)) {\n markEnclosingWatches(watch)\n return\n }\n if (!provider.isResponse(response)) {\n return\n }\n recordClientCall(provider, span, body, response, durationMs)\n responsesRecordedByAutoTrace.add(response as object)\n markEnclosingWatches(watch)\n}\n\nexport function recordAutoTracedClientCall<T>(\n provider: ClientCallProvider,\n invokeFn: () => T,\n body: unknown,\n span: ClientCallSpan,\n): T {\n const startedAt = Date.now()\n const { watch, result } = watchClientCall(invokeFn)\n const settle = (response: unknown): void => {\n recordWatchedClientCall(\n provider,\n span,\n watch,\n body,\n response,\n Date.now() - startedAt,\n )\n }\n if (result instanceof Promise) {\n return result.then((response) => {\n settle(response)\n return response\n }) as T\n }\n settle(result)\n return result\n}\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return isRecord(value) && typeof value.then === \"function\"\n}\n\nfunction isIteratorStream(value: unknown): value is IteratorStreamLike {\n return isRecord(value) && typeof value.iterator === \"function\"\n}\n\nfunction isEventStream(value: unknown): value is EventStreamLike {\n return isRecord(value) && typeof value.on === \"function\"\n}\n\nfunction isAsyncIterator(value: unknown): value is AsyncIterator<unknown> {\n return isRecord(value) && typeof value.next === \"function\"\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nconst streamRecordingsByCall = new WeakMap<object, ClientCallStreamRecording>()\nconst droppedStreams =\n typeof FinalizationRegistry === \"function\"\n ? new FinalizationRegistry<ClientCallStreamRecording>((recording) =>\n recording.finish(undefined),\n )\n : undefined\n\nexport function sharedClientCallStreamRecording(\n call: object,\n provider: ClientCallProvider,\n body: unknown,\n): ClientCallStreamRecording {\n let recording = streamRecordingsByCall.get(call)\n if (recording === undefined) {\n recording = new ClientCallStreamRecording(provider, body)\n streamRecordingsByCall.set(call, recording)\n }\n return recording\n}\n\nexport class ClientCallStreamRecording {\n readonly done: Promise<unknown>\n private readonly events: unknown[] = []\n private readonly startedAt = Date.now()\n private finished = false\n private observing = false\n private span: ClientCallSpan | undefined\n private resolveDone: (summary: unknown) => void = () => {}\n private rejectDone: (error: unknown) => void = () => {}\n\n constructor(\n private readonly provider: ClientCallProvider,\n private readonly body: unknown,\n ) {\n this.done = new Promise((resolve, reject) => {\n this.resolveDone = resolve\n this.rejectDone = reject\n })\n this.done.catch(() => {})\n }\n\n start<T>(span: ClientCallSpan, invokeFn: () => T): T {\n this.span ??= span\n markCurrentWatches()\n let result: T\n try {\n result = invokeFn()\n } catch (error) {\n this.finish(error)\n throw error\n }\n if (this.observing) {\n return result\n }\n this.observing = true\n if (isThenable(result)) {\n result.then(\n (stream) => this.observe(stream),\n (error: unknown) => this.finish(error),\n )\n } else {\n this.observe(result)\n }\n return result\n }\n\n private observe(stream: unknown): void {\n if (isRecord(stream)) {\n droppedStreams?.register(stream, this)\n }\n try {\n if (isIteratorStream(stream)) {\n const iterator = stream.iterator\n stream.iterator = () => this.observed(iterator.call(stream))\n return\n }\n if (isEventStream(stream)) {\n for (const name of this.provider.streamEvents) {\n stream.on(name, (event: unknown) => {\n this.events.push(event)\n })\n }\n stream.on(STREAM_END_EVENT, () => {\n this.finish(\n stream.errored === true && stream.aborted !== true\n ? new Error(\"The stream failed\")\n : undefined,\n )\n })\n return\n }\n if (isAsyncIterator(stream)) {\n const observed = this.observed({\n next: stream.next.bind(stream),\n return: stream.return?.bind(stream),\n throw: stream.throw?.bind(stream),\n })\n stream.next = observed.next\n stream.return = observed.return\n stream.throw = observed.throw\n return\n }\n } catch {}\n this.finish(undefined)\n }\n\n private observed(\n iterator: AsyncIterator<unknown>,\n ): AsyncIterator<unknown> & AsyncIterable<unknown> {\n const next = async (...args: [] | [unknown]) => {\n try {\n const result = await iterator.next(...args)\n if (result.done === true) {\n this.finish(undefined)\n } else {\n this.events.push(result.value)\n }\n return result\n } catch (error) {\n this.finish(error)\n throw error\n }\n }\n const end = async (value?: unknown) => {\n try {\n return iterator.return === undefined\n ? { done: true as const, value }\n : await iterator.return(value)\n } finally {\n this.finish(undefined)\n }\n }\n const fail = async (error?: unknown) => {\n try {\n if (iterator.throw === undefined) {\n throw error\n }\n return await iterator.throw(error)\n } catch (raised) {\n this.finish(raised)\n throw raised\n }\n }\n const observed = {\n next,\n return: end,\n throw: fail,\n [Symbol.asyncIterator]: () => observed,\n }\n return observed\n }\n\n finish(error: unknown): void {\n if (this.finished) {\n return\n }\n this.finished = true\n let summary: unknown\n try {\n summary =\n this.events.length === 0\n ? undefined\n : this.provider.streamSummary?.(this.events)\n const prompt = this.provider.prompt(this.body)\n if (prompt !== undefined) {\n this.span?.setPrompt(prompt)\n }\n if (!isNil(summary)) {\n this.span?.addContext(\n clientCallContext(\n this.provider,\n this.body,\n summary,\n Date.now() - this.startedAt,\n ),\n )\n }\n } catch {}\n if (error === undefined) {\n this.resolveDone(summary)\n } else {\n this.rejectDone(new StreamFinalizationError(errorText(error), summary))\n }\n }\n}\n","import {\n type AsyncLocalStorageLike,\n createAsyncLocalStorage,\n} from \"./asyncStorage.js\"\nimport { isCaptureSuppressed } from \"./captureSuppression.js\"\nimport {\n type ClientCallProvider,\n clientCallStreams,\n frameworkRecordsClientCall,\n providerForClientCall,\n} from \"./clientCalls.js\"\nimport { warnOnce } from \"./warnOnce.js\"\n\nexport interface AutoTraceFunctionDefinition {\n id: string\n name: string\n file: string\n line: number\n column: number\n async?: boolean\n wrapper?: boolean\n baml?: boolean\n jev?: boolean\n clientCall?: string\n clientCallMethod?: string\n}\n\nexport interface AutoTraceNodeConfiguration {\n functionName: string\n name?: string\n type?: \"llm\" | \"agent\" | \"function\" | \"guardrail\" | \"handoff\" | \"custom\"\n defaultType?: boolean\n capture: boolean\n experimentId?: string\n /** @deprecated Use experimentId. */\n testRunId?: string\n mockOnReplay?: boolean\n replayReusable?: boolean\n // biome-ignore lint/suspicious/noExplicitAny: node finalizers receive the configured function's result, whose type is owned by the caller\n finalize?: (result: any) => unknown | Promise<unknown>\n}\n\nexport interface NestedTraceLink {\n traceFunctionKey: string\n traceId?: string\n rootSpanId?: string\n}\n\nexport interface SpanDetails {\n contexts: Record<string, unknown>[]\n prompt?: string\n}\n\nexport interface AutoTraceEntry {\n context: AutoTraceContext\n depth: number\n spanStack: unknown\n}\n\nexport interface AutoTraceContext {\n readonly traceFunctionKey: string\n invoke<T>(\n definition: AutoTraceFunctionDefinition,\n inputs: unknown[],\n fn: () => T,\n entry: AutoTraceEntry,\n spanDetails: SpanDetails,\n nodeConfiguration?: AutoTraceNodeConfiguration,\n ): T\n invokeNestedRoot<T>(\n name: string,\n functionName: string,\n inputs: unknown[],\n fn: () => T,\n entry: AutoTraceEntry,\n link: NestedTraceLink | undefined,\n spanDetails: SpanDetails,\n ): T\n}\n\ninterface AutoTraceRootFunction {\n name: string\n entering: boolean\n}\n\ninterface AutoTraceScope {\n entries: readonly AutoTraceEntry[]\n nodeConfiguration?: AutoTraceNodeConfiguration\n rootFunction?: AutoTraceRootFunction\n}\n\ninterface AutoTraceState {\n storage: AsyncLocalStorageLike<AutoTraceScope> | null\n browserScope: AutoTraceScope | undefined\n // Older SDK copies read this field when sharing the process-wide V4 state.\n capturePolicies: WeakMap<object, Map<string, ReadonlySet<string>>>\n activeRoots: number\n}\n\ninterface AutoTraceGlobal {\n __bitfabAutoTraceStateV4?: AutoTraceState\n __bitfab_auto_trace_transformed_v1__?: boolean\n}\n\ninterface AutoTraceAsyncGenerator {\n next(value?: unknown): Promise<IteratorResult<unknown, unknown>>\n return(value?: unknown): Promise<IteratorResult<unknown, unknown>>\n throw(error?: unknown): Promise<IteratorResult<unknown, unknown>>\n [Symbol.asyncIterator](): AutoTraceAsyncGenerator\n}\n\nconst autoTraceGlobal = globalThis as unknown as AutoTraceGlobal\nconst autoTraceState: AutoTraceState =\n autoTraceGlobal.__bitfabAutoTraceStateV4 ?? {\n storage: null,\n browserScope: undefined,\n capturePolicies: new WeakMap(),\n activeRoots: 0,\n }\nautoTraceGlobal.__bitfabAutoTraceStateV4 = autoTraceState\n\nfunction initializeAutoTraceStorage(): void {\n autoTraceState.storage ??= createAsyncLocalStorage<AutoTraceScope>()\n}\n\nfunction runWithAutoTraceScope<T>(scope: AutoTraceScope, fn: () => T): T {\n initializeAutoTraceStorage()\n if (autoTraceState.storage) {\n return autoTraceState.storage.run(scope, fn)\n }\n\n const previous = autoTraceState.browserScope\n autoTraceState.browserScope = scope\n try {\n return fn()\n } finally {\n autoTraceState.browserScope = previous\n }\n}\n\nexport function currentAutoTraceEntries(): readonly AutoTraceEntry[] {\n return currentAutoTraceScope()?.entries ?? []\n}\n\nfunction replaceEntry(\n entries: readonly AutoTraceEntry[],\n previous: AutoTraceEntry,\n updated: AutoTraceEntry,\n): readonly AutoTraceEntry[] {\n return entries.map((entry) => (entry === previous ? updated : entry))\n}\n\nexport function runWithAutoTraceEntry<T>(\n previous: AutoTraceEntry,\n updated: AutoTraceEntry,\n fn: () => T,\n): T {\n const result = runWithAutoTraceScope(\n { entries: replaceEntry(currentAutoTraceEntries(), previous, updated) },\n fn,\n )\n if (isAutoTraceAsyncGenerator(result)) {\n return wrapAutoTraceEntryAsyncGenerator(previous, updated, result) as T\n }\n return result\n}\n\nfunction wrapAutoTraceEntryAsyncGenerator(\n previous: AutoTraceEntry,\n updated: AutoTraceEntry,\n source: AutoTraceAsyncGenerator,\n): AutoTraceAsyncGenerator {\n const step = (\n method: \"next\" | \"return\" | \"throw\",\n value?: unknown,\n ): Promise<IteratorResult<unknown, unknown>> =>\n runWithAutoTraceScope(\n { entries: replaceEntry(currentAutoTraceEntries(), previous, updated) },\n () => source[method](value),\n )\n const wrapped: AutoTraceAsyncGenerator = {\n next: (value) => step(\"next\", value),\n return: (value) => step(\"return\", value),\n throw: (error) => step(\"throw\", error),\n [Symbol.asyncIterator]: () => wrapped,\n }\n return wrapped\n}\n\nexport function clearAutoTraceNodeConfiguration<T>(fn: () => T): T {\n return runWithAutoTraceScope({ entries: currentAutoTraceEntries() }, fn)\n}\n\nexport function runWithAutoTraceNodeConfiguration<T>(\n nodeConfiguration: AutoTraceNodeConfiguration,\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope || scope.entries.length === 0) {\n return fn()\n }\n\n const result = runWithAutoTraceScope({ ...scope, nodeConfiguration }, fn)\n if (isAutoTraceAsyncGenerator(result)) {\n return wrapAutoTraceNodeAsyncGenerator(nodeConfiguration, result) as T\n }\n return result\n}\n\n/**\n * Run `fn` with every active auto-trace frame re-based onto `spanStack`, so a\n * call the build transform discovers inside a framework integration's span\n * attaches under that span rather than under the nearest discovered call.\n * @internal\n */\nexport function runWithAutoTraceFramesAt<T>(\n spanStack: unknown,\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope || scope.entries.length === 0) {\n return fn()\n }\n return runWithAutoTraceScope(\n {\n ...scope,\n entries: scope.entries.map((entry) => ({ ...entry, spanStack })),\n },\n fn,\n )\n}\n\nexport function runAsAutoTraceRootFunction<T>(\n functionName: string,\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope || scope.entries.length === 0 || functionName === \"\") {\n return fn()\n }\n const rootFunction: AutoTraceRootFunction = {\n name: functionName,\n entering: true,\n }\n try {\n return runWithAutoTraceScope({ ...scope, rootFunction }, fn)\n } finally {\n rootFunction.entering = false\n }\n}\n\nfunction isRootFunctionEntry(\n scope: AutoTraceScope,\n simpleName: string | undefined,\n): boolean {\n const rootFunction = scope.rootFunction\n if (rootFunction === undefined || !rootFunction.entering) {\n return false\n }\n rootFunction.entering = false\n return rootFunction.name === simpleName\n}\n\nconst SUBTREE_TRACING_DOCS_URL =\n \"https://docs.bitfab.ai/typescript-sdk#experimental-subtree-tracing\"\n\nfunction noteTransformedModule(): void {\n autoTraceGlobal.__bitfab_auto_trace_transformed_v1__ = true\n}\n\nfunction transformInstalled(): boolean {\n return autoTraceGlobal.__bitfab_auto_trace_transformed_v1__ === true\n}\n\nfunction runsOnNode(): boolean {\n return typeof process !== \"undefined\" && Boolean(process.versions?.node)\n}\n\nfunction closeAutoTraceRoot(): void {\n autoTraceState.activeRoots -= 1\n}\n\nfunction settleAutoTraceRoot(context: AutoTraceContext): void {\n closeAutoTraceRoot()\n if (transformInstalled() || !runsOnNode()) {\n return\n }\n warnOnce(\n \"auto-trace-transform-missing\",\n `trace root \"${context.traceFunctionKey}\" recorded only its own span. ` +\n \"No module in this build was compiled by @bitfab/sdk/transform, so calls \" +\n \"beneath the root were not discovered. Add the SDK's transform adapter \" +\n `to the server build: ${SUBTREE_TRACING_DOCS_URL}`,\n )\n}\n\nconst heldRootWork = new WeakMap<AutoTraceContext, Promise<unknown>[]>()\n\nexport function runWithAutoTraceRootContext<T>(\n context: AutoTraceContext,\n spanStack: unknown,\n fn: () => T,\n): T {\n autoTraceState.activeRoots += 1\n const entries = [\n ...currentAutoTraceEntries(),\n { context, depth: 0, spanStack },\n ]\n const held: Promise<unknown>[] = []\n heldRootWork.set(context, held)\n let result: T\n try {\n result = runWithAutoTraceScope({ entries }, fn)\n } catch (error) {\n heldRootWork.delete(context)\n settleAutoTraceRoot(context)\n throw error\n }\n\n if (isAutoTraceAsyncGenerator(result)) {\n heldRootWork.delete(context)\n closeAutoTraceRoot()\n return wrapAutoTraceAsyncGenerator(context, spanStack, result) as T\n }\n\n if (result instanceof Promise) {\n return result.then(\n (value) => finishAfterHeldWork(context, held, () => value),\n (error) =>\n finishAfterHeldWork(context, held, () => {\n throw error\n }),\n ) as T\n }\n\n heldRootWork.delete(context)\n settleAutoTraceRoot(context)\n return result\n}\n\nfunction finishAfterHeldWork<T>(\n context: AutoTraceContext,\n held: Promise<unknown>[],\n finish: () => T,\n): T | Promise<T> {\n const pending = held.splice(0)\n if (pending.length === 0) {\n heldRootWork.delete(context)\n settleAutoTraceRoot(context)\n return finish()\n }\n return Promise.all(pending).then(() =>\n finishAfterHeldWork(context, held, finish),\n )\n}\n\nfunction holdAutoTraceRoots(work: Promise<unknown>): void {\n const settled = work.then(\n () => undefined,\n () => undefined,\n )\n for (const entry of currentAutoTraceEntries()) {\n heldRootWork.get(entry.context)?.push(settled)\n }\n}\n\nexport function invokeThroughAutoTraceEntries<T>(\n entries: readonly AutoTraceEntry[],\n step: (entry: AutoTraceEntry, next: () => T) => T,\n fn: () => T,\n): T {\n let run = fn\n for (let index = entries.length - 1; index >= 0; index -= 1) {\n const entry = entries[index] as AutoTraceEntry\n const next = run\n run = () => step(entry, next)\n }\n return run()\n}\n\nfunction isAutoTraceAsyncGenerator(\n value: unknown,\n): value is AutoTraceAsyncGenerator {\n if (value === null || typeof value !== \"object\") {\n return false\n }\n const candidate = value as Record<PropertyKey, unknown>\n return (\n typeof candidate.next === \"function\" &&\n typeof candidate.return === \"function\" &&\n typeof candidate.throw === \"function\" &&\n typeof candidate[Symbol.asyncIterator] === \"function\"\n )\n}\n\nfunction wrapAutoTraceAsyncGenerator(\n context: AutoTraceContext,\n spanStack: unknown,\n source: AutoTraceAsyncGenerator,\n): AutoTraceAsyncGenerator {\n const step = (\n method: \"next\" | \"return\" | \"throw\",\n value?: unknown,\n ): Promise<IteratorResult<unknown, unknown>> =>\n runWithAutoTraceRootContext(context, spanStack, () => source[method](value))\n const wrapped: AutoTraceAsyncGenerator = {\n next: (value) => step(\"next\", value),\n return: (value) => step(\"return\", value),\n throw: (error) => step(\"throw\", error),\n [Symbol.asyncIterator]: () => wrapped,\n }\n return wrapped\n}\n\nfunction wrapAutoTraceNodeAsyncGenerator(\n nodeConfiguration: AutoTraceNodeConfiguration,\n source: AutoTraceAsyncGenerator,\n): AutoTraceAsyncGenerator {\n const step = (\n method: \"next\" | \"return\" | \"throw\",\n value?: unknown,\n ): Promise<IteratorResult<unknown, unknown>> =>\n runWithAutoTraceNodeConfiguration(nodeConfiguration, () =>\n source[method](value),\n )\n const wrapped: AutoTraceAsyncGenerator = {\n next: (value) => step(\"next\", value),\n return: (value) => step(\"return\", value),\n throw: (error) => step(\"throw\", error),\n [Symbol.asyncIterator]: () => wrapped,\n }\n return wrapped\n}\n\nfunction shareFinalize(\n configuration: AutoTraceNodeConfiguration,\n): AutoTraceNodeConfiguration {\n const finalize = configuration.finalize\n if (finalize === undefined) {\n return configuration\n }\n let settled: Promise<unknown> | undefined\n return {\n ...configuration,\n finalize: (result: unknown) => {\n settled ??= Promise.resolve().then(() => finalize(result))\n return settled\n },\n }\n}\n\nexport function __bitfabAutoSpan<T>(\n definition: AutoTraceFunctionDefinition,\n inputs: unknown[],\n fn: () => T,\n): T {\n noteTransformedModule()\n return invokeAsDiscoveredCall(definition, inputs, fn)\n}\n\n/**\n * Record a call the build transform did not wrap as a function, such as a\n * rewritten call site, as if the transform had discovered it. It is internal\n * runtime protocol, not a supported application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function invokeAsDiscoveredCall<T>(\n definition: AutoTraceFunctionDefinition,\n inputs: unknown[],\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope || scope.entries.length === 0 || isCaptureSuppressed()) {\n return fn()\n }\n const nameParts = definition.name.split(\".\")\n const simpleName = nameParts[nameParts.length - 1]\n if (isRootFunctionEntry(scope, simpleName)) {\n return fn()\n }\n const nodeConfiguration =\n simpleName === scope.nodeConfiguration?.functionName\n ? shareFinalize(scope.nodeConfiguration)\n : undefined\n const spanDetails: SpanDetails = { contexts: [] }\n return invokeThroughAutoTraceEntries(\n scope.entries,\n (entry, next) =>\n entry.context.invoke(\n definition,\n inputs,\n next,\n entry,\n spanDetails,\n nodeConfiguration,\n ),\n fn,\n )\n}\n\nconst JEV_METHOD = \"systemOne\"\n\nconst jevDefinitions = new Map<string, AutoTraceFunctionDefinition>()\n\ntype JevReceiver = Record<typeof JEV_METHOD, (...args: unknown[]) => unknown>\n\ntype RecordedCallOutcome = { value: unknown } | { error: unknown }\n\nfunction receiverClassName(receiver: unknown): string | undefined {\n try {\n const name = (receiver as { constructor?: { name?: unknown } }).constructor\n ?.name\n return typeof name === \"string\" && name !== \"\" && name !== \"Object\"\n ? name\n : undefined\n } catch {\n return undefined\n }\n}\n\nfunction invokeRecordedClientCall(\n definition: AutoTraceFunctionDefinition,\n args: unknown[],\n call: () => unknown,\n): unknown {\n let outcome: RecordedCallOutcome | undefined\n const traced = invokeAsDiscoveredCall(definition, args, () => {\n try {\n const value = call()\n outcome = { value }\n return value\n } catch (error) {\n outcome = { error }\n throw error\n }\n })\n const settled = outcome\n outcome = undefined\n if (settled === undefined) {\n return traced\n }\n if (\"value\" in settled && traced === settled.value) {\n return traced\n }\n if (traced instanceof Promise) {\n holdAutoTraceRoots(traced)\n }\n if (\"error\" in settled) {\n throw settled.error\n }\n return settled.value\n}\n\nfunction jevDefinition(receiver: unknown): AutoTraceFunctionDefinition {\n const className = receiverClassName(receiver)\n const name =\n className === undefined ? JEV_METHOD : `${className}.${JEV_METHOD}`\n let definition = jevDefinitions.get(name)\n if (definition === undefined) {\n definition = {\n id: `ts-auto-v1:jev#${name}`,\n name,\n file: \"@typesafe-ai/sdk\",\n line: 0,\n column: 0,\n async: true,\n jev: true,\n }\n jevDefinitions.set(name, definition)\n }\n return definition\n}\n\n/**\n * Call `receiver.systemOne(...args)` from a call site rewritten by the build\n * transform. Beneath an automatic trace root the call is recorded as one `llm`\n * span with Jev's model and token usage, and the client's own returned value\n * is handed back unchanged. Outside a root it is a plain method call.\n *\n * This helper is internal transform/runtime protocol, not a supported\n * application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoJev(\n receiver: unknown,\n ...args: unknown[]\n): unknown {\n const target = receiver as JevReceiver\n if (!__bitfabAutoTraceActive()) {\n return target.systemOne(...args)\n }\n return invokeRecordedClientCall(jevDefinition(receiver), args, () =>\n target.systemOne(...args),\n )\n}\n\nconst clientCallDefinitions = new Map<string, AutoTraceFunctionDefinition>()\n\nfunction clientCallDefinition(\n provider: ClientCallProvider,\n receiver: unknown,\n method: string,\n): AutoTraceFunctionDefinition {\n const className = receiverClassName(receiver)\n const qualified = (methodName: string): string =>\n className === undefined ? methodName : `${className}.${methodName}`\n const id = `ts-auto-v1:${provider.key}#${qualified(method)}`\n let definition = clientCallDefinitions.get(id)\n if (definition === undefined) {\n definition = {\n id,\n name: qualified(provider.spanMethods?.[method] ?? method),\n file: provider.library,\n line: 0,\n column: 0,\n async: true,\n clientCall: provider.key,\n clientCallMethod: method,\n }\n clientCallDefinitions.set(id, definition)\n }\n return definition\n}\n\n/**\n * Call `receiver[method](...args)` from an LLM client call site rewritten by\n * the build transform: `.chat.completions`, `.embeddings`,\n * `.audio.transcriptions`, `.messages`, and `.responses` calls on an `openai`\n * or `@anthropic-ai/sdk` client, and `.models` calls on an `@google/genai`\n * client. Beneath an automatic trace root the call is recorded as one `llm`\n * span with the prompt, model, and token usage, and the client's own returned\n * value is handed back unchanged. A streamed call is recorded when its stream\n * finishes. Otherwise it is a plain method call.\n *\n * This helper is internal transform/runtime protocol, not a supported\n * application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoClientCall(\n endpoint: string,\n receiver: unknown,\n method: string,\n ...args: unknown[]\n): unknown {\n const call = (): unknown =>\n Reflect.apply(\n (receiver as Record<string, (...callArgs: unknown[]) => unknown>)[\n method\n ] as (...callArgs: unknown[]) => unknown,\n receiver,\n args,\n )\n if (!__bitfabAutoTraceActive()) {\n return call()\n }\n const provider = providerForClientCall(endpoint, method, receiver)\n if (\n provider === undefined ||\n (clientCallStreams(provider, method, args[0]) &&\n provider.streamSummary === undefined) ||\n frameworkRecordsClientCall()\n ) {\n return call()\n }\n return invokeRecordedClientCall(\n clientCallDefinition(provider, receiver, method),\n args,\n call,\n )\n}\n\n/**\n * @deprecated Emitted by older build transforms. Same as\n * `__bitfabAutoClientCall(\"chat.completions\", receiver, \"create\", ...args)`.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoOpenRouter(\n receiver: unknown,\n ...args: unknown[]\n): unknown {\n return __bitfabAutoClientCall(\"chat.completions\", receiver, \"create\", ...args)\n}\n\n/**\n * @deprecated Emitted by older build transforms. Same as\n * `__bitfabAutoClientCall(\"messages\", receiver, \"create\", ...args)`.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoAnthropic(\n receiver: unknown,\n ...args: unknown[]\n): unknown {\n return __bitfabAutoClientCall(\"messages\", receiver, \"create\", ...args)\n}\n\n/**\n * @deprecated Emitted by older build transforms. Same as\n * `__bitfabAutoClientCall(\"responses\", receiver, \"create\", ...args)`.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoOpenAIResponses(\n receiver: unknown,\n ...args: unknown[]\n): unknown {\n return __bitfabAutoClientCall(\"responses\", receiver, \"create\", ...args)\n}\n\n/**\n * Preserve a function's original call arguments for transform cases where\n * parameter bindings discard them, such as destructured arrow parameters.\n *\n * This helper is internal transform/runtime protocol. The proxy preserves the\n * target's callability, arity, async identity, and non-constructibility while\n * only allocating a trace closure beneath an active automatic trace root.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoWrap<T extends (...args: never[]) => unknown>(\n definition: AutoTraceFunctionDefinition,\n fn: T,\n): T {\n noteTransformedModule()\n if (fn.name === \"\") {\n const nameParts = definition.name.split(\".\")\n const inferredName = nameParts[nameParts.length - 1]\n if (inferredName !== undefined) {\n Object.defineProperty(fn, \"name\", {\n configurable: true,\n value: inferredName,\n })\n }\n }\n\n const target = fn as unknown as (...args: unknown[]) => unknown\n return new Proxy(target, {\n apply(callTarget, thisArg, args) {\n if (!__bitfabAutoTraceActive()) {\n return Reflect.apply(callTarget, thisArg, args)\n }\n return __bitfabAutoSpan(definition, args, () =>\n Reflect.apply(callTarget, thisArg, args),\n )\n },\n }) as unknown as T\n}\n\n/**\n * Return whether the current call is inside an automatic trace root.\n *\n * Build transforms use this before allocating function metadata, captured\n * inputs, or an invocation closure. It is internal transform/runtime protocol,\n * not a supported application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoTraceActive(): boolean {\n if (autoTraceState.activeRoots === 0 || isCaptureSuppressed()) {\n return false\n }\n return currentAutoTraceEntries().length > 0\n}\n\nfunction currentAutoTraceScope(): AutoTraceScope | undefined {\n initializeAutoTraceStorage()\n return autoTraceState.storage?.getStore() ?? autoTraceState.browserScope\n}\n\nexport function _resetAutoTraceTransformDetection(): void {\n autoTraceGlobal.__bitfab_auto_trace_transformed_v1__ = undefined\n}\n"],"mappings":"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"}
@@ -242,6 +242,7 @@ var StreamFinalizationError = class extends Error {
242
242
  //#endregion
243
243
  //#region src/clientCalls.ts
244
244
  const OPENROUTER_HOSTNAME = "openrouter.ai";
245
+ const ANTHROPIC_HOSTNAME = "anthropic.com";
245
246
  const CLIENT_CALL_WATCH_STORAGE_SYMBOL = Symbol.for("bitfab.clientCallWatchStorage");
246
247
  const RESPONSE_DONE_EVENTS = [
247
248
  "response.completed",
@@ -336,15 +337,21 @@ function clientClassStatic(receiver, name) {
336
337
  return;
337
338
  }
338
339
  }
339
- function isOpenRouterBaseUrl(baseUrl) {
340
+ function baseUrlHostIs(baseUrl, hostname) {
340
341
  if (typeof baseUrl !== "string") return false;
341
342
  try {
342
343
  const host = new URL(baseUrl).hostname;
343
- return host === OPENROUTER_HOSTNAME || host.endsWith(`.${OPENROUTER_HOSTNAME}`);
344
+ return host === hostname || host.endsWith(`.${hostname}`);
344
345
  } catch {
345
346
  return false;
346
347
  }
347
348
  }
349
+ function isOpenRouterBaseUrl(baseUrl) {
350
+ return baseUrlHostIs(baseUrl, OPENROUTER_HOSTNAME);
351
+ }
352
+ function isAnthropicBaseUrl(baseUrl) {
353
+ return baseUrlHostIs(baseUrl, ANTHROPIC_HOSTNAME);
354
+ }
348
355
  function isOpenRouterResource(receiver) {
349
356
  try {
350
357
  return isOpenRouterBaseUrl(field(clientOf(receiver), "baseURL"));
@@ -741,6 +748,12 @@ const CLIENT_CALL_PROVIDERS = [
741
748
  GEMINI_EMBEDDINGS
742
749
  ];
743
750
  const CLIENT_CALL_PROVIDERS_BY_KEY = new Map(CLIENT_CALL_PROVIDERS.map((provider) => [provider.key, provider]));
751
+ const ANTHROPIC_CACHE_USAGE_KEYS = ["cache_read_input_tokens", "cache_creation_input_tokens"];
752
+ const CHAT_COMPLETION_USAGE_KEYS = ["prompt_tokens", "completion_tokens"];
753
+ function clientCallProviderForUsage(usage) {
754
+ if (ANTHROPIC_CACHE_USAGE_KEYS.some((key) => key in usage)) return ANTHROPIC;
755
+ return CHAT_COMPLETION_USAGE_KEYS.some((key) => key in usage) ? OPENAI_CHAT : OPENAI_RESPONSES;
756
+ }
744
757
  function clientCallProvider(key) {
745
758
  return key === void 0 ? void 0 : CLIENT_CALL_PROVIDERS_BY_KEY.get(key);
746
759
  }
@@ -1292,6 +1305,6 @@ function _resetAutoTraceTransformDetection() {
1292
1305
  autoTraceGlobal.__bitfab_auto_trace_transformed_v1__ = void 0;
1293
1306
  }
1294
1307
  //#endregion
1295
- export { recordAutoTracedClientCall as A, forgetLangChainRun as B, OPENAI_EMBEDDINGS as C, clientCallProvider as D, OPENROUTER as E, endOpenAiAgentsSpan as F, writeOnce as G, markLangChainRunRecorded as H, mapOpenAiAgentsTrace as I, assertAsyncStorageRegistered as J, isCaptureSuppressed as K, openAiAgentsParentSpanId as L, sharedClientCallStreamRecording as M, watchClientCall as N, clientCallStreams as O, StreamFinalizationError as P, registerAsyncLocalStorageClass as Q, openAiAgentsSpanChain as R, OPENAI_CHAT as S, OPENAI_TRANSCRIPTIONS as T, warn as U, installLangChainRunScopes as V, warnOnce as W, createAsyncLocalStorage as X, asyncStorageReady as Y, isAsyncStorageInitDone as Z, runWithAutoTraceNodeConfiguration as _, __bitfabAutoOpenRouter as a, GEMINI as b, __bitfabAutoWrap as c, currentAutoTraceEntries as d, invokeAsDiscoveredCall as f, runWithAutoTraceFramesAt as g, runWithAutoTraceEntry as h, __bitfabAutoOpenAIResponses as i, recordWatchedClientCall as j, frameworkRecordsClientCall as k, _resetAutoTraceTransformDetection as l, runAsAutoTraceRootFunction as m, __bitfabAutoClientCall as n, __bitfabAutoSpan as o, invokeThroughAutoTraceEntries as p, runWithCaptureSuppressed as q, __bitfabAutoJev as r, __bitfabAutoTraceActive as s, __bitfabAutoAnthropic as t, clearAutoTraceNodeConfiguration as u, runWithAutoTraceRootContext as v, OPENAI_RESPONSES as w, GEMINI_EMBEDDINGS as x, ANTHROPIC as y, unmapOpenAiAgentsTrace as z };
1308
+ export { asyncStorageReady as $, frameworkRecordsClientCall as A, mapOpenAiAgentsTrace as B, OPENAI_EMBEDDINGS as C, clientCallProvider as D, OPENROUTER as E, sharedClientCallStreamRecording as F, installLangChainRunScopes as G, openAiAgentsSpanChain as H, watchClientCall as I, warnOnce as J, markLangChainRunRecorded as K, StreamFinalizationError as L, isOpenRouterBaseUrl as M, recordAutoTracedClientCall as N, clientCallProviderForUsage as O, recordWatchedClientCall as P, assertAsyncStorageRegistered as Q, MODEL_CALL_SPAN_TYPES as R, OPENAI_CHAT as S, OPENAI_TRANSCRIPTIONS as T, unmapOpenAiAgentsTrace as U, openAiAgentsParentSpanId as V, forgetLangChainRun as W, isCaptureSuppressed as X, writeOnce as Y, runWithCaptureSuppressed as Z, runWithAutoTraceNodeConfiguration as _, __bitfabAutoOpenRouter as a, GEMINI as b, __bitfabAutoWrap as c, currentAutoTraceEntries as d, createAsyncLocalStorage as et, invokeAsDiscoveredCall as f, runWithAutoTraceFramesAt as g, runWithAutoTraceEntry as h, __bitfabAutoOpenAIResponses as i, isAnthropicBaseUrl as j, clientCallStreams as k, _resetAutoTraceTransformDetection as l, runAsAutoTraceRootFunction as m, __bitfabAutoClientCall as n, registerAsyncLocalStorageClass as nt, __bitfabAutoSpan as o, invokeThroughAutoTraceEntries as p, warn as q, __bitfabAutoJev as r, __bitfabAutoTraceActive as s, __bitfabAutoAnthropic as t, isAsyncStorageInitDone as tt, clearAutoTraceNodeConfiguration as u, runWithAutoTraceRootContext as v, OPENAI_RESPONSES as w, GEMINI_EMBEDDINGS as x, ANTHROPIC as y, endOpenAiAgentsSpan as z };
1296
1309
 
1297
- //# sourceMappingURL=autoTrace-g3y0sLPq.js.map
1310
+ //# sourceMappingURL=autoTrace-RWUOk1WF.js.map