@usagetap/sdk 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -83,6 +83,11 @@ const completion = await usageTap.withUsage(
83
83
  setUsage({
84
84
  modelUsed: model,
85
85
  inputTokens: response.usage?.input_tokens ?? response.usage?.prompt_tokens ?? 0,
86
+ cachedInputTokens:
87
+ response.usage?.prompt_tokens_details?.cached_tokens ??
88
+ response.usage?.cache_read_input_tokens ??
89
+ response.usage?.cached_tokens ??
90
+ 0,
86
91
  responseTokens: response.usage?.output_tokens ?? response.usage?.completion_tokens ?? 0,
87
92
  reasoningTokens: reasoning ? response.usage?.reasoning_tokens ?? 0 : 0,
88
93
  searches: tools?.length ? response.usage?.web_search_queries ?? 0 : 0,
@@ -439,6 +444,8 @@ console.log("Plan:", snapshot.data.plan);
439
444
  console.log("Allowed entitlements:", snapshot.data.allowed);
440
445
  ```
441
446
 
447
+ `customerFriendlyName` (aka `customerName`) and `customerEmail` are **HIGHLY IMPORTANT BUT OPTIONAL**: they populate the customer profile on first creation and are safe to omit if you truly do not have them yet.
448
+
442
449
  This returns the same rich subscription snapshot surfaces by `call_begin` and `checkUsage`, making it safe to cache the response for onboarding flows. Pass `idempotencyKey` in `CreateCustomerOptions` when you need deterministic keys across services; otherwise the client auto-generates one by default. Both `idempotencyKey` (preferred) and `idempotency` (deprecated) are supported.
443
450
 
444
451
  ### Change a customer's plan
@@ -577,27 +584,27 @@ UsageTap responds exclusively with the canonical `{ result, data, correlationId
577
584
  "search": true,
578
585
  "reasoningLevel": "MEDIUM"
579
586
  },
580
- "entitlementHints": {
581
- "suggestedModelTier": "standard",
582
- "reasoningLevel": "MEDIUM",
583
- "policy": "DOWNGRADE",
584
- "downgrade": {
585
- "reason": "PREMIUM_QUOTA_EXHAUSTED",
586
- "fallbackTier": "standard"
587
- }
588
- },
589
- "meters": {
590
- "standardCalls": {
591
- "remaining": 12,
587
+ "entitlementHints": {
588
+ "suggestedModelTier": "standard",
589
+ "reasoningLevel": "MEDIUM",
590
+ "policy": "DOWNGRADE",
591
+ "downgrade": {
592
+ "reason": "PREMIUM_QUOTA_EXHAUSTED",
593
+ "fallbackTier": "standard"
594
+ }
595
+ },
596
+ "meters": {
597
+ "standardCalls": {
598
+ "remaining": 12,
592
599
  "limit": 20,
593
600
  "used": 8,
594
601
  "unlimited": false,
595
602
  "ratio": 0.6
596
603
  },
597
604
  "premiumCalls": {
598
- "remaining": null,
605
+ "remaining": 0,
599
606
  "limit": null,
600
- "used": null,
607
+ "used": 0,
601
608
  "unlimited": true,
602
609
  "ratio": null
603
610
  },
@@ -639,8 +646,8 @@ UsageTap responds exclusively with the canonical `{ result, data, correlationId
639
646
 
640
647
  `UsageTapClient` exposes the normalized structure via `UsageTapSuccessResponse<BeginCallResponseBody>`. In addition to the flattened `allowed` map, the begin response now ships richer metadata:
641
648
 
642
- - `entitlementHints` summarises the recommended model tier and downgrade rationale based on the active policy.
643
- - `meters` is a per-counter snapshot including remaining quotas, total limits, usage to date, and convenience ratios. `remainingRatios` mirrors the same information in a compact map for quick lookups.
649
+ - `entitlementHints` summarises the recommended model tier and downgrade rationale based on the active policy.
650
+ - `meters` is a per-counter snapshot including remaining quotas, total limits, usage to date, and convenience ratios. `remainingRatios` mirrors the same information in a compact map for quick lookups.
644
651
  - `subscription` contains the active plan identity, versioning, and upcoming replenishment timestamps so you can render customer-facing UI without querying Dynamo yourself.
645
652
  - `models` surfaces per-organization vendor hints (e.g. standard vs. premium model shortlists).
646
653
  - `idempotency` reveals the actual key that was persisted (`callId` mirrors this value). When you omit `idempotency` in the request, the backend derives a deterministic hash from organization, customer, feature, and requested entitlements.
@@ -658,19 +665,55 @@ UsageTap responds exclusively with the canonical `{ result, data, correlationId
658
665
  "data": {
659
666
  "callId": "call_123",
660
667
  "costUSD": 0,
661
- "metered": {
662
- "tokens": 768,
663
- "calls": 1,
664
- "searches": 1
665
- }
666
- },
667
- "correlationId": "corr_abc123"
668
- }
668
+ "usage": {
669
+ "inputTokens": 600,
670
+ "cachedInputTokens": 120,
671
+ "billableInputTokens": 480,
672
+ "responseTokens": 288,
673
+ "reasoningTokens": 0
674
+ },
675
+ "metered": {
676
+ "tokens": 768,
677
+ "calls": 1,
678
+ "searches": 1
679
+ },
680
+ "spendVelocity": {
681
+ "currency": "USD",
682
+ "source": "usage_aggregate",
683
+ "generatedAt": "2025-10-04T18:21:52.103Z",
684
+ "customerId": "cust_123",
685
+ "currentCallCostUsd": 0,
686
+ "windows": {
687
+ "hour": {
688
+ "bucket": "2025-10-04T18",
689
+ "windowMinutes": 60,
690
+ "startedAt": "2025-10-04T18:00:00.000Z",
691
+ "endedAt": "2025-10-04T18:21:52.103Z",
692
+ "completedCostUsd": 8.75,
693
+ "completedCalls": 24
694
+ },
695
+ "day": {
696
+ "bucket": "2025-10-04",
697
+ "windowMinutes": 1440,
698
+ "startedAt": "2025-10-04T00:00:00.000Z",
699
+ "endedAt": "2025-10-04T18:21:52.103Z",
700
+ "completedCostUsd": 42.1,
701
+ "completedCalls": 140
702
+ }
703
+ }
704
+ }
705
+ },
706
+ "correlationId": "corr_abc123"
707
+ }
669
708
  ```
670
709
 
671
- `metered` is derived from the raw Dynamo deltas. Additional meters (audio seconds, reasoning tokens, balances) will populate in later phases without breaking the contract.
710
+ Send `cachedInputTokens` when available so UsageTap can apply provider cache-read pricing correctly.
672
711
 
673
- ### Premium detection and override
712
+ `metered` is derived from the raw Dynamo deltas. Additional meters (audio seconds, reasoning tokens, balances) will populate in later phases without breaking the contract.
713
+
714
+ `spendVelocity` is aggregate-backed current UTC hour/day telemetry. UsageTap does not enforce limits from this section; `currentCallCostUsd` is included separately because aggregate updates are asynchronous.
715
+
716
+ ### Premium detection and override
674
717
 
675
718
  UsageTap automatically determines whether a call is premium based on the model's output token pricing:
676
719
  - If the output token price exceeds **$4.00 per million tokens**, the call is classified as premium
@@ -693,6 +736,33 @@ This is useful when:
693
736
  - You want to enforce specific billing tiers regardless of pricing
694
737
  - You're implementing your own tier classification logic
695
738
 
739
+ ### Batch pricing
740
+
741
+ Batch mode applies a **50% discount** to standard pricing rates. Set `batch: true` or `pricingMode: "batch"` on either `call_begin` or `call_end`.
742
+
743
+ When set on `call_begin`, the pricing mode carries through to `call_end` automatically. Setting it on `call_end` overrides the `call_begin` value.
744
+
745
+ ```ts
746
+ // Option 1: Set on call_begin (carries through)
747
+ const begin = await usageTap.beginCall({
748
+ customerId: "cust_123",
749
+ batch: true,
750
+ pricingMode: "batch",
751
+ });
752
+
753
+ // Option 2: Set on call_end (overrides call_begin)
754
+ await usageTap.endCall({
755
+ callId: begin.data.callId,
756
+ modelUsed: "gpt-4o",
757
+ inputTokens: 100,
758
+ responseTokens: 200,
759
+ batch: true,
760
+ pricingMode: "batch",
761
+ });
762
+ ```
763
+
764
+ Both `batch` and `pricingMode` are echoed in the responses from `call_begin` and `call_end`.
765
+
696
766
  ### Raw fetch integrations
697
767
 
698
768
  Prefer `UsageTapClient` whenever possible—it handles retries, headers, and idempotency for you. If you still need to work with `fetch` directly, remember to request the canonical media type and consume the envelope shape directly:
@@ -656,11 +656,12 @@ function inferUsageFromResponse(response, hints) {
656
656
  if (!candidate.usage) {
657
657
  return void 0;
658
658
  }
659
+ const cachedInputTokens = candidate.usage.prompt_tokens_details?.cached_tokens ?? candidate.usage.cached_tokens;
659
660
  return {
660
661
  modelUsed: candidate.model ?? hints?.preferredModel,
661
662
  inputTokens: candidate.usage.prompt_tokens,
662
663
  responseTokens: candidate.usage.completion_tokens,
663
- cachedTokens: candidate.usage.cached_tokens
664
+ cachedInputTokens
664
665
  };
665
666
  }
666
667
  function wrapStreamForUsageTap(source, finalize, ctx) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/errors.ts","../../src/adapters/openai.ts"],"names":["apiPromise","wrappedPromise","wrappedStream"],"mappings":"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","file":"openai.cjs","sourcesContent":["export type UsageTapErrorCode =\r\n | \"USAGETAP_BROWSER_RUNTIME\"\r\n | \"USAGETAP_AUTH_ERROR\"\r\n | \"USAGETAP_BAD_REQUEST\"\r\n | \"USAGETAP_INVALID_RESPONSE\"\r\n | \"USAGETAP_NETWORK_ERROR\"\r\n | \"USAGETAP_RATE_LIMITED\"\r\n | \"USAGETAP_SERVER_ERROR\"\r\n | \"USAGETAP_RETRY_EXHAUSTED\"\r\n | \"USAGETAP_END_CALL_ERROR\";\r\n\r\nexport interface UsageTapErrorInit {\r\n status?: number;\r\n retryable?: boolean;\r\n correlationId?: string;\r\n details?: Record<string, unknown>;\r\n cause?: unknown;\r\n}\r\n\r\nexport class UsageTapError extends Error {\r\n public readonly code: UsageTapErrorCode;\r\n public readonly status?: number;\r\n public readonly retryable: boolean;\r\n public readonly correlationId?: string;\r\n public readonly details?: Record<string, unknown>;\r\n\r\n constructor(code: UsageTapErrorCode, message: string, init: UsageTapErrorInit = {}) {\r\n super(message, init.cause ? { cause: init.cause as Error } : undefined);\r\n this.name = \"UsageTapError\";\r\n this.code = code;\r\n this.status = init.status;\r\n this.retryable = init.retryable ?? false;\r\n this.correlationId = init.correlationId;\r\n this.details = init.details;\r\n }\r\n\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n code: this.code,\r\n status: this.status,\r\n retryable: this.retryable,\r\n correlationId: this.correlationId,\r\n details: this.details,\r\n };\r\n }\r\n}\r\n\r\nexport function isUsageTapError(error: unknown): error is UsageTapError {\r\n return error instanceof UsageTapError;\r\n}\r\n","import type OpenAI from \"openai\";\r\nimport { UsageTapClient } from \"../client\";\r\nimport { UsageTapError } from \"../errors\";\r\nimport type {\r\n BeginCallRequest,\r\n BeginCallResponseBody,\r\n EndCallRequest,\r\n UsageTapSuccessResponse,\r\n VendorHints,\r\n WithUsageContext,\r\n WithUsageOptions,\r\n} from \"../types\";\r\n\r\nexport interface OpenAIAdapterInit {\r\n client: OpenAI;\r\n usageTap: UsageTapClient;\r\n}\r\n\r\nexport interface OpenAIRequestContext {\r\n hints?: VendorHints;\r\n begin: UsageTapSuccessResponse<BeginCallResponseBody>;\r\n}\r\n\r\nexport interface OpenAIInvokeParams<TResponse> {\r\n begin: BeginCallRequest;\r\n call: (client: OpenAI, ctx: OpenAIRequestContext) => Promise<TResponse>;\r\n extractUsage?: (response: TResponse) => Partial<Omit<EndCallRequest, \"callId\" | \"error\">> | void;\r\n withUsageOptions?: WithUsageOptions;\r\n}\r\n\r\nexport interface OpenAIInvokeResult<TResponse> {\r\n data: TResponse;\r\n begin: UsageTapSuccessResponse<BeginCallResponseBody>;\r\n}\r\n\r\nexport interface OpenAIStreamCallResult<TStream> {\r\n stream: AsyncIterable<TStream>;\r\n onComplete?: () => Promise<Partial<Omit<EndCallRequest, \"callId\" | \"error\">> | void> | Partial<Omit<EndCallRequest, \"callId\" | \"error\">> | void;\r\n}\r\n\r\nexport interface OpenAIStreamParams<TStream> {\r\n begin: BeginCallRequest;\r\n call: (client: OpenAI, ctx: OpenAIRequestContext) => Promise<OpenAIStreamCallResult<TStream>>;\r\n withUsageOptions?: WithUsageOptions;\r\n}\r\n\r\nexport interface OpenAIStreamResult<TStream> {\r\n stream: AsyncIterable<TStream> & { __usageTapFinalize?: () => Promise<void> };\r\n begin: UsageTapSuccessResponse<BeginCallResponseBody>;\r\n finalize: () => Promise<void>;\r\n}\r\n\r\nexport interface OpenAIAdapter {\r\n invoke<TResponse>(params: OpenAIInvokeParams<TResponse>): Promise<OpenAIInvokeResult<TResponse>>;\r\n invokeStream<TStream>(params: OpenAIStreamParams<TStream>): Promise<OpenAIStreamResult<TStream>>;\r\n}\r\n\r\ntype ReplaceProperty<T, K extends keyof T, V> = Omit<T, K> & Record<K, V>;\r\n\r\nexport type WrapOpenAIContext = BeginCallRequest;\r\n\r\nexport interface WrapOpenAIOptions {\r\n defaultContext?: Partial<WrapOpenAIContext>;\r\n applyVendorHints?: boolean;\r\n}\r\n\r\ntype ChatCompletionsResource = OpenAI[\"chat\"][\"completions\"];\r\ntype ChatCompletionCreate = ChatCompletionsResource[\"create\"];\r\ntype ChatCompletionCreateParams = Parameters<ChatCompletionCreate>[0];\r\ntype ChatCompletionCreateOptions = Parameters<ChatCompletionCreate>[1];\r\ntype ChatCompletionCreateReturn = ReturnType<ChatCompletionCreate>;\r\n\r\nexport type WrapOpenAICallOptions = (ChatCompletionCreateOptions extends undefined\r\n ? { usageTap?: Partial<WrapOpenAIContext>; withUsage?: WithUsageOptions }\r\n : ChatCompletionCreateOptions & { usageTap?: Partial<WrapOpenAIContext>; withUsage?: WithUsageOptions });\r\n\r\ninterface WrappedChatCompletions extends Omit<ChatCompletionsResource, \"create\"> {\r\n create: (\r\n params: ChatCompletionCreateParams,\r\n options?: WrapOpenAICallOptions,\r\n ) => ChatCompletionCreateReturn;\r\n}\r\n\r\ntype ResponsesResource = OpenAI extends { responses: infer R } ? R : never;\r\ntype ResponsesCreate = ResponsesResource extends { create: infer T } ? T : never;\r\ntype ResponsesCreateParams = ResponsesCreate extends (...args: infer P) => unknown ? P[0] : never;\r\ntype ResponsesCreateOptions = ResponsesCreate extends (...args: infer P) => unknown ? P[1] : never;\r\ntype ResponsesCreateReturn = ResponsesCreate extends (...args: unknown[]) => infer R ? R : never;\r\n\r\nexport type WrapOpenAIResponseCallOptions = (ResponsesCreateOptions extends undefined\r\n ? { usageTap?: Partial<WrapOpenAIContext>; withUsage?: WithUsageOptions }\r\n : ResponsesCreateOptions & { usageTap?: Partial<WrapOpenAIContext>; withUsage?: WithUsageOptions });\r\n\r\ntype WrappedResponses = ResponsesResource extends undefined\r\n ? undefined\r\n : Omit<NonNullable<ResponsesResource>, \"create\"> & {\r\n create: (\r\n params: ResponsesCreateParams,\r\n options?: WrapOpenAIResponseCallOptions,\r\n ) => ResponsesCreateReturn;\r\n };\r\n\r\nexport type WrappedOpenAI = OpenAI & {\r\n chat: ReplaceProperty<OpenAI[\"chat\"], \"completions\", WrappedChatCompletions>;\r\n} & (ResponsesResource extends undefined\r\n ? { responses?: undefined }\r\n : { responses: WrappedResponses }) & {\r\n toNextResponse: typeof toNextResponse;\r\n pipeToResponse: typeof pipeToResponse;\r\n unwrap: () => OpenAI;\r\n };\r\n\r\nexport interface StreamOpenAIRouteOptions {\r\n getRequest: (req: Request) => Promise<{\r\n params: ChatCompletionCreateParams;\r\n usageTap?: Partial<WrapOpenAIContext>;\r\n withUsage?: WithUsageOptions;\r\n }>;\r\n wrapOptions?: WrapOpenAIOptions;\r\n defaultContext?: Partial<WrapOpenAIContext>;\r\n stream?: {\r\n mode?: StreamMode;\r\n headers?: Record<string, string>;\r\n responseInit?: ResponseInit;\r\n };\r\n}\r\n\r\nexport type StreamMode = \"text\" | \"sse\";\r\n\r\nexport interface StreamToResponseOptions {\r\n mode?: StreamMode;\r\n headers?: Record<string, string>;\r\n contentType?: string;\r\n sse?: {\r\n event?: string;\r\n retry?: number;\r\n };\r\n}\r\n\r\nexport function createOpenAIAdapter(init: OpenAIAdapterInit): OpenAIAdapter {\r\n const { client, usageTap } = init;\r\n\r\n return {\r\n async invoke<TResponse>(params: OpenAIInvokeParams<TResponse>): Promise<OpenAIInvokeResult<TResponse>> {\r\n const result = await usageTap.withUsage<OpenAIInvokeResult<TResponse>>(\r\n params.begin,\r\n async (ctx) => {\r\n const response = await params.call(client, {\r\n hints: ctx.begin.data.vendorHints,\r\n begin: ctx.begin,\r\n });\r\n\r\n tryInferUsage(response, ctx.begin.data.vendorHints, params.extractUsage, ctx);\r\n\r\n return {\r\n data: response,\r\n begin: ctx.begin,\r\n } satisfies OpenAIInvokeResult<TResponse>;\r\n },\r\n params.withUsageOptions,\r\n );\r\n\r\n return result;\r\n },\r\n\r\n async invokeStream<TStream>(params: OpenAIStreamParams<TStream>): Promise<OpenAIStreamResult<TStream>> {\r\n const result = await usageTap.withUsage<OpenAIStreamResult<TStream>>(\r\n params.begin,\r\n async (ctx) => {\r\n const { stream, onComplete } = await params.call(client, {\r\n hints: ctx.begin.data.vendorHints,\r\n begin: ctx.begin,\r\n });\r\n\r\n const wrapped = wrapStreamForUsageTap(stream, async () => {\r\n if (!onComplete) return;\r\n try {\r\n const maybeUsage = await onComplete();\r\n if (maybeUsage) {\r\n ctx.setUsage(maybeUsage);\r\n }\r\n } catch (error) {\r\n ctx.setError({\r\n code: \"USAGE_FINALIZE_ERROR\",\r\n message: error instanceof Error ? error.message : String(error),\r\n });\r\n throw error;\r\n }\r\n }, ctx);\r\n\r\n const finalize = async (): Promise<void> => {\r\n await wrapped.__usageTapFinalize?.();\r\n };\r\n\r\n return {\r\n stream: wrapped,\r\n begin: ctx.begin,\r\n finalize,\r\n } satisfies OpenAIStreamResult<TStream>;\r\n },\r\n params.withUsageOptions,\r\n );\r\n\r\n return result;\r\n },\r\n };\r\n}\r\n\r\nexport type UsageTapStream<T> = AsyncIterable<T> & { __usageTapFinalize?: () => Promise<void> };\r\ntype UsageTapIterableIterator<T> = AsyncIterator<T> & UsageTapStream<T> & {\r\n __usageTapFinalize: () => Promise<void>;\r\n};\r\n\r\nexport function toNextResponse<T>(\r\n stream: UsageTapStream<T>,\r\n options: StreamToResponseOptions = {},\r\n): Response {\r\n const mode = options.mode ?? \"text\";\r\n const headers = new Headers(options.headers ?? {});\r\n\r\n if (mode === \"sse\") {\r\n headers.set(\"content-type\", \"text/event-stream; charset=utf-8\");\r\n headers.set(\"cache-control\", \"no-cache, no-transform\");\r\n headers.set(\"connection\", \"keep-alive\");\r\n headers.set(\"x-accel-buffering\", \"no\");\r\n } else {\r\n headers.set(\"content-type\", options.contentType ?? \"text/plain; charset=utf-8\");\r\n }\r\n\r\n const encoder = new TextEncoder();\r\n let iterator: AsyncIterator<T> | undefined;\r\n\r\n const body = new ReadableStream<Uint8Array>({\r\n async start(controller: ReadableStreamDefaultController<Uint8Array>): Promise<void> {\r\n try {\r\n const getIterator = stream[Symbol.asyncIterator];\r\n if (typeof getIterator !== \"function\") {\r\n controller.close();\r\n return;\r\n }\r\n\r\n iterator = getIterator.call(stream);\r\n\r\n while (true) {\r\n const result = await iterator.next();\r\n if (result.done) {\r\n break;\r\n }\r\n\r\n const text = chunkToText(result.value);\r\n if (!text) {\r\n continue;\r\n }\r\n\r\n if (mode === \"sse\") {\r\n controller.enqueue(encoder.encode(formatSsePayload(text, options.sse)));\r\n } else {\r\n controller.enqueue(encoder.encode(text));\r\n }\r\n }\r\n controller.close();\r\n } catch (error) {\r\n controller.error(error);\r\n } finally {\r\n await stream.__usageTapFinalize?.();\r\n }\r\n },\r\n async cancel(): Promise<void> {\r\n if (!iterator) {\r\n const getIterator = stream[Symbol.asyncIterator];\r\n if (typeof getIterator === \"function\") {\r\n iterator = getIterator.call(stream);\r\n }\r\n }\r\n\r\n if (iterator && typeof iterator.return === \"function\") {\r\n await iterator.return();\r\n }\r\n await stream.__usageTapFinalize?.();\r\n },\r\n });\r\n\r\n return new Response(body, { headers });\r\n}\r\n\r\nexport async function pipeToResponse<T>(\r\n stream: UsageTapStream<T>,\r\n res: NodeResponseLike,\r\n options: StreamToResponseOptions = {},\r\n): Promise<void> {\r\n const mode = options.mode ?? \"text\";\r\n\r\n if (mode === \"sse\") {\r\n setHeaderIfPossible(res, \"Content-Type\", \"text/event-stream; charset=utf-8\");\r\n setHeaderIfPossible(res, \"Cache-Control\", \"no-cache, no-transform\");\r\n setHeaderIfPossible(res, \"Connection\", \"keep-alive\");\r\n setHeaderIfPossible(res, \"X-Accel-Buffering\", \"no\");\r\n } else {\r\n setHeaderIfPossible(res, \"Content-Type\", options.contentType ?? \"text/plain; charset=utf-8\");\r\n }\r\n\r\n const encoder = new TextEncoder();\r\n const iterator = stream[Symbol.asyncIterator]();\r\n\r\n try {\r\n while (true) {\r\n const result = await iterator.next();\r\n if (result.done) {\r\n break;\r\n }\r\n const text = chunkToText(result.value);\r\n if (!text) {\r\n continue;\r\n }\r\n\r\n const payload = mode === \"sse\" ? formatSsePayload(text, options.sse) : text;\r\n res.write(Buffer.from(encoder.encode(payload)));\r\n res.flush?.();\r\n }\r\n } finally {\r\n res.end();\r\n await stream.__usageTapFinalize?.();\r\n }\r\n}\r\n\r\nconst USAGETAP_CORRELATION_HEADER = \"x-usage-correlation-id\";\r\n\r\nexport function wrapOpenAI(\r\n client: OpenAI,\r\n usageTap: UsageTapClient,\r\n options: WrapOpenAIOptions = {},\r\n): WrappedOpenAI {\r\n if (!client) {\r\n throw new UsageTapError(\"USAGETAP_BAD_REQUEST\", \"wrapOpenAI requires an OpenAI client instance\");\r\n }\r\n\r\n const defaultContext = options.defaultContext;\r\n const applyVendorHints = options.applyVendorHints !== false;\r\n\r\n const proxiedChat = client.chat\r\n ? createChatProxy(client.chat, usageTap, defaultContext, applyVendorHints)\r\n : undefined;\r\n\r\n const proxiedResponses = typeof client.responses !== \"undefined\"\r\n ? createResponsesProxy(client.responses, usageTap, defaultContext, applyVendorHints)\r\n : undefined;\r\n\r\n const handler: ProxyHandler<OpenAI> = {\r\n get(target, prop, receiver) {\r\n if (prop === \"chat\" && proxiedChat) {\r\n return proxiedChat;\r\n }\r\n\r\n if (prop === \"responses\" && typeof target.responses !== \"undefined\") {\r\n return proxiedResponses ?? (Reflect.get(target as object, prop, receiver) as unknown);\r\n }\r\n\r\n if (prop === \"toNextResponse\") {\r\n return toNextResponse;\r\n }\r\n\r\n if (prop === \"pipeToResponse\") {\r\n return pipeToResponse;\r\n }\r\n\r\n if (prop === \"unwrap\") {\r\n return () => target;\r\n }\r\n\r\n return Reflect.get(target as object, prop, receiver) as unknown;\r\n },\r\n };\r\n\r\n return new Proxy(client, handler) as WrappedOpenAI;\r\n}\r\n\r\nexport function streamOpenAIRoute(\r\n usageTap: UsageTapClient,\r\n openai: OpenAI,\r\n options: StreamOpenAIRouteOptions,\r\n): (req: Request) => Promise<Response> {\r\n if (!options?.getRequest) {\r\n throw new UsageTapError(\"USAGETAP_BAD_REQUEST\", \"streamOpenAIRoute requires a getRequest function\");\r\n }\r\n\r\n const wrapConfig: WrapOpenAIOptions | undefined = options.wrapOptions || options.defaultContext\r\n ? {\r\n ...(options.wrapOptions ?? {}),\r\n defaultContext: options.defaultContext ?? options.wrapOptions?.defaultContext,\r\n }\r\n : undefined;\r\n\r\n const wrappedClient = wrapConfig\r\n ? wrapOpenAI(openai, usageTap, wrapConfig)\r\n : wrapOpenAI(openai, usageTap);\r\n\r\n return async (req: Request): Promise<Response> => {\r\n const requestConfig = await options.getRequest(req);\r\n const mergedParams: ChatCompletionCreateParams = {\r\n ...requestConfig.params,\r\n stream: true,\r\n };\r\n\r\n const callOptions: Partial<WrapOpenAICallOptions> = {};\r\n if (requestConfig.usageTap) {\r\n callOptions.usageTap = requestConfig.usageTap;\r\n }\r\n if (requestConfig.withUsage) {\r\n callOptions.withUsage = requestConfig.withUsage;\r\n }\r\n\r\n const stream = await wrappedClient.chat.completions.create(\r\n mergedParams,\r\n Object.keys(callOptions).length ? (callOptions as WrapOpenAICallOptions) : undefined,\r\n );\r\n\r\n const baseResponse = toNextResponse(stream as UsageTapStream<unknown>, {\r\n mode: options.stream?.mode ?? \"sse\",\r\n headers: options.stream?.headers,\r\n });\r\n\r\n const init = options.stream?.responseInit;\r\n if (!init) {\r\n return baseResponse;\r\n }\r\n\r\n const mergedHeaders = new Headers(baseResponse.headers);\r\n if (init.headers) {\r\n const extra = normalizeHeaders(init.headers);\r\n for (const [key, value] of Object.entries(extra)) {\r\n mergedHeaders.set(key, value);\r\n }\r\n }\r\n\r\n return new Response(baseResponse.body, {\r\n status: init.status ?? baseResponse.status,\r\n statusText: init.statusText ?? baseResponse.statusText,\r\n headers: mergedHeaders,\r\n });\r\n };\r\n}\r\n\r\nexport interface NodeResponseLike {\r\n write(chunk: string | Uint8Array | Buffer): unknown;\r\n end(chunk?: string | Uint8Array | Buffer): unknown;\r\n setHeader?(name: string, value: string): void;\r\n headersSent?: boolean;\r\n statusCode?: number;\r\n status?(code: number): void;\r\n flush?(): void;\r\n}\r\n\r\nfunction createChatProxy(\r\n resource: OpenAI[\"chat\"],\r\n usageTap: UsageTapClient,\r\n defaultContext: Partial<WrapOpenAIContext> | undefined,\r\n applyVendorHints: boolean,\r\n): ReplaceProperty<OpenAI[\"chat\"], \"completions\", WrappedChatCompletions> {\r\n const completions = createChatCompletionsProxy(\r\n resource.completions,\r\n usageTap,\r\n defaultContext,\r\n applyVendorHints,\r\n );\r\n\r\n const handler: ProxyHandler<OpenAI[\"chat\"]> = {\r\n get(target, prop, receiver) {\r\n if (prop === \"completions\") {\r\n return completions;\r\n }\r\n return Reflect.get(target as object, prop, receiver) as unknown;\r\n },\r\n };\r\n\r\n return new Proxy(resource, handler) as ReplaceProperty<OpenAI[\"chat\"], \"completions\", WrappedChatCompletions>;\r\n}\r\n\r\nfunction createResponsesProxy(\r\n resource: ResponsesResource,\r\n usageTap: UsageTapClient,\r\n defaultContext: Partial<WrapOpenAIContext> | undefined,\r\n applyVendorHints: boolean,\r\n): WrappedResponses | undefined {\r\n if (!resource || typeof resource !== \"object\") {\r\n return undefined;\r\n }\r\n\r\n if (!(\"create\" in resource) || typeof (resource as { create?: unknown }).create !== \"function\") {\r\n return resource as unknown as WrappedResponses;\r\n }\r\n\r\n const originalCreate = (resource as { create: (...args: unknown[]) => unknown }).create.bind(resource);\r\n\r\n const wrappedCreate = (\r\n params: ResponsesCreateParams,\r\n options?: WrapOpenAIResponseCallOptions,\r\n ): ResponsesCreateReturn => {\r\n const { requestOptions, usageContext, withUsage } = splitUsageOptions(options);\r\n const beginRequest = resolveBeginRequest(defaultContext, usageContext);\r\n const wantsStream = isStreamingRequest(params);\r\n\r\n return usageTap.withUsage(beginRequest, (ctx) => {\r\n const finalParams = applyVendorHints\r\n ? applyResponsesVendorHints(params, ctx.begin.data.vendorHints)\r\n : params;\r\n const request = attachCorrelationHeader(requestOptions, ctx.begin.correlationId) as ResponsesCreateOptions;\r\n\r\n if (wantsStream) {\r\n const apiPromise = originalCreate(finalParams, request);\r\n const wrappedPromise = transformApiPromise(apiPromise, (rawStream) => {\r\n ensureAsyncIterable(rawStream, \"responses.create\");\r\n const wrappedStream = wrapStreamForUsageTap(rawStream, async () => {\r\n const usage = await extractUsageFromStream(rawStream, ctx.begin.data.vendorHints);\r\n if (usage) {\r\n ctx.setUsage(usage);\r\n }\r\n }, ctx);\r\n return wrappedStream;\r\n });\r\n\r\n return wrappedPromise as unknown as ResponsesCreateReturn;\r\n }\r\n\r\n const apiPromise = originalCreate(finalParams, request);\r\n const wrappedPromise = transformApiPromise(apiPromise, (response) => {\r\n tryInferUsage(response, ctx.begin.data.vendorHints, undefined, ctx);\r\n return response;\r\n });\r\n return wrappedPromise as unknown as ResponsesCreateReturn;\r\n }, withUsage) as ResponsesCreateReturn;\r\n };\r\n\r\n const handler: ProxyHandler<object> = {\r\n get(target, prop, receiver) {\r\n if (prop === \"create\") {\r\n return wrappedCreate;\r\n }\r\n return Reflect.get(target, prop, receiver) as unknown;\r\n },\r\n };\r\n\r\n return new Proxy(resource as object, handler) as WrappedResponses;\r\n}\r\n\r\nfunction createChatCompletionsProxy(\r\n resource: ChatCompletionsResource,\r\n usageTap: UsageTapClient,\r\n defaultContext: Partial<WrapOpenAIContext> | undefined,\r\n applyVendorHints: boolean,\r\n): WrappedChatCompletions {\r\n const originalCreate = resource.create.bind(resource);\r\n const streamCandidate = (resource as { stream?: unknown }).stream;\r\n const originalStream = typeof streamCandidate === \"function\"\r\n ? (streamCandidate as (...args: unknown[]) => unknown).bind(resource)\r\n : undefined;\r\n\r\n const wrappedCreate = (\r\n params: ChatCompletionCreateParams,\r\n options?: WrapOpenAICallOptions,\r\n ): ChatCompletionCreateReturn => {\r\n const { requestOptions, usageContext, withUsage } = splitUsageOptions(options);\r\n const beginRequest = resolveBeginRequest(defaultContext, usageContext);\r\n const wantsStream = isStreamingRequest(params);\r\n\r\n return usageTap.withUsage(beginRequest, (ctx) => {\r\n const finalParams = applyVendorHints\r\n ? applyChatVendorHints(params, ctx.begin.data.vendorHints)\r\n : params;\r\n const request = attachCorrelationHeader(requestOptions, ctx.begin.correlationId) as ChatCompletionCreateOptions;\r\n\r\n if (wantsStream) {\r\n const apiPromise = originalCreate(finalParams, request);\r\n const wrappedPromise = transformApiPromise(apiPromise, (rawStream) => {\r\n ensureAsyncIterable(rawStream, \"chat.completions.create\");\r\n const wrappedStream = wrapStreamForUsageTap(rawStream, async () => {\r\n const usage = await extractUsageFromStream(rawStream, ctx.begin.data.vendorHints);\r\n if (usage) {\r\n ctx.setUsage(usage);\r\n }\r\n }, ctx);\r\n return wrappedStream;\r\n });\r\n\r\n return wrappedPromise as unknown as ChatCompletionCreateReturn;\r\n }\r\n\r\n const apiPromise = originalCreate(finalParams, request);\r\n const wrappedPromise = transformApiPromise(apiPromise, (response) => {\r\n tryInferUsage(response, ctx.begin.data.vendorHints, undefined, ctx);\r\n return response;\r\n });\r\n return wrappedPromise as unknown as ChatCompletionCreateReturn;\r\n }, withUsage) as ChatCompletionCreateReturn;\r\n };\r\n\r\n const wrappedStream = originalStream\r\n ? (\r\n params: ChatCompletionCreateParams,\r\n options?: WrapOpenAICallOptions,\r\n ): ChatCompletionCreateReturn => {\r\n const { requestOptions, usageContext, withUsage } = splitUsageOptions(options);\r\n const beginRequest = resolveBeginRequest(defaultContext, usageContext);\r\n\r\n return usageTap.withUsage(beginRequest, (ctx) => {\r\n const finalParams = applyVendorHints\r\n ? applyChatVendorHints(params, ctx.begin.data.vendorHints)\r\n : params;\r\n const request = attachCorrelationHeader(requestOptions, ctx.begin.correlationId) as ChatCompletionCreateOptions;\r\n\r\n const apiPromise = originalStream(finalParams, request);\r\n const wrappedPromise = transformApiPromise(apiPromise, (rawStream) => {\r\n ensureAsyncIterable(rawStream, \"chat.completions.stream\");\r\n const wrappedStreamInner = wrapStreamForUsageTap(rawStream, async () => {\r\n const usage = await extractUsageFromStream(rawStream, ctx.begin.data.vendorHints);\r\n if (usage) {\r\n ctx.setUsage(usage);\r\n }\r\n }, ctx);\r\n return wrappedStreamInner;\r\n });\r\n\r\n return wrappedPromise as unknown as ChatCompletionCreateReturn;\r\n }, withUsage) as ChatCompletionCreateReturn;\r\n }\r\n : undefined;\r\n\r\n const handler: ProxyHandler<ChatCompletionsResource> = {\r\n get(target, prop, receiver) {\r\n if (prop === \"create\") {\r\n return wrappedCreate;\r\n }\r\n\r\n if (prop === \"stream\" && wrappedStream) {\r\n return wrappedStream;\r\n }\r\n\r\n return Reflect.get(target as object, prop, receiver) as unknown;\r\n },\r\n };\r\n\r\n return new Proxy(resource, handler) as unknown as WrappedChatCompletions;\r\n}\r\n\r\ninterface SplitUsageOptionsResult {\r\n requestOptions?: Record<string, unknown>;\r\n usageContext?: Partial<WrapOpenAIContext>;\r\n withUsage?: WithUsageOptions;\r\n}\r\n\r\nfunction splitUsageOptions(options: unknown): SplitUsageOptionsResult {\r\n if (!options || typeof options !== \"object\") {\r\n return {};\r\n }\r\n\r\n const { usageTap, withUsage, ...rest } = options as {\r\n usageTap?: Partial<WrapOpenAIContext>;\r\n withUsage?: WithUsageOptions;\r\n } & Record<string, unknown>;\r\n\r\n const requestOptions = Object.keys(rest).length ? cloneRequestOptions(rest) : undefined;\r\n\r\n return {\r\n requestOptions,\r\n usageContext: usageTap,\r\n withUsage,\r\n } satisfies SplitUsageOptionsResult;\r\n}\r\n\r\nfunction resolveBeginRequest(\r\n defaults: Partial<WrapOpenAIContext> | undefined,\r\n override: Partial<WrapOpenAIContext> | undefined,\r\n): BeginCallRequest {\r\n const base = defaults ?? {};\r\n const current = override ?? {};\r\n const customerId = current.customerId ?? base.customerId;\r\n\r\n if (!customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"wrapOpenAI requires usageTap.customerId (provide defaultContext or options.usageTap)\",\r\n );\r\n }\r\n\r\n const tags = mergeTags(base.tags, current.tags);\r\n const begin: BeginCallRequest = { customerId } satisfies BeginCallRequest;\r\n\r\n const requested = current.requested ?? base.requested;\r\n if (requested) begin.requested = requested;\r\n\r\n const feature = current.feature ?? base.feature;\r\n if (feature) begin.feature = feature;\r\n\r\n const idempotency = current.idempotency ?? base.idempotency;\r\n if (idempotency) begin.idempotency = idempotency;\r\n\r\n const customerName = current.customerName ?? base.customerName;\r\n if (customerName) begin.customerName = customerName;\r\n\r\n const customerEmail = current.customerEmail ?? base.customerEmail;\r\n if (customerEmail) begin.customerEmail = customerEmail;\r\n\r\n if (tags?.length) {\r\n begin.tags = tags;\r\n }\r\n\r\n return begin;\r\n}\r\n\r\ntype PromiseLikeOrValue<T> = PromiseLike<T> | T;\r\n\r\nfunction transformApiPromise<TValue, TResult>(\r\n apiPromise: PromiseLikeOrValue<TValue>,\r\n onResolve: (value: TValue) => PromiseLike<TResult> | TResult,\r\n): Promise<TResult> {\r\n const resolvedPromise = Promise.resolve(apiPromise).then(onResolve);\r\n\r\n if (isObjectRecord(apiPromise)) {\r\n const proto = Object.getPrototypeOf(apiPromise) as object | null;\r\n if (proto) {\r\n Object.setPrototypeOf(resolvedPromise, proto);\r\n }\r\n\r\n for (const key of Reflect.ownKeys(apiPromise)) {\r\n if (key === \"then\" || key === \"catch\" || key === \"finally\") {\r\n continue;\r\n }\r\n\r\n try {\r\n const descriptor = Object.getOwnPropertyDescriptor(apiPromise, key);\r\n if (descriptor) {\r\n Reflect.defineProperty(resolvedPromise, key, descriptor);\r\n }\r\n } catch {\r\n /* ignore non-configurable properties */\r\n }\r\n }\r\n }\r\n\r\n return resolvedPromise;\r\n}\r\n\r\nfunction isObjectRecord(value: unknown): value is Record<PropertyKey, unknown> {\r\n return typeof value === \"object\" && value !== null;\r\n}\r\n\r\nfunction cloneRecord(value: unknown): Record<string, unknown> {\r\n return isObjectRecord(value) ? { ...(value as Record<string, unknown>) } : {};\r\n}\r\n\r\nfunction isStringTuple(value: unknown): value is [string, string] {\r\n return Array.isArray(value) && value.length >= 2 && typeof value[0] === \"string\" && typeof value[1] === \"string\";\r\n}\r\n\r\nfunction cloneRequestOptions(source: Record<string, unknown>): Record<string, unknown> {\r\n const clone: Record<string, unknown> = { ...source };\r\n\r\n if (\"headers\" in clone) {\r\n clone.headers = normalizeHeaders((clone as { headers?: unknown }).headers);\r\n }\r\n\r\n return clone;\r\n}\r\n\r\nfunction attachCorrelationHeader(\r\n options: Record<string, unknown> | undefined,\r\n correlationId: string,\r\n): Record<string, unknown> | undefined {\r\n const normalized = normalizeHeaders(options?.headers);\r\n\r\n if (correlationId && !normalized[USAGETAP_CORRELATION_HEADER]) {\r\n normalized[USAGETAP_CORRELATION_HEADER] = correlationId;\r\n }\r\n\r\n if (!options) {\r\n return Object.keys(normalized).length\r\n ? ({ headers: normalized } satisfies Record<string, unknown>)\r\n : undefined;\r\n }\r\n\r\n const next = { ...options } satisfies Record<string, unknown>;\r\n if (Object.keys(normalized).length) {\r\n next.headers = normalized;\r\n }\r\n return next;\r\n}\r\n\r\nfunction normalizeHeaders(headers: unknown): Record<string, string> {\r\n if (!headers) {\r\n return {};\r\n }\r\n\r\n if (headers instanceof Headers) {\r\n const result: Record<string, string> = {};\r\n headers.forEach((value, key) => {\r\n result[key.toLowerCase()] = value;\r\n });\r\n return result;\r\n }\r\n\r\n if (Array.isArray(headers)) {\r\n const result: Record<string, string> = {};\r\n for (const entry of headers) {\r\n if (!isStringTuple(entry)) {\r\n continue;\r\n }\r\n const [key, value] = entry;\r\n result[key.toLowerCase()] = value;\r\n }\r\n return result;\r\n }\r\n\r\n if (isObjectRecord(headers)) {\r\n const result: Record<string, string> = {};\r\n const record = headers as Record<string, unknown>;\r\n for (const key of Object.keys(record)) {\r\n const value = record[key];\r\n if (value !== undefined && value !== null) {\r\n result[key.toLowerCase()] = String(value);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n return {};\r\n}\r\n\r\nfunction mergeTags(a?: string[], b?: string[]): string[] | undefined {\r\n const values = [...(a ?? []), ...(b ?? [])]\r\n .map((value) => (typeof value === \"string\" ? value.trim() : \"\"))\r\n .filter(Boolean);\r\n\r\n if (!values.length) {\r\n return undefined;\r\n }\r\n\r\n return dedupeStrings(values);\r\n}\r\n\r\nfunction dedupeStrings(values: string[]): string[] {\r\n return Array.from(new Set(values));\r\n}\r\n\r\nfunction isStreamingRequest(params: unknown): boolean {\r\n if (!params || typeof params !== \"object\") {\r\n return false;\r\n }\r\n\r\n const stream = (params as { stream?: unknown }).stream;\r\n if (typeof stream === \"boolean\") {\r\n return stream;\r\n }\r\n\r\n return stream != null;\r\n}\r\n\r\nfunction applyChatVendorHints(\r\n params: ChatCompletionCreateParams,\r\n hints: VendorHints | undefined,\r\n): ChatCompletionCreateParams {\r\n if (!hints) {\r\n return params;\r\n }\r\n\r\n const next = cloneRecord(params);\r\n\r\n if (hints.preferredModel && (next.model === undefined || next.model === null)) {\r\n next.model = hints.preferredModel;\r\n }\r\n\r\n if (typeof hints.maxResponseTokens === \"number\" && next.max_tokens == null) {\r\n next.max_tokens = hints.maxResponseTokens;\r\n }\r\n\r\n if (typeof hints.maxInputTokens === \"number\" && (next as { max_input_tokens?: unknown }).max_input_tokens == null) {\r\n (next as { max_input_tokens?: number }).max_input_tokens = hints.maxInputTokens;\r\n }\r\n\r\n return next as unknown as ChatCompletionCreateParams;\r\n}\r\n\r\nfunction applyResponsesVendorHints(\r\n params: ResponsesCreateParams,\r\n hints: VendorHints | undefined,\r\n): ResponsesCreateParams {\r\n if (!hints) {\r\n return params;\r\n }\r\n\r\n const next = cloneRecord(params);\r\n\r\n if (hints.preferredModel && (next.model === undefined || next.model === null)) {\r\n next.model = hints.preferredModel;\r\n }\r\n\r\n if (typeof hints.maxResponseTokens === \"number\" && (next as { max_output_tokens?: unknown }).max_output_tokens == null) {\r\n (next as { max_output_tokens?: number }).max_output_tokens = hints.maxResponseTokens;\r\n }\r\n\r\n return next as unknown as ResponsesCreateParams;\r\n}\r\n\r\nasync function extractUsageFromStream(\r\n stream: unknown,\r\n hints: VendorHints | undefined,\r\n): Promise<Partial<Omit<EndCallRequest, \"callId\" | \"error\">> | undefined> {\r\n const finalPayload = await resolveStreamFinalPayload(stream);\r\n if (!finalPayload) {\r\n return undefined;\r\n }\r\n\r\n return inferUsageFromResponse(finalPayload, hints);\r\n}\r\n\r\nasync function resolveStreamFinalPayload(stream: unknown): Promise<unknown> {\r\n if (!stream || typeof stream !== \"object\") {\r\n return undefined;\r\n }\r\n\r\n const candidate = stream as {\r\n finalChatCompletion?: () => Promise<unknown>;\r\n finalCompletion?: () => Promise<unknown>;\r\n finalResponse?: () => Promise<unknown>;\r\n finalContent?: () => Promise<unknown>;\r\n };\r\n\r\n if (typeof candidate.finalChatCompletion === \"function\") {\r\n return candidate.finalChatCompletion();\r\n }\r\n\r\n if (typeof candidate.finalResponse === \"function\") {\r\n return candidate.finalResponse();\r\n }\r\n\r\n if (typeof candidate.finalCompletion === \"function\") {\r\n return candidate.finalCompletion();\r\n }\r\n\r\n if (typeof candidate.finalContent === \"function\") {\r\n return candidate.finalContent();\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction ensureAsyncIterable(value: unknown, label: string): asserts value is AsyncIterable<unknown> {\r\n if (!value || typeof value !== \"object\" || typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] !== \"function\") {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n `${label} expected an async iterable stream but received ${typeof value}`,\r\n );\r\n }\r\n}\r\n\r\nfunction chunkToText(chunk: unknown): string {\r\n if (chunk === undefined || chunk === null) {\r\n return \"\";\r\n }\r\n\r\n if (typeof chunk === \"string\") {\r\n return chunk;\r\n }\r\n\r\n if (typeof chunk === \"object\") {\r\n const candidate = chunk as {\r\n choices?: Array<{\r\n delta?: {\r\n content?: string | Array<{ text?: string }>;\r\n };\r\n }>;\r\n content?: string;\r\n };\r\n\r\n const delta = candidate.choices?.[0]?.delta;\r\n const content = delta?.content ?? candidate.content;\r\n\r\n if (typeof content === \"string\") {\r\n return content;\r\n }\r\n\r\n if (Array.isArray(content)) {\r\n return content\r\n .map((entry) => {\r\n if (!entry) return \"\";\r\n if (typeof entry === \"string\") return entry;\r\n if (typeof entry.text === \"string\") return entry.text;\r\n return \"\";\r\n })\r\n .join(\"\");\r\n }\r\n }\r\n\r\n return String(chunk);\r\n}\r\n\r\nfunction formatSsePayload(\r\n text: string,\r\n options: StreamToResponseOptions[\"sse\"],\r\n): string {\r\n if (!text) {\r\n return \"\";\r\n }\r\n\r\n const lines = text.split(/\\r?\\n/);\r\n const eventLine = options?.event ? `event: ${options.event}\\n` : \"\";\r\n const retryLine = options?.retry ? `retry: ${options.retry}\\n` : \"\";\r\n const dataLines = lines.map((line) => `data: ${line}`).join(\"\\n\");\r\n return `${eventLine}${retryLine}${dataLines}\\n\\n`;\r\n}\r\n\r\nfunction setHeaderIfPossible(res: NodeResponseLike, key: string, value: string): void {\r\n if (typeof res.setHeader === \"function\" && res.headersSent !== true) {\r\n res.setHeader(key, value);\r\n }\r\n}\r\n\r\nfunction tryInferUsage<TResponse>(\r\n response: TResponse,\r\n hints: VendorHints | undefined,\r\n extractor: OpenAIInvokeParams<TResponse>[\"extractUsage\"],\r\n ctx: WithUsageContext,\r\n): void {\r\n const explicit = extractor?.(response);\r\n const inferred = explicit ?? inferUsageFromResponse(response, hints);\r\n\r\n if (inferred) {\r\n ctx.setUsage(inferred);\r\n }\r\n}\r\n\r\nfunction inferUsageFromResponse(\r\n response: unknown,\r\n hints: VendorHints | undefined,\r\n): Partial<Omit<EndCallRequest, \"callId\" | \"error\">> | undefined {\r\n if (!response || typeof response !== \"object\") {\r\n return undefined;\r\n }\r\n\r\n const candidate = response as {\r\n usage?: {\r\n prompt_tokens?: number;\r\n completion_tokens?: number;\r\n total_tokens?: number;\r\n cached_tokens?: number;\r\n };\r\n model?: string;\r\n };\r\n\r\n if (!candidate.usage) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n modelUsed: candidate.model ?? hints?.preferredModel,\r\n inputTokens: candidate.usage.prompt_tokens,\r\n responseTokens: candidate.usage.completion_tokens,\r\n cachedTokens: candidate.usage.cached_tokens,\r\n } satisfies Partial<Omit<EndCallRequest, \"callId\" | \"error\">>;\r\n}\r\n\r\nfunction wrapStreamForUsageTap<TStream>(\r\n source: UsageTapStream<TStream> | AsyncIterable<TStream>,\r\n finalize: () => Promise<void> | void,\r\n ctx: WithUsageContext,\r\n): AsyncIterable<TStream> & { __usageTapFinalize: () => Promise<void> } {\r\n const getIterator = source[Symbol.asyncIterator];\r\n if (typeof getIterator !== \"function\") {\r\n throw new TypeError(\"Stream is not async iterable\");\r\n }\r\n\r\n const iterator = getIterator.call(source) as AsyncIterator<TStream>;\r\n let completed = false;\r\n\r\n const invokeFinalize = async (): Promise<void> => {\r\n if (completed) return;\r\n completed = true;\r\n try {\r\n await finalize();\r\n } catch (error) {\r\n ctx.setError({\r\n code: \"USAGE_FINALIZE_ERROR\",\r\n message: error instanceof Error ? error.message : String(error),\r\n });\r\n throw error;\r\n }\r\n };\r\n\r\n const prototype = (Object.getPrototypeOf(source as object) as object | null) ?? Object.prototype;\r\n const wrapped = Object.create(prototype) as unknown as UsageTapIterableIterator<TStream>;\r\n\r\n for (const key of Reflect.ownKeys(source as object)) {\r\n try {\r\n const descriptor = Object.getOwnPropertyDescriptor(source as object, key);\r\n if (descriptor) {\r\n Object.defineProperty(wrapped, key, descriptor);\r\n }\r\n } catch {\r\n /* ignore non-configurable properties */\r\n }\r\n }\r\n\r\n Object.defineProperty(wrapped, Symbol.asyncIterator, {\r\n value(): UsageTapIterableIterator<TStream> {\r\n return this as UsageTapIterableIterator<TStream>;\r\n },\r\n configurable: true,\r\n });\r\n\r\n Object.defineProperty(wrapped, \"next\", {\r\n value: async (...args: Parameters<AsyncIterator<TStream>[\"next\"]>): Promise<IteratorResult<TStream>> => {\r\n try {\r\n const result = await iterator.next(...args);\r\n if (result.done) {\r\n await invokeFinalize();\r\n }\r\n return result;\r\n } catch (error) {\r\n await invokeFinalize().catch(() => undefined);\r\n throw error;\r\n }\r\n },\r\n configurable: true,\r\n writable: true,\r\n });\r\n\r\n Object.defineProperty(wrapped, \"return\", {\r\n value: async (value?: TStream): Promise<IteratorResult<TStream>> => {\r\n if (typeof iterator.return === \"function\") {\r\n const rawResult: unknown = await iterator.return(value);\r\n if (!isIteratorResult<TStream>(rawResult)) {\r\n throw new TypeError(\"Iterator.return() returned an invalid result\");\r\n }\r\n await invokeFinalize();\r\n return rawResult;\r\n }\r\n await invokeFinalize();\r\n return { done: true, value } as IteratorResult<TStream>;\r\n },\r\n configurable: true,\r\n writable: true,\r\n });\r\n\r\n Object.defineProperty(wrapped, \"throw\", {\r\n value: async (error?: unknown): Promise<IteratorResult<TStream>> => {\r\n if (typeof iterator.throw === \"function\") {\r\n const rawResult: unknown = await iterator.throw(error);\r\n if (!isIteratorResult<TStream>(rawResult)) {\r\n throw new TypeError(\"Iterator.throw() returned an invalid result\");\r\n }\r\n await invokeFinalize();\r\n return rawResult;\r\n }\r\n await invokeFinalize();\r\n throw error;\r\n },\r\n configurable: true,\r\n writable: true,\r\n });\r\n\r\n Object.defineProperty(wrapped, \"__usageTapFinalize\", {\r\n value: async (): Promise<void> => {\r\n await invokeFinalize();\r\n },\r\n configurable: true,\r\n });\r\n\r\n return wrapped;\r\n}\r\n\r\nfunction isIteratorResult<T>(value: unknown): value is IteratorResult<T> {\r\n return isObjectRecord(value) && \"done\" in value;\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/errors.ts","../../src/adapters/openai.ts"],"names":["apiPromise","wrappedPromise","wrappedStream"],"mappings":"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","file":"openai.cjs","sourcesContent":["export type UsageTapErrorCode =\r\n | \"USAGETAP_BROWSER_RUNTIME\"\r\n | \"USAGETAP_AUTH_ERROR\"\r\n | \"USAGETAP_BAD_REQUEST\"\r\n | \"USAGETAP_INVALID_RESPONSE\"\r\n | \"USAGETAP_NETWORK_ERROR\"\r\n | \"USAGETAP_RATE_LIMITED\"\r\n | \"USAGETAP_SERVER_ERROR\"\r\n | \"USAGETAP_RETRY_EXHAUSTED\"\r\n | \"USAGETAP_END_CALL_ERROR\";\r\n\r\nexport interface UsageTapErrorInit {\r\n status?: number;\r\n retryable?: boolean;\r\n correlationId?: string;\r\n details?: Record<string, unknown>;\r\n cause?: unknown;\r\n}\r\n\r\nexport class UsageTapError extends Error {\r\n public readonly code: UsageTapErrorCode;\r\n public readonly status?: number;\r\n public readonly retryable: boolean;\r\n public readonly correlationId?: string;\r\n public readonly details?: Record<string, unknown>;\r\n\r\n constructor(code: UsageTapErrorCode, message: string, init: UsageTapErrorInit = {}) {\r\n super(message, init.cause ? { cause: init.cause as Error } : undefined);\r\n this.name = \"UsageTapError\";\r\n this.code = code;\r\n this.status = init.status;\r\n this.retryable = init.retryable ?? false;\r\n this.correlationId = init.correlationId;\r\n this.details = init.details;\r\n }\r\n\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n code: this.code,\r\n status: this.status,\r\n retryable: this.retryable,\r\n correlationId: this.correlationId,\r\n details: this.details,\r\n };\r\n }\r\n}\r\n\r\nexport function isUsageTapError(error: unknown): error is UsageTapError {\r\n return error instanceof UsageTapError;\r\n}\r\n","import type OpenAI from \"openai\";\r\nimport { UsageTapClient } from \"../client\";\r\nimport { UsageTapError } from \"../errors\";\r\nimport type {\r\n BeginCallRequest,\r\n BeginCallResponseBody,\r\n EndCallRequest,\r\n UsageTapSuccessResponse,\r\n VendorHints,\r\n WithUsageContext,\r\n WithUsageOptions,\r\n} from \"../types\";\r\n\r\nexport interface OpenAIAdapterInit {\r\n client: OpenAI;\r\n usageTap: UsageTapClient;\r\n}\r\n\r\nexport interface OpenAIRequestContext {\r\n hints?: VendorHints;\r\n begin: UsageTapSuccessResponse<BeginCallResponseBody>;\r\n}\r\n\r\nexport interface OpenAIInvokeParams<TResponse> {\r\n begin: BeginCallRequest;\r\n call: (client: OpenAI, ctx: OpenAIRequestContext) => Promise<TResponse>;\r\n extractUsage?: (response: TResponse) => Partial<Omit<EndCallRequest, \"callId\" | \"error\">> | void;\r\n withUsageOptions?: WithUsageOptions;\r\n}\r\n\r\nexport interface OpenAIInvokeResult<TResponse> {\r\n data: TResponse;\r\n begin: UsageTapSuccessResponse<BeginCallResponseBody>;\r\n}\r\n\r\nexport interface OpenAIStreamCallResult<TStream> {\r\n stream: AsyncIterable<TStream>;\r\n onComplete?: () => Promise<Partial<Omit<EndCallRequest, \"callId\" | \"error\">> | void> | Partial<Omit<EndCallRequest, \"callId\" | \"error\">> | void;\r\n}\r\n\r\nexport interface OpenAIStreamParams<TStream> {\r\n begin: BeginCallRequest;\r\n call: (client: OpenAI, ctx: OpenAIRequestContext) => Promise<OpenAIStreamCallResult<TStream>>;\r\n withUsageOptions?: WithUsageOptions;\r\n}\r\n\r\nexport interface OpenAIStreamResult<TStream> {\r\n stream: AsyncIterable<TStream> & { __usageTapFinalize?: () => Promise<void> };\r\n begin: UsageTapSuccessResponse<BeginCallResponseBody>;\r\n finalize: () => Promise<void>;\r\n}\r\n\r\nexport interface OpenAIAdapter {\r\n invoke<TResponse>(params: OpenAIInvokeParams<TResponse>): Promise<OpenAIInvokeResult<TResponse>>;\r\n invokeStream<TStream>(params: OpenAIStreamParams<TStream>): Promise<OpenAIStreamResult<TStream>>;\r\n}\r\n\r\ntype ReplaceProperty<T, K extends keyof T, V> = Omit<T, K> & Record<K, V>;\r\n\r\nexport type WrapOpenAIContext = BeginCallRequest;\r\n\r\nexport interface WrapOpenAIOptions {\r\n defaultContext?: Partial<WrapOpenAIContext>;\r\n applyVendorHints?: boolean;\r\n}\r\n\r\ntype ChatCompletionsResource = OpenAI[\"chat\"][\"completions\"];\r\ntype ChatCompletionCreate = ChatCompletionsResource[\"create\"];\r\ntype ChatCompletionCreateParams = Parameters<ChatCompletionCreate>[0];\r\ntype ChatCompletionCreateOptions = Parameters<ChatCompletionCreate>[1];\r\ntype ChatCompletionCreateReturn = ReturnType<ChatCompletionCreate>;\r\n\r\nexport type WrapOpenAICallOptions = (ChatCompletionCreateOptions extends undefined\r\n ? { usageTap?: Partial<WrapOpenAIContext>; withUsage?: WithUsageOptions }\r\n : ChatCompletionCreateOptions & { usageTap?: Partial<WrapOpenAIContext>; withUsage?: WithUsageOptions });\r\n\r\ninterface WrappedChatCompletions extends Omit<ChatCompletionsResource, \"create\"> {\r\n create: (\r\n params: ChatCompletionCreateParams,\r\n options?: WrapOpenAICallOptions,\r\n ) => ChatCompletionCreateReturn;\r\n}\r\n\r\ntype ResponsesResource = OpenAI extends { responses: infer R } ? R : never;\r\ntype ResponsesCreate = ResponsesResource extends { create: infer T } ? T : never;\r\ntype ResponsesCreateParams = ResponsesCreate extends (...args: infer P) => unknown ? P[0] : never;\r\ntype ResponsesCreateOptions = ResponsesCreate extends (...args: infer P) => unknown ? P[1] : never;\r\ntype ResponsesCreateReturn = ResponsesCreate extends (...args: unknown[]) => infer R ? R : never;\r\n\r\nexport type WrapOpenAIResponseCallOptions = (ResponsesCreateOptions extends undefined\r\n ? { usageTap?: Partial<WrapOpenAIContext>; withUsage?: WithUsageOptions }\r\n : ResponsesCreateOptions & { usageTap?: Partial<WrapOpenAIContext>; withUsage?: WithUsageOptions });\r\n\r\ntype WrappedResponses = ResponsesResource extends undefined\r\n ? undefined\r\n : Omit<NonNullable<ResponsesResource>, \"create\"> & {\r\n create: (\r\n params: ResponsesCreateParams,\r\n options?: WrapOpenAIResponseCallOptions,\r\n ) => ResponsesCreateReturn;\r\n };\r\n\r\nexport type WrappedOpenAI = OpenAI & {\r\n chat: ReplaceProperty<OpenAI[\"chat\"], \"completions\", WrappedChatCompletions>;\r\n} & (ResponsesResource extends undefined\r\n ? { responses?: undefined }\r\n : { responses: WrappedResponses }) & {\r\n toNextResponse: typeof toNextResponse;\r\n pipeToResponse: typeof pipeToResponse;\r\n unwrap: () => OpenAI;\r\n };\r\n\r\nexport interface StreamOpenAIRouteOptions {\r\n getRequest: (req: Request) => Promise<{\r\n params: ChatCompletionCreateParams;\r\n usageTap?: Partial<WrapOpenAIContext>;\r\n withUsage?: WithUsageOptions;\r\n }>;\r\n wrapOptions?: WrapOpenAIOptions;\r\n defaultContext?: Partial<WrapOpenAIContext>;\r\n stream?: {\r\n mode?: StreamMode;\r\n headers?: Record<string, string>;\r\n responseInit?: ResponseInit;\r\n };\r\n}\r\n\r\nexport type StreamMode = \"text\" | \"sse\";\r\n\r\nexport interface StreamToResponseOptions {\r\n mode?: StreamMode;\r\n headers?: Record<string, string>;\r\n contentType?: string;\r\n sse?: {\r\n event?: string;\r\n retry?: number;\r\n };\r\n}\r\n\r\nexport function createOpenAIAdapter(init: OpenAIAdapterInit): OpenAIAdapter {\r\n const { client, usageTap } = init;\r\n\r\n return {\r\n async invoke<TResponse>(params: OpenAIInvokeParams<TResponse>): Promise<OpenAIInvokeResult<TResponse>> {\r\n const result = await usageTap.withUsage<OpenAIInvokeResult<TResponse>>(\r\n params.begin,\r\n async (ctx) => {\r\n const response = await params.call(client, {\r\n hints: ctx.begin.data.vendorHints,\r\n begin: ctx.begin,\r\n });\r\n\r\n tryInferUsage(response, ctx.begin.data.vendorHints, params.extractUsage, ctx);\r\n\r\n return {\r\n data: response,\r\n begin: ctx.begin,\r\n } satisfies OpenAIInvokeResult<TResponse>;\r\n },\r\n params.withUsageOptions,\r\n );\r\n\r\n return result;\r\n },\r\n\r\n async invokeStream<TStream>(params: OpenAIStreamParams<TStream>): Promise<OpenAIStreamResult<TStream>> {\r\n const result = await usageTap.withUsage<OpenAIStreamResult<TStream>>(\r\n params.begin,\r\n async (ctx) => {\r\n const { stream, onComplete } = await params.call(client, {\r\n hints: ctx.begin.data.vendorHints,\r\n begin: ctx.begin,\r\n });\r\n\r\n const wrapped = wrapStreamForUsageTap(stream, async () => {\r\n if (!onComplete) return;\r\n try {\r\n const maybeUsage = await onComplete();\r\n if (maybeUsage) {\r\n ctx.setUsage(maybeUsage);\r\n }\r\n } catch (error) {\r\n ctx.setError({\r\n code: \"USAGE_FINALIZE_ERROR\",\r\n message: error instanceof Error ? error.message : String(error),\r\n });\r\n throw error;\r\n }\r\n }, ctx);\r\n\r\n const finalize = async (): Promise<void> => {\r\n await wrapped.__usageTapFinalize?.();\r\n };\r\n\r\n return {\r\n stream: wrapped,\r\n begin: ctx.begin,\r\n finalize,\r\n } satisfies OpenAIStreamResult<TStream>;\r\n },\r\n params.withUsageOptions,\r\n );\r\n\r\n return result;\r\n },\r\n };\r\n}\r\n\r\nexport type UsageTapStream<T> = AsyncIterable<T> & { __usageTapFinalize?: () => Promise<void> };\r\ntype UsageTapIterableIterator<T> = AsyncIterator<T> & UsageTapStream<T> & {\r\n __usageTapFinalize: () => Promise<void>;\r\n};\r\n\r\nexport function toNextResponse<T>(\r\n stream: UsageTapStream<T>,\r\n options: StreamToResponseOptions = {},\r\n): Response {\r\n const mode = options.mode ?? \"text\";\r\n const headers = new Headers(options.headers ?? {});\r\n\r\n if (mode === \"sse\") {\r\n headers.set(\"content-type\", \"text/event-stream; charset=utf-8\");\r\n headers.set(\"cache-control\", \"no-cache, no-transform\");\r\n headers.set(\"connection\", \"keep-alive\");\r\n headers.set(\"x-accel-buffering\", \"no\");\r\n } else {\r\n headers.set(\"content-type\", options.contentType ?? \"text/plain; charset=utf-8\");\r\n }\r\n\r\n const encoder = new TextEncoder();\r\n let iterator: AsyncIterator<T> | undefined;\r\n\r\n const body = new ReadableStream<Uint8Array>({\r\n async start(controller: ReadableStreamDefaultController<Uint8Array>): Promise<void> {\r\n try {\r\n const getIterator = stream[Symbol.asyncIterator];\r\n if (typeof getIterator !== \"function\") {\r\n controller.close();\r\n return;\r\n }\r\n\r\n iterator = getIterator.call(stream);\r\n\r\n while (true) {\r\n const result = await iterator.next();\r\n if (result.done) {\r\n break;\r\n }\r\n\r\n const text = chunkToText(result.value);\r\n if (!text) {\r\n continue;\r\n }\r\n\r\n if (mode === \"sse\") {\r\n controller.enqueue(encoder.encode(formatSsePayload(text, options.sse)));\r\n } else {\r\n controller.enqueue(encoder.encode(text));\r\n }\r\n }\r\n controller.close();\r\n } catch (error) {\r\n controller.error(error);\r\n } finally {\r\n await stream.__usageTapFinalize?.();\r\n }\r\n },\r\n async cancel(): Promise<void> {\r\n if (!iterator) {\r\n const getIterator = stream[Symbol.asyncIterator];\r\n if (typeof getIterator === \"function\") {\r\n iterator = getIterator.call(stream);\r\n }\r\n }\r\n\r\n if (iterator && typeof iterator.return === \"function\") {\r\n await iterator.return();\r\n }\r\n await stream.__usageTapFinalize?.();\r\n },\r\n });\r\n\r\n return new Response(body, { headers });\r\n}\r\n\r\nexport async function pipeToResponse<T>(\r\n stream: UsageTapStream<T>,\r\n res: NodeResponseLike,\r\n options: StreamToResponseOptions = {},\r\n): Promise<void> {\r\n const mode = options.mode ?? \"text\";\r\n\r\n if (mode === \"sse\") {\r\n setHeaderIfPossible(res, \"Content-Type\", \"text/event-stream; charset=utf-8\");\r\n setHeaderIfPossible(res, \"Cache-Control\", \"no-cache, no-transform\");\r\n setHeaderIfPossible(res, \"Connection\", \"keep-alive\");\r\n setHeaderIfPossible(res, \"X-Accel-Buffering\", \"no\");\r\n } else {\r\n setHeaderIfPossible(res, \"Content-Type\", options.contentType ?? \"text/plain; charset=utf-8\");\r\n }\r\n\r\n const encoder = new TextEncoder();\r\n const iterator = stream[Symbol.asyncIterator]();\r\n\r\n try {\r\n while (true) {\r\n const result = await iterator.next();\r\n if (result.done) {\r\n break;\r\n }\r\n const text = chunkToText(result.value);\r\n if (!text) {\r\n continue;\r\n }\r\n\r\n const payload = mode === \"sse\" ? formatSsePayload(text, options.sse) : text;\r\n res.write(Buffer.from(encoder.encode(payload)));\r\n res.flush?.();\r\n }\r\n } finally {\r\n res.end();\r\n await stream.__usageTapFinalize?.();\r\n }\r\n}\r\n\r\nconst USAGETAP_CORRELATION_HEADER = \"x-usage-correlation-id\";\r\n\r\nexport function wrapOpenAI(\r\n client: OpenAI,\r\n usageTap: UsageTapClient,\r\n options: WrapOpenAIOptions = {},\r\n): WrappedOpenAI {\r\n if (!client) {\r\n throw new UsageTapError(\"USAGETAP_BAD_REQUEST\", \"wrapOpenAI requires an OpenAI client instance\");\r\n }\r\n\r\n const defaultContext = options.defaultContext;\r\n const applyVendorHints = options.applyVendorHints !== false;\r\n\r\n const proxiedChat = client.chat\r\n ? createChatProxy(client.chat, usageTap, defaultContext, applyVendorHints)\r\n : undefined;\r\n\r\n const proxiedResponses = typeof client.responses !== \"undefined\"\r\n ? createResponsesProxy(client.responses, usageTap, defaultContext, applyVendorHints)\r\n : undefined;\r\n\r\n const handler: ProxyHandler<OpenAI> = {\r\n get(target, prop, receiver) {\r\n if (prop === \"chat\" && proxiedChat) {\r\n return proxiedChat;\r\n }\r\n\r\n if (prop === \"responses\" && typeof target.responses !== \"undefined\") {\r\n return proxiedResponses ?? (Reflect.get(target as object, prop, receiver) as unknown);\r\n }\r\n\r\n if (prop === \"toNextResponse\") {\r\n return toNextResponse;\r\n }\r\n\r\n if (prop === \"pipeToResponse\") {\r\n return pipeToResponse;\r\n }\r\n\r\n if (prop === \"unwrap\") {\r\n return () => target;\r\n }\r\n\r\n return Reflect.get(target as object, prop, receiver) as unknown;\r\n },\r\n };\r\n\r\n return new Proxy(client, handler) as WrappedOpenAI;\r\n}\r\n\r\nexport function streamOpenAIRoute(\r\n usageTap: UsageTapClient,\r\n openai: OpenAI,\r\n options: StreamOpenAIRouteOptions,\r\n): (req: Request) => Promise<Response> {\r\n if (!options?.getRequest) {\r\n throw new UsageTapError(\"USAGETAP_BAD_REQUEST\", \"streamOpenAIRoute requires a getRequest function\");\r\n }\r\n\r\n const wrapConfig: WrapOpenAIOptions | undefined = options.wrapOptions || options.defaultContext\r\n ? {\r\n ...(options.wrapOptions ?? {}),\r\n defaultContext: options.defaultContext ?? options.wrapOptions?.defaultContext,\r\n }\r\n : undefined;\r\n\r\n const wrappedClient = wrapConfig\r\n ? wrapOpenAI(openai, usageTap, wrapConfig)\r\n : wrapOpenAI(openai, usageTap);\r\n\r\n return async (req: Request): Promise<Response> => {\r\n const requestConfig = await options.getRequest(req);\r\n const mergedParams: ChatCompletionCreateParams = {\r\n ...requestConfig.params,\r\n stream: true,\r\n };\r\n\r\n const callOptions: Partial<WrapOpenAICallOptions> = {};\r\n if (requestConfig.usageTap) {\r\n callOptions.usageTap = requestConfig.usageTap;\r\n }\r\n if (requestConfig.withUsage) {\r\n callOptions.withUsage = requestConfig.withUsage;\r\n }\r\n\r\n const stream = await wrappedClient.chat.completions.create(\r\n mergedParams,\r\n Object.keys(callOptions).length ? (callOptions as WrapOpenAICallOptions) : undefined,\r\n );\r\n\r\n const baseResponse = toNextResponse(stream as UsageTapStream<unknown>, {\r\n mode: options.stream?.mode ?? \"sse\",\r\n headers: options.stream?.headers,\r\n });\r\n\r\n const init = options.stream?.responseInit;\r\n if (!init) {\r\n return baseResponse;\r\n }\r\n\r\n const mergedHeaders = new Headers(baseResponse.headers);\r\n if (init.headers) {\r\n const extra = normalizeHeaders(init.headers);\r\n for (const [key, value] of Object.entries(extra)) {\r\n mergedHeaders.set(key, value);\r\n }\r\n }\r\n\r\n return new Response(baseResponse.body, {\r\n status: init.status ?? baseResponse.status,\r\n statusText: init.statusText ?? baseResponse.statusText,\r\n headers: mergedHeaders,\r\n });\r\n };\r\n}\r\n\r\nexport interface NodeResponseLike {\r\n write(chunk: string | Uint8Array | Buffer): unknown;\r\n end(chunk?: string | Uint8Array | Buffer): unknown;\r\n setHeader?(name: string, value: string): void;\r\n headersSent?: boolean;\r\n statusCode?: number;\r\n status?(code: number): void;\r\n flush?(): void;\r\n}\r\n\r\nfunction createChatProxy(\r\n resource: OpenAI[\"chat\"],\r\n usageTap: UsageTapClient,\r\n defaultContext: Partial<WrapOpenAIContext> | undefined,\r\n applyVendorHints: boolean,\r\n): ReplaceProperty<OpenAI[\"chat\"], \"completions\", WrappedChatCompletions> {\r\n const completions = createChatCompletionsProxy(\r\n resource.completions,\r\n usageTap,\r\n defaultContext,\r\n applyVendorHints,\r\n );\r\n\r\n const handler: ProxyHandler<OpenAI[\"chat\"]> = {\r\n get(target, prop, receiver) {\r\n if (prop === \"completions\") {\r\n return completions;\r\n }\r\n return Reflect.get(target as object, prop, receiver) as unknown;\r\n },\r\n };\r\n\r\n return new Proxy(resource, handler) as ReplaceProperty<OpenAI[\"chat\"], \"completions\", WrappedChatCompletions>;\r\n}\r\n\r\nfunction createResponsesProxy(\r\n resource: ResponsesResource,\r\n usageTap: UsageTapClient,\r\n defaultContext: Partial<WrapOpenAIContext> | undefined,\r\n applyVendorHints: boolean,\r\n): WrappedResponses | undefined {\r\n if (!resource || typeof resource !== \"object\") {\r\n return undefined;\r\n }\r\n\r\n if (!(\"create\" in resource) || typeof (resource as { create?: unknown }).create !== \"function\") {\r\n return resource as unknown as WrappedResponses;\r\n }\r\n\r\n const originalCreate = (resource as { create: (...args: unknown[]) => unknown }).create.bind(resource);\r\n\r\n const wrappedCreate = (\r\n params: ResponsesCreateParams,\r\n options?: WrapOpenAIResponseCallOptions,\r\n ): ResponsesCreateReturn => {\r\n const { requestOptions, usageContext, withUsage } = splitUsageOptions(options);\r\n const beginRequest = resolveBeginRequest(defaultContext, usageContext);\r\n const wantsStream = isStreamingRequest(params);\r\n\r\n return usageTap.withUsage(beginRequest, (ctx) => {\r\n const finalParams = applyVendorHints\r\n ? applyResponsesVendorHints(params, ctx.begin.data.vendorHints)\r\n : params;\r\n const request = attachCorrelationHeader(requestOptions, ctx.begin.correlationId) as ResponsesCreateOptions;\r\n\r\n if (wantsStream) {\r\n const apiPromise = originalCreate(finalParams, request);\r\n const wrappedPromise = transformApiPromise(apiPromise, (rawStream) => {\r\n ensureAsyncIterable(rawStream, \"responses.create\");\r\n const wrappedStream = wrapStreamForUsageTap(rawStream, async () => {\r\n const usage = await extractUsageFromStream(rawStream, ctx.begin.data.vendorHints);\r\n if (usage) {\r\n ctx.setUsage(usage);\r\n }\r\n }, ctx);\r\n return wrappedStream;\r\n });\r\n\r\n return wrappedPromise as unknown as ResponsesCreateReturn;\r\n }\r\n\r\n const apiPromise = originalCreate(finalParams, request);\r\n const wrappedPromise = transformApiPromise(apiPromise, (response) => {\r\n tryInferUsage(response, ctx.begin.data.vendorHints, undefined, ctx);\r\n return response;\r\n });\r\n return wrappedPromise as unknown as ResponsesCreateReturn;\r\n }, withUsage) as ResponsesCreateReturn;\r\n };\r\n\r\n const handler: ProxyHandler<object> = {\r\n get(target, prop, receiver) {\r\n if (prop === \"create\") {\r\n return wrappedCreate;\r\n }\r\n return Reflect.get(target, prop, receiver) as unknown;\r\n },\r\n };\r\n\r\n return new Proxy(resource as object, handler) as WrappedResponses;\r\n}\r\n\r\nfunction createChatCompletionsProxy(\r\n resource: ChatCompletionsResource,\r\n usageTap: UsageTapClient,\r\n defaultContext: Partial<WrapOpenAIContext> | undefined,\r\n applyVendorHints: boolean,\r\n): WrappedChatCompletions {\r\n const originalCreate = resource.create.bind(resource);\r\n const streamCandidate = (resource as { stream?: unknown }).stream;\r\n const originalStream = typeof streamCandidate === \"function\"\r\n ? (streamCandidate as (...args: unknown[]) => unknown).bind(resource)\r\n : undefined;\r\n\r\n const wrappedCreate = (\r\n params: ChatCompletionCreateParams,\r\n options?: WrapOpenAICallOptions,\r\n ): ChatCompletionCreateReturn => {\r\n const { requestOptions, usageContext, withUsage } = splitUsageOptions(options);\r\n const beginRequest = resolveBeginRequest(defaultContext, usageContext);\r\n const wantsStream = isStreamingRequest(params);\r\n\r\n return usageTap.withUsage(beginRequest, (ctx) => {\r\n const finalParams = applyVendorHints\r\n ? applyChatVendorHints(params, ctx.begin.data.vendorHints)\r\n : params;\r\n const request = attachCorrelationHeader(requestOptions, ctx.begin.correlationId) as ChatCompletionCreateOptions;\r\n\r\n if (wantsStream) {\r\n const apiPromise = originalCreate(finalParams, request);\r\n const wrappedPromise = transformApiPromise(apiPromise, (rawStream) => {\r\n ensureAsyncIterable(rawStream, \"chat.completions.create\");\r\n const wrappedStream = wrapStreamForUsageTap(rawStream, async () => {\r\n const usage = await extractUsageFromStream(rawStream, ctx.begin.data.vendorHints);\r\n if (usage) {\r\n ctx.setUsage(usage);\r\n }\r\n }, ctx);\r\n return wrappedStream;\r\n });\r\n\r\n return wrappedPromise as unknown as ChatCompletionCreateReturn;\r\n }\r\n\r\n const apiPromise = originalCreate(finalParams, request);\r\n const wrappedPromise = transformApiPromise(apiPromise, (response) => {\r\n tryInferUsage(response, ctx.begin.data.vendorHints, undefined, ctx);\r\n return response;\r\n });\r\n return wrappedPromise as unknown as ChatCompletionCreateReturn;\r\n }, withUsage) as ChatCompletionCreateReturn;\r\n };\r\n\r\n const wrappedStream = originalStream\r\n ? (\r\n params: ChatCompletionCreateParams,\r\n options?: WrapOpenAICallOptions,\r\n ): ChatCompletionCreateReturn => {\r\n const { requestOptions, usageContext, withUsage } = splitUsageOptions(options);\r\n const beginRequest = resolveBeginRequest(defaultContext, usageContext);\r\n\r\n return usageTap.withUsage(beginRequest, (ctx) => {\r\n const finalParams = applyVendorHints\r\n ? applyChatVendorHints(params, ctx.begin.data.vendorHints)\r\n : params;\r\n const request = attachCorrelationHeader(requestOptions, ctx.begin.correlationId) as ChatCompletionCreateOptions;\r\n\r\n const apiPromise = originalStream(finalParams, request);\r\n const wrappedPromise = transformApiPromise(apiPromise, (rawStream) => {\r\n ensureAsyncIterable(rawStream, \"chat.completions.stream\");\r\n const wrappedStreamInner = wrapStreamForUsageTap(rawStream, async () => {\r\n const usage = await extractUsageFromStream(rawStream, ctx.begin.data.vendorHints);\r\n if (usage) {\r\n ctx.setUsage(usage);\r\n }\r\n }, ctx);\r\n return wrappedStreamInner;\r\n });\r\n\r\n return wrappedPromise as unknown as ChatCompletionCreateReturn;\r\n }, withUsage) as ChatCompletionCreateReturn;\r\n }\r\n : undefined;\r\n\r\n const handler: ProxyHandler<ChatCompletionsResource> = {\r\n get(target, prop, receiver) {\r\n if (prop === \"create\") {\r\n return wrappedCreate;\r\n }\r\n\r\n if (prop === \"stream\" && wrappedStream) {\r\n return wrappedStream;\r\n }\r\n\r\n return Reflect.get(target as object, prop, receiver) as unknown;\r\n },\r\n };\r\n\r\n return new Proxy(resource, handler) as unknown as WrappedChatCompletions;\r\n}\r\n\r\ninterface SplitUsageOptionsResult {\r\n requestOptions?: Record<string, unknown>;\r\n usageContext?: Partial<WrapOpenAIContext>;\r\n withUsage?: WithUsageOptions;\r\n}\r\n\r\nfunction splitUsageOptions(options: unknown): SplitUsageOptionsResult {\r\n if (!options || typeof options !== \"object\") {\r\n return {};\r\n }\r\n\r\n const { usageTap, withUsage, ...rest } = options as {\r\n usageTap?: Partial<WrapOpenAIContext>;\r\n withUsage?: WithUsageOptions;\r\n } & Record<string, unknown>;\r\n\r\n const requestOptions = Object.keys(rest).length ? cloneRequestOptions(rest) : undefined;\r\n\r\n return {\r\n requestOptions,\r\n usageContext: usageTap,\r\n withUsage,\r\n } satisfies SplitUsageOptionsResult;\r\n}\r\n\r\nfunction resolveBeginRequest(\r\n defaults: Partial<WrapOpenAIContext> | undefined,\r\n override: Partial<WrapOpenAIContext> | undefined,\r\n): BeginCallRequest {\r\n const base = defaults ?? {};\r\n const current = override ?? {};\r\n const customerId = current.customerId ?? base.customerId;\r\n\r\n if (!customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"wrapOpenAI requires usageTap.customerId (provide defaultContext or options.usageTap)\",\r\n );\r\n }\r\n\r\n const tags = mergeTags(base.tags, current.tags);\r\n const begin: BeginCallRequest = { customerId } satisfies BeginCallRequest;\r\n\r\n const requested = current.requested ?? base.requested;\r\n if (requested) begin.requested = requested;\r\n\r\n const feature = current.feature ?? base.feature;\r\n if (feature) begin.feature = feature;\r\n\r\n const idempotency = current.idempotency ?? base.idempotency;\r\n if (idempotency) begin.idempotency = idempotency;\r\n\r\n const customerName = current.customerName ?? base.customerName;\r\n if (customerName) begin.customerName = customerName;\r\n\r\n const customerEmail = current.customerEmail ?? base.customerEmail;\r\n if (customerEmail) begin.customerEmail = customerEmail;\r\n\r\n if (tags?.length) {\r\n begin.tags = tags;\r\n }\r\n\r\n return begin;\r\n}\r\n\r\ntype PromiseLikeOrValue<T> = PromiseLike<T> | T;\r\n\r\nfunction transformApiPromise<TValue, TResult>(\r\n apiPromise: PromiseLikeOrValue<TValue>,\r\n onResolve: (value: TValue) => PromiseLike<TResult> | TResult,\r\n): Promise<TResult> {\r\n const resolvedPromise = Promise.resolve(apiPromise).then(onResolve);\r\n\r\n if (isObjectRecord(apiPromise)) {\r\n const proto = Object.getPrototypeOf(apiPromise) as object | null;\r\n if (proto) {\r\n Object.setPrototypeOf(resolvedPromise, proto);\r\n }\r\n\r\n for (const key of Reflect.ownKeys(apiPromise)) {\r\n if (key === \"then\" || key === \"catch\" || key === \"finally\") {\r\n continue;\r\n }\r\n\r\n try {\r\n const descriptor = Object.getOwnPropertyDescriptor(apiPromise, key);\r\n if (descriptor) {\r\n Reflect.defineProperty(resolvedPromise, key, descriptor);\r\n }\r\n } catch {\r\n /* ignore non-configurable properties */\r\n }\r\n }\r\n }\r\n\r\n return resolvedPromise;\r\n}\r\n\r\nfunction isObjectRecord(value: unknown): value is Record<PropertyKey, unknown> {\r\n return typeof value === \"object\" && value !== null;\r\n}\r\n\r\nfunction cloneRecord(value: unknown): Record<string, unknown> {\r\n return isObjectRecord(value) ? { ...(value as Record<string, unknown>) } : {};\r\n}\r\n\r\nfunction isStringTuple(value: unknown): value is [string, string] {\r\n return Array.isArray(value) && value.length >= 2 && typeof value[0] === \"string\" && typeof value[1] === \"string\";\r\n}\r\n\r\nfunction cloneRequestOptions(source: Record<string, unknown>): Record<string, unknown> {\r\n const clone: Record<string, unknown> = { ...source };\r\n\r\n if (\"headers\" in clone) {\r\n clone.headers = normalizeHeaders((clone as { headers?: unknown }).headers);\r\n }\r\n\r\n return clone;\r\n}\r\n\r\nfunction attachCorrelationHeader(\r\n options: Record<string, unknown> | undefined,\r\n correlationId: string,\r\n): Record<string, unknown> | undefined {\r\n const normalized = normalizeHeaders(options?.headers);\r\n\r\n if (correlationId && !normalized[USAGETAP_CORRELATION_HEADER]) {\r\n normalized[USAGETAP_CORRELATION_HEADER] = correlationId;\r\n }\r\n\r\n if (!options) {\r\n return Object.keys(normalized).length\r\n ? ({ headers: normalized } satisfies Record<string, unknown>)\r\n : undefined;\r\n }\r\n\r\n const next = { ...options } satisfies Record<string, unknown>;\r\n if (Object.keys(normalized).length) {\r\n next.headers = normalized;\r\n }\r\n return next;\r\n}\r\n\r\nfunction normalizeHeaders(headers: unknown): Record<string, string> {\r\n if (!headers) {\r\n return {};\r\n }\r\n\r\n if (headers instanceof Headers) {\r\n const result: Record<string, string> = {};\r\n headers.forEach((value, key) => {\r\n result[key.toLowerCase()] = value;\r\n });\r\n return result;\r\n }\r\n\r\n if (Array.isArray(headers)) {\r\n const result: Record<string, string> = {};\r\n for (const entry of headers) {\r\n if (!isStringTuple(entry)) {\r\n continue;\r\n }\r\n const [key, value] = entry;\r\n result[key.toLowerCase()] = value;\r\n }\r\n return result;\r\n }\r\n\r\n if (isObjectRecord(headers)) {\r\n const result: Record<string, string> = {};\r\n const record = headers as Record<string, unknown>;\r\n for (const key of Object.keys(record)) {\r\n const value = record[key];\r\n if (value !== undefined && value !== null) {\r\n result[key.toLowerCase()] = String(value);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n return {};\r\n}\r\n\r\nfunction mergeTags(a?: string[], b?: string[]): string[] | undefined {\r\n const values = [...(a ?? []), ...(b ?? [])]\r\n .map((value) => (typeof value === \"string\" ? value.trim() : \"\"))\r\n .filter(Boolean);\r\n\r\n if (!values.length) {\r\n return undefined;\r\n }\r\n\r\n return dedupeStrings(values);\r\n}\r\n\r\nfunction dedupeStrings(values: string[]): string[] {\r\n return Array.from(new Set(values));\r\n}\r\n\r\nfunction isStreamingRequest(params: unknown): boolean {\r\n if (!params || typeof params !== \"object\") {\r\n return false;\r\n }\r\n\r\n const stream = (params as { stream?: unknown }).stream;\r\n if (typeof stream === \"boolean\") {\r\n return stream;\r\n }\r\n\r\n return stream != null;\r\n}\r\n\r\nfunction applyChatVendorHints(\r\n params: ChatCompletionCreateParams,\r\n hints: VendorHints | undefined,\r\n): ChatCompletionCreateParams {\r\n if (!hints) {\r\n return params;\r\n }\r\n\r\n const next = cloneRecord(params);\r\n\r\n if (hints.preferredModel && (next.model === undefined || next.model === null)) {\r\n next.model = hints.preferredModel;\r\n }\r\n\r\n if (typeof hints.maxResponseTokens === \"number\" && next.max_tokens == null) {\r\n next.max_tokens = hints.maxResponseTokens;\r\n }\r\n\r\n if (typeof hints.maxInputTokens === \"number\" && (next as { max_input_tokens?: unknown }).max_input_tokens == null) {\r\n (next as { max_input_tokens?: number }).max_input_tokens = hints.maxInputTokens;\r\n }\r\n\r\n return next as unknown as ChatCompletionCreateParams;\r\n}\r\n\r\nfunction applyResponsesVendorHints(\r\n params: ResponsesCreateParams,\r\n hints: VendorHints | undefined,\r\n): ResponsesCreateParams {\r\n if (!hints) {\r\n return params;\r\n }\r\n\r\n const next = cloneRecord(params);\r\n\r\n if (hints.preferredModel && (next.model === undefined || next.model === null)) {\r\n next.model = hints.preferredModel;\r\n }\r\n\r\n if (typeof hints.maxResponseTokens === \"number\" && (next as { max_output_tokens?: unknown }).max_output_tokens == null) {\r\n (next as { max_output_tokens?: number }).max_output_tokens = hints.maxResponseTokens;\r\n }\r\n\r\n return next as unknown as ResponsesCreateParams;\r\n}\r\n\r\nasync function extractUsageFromStream(\r\n stream: unknown,\r\n hints: VendorHints | undefined,\r\n): Promise<Partial<Omit<EndCallRequest, \"callId\" | \"error\">> | undefined> {\r\n const finalPayload = await resolveStreamFinalPayload(stream);\r\n if (!finalPayload) {\r\n return undefined;\r\n }\r\n\r\n return inferUsageFromResponse(finalPayload, hints);\r\n}\r\n\r\nasync function resolveStreamFinalPayload(stream: unknown): Promise<unknown> {\r\n if (!stream || typeof stream !== \"object\") {\r\n return undefined;\r\n }\r\n\r\n const candidate = stream as {\r\n finalChatCompletion?: () => Promise<unknown>;\r\n finalCompletion?: () => Promise<unknown>;\r\n finalResponse?: () => Promise<unknown>;\r\n finalContent?: () => Promise<unknown>;\r\n };\r\n\r\n if (typeof candidate.finalChatCompletion === \"function\") {\r\n return candidate.finalChatCompletion();\r\n }\r\n\r\n if (typeof candidate.finalResponse === \"function\") {\r\n return candidate.finalResponse();\r\n }\r\n\r\n if (typeof candidate.finalCompletion === \"function\") {\r\n return candidate.finalCompletion();\r\n }\r\n\r\n if (typeof candidate.finalContent === \"function\") {\r\n return candidate.finalContent();\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction ensureAsyncIterable(value: unknown, label: string): asserts value is AsyncIterable<unknown> {\r\n if (!value || typeof value !== \"object\" || typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] !== \"function\") {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n `${label} expected an async iterable stream but received ${typeof value}`,\r\n );\r\n }\r\n}\r\n\r\nfunction chunkToText(chunk: unknown): string {\r\n if (chunk === undefined || chunk === null) {\r\n return \"\";\r\n }\r\n\r\n if (typeof chunk === \"string\") {\r\n return chunk;\r\n }\r\n\r\n if (typeof chunk === \"object\") {\r\n const candidate = chunk as {\r\n choices?: Array<{\r\n delta?: {\r\n content?: string | Array<{ text?: string }>;\r\n };\r\n }>;\r\n content?: string;\r\n };\r\n\r\n const delta = candidate.choices?.[0]?.delta;\r\n const content = delta?.content ?? candidate.content;\r\n\r\n if (typeof content === \"string\") {\r\n return content;\r\n }\r\n\r\n if (Array.isArray(content)) {\r\n return content\r\n .map((entry) => {\r\n if (!entry) return \"\";\r\n if (typeof entry === \"string\") return entry;\r\n if (typeof entry.text === \"string\") return entry.text;\r\n return \"\";\r\n })\r\n .join(\"\");\r\n }\r\n }\r\n\r\n return String(chunk);\r\n}\r\n\r\nfunction formatSsePayload(\r\n text: string,\r\n options: StreamToResponseOptions[\"sse\"],\r\n): string {\r\n if (!text) {\r\n return \"\";\r\n }\r\n\r\n const lines = text.split(/\\r?\\n/);\r\n const eventLine = options?.event ? `event: ${options.event}\\n` : \"\";\r\n const retryLine = options?.retry ? `retry: ${options.retry}\\n` : \"\";\r\n const dataLines = lines.map((line) => `data: ${line}`).join(\"\\n\");\r\n return `${eventLine}${retryLine}${dataLines}\\n\\n`;\r\n}\r\n\r\nfunction setHeaderIfPossible(res: NodeResponseLike, key: string, value: string): void {\r\n if (typeof res.setHeader === \"function\" && res.headersSent !== true) {\r\n res.setHeader(key, value);\r\n }\r\n}\r\n\r\nfunction tryInferUsage<TResponse>(\r\n response: TResponse,\r\n hints: VendorHints | undefined,\r\n extractor: OpenAIInvokeParams<TResponse>[\"extractUsage\"],\r\n ctx: WithUsageContext,\r\n): void {\r\n const explicit = extractor?.(response);\r\n const inferred = explicit ?? inferUsageFromResponse(response, hints);\r\n\r\n if (inferred) {\r\n ctx.setUsage(inferred);\r\n }\r\n}\r\n\r\nfunction inferUsageFromResponse(\r\n response: unknown,\r\n hints: VendorHints | undefined,\r\n): Partial<Omit<EndCallRequest, \"callId\" | \"error\">> | undefined {\r\n if (!response || typeof response !== \"object\") {\r\n return undefined;\r\n }\r\n\r\n const candidate = response as {\r\n usage?: {\r\n prompt_tokens?: number;\r\n completion_tokens?: number;\r\n total_tokens?: number;\r\n cached_tokens?: number;\r\n prompt_tokens_details?: {\r\n cached_tokens?: number;\r\n };\r\n };\r\n model?: string;\r\n };\r\n\r\n if (!candidate.usage) {\r\n return undefined;\r\n }\r\n\r\n const cachedInputTokens =\r\n candidate.usage.prompt_tokens_details?.cached_tokens ??\r\n candidate.usage.cached_tokens;\r\n\r\n return {\r\n modelUsed: candidate.model ?? hints?.preferredModel,\r\n inputTokens: candidate.usage.prompt_tokens,\r\n responseTokens: candidate.usage.completion_tokens,\r\n cachedInputTokens,\r\n } satisfies Partial<Omit<EndCallRequest, \"callId\" | \"error\">>;\r\n}\r\n\r\nfunction wrapStreamForUsageTap<TStream>(\r\n source: UsageTapStream<TStream> | AsyncIterable<TStream>,\r\n finalize: () => Promise<void> | void,\r\n ctx: WithUsageContext,\r\n): AsyncIterable<TStream> & { __usageTapFinalize: () => Promise<void> } {\r\n const getIterator = source[Symbol.asyncIterator];\r\n if (typeof getIterator !== \"function\") {\r\n throw new TypeError(\"Stream is not async iterable\");\r\n }\r\n\r\n const iterator = getIterator.call(source) as AsyncIterator<TStream>;\r\n let completed = false;\r\n\r\n const invokeFinalize = async (): Promise<void> => {\r\n if (completed) return;\r\n completed = true;\r\n try {\r\n await finalize();\r\n } catch (error) {\r\n ctx.setError({\r\n code: \"USAGE_FINALIZE_ERROR\",\r\n message: error instanceof Error ? error.message : String(error),\r\n });\r\n throw error;\r\n }\r\n };\r\n\r\n const prototype = (Object.getPrototypeOf(source as object) as object | null) ?? Object.prototype;\r\n const wrapped = Object.create(prototype) as unknown as UsageTapIterableIterator<TStream>;\r\n\r\n for (const key of Reflect.ownKeys(source as object)) {\r\n try {\r\n const descriptor = Object.getOwnPropertyDescriptor(source as object, key);\r\n if (descriptor) {\r\n Object.defineProperty(wrapped, key, descriptor);\r\n }\r\n } catch {\r\n /* ignore non-configurable properties */\r\n }\r\n }\r\n\r\n Object.defineProperty(wrapped, Symbol.asyncIterator, {\r\n value(): UsageTapIterableIterator<TStream> {\r\n return this as UsageTapIterableIterator<TStream>;\r\n },\r\n configurable: true,\r\n });\r\n\r\n Object.defineProperty(wrapped, \"next\", {\r\n value: async (...args: Parameters<AsyncIterator<TStream>[\"next\"]>): Promise<IteratorResult<TStream>> => {\r\n try {\r\n const result = await iterator.next(...args);\r\n if (result.done) {\r\n await invokeFinalize();\r\n }\r\n return result;\r\n } catch (error) {\r\n await invokeFinalize().catch(() => undefined);\r\n throw error;\r\n }\r\n },\r\n configurable: true,\r\n writable: true,\r\n });\r\n\r\n Object.defineProperty(wrapped, \"return\", {\r\n value: async (value?: TStream): Promise<IteratorResult<TStream>> => {\r\n if (typeof iterator.return === \"function\") {\r\n const rawResult: unknown = await iterator.return(value);\r\n if (!isIteratorResult<TStream>(rawResult)) {\r\n throw new TypeError(\"Iterator.return() returned an invalid result\");\r\n }\r\n await invokeFinalize();\r\n return rawResult;\r\n }\r\n await invokeFinalize();\r\n return { done: true, value } as IteratorResult<TStream>;\r\n },\r\n configurable: true,\r\n writable: true,\r\n });\r\n\r\n Object.defineProperty(wrapped, \"throw\", {\r\n value: async (error?: unknown): Promise<IteratorResult<TStream>> => {\r\n if (typeof iterator.throw === \"function\") {\r\n const rawResult: unknown = await iterator.throw(error);\r\n if (!isIteratorResult<TStream>(rawResult)) {\r\n throw new TypeError(\"Iterator.throw() returned an invalid result\");\r\n }\r\n await invokeFinalize();\r\n return rawResult;\r\n }\r\n await invokeFinalize();\r\n throw error;\r\n },\r\n configurable: true,\r\n writable: true,\r\n });\r\n\r\n Object.defineProperty(wrapped, \"__usageTapFinalize\", {\r\n value: async (): Promise<void> => {\r\n await invokeFinalize();\r\n },\r\n configurable: true,\r\n });\r\n\r\n return wrapped;\r\n}\r\n\r\nfunction isIteratorResult<T>(value: unknown): value is IteratorResult<T> {\r\n return isObjectRecord(value) && \"done\" in value;\r\n}\r\n"]}
@@ -1,5 +1,5 @@
1
1
  import OpenAI from 'openai';
2
- import { B as BeginCallRequest, U as UsageTapClient, W as WithUsageOptions, V as VendorHints, a as UsageTapSuccessResponse, b as BeginCallResponseBody, E as EndCallRequest } from '../client-DokYK2Gv.cjs';
2
+ import { B as BeginCallRequest, U as UsageTapClient, W as WithUsageOptions, V as VendorHints, a as UsageTapSuccessResponse, b as BeginCallResponseBody, E as EndCallRequest } from '../client-CuzjFxMn.cjs';
3
3
 
4
4
  interface OpenAIAdapterInit {
5
5
  client: OpenAI;
@@ -1,5 +1,5 @@
1
1
  import OpenAI from 'openai';
2
- import { B as BeginCallRequest, U as UsageTapClient, W as WithUsageOptions, V as VendorHints, a as UsageTapSuccessResponse, b as BeginCallResponseBody, E as EndCallRequest } from '../client-DokYK2Gv.js';
2
+ import { B as BeginCallRequest, U as UsageTapClient, W as WithUsageOptions, V as VendorHints, a as UsageTapSuccessResponse, b as BeginCallResponseBody, E as EndCallRequest } from '../client-CuzjFxMn.js';
3
3
 
4
4
  interface OpenAIAdapterInit {
5
5
  client: OpenAI;
@@ -654,11 +654,12 @@ function inferUsageFromResponse(response, hints) {
654
654
  if (!candidate.usage) {
655
655
  return void 0;
656
656
  }
657
+ const cachedInputTokens = candidate.usage.prompt_tokens_details?.cached_tokens ?? candidate.usage.cached_tokens;
657
658
  return {
658
659
  modelUsed: candidate.model ?? hints?.preferredModel,
659
660
  inputTokens: candidate.usage.prompt_tokens,
660
661
  responseTokens: candidate.usage.completion_tokens,
661
- cachedTokens: candidate.usage.cached_tokens
662
+ cachedInputTokens
662
663
  };
663
664
  }
664
665
  function wrapStreamForUsageTap(source, finalize, ctx) {