@usagetap/sdk 0.3.0 → 0.4.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/idempotency.ts","../src/retry.ts","../src/client.ts","../src/adapters/openai.ts","../src/adapters/openrouter.ts","../src/adapters/fetch-wrapper.ts","../src/adapters/express-middleware.ts"],"names":["withUsage","apiPromise","wrappedPromise","wrappedStream","dedupeStrings"],"mappings":"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","file":"index.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","export function createIdempotencyKey(): string {\r\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\r\n return globalThis.crypto.randomUUID();\r\n }\r\n\r\n const random = (): string => Math.random().toString(16).slice(2, 10);\r\n return `${random()}-${random()}`;\r\n}\r\n","import type { RetryOptions } from \"./types\";\r\n\r\nexport interface ResolvedRetryOptions {\r\n maxAttempts: number;\r\n baseDelayMs: number;\r\n maxDelayMs: number;\r\n jitterRatio: number;\r\n}\r\n\r\nconst DEFAULTS: ResolvedRetryOptions = {\r\n maxAttempts: 3,\r\n baseDelayMs: 250,\r\n maxDelayMs: 5000,\r\n jitterRatio: 0.2,\r\n};\r\n\r\nexport function resolveRetryOptions(\r\n base?: RetryOptions,\r\n override?: RetryOptions,\r\n): ResolvedRetryOptions {\r\n const merged = { ...DEFAULTS, ...base, ...override } satisfies ResolvedRetryOptions;\r\n return {\r\n maxAttempts: Math.max(1, Math.floor(merged.maxAttempts)),\r\n baseDelayMs: Math.max(0, merged.baseDelayMs),\r\n maxDelayMs: Math.max(merged.baseDelayMs, merged.maxDelayMs),\r\n jitterRatio: Math.min(Math.max(merged.jitterRatio, 0), 1),\r\n };\r\n}\r\n\r\nexport async function sleep(delayMs: number, signal?: AbortSignal): Promise<void> {\r\n if (delayMs <= 0) {\r\n signal?.throwIfAborted?.();\r\n return;\r\n }\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n cleanup();\r\n resolve();\r\n }, delayMs);\r\n\r\n const cleanup = (): void => {\r\n clearTimeout(timer);\r\n signal?.removeEventListener(\"abort\", onAbort);\r\n };\r\n\r\n const onAbort = (): void => {\r\n cleanup();\r\n const abortError = new Error(\"Aborted\");\r\n abortError.name = \"AbortError\";\r\n reject(abortError);\r\n };\r\n\r\n if (signal) {\r\n if (signal.aborted) {\r\n onAbort();\r\n return;\r\n }\r\n signal.addEventListener(\"abort\", onAbort, { once: true });\r\n }\r\n });\r\n}\r\n\r\nexport function computeDelay(attempt: number, options: ResolvedRetryOptions): number {\r\n const exp = options.baseDelayMs * Math.pow(2, attempt - 1);\r\n const capped = Math.min(exp, options.maxDelayMs);\r\n const jitter = capped * options.jitterRatio;\r\n const min = capped - jitter;\r\n const max = capped + jitter;\r\n return Math.max(0, Math.random() * (max - min) + min);\r\n}\r\n\r\nexport async function runWithRetry<T>(\r\n operation: (attempt: number) => Promise<T>,\r\n options: ResolvedRetryOptions,\r\n shouldRetry: (error: unknown) => boolean,\r\n onSchedule?: (attempt: number, delayMs: number, error: unknown) => void,\r\n signal?: AbortSignal,\r\n): Promise<T> {\r\n let attempt = 0;\r\n let lastError: unknown;\r\n while (attempt < options.maxAttempts) {\r\n attempt += 1;\r\n signal?.throwIfAborted?.();\r\n\r\n try {\r\n return await operation(attempt);\r\n } catch (error) {\r\n lastError = error;\r\n if (attempt >= options.maxAttempts || !shouldRetry(error)) {\r\n throw error;\r\n }\r\n const delayMs = computeDelay(attempt, options);\r\n onSchedule?.(attempt, delayMs, error);\r\n await sleep(delayMs, signal);\r\n }\r\n }\r\n\r\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\r\n}\r\n","import type {\r\n BeginCallOptions,\r\n BeginCallRequest,\r\n BeginCallResponseBody,\r\n CreateCustomerOptions,\r\n CreateCustomerRequest,\r\n CreateCustomerResponseBody,\r\n CheckUsageOptions,\r\n CheckUsageRequest,\r\n CheckUsageResponseBody,\r\n EndCallOptions,\r\n EndCallRequest,\r\n EndCallResponseBody,\r\n UsageTapClientOptions,\r\n UsageTapLogEntry,\r\n UsageTapSuccessResponse,\r\n WithUsageContext,\r\n WithUsageOptions,\r\n} from \"./types\";\r\nimport {\r\n UsageTapError,\r\n type UsageTapErrorCode,\r\n isUsageTapError,\r\n} from \"./errors\";\r\nimport { createIdempotencyKey } from \"./idempotency\";\r\nimport {\r\n runWithRetry,\r\n resolveRetryOptions,\r\n type ResolvedRetryOptions,\r\n} from \"./retry\";\r\nimport type { RetryOptions } from \"./types\";\r\n\r\nconst CALL_BEGIN_PATH = \"call_begin\";\r\nconst CALL_END_PATH = \"call_end\";\r\nconst CHECK_USAGE_PATH = \"customers/{customerId}/usage\";\r\nconst CREATE_CUSTOMER_PATH = \"customers\";\r\nconst AUTH_HEADER = \"authorization\";\r\nconst API_KEY_HEADER = \"x-api-key\";\r\nconst CORRELATION_HEADER = \"x-usage-correlation-id\";\r\nconst IDEMPOTENCY_HEADER = \"idempotency-key\";\r\nconst SDK_HEADER = \"x-usage-sdk\";\r\nconst USER_AGENT = \"UsageTapClient\";\r\nconst CANONICAL_MEDIA_TYPE = \"application/vnd.usagetap.v1+json\";\r\n\r\ndeclare const __SDK_VERSION__: string | undefined;\r\nconst SDK_VERSION =\r\n typeof __SDK_VERSION__ === \"string\" ? __SDK_VERSION__ : \"0.1.0\";\r\nconst HAS_WINDOW =\r\n typeof globalThis !== \"undefined\" &&\r\n typeof (globalThis as Record<string, unknown>).window !== \"undefined\";\r\n\r\ntype HeadersDict = Record<string, string>;\r\n\r\ntype InternalRequestOptions = {\r\n signal?: AbortSignal;\r\n headers?: HeadersDict;\r\n retries?: RetryOptions;\r\n correlationId?: string;\r\n idempotencyKey?: string;\r\n};\r\n\r\ntype EnvelopeShape = {\r\n result?: {\r\n status?: string;\r\n code?: string;\r\n message?: string;\r\n timestamp?: string;\r\n };\r\n data?: unknown;\r\n error?: {\r\n code?: string;\r\n message?: string;\r\n details?: Record<string, unknown>;\r\n };\r\n correlationId?: string;\r\n};\r\n\r\nexport class UsageTapClient {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: URL;\r\n private readonly fetchImpl: typeof fetch;\r\n private readonly defaultFeature?: string;\r\n private readonly defaultTags?: string[];\r\n private readonly defaultHeaders: HeadersDict;\r\n private readonly retryDefaults: ResolvedRetryOptions;\r\n private readonly idempotencyGenerator: () => string;\r\n private readonly logFn?: (entry: UsageTapLogEntry) => void;\r\n private readonly authHeader: typeof AUTH_HEADER | typeof API_KEY_HEADER;\r\n private readonly autoIdempotency: boolean;\r\n\r\n constructor(options: UsageTapClientOptions) {\r\n if (!options) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"UsageTapClient options are required\"\r\n );\r\n }\r\n\r\n if (!options.apiKey) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"UsageTapClient requires an apiKey\"\r\n );\r\n }\r\n\r\n if (!options.baseUrl) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"UsageTapClient requires a baseUrl\"\r\n );\r\n }\r\n\r\n if (HAS_WINDOW && !options.allowBrowser) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BROWSER_RUNTIME\",\r\n \"UsageTapClient is designed for server-side environments. Pass allowBrowser=true only for testing.\"\r\n );\r\n }\r\n\r\n const fetchCandidate = options.fetchImpl ?? globalThis.fetch;\r\n if (typeof fetchCandidate !== \"function\") {\r\n throw new UsageTapError(\r\n \"USAGETAP_NETWORK_ERROR\",\r\n \"A global fetch implementation was not found. Pass fetchImpl in UsageTapClientOptions.\"\r\n );\r\n }\r\n\r\n const normalizedBaseUrl = normalizeBaseUrl(options.baseUrl);\r\n this.baseUrl = new URL(normalizedBaseUrl);\r\n this.apiKey = options.apiKey;\r\n this.fetchImpl = fetchCandidate;\r\n this.defaultFeature = options.defaultFeature;\r\n this.defaultTags = options.defaultTags?.length\r\n ? dedupeStrings(options.defaultTags)\r\n : undefined;\r\n this.defaultHeaders = options.headers\r\n ? normalizeHeaderDictionary(options.headers)\r\n : {};\r\n this.retryDefaults = resolveRetryOptions(options.retries);\r\n this.idempotencyGenerator =\r\n options.idempotencyGenerator ?? createIdempotencyKey;\r\n this.logFn = options.onLog;\r\n this.authHeader = options.useApiKeyHeader ? API_KEY_HEADER : AUTH_HEADER;\r\n this.autoIdempotency = options.autoIdempotency ?? true;\r\n }\r\n\r\n async beginCall(\r\n request: BeginCallRequest,\r\n options: BeginCallOptions = {}\r\n ): Promise<UsageTapSuccessResponse<BeginCallResponseBody>> {\r\n const idempotencyKey =\r\n request.idempotency ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n const payload: BeginCallRequest = {\r\n ...request,\r\n feature: request.feature ?? this.defaultFeature,\r\n tags: this.mergeTags(request.tags),\r\n } satisfies BeginCallRequest;\r\n if (idempotencyKey) {\r\n payload.idempotency = idempotencyKey;\r\n }\r\n\r\n const response = await this.request<BeginCallResponseBody>(\r\n CALL_BEGIN_PATH,\r\n payload,\r\n {\r\n ...options,\r\n idempotencyKey,\r\n }\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async endCall(\r\n request: EndCallRequest,\r\n options: EndCallOptions = {}\r\n ): Promise<UsageTapSuccessResponse<EndCallResponseBody>> {\r\n if (!request?.callId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"endCall requires callId\"\r\n );\r\n }\r\n\r\n const payload = { ...request } satisfies EndCallRequest;\r\n const response = await this.request<EndCallResponseBody>(\r\n CALL_END_PATH,\r\n payload,\r\n options\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async checkUsage(\r\n request: CheckUsageRequest,\r\n options: CheckUsageOptions = {}\r\n ): Promise<UsageTapSuccessResponse<CheckUsageResponseBody>> {\r\n if (!request?.customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"checkUsage requires customerId\"\r\n );\r\n }\r\n\r\n const path = CHECK_USAGE_PATH.replace(\r\n \"{customerId}\",\r\n encodeURIComponent(request.customerId)\r\n );\r\n const response = await this.requestGet<CheckUsageResponseBody>(\r\n path,\r\n options\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async createCustomer(\r\n request: CreateCustomerRequest,\r\n options: CreateCustomerOptions = {}\r\n ): Promise<UsageTapSuccessResponse<CreateCustomerResponseBody>> {\r\n if (!request?.customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"createCustomer requires customerId\"\r\n );\r\n }\r\n\r\n const idempotencyKey =\r\n options.idempotencyKey ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n\r\n const response = await this.request<CreateCustomerResponseBody>(\r\n CREATE_CUSTOMER_PATH,\r\n { ...request },\r\n {\r\n ...options,\r\n idempotencyKey,\r\n }\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async withUsage<T>(\r\n beginRequest: BeginCallRequest,\r\n handler: (context: WithUsageContext) => Promise<T>,\r\n options: WithUsageOptions = {}\r\n ): Promise<T> {\r\n const idempotencyKey =\r\n beginRequest.idempotency ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n const beginPayload = idempotencyKey\r\n ? { ...beginRequest, idempotency: idempotencyKey }\r\n : { ...beginRequest };\r\n const beginResponse = await this.beginCall(beginPayload, options);\r\n\r\n let usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\r\n const initialStripeCustomerId =\r\n typeof beginResponse.data.stripeCustomerId === \"string\"\r\n ? beginResponse.data.stripeCustomerId\r\n : typeof beginRequest.stripeCustomerId === \"string\"\r\n ? beginRequest.stripeCustomerId\r\n : undefined;\r\n if (initialStripeCustomerId) {\r\n usage = { ...usage, stripeCustomerId: initialStripeCustomerId };\r\n }\r\n let errorPayload: EndCallRequest[\"error\"] | undefined;\r\n let handlerResult: T | undefined;\r\n let handlerError: unknown;\r\n let endCallError: unknown;\r\n\r\n const context: WithUsageContext = {\r\n begin: beginResponse,\r\n setUsage: (u) => {\r\n usage = { ...usage, ...u };\r\n },\r\n setError: (err) => {\r\n errorPayload = err;\r\n },\r\n };\r\n\r\n try {\r\n handlerResult = await handler(context);\r\n } catch (error) {\r\n handlerError = error;\r\n if (!errorPayload) {\r\n errorPayload = {\r\n code: options.defaultErrorCode ?? \"VENDOR_ERROR\",\r\n message: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n } finally {\r\n try {\r\n await this.endCall(\r\n {\r\n callId: beginResponse.data.callId,\r\n ...(usage as Partial<Omit<EndCallRequest, \"callId\" | \"error\">>),\r\n error: errorPayload,\r\n },\r\n {\r\n ...options,\r\n correlationId: beginResponse.correlationId,\r\n }\r\n );\r\n } catch (error) {\r\n endCallError = error;\r\n }\r\n }\r\n\r\n if (handlerError) {\r\n throw handlerError;\r\n }\r\n\r\n if (endCallError) {\r\n throw wrapEndCallError(endCallError, beginResponse.correlationId);\r\n }\r\n\r\n return handlerResult as T;\r\n }\r\n\r\n private async request<T>(\r\n path: string,\r\n payload: unknown,\r\n options: InternalRequestOptions\r\n ): Promise<UsageTapSuccessResponse<T>> {\r\n const url = new URL(path, this.baseUrl).toString();\r\n const body = payload !== undefined ? JSON.stringify(payload) : undefined;\r\n const headers = this.composeHeaders(body, options);\r\n const resolvedRetry = resolveRetryOptions(\r\n this.retryDefaults,\r\n options.retries\r\n );\r\n\r\n const startTime = (): number =>\r\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\r\n\r\n return runWithRetry(\r\n async (attempt) => {\r\n const startedAt = startTime();\r\n this.log({\r\n event: \"request:start\",\r\n path,\r\n attempt,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: options.correlationId,\r\n });\r\n\r\n const response = await this.performFetch<T>({\r\n url,\r\n method: \"POST\",\r\n headers,\r\n body,\r\n signal: options.signal,\r\n });\r\n\r\n this.log({\r\n event: \"request:success\",\r\n path,\r\n attempt,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: response.correlationId,\r\n elapsedMs: startTime() - startedAt,\r\n });\r\n\r\n return response;\r\n },\r\n resolvedRetry,\r\n (error) => this.shouldRetry(error),\r\n (attempt, delayMs, error) => {\r\n this.log({\r\n event: \"retry:scheduled\",\r\n path,\r\n attempt,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: options.correlationId,\r\n error,\r\n elapsedMs: delayMs,\r\n });\r\n },\r\n options.signal\r\n ).catch((error) => {\r\n this.log({\r\n event: \"retry:exhausted\",\r\n path,\r\n attempt: resolvedRetry.maxAttempts,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: options.correlationId,\r\n error,\r\n });\r\n throw error;\r\n });\r\n }\r\n\r\n private async requestGet<T>(\r\n path: string,\r\n options: InternalRequestOptions\r\n ): Promise<UsageTapSuccessResponse<T>> {\r\n const url = new URL(path, this.baseUrl).toString();\r\n const headers = this.composeHeaders(undefined, options);\r\n const resolvedRetry = resolveRetryOptions(\r\n this.retryDefaults,\r\n options.retries\r\n );\r\n\r\n const startTime = (): number =>\r\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\r\n\r\n return runWithRetry(\r\n async (attempt) => {\r\n const startedAt = startTime();\r\n this.log({\r\n event: \"request:start\",\r\n path,\r\n attempt,\r\n correlationId: options.correlationId,\r\n });\r\n\r\n const response = await this.performFetch<T>({\r\n url,\r\n method: \"GET\",\r\n headers,\r\n signal: options.signal,\r\n });\r\n\r\n this.log({\r\n event: \"request:success\",\r\n path,\r\n attempt,\r\n correlationId: response.correlationId,\r\n elapsedMs: startTime() - startedAt,\r\n });\r\n\r\n return response;\r\n },\r\n resolvedRetry,\r\n (error) => this.shouldRetry(error),\r\n (attempt, delayMs, error) => {\r\n this.log({\r\n event: \"retry:scheduled\",\r\n path,\r\n attempt,\r\n correlationId: options.correlationId,\r\n error,\r\n elapsedMs: delayMs,\r\n });\r\n },\r\n options.signal\r\n ).catch((error) => {\r\n this.log({\r\n event: \"retry:exhausted\",\r\n path,\r\n attempt: resolvedRetry.maxAttempts,\r\n correlationId: options.correlationId,\r\n error,\r\n });\r\n throw error;\r\n });\r\n }\r\n\r\n private async performFetch<T>(init: {\r\n url: string;\r\n method: string;\r\n headers: HeadersDict;\r\n body?: string;\r\n signal?: AbortSignal;\r\n }): Promise<UsageTapSuccessResponse<T>> {\r\n let response: Response;\r\n try {\r\n response = await this.fetchImpl(init.url, {\r\n method: init.method,\r\n headers: init.headers,\r\n body: init.body,\r\n signal: init.signal,\r\n });\r\n } catch (error) {\r\n throw new UsageTapError(\r\n \"USAGETAP_NETWORK_ERROR\",\r\n \"Failed to reach UsageTap\",\r\n {\r\n retryable: true,\r\n cause: error,\r\n }\r\n );\r\n }\r\n\r\n const correlationId = response.headers.get(CORRELATION_HEADER) ?? undefined;\r\n const text = await response.text();\r\n let payload: EnvelopeShape | undefined;\r\n\r\n if (text) {\r\n try {\r\n payload = JSON.parse(text) as EnvelopeShape;\r\n } catch (error) {\r\n throw new UsageTapError(\r\n \"USAGETAP_INVALID_RESPONSE\",\r\n \"UsageTap returned invalid JSON\",\r\n {\r\n retryable: false,\r\n correlationId,\r\n cause: error,\r\n }\r\n );\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n throw this.toHttpError(response.status, payload, correlationId);\r\n }\r\n\r\n if (!payload?.result || payload.result.status !== \"ACCEPTED\") {\r\n throw this.toApiError(payload, correlationId);\r\n }\r\n\r\n const resolvedCorrelation = payload.correlationId ?? correlationId;\r\n if (\r\n payload.data === undefined ||\r\n payload.data === null ||\r\n !resolvedCorrelation\r\n ) {\r\n throw new UsageTapError(\r\n \"USAGETAP_INVALID_RESPONSE\",\r\n \"UsageTap response missing data or correlationId\",\r\n {\r\n correlationId: resolvedCorrelation ?? correlationId,\r\n }\r\n );\r\n }\r\n\r\n return {\r\n result: {\r\n status: payload.result.status as \"ACCEPTED\",\r\n code: payload.result.code,\r\n message: payload.result.message,\r\n timestamp: payload.result.timestamp,\r\n },\r\n data: payload.data as T,\r\n correlationId: resolvedCorrelation,\r\n } satisfies UsageTapSuccessResponse<T>;\r\n }\r\n\r\n private composeHeaders(\r\n body: string | undefined,\r\n options: InternalRequestOptions\r\n ): HeadersDict {\r\n const headers: HeadersDict = {\r\n ...this.defaultHeaders,\r\n [SDK_HEADER]: `js/${SDK_VERSION}`,\r\n \"user-agent\": `${USER_AGENT}/${SDK_VERSION}`,\r\n \"content-type\": \"application/json\",\r\n accept: CANONICAL_MEDIA_TYPE,\r\n };\r\n\r\n if (this.authHeader === API_KEY_HEADER) {\r\n headers[API_KEY_HEADER] = this.apiKey;\r\n } else {\r\n headers[AUTH_HEADER] = `Bearer ${this.apiKey}`;\r\n }\r\n\r\n if (options.idempotencyKey) {\r\n headers[IDEMPOTENCY_HEADER] = options.idempotencyKey;\r\n }\r\n\r\n if (options.correlationId) {\r\n headers[CORRELATION_HEADER] = options.correlationId;\r\n }\r\n\r\n if (!body) {\r\n delete headers[\"content-type\"];\r\n }\r\n\r\n if (options.headers) {\r\n Object.assign(headers, normalizeHeaderDictionary(options.headers));\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n private log(entry: UsageTapLogEntry): void {\r\n this.logFn?.(entry);\r\n }\r\n\r\n private mergeTags(tags?: string[]): string[] | undefined {\r\n if (!tags && !this.defaultTags) {\r\n return undefined;\r\n }\r\n\r\n const combined = [...(this.defaultTags ?? []), ...(tags ?? [])].filter(\r\n Boolean\r\n );\r\n return combined.length ? dedupeStrings(combined) : undefined;\r\n }\r\n\r\n private shouldRetry(error: unknown): boolean {\r\n if (isUsageTapError(error)) {\r\n return Boolean(error.retryable);\r\n }\r\n\r\n if (error instanceof Error && error.name === \"AbortError\") {\r\n return false;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private toHttpError(\r\n status: number,\r\n payload: EnvelopeShape | undefined,\r\n correlationId?: string\r\n ): UsageTapError {\r\n const code = mapStatusToErrorCode(status);\r\n const retryable = isRetryableStatus(status);\r\n const message =\r\n payload?.error?.message ??\r\n payload?.result?.message ??\r\n `UsageTap responded with HTTP ${status}`;\r\n\r\n return new UsageTapError(code, message, {\r\n status,\r\n retryable,\r\n correlationId: payload?.correlationId ?? correlationId,\r\n details: sanitizeDetails(payload),\r\n });\r\n }\r\n\r\n private toApiError(\r\n payload: EnvelopeShape | undefined,\r\n correlationId?: string\r\n ): UsageTapError {\r\n const normalizedCode =\r\n payload?.error?.code ?? payload?.result?.code ?? \"UNKNOWN\";\r\n const retryable = isRetryableApiCode(normalizedCode);\r\n const message =\r\n payload?.error?.message ??\r\n payload?.result?.message ??\r\n \"UsageTap reported an error\";\r\n\r\n return new UsageTapError(mapApiCodeToError(normalizedCode), message, {\r\n retryable,\r\n correlationId: payload?.correlationId ?? correlationId,\r\n details: sanitizeDetails(payload),\r\n });\r\n }\r\n}\r\n\r\nfunction mapStatusToErrorCode(status: number): UsageTapErrorCode {\r\n if (status === 401 || status === 403) return \"USAGETAP_AUTH_ERROR\";\r\n if (status === 400 || status === 404 || status === 409)\r\n return \"USAGETAP_BAD_REQUEST\";\r\n if (status === 429) return \"USAGETAP_RATE_LIMITED\";\r\n if (status >= 500) return \"USAGETAP_SERVER_ERROR\";\r\n return \"USAGETAP_INVALID_RESPONSE\";\r\n}\r\n\r\nfunction isRetryableStatus(status: number): boolean {\r\n return (\r\n status === 408 ||\r\n status === 425 ||\r\n status === 429 ||\r\n status === 500 ||\r\n status === 502 ||\r\n status === 503 ||\r\n status === 504\r\n );\r\n}\r\n\r\nfunction isRetryableApiCode(code: string): boolean {\r\n const normalized = code.toUpperCase();\r\n return (\r\n normalized.includes(\"TRANSIENT\") ||\r\n normalized.includes(\"RETRY\") ||\r\n normalized.includes(\"TIMEOUT\") ||\r\n normalized.includes(\"THROTTLE\") ||\r\n normalized.includes(\"RATE_LIMIT\")\r\n );\r\n}\r\n\r\nfunction mapApiCodeToError(code: string): UsageTapErrorCode {\r\n const normalized = code.toUpperCase();\r\n if (normalized.includes(\"AUTH\") || normalized.includes(\"TOKEN\")) {\r\n return \"USAGETAP_AUTH_ERROR\";\r\n }\r\n if (normalized.includes(\"RATE\") || normalized.includes(\"THROTTLE\")) {\r\n return \"USAGETAP_RATE_LIMITED\";\r\n }\r\n if (normalized.includes(\"SERVER\") || normalized.includes(\"TRANSIENT\")) {\r\n return \"USAGETAP_SERVER_ERROR\";\r\n }\r\n if (\r\n normalized.includes(\"IDEMPOTENCY\") ||\r\n normalized.includes(\"VALIDATION\") ||\r\n normalized.includes(\"REQUEST\")\r\n ) {\r\n return \"USAGETAP_BAD_REQUEST\";\r\n }\r\n return \"USAGETAP_INVALID_RESPONSE\";\r\n}\r\n\r\nfunction sanitizeDetails(\r\n payload: EnvelopeShape | undefined\r\n): Record<string, unknown> | undefined {\r\n if (!payload) return undefined;\r\n const details: Record<string, unknown> = {};\r\n if (payload.result) details.result = payload.result;\r\n if (payload.error) details.error = payload.error;\r\n return Object.keys(details).length ? details : undefined;\r\n}\r\n\r\nfunction normalizeBaseUrl(baseUrl: string): string {\r\n const trimmed = baseUrl.trim();\r\n if (!trimmed) return trimmed;\r\n return trimmed.endsWith(\"/\") ? trimmed : `${trimmed}/`;\r\n}\r\n\r\nfunction normalizeHeaderDictionary(dict: Record<string, string>): HeadersDict {\r\n return Object.keys(dict).reduce<HeadersDict>((acc, key) => {\r\n acc[key.toLowerCase()] = dict[key];\r\n return acc;\r\n }, {});\r\n}\r\n\r\nfunction dedupeStrings(values: string[]): string[] {\r\n return Array.from(\r\n new Set(values.map((value) => value.trim()).filter(Boolean))\r\n );\r\n}\r\n\r\nfunction wrapEndCallError(\r\n error: unknown,\r\n correlationId?: string\r\n): UsageTapError {\r\n if (isUsageTapError(error)) {\r\n return new UsageTapError(\"USAGETAP_END_CALL_ERROR\", error.message, {\r\n correlationId: error.correlationId ?? correlationId,\r\n details: error.details,\r\n cause: error,\r\n });\r\n }\r\n\r\n return new UsageTapError(\r\n \"USAGETAP_END_CALL_ERROR\",\r\n \"Failed to finalize UsageTap call\",\r\n {\r\n correlationId,\r\n cause: error,\r\n }\r\n );\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","import type OpenAI from \"openai\";\r\nimport { UsageTapClient } from \"../client\";\r\nimport type { OpenAIAdapter } from \"./openai\";\r\nimport { createOpenAIAdapter } from \"./openai\";\r\n\r\nexport interface OpenRouterAdapterInit {\r\n client: OpenAI;\r\n usageTap: UsageTapClient;\r\n}\r\n\r\nexport function createOpenRouterAdapter(init: OpenRouterAdapterInit): OpenAIAdapter {\r\n return createOpenAIAdapter(init);\r\n}\r\n","import { UsageTapClient } from \"../client\";\r\nimport type { BeginCallRequest, EndCallRequest } from \"../types\";\r\n\r\nexport interface WrapFetchContext extends Omit<BeginCallRequest, \"idempotency\"> {\r\n customerId: string;\r\n}\r\n\r\nexport interface WrapFetchOptions {\r\n /**\r\n * Context for UsageTap begin calls.\r\n * Can be overridden per-request via special headers.\r\n */\r\n defaultContext: WrapFetchContext;\r\n \r\n /**\r\n * Optional custom fetch implementation to wrap.\r\n * Defaults to global fetch.\r\n */\r\n baseFetch?: typeof fetch;\r\n \r\n /**\r\n * Generate idempotency keys automatically if not provided.\r\n * Default: true\r\n */\r\n autoIdempotency?: boolean;\r\n \r\n /**\r\n * Detect OpenAI-compatible endpoints by URL pattern.\r\n * Default: detects /v1/chat/completions and /v1/responses\r\n */\r\n isOpenAIEndpoint?: (url: string) => boolean;\r\n}\r\n\r\ninterface CallState {\r\n callId: string;\r\n correlationId?: string;\r\n usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">>;\r\n finalized: boolean;\r\n}\r\n\r\ntype JsonRecord = Record<string, unknown>;\r\n\r\nfunction isJsonRecord(value: unknown): value is JsonRecord {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction readString(value: unknown): string | undefined {\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\nfunction readNumber(value: unknown): number | undefined {\r\n return typeof value === \"number\" ? value : undefined;\r\n}\r\n\r\nfunction parseJsonRecord(text: string): JsonRecord | undefined {\r\n try {\r\n const parsed = JSON.parse(text) as unknown;\r\n return isJsonRecord(parsed) ? parsed : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction parseStringArray(value: string): string[] | undefined {\r\n try {\r\n const parsed = JSON.parse(value) as unknown;\r\n if (Array.isArray(parsed) && parsed.every((item) => typeof item === \"string\")) {\r\n return parsed;\r\n }\r\n } catch {\r\n return undefined;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Wraps a fetch implementation to automatically instrument OpenAI API calls\r\n * with UsageTap begin/end tracking.\r\n * \r\n * Example:\r\n * ```ts\r\n * const wrappedFetch = wrapFetch(usageTap, {\r\n * defaultContext: { customerId: \"cust_123\", feature: \"chat\" }\r\n * });\r\n * \r\n * const openai = new OpenAI({\r\n * apiKey: process.env.OPENAI_API_KEY!,\r\n * fetch: wrappedFetch,\r\n * });\r\n * ```\r\n */\r\nexport function wrapFetch(\r\n usageTap: UsageTapClient,\r\n options: WrapFetchOptions,\r\n): typeof fetch {\r\n const {\r\n defaultContext,\r\n baseFetch = globalThis.fetch,\r\n autoIdempotency = true,\r\n isOpenAIEndpoint = defaultIsOpenAIEndpoint,\r\n } = options;\r\n\r\n return async function wrappedFetch(\r\n input: string | URL | Request,\r\n init?: RequestInit,\r\n ): Promise<Response> {\r\n const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url;\r\n \r\n // Only intercept OpenAI endpoints\r\n if (!isOpenAIEndpoint(url)) {\r\n return baseFetch(input, init);\r\n }\r\n\r\n // Parse request body to extract context overrides and detect streaming\r\n let body: JsonRecord | undefined;\r\n let isStreaming = false;\r\n const contextOverride: Partial<WrapFetchContext> = {};\r\n\r\n try {\r\n if (init?.body && typeof init.body === \"string\") {\r\n const parsedBody = parseJsonRecord(init.body);\r\n if (!parsedBody) {\r\n return baseFetch(input, init);\r\n }\r\n\r\n body = parsedBody;\r\n isStreaming = parsedBody.stream === true;\r\n\r\n // Check for context overrides in special headers\r\n const headers = new Headers(init.headers);\r\n const customerIdHeader = headers.get(\"x-usagetap-customer-id\");\r\n const featureHeader = headers.get(\"x-usagetap-feature\");\r\n const tagsHeader = headers.get(\"x-usagetap-tags\");\r\n\r\n if (customerIdHeader) {\r\n contextOverride.customerId = customerIdHeader;\r\n }\r\n if (featureHeader) {\r\n contextOverride.feature = featureHeader;\r\n }\r\n if (tagsHeader) {\r\n const tags = parseStringArray(tagsHeader);\r\n if (tags) {\r\n contextOverride.tags = tags;\r\n }\r\n }\r\n }\r\n } catch {\r\n // If body parsing fails, proceed without interception\r\n return baseFetch(input, init);\r\n }\r\n\r\n // Merge context\r\n const context: BeginCallRequest = {\r\n ...defaultContext,\r\n ...contextOverride,\r\n idempotency: autoIdempotency ? crypto.randomUUID() : undefined,\r\n };\r\n\r\n // Begin the call\r\n let callState: CallState | undefined;\r\n try {\r\n const beginResponse = await usageTap.beginCall(context);\r\n callState = {\r\n callId: beginResponse.data.callId,\r\n correlationId: beginResponse.correlationId,\r\n usage: {},\r\n finalized: false,\r\n };\r\n } catch (error) {\r\n // If begin fails, proceed with original fetch but log error\r\n console.error(\"[wrapFetch] Failed to begin call:\", error);\r\n return baseFetch(input, init);\r\n }\r\n\r\n // Add correlation header to vendor request\r\n const modifiedInit = {\r\n ...init,\r\n headers: {\r\n ...init?.headers,\r\n \"x-usage-correlation-id\": callState.correlationId || \"\",\r\n },\r\n };\r\n\r\n // Call the vendor API\r\n try {\r\n const response = await baseFetch(input, modifiedInit);\r\n \r\n if (isStreaming) {\r\n // Wrap streaming response\r\n return wrapStreamingResponse(response, callState, usageTap);\r\n } else {\r\n // Handle non-streaming response\r\n return await wrapNonStreamingResponse(response, callState, usageTap, body);\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n // Vendor call failed\r\n await finalizeCall(callState, usageTap, {\r\n code: \"VENDOR_ERROR\",\r\n message,\r\n });\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\nfunction defaultIsOpenAIEndpoint(url: string): boolean {\r\n return (\r\n url.includes(\"/v1/chat/completions\") ||\r\n url.includes(\"/v1/responses\") ||\r\n url.includes(\"/v1/embeddings\")\r\n );\r\n}\r\n\r\nasync function wrapNonStreamingResponse(\r\n response: Response,\r\n callState: CallState,\r\n usageTap: UsageTapClient,\r\n requestBody: JsonRecord | undefined,\r\n): Promise<Response> {\r\n // Clone response to read body\r\n const clonedResponse = response.clone();\r\n \r\n try {\r\n const parsed = await clonedResponse.json();\r\n const usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\r\n\r\n if (isJsonRecord(parsed)) {\r\n const usageBlock = parsed.usage;\r\n if (isJsonRecord(usageBlock)) {\r\n const promptTokens = readNumber(usageBlock.prompt_tokens ?? usageBlock.input_tokens);\r\n if (promptTokens !== undefined) {\r\n usage.inputTokens = promptTokens;\r\n }\r\n\r\n const completionTokens = readNumber(usageBlock.completion_tokens ?? usageBlock.output_tokens);\r\n if (completionTokens !== undefined) {\r\n usage.responseTokens = completionTokens;\r\n }\r\n\r\n const cachedTokens = readNumber(usageBlock.prompt_cache_hit_tokens);\r\n if (cachedTokens !== undefined) {\r\n usage.cachedTokens = cachedTokens;\r\n }\r\n\r\n const reasoningTokens = readNumber(usageBlock.reasoning_tokens);\r\n if (reasoningTokens !== undefined) {\r\n usage.reasoningTokens = reasoningTokens;\r\n }\r\n }\r\n\r\n const modelFromResponse = readString(parsed.model);\r\n if (modelFromResponse) {\r\n usage.modelUsed = modelFromResponse;\r\n }\r\n }\r\n\r\n if (!usage.modelUsed && requestBody) {\r\n const requestModel = readString(requestBody.model);\r\n if (requestModel) {\r\n usage.modelUsed = requestModel;\r\n }\r\n }\r\n\r\n // Finalize the call\r\n await finalizeCall(callState, usageTap, undefined, usage);\r\n\r\n return response;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n // If we can't parse response, finalize with error\r\n await finalizeCall(callState, usageTap, {\r\n code: \"RESPONSE_PARSE_ERROR\",\r\n message,\r\n });\r\n return response;\r\n }\r\n}\r\n\r\nfunction wrapStreamingResponse(\r\n response: Response,\r\n callState: CallState,\r\n usageTap: UsageTapClient,\r\n): Response {\r\n if (!response.body) {\r\n // No body to stream, finalize now\r\n void finalizeCall(callState, usageTap, {\r\n code: \"NO_RESPONSE_BODY\",\r\n message: \"Streaming response has no body\",\r\n });\r\n return response;\r\n }\r\n\r\n const originalBody = response.body;\r\n const accumulatedUsage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\r\n const textDecoder = new TextDecoder();\r\n\r\n const transformStream = new TransformStream({\r\n transform(chunk: Uint8Array, controller) {\r\n controller.enqueue(chunk);\r\n \r\n // Try to parse usage from SSE data\r\n try {\r\n const text = textDecoder.decode(chunk, { stream: true });\r\n const lines = text.split(\"\\n\");\r\n \r\n for (const line of lines) {\r\n if (line.startsWith(\"data: \")) {\r\n const data = line.slice(6);\r\n if (data === \"[DONE]\") continue;\r\n \r\n const parsedRecord = parseJsonRecord(data);\r\n if (!parsedRecord) {\r\n continue;\r\n }\r\n\r\n const usageBlock = parsedRecord.usage;\r\n if (isJsonRecord(usageBlock)) {\r\n const promptTokens = readNumber(usageBlock.prompt_tokens ?? usageBlock.input_tokens);\r\n if (promptTokens !== undefined) {\r\n accumulatedUsage.inputTokens = promptTokens;\r\n }\r\n\r\n const completionTokens = readNumber(usageBlock.completion_tokens ?? usageBlock.output_tokens);\r\n if (completionTokens !== undefined) {\r\n accumulatedUsage.responseTokens = completionTokens;\r\n }\r\n\r\n const cachedTokens = readNumber(usageBlock.prompt_cache_hit_tokens);\r\n if (cachedTokens !== undefined) {\r\n accumulatedUsage.cachedTokens = cachedTokens;\r\n }\r\n\r\n const reasoningTokens = readNumber(usageBlock.reasoning_tokens);\r\n if (reasoningTokens !== undefined) {\r\n accumulatedUsage.reasoningTokens = reasoningTokens;\r\n }\r\n }\r\n\r\n const model = readString(parsedRecord.model);\r\n if (model) {\r\n accumulatedUsage.modelUsed = model;\r\n }\r\n }\r\n }\r\n } catch {\r\n // Ignore decode errors\r\n }\r\n },\r\n\r\n async flush() {\r\n // Stream completed successfully\r\n await finalizeCall(callState, usageTap, undefined, accumulatedUsage);\r\n },\r\n });\r\n\r\n // Handle stream errors and cancellation\r\n const wrappedBody = originalBody.pipeThrough(transformStream);\r\n \r\n // Note: Response doesn't have signal property, abort handling happens via stream closure\r\n\r\n return new Response(wrappedBody, {\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers: response.headers,\r\n });\r\n}\r\n\r\nasync function finalizeCall(\r\n callState: CallState,\r\n usageTap: UsageTapClient,\r\n error?: { code: string; message: string },\r\n usage?: Partial<Omit<EndCallRequest, \"callId\" | \"error\">>,\r\n): Promise<void> {\r\n if (callState.finalized) return;\r\n callState.finalized = true;\r\n\r\n try {\r\n await usageTap.endCall({\r\n callId: callState.callId,\r\n ...callState.usage,\r\n ...usage,\r\n error,\r\n });\r\n } catch (err) {\r\n console.error(\"[wrapFetch] Failed to finalize call:\", err);\r\n }\r\n}\r\n","import type OpenAI from \"openai\";\r\nimport type { Request, Response, NextFunction } from \"express\";\r\nimport { UsageTapClient } from \"../client\";\r\nimport { wrapOpenAI, type WrapOpenAIContext, type WrapOpenAIOptions, pipeToResponse } from \"./openai\";\r\n\r\nexport interface ExpressUsageTapContext {\r\n /**\r\n * Get a wrapped OpenAI client for this request.\r\n * The client automatically tracks usage with the provided context.\r\n */\r\n openai: (client: OpenAI, context?: Partial<WrapOpenAIContext>, options?: WrapOpenAIOptions) => ReturnType<typeof wrapOpenAI>;\r\n \r\n /**\r\n * Pipe an OpenAI stream directly to the Express response.\r\n * Automatically sets appropriate headers and finalizes usage.\r\n */\r\n pipeToResponse: typeof pipeToResponse;\r\n}\r\n\r\n/* eslint-disable @typescript-eslint/no-namespace */\r\ndeclare global {\r\n namespace Express {\r\n interface Request {\r\n usageTap?: ExpressUsageTapContext;\r\n }\r\n }\r\n}\r\n/* eslint-enable @typescript-eslint/no-namespace */\r\n\r\nexport interface WithUsageMiddlewareOptions {\r\n /**\r\n * Function to extract customer ID from the request.\r\n * Can read from headers, JWT tokens, session, etc.\r\n */\r\n getCustomerId: (req: Request) => string | Promise<string>;\r\n \r\n /**\r\n * Optional: Extract feature name from request\r\n */\r\n getFeature?: (req: Request) => string | undefined | Promise<string | undefined>;\r\n \r\n /**\r\n * Optional: Extract tags from request\r\n */\r\n getTags?: (req: Request) => string[] | undefined | Promise<string[] | undefined>;\r\n \r\n /**\r\n * Optional: Default context to merge with request-specific context\r\n */\r\n defaultContext?: Partial<Omit<WrapOpenAIContext, \"customerId\">>;\r\n}\r\n\r\n/**\r\n * Express middleware that adds UsageTap context to requests.\r\n * \r\n * @example\r\n * ```ts\r\n * const app = express();\r\n * \r\n * const usageTap = new UsageTapClient({\r\n * apiKey: process.env.USAGETAP_API_KEY!,\r\n * baseUrl: process.env.USAGETAP_BASE_URL!,\r\n * });\r\n * \r\n * app.use(withUsageMiddleware(usageTap, {\r\n * getCustomerId: (req) => req.user.id,\r\n * getFeature: (req) => req.path.split('/')[1],\r\n * }));\r\n * \r\n * app.post('/chat', async (req, res) => {\r\n * const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY! });\r\n * const ai = req.usageTap!.openai(openai);\r\n * \r\n * const stream = await ai.chat.completions.create({\r\n * model: \"gpt-4o-mini\",\r\n * messages: req.body.messages,\r\n * stream: true,\r\n * });\r\n * \r\n * req.usageTap!.pipeToResponse(stream, res);\r\n * });\r\n * ```\r\n */\r\nexport function withUsageMiddleware(\r\n usageTap: UsageTapClient,\r\n options: WithUsageMiddlewareOptions,\r\n): (req: Request, res: Response, next: NextFunction) => Promise<void> {\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n try {\r\n // Extract context from request\r\n const customerId = await options.getCustomerId(req);\r\n const feature = options.getFeature ? await options.getFeature(req) : undefined;\r\n const tags = options.getTags ? await options.getTags(req) : undefined;\r\n \r\n const baseContext: WrapOpenAIContext = {\r\n customerId,\r\n feature,\r\n tags,\r\n ...options.defaultContext,\r\n };\r\n\r\n // Attach UsageTap helpers to request\r\n req.usageTap = {\r\n openai: (\r\n client: OpenAI,\r\n contextOverride?: Partial<WrapOpenAIContext>,\r\n wrapOptions?: WrapOpenAIOptions,\r\n ): ReturnType<typeof wrapOpenAI> => {\r\n const mergedContext = { ...baseContext, ...contextOverride };\r\n return wrapOpenAI(client, usageTap, {\r\n ...wrapOptions,\r\n defaultContext: mergedContext,\r\n });\r\n },\r\n pipeToResponse,\r\n };\r\n next();\r\n } catch (error) {\r\n next(error);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Simpler middleware that only requires customer ID extraction.\r\n * \r\n * @example\r\n * ```ts\r\n * app.use(withUsage(usageTap, (req) => req.user.id));\r\n * \r\n * app.post('/chat', async (req, res) => {\r\n * const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY! });\r\n * const ai = req.usageTap!.openai(openai, { feature: \"chat\" });\r\n * const completion = await ai.chat.completions.create({...});\r\n * res.json(completion);\r\n * });\r\n * ```\r\n */\r\nexport function withUsage(\r\n usageTap: UsageTapClient,\r\n getCustomerId: (req: Request) => string | Promise<string>,\r\n): (req: Request, res: Response, next: NextFunction) => Promise<void> {\r\n return withUsageMiddleware(usageTap, { getCustomerId });\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/idempotency.ts","../src/retry.ts","../src/client.ts","../src/adapters/openai.ts","../src/adapters/openrouter.ts","../src/adapters/fetch-wrapper.ts","../src/adapters/express-middleware.ts"],"names":["withUsage","apiPromise","wrappedPromise","wrappedStream","dedupeStrings"],"mappings":"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","file":"index.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","export function createIdempotencyKey(): string {\r\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\r\n return globalThis.crypto.randomUUID();\r\n }\r\n\r\n const random = (): string => Math.random().toString(16).slice(2, 10);\r\n return `${random()}-${random()}`;\r\n}\r\n","import type { RetryOptions } from \"./types\";\r\n\r\nexport interface ResolvedRetryOptions {\r\n maxAttempts: number;\r\n baseDelayMs: number;\r\n maxDelayMs: number;\r\n jitterRatio: number;\r\n}\r\n\r\nconst DEFAULTS: ResolvedRetryOptions = {\r\n maxAttempts: 3,\r\n baseDelayMs: 250,\r\n maxDelayMs: 5000,\r\n jitterRatio: 0.2,\r\n};\r\n\r\nexport function resolveRetryOptions(\r\n base?: RetryOptions,\r\n override?: RetryOptions,\r\n): ResolvedRetryOptions {\r\n const merged = { ...DEFAULTS, ...base, ...override } satisfies ResolvedRetryOptions;\r\n return {\r\n maxAttempts: Math.max(1, Math.floor(merged.maxAttempts)),\r\n baseDelayMs: Math.max(0, merged.baseDelayMs),\r\n maxDelayMs: Math.max(merged.baseDelayMs, merged.maxDelayMs),\r\n jitterRatio: Math.min(Math.max(merged.jitterRatio, 0), 1),\r\n };\r\n}\r\n\r\nexport async function sleep(delayMs: number, signal?: AbortSignal): Promise<void> {\r\n if (delayMs <= 0) {\r\n signal?.throwIfAborted?.();\r\n return;\r\n }\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n cleanup();\r\n resolve();\r\n }, delayMs);\r\n\r\n const cleanup = (): void => {\r\n clearTimeout(timer);\r\n signal?.removeEventListener(\"abort\", onAbort);\r\n };\r\n\r\n const onAbort = (): void => {\r\n cleanup();\r\n const abortError = new Error(\"Aborted\");\r\n abortError.name = \"AbortError\";\r\n reject(abortError);\r\n };\r\n\r\n if (signal) {\r\n if (signal.aborted) {\r\n onAbort();\r\n return;\r\n }\r\n signal.addEventListener(\"abort\", onAbort, { once: true });\r\n }\r\n });\r\n}\r\n\r\nexport function computeDelay(attempt: number, options: ResolvedRetryOptions): number {\r\n const exp = options.baseDelayMs * Math.pow(2, attempt - 1);\r\n const capped = Math.min(exp, options.maxDelayMs);\r\n const jitter = capped * options.jitterRatio;\r\n const min = capped - jitter;\r\n const max = capped + jitter;\r\n return Math.max(0, Math.random() * (max - min) + min);\r\n}\r\n\r\nexport async function runWithRetry<T>(\r\n operation: (attempt: number) => Promise<T>,\r\n options: ResolvedRetryOptions,\r\n shouldRetry: (error: unknown) => boolean,\r\n onSchedule?: (attempt: number, delayMs: number, error: unknown) => void,\r\n signal?: AbortSignal,\r\n): Promise<T> {\r\n let attempt = 0;\r\n let lastError: unknown;\r\n while (attempt < options.maxAttempts) {\r\n attempt += 1;\r\n signal?.throwIfAborted?.();\r\n\r\n try {\r\n return await operation(attempt);\r\n } catch (error) {\r\n lastError = error;\r\n if (attempt >= options.maxAttempts || !shouldRetry(error)) {\r\n throw error;\r\n }\r\n const delayMs = computeDelay(attempt, options);\r\n onSchedule?.(attempt, delayMs, error);\r\n await sleep(delayMs, signal);\r\n }\r\n }\r\n\r\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\r\n}\r\n","import type {\r\n BeginCallOptions,\r\n BeginCallRequest,\r\n BeginCallResponseBody,\r\n CreateCustomerOptions,\r\n CreateCustomerRequest,\r\n CreateCustomerResponseBody,\r\n CheckUsageOptions,\r\n CheckUsageRequest,\r\n CheckUsageResponseBody,\r\n EndCallOptions,\r\n EndCallRequest,\r\n EndCallResponseBody,\r\n UsageTapClientOptions,\r\n UsageTapLogEntry,\r\n UsageTapSuccessResponse,\r\n WithUsageContext,\r\n WithUsageOptions,\r\n} from \"./types\";\r\nimport {\r\n UsageTapError,\r\n type UsageTapErrorCode,\r\n isUsageTapError,\r\n} from \"./errors\";\r\nimport { createIdempotencyKey } from \"./idempotency\";\r\nimport {\r\n runWithRetry,\r\n resolveRetryOptions,\r\n type ResolvedRetryOptions,\r\n} from \"./retry\";\r\nimport type { RetryOptions } from \"./types\";\r\n\r\nconst CALL_BEGIN_PATH = \"call_begin\";\r\nconst CALL_END_PATH = \"call_end\";\r\nconst CHECK_USAGE_PATH = \"customers/{customerId}/usage\";\r\nconst CREATE_CUSTOMER_PATH = \"customers\";\r\nconst AUTH_HEADER = \"authorization\";\r\nconst API_KEY_HEADER = \"x-api-key\";\r\nconst CORRELATION_HEADER = \"x-usage-correlation-id\";\r\nconst IDEMPOTENCY_HEADER = \"idempotency-key\";\r\nconst SDK_HEADER = \"x-usage-sdk\";\r\nconst USER_AGENT = \"UsageTapClient\";\r\nconst CANONICAL_MEDIA_TYPE = \"application/vnd.usagetap.v1+json\";\r\n\r\ndeclare const __SDK_VERSION__: string | undefined;\r\nconst SDK_VERSION =\r\n typeof __SDK_VERSION__ === \"string\" ? __SDK_VERSION__ : \"0.1.0\";\r\nconst HAS_WINDOW =\r\n typeof globalThis !== \"undefined\" &&\r\n typeof (globalThis as Record<string, unknown>).window !== \"undefined\";\r\n\r\ntype HeadersDict = Record<string, string>;\r\n\r\ntype InternalRequestOptions = {\r\n signal?: AbortSignal;\r\n headers?: HeadersDict;\r\n retries?: RetryOptions;\r\n correlationId?: string;\r\n idempotencyKey?: string;\r\n};\r\n\r\ntype EnvelopeShape = {\r\n result?: {\r\n status?: string;\r\n code?: string;\r\n message?: string;\r\n timestamp?: string;\r\n };\r\n data?: unknown;\r\n error?: {\r\n code?: string;\r\n message?: string;\r\n details?: Record<string, unknown>;\r\n };\r\n correlationId?: string;\r\n};\r\n\r\nexport class UsageTapClient {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: URL;\r\n private readonly fetchImpl: typeof fetch;\r\n private readonly defaultFeature?: string;\r\n private readonly defaultTags?: string[];\r\n private readonly defaultHeaders: HeadersDict;\r\n private readonly retryDefaults: ResolvedRetryOptions;\r\n private readonly idempotencyGenerator: () => string;\r\n private readonly logFn?: (entry: UsageTapLogEntry) => void;\r\n private readonly authHeader: typeof AUTH_HEADER | typeof API_KEY_HEADER;\r\n private readonly autoIdempotency: boolean;\r\n\r\n constructor(options: UsageTapClientOptions) {\r\n if (!options) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"UsageTapClient options are required\"\r\n );\r\n }\r\n\r\n if (!options.apiKey) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"UsageTapClient requires an apiKey\"\r\n );\r\n }\r\n\r\n if (!options.baseUrl) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"UsageTapClient requires a baseUrl\"\r\n );\r\n }\r\n\r\n if (HAS_WINDOW && !options.allowBrowser) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BROWSER_RUNTIME\",\r\n \"UsageTapClient is designed for server-side environments. Pass allowBrowser=true only for testing.\"\r\n );\r\n }\r\n\r\n const fetchCandidate = options.fetchImpl ?? globalThis.fetch;\r\n if (typeof fetchCandidate !== \"function\") {\r\n throw new UsageTapError(\r\n \"USAGETAP_NETWORK_ERROR\",\r\n \"A global fetch implementation was not found. Pass fetchImpl in UsageTapClientOptions.\"\r\n );\r\n }\r\n\r\n const normalizedBaseUrl = normalizeBaseUrl(options.baseUrl);\r\n this.baseUrl = new URL(normalizedBaseUrl);\r\n this.apiKey = options.apiKey;\r\n this.fetchImpl = fetchCandidate;\r\n this.defaultFeature = options.defaultFeature;\r\n this.defaultTags = options.defaultTags?.length\r\n ? dedupeStrings(options.defaultTags)\r\n : undefined;\r\n this.defaultHeaders = options.headers\r\n ? normalizeHeaderDictionary(options.headers)\r\n : {};\r\n this.retryDefaults = resolveRetryOptions(options.retries);\r\n this.idempotencyGenerator =\r\n options.idempotencyGenerator ?? createIdempotencyKey;\r\n this.logFn = options.onLog;\r\n this.authHeader = options.useApiKeyHeader ? API_KEY_HEADER : AUTH_HEADER;\r\n this.autoIdempotency = options.autoIdempotency ?? true;\r\n }\r\n\r\n async beginCall(\r\n request: BeginCallRequest,\r\n options: BeginCallOptions = {}\r\n ): Promise<UsageTapSuccessResponse<BeginCallResponseBody>> {\r\n const idempotencyKey =\r\n request.idempotency ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n const payload: BeginCallRequest = {\r\n ...request,\r\n feature: request.feature ?? this.defaultFeature,\r\n tags: this.mergeTags(request.tags),\r\n } satisfies BeginCallRequest;\r\n if (idempotencyKey) {\r\n payload.idempotency = idempotencyKey;\r\n }\r\n\r\n const response = await this.request<BeginCallResponseBody>(\r\n CALL_BEGIN_PATH,\r\n payload,\r\n {\r\n ...options,\r\n idempotencyKey,\r\n }\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async endCall(\r\n request: EndCallRequest,\r\n options: EndCallOptions = {}\r\n ): Promise<UsageTapSuccessResponse<EndCallResponseBody>> {\r\n if (!request?.callId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"endCall requires callId\"\r\n );\r\n }\r\n\r\n const payload = { ...request } satisfies EndCallRequest;\r\n const response = await this.request<EndCallResponseBody>(\r\n CALL_END_PATH,\r\n payload,\r\n options\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async checkUsage(\r\n request: CheckUsageRequest,\r\n options: CheckUsageOptions = {}\r\n ): Promise<UsageTapSuccessResponse<CheckUsageResponseBody>> {\r\n if (!request?.customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"checkUsage requires customerId\"\r\n );\r\n }\r\n\r\n const path = CHECK_USAGE_PATH.replace(\r\n \"{customerId}\",\r\n encodeURIComponent(request.customerId)\r\n );\r\n const response = await this.requestGet<CheckUsageResponseBody>(\r\n path,\r\n options\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async createCustomer(\r\n request: CreateCustomerRequest,\r\n options: CreateCustomerOptions = {}\r\n ): Promise<UsageTapSuccessResponse<CreateCustomerResponseBody>> {\r\n if (!request?.customerId) {\r\n throw new UsageTapError(\r\n \"USAGETAP_BAD_REQUEST\",\r\n \"createCustomer requires customerId\"\r\n );\r\n }\r\n\r\n const idempotencyKey =\r\n options.idempotencyKey ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n\r\n const response = await this.request<CreateCustomerResponseBody>(\r\n CREATE_CUSTOMER_PATH,\r\n { ...request },\r\n {\r\n ...options,\r\n idempotencyKey,\r\n }\r\n );\r\n\r\n return response;\r\n }\r\n\r\n async withUsage<T>(\r\n beginRequest: BeginCallRequest,\r\n handler: (context: WithUsageContext) => Promise<T>,\r\n options: WithUsageOptions = {}\r\n ): Promise<T> {\r\n const idempotencyKey =\r\n beginRequest.idempotency ??\r\n (this.autoIdempotency ? this.idempotencyGenerator() : undefined);\r\n const beginPayload = idempotencyKey\r\n ? { ...beginRequest, idempotency: idempotencyKey }\r\n : { ...beginRequest };\r\n const beginResponse = await this.beginCall(beginPayload, options);\r\n\r\n let usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\r\n const initialStripeCustomerId =\r\n typeof beginResponse.data.stripeCustomerId === \"string\"\r\n ? beginResponse.data.stripeCustomerId\r\n : typeof beginRequest.stripeCustomerId === \"string\"\r\n ? beginRequest.stripeCustomerId\r\n : undefined;\r\n if (initialStripeCustomerId) {\r\n usage = { ...usage, stripeCustomerId: initialStripeCustomerId };\r\n }\r\n let errorPayload: EndCallRequest[\"error\"] | undefined;\r\n let handlerResult: T | undefined;\r\n let handlerError: unknown;\r\n let endCallError: unknown;\r\n\r\n const context: WithUsageContext = {\r\n begin: beginResponse,\r\n setUsage: (u) => {\r\n usage = { ...usage, ...u };\r\n },\r\n setError: (err) => {\r\n errorPayload = err;\r\n },\r\n };\r\n\r\n try {\r\n handlerResult = await handler(context);\r\n } catch (error) {\r\n handlerError = error;\r\n if (!errorPayload) {\r\n errorPayload = {\r\n code: options.defaultErrorCode ?? \"VENDOR_ERROR\",\r\n message: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n } finally {\r\n try {\r\n await this.endCall(\r\n {\r\n callId: beginResponse.data.callId,\r\n ...(usage as Partial<Omit<EndCallRequest, \"callId\" | \"error\">>),\r\n error: errorPayload,\r\n },\r\n {\r\n ...options,\r\n correlationId: beginResponse.correlationId,\r\n }\r\n );\r\n } catch (error) {\r\n endCallError = error;\r\n }\r\n }\r\n\r\n if (handlerError) {\r\n throw handlerError;\r\n }\r\n\r\n if (endCallError) {\r\n throw wrapEndCallError(endCallError, beginResponse.correlationId);\r\n }\r\n\r\n return handlerResult as T;\r\n }\r\n\r\n private async request<T>(\r\n path: string,\r\n payload: unknown,\r\n options: InternalRequestOptions\r\n ): Promise<UsageTapSuccessResponse<T>> {\r\n const url = new URL(path, this.baseUrl).toString();\r\n const body = payload !== undefined ? JSON.stringify(payload) : undefined;\r\n const headers = this.composeHeaders(body, options);\r\n const resolvedRetry = resolveRetryOptions(\r\n this.retryDefaults,\r\n options.retries\r\n );\r\n\r\n const startTime = (): number =>\r\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\r\n\r\n return runWithRetry(\r\n async (attempt) => {\r\n const startedAt = startTime();\r\n this.log({\r\n event: \"request:start\",\r\n path,\r\n attempt,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: options.correlationId,\r\n });\r\n\r\n const response = await this.performFetch<T>({\r\n url,\r\n method: \"POST\",\r\n headers,\r\n body,\r\n signal: options.signal,\r\n });\r\n\r\n this.log({\r\n event: \"request:success\",\r\n path,\r\n attempt,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: response.correlationId,\r\n elapsedMs: startTime() - startedAt,\r\n });\r\n\r\n return response;\r\n },\r\n resolvedRetry,\r\n (error) => this.shouldRetry(error),\r\n (attempt, delayMs, error) => {\r\n this.log({\r\n event: \"retry:scheduled\",\r\n path,\r\n attempt,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: options.correlationId,\r\n error,\r\n elapsedMs: delayMs,\r\n });\r\n },\r\n options.signal\r\n ).catch((error) => {\r\n this.log({\r\n event: \"retry:exhausted\",\r\n path,\r\n attempt: resolvedRetry.maxAttempts,\r\n idempotencyKey: options.idempotencyKey,\r\n correlationId: options.correlationId,\r\n error,\r\n });\r\n throw error;\r\n });\r\n }\r\n\r\n private async requestGet<T>(\r\n path: string,\r\n options: InternalRequestOptions\r\n ): Promise<UsageTapSuccessResponse<T>> {\r\n const url = new URL(path, this.baseUrl).toString();\r\n const headers = this.composeHeaders(undefined, options);\r\n const resolvedRetry = resolveRetryOptions(\r\n this.retryDefaults,\r\n options.retries\r\n );\r\n\r\n const startTime = (): number =>\r\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\r\n\r\n return runWithRetry(\r\n async (attempt) => {\r\n const startedAt = startTime();\r\n this.log({\r\n event: \"request:start\",\r\n path,\r\n attempt,\r\n correlationId: options.correlationId,\r\n });\r\n\r\n const response = await this.performFetch<T>({\r\n url,\r\n method: \"GET\",\r\n headers,\r\n signal: options.signal,\r\n });\r\n\r\n this.log({\r\n event: \"request:success\",\r\n path,\r\n attempt,\r\n correlationId: response.correlationId,\r\n elapsedMs: startTime() - startedAt,\r\n });\r\n\r\n return response;\r\n },\r\n resolvedRetry,\r\n (error) => this.shouldRetry(error),\r\n (attempt, delayMs, error) => {\r\n this.log({\r\n event: \"retry:scheduled\",\r\n path,\r\n attempt,\r\n correlationId: options.correlationId,\r\n error,\r\n elapsedMs: delayMs,\r\n });\r\n },\r\n options.signal\r\n ).catch((error) => {\r\n this.log({\r\n event: \"retry:exhausted\",\r\n path,\r\n attempt: resolvedRetry.maxAttempts,\r\n correlationId: options.correlationId,\r\n error,\r\n });\r\n throw error;\r\n });\r\n }\r\n\r\n private async performFetch<T>(init: {\r\n url: string;\r\n method: string;\r\n headers: HeadersDict;\r\n body?: string;\r\n signal?: AbortSignal;\r\n }): Promise<UsageTapSuccessResponse<T>> {\r\n let response: Response;\r\n try {\r\n response = await this.fetchImpl(init.url, {\r\n method: init.method,\r\n headers: init.headers,\r\n body: init.body,\r\n signal: init.signal,\r\n });\r\n } catch (error) {\r\n throw new UsageTapError(\r\n \"USAGETAP_NETWORK_ERROR\",\r\n \"Failed to reach UsageTap\",\r\n {\r\n retryable: true,\r\n cause: error,\r\n }\r\n );\r\n }\r\n\r\n const correlationId = response.headers.get(CORRELATION_HEADER) ?? undefined;\r\n const text = await response.text();\r\n let payload: EnvelopeShape | undefined;\r\n\r\n if (text) {\r\n try {\r\n payload = JSON.parse(text) as EnvelopeShape;\r\n } catch (error) {\r\n throw new UsageTapError(\r\n \"USAGETAP_INVALID_RESPONSE\",\r\n \"UsageTap returned invalid JSON\",\r\n {\r\n retryable: false,\r\n correlationId,\r\n cause: error,\r\n }\r\n );\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n throw this.toHttpError(response.status, payload, correlationId);\r\n }\r\n\r\n if (!payload?.result || payload.result.status !== \"ACCEPTED\") {\r\n throw this.toApiError(payload, correlationId);\r\n }\r\n\r\n const resolvedCorrelation = payload.correlationId ?? correlationId;\r\n if (\r\n payload.data === undefined ||\r\n payload.data === null ||\r\n !resolvedCorrelation\r\n ) {\r\n throw new UsageTapError(\r\n \"USAGETAP_INVALID_RESPONSE\",\r\n \"UsageTap response missing data or correlationId\",\r\n {\r\n correlationId: resolvedCorrelation ?? correlationId,\r\n }\r\n );\r\n }\r\n\r\n return {\r\n result: {\r\n status: payload.result.status as \"ACCEPTED\",\r\n code: payload.result.code,\r\n message: payload.result.message,\r\n timestamp: payload.result.timestamp,\r\n },\r\n data: payload.data as T,\r\n correlationId: resolvedCorrelation,\r\n } satisfies UsageTapSuccessResponse<T>;\r\n }\r\n\r\n private composeHeaders(\r\n body: string | undefined,\r\n options: InternalRequestOptions\r\n ): HeadersDict {\r\n const headers: HeadersDict = {\r\n ...this.defaultHeaders,\r\n [SDK_HEADER]: `js/${SDK_VERSION}`,\r\n \"content-type\": \"application/json\",\r\n accept: CANONICAL_MEDIA_TYPE,\r\n };\r\n\r\n if (!HAS_WINDOW) {\r\n // Browsers forbid setting user-agent; only attach it server-side.\r\n headers[\"user-agent\"] = `${USER_AGENT}/${SDK_VERSION}`;\r\n }\r\n\r\n if (this.authHeader === API_KEY_HEADER) {\r\n headers[API_KEY_HEADER] = this.apiKey;\r\n } else {\r\n headers[AUTH_HEADER] = `Bearer ${this.apiKey}`;\r\n }\r\n\r\n if (options.idempotencyKey) {\r\n headers[IDEMPOTENCY_HEADER] = options.idempotencyKey;\r\n }\r\n\r\n if (options.correlationId) {\r\n headers[CORRELATION_HEADER] = options.correlationId;\r\n }\r\n\r\n if (!body) {\r\n delete headers[\"content-type\"];\r\n }\r\n\r\n if (options.headers) {\r\n Object.assign(headers, normalizeHeaderDictionary(options.headers));\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n private log(entry: UsageTapLogEntry): void {\r\n this.logFn?.(entry);\r\n }\r\n\r\n private mergeTags(tags?: string[]): string[] | undefined {\r\n if (!tags && !this.defaultTags) {\r\n return undefined;\r\n }\r\n\r\n const combined = [...(this.defaultTags ?? []), ...(tags ?? [])].filter(\r\n Boolean\r\n );\r\n return combined.length ? dedupeStrings(combined) : undefined;\r\n }\r\n\r\n private shouldRetry(error: unknown): boolean {\r\n if (isUsageTapError(error)) {\r\n return Boolean(error.retryable);\r\n }\r\n\r\n if (error instanceof Error && error.name === \"AbortError\") {\r\n return false;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private toHttpError(\r\n status: number,\r\n payload: EnvelopeShape | undefined,\r\n correlationId?: string\r\n ): UsageTapError {\r\n const code = mapStatusToErrorCode(status);\r\n const retryable = isRetryableStatus(status);\r\n const message =\r\n payload?.error?.message ??\r\n payload?.result?.message ??\r\n `UsageTap responded with HTTP ${status}`;\r\n\r\n return new UsageTapError(code, message, {\r\n status,\r\n retryable,\r\n correlationId: payload?.correlationId ?? correlationId,\r\n details: sanitizeDetails(payload),\r\n });\r\n }\r\n\r\n private toApiError(\r\n payload: EnvelopeShape | undefined,\r\n correlationId?: string\r\n ): UsageTapError {\r\n const normalizedCode =\r\n payload?.error?.code ?? payload?.result?.code ?? \"UNKNOWN\";\r\n const retryable = isRetryableApiCode(normalizedCode);\r\n const message =\r\n payload?.error?.message ??\r\n payload?.result?.message ??\r\n \"UsageTap reported an error\";\r\n\r\n return new UsageTapError(mapApiCodeToError(normalizedCode), message, {\r\n retryable,\r\n correlationId: payload?.correlationId ?? correlationId,\r\n details: sanitizeDetails(payload),\r\n });\r\n }\r\n}\r\n\r\nfunction mapStatusToErrorCode(status: number): UsageTapErrorCode {\r\n if (status === 401 || status === 403) return \"USAGETAP_AUTH_ERROR\";\r\n if (status === 400 || status === 404 || status === 409)\r\n return \"USAGETAP_BAD_REQUEST\";\r\n if (status === 429) return \"USAGETAP_RATE_LIMITED\";\r\n if (status >= 500) return \"USAGETAP_SERVER_ERROR\";\r\n return \"USAGETAP_INVALID_RESPONSE\";\r\n}\r\n\r\nfunction isRetryableStatus(status: number): boolean {\r\n return (\r\n status === 408 ||\r\n status === 425 ||\r\n status === 429 ||\r\n status === 500 ||\r\n status === 502 ||\r\n status === 503 ||\r\n status === 504\r\n );\r\n}\r\n\r\nfunction isRetryableApiCode(code: string): boolean {\r\n const normalized = code.toUpperCase();\r\n return (\r\n normalized.includes(\"TRANSIENT\") ||\r\n normalized.includes(\"RETRY\") ||\r\n normalized.includes(\"TIMEOUT\") ||\r\n normalized.includes(\"THROTTLE\") ||\r\n normalized.includes(\"RATE_LIMIT\")\r\n );\r\n}\r\n\r\nfunction mapApiCodeToError(code: string): UsageTapErrorCode {\r\n const normalized = code.toUpperCase();\r\n if (normalized.includes(\"AUTH\") || normalized.includes(\"TOKEN\")) {\r\n return \"USAGETAP_AUTH_ERROR\";\r\n }\r\n if (normalized.includes(\"RATE\") || normalized.includes(\"THROTTLE\")) {\r\n return \"USAGETAP_RATE_LIMITED\";\r\n }\r\n if (normalized.includes(\"SERVER\") || normalized.includes(\"TRANSIENT\")) {\r\n return \"USAGETAP_SERVER_ERROR\";\r\n }\r\n if (\r\n normalized.includes(\"IDEMPOTENCY\") ||\r\n normalized.includes(\"VALIDATION\") ||\r\n normalized.includes(\"REQUEST\")\r\n ) {\r\n return \"USAGETAP_BAD_REQUEST\";\r\n }\r\n return \"USAGETAP_INVALID_RESPONSE\";\r\n}\r\n\r\nfunction sanitizeDetails(\r\n payload: EnvelopeShape | undefined\r\n): Record<string, unknown> | undefined {\r\n if (!payload) return undefined;\r\n const details: Record<string, unknown> = {};\r\n if (payload.result) details.result = payload.result;\r\n if (payload.error) details.error = payload.error;\r\n return Object.keys(details).length ? details : undefined;\r\n}\r\n\r\nfunction normalizeBaseUrl(baseUrl: string): string {\r\n const trimmed = baseUrl.trim();\r\n if (!trimmed) return trimmed;\r\n return trimmed.endsWith(\"/\") ? trimmed : `${trimmed}/`;\r\n}\r\n\r\nfunction normalizeHeaderDictionary(dict: Record<string, string>): HeadersDict {\r\n return Object.keys(dict).reduce<HeadersDict>((acc, key) => {\r\n acc[key.toLowerCase()] = dict[key];\r\n return acc;\r\n }, {});\r\n}\r\n\r\nfunction dedupeStrings(values: string[]): string[] {\r\n return Array.from(\r\n new Set(values.map((value) => value.trim()).filter(Boolean))\r\n );\r\n}\r\n\r\nfunction wrapEndCallError(\r\n error: unknown,\r\n correlationId?: string\r\n): UsageTapError {\r\n if (isUsageTapError(error)) {\r\n return new UsageTapError(\"USAGETAP_END_CALL_ERROR\", error.message, {\r\n correlationId: error.correlationId ?? correlationId,\r\n details: error.details,\r\n cause: error,\r\n });\r\n }\r\n\r\n return new UsageTapError(\r\n \"USAGETAP_END_CALL_ERROR\",\r\n \"Failed to finalize UsageTap call\",\r\n {\r\n correlationId,\r\n cause: error,\r\n }\r\n );\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","import type OpenAI from \"openai\";\r\nimport { UsageTapClient } from \"../client\";\r\nimport type { OpenAIAdapter } from \"./openai\";\r\nimport { createOpenAIAdapter } from \"./openai\";\r\n\r\nexport interface OpenRouterAdapterInit {\r\n client: OpenAI;\r\n usageTap: UsageTapClient;\r\n}\r\n\r\nexport function createOpenRouterAdapter(init: OpenRouterAdapterInit): OpenAIAdapter {\r\n return createOpenAIAdapter(init);\r\n}\r\n","import { UsageTapClient } from \"../client\";\r\nimport type { BeginCallRequest, EndCallRequest } from \"../types\";\r\n\r\nexport interface WrapFetchContext extends Omit<BeginCallRequest, \"idempotency\"> {\r\n customerId: string;\r\n}\r\n\r\nexport interface WrapFetchOptions {\r\n /**\r\n * Context for UsageTap begin calls.\r\n * Can be overridden per-request via special headers.\r\n */\r\n defaultContext: WrapFetchContext;\r\n \r\n /**\r\n * Optional custom fetch implementation to wrap.\r\n * Defaults to global fetch.\r\n */\r\n baseFetch?: typeof fetch;\r\n \r\n /**\r\n * Generate idempotency keys automatically if not provided.\r\n * Default: true\r\n */\r\n autoIdempotency?: boolean;\r\n \r\n /**\r\n * Detect OpenAI-compatible endpoints by URL pattern.\r\n * Default: detects /v1/chat/completions and /v1/responses\r\n */\r\n isOpenAIEndpoint?: (url: string) => boolean;\r\n}\r\n\r\ninterface CallState {\r\n callId: string;\r\n correlationId?: string;\r\n usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">>;\r\n finalized: boolean;\r\n}\r\n\r\ntype JsonRecord = Record<string, unknown>;\r\n\r\nfunction isJsonRecord(value: unknown): value is JsonRecord {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction readString(value: unknown): string | undefined {\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\nfunction readNumber(value: unknown): number | undefined {\r\n return typeof value === \"number\" ? value : undefined;\r\n}\r\n\r\nfunction parseJsonRecord(text: string): JsonRecord | undefined {\r\n try {\r\n const parsed = JSON.parse(text) as unknown;\r\n return isJsonRecord(parsed) ? parsed : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction parseStringArray(value: string): string[] | undefined {\r\n try {\r\n const parsed = JSON.parse(value) as unknown;\r\n if (Array.isArray(parsed) && parsed.every((item) => typeof item === \"string\")) {\r\n return parsed;\r\n }\r\n } catch {\r\n return undefined;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Wraps a fetch implementation to automatically instrument OpenAI API calls\r\n * with UsageTap begin/end tracking.\r\n * \r\n * Example:\r\n * ```ts\r\n * const wrappedFetch = wrapFetch(usageTap, {\r\n * defaultContext: { customerId: \"cust_123\", feature: \"chat\" }\r\n * });\r\n * \r\n * const openai = new OpenAI({\r\n * apiKey: process.env.OPENAI_API_KEY!,\r\n * fetch: wrappedFetch,\r\n * });\r\n * ```\r\n */\r\nexport function wrapFetch(\r\n usageTap: UsageTapClient,\r\n options: WrapFetchOptions,\r\n): typeof fetch {\r\n const {\r\n defaultContext,\r\n baseFetch = globalThis.fetch,\r\n autoIdempotency = true,\r\n isOpenAIEndpoint = defaultIsOpenAIEndpoint,\r\n } = options;\r\n\r\n return async function wrappedFetch(\r\n input: string | URL | Request,\r\n init?: RequestInit,\r\n ): Promise<Response> {\r\n const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url;\r\n \r\n // Only intercept OpenAI endpoints\r\n if (!isOpenAIEndpoint(url)) {\r\n return baseFetch(input, init);\r\n }\r\n\r\n // Parse request body to extract context overrides and detect streaming\r\n let body: JsonRecord | undefined;\r\n let isStreaming = false;\r\n const contextOverride: Partial<WrapFetchContext> = {};\r\n\r\n try {\r\n if (init?.body && typeof init.body === \"string\") {\r\n const parsedBody = parseJsonRecord(init.body);\r\n if (!parsedBody) {\r\n return baseFetch(input, init);\r\n }\r\n\r\n body = parsedBody;\r\n isStreaming = parsedBody.stream === true;\r\n\r\n // Check for context overrides in special headers\r\n const headers = new Headers(init.headers);\r\n const customerIdHeader = headers.get(\"x-usagetap-customer-id\");\r\n const featureHeader = headers.get(\"x-usagetap-feature\");\r\n const tagsHeader = headers.get(\"x-usagetap-tags\");\r\n\r\n if (customerIdHeader) {\r\n contextOverride.customerId = customerIdHeader;\r\n }\r\n if (featureHeader) {\r\n contextOverride.feature = featureHeader;\r\n }\r\n if (tagsHeader) {\r\n const tags = parseStringArray(tagsHeader);\r\n if (tags) {\r\n contextOverride.tags = tags;\r\n }\r\n }\r\n }\r\n } catch {\r\n // If body parsing fails, proceed without interception\r\n return baseFetch(input, init);\r\n }\r\n\r\n // Merge context\r\n const context: BeginCallRequest = {\r\n ...defaultContext,\r\n ...contextOverride,\r\n idempotency: autoIdempotency ? crypto.randomUUID() : undefined,\r\n };\r\n\r\n // Begin the call\r\n let callState: CallState | undefined;\r\n try {\r\n const beginResponse = await usageTap.beginCall(context);\r\n callState = {\r\n callId: beginResponse.data.callId,\r\n correlationId: beginResponse.correlationId,\r\n usage: {},\r\n finalized: false,\r\n };\r\n } catch (error) {\r\n // If begin fails, proceed with original fetch but log error\r\n console.error(\"[wrapFetch] Failed to begin call:\", error);\r\n return baseFetch(input, init);\r\n }\r\n\r\n // Add correlation header to vendor request\r\n const modifiedInit = {\r\n ...init,\r\n headers: {\r\n ...init?.headers,\r\n \"x-usage-correlation-id\": callState.correlationId || \"\",\r\n },\r\n };\r\n\r\n // Call the vendor API\r\n try {\r\n const response = await baseFetch(input, modifiedInit);\r\n \r\n if (isStreaming) {\r\n // Wrap streaming response\r\n return wrapStreamingResponse(response, callState, usageTap);\r\n } else {\r\n // Handle non-streaming response\r\n return await wrapNonStreamingResponse(response, callState, usageTap, body);\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n // Vendor call failed\r\n await finalizeCall(callState, usageTap, {\r\n code: \"VENDOR_ERROR\",\r\n message,\r\n });\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\nfunction defaultIsOpenAIEndpoint(url: string): boolean {\r\n return (\r\n url.includes(\"/v1/chat/completions\") ||\r\n url.includes(\"/v1/responses\") ||\r\n url.includes(\"/v1/embeddings\")\r\n );\r\n}\r\n\r\nasync function wrapNonStreamingResponse(\r\n response: Response,\r\n callState: CallState,\r\n usageTap: UsageTapClient,\r\n requestBody: JsonRecord | undefined,\r\n): Promise<Response> {\r\n // Clone response to read body\r\n const clonedResponse = response.clone();\r\n \r\n try {\r\n const parsed = await clonedResponse.json();\r\n const usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\r\n\r\n if (isJsonRecord(parsed)) {\r\n const usageBlock = parsed.usage;\r\n if (isJsonRecord(usageBlock)) {\r\n const promptTokens = readNumber(usageBlock.prompt_tokens ?? usageBlock.input_tokens);\r\n if (promptTokens !== undefined) {\r\n usage.inputTokens = promptTokens;\r\n }\r\n\r\n const completionTokens = readNumber(usageBlock.completion_tokens ?? usageBlock.output_tokens);\r\n if (completionTokens !== undefined) {\r\n usage.responseTokens = completionTokens;\r\n }\r\n\r\n const cachedTokens = readNumber(usageBlock.prompt_cache_hit_tokens);\r\n if (cachedTokens !== undefined) {\r\n usage.cachedTokens = cachedTokens;\r\n }\r\n\r\n const reasoningTokens = readNumber(usageBlock.reasoning_tokens);\r\n if (reasoningTokens !== undefined) {\r\n usage.reasoningTokens = reasoningTokens;\r\n }\r\n }\r\n\r\n const modelFromResponse = readString(parsed.model);\r\n if (modelFromResponse) {\r\n usage.modelUsed = modelFromResponse;\r\n }\r\n }\r\n\r\n if (!usage.modelUsed && requestBody) {\r\n const requestModel = readString(requestBody.model);\r\n if (requestModel) {\r\n usage.modelUsed = requestModel;\r\n }\r\n }\r\n\r\n // Finalize the call\r\n await finalizeCall(callState, usageTap, undefined, usage);\r\n\r\n return response;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n // If we can't parse response, finalize with error\r\n await finalizeCall(callState, usageTap, {\r\n code: \"RESPONSE_PARSE_ERROR\",\r\n message,\r\n });\r\n return response;\r\n }\r\n}\r\n\r\nfunction wrapStreamingResponse(\r\n response: Response,\r\n callState: CallState,\r\n usageTap: UsageTapClient,\r\n): Response {\r\n if (!response.body) {\r\n // No body to stream, finalize now\r\n void finalizeCall(callState, usageTap, {\r\n code: \"NO_RESPONSE_BODY\",\r\n message: \"Streaming response has no body\",\r\n });\r\n return response;\r\n }\r\n\r\n const originalBody = response.body;\r\n const accumulatedUsage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\r\n const textDecoder = new TextDecoder();\r\n\r\n const transformStream = new TransformStream({\r\n transform(chunk: Uint8Array, controller) {\r\n controller.enqueue(chunk);\r\n \r\n // Try to parse usage from SSE data\r\n try {\r\n const text = textDecoder.decode(chunk, { stream: true });\r\n const lines = text.split(\"\\n\");\r\n \r\n for (const line of lines) {\r\n if (line.startsWith(\"data: \")) {\r\n const data = line.slice(6);\r\n if (data === \"[DONE]\") continue;\r\n \r\n const parsedRecord = parseJsonRecord(data);\r\n if (!parsedRecord) {\r\n continue;\r\n }\r\n\r\n const usageBlock = parsedRecord.usage;\r\n if (isJsonRecord(usageBlock)) {\r\n const promptTokens = readNumber(usageBlock.prompt_tokens ?? usageBlock.input_tokens);\r\n if (promptTokens !== undefined) {\r\n accumulatedUsage.inputTokens = promptTokens;\r\n }\r\n\r\n const completionTokens = readNumber(usageBlock.completion_tokens ?? usageBlock.output_tokens);\r\n if (completionTokens !== undefined) {\r\n accumulatedUsage.responseTokens = completionTokens;\r\n }\r\n\r\n const cachedTokens = readNumber(usageBlock.prompt_cache_hit_tokens);\r\n if (cachedTokens !== undefined) {\r\n accumulatedUsage.cachedTokens = cachedTokens;\r\n }\r\n\r\n const reasoningTokens = readNumber(usageBlock.reasoning_tokens);\r\n if (reasoningTokens !== undefined) {\r\n accumulatedUsage.reasoningTokens = reasoningTokens;\r\n }\r\n }\r\n\r\n const model = readString(parsedRecord.model);\r\n if (model) {\r\n accumulatedUsage.modelUsed = model;\r\n }\r\n }\r\n }\r\n } catch {\r\n // Ignore decode errors\r\n }\r\n },\r\n\r\n async flush() {\r\n // Stream completed successfully\r\n await finalizeCall(callState, usageTap, undefined, accumulatedUsage);\r\n },\r\n });\r\n\r\n // Handle stream errors and cancellation\r\n const wrappedBody = originalBody.pipeThrough(transformStream);\r\n \r\n // Note: Response doesn't have signal property, abort handling happens via stream closure\r\n\r\n return new Response(wrappedBody, {\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers: response.headers,\r\n });\r\n}\r\n\r\nasync function finalizeCall(\r\n callState: CallState,\r\n usageTap: UsageTapClient,\r\n error?: { code: string; message: string },\r\n usage?: Partial<Omit<EndCallRequest, \"callId\" | \"error\">>,\r\n): Promise<void> {\r\n if (callState.finalized) return;\r\n callState.finalized = true;\r\n\r\n try {\r\n await usageTap.endCall({\r\n callId: callState.callId,\r\n ...callState.usage,\r\n ...usage,\r\n error,\r\n });\r\n } catch (err) {\r\n console.error(\"[wrapFetch] Failed to finalize call:\", err);\r\n }\r\n}\r\n","import type OpenAI from \"openai\";\r\nimport type { Request, Response, NextFunction } from \"express\";\r\nimport { UsageTapClient } from \"../client\";\r\nimport { wrapOpenAI, type WrapOpenAIContext, type WrapOpenAIOptions, pipeToResponse } from \"./openai\";\r\n\r\nexport interface ExpressUsageTapContext {\r\n /**\r\n * Get a wrapped OpenAI client for this request.\r\n * The client automatically tracks usage with the provided context.\r\n */\r\n openai: (client: OpenAI, context?: Partial<WrapOpenAIContext>, options?: WrapOpenAIOptions) => ReturnType<typeof wrapOpenAI>;\r\n \r\n /**\r\n * Pipe an OpenAI stream directly to the Express response.\r\n * Automatically sets appropriate headers and finalizes usage.\r\n */\r\n pipeToResponse: typeof pipeToResponse;\r\n}\r\n\r\n/* eslint-disable @typescript-eslint/no-namespace */\r\ndeclare global {\r\n namespace Express {\r\n interface Request {\r\n usageTap?: ExpressUsageTapContext;\r\n }\r\n }\r\n}\r\n/* eslint-enable @typescript-eslint/no-namespace */\r\n\r\nexport interface WithUsageMiddlewareOptions {\r\n /**\r\n * Function to extract customer ID from the request.\r\n * Can read from headers, JWT tokens, session, etc.\r\n */\r\n getCustomerId: (req: Request) => string | Promise<string>;\r\n \r\n /**\r\n * Optional: Extract feature name from request\r\n */\r\n getFeature?: (req: Request) => string | undefined | Promise<string | undefined>;\r\n \r\n /**\r\n * Optional: Extract tags from request\r\n */\r\n getTags?: (req: Request) => string[] | undefined | Promise<string[] | undefined>;\r\n \r\n /**\r\n * Optional: Default context to merge with request-specific context\r\n */\r\n defaultContext?: Partial<Omit<WrapOpenAIContext, \"customerId\">>;\r\n}\r\n\r\n/**\r\n * Express middleware that adds UsageTap context to requests.\r\n * \r\n * @example\r\n * ```ts\r\n * const app = express();\r\n * \r\n * const usageTap = new UsageTapClient({\r\n * apiKey: process.env.USAGETAP_API_KEY!,\r\n * baseUrl: process.env.USAGETAP_BASE_URL!,\r\n * });\r\n * \r\n * app.use(withUsageMiddleware(usageTap, {\r\n * getCustomerId: (req) => req.user.id,\r\n * getFeature: (req) => req.path.split('/')[1],\r\n * }));\r\n * \r\n * app.post('/chat', async (req, res) => {\r\n * const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY! });\r\n * const ai = req.usageTap!.openai(openai);\r\n * \r\n * const stream = await ai.chat.completions.create({\r\n * model: \"gpt-4o-mini\",\r\n * messages: req.body.messages,\r\n * stream: true,\r\n * });\r\n * \r\n * req.usageTap!.pipeToResponse(stream, res);\r\n * });\r\n * ```\r\n */\r\nexport function withUsageMiddleware(\r\n usageTap: UsageTapClient,\r\n options: WithUsageMiddlewareOptions,\r\n): (req: Request, res: Response, next: NextFunction) => Promise<void> {\r\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\r\n try {\r\n // Extract context from request\r\n const customerId = await options.getCustomerId(req);\r\n const feature = options.getFeature ? await options.getFeature(req) : undefined;\r\n const tags = options.getTags ? await options.getTags(req) : undefined;\r\n \r\n const baseContext: WrapOpenAIContext = {\r\n customerId,\r\n feature,\r\n tags,\r\n ...options.defaultContext,\r\n };\r\n\r\n // Attach UsageTap helpers to request\r\n req.usageTap = {\r\n openai: (\r\n client: OpenAI,\r\n contextOverride?: Partial<WrapOpenAIContext>,\r\n wrapOptions?: WrapOpenAIOptions,\r\n ): ReturnType<typeof wrapOpenAI> => {\r\n const mergedContext = { ...baseContext, ...contextOverride };\r\n return wrapOpenAI(client, usageTap, {\r\n ...wrapOptions,\r\n defaultContext: mergedContext,\r\n });\r\n },\r\n pipeToResponse,\r\n };\r\n next();\r\n } catch (error) {\r\n next(error);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Simpler middleware that only requires customer ID extraction.\r\n * \r\n * @example\r\n * ```ts\r\n * app.use(withUsage(usageTap, (req) => req.user.id));\r\n * \r\n * app.post('/chat', async (req, res) => {\r\n * const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY! });\r\n * const ai = req.usageTap!.openai(openai, { feature: \"chat\" });\r\n * const completion = await ai.chat.completions.create({...});\r\n * res.json(completion);\r\n * });\r\n * ```\r\n */\r\nexport function withUsage(\r\n usageTap: UsageTapClient,\r\n getCustomerId: (req: Request) => string | Promise<string>,\r\n): (req: Request, res: Response, next: NextFunction) => Promise<void> {\r\n return withUsageMiddleware(usageTap, { getCustomerId });\r\n}\r\n"]}