@lelemondev/sdk 0.6.2 → 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/logger.ts","../src/core/transport.ts","../src/core/config.ts","../src/providers/base.ts","../src/core/capture.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/bedrock.ts","../src/providers/gemini.ts","../src/providers/openrouter.ts","../src/observe.ts"],"names":["getEnvVar","PROVIDER_NAME","canHandle","isAsyncIterable","wrapStream","extractTokens","wrap","wrapChatCreate","extractChatCompletion","extractStreamChunkTokens"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Centralized Logger\n *\n * Provides consistent debug logging across the SDK.\n * Enable via: init({ debug: true }) or LELEMON_DEBUG=true\n */\n\n// ─────────────────────────────────────────────────────────────\n// State\n// ─────────────────────────────────────────────────────────────\n\nlet debugEnabled = false;\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Enable or disable debug mode\n */\nexport function setDebug(enabled: boolean): void {\n debugEnabled = enabled;\n}\n\n/**\n * Check if debug mode is enabled\n */\nexport function isDebugEnabled(): boolean {\n // Config takes precedence, then check env var\n if (debugEnabled) return true;\n return getEnvVar('LELEMON_DEBUG') === 'true';\n}\n\n// ─────────────────────────────────────────────────────────────\n// Logging Functions\n// ─────────────────────────────────────────────────────────────\n\nconst PREFIX = '[Lelemon]';\n\n/**\n * Log debug message (only when debug enabled)\n */\nexport function debug(message: string, data?: unknown): void {\n if (!isDebugEnabled()) return;\n logWithPrefix('debug', message, data);\n}\n\n/**\n * Log info message (only when debug enabled)\n */\nexport function info(message: string, data?: unknown): void {\n if (!isDebugEnabled()) return;\n logWithPrefix('info', message, data);\n}\n\n/**\n * Log warning message (always shown)\n */\nexport function warn(message: string, data?: unknown): void {\n logWithPrefix('warn', message, data);\n}\n\n/**\n * Log error message (always shown)\n */\nexport function error(message: string, data?: unknown): void {\n logWithPrefix('error', message, data);\n}\n\n// ─────────────────────────────────────────────────────────────\n// Trace-specific logging\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Log when a trace is captured\n */\nexport function traceCapture(provider: string, model: string, durationMs: number, status: string): void {\n if (!isDebugEnabled()) return;\n console.log(\n `${PREFIX} Captured trace: provider=${provider} model=${model} duration=${durationMs}ms status=${status}`\n );\n}\n\n/**\n * Log when a trace capture fails (always visible)\n */\nexport function traceCaptureError(provider: string, err: Error): void {\n console.error(`${PREFIX} Failed to capture trace: provider=${provider} error=${err.message}`);\n}\n\n/**\n * Log when a client is wrapped\n */\nexport function clientWrapped(provider: string): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Wrapped client: provider=${provider}`);\n}\n\n/**\n * Log transport events\n */\nexport function transportEvent(event: string, details?: Record<string, unknown>): void {\n if (!isDebugEnabled()) return;\n if (details) {\n console.log(`${PREFIX} Transport: ${event}`, details);\n } else {\n console.log(`${PREFIX} Transport: ${event}`);\n }\n}\n\n/**\n * Log batch send details\n */\nexport function batchSend(count: number, endpoint: string): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Sending batch: count=${count} endpoint=${endpoint}`);\n}\n\n/**\n * Log batch send success\n */\nexport function batchSuccess(count: number, durationMs: number): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Batch sent successfully: count=${count} duration=${durationMs}ms`);\n}\n\n/**\n * Log batch send failure (always visible - errors should never be silent)\n */\nexport function batchError(count: number, err: unknown): void {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${PREFIX} Batch send failed: count=${count} error=${message}`);\n}\n\n/**\n * Log request details (for deep debugging)\n */\nexport function requestDetails(method: string, url: string, bodySize: number): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Request: ${method} ${url} (${bodySize} bytes)`);\n}\n\n/**\n * Log response details\n */\nexport function responseDetails(status: number, durationMs: number): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Response: status=${status} duration=${durationMs}ms`);\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction logWithPrefix(level: 'debug' | 'info' | 'warn' | 'error', message: string, data?: unknown): void {\n const logFn = level === 'error' ? console.error : level === 'warn' ? console.warn : console.log;\n\n if (data !== undefined) {\n logFn(`${PREFIX} ${message}`, data);\n } else {\n logFn(`${PREFIX} ${message}`);\n }\n}\n\nfunction getEnvVar(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n","/**\n * Transport Layer\n *\n * Handles batched HTTP requests to the Lelemon API.\n * Features:\n * - Queue-based batching\n * - Auto-flush on batch size or interval\n * - Request timeout protection\n * - Graceful error handling\n */\n\nimport type { CreateTraceRequest } from './types';\nimport { batchSend, batchSuccess, batchError, requestDetails, responseDetails, transportEvent } from './logger';\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\n\ninterface TransportConfig {\n apiKey: string;\n endpoint: string;\n debug: boolean;\n disabled: boolean;\n batchSize?: number;\n flushIntervalMs?: number;\n requestTimeoutMs?: number;\n}\n\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_FLUSH_INTERVAL_MS = 1000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10000;\n\n// ─────────────────────────────────────────────────────────────\n// Transport Class\n// ─────────────────────────────────────────────────────────────\n\nexport class Transport {\n private readonly config: Required<TransportConfig>;\n private queue: CreateTraceRequest[] = [];\n private flushPromise: Promise<void> | null = null;\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: TransportConfig) {\n this.config = {\n apiKey: config.apiKey,\n endpoint: config.endpoint,\n debug: config.debug,\n disabled: config.disabled,\n batchSize: config.batchSize ?? DEFAULT_BATCH_SIZE,\n flushIntervalMs: config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n requestTimeoutMs: config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n };\n }\n\n /**\n * Check if transport is enabled\n */\n isEnabled(): boolean {\n return !this.config.disabled && !!this.config.apiKey;\n }\n\n /**\n * Enqueue a trace for sending\n * Fire-and-forget - never blocks\n */\n enqueue(trace: CreateTraceRequest): void {\n if (this.config.disabled) return;\n\n this.queue.push(trace);\n\n if (this.queue.length >= this.config.batchSize) {\n this.flush();\n } else {\n this.scheduleFlush();\n }\n }\n\n /**\n * Flush all pending traces\n * Safe to call multiple times\n */\n async flush(): Promise<void> {\n if (this.flushPromise) {\n return this.flushPromise;\n }\n\n if (this.queue.length === 0) {\n return;\n }\n\n this.cancelScheduledFlush();\n\n const items = this.queue;\n this.queue = [];\n\n this.flushPromise = this.sendBatch(items).finally(() => {\n this.flushPromise = null;\n });\n\n return this.flushPromise;\n }\n\n /**\n * Get pending count (for debugging)\n */\n getPendingCount(): number {\n return this.queue.length;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────\n\n private scheduleFlush(): void {\n if (this.flushTimer !== null) return;\n\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null;\n this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private cancelScheduledFlush(): void {\n if (this.flushTimer !== null) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n private async sendBatch(items: CreateTraceRequest[]): Promise<void> {\n if (items.length === 0) return;\n\n const startTime = Date.now();\n batchSend(items.length, `${this.config.endpoint}/api/v1/ingest`);\n\n try {\n await this.request('POST', '/api/v1/ingest', { events: items });\n batchSuccess(items.length, Date.now() - startTime);\n } catch (error) {\n batchError(items.length, error);\n // Don't rethrow - observability should never crash the app\n }\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<unknown> {\n const url = `${this.config.endpoint}${path}`;\n const controller = new AbortController();\n const bodyStr = body ? JSON.stringify(body) : undefined;\n\n requestDetails(method, url, bodyStr?.length ?? 0);\n\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, this.config.requestTimeoutMs);\n\n const startTime = Date.now();\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.apiKey}`,\n },\n body: bodyStr,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n responseDetails(response.status, Date.now() - startTime);\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(`HTTP ${response.status}: ${errorText}`);\n }\n\n const text = await response.text();\n return text ? JSON.parse(text) : {};\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`);\n }\n\n throw error;\n }\n }\n}\n","/**\n * Global Configuration\n *\n * Manages SDK configuration and transport instance.\n */\n\nimport type { LelemonConfig } from './types';\nimport { Transport } from './transport';\nimport { setDebug, info, warn, debug } from './logger';\n\n// ─────────────────────────────────────────────────────────────\n// Global State\n// ─────────────────────────────────────────────────────────────\n\nlet globalConfig: LelemonConfig = {};\nlet globalTransport: Transport | null = null;\nlet initialized = false;\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\n\nconst DEFAULT_ENDPOINT = 'https://lelemon.dev';\n\n/**\n * Initialize the SDK\n * Call once at app startup\n */\nexport function init(config: LelemonConfig = {}): void {\n globalConfig = config;\n\n // Configure debug mode\n if (config.debug) {\n setDebug(true);\n }\n\n info('Initializing SDK', {\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n debug: config.debug ?? false,\n disabled: config.disabled ?? false,\n });\n\n globalTransport = createTransport(config);\n initialized = true;\n\n // Log status after transport is created\n if (globalTransport.isEnabled()) {\n info('SDK initialized - tracing enabled');\n } else {\n debug('SDK initialized - tracing disabled (no API key or explicitly disabled)');\n }\n}\n\n/**\n * Get current config\n */\nexport function getConfig(): LelemonConfig {\n return globalConfig;\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isInitialized(): boolean {\n return initialized;\n}\n\n/**\n * Check if SDK is enabled\n */\nexport function isEnabled(): boolean {\n return getTransport().isEnabled();\n}\n\n// ─────────────────────────────────────────────────────────────\n// Transport\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Get or create transport instance\n */\nexport function getTransport(): Transport {\n if (!globalTransport) {\n globalTransport = createTransport(globalConfig);\n }\n return globalTransport;\n}\n\n/**\n * Flush all pending traces\n */\nexport async function flush(): Promise<void> {\n if (globalTransport) {\n await globalTransport.flush();\n }\n}\n\n/**\n * Create transport instance\n */\nfunction createTransport(config: LelemonConfig): Transport {\n const apiKey = config.apiKey ?? getEnvVar('LELEMON_API_KEY');\n\n if (!apiKey && !config.disabled) {\n warn('No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled.');\n }\n\n return new Transport({\n apiKey: apiKey ?? '',\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n debug: config.debug ?? false,\n disabled: config.disabled ?? !apiKey,\n batchSize: config.batchSize,\n flushIntervalMs: config.flushIntervalMs,\n requestTimeoutMs: config.requestTimeoutMs,\n });\n}\n\n/**\n * Get environment variable (works in Node and edge)\n */\nfunction getEnvVar(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n","/**\n * Base Provider Interface\n *\n * All provider wrappers must implement this interface.\n * Uses Strategy pattern for different LLM providers.\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\n\n// ─────────────────────────────────────────────────────────────\n// Provider Interface\n// ─────────────────────────────────────────────────────────────\n\nexport interface BaseProvider<TClient = unknown> {\n /** Provider name */\n readonly name: ProviderName;\n\n /**\n * Check if this provider can handle the given client\n */\n canHandle(client: unknown): boolean;\n\n /**\n * Wrap the client with tracing\n */\n wrap(client: TClient): TClient;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Interfaces\n// ─────────────────────────────────────────────────────────────\n\nexport interface ExtractedData {\n model: string;\n input: unknown;\n output: unknown;\n tokens: TokenUsage | null;\n streaming: boolean;\n}\n\nexport interface RequestInfo {\n model: string;\n input: unknown;\n streaming: boolean;\n}\n\nexport interface ResponseInfo {\n output: unknown;\n tokens: TokenUsage | null;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Method Wrapper Types\n// ─────────────────────────────────────────────────────────────\n\nexport type AsyncMethod = (...args: unknown[]) => Promise<unknown>;\n\nexport interface WrapContext {\n provider: ProviderName;\n method: string;\n startTime: number;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helper: Safe extraction with fallback\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Safely extract a value with fallback\n * Never throws, always returns fallback on error\n */\nexport function safeExtract<T>(\n fn: () => T,\n fallback: T\n): T {\n try {\n return fn() ?? fallback;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Safely extract nested property\n */\nexport function getNestedValue(obj: unknown, path: string): unknown {\n try {\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current == null || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Check if value is a valid number\n */\nexport function isValidNumber(value: unknown): value is number {\n return typeof value === 'number' && !isNaN(value) && isFinite(value);\n}\n","/**\n * Capture Module\n *\n * Handles trace capture and batching.\n * Called by providers to record LLM calls.\n */\n\nimport type { ProviderName, CreateTraceRequest, ObserveOptions } from './types';\nimport { getTransport } from './config';\nimport { traceCapture, traceCaptureError, debug } from './logger';\n\n// ─────────────────────────────────────────────────────────────\n// Global context (set via observe options)\n// ─────────────────────────────────────────────────────────────\n\nlet globalContext: ObserveOptions = {};\n\nexport function setGlobalContext(options: ObserveOptions): void {\n globalContext = options;\n debug('Global context updated', options);\n}\n\nexport function getGlobalContext(): ObserveOptions {\n return globalContext;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Capture Functions\n// ─────────────────────────────────────────────────────────────\n\nexport interface CaptureTraceParams {\n provider: ProviderName;\n model: string;\n input: unknown;\n output: unknown;\n inputTokens: number;\n outputTokens: number;\n durationMs: number;\n status: 'success' | 'error';\n streaming: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CaptureErrorParams {\n provider: ProviderName;\n model: string;\n input: unknown;\n error: Error;\n durationMs: number;\n streaming: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Capture a successful trace\n * Fire-and-forget - never throws\n */\nexport function captureTrace(params: CaptureTraceParams): void {\n try {\n const transport = getTransport();\n if (!transport.isEnabled()) {\n debug('Transport disabled, skipping trace capture');\n return;\n }\n\n const context = getGlobalContext();\n\n const request: CreateTraceRequest = {\n provider: params.provider,\n model: params.model,\n input: sanitizeInput(params.input),\n output: sanitizeOutput(params.output),\n inputTokens: params.inputTokens,\n outputTokens: params.outputTokens,\n durationMs: params.durationMs,\n status: params.status,\n streaming: params.streaming,\n sessionId: context.sessionId,\n userId: context.userId,\n metadata: { ...context.metadata, ...params.metadata },\n tags: context.tags,\n };\n\n traceCapture(params.provider, params.model, params.durationMs, params.status);\n transport.enqueue(request);\n } catch (err) {\n traceCaptureError(params.provider, err instanceof Error ? err : new Error(String(err)));\n }\n}\n\n/**\n * Capture an error trace\n * Fire-and-forget - never throws\n */\nexport function captureError(params: CaptureErrorParams): void {\n try {\n const transport = getTransport();\n if (!transport.isEnabled()) {\n debug('Transport disabled, skipping error capture');\n return;\n }\n\n const context = getGlobalContext();\n\n const request: CreateTraceRequest = {\n provider: params.provider,\n model: params.model,\n input: sanitizeInput(params.input),\n output: null,\n inputTokens: 0,\n outputTokens: 0,\n durationMs: params.durationMs,\n status: 'error',\n errorMessage: params.error.message,\n errorStack: params.error.stack,\n streaming: params.streaming,\n sessionId: context.sessionId,\n userId: context.userId,\n metadata: { ...context.metadata, ...params.metadata },\n tags: context.tags,\n };\n\n traceCapture(params.provider, params.model, params.durationMs, 'error');\n debug('Error details', { message: params.error.message, stack: params.error.stack });\n transport.enqueue(request);\n } catch (err) {\n traceCaptureError(params.provider, err instanceof Error ? err : new Error(String(err)));\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Sanitization (security)\n// ─────────────────────────────────────────────────────────────\n\nconst MAX_STRING_LENGTH = 100_000; // 100KB per field\nconst SENSITIVE_KEYS = ['api_key', 'apikey', 'password', 'secret', 'token', 'authorization'];\n\n/**\n * Sanitize input before sending\n * - Truncates large strings\n * - Removes sensitive data\n */\nfunction sanitizeInput(input: unknown): unknown {\n return sanitize(input, 0);\n}\n\n/**\n * Sanitize output before sending\n */\nfunction sanitizeOutput(output: unknown): unknown {\n return sanitize(output, 0);\n}\n\nfunction sanitize(value: unknown, depth: number): unknown {\n // Prevent infinite recursion\n if (depth > 10) return '[max depth exceeded]';\n\n if (value === null || value === undefined) return value;\n\n if (typeof value === 'string') {\n return value.length > MAX_STRING_LENGTH\n ? value.slice(0, MAX_STRING_LENGTH) + '...[truncated]'\n : value;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => sanitize(item, depth + 1));\n }\n\n if (typeof value === 'object') {\n const sanitized: Record<string, unknown> = {};\n\n for (const [key, val] of Object.entries(value)) {\n // Redact sensitive keys\n if (SENSITIVE_KEYS.some((k) => key.toLowerCase().includes(k))) {\n sanitized[key] = '[REDACTED]';\n } else {\n sanitized[key] = sanitize(val, depth + 1);\n }\n }\n\n return sanitized;\n }\n\n // Functions, symbols, etc.\n return String(value);\n}\n","/**\n * OpenAI Provider Wrapper\n *\n * Wraps the OpenAI SDK to automatically capture:\n * - chat.completions.create()\n * - responses.create() (new Responses API - recommended)\n * - completions.create() (legacy)\n * - embeddings.create()\n *\n * Supports both streaming and non-streaming responses.\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\nimport { safeExtract, getNestedValue, isValidNumber } from './base';\nimport { captureTrace, captureError } from '../core/capture';\n\n// ─────────────────────────────────────────────────────────────\n// Types (minimal, to avoid SDK dependency)\n// ─────────────────────────────────────────────────────────────\n\ninterface OpenAIClient {\n chat?: {\n completions: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n };\n responses?: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n completions?: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n embeddings?: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n}\n\ninterface ChatCompletionRequest {\n model?: string;\n messages?: unknown[];\n stream?: boolean;\n [key: string]: unknown;\n}\n\ninterface StreamChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n role?: string;\n };\n finish_reason?: string;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n}\n\n// Responses API types (new recommended API)\ninterface ResponsesRequest {\n model?: string;\n input?: string | unknown[];\n instructions?: string;\n stream?: boolean;\n tools?: unknown[];\n [key: string]: unknown;\n}\n\ninterface ResponsesResult {\n id?: string;\n output?: unknown[];\n output_text?: string;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n };\n [key: string]: unknown;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'openai';\n\n/**\n * Check if client is OpenAI SDK\n */\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n\n // Check constructor name\n const constructorName = client.constructor?.name;\n if (constructorName === 'OpenAI') return true;\n\n // Check for characteristic properties (chat.completions or responses)\n const c = client as Record<string, unknown>;\n return !!(c.chat && c.completions) || !!c.responses;\n}\n\n/**\n * Wrap OpenAI client with tracing\n */\nexport function wrap(client: unknown): unknown {\n const openaiClient = client as OpenAIClient;\n return new Proxy(openaiClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n // Wrap nested objects (chat, completions, responses, etc.)\n if (prop === 'chat' && value && typeof value === 'object') {\n return wrapChatNamespace(value as OpenAIClient['chat']);\n }\n\n if (prop === 'responses' && value && typeof value === 'object') {\n return wrapResponsesNamespace(value as OpenAIClient['responses']);\n }\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapCompletionsNamespace(value as OpenAIClient['completions']);\n }\n\n if (prop === 'embeddings' && value && typeof value === 'object') {\n return wrapEmbeddingsNamespace(value as OpenAIClient['embeddings']);\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Namespace Wrappers\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapChatNamespace(chat: OpenAIClient['chat']) {\n if (!chat) return chat;\n\n return new Proxy(chat, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapChatCompletions(value as { create: (...args: unknown[]) => Promise<unknown> });\n }\n\n return value;\n },\n });\n}\n\nfunction wrapChatCompletions(completions: { create: (...args: unknown[]) => Promise<unknown> }) {\n return new Proxy(completions, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapChatCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapResponsesNamespace(responses: OpenAIClient['responses']) {\n if (!responses) return responses;\n\n return new Proxy(responses, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapResponsesCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapCompletionsNamespace(completions: OpenAIClient['completions']) {\n if (!completions) return completions;\n\n return new Proxy(completions, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapCompletionCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapEmbeddingsNamespace(embeddings: OpenAIClient['embeddings']) {\n if (!embeddings) return embeddings;\n\n return new Proxy(embeddings, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapEmbeddingsCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Method Wrappers\n// ─────────────────────────────────────────────────────────────\n\nexport function wrapChatCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedChatCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as ChatCompletionRequest;\n const isStreaming = request.stream === true;\n\n try {\n const response = await originalFn(...args);\n\n if (isStreaming && isAsyncIterable(response)) {\n // Return wrapped stream\n return wrapStream(response, request, startTime);\n }\n\n // Non-streaming response\n const durationMs = Date.now() - startTime;\n const extracted = extractChatCompletion(response);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || extracted.model || 'unknown',\n input: request.messages,\n output: extracted.output,\n inputTokens: extracted.tokens?.inputTokens || 0,\n outputTokens: extracted.tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: isStreaming,\n });\n\n throw error;\n }\n };\n}\n\n/**\n * Wrap responses.create() - new Responses API\n */\nexport function wrapResponsesCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedResponsesCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as ResponsesRequest;\n const isStreaming = request.stream === true;\n\n try {\n const response = await originalFn(...args);\n\n if (isStreaming && isAsyncIterable(response)) {\n return wrapResponsesStream(response, request, startTime);\n }\n\n const durationMs = Date.now() - startTime;\n const extracted = extractResponsesResult(response as ResponsesResult);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { instructions: request.instructions, input: request.input },\n output: extracted.output,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n durationMs,\n status: 'success',\n streaming: false,\n metadata: extracted.metadata,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { instructions: request.instructions, input: request.input },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: isStreaming,\n });\n\n throw error;\n }\n };\n}\n\nexport function wrapCompletionCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedCompletionCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as Record<string, unknown>;\n\n try {\n const response = await originalFn(...args);\n const durationMs = Date.now() - startTime;\n const extracted = extractLegacyCompletion(response);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: (request.model as string) || extracted.model || 'unknown',\n input: request.prompt,\n output: extracted.output,\n inputTokens: extracted.tokens?.inputTokens || 0,\n outputTokens: extracted.tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: (request.model as string) || 'unknown',\n input: request.prompt,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: false,\n });\n\n throw error;\n }\n };\n}\n\nexport function wrapEmbeddingsCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedEmbeddingsCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as Record<string, unknown>;\n\n try {\n const response = await originalFn(...args);\n const durationMs = Date.now() - startTime;\n const tokens = extractEmbeddingTokens(response);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: (request.model as string) || 'unknown',\n input: request.input,\n output: '[embedding vectors]',\n inputTokens: tokens?.inputTokens || 0,\n outputTokens: 0,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: (request.model as string) || 'unknown',\n input: request.input,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: false,\n });\n\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Streaming Support\n// ─────────────────────────────────────────────────────────────\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function';\n}\n\nasync function* wrapStream(\n stream: AsyncIterable<unknown>,\n request: ChatCompletionRequest,\n startTime: number\n): AsyncIterable<unknown> {\n const chunks: string[] = [];\n let tokens: TokenUsage | null = null;\n let error: Error | null = null;\n\n try {\n for await (const chunk of stream) {\n // Extract content from chunk\n const content = extractStreamChunkContent(chunk as StreamChunk);\n if (content) {\n chunks.push(content);\n }\n\n // Extract tokens if available (usually in last chunk)\n const chunkTokens = extractStreamChunkTokens(chunk as StreamChunk);\n if (chunkTokens) {\n tokens = chunkTokens;\n }\n\n yield chunk;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n const output = chunks.join('');\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n output,\n inputTokens: tokens?.inputTokens || 0,\n outputTokens: tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractChatCompletion(response: unknown): {\n model: string | null;\n output: unknown;\n tokens: TokenUsage | null;\n} {\n const model = safeExtract(() => getNestedValue(response, 'model') as string, null);\n const output = safeExtract(\n () => getNestedValue(response, 'choices.0.message.content') as string,\n null\n );\n const tokens = extractTokens(response);\n\n return { model, output, tokens };\n}\n\nfunction extractLegacyCompletion(response: unknown): {\n model: string | null;\n output: unknown;\n tokens: TokenUsage | null;\n} {\n const model = safeExtract(() => getNestedValue(response, 'model') as string, null);\n const output = safeExtract(\n () => getNestedValue(response, 'choices.0.text') as string,\n null\n );\n const tokens = extractTokens(response);\n\n return { model, output, tokens };\n}\n\nfunction extractTokens(response: unknown): TokenUsage | null {\n try {\n const usage = getNestedValue(response, 'usage');\n if (!usage || typeof usage !== 'object') return null;\n\n const u = usage as Record<string, unknown>;\n const promptTokens = u.prompt_tokens;\n const completionTokens = u.completion_tokens;\n const totalTokens = u.total_tokens;\n\n if (!isValidNumber(promptTokens) && !isValidNumber(completionTokens)) {\n return null;\n }\n\n return {\n inputTokens: isValidNumber(promptTokens) ? promptTokens : 0,\n outputTokens: isValidNumber(completionTokens) ? completionTokens : 0,\n totalTokens: isValidNumber(totalTokens) ? totalTokens : 0,\n };\n } catch {\n return null;\n }\n}\n\nfunction extractEmbeddingTokens(response: unknown): TokenUsage | null {\n try {\n const usage = getNestedValue(response, 'usage');\n if (!usage || typeof usage !== 'object') return null;\n\n const u = usage as Record<string, unknown>;\n const promptTokens = u.prompt_tokens;\n const totalTokens = u.total_tokens;\n\n return {\n inputTokens: isValidNumber(promptTokens) ? promptTokens : 0,\n outputTokens: 0,\n totalTokens: isValidNumber(totalTokens) ? totalTokens : 0,\n };\n } catch {\n return null;\n }\n}\n\nfunction extractStreamChunkContent(chunk: StreamChunk): string | null {\n try {\n return chunk?.choices?.[0]?.delta?.content ?? null;\n } catch {\n return null;\n }\n}\n\nfunction extractStreamChunkTokens(chunk: StreamChunk): TokenUsage | null {\n try {\n const usage = chunk?.usage;\n if (!usage) return null;\n\n return {\n inputTokens: isValidNumber(usage.prompt_tokens) ? usage.prompt_tokens : 0,\n outputTokens: isValidNumber(usage.completion_tokens) ? usage.completion_tokens : 0,\n totalTokens: 0,\n };\n } catch {\n return null;\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Responses API Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractResponsesResult(response: ResponsesResult): {\n output: unknown;\n inputTokens: number;\n outputTokens: number;\n metadata: Record<string, unknown>;\n} {\n // output_text is the primary text output\n let output: unknown = response.output_text || null;\n\n // If no output_text, try to extract from output array\n if (!output && response.output && Array.isArray(response.output)) {\n const textItems = response.output\n .filter((item: unknown) => {\n const i = item as Record<string, unknown>;\n return i.type === 'message' || i.type === 'text';\n })\n .map((item: unknown) => {\n const i = item as Record<string, unknown>;\n if (i.type === 'message' && i.content) {\n const content = i.content as Array<{ type: string; text?: string }>;\n return content\n .filter((c) => c.type === 'text' || c.type === 'output_text')\n .map((c) => c.text || '')\n .join('');\n }\n return (i as { text?: string }).text || '';\n });\n output = textItems.join('');\n }\n\n const usage = response.usage || {};\n const inputTokens = isValidNumber(usage.input_tokens) ? usage.input_tokens! : 0;\n const outputTokens = isValidNumber(usage.output_tokens) ? usage.output_tokens! : 0;\n\n const metadata: Record<string, unknown> = {};\n if (response.id) {\n metadata.responseId = response.id;\n }\n\n return {\n output,\n inputTokens,\n outputTokens,\n metadata: Object.keys(metadata).length > 0 ? metadata : {},\n };\n}\n\nasync function* wrapResponsesStream(\n stream: AsyncIterable<unknown>,\n request: ResponsesRequest,\n startTime: number\n): AsyncIterable<unknown> {\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let error: Error | null = null;\n\n try {\n for await (const event of stream) {\n const e = event as Record<string, unknown>;\n\n // Extract text content from streaming events\n if (e.type === 'response.output_text.delta' && e.delta) {\n chunks.push(e.delta as string);\n }\n\n // Extract usage from done event\n if (e.type === 'response.done' && e.response) {\n const resp = e.response as ResponsesResult;\n if (resp.usage) {\n inputTokens = resp.usage.input_tokens || 0;\n outputTokens = resp.usage.output_tokens || 0;\n }\n }\n\n yield event;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { instructions: request.instructions, input: request.input },\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { instructions: request.instructions, input: request.input },\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n}\n","/**\n * Anthropic Provider Wrapper\n *\n * Wraps the Anthropic SDK to automatically capture:\n * - messages.create()\n * - messages.stream()\n *\n * Supports both streaming and non-streaming responses.\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\nimport { safeExtract, getNestedValue, isValidNumber } from './base';\nimport { captureTrace, captureError } from '../core/capture';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\ninterface AnthropicClient {\n messages?: {\n create: (...args: unknown[]) => Promise<unknown>;\n stream?: (...args: unknown[]) => unknown;\n };\n completions?: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n}\n\ninterface MessageRequest {\n model?: string;\n messages?: unknown[];\n system?: string;\n stream?: boolean;\n max_tokens?: number;\n [key: string]: unknown;\n}\n\ninterface MessageResponse {\n id?: string;\n type?: string;\n role?: string;\n content?: Array<{ type: string; text?: string }>;\n model?: string;\n stop_reason?: string;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n}\n\ninterface StreamEvent {\n type: string;\n message?: MessageResponse;\n index?: number;\n content_block?: { type: string; text?: string };\n delta?: { type: string; text?: string };\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'anthropic';\n\n/**\n * Check if client is Anthropic SDK\n */\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n\n const constructorName = client.constructor?.name;\n if (constructorName === 'Anthropic') return true;\n\n // Check for characteristic properties\n const c = client as Record<string, unknown>;\n return !!(c.messages && typeof c.messages === 'object');\n}\n\n/**\n * Wrap Anthropic client with tracing\n */\nexport function wrap(client: unknown): unknown {\n const anthropicClient = client as AnthropicClient;\n return new Proxy(anthropicClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'messages' && value && typeof value === 'object') {\n return wrapMessagesNamespace(value as AnthropicClient['messages']);\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Namespace Wrappers\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapMessagesNamespace(messages: AnthropicClient['messages']) {\n if (!messages) return messages;\n\n return new Proxy(messages, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapMessagesCreate(value.bind(target));\n }\n\n if (prop === 'stream' && typeof value === 'function') {\n return wrapMessagesStream(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Method Wrappers\n// ─────────────────────────────────────────────────────────────\n\nexport function wrapMessagesCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedMessagesCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as MessageRequest;\n const isStreaming = request.stream === true;\n\n try {\n const response = await originalFn(...args);\n\n if (isStreaming && isAsyncIterable(response)) {\n return wrapStream(response, request, startTime);\n }\n\n // Non-streaming response\n const durationMs = Date.now() - startTime;\n const extracted = extractMessageResponse(response as MessageResponse);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || extracted.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n output: extracted.output,\n inputTokens: extracted.tokens?.inputTokens || 0,\n outputTokens: extracted.tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: isStreaming,\n });\n\n throw error;\n }\n };\n}\n\nexport function wrapMessagesStream(originalFn: (...args: unknown[]) => unknown) {\n return function wrappedMessagesStream(...args: unknown[]): unknown {\n const startTime = Date.now();\n const request = (args[0] || {}) as MessageRequest;\n\n try {\n const stream = originalFn(...args);\n\n // Anthropic's stream() returns a Stream object with async iterator\n if (stream && typeof stream === 'object') {\n return wrapAnthropicStream(stream, request, startTime);\n }\n\n return stream;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: true,\n });\n\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Streaming Support\n// ─────────────────────────────────────────────────────────────\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function';\n}\n\nfunction wrapAnthropicStream(\n stream: unknown,\n request: MessageRequest,\n startTime: number\n): unknown {\n // Anthropic SDK returns a Stream object with methods like finalMessage()\n // We need to wrap the async iterator and track events\n\n const originalStream = stream as {\n [Symbol.asyncIterator]?: () => AsyncIterator<StreamEvent>;\n finalMessage?: () => Promise<MessageResponse>;\n };\n\n if (!originalStream[Symbol.asyncIterator]) {\n return stream;\n }\n\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let model = request.model || 'unknown';\n let captured = false;\n\n const wrappedIterator = async function* () {\n try {\n for await (const event of originalStream as AsyncIterable<StreamEvent>) {\n // Extract data from events\n if (event.type === 'message_start' && event.message) {\n model = event.message.model || model;\n if (event.message.usage) {\n inputTokens = event.message.usage.input_tokens || 0;\n }\n }\n\n if (event.type === 'content_block_delta' && event.delta?.text) {\n chunks.push(event.delta.text);\n }\n\n if (event.type === 'message_delta' && event.usage) {\n outputTokens = event.usage.output_tokens || 0;\n }\n\n yield event;\n }\n } catch (error) {\n if (!captured) {\n captured = true;\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model,\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: true,\n });\n }\n\n throw error;\n } finally {\n if (!captured) {\n captured = true;\n const durationMs = Date.now() - startTime;\n\n captureTrace({\n provider: PROVIDER_NAME,\n model,\n input: { system: request.system, messages: request.messages },\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n };\n\n // Return a proxy that preserves other methods (like finalMessage)\n return new Proxy(stream as object, {\n get(target, prop, receiver) {\n if (prop === Symbol.asyncIterator) {\n return () => wrappedIterator()[Symbol.asyncIterator]();\n }\n\n return Reflect.get(target, prop, receiver);\n },\n });\n}\n\nasync function* wrapStream(\n stream: AsyncIterable<unknown>,\n request: MessageRequest,\n startTime: number\n): AsyncIterable<unknown> {\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let model = request.model || 'unknown';\n let error: Error | null = null;\n\n try {\n for await (const event of stream as AsyncIterable<StreamEvent>) {\n if (event.type === 'message_start' && event.message) {\n model = event.message.model || model;\n if (event.message.usage) {\n inputTokens = event.message.usage.input_tokens || 0;\n }\n }\n\n if (event.type === 'content_block_delta' && event.delta?.text) {\n chunks.push(event.delta.text);\n }\n\n if (event.type === 'message_delta' && event.usage) {\n outputTokens = event.usage.output_tokens || 0;\n }\n\n yield event;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model,\n input: { system: request.system, messages: request.messages },\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model,\n input: { system: request.system, messages: request.messages },\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractMessageResponse(response: MessageResponse): {\n model: string | null;\n output: string | null;\n tokens: TokenUsage | null;\n} {\n const model = safeExtract(() => response.model ?? null, null);\n\n // Extract text from content blocks\n const output = safeExtract(() => {\n if (!response.content || !Array.isArray(response.content)) return null;\n\n const textBlocks = response.content\n .filter((block) => block.type === 'text' && block.text)\n .map((block) => block.text);\n\n return textBlocks.join('') || null;\n }, null);\n\n const tokens = extractTokens(response);\n\n return { model, output, tokens };\n}\n\nfunction extractTokens(response: MessageResponse): TokenUsage | null {\n try {\n const usage = response.usage;\n if (!usage) return null;\n\n const inputTokens = usage.input_tokens;\n const outputTokens = usage.output_tokens;\n\n if (!isValidNumber(inputTokens) && !isValidNumber(outputTokens)) {\n return null;\n }\n\n return {\n inputTokens: isValidNumber(inputTokens) ? inputTokens : 0,\n outputTokens: isValidNumber(outputTokens) ? outputTokens : 0,\n totalTokens: (isValidNumber(inputTokens) ? inputTokens : 0) + (isValidNumber(outputTokens) ? outputTokens : 0),\n };\n } catch {\n return null;\n }\n}\n","/**\n * AWS Bedrock Provider Wrapper\n *\n * Wraps @aws-sdk/client-bedrock-runtime to automatically capture:\n * - client.send(ConverseCommand)\n * - client.send(ConverseStreamCommand)\n * - client.send(InvokeModelCommand)\n * - client.send(InvokeModelWithResponseStreamCommand)\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\nimport { safeExtract, isValidNumber } from './base';\nimport { captureTrace, captureError } from '../core/capture';\n\n// ─────────────────────────────────────────────────────────────\n// Types (minimal, to avoid SDK dependency)\n// ─────────────────────────────────────────────────────────────\n\ninterface BedrockClient {\n send: (command: BedrockCommand) => Promise<unknown>;\n config?: { region?: string | (() => Promise<string>) };\n}\n\ninterface BedrockCommand {\n constructor: { name: string };\n input: unknown;\n}\n\ninterface ConverseInput {\n modelId: string;\n messages?: Array<{ role: string; content: Array<{ text?: string }> }>;\n system?: Array<{ text?: string }>;\n inferenceConfig?: Record<string, unknown>;\n toolConfig?: Record<string, unknown>;\n guardrailConfig?: Record<string, unknown>;\n performanceConfig?: { latency?: string };\n requestMetadata?: Record<string, string>;\n}\n\ninterface ConverseResponse {\n $metadata: { httpStatusCode: number };\n output?: {\n message?: { role: string; content: Array<{ text?: string; toolUse?: unknown }> };\n };\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cacheReadInputTokens?: number;\n cacheWriteInputTokens?: number;\n };\n stopReason?: string;\n metrics?: { latencyMs?: number };\n}\n\ninterface ConverseStreamResponse {\n $metadata: { httpStatusCode: number };\n stream?: AsyncIterable<ConverseStreamEvent>;\n}\n\ninterface ConverseStreamEvent {\n messageStart?: { role: string };\n contentBlockDelta?: { contentBlockIndex: number; delta?: { text?: string } };\n contentBlockStop?: { contentBlockIndex: number };\n messageStop?: { stopReason?: string };\n metadata?: { usage?: { inputTokens?: number; outputTokens?: number } };\n}\n\ninterface InvokeModelInput {\n modelId: string;\n body: Uint8Array | string;\n contentType?: string;\n}\n\ninterface InvokeModelResponse {\n $metadata: { httpStatusCode: number };\n body: Uint8Array;\n contentType?: string;\n}\n\ninterface InvokeModelStreamResponse {\n $metadata: { httpStatusCode: number };\n body?: AsyncIterable<{ chunk?: { bytes?: Uint8Array } }>;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'bedrock';\n\n/**\n * Check if client is BedrockRuntimeClient\n */\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n\n const constructorName = client.constructor?.name;\n if (constructorName === 'BedrockRuntimeClient') return true;\n\n // Check by shape: has send() and config.region\n const c = client as Record<string, unknown>;\n if (typeof c.send !== 'function') return false;\n if (!c.config || typeof c.config !== 'object') return false;\n\n return 'region' in (c.config as Record<string, unknown>);\n}\n\n/**\n * Wrap BedrockRuntimeClient with tracing\n */\nexport function wrap(client: unknown): unknown {\n const bedrockClient = client as BedrockClient;\n\n return new Proxy(bedrockClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'send' && typeof value === 'function') {\n return wrapSend(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Send Wrapper\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapSend(originalSend: (cmd: BedrockCommand) => Promise<unknown>) {\n return async function tracedSend(command: BedrockCommand): Promise<unknown> {\n const commandName = command.constructor?.name || '';\n\n switch (commandName) {\n case 'ConverseCommand':\n return handleConverse(originalSend, command);\n case 'ConverseStreamCommand':\n return handleConverseStream(originalSend, command);\n case 'InvokeModelCommand':\n return handleInvokeModel(originalSend, command);\n case 'InvokeModelWithResponseStreamCommand':\n return handleInvokeModelStream(originalSend, command);\n default:\n // Pass through non-LLM commands (e.g., ListFoundationModels)\n return originalSend(command);\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Converse API Handlers\n// ─────────────────────────────────────────────────────────────\n\nasync function handleConverse(\n send: (cmd: BedrockCommand) => Promise<unknown>,\n command: BedrockCommand\n): Promise<unknown> {\n const startTime = Date.now();\n const input = command.input as ConverseInput;\n\n try {\n const response = (await send(command)) as ConverseResponse;\n const durationMs = Date.now() - startTime;\n const extracted = extractConverseOutput(response);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: { system: input.system, messages: input.messages },\n output: extracted.output,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n durationMs,\n status: 'success',\n streaming: false,\n metadata: {\n stopReason: response.stopReason,\n hasToolUse: extracted.hasToolUse,\n cacheReadTokens: extracted.cacheReadTokens,\n cacheWriteTokens: extracted.cacheWriteTokens,\n latencyMs: response.metrics?.latencyMs,\n },\n });\n\n return response;\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: { system: input.system, messages: input.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: false,\n });\n throw error;\n }\n}\n\nasync function handleConverseStream(\n send: (cmd: BedrockCommand) => Promise<unknown>,\n command: BedrockCommand\n): Promise<unknown> {\n const startTime = Date.now();\n const input = command.input as ConverseInput;\n\n try {\n const response = (await send(command)) as ConverseStreamResponse;\n\n if (response.stream) {\n return {\n ...response,\n stream: wrapConverseStream(response.stream, input, startTime),\n };\n }\n\n return response;\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: { system: input.system, messages: input.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: true,\n });\n throw error;\n }\n}\n\nasync function* wrapConverseStream(\n stream: AsyncIterable<ConverseStreamEvent>,\n input: ConverseInput,\n startTime: number\n): AsyncIterable<ConverseStreamEvent> {\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let error: Error | null = null;\n\n try {\n for await (const event of stream) {\n if (event.contentBlockDelta?.delta?.text) {\n chunks.push(event.contentBlockDelta.delta.text);\n }\n if (event.metadata?.usage) {\n inputTokens = event.metadata.usage.inputTokens || 0;\n outputTokens = event.metadata.usage.outputTokens || 0;\n }\n yield event;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: { system: input.system, messages: input.messages },\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: { system: input.system, messages: input.messages },\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// InvokeModel API Handlers\n// ─────────────────────────────────────────────────────────────\n\nasync function handleInvokeModel(\n send: (cmd: BedrockCommand) => Promise<unknown>,\n command: BedrockCommand\n): Promise<unknown> {\n const startTime = Date.now();\n const input = command.input as InvokeModelInput;\n\n try {\n const response = (await send(command)) as InvokeModelResponse;\n const durationMs = Date.now() - startTime;\n const parsed = parseInvokeModelBody(response.body);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: parseRequestBody(input.body),\n output: parsed.output,\n inputTokens: parsed.inputTokens,\n outputTokens: parsed.outputTokens,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: parseRequestBody(input.body),\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: false,\n });\n throw error;\n }\n}\n\nasync function handleInvokeModelStream(\n send: (cmd: BedrockCommand) => Promise<unknown>,\n command: BedrockCommand\n): Promise<unknown> {\n const startTime = Date.now();\n const input = command.input as InvokeModelInput;\n\n try {\n const response = (await send(command)) as InvokeModelStreamResponse;\n\n if (response.body) {\n return {\n ...response,\n body: wrapInvokeModelStream(response.body, input, startTime),\n };\n }\n\n return response;\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: parseRequestBody(input.body),\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: true,\n });\n throw error;\n }\n}\n\nasync function* wrapInvokeModelStream(\n stream: AsyncIterable<{ chunk?: { bytes?: Uint8Array } }>,\n input: InvokeModelInput,\n startTime: number\n): AsyncIterable<{ chunk?: { bytes?: Uint8Array } }> {\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let error: Error | null = null;\n\n try {\n for await (const event of stream) {\n if (event.chunk?.bytes) {\n const parsed = tryParseStreamChunk(event.chunk.bytes);\n if (parsed) {\n if (parsed.text) chunks.push(parsed.text);\n if (parsed.inputTokens) inputTokens = parsed.inputTokens;\n if (parsed.outputTokens) outputTokens = parsed.outputTokens;\n }\n }\n yield event;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: parseRequestBody(input.body),\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: parseRequestBody(input.body),\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractConverseOutput(response: ConverseResponse): {\n output: unknown;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n hasToolUse: boolean;\n} {\n const content = response.output?.message?.content;\n const hasToolUse = Array.isArray(content) && content.some((c) => c.toolUse);\n\n const output = safeExtract(() => {\n if (!Array.isArray(content)) return null;\n // If there's tool use, return the full content structure\n if (hasToolUse) {\n return content;\n }\n // Otherwise, join text content\n return content.map((c) => c.text || '').join('');\n }, null);\n\n const usage = response.usage || {};\n\n return {\n output,\n inputTokens: isValidNumber(usage.inputTokens) ? usage.inputTokens! : 0,\n outputTokens: isValidNumber(usage.outputTokens) ? usage.outputTokens! : 0,\n cacheReadTokens: isValidNumber(usage.cacheReadInputTokens) ? usage.cacheReadInputTokens! : 0,\n cacheWriteTokens: isValidNumber(usage.cacheWriteInputTokens) ? usage.cacheWriteInputTokens! : 0,\n hasToolUse,\n };\n}\n\nfunction parseInvokeModelBody(body: Uint8Array): {\n output: unknown;\n inputTokens: number;\n outputTokens: number;\n} {\n try {\n const text = new TextDecoder().decode(body);\n const parsed = JSON.parse(text);\n\n // Claude on Bedrock\n if (parsed.content && Array.isArray(parsed.content)) {\n const output = parsed.content\n .filter((c: { type: string }) => c.type === 'text')\n .map((c: { text?: string }) => c.text || '')\n .join('');\n return {\n output,\n inputTokens: parsed.usage?.input_tokens || 0,\n outputTokens: parsed.usage?.output_tokens || 0,\n };\n }\n\n // Amazon Titan\n if (parsed.results) {\n return {\n output: parsed.results[0]?.outputText || parsed.results,\n inputTokens: parsed.inputTextTokenCount || 0,\n outputTokens: parsed.results[0]?.tokenCount || 0,\n };\n }\n\n // Meta Llama\n if (parsed.generation) {\n return {\n output: parsed.generation,\n inputTokens: parsed.prompt_token_count || 0,\n outputTokens: parsed.generation_token_count || 0,\n };\n }\n\n return { output: parsed, inputTokens: 0, outputTokens: 0 };\n } catch {\n return { output: null, inputTokens: 0, outputTokens: 0 };\n }\n}\n\nfunction parseRequestBody(body: Uint8Array | string): unknown {\n try {\n const text = typeof body === 'string' ? body : new TextDecoder().decode(body);\n return JSON.parse(text);\n } catch {\n return body;\n }\n}\n\nfunction tryParseStreamChunk(bytes: Uint8Array): {\n text?: string;\n inputTokens?: number;\n outputTokens?: number;\n} | null {\n try {\n const text = new TextDecoder().decode(bytes);\n const parsed = JSON.parse(text);\n\n // Claude streaming format\n if (parsed.type === 'content_block_delta' && parsed.delta?.text) {\n return { text: parsed.delta.text };\n }\n if (parsed.type === 'message_delta' && parsed.usage) {\n return { outputTokens: parsed.usage.output_tokens };\n }\n if (parsed.type === 'message_start' && parsed.message?.usage) {\n return { inputTokens: parsed.message.usage.input_tokens };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n","/**\n * Google Gemini Provider Wrapper\n *\n * Wraps @google/generative-ai to automatically capture:\n * - model.generateContent()\n * - model.generateContentStream()\n * - chat.sendMessage()\n * - chat.sendMessageStream()\n *\n * Supports both GoogleGenerativeAI (@google/generative-ai)\n * and GoogleGenAI (@google/genai) clients.\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\nimport { safeExtract, isValidNumber } from './base';\nimport { captureTrace, captureError } from '../core/capture';\n\n// ─────────────────────────────────────────────────────────────\n// Types (minimal, to avoid SDK dependency)\n// ─────────────────────────────────────────────────────────────\n\ninterface GeminiClient {\n getGenerativeModel: (config: ModelConfig) => GenerativeModel;\n apiKey?: string;\n}\n\ninterface ModelConfig {\n model: string;\n systemInstruction?: string;\n generationConfig?: GenerationConfig;\n [key: string]: unknown;\n}\n\ninterface GenerationConfig {\n temperature?: number;\n maxOutputTokens?: number;\n responseMimeType?: string;\n responseSchema?: unknown;\n [key: string]: unknown;\n}\n\ninterface GenerativeModel {\n generateContent: (request: GenerateContentRequest | string) => Promise<GenerateContentResult>;\n generateContentStream: (request: GenerateContentRequest | string) => Promise<StreamGenerateContentResult>;\n startChat: (config?: ChatConfig) => ChatSession;\n model: string;\n}\n\ninterface GenerateContentRequest {\n contents?: Content[];\n systemInstruction?: string | Content;\n generationConfig?: GenerationConfig;\n [key: string]: unknown;\n}\n\ninterface Content {\n role?: string;\n parts: Part[];\n}\n\ninterface Part {\n text?: string;\n inlineData?: { mimeType: string; data: string };\n [key: string]: unknown;\n}\n\ninterface GenerateContentResult {\n response: GenerateContentResponse;\n}\n\ninterface StreamGenerateContentResult {\n stream: AsyncIterable<GenerateContentStreamChunk>;\n response: Promise<GenerateContentResponse>;\n}\n\ninterface GenerateContentResponse {\n text: () => string;\n candidates?: Candidate[];\n usageMetadata?: UsageMetadata;\n}\n\ninterface GenerateContentStreamChunk {\n text: () => string;\n candidates?: Candidate[];\n usageMetadata?: UsageMetadata;\n}\n\ninterface Candidate {\n content?: Content;\n finishReason?: string;\n}\n\ninterface UsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n cachedContentTokenCount?: number;\n thoughtsTokenCount?: number;\n}\n\ninterface ChatConfig {\n history?: Content[];\n systemInstruction?: string | Content;\n generationConfig?: GenerationConfig;\n [key: string]: unknown;\n}\n\ninterface ChatSession {\n sendMessage: (request: string | Part[]) => Promise<GenerateContentResult>;\n sendMessageStream: (request: string | Part[]) => Promise<StreamGenerateContentResult>;\n getHistory: () => Promise<Content[]>;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'gemini';\n\n/**\n * Check if client is GoogleGenerativeAI or GoogleGenAI\n */\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n\n const constructorName = client.constructor?.name;\n\n // @google/generative-ai\n if (constructorName === 'GoogleGenerativeAI') return true;\n\n // @google/genai\n if (constructorName === 'GoogleGenAI') return true;\n\n // Check by shape: has getGenerativeModel\n const c = client as Record<string, unknown>;\n if (typeof c.getGenerativeModel === 'function') return true;\n\n // @google/genai has models.generate\n if (c.models && typeof (c.models as Record<string, unknown>).generate === 'function') {\n return true;\n }\n\n return false;\n}\n\n/**\n * Wrap Gemini client with tracing\n */\nexport function wrap(client: unknown): unknown {\n const geminiClient = client as GeminiClient;\n\n return new Proxy(geminiClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'getGenerativeModel' && typeof value === 'function') {\n return wrapGetGenerativeModel(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Model Wrapper\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapGetGenerativeModel(\n originalFn: (config: ModelConfig) => GenerativeModel\n): (config: ModelConfig) => GenerativeModel {\n return function wrappedGetGenerativeModel(config: ModelConfig): GenerativeModel {\n const model = originalFn(config);\n return wrapGenerativeModel(model, config.model);\n };\n}\n\nfunction wrapGenerativeModel(model: GenerativeModel, modelName: string): GenerativeModel {\n return new Proxy(model, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'generateContent' && typeof value === 'function') {\n return wrapGenerateContent(value.bind(target), modelName);\n }\n\n if (prop === 'generateContentStream' && typeof value === 'function') {\n return wrapGenerateContentStream(value.bind(target), modelName);\n }\n\n if (prop === 'startChat' && typeof value === 'function') {\n return wrapStartChat(value.bind(target), modelName);\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// generateContent Wrapper\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapGenerateContent(\n originalFn: (request: GenerateContentRequest | string) => Promise<GenerateContentResult>,\n modelName: string\n) {\n return async function wrappedGenerateContent(\n request: GenerateContentRequest | string\n ): Promise<GenerateContentResult> {\n const startTime = Date.now();\n const input = extractInput(request);\n\n try {\n const result = await originalFn(request);\n const durationMs = Date.now() - startTime;\n const extracted = extractGenerateContentResult(result);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n output: extracted.output,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n durationMs,\n status: 'success',\n streaming: false,\n metadata: extracted.metadata,\n });\n\n return result;\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: false,\n });\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// generateContentStream Wrapper\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapGenerateContentStream(\n originalFn: (request: GenerateContentRequest | string) => Promise<StreamGenerateContentResult>,\n modelName: string\n) {\n return async function wrappedGenerateContentStream(\n request: GenerateContentRequest | string\n ): Promise<StreamGenerateContentResult> {\n const startTime = Date.now();\n const input = extractInput(request);\n\n try {\n const result = await originalFn(request);\n\n // Wrap the stream to capture content\n const wrappedStream = wrapStream(result.stream, modelName, input, startTime);\n\n return {\n ...result,\n stream: wrappedStream,\n };\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: true,\n });\n throw error;\n }\n };\n}\n\nasync function* wrapStream(\n stream: AsyncIterable<GenerateContentStreamChunk>,\n modelName: string,\n input: unknown,\n startTime: number\n): AsyncIterable<GenerateContentStreamChunk> {\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let cachedTokens = 0;\n let thoughtsTokens = 0;\n let error: Error | null = null;\n\n try {\n for await (const chunk of stream) {\n // Extract text from chunk\n try {\n const text = chunk.text();\n if (text) {\n chunks.push(text);\n }\n } catch {\n // text() may throw if no text content\n }\n\n // Extract tokens from final chunk\n if (chunk.usageMetadata) {\n inputTokens = chunk.usageMetadata.promptTokenCount || 0;\n outputTokens = chunk.usageMetadata.candidatesTokenCount || 0;\n cachedTokens = chunk.usageMetadata.cachedContentTokenCount || 0;\n thoughtsTokens = chunk.usageMetadata.thoughtsTokenCount || 0;\n }\n\n yield chunk;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n metadata: {\n cachedTokens: cachedTokens > 0 ? cachedTokens : undefined,\n thoughtsTokens: thoughtsTokens > 0 ? thoughtsTokens : undefined,\n },\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Chat Wrapper\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapStartChat(\n originalFn: (config?: ChatConfig) => ChatSession,\n modelName: string\n): (config?: ChatConfig) => ChatSession {\n return function wrappedStartChat(config?: ChatConfig): ChatSession {\n const chat = originalFn(config);\n return wrapChatSession(chat, modelName);\n };\n}\n\nfunction wrapChatSession(chat: ChatSession, modelName: string): ChatSession {\n return new Proxy(chat, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'sendMessage' && typeof value === 'function') {\n return wrapSendMessage(value.bind(target), modelName);\n }\n\n if (prop === 'sendMessageStream' && typeof value === 'function') {\n return wrapSendMessageStream(value.bind(target), modelName);\n }\n\n return value;\n },\n });\n}\n\nfunction wrapSendMessage(\n originalFn: (request: string | Part[]) => Promise<GenerateContentResult>,\n modelName: string\n) {\n return async function wrappedSendMessage(\n request: string | Part[]\n ): Promise<GenerateContentResult> {\n const startTime = Date.now();\n const input = typeof request === 'string' ? request : request;\n\n try {\n const result = await originalFn(request);\n const durationMs = Date.now() - startTime;\n const extracted = extractGenerateContentResult(result);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n output: extracted.output,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n durationMs,\n status: 'success',\n streaming: false,\n metadata: extracted.metadata,\n });\n\n return result;\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: false,\n });\n throw error;\n }\n };\n}\n\nfunction wrapSendMessageStream(\n originalFn: (request: string | Part[]) => Promise<StreamGenerateContentResult>,\n modelName: string\n) {\n return async function wrappedSendMessageStream(\n request: string | Part[]\n ): Promise<StreamGenerateContentResult> {\n const startTime = Date.now();\n const input = typeof request === 'string' ? request : request;\n\n try {\n const result = await originalFn(request);\n const wrappedStream = wrapStream(result.stream, modelName, input, startTime);\n\n return {\n ...result,\n stream: wrappedStream,\n };\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: true,\n });\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractInput(request: GenerateContentRequest | string): unknown {\n if (typeof request === 'string') {\n return request;\n }\n\n // Extract contents (messages)\n if (request.contents) {\n return request.contents;\n }\n\n return request;\n}\n\nfunction extractGenerateContentResult(result: GenerateContentResult): {\n output: unknown;\n inputTokens: number;\n outputTokens: number;\n metadata: Record<string, unknown>;\n} {\n const response = result.response;\n\n // Extract text output\n let output: unknown = null;\n try {\n output = response.text();\n } catch {\n // text() may throw if response has function calls or other non-text content\n output = safeExtract(() => {\n const content = response.candidates?.[0]?.content;\n if (content?.parts) {\n return content.parts;\n }\n return null;\n }, null);\n }\n\n // Extract token usage\n const usage = response.usageMetadata;\n const inputTokens = isValidNumber(usage?.promptTokenCount) ? usage!.promptTokenCount! : 0;\n const outputTokens = isValidNumber(usage?.candidatesTokenCount) ? usage!.candidatesTokenCount! : 0;\n\n // Build metadata\n const metadata: Record<string, unknown> = {};\n\n if (usage?.cachedContentTokenCount && usage.cachedContentTokenCount > 0) {\n metadata.cachedTokens = usage.cachedContentTokenCount;\n }\n\n if (usage?.thoughtsTokenCount && usage.thoughtsTokenCount > 0) {\n metadata.thoughtsTokens = usage.thoughtsTokenCount;\n }\n\n const finishReason = response.candidates?.[0]?.finishReason;\n if (finishReason) {\n metadata.finishReason = finishReason;\n }\n\n return {\n output,\n inputTokens,\n outputTokens,\n metadata: Object.keys(metadata).length > 0 ? metadata : {},\n };\n}\n","/**\n * OpenRouter Provider Wrapper\n *\n * Wraps OpenAI SDK configured with OpenRouter's API.\n * OpenRouter provides unified access to 400+ models from multiple providers.\n *\n * Traced methods:\n * - chat.completions.create()\n *\n * Supports both streaming and non-streaming responses.\n *\n * @see https://openrouter.ai/docs\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\nimport { safeExtract, getNestedValue, isValidNumber } from './base';\nimport { captureTrace, captureError } from '../core/capture';\n\n// ─────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────\n\nconst OPENROUTER_BASE_URL = 'openrouter.ai';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\ninterface OpenRouterClient {\n baseURL?: string;\n chat?: {\n completions: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n };\n}\n\ninterface ChatCompletionRequest {\n model?: string;\n messages?: unknown[];\n stream?: boolean;\n // OpenRouter-specific fields\n provider?: {\n order?: string[];\n allow_fallbacks?: boolean;\n data_collection?: 'allow' | 'deny';\n quantizations?: string[];\n };\n [key: string]: unknown;\n}\n\ninterface ChatCompletionResponse {\n id?: string;\n model?: string;\n choices?: Array<{\n message?: {\n content?: string;\n role?: string;\n };\n finish_reason?: string;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n // OpenRouter may include additional fields\n [key: string]: unknown;\n}\n\ninterface StreamChunk {\n id?: string;\n choices?: Array<{\n delta?: {\n content?: string;\n role?: string;\n };\n finish_reason?: string;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'openrouter';\n\n/**\n * Check if client is OpenAI SDK configured for OpenRouter\n */\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n\n const c = client as OpenRouterClient;\n\n // Must have chat.completions (OpenAI SDK structure)\n if (!c.chat?.completions?.create) return false;\n\n // Check if baseURL points to OpenRouter\n const baseURL = c.baseURL || '';\n return baseURL.includes(OPENROUTER_BASE_URL);\n}\n\n/**\n * Wrap OpenRouter client with tracing\n */\nexport function wrap(client: unknown): unknown {\n const openrouterClient = client as OpenRouterClient;\n\n return new Proxy(openrouterClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'chat' && value && typeof value === 'object') {\n return wrapChatNamespace(value as OpenRouterClient['chat']);\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Namespace Wrappers\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapChatNamespace(chat: OpenRouterClient['chat']) {\n if (!chat) return chat;\n\n return new Proxy(chat, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapChatCompletions(value as { create: (...args: unknown[]) => Promise<unknown> });\n }\n\n return value;\n },\n });\n}\n\nfunction wrapChatCompletions(completions: { create: (...args: unknown[]) => Promise<unknown> }) {\n return new Proxy(completions, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapChatCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Method Wrapper\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapChatCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedChatCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as ChatCompletionRequest;\n const isStreaming = request.stream === true;\n\n try {\n const response = await originalFn(...args);\n\n if (isStreaming && isAsyncIterable(response)) {\n return wrapStream(response, request, startTime);\n }\n\n // Non-streaming response\n const durationMs = Date.now() - startTime;\n const extracted = extractChatCompletion(response as ChatCompletionResponse);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || extracted.model || 'unknown',\n input: request.messages,\n output: extracted.output,\n inputTokens: extracted.tokens?.inputTokens || 0,\n outputTokens: extracted.tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: false,\n metadata: extracted.metadata,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: isStreaming,\n });\n\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Streaming Support\n// ─────────────────────────────────────────────────────────────\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function';\n}\n\nasync function* wrapStream(\n stream: AsyncIterable<unknown>,\n request: ChatCompletionRequest,\n startTime: number\n): AsyncIterable<unknown> {\n const chunks: string[] = [];\n let tokens: TokenUsage | null = null;\n let generationId: string | null = null;\n let error: Error | null = null;\n\n try {\n for await (const chunk of stream) {\n const c = chunk as StreamChunk;\n\n // Extract generation ID from first chunk\n if (!generationId && c.id) {\n generationId = c.id;\n }\n\n // Extract content from chunk\n const content = c.choices?.[0]?.delta?.content;\n if (content) {\n chunks.push(content);\n }\n\n // Extract tokens if available (usually in last chunk)\n const chunkTokens = extractStreamChunkTokens(c);\n if (chunkTokens) {\n tokens = chunkTokens;\n }\n\n yield chunk;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n const output = chunks.join('');\n\n const metadata: Record<string, unknown> = {};\n if (generationId) {\n metadata.generationId = generationId;\n }\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n output,\n inputTokens: tokens?.inputTokens || 0,\n outputTokens: tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: true,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractChatCompletion(response: ChatCompletionResponse): {\n model: string | null;\n output: unknown;\n tokens: TokenUsage | null;\n metadata: Record<string, unknown>;\n} {\n const model = response.model || null;\n const output = response.choices?.[0]?.message?.content || null;\n const tokens = extractTokens(response);\n\n const metadata: Record<string, unknown> = {};\n\n // Capture generation ID for async usage lookup\n if (response.id) {\n metadata.generationId = response.id;\n }\n\n return {\n model,\n output,\n tokens,\n metadata: Object.keys(metadata).length > 0 ? metadata : {},\n };\n}\n\nfunction extractTokens(response: ChatCompletionResponse): TokenUsage | null {\n const usage = response.usage;\n if (!usage) return null;\n\n const promptTokens = usage.prompt_tokens;\n const completionTokens = usage.completion_tokens;\n const totalTokens = usage.total_tokens;\n\n if (!isValidNumber(promptTokens) && !isValidNumber(completionTokens)) {\n return null;\n }\n\n return {\n inputTokens: isValidNumber(promptTokens) ? promptTokens : 0,\n outputTokens: isValidNumber(completionTokens) ? completionTokens : 0,\n totalTokens: isValidNumber(totalTokens) ? totalTokens : 0,\n };\n}\n\nfunction extractStreamChunkTokens(chunk: StreamChunk): TokenUsage | null {\n const usage = chunk.usage;\n if (!usage) return null;\n\n return {\n inputTokens: isValidNumber(usage.prompt_tokens) ? usage.prompt_tokens : 0,\n outputTokens: isValidNumber(usage.completion_tokens) ? usage.completion_tokens : 0,\n totalTokens: 0,\n };\n}\n","/**\n * Observe Function\n *\n * Main entry point for wrapping LLM clients with automatic tracing.\n */\n\nimport * as openai from './providers/openai';\nimport * as anthropic from './providers/anthropic';\nimport * as bedrock from './providers/bedrock';\nimport * as gemini from './providers/gemini';\nimport * as openrouter from './providers/openrouter';\nimport { setGlobalContext } from './core/capture';\nimport { getConfig } from './core/config';\nimport type { ObserveOptions } from './core/types';\nimport { clientWrapped, warn, debug } from './core/logger';\n\n// ─────────────────────────────────────────────────────────────\n// Observe Function\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Wrap an LLM client with automatic tracing\n *\n * @param client - OpenAI, Anthropic, or Bedrock client instance\n * @param options - Optional context (sessionId, userId, etc.)\n * @returns The wrapped client with the same type\n *\n * @example\n * import { observe } from '@lelemondev/sdk';\n * import OpenAI from 'openai';\n *\n * const openai = observe(new OpenAI());\n *\n * // All calls are now automatically traced\n * const response = await openai.chat.completions.create({...});\n */\nexport function observe<T>(client: T, options?: ObserveOptions): T {\n // Set global context if provided\n if (options) {\n setGlobalContext(options);\n }\n\n // Check if disabled\n const config = getConfig();\n if (config.disabled) {\n debug('Tracing disabled, returning unwrapped client');\n return client;\n }\n\n // Detect and wrap based on client shape\n // Note: OpenRouter must be checked BEFORE OpenAI because it uses the OpenAI SDK\n if (openrouter.canHandle(client)) {\n clientWrapped('openrouter');\n return openrouter.wrap(client) as T;\n }\n\n if (openai.canHandle(client)) {\n clientWrapped('openai');\n return wrapOpenAI(client) as T;\n }\n\n if (anthropic.canHandle(client)) {\n clientWrapped('anthropic');\n return wrapAnthropic(client) as T;\n }\n\n if (bedrock.canHandle(client)) {\n clientWrapped('bedrock');\n return bedrock.wrap(client) as T;\n }\n\n if (gemini.canHandle(client)) {\n clientWrapped('gemini');\n return gemini.wrap(client) as T;\n }\n\n // Unknown client type\n warn('Unknown client type. Tracing not enabled. Supported: OpenAI, OpenRouter, Anthropic, Bedrock, Gemini');\n\n return client;\n}\n\n// ─────────────────────────────────────────────────────────────\n// OpenAI Wrapper\n// ─────────────────────────────────────────────────────────────\n\ninterface OpenAIShape {\n chat?: { completions: { create: CallableFunction } };\n responses?: { create: CallableFunction };\n completions?: { create: CallableFunction };\n embeddings?: { create: CallableFunction };\n}\n\nfunction wrapOpenAI(client: unknown): unknown {\n const typed = client as OpenAIShape;\n\n return new Proxy(typed, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'chat' && value && typeof value === 'object') {\n return wrapOpenAIChat(value as OpenAIShape['chat']);\n }\n\n if (prop === 'responses' && value && typeof value === 'object') {\n return wrapOpenAIResponses(value as OpenAIShape['responses']);\n }\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapOpenAICompletions(value as OpenAIShape['completions']);\n }\n\n if (prop === 'embeddings' && value && typeof value === 'object') {\n return wrapOpenAIEmbeddings(value as OpenAIShape['embeddings']);\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAIChat(chat: OpenAIShape['chat']) {\n return new Proxy(chat!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapOpenAIChatCompletions(value as { create: CallableFunction });\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAIChatCompletions(completions: { create: CallableFunction }) {\n return new Proxy(completions, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return openai.wrapChatCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAIResponses(responses: OpenAIShape['responses']) {\n return new Proxy(responses!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return openai.wrapResponsesCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAICompletions(completions: OpenAIShape['completions']) {\n return new Proxy(completions!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return openai.wrapCompletionCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAIEmbeddings(embeddings: OpenAIShape['embeddings']) {\n return new Proxy(embeddings!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return openai.wrapEmbeddingsCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Anthropic Wrapper\n// ─────────────────────────────────────────────────────────────\n\ninterface AnthropicShape {\n messages?: {\n create: CallableFunction;\n stream?: CallableFunction;\n };\n}\n\nfunction wrapAnthropic(client: unknown): unknown {\n const typed = client as AnthropicShape;\n\n return new Proxy(typed, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'messages' && value && typeof value === 'object') {\n return wrapAnthropicMessages(value as AnthropicShape['messages']);\n }\n\n return value;\n },\n });\n}\n\nfunction wrapAnthropicMessages(messages: AnthropicShape['messages']) {\n return new Proxy(messages!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return anthropic.wrapMessagesCreate(value.bind(target));\n }\n\n if (prop === 'stream' && typeof value === 'function') {\n return anthropic.wrapMessagesStream(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Factory Function\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Create a scoped observe function with preset context\n *\n * @example\n * const observeWithSession = createObserve({\n * sessionId: 'session-123',\n * userId: 'user-456',\n * });\n *\n * const openai = observeWithSession(new OpenAI());\n */\nexport function createObserve(defaultOptions: ObserveOptions) {\n return function scopedObserve<T>(client: T, options?: ObserveOptions): T {\n return observe(client, { ...defaultOptions, ...options });\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/logger.ts","../src/core/transport.ts","../src/core/config.ts","../src/providers/base.ts","../src/core/capture.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/bedrock.ts","../src/providers/gemini.ts","../src/providers/openrouter.ts","../src/observe.ts"],"names":["getEnvVar","PROVIDER_NAME","canHandle","isAsyncIterable","wrapStream","extractTokens","wrap","wrapChatCreate","extractChatCompletion","extractStreamChunkTokens"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Centralized Logger\n *\n * Provides consistent debug logging across the SDK.\n * Enable via: init({ debug: true }) or LELEMON_DEBUG=true\n */\n\n// ─────────────────────────────────────────────────────────────\n// State\n// ─────────────────────────────────────────────────────────────\n\nlet debugEnabled = false;\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Enable or disable debug mode\n */\nexport function setDebug(enabled: boolean): void {\n debugEnabled = enabled;\n}\n\n/**\n * Check if debug mode is enabled\n */\nexport function isDebugEnabled(): boolean {\n // Config takes precedence, then check env var\n if (debugEnabled) return true;\n return getEnvVar('LELEMON_DEBUG') === 'true';\n}\n\n// ─────────────────────────────────────────────────────────────\n// Logging Functions\n// ─────────────────────────────────────────────────────────────\n\nconst PREFIX = '[Lelemon]';\n\n/**\n * Log debug message (only when debug enabled)\n */\nexport function debug(message: string, data?: unknown): void {\n if (!isDebugEnabled()) return;\n logWithPrefix('debug', message, data);\n}\n\n/**\n * Log info message (only when debug enabled)\n */\nexport function info(message: string, data?: unknown): void {\n if (!isDebugEnabled()) return;\n logWithPrefix('info', message, data);\n}\n\n/**\n * Log warning message (always shown)\n */\nexport function warn(message: string, data?: unknown): void {\n logWithPrefix('warn', message, data);\n}\n\n/**\n * Log error message (always shown)\n */\nexport function error(message: string, data?: unknown): void {\n logWithPrefix('error', message, data);\n}\n\n// ─────────────────────────────────────────────────────────────\n// Trace-specific logging\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Log when a trace is captured\n */\nexport function traceCapture(provider: string, model: string, durationMs: number, status: string): void {\n if (!isDebugEnabled()) return;\n console.log(\n `${PREFIX} Captured trace: provider=${provider} model=${model} duration=${durationMs}ms status=${status}`\n );\n}\n\n/**\n * Log when a trace capture fails (always visible)\n */\nexport function traceCaptureError(provider: string, err: Error): void {\n console.error(`${PREFIX} Failed to capture trace: provider=${provider} error=${err.message}`);\n}\n\n/**\n * Log when a client is wrapped\n */\nexport function clientWrapped(provider: string): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Wrapped client: provider=${provider}`);\n}\n\n/**\n * Log transport events\n */\nexport function transportEvent(event: string, details?: Record<string, unknown>): void {\n if (!isDebugEnabled()) return;\n if (details) {\n console.log(`${PREFIX} Transport: ${event}`, details);\n } else {\n console.log(`${PREFIX} Transport: ${event}`);\n }\n}\n\n/**\n * Log batch send details\n */\nexport function batchSend(count: number, endpoint: string): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Sending batch: count=${count} endpoint=${endpoint}`);\n}\n\n/**\n * Log batch send success\n */\nexport function batchSuccess(count: number, durationMs: number): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Batch sent successfully: count=${count} duration=${durationMs}ms`);\n}\n\n/**\n * Log batch send failure (always visible - errors should never be silent)\n */\nexport function batchError(count: number, err: unknown): void {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`${PREFIX} Batch send failed: count=${count} error=${message}`);\n}\n\n/**\n * Log request details (for deep debugging)\n */\nexport function requestDetails(method: string, url: string, bodySize: number): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Request: ${method} ${url} (${bodySize} bytes)`);\n}\n\n/**\n * Log response details\n */\nexport function responseDetails(status: number, durationMs: number): void {\n if (!isDebugEnabled()) return;\n console.log(`${PREFIX} Response: status=${status} duration=${durationMs}ms`);\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction logWithPrefix(level: 'debug' | 'info' | 'warn' | 'error', message: string, data?: unknown): void {\n const logFn = level === 'error' ? console.error : level === 'warn' ? console.warn : console.log;\n\n if (data !== undefined) {\n logFn(`${PREFIX} ${message}`, data);\n } else {\n logFn(`${PREFIX} ${message}`);\n }\n}\n\nfunction getEnvVar(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n","/**\n * Transport Layer\n *\n * Handles batched HTTP requests to the Lelemon API.\n * Features:\n * - Queue-based batching\n * - Auto-flush on batch size or interval\n * - Request timeout protection\n * - Graceful error handling\n */\n\nimport type { CreateTraceRequest } from './types';\nimport { batchSend, batchSuccess, batchError, requestDetails, responseDetails, transportEvent } from './logger';\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\n\ninterface TransportConfig {\n apiKey: string;\n endpoint: string;\n debug: boolean;\n disabled: boolean;\n batchSize?: number;\n flushIntervalMs?: number;\n requestTimeoutMs?: number;\n}\n\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_FLUSH_INTERVAL_MS = 1000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10000;\n\n// ─────────────────────────────────────────────────────────────\n// Transport Class\n// ─────────────────────────────────────────────────────────────\n\nexport class Transport {\n private readonly config: Required<TransportConfig>;\n private queue: CreateTraceRequest[] = [];\n private flushPromise: Promise<void> | null = null;\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: TransportConfig) {\n this.config = {\n apiKey: config.apiKey,\n endpoint: config.endpoint,\n debug: config.debug,\n disabled: config.disabled,\n batchSize: config.batchSize ?? DEFAULT_BATCH_SIZE,\n flushIntervalMs: config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n requestTimeoutMs: config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n };\n }\n\n /**\n * Check if transport is enabled\n */\n isEnabled(): boolean {\n return !this.config.disabled && !!this.config.apiKey;\n }\n\n /**\n * Enqueue a trace for sending\n * Fire-and-forget - never blocks\n */\n enqueue(trace: CreateTraceRequest): void {\n if (this.config.disabled) return;\n\n this.queue.push(trace);\n\n if (this.queue.length >= this.config.batchSize) {\n this.flush();\n } else {\n this.scheduleFlush();\n }\n }\n\n /**\n * Flush all pending traces\n * Safe to call multiple times\n */\n async flush(): Promise<void> {\n if (this.flushPromise) {\n return this.flushPromise;\n }\n\n if (this.queue.length === 0) {\n return;\n }\n\n this.cancelScheduledFlush();\n\n const items = this.queue;\n this.queue = [];\n\n this.flushPromise = this.sendBatch(items).finally(() => {\n this.flushPromise = null;\n });\n\n return this.flushPromise;\n }\n\n /**\n * Get pending count (for debugging)\n */\n getPendingCount(): number {\n return this.queue.length;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────\n\n private scheduleFlush(): void {\n if (this.flushTimer !== null) return;\n\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null;\n this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private cancelScheduledFlush(): void {\n if (this.flushTimer !== null) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n private async sendBatch(items: CreateTraceRequest[]): Promise<void> {\n if (items.length === 0) return;\n\n const startTime = Date.now();\n batchSend(items.length, `${this.config.endpoint}/api/v1/ingest`);\n\n try {\n await this.request('POST', '/api/v1/ingest', { events: items });\n batchSuccess(items.length, Date.now() - startTime);\n } catch (error) {\n batchError(items.length, error);\n // Don't rethrow - observability should never crash the app\n }\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<unknown> {\n const url = `${this.config.endpoint}${path}`;\n const controller = new AbortController();\n const bodyStr = body ? JSON.stringify(body) : undefined;\n\n requestDetails(method, url, bodyStr?.length ?? 0);\n\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, this.config.requestTimeoutMs);\n\n const startTime = Date.now();\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.apiKey}`,\n },\n body: bodyStr,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n responseDetails(response.status, Date.now() - startTime);\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(`HTTP ${response.status}: ${errorText}`);\n }\n\n const text = await response.text();\n return text ? JSON.parse(text) : {};\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`);\n }\n\n throw error;\n }\n }\n}\n","/**\n * Global Configuration\n *\n * Manages SDK configuration and transport instance.\n */\n\nimport type { LelemonConfig } from './types';\nimport { Transport } from './transport';\nimport { setDebug, info, warn, debug } from './logger';\n\n// ─────────────────────────────────────────────────────────────\n// Global State\n// ─────────────────────────────────────────────────────────────\n\nlet globalConfig: LelemonConfig = {};\nlet globalTransport: Transport | null = null;\nlet initialized = false;\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\n\nconst DEFAULT_ENDPOINT = 'https://www.lelemon.dev';\n\n/**\n * Initialize the SDK\n * Call once at app startup\n */\nexport function init(config: LelemonConfig = {}): void {\n globalConfig = config;\n\n // Configure debug mode\n if (config.debug) {\n setDebug(true);\n }\n\n info('Initializing SDK', {\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n debug: config.debug ?? false,\n disabled: config.disabled ?? false,\n });\n\n globalTransport = createTransport(config);\n initialized = true;\n\n // Log status after transport is created\n if (globalTransport.isEnabled()) {\n info('SDK initialized - tracing enabled');\n } else {\n debug('SDK initialized - tracing disabled (no API key or explicitly disabled)');\n }\n}\n\n/**\n * Get current config\n */\nexport function getConfig(): LelemonConfig {\n return globalConfig;\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isInitialized(): boolean {\n return initialized;\n}\n\n/**\n * Check if SDK is enabled\n */\nexport function isEnabled(): boolean {\n return getTransport().isEnabled();\n}\n\n// ─────────────────────────────────────────────────────────────\n// Transport\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Get or create transport instance\n */\nexport function getTransport(): Transport {\n if (!globalTransport) {\n globalTransport = createTransport(globalConfig);\n }\n return globalTransport;\n}\n\n/**\n * Flush all pending traces\n */\nexport async function flush(): Promise<void> {\n if (globalTransport) {\n await globalTransport.flush();\n }\n}\n\n/**\n * Create transport instance\n */\nfunction createTransport(config: LelemonConfig): Transport {\n const apiKey = config.apiKey ?? getEnvVar('LELEMON_API_KEY');\n\n if (!apiKey && !config.disabled) {\n warn('No API key provided. Set apiKey in init() or LELEMON_API_KEY env var. Tracing disabled.');\n }\n\n return new Transport({\n apiKey: apiKey ?? '',\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n debug: config.debug ?? false,\n disabled: config.disabled ?? !apiKey,\n batchSize: config.batchSize,\n flushIntervalMs: config.flushIntervalMs,\n requestTimeoutMs: config.requestTimeoutMs,\n });\n}\n\n/**\n * Get environment variable (works in Node and edge)\n */\nfunction getEnvVar(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n","/**\n * Base Provider Interface\n *\n * All provider wrappers must implement this interface.\n * Uses Strategy pattern for different LLM providers.\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\n\n// ─────────────────────────────────────────────────────────────\n// Provider Interface\n// ─────────────────────────────────────────────────────────────\n\nexport interface BaseProvider<TClient = unknown> {\n /** Provider name */\n readonly name: ProviderName;\n\n /**\n * Check if this provider can handle the given client\n */\n canHandle(client: unknown): boolean;\n\n /**\n * Wrap the client with tracing\n */\n wrap(client: TClient): TClient;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Interfaces\n// ─────────────────────────────────────────────────────────────\n\nexport interface ExtractedData {\n model: string;\n input: unknown;\n output: unknown;\n tokens: TokenUsage | null;\n streaming: boolean;\n}\n\nexport interface RequestInfo {\n model: string;\n input: unknown;\n streaming: boolean;\n}\n\nexport interface ResponseInfo {\n output: unknown;\n tokens: TokenUsage | null;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Method Wrapper Types\n// ─────────────────────────────────────────────────────────────\n\nexport type AsyncMethod = (...args: unknown[]) => Promise<unknown>;\n\nexport interface WrapContext {\n provider: ProviderName;\n method: string;\n startTime: number;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helper: Safe extraction with fallback\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Safely extract a value with fallback\n * Never throws, always returns fallback on error\n */\nexport function safeExtract<T>(\n fn: () => T,\n fallback: T\n): T {\n try {\n return fn() ?? fallback;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Safely extract nested property\n */\nexport function getNestedValue(obj: unknown, path: string): unknown {\n try {\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current == null || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Check if value is a valid number\n */\nexport function isValidNumber(value: unknown): value is number {\n return typeof value === 'number' && !isNaN(value) && isFinite(value);\n}\n","/**\n * Capture Module\n *\n * Handles trace capture and batching.\n * Called by providers to record LLM calls.\n */\n\nimport type { ProviderName, CreateTraceRequest, ObserveOptions } from './types';\nimport { getTransport } from './config';\nimport { traceCapture, traceCaptureError, debug } from './logger';\n\n// ─────────────────────────────────────────────────────────────\n// Global context (set via observe options)\n// ─────────────────────────────────────────────────────────────\n\nlet globalContext: ObserveOptions = {};\n\nexport function setGlobalContext(options: ObserveOptions): void {\n globalContext = options;\n debug('Global context updated', options);\n}\n\nexport function getGlobalContext(): ObserveOptions {\n return globalContext;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Capture Functions\n// ─────────────────────────────────────────────────────────────\n\nexport interface CaptureTraceParams {\n provider: ProviderName;\n model: string;\n input: unknown;\n output: unknown;\n inputTokens: number;\n outputTokens: number;\n durationMs: number;\n status: 'success' | 'error';\n streaming: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CaptureErrorParams {\n provider: ProviderName;\n model: string;\n input: unknown;\n error: Error;\n durationMs: number;\n streaming: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Capture a successful trace\n * Fire-and-forget - never throws\n */\nexport function captureTrace(params: CaptureTraceParams): void {\n try {\n const transport = getTransport();\n if (!transport.isEnabled()) {\n debug('Transport disabled, skipping trace capture');\n return;\n }\n\n const context = getGlobalContext();\n\n const request: CreateTraceRequest = {\n provider: params.provider,\n model: params.model,\n input: sanitizeInput(params.input),\n output: sanitizeOutput(params.output),\n inputTokens: params.inputTokens,\n outputTokens: params.outputTokens,\n durationMs: params.durationMs,\n status: params.status,\n streaming: params.streaming,\n sessionId: context.sessionId,\n userId: context.userId,\n metadata: { ...context.metadata, ...params.metadata },\n tags: context.tags,\n };\n\n traceCapture(params.provider, params.model, params.durationMs, params.status);\n transport.enqueue(request);\n } catch (err) {\n traceCaptureError(params.provider, err instanceof Error ? err : new Error(String(err)));\n }\n}\n\n/**\n * Capture an error trace\n * Fire-and-forget - never throws\n */\nexport function captureError(params: CaptureErrorParams): void {\n try {\n const transport = getTransport();\n if (!transport.isEnabled()) {\n debug('Transport disabled, skipping error capture');\n return;\n }\n\n const context = getGlobalContext();\n\n const request: CreateTraceRequest = {\n provider: params.provider,\n model: params.model,\n input: sanitizeInput(params.input),\n output: null,\n inputTokens: 0,\n outputTokens: 0,\n durationMs: params.durationMs,\n status: 'error',\n errorMessage: params.error.message,\n errorStack: params.error.stack,\n streaming: params.streaming,\n sessionId: context.sessionId,\n userId: context.userId,\n metadata: { ...context.metadata, ...params.metadata },\n tags: context.tags,\n };\n\n traceCapture(params.provider, params.model, params.durationMs, 'error');\n debug('Error details', { message: params.error.message, stack: params.error.stack });\n transport.enqueue(request);\n } catch (err) {\n traceCaptureError(params.provider, err instanceof Error ? err : new Error(String(err)));\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Sanitization (security)\n// ─────────────────────────────────────────────────────────────\n\nconst MAX_STRING_LENGTH = 100_000; // 100KB per field\nconst SENSITIVE_KEYS = ['api_key', 'apikey', 'password', 'secret', 'token', 'authorization'];\n\n/**\n * Sanitize input before sending\n * - Truncates large strings\n * - Removes sensitive data\n */\nfunction sanitizeInput(input: unknown): unknown {\n return sanitize(input, 0);\n}\n\n/**\n * Sanitize output before sending\n */\nfunction sanitizeOutput(output: unknown): unknown {\n return sanitize(output, 0);\n}\n\nfunction sanitize(value: unknown, depth: number): unknown {\n // Prevent infinite recursion\n if (depth > 10) return '[max depth exceeded]';\n\n if (value === null || value === undefined) return value;\n\n if (typeof value === 'string') {\n return value.length > MAX_STRING_LENGTH\n ? value.slice(0, MAX_STRING_LENGTH) + '...[truncated]'\n : value;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => sanitize(item, depth + 1));\n }\n\n if (typeof value === 'object') {\n const sanitized: Record<string, unknown> = {};\n\n for (const [key, val] of Object.entries(value)) {\n // Redact sensitive keys\n if (SENSITIVE_KEYS.some((k) => key.toLowerCase().includes(k))) {\n sanitized[key] = '[REDACTED]';\n } else {\n sanitized[key] = sanitize(val, depth + 1);\n }\n }\n\n return sanitized;\n }\n\n // Functions, symbols, etc.\n return String(value);\n}\n","/**\n * OpenAI Provider Wrapper\n *\n * Wraps the OpenAI SDK to automatically capture:\n * - chat.completions.create()\n * - responses.create() (new Responses API - recommended)\n * - completions.create() (legacy)\n * - embeddings.create()\n *\n * Supports both streaming and non-streaming responses.\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\nimport { safeExtract, getNestedValue, isValidNumber } from './base';\nimport { captureTrace, captureError } from '../core/capture';\n\n// ─────────────────────────────────────────────────────────────\n// Types (minimal, to avoid SDK dependency)\n// ─────────────────────────────────────────────────────────────\n\ninterface OpenAIClient {\n chat?: {\n completions: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n };\n responses?: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n completions?: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n embeddings?: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n}\n\ninterface ChatCompletionRequest {\n model?: string;\n messages?: unknown[];\n stream?: boolean;\n [key: string]: unknown;\n}\n\ninterface StreamChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n role?: string;\n };\n finish_reason?: string;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n}\n\n// Responses API types (new recommended API)\ninterface ResponsesRequest {\n model?: string;\n input?: string | unknown[];\n instructions?: string;\n stream?: boolean;\n tools?: unknown[];\n [key: string]: unknown;\n}\n\ninterface ResponsesResult {\n id?: string;\n output?: unknown[];\n output_text?: string;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n };\n [key: string]: unknown;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'openai';\n\n/**\n * Check if client is OpenAI SDK\n */\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n\n // Check constructor name\n const constructorName = client.constructor?.name;\n if (constructorName === 'OpenAI') return true;\n\n // Check for characteristic properties (chat.completions or responses)\n const c = client as Record<string, unknown>;\n return !!(c.chat && c.completions) || !!c.responses;\n}\n\n/**\n * Wrap OpenAI client with tracing\n */\nexport function wrap(client: unknown): unknown {\n const openaiClient = client as OpenAIClient;\n return new Proxy(openaiClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n // Wrap nested objects (chat, completions, responses, etc.)\n if (prop === 'chat' && value && typeof value === 'object') {\n return wrapChatNamespace(value as OpenAIClient['chat']);\n }\n\n if (prop === 'responses' && value && typeof value === 'object') {\n return wrapResponsesNamespace(value as OpenAIClient['responses']);\n }\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapCompletionsNamespace(value as OpenAIClient['completions']);\n }\n\n if (prop === 'embeddings' && value && typeof value === 'object') {\n return wrapEmbeddingsNamespace(value as OpenAIClient['embeddings']);\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Namespace Wrappers\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapChatNamespace(chat: OpenAIClient['chat']) {\n if (!chat) return chat;\n\n return new Proxy(chat, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapChatCompletions(value as { create: (...args: unknown[]) => Promise<unknown> });\n }\n\n return value;\n },\n });\n}\n\nfunction wrapChatCompletions(completions: { create: (...args: unknown[]) => Promise<unknown> }) {\n return new Proxy(completions, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapChatCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapResponsesNamespace(responses: OpenAIClient['responses']) {\n if (!responses) return responses;\n\n return new Proxy(responses, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapResponsesCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapCompletionsNamespace(completions: OpenAIClient['completions']) {\n if (!completions) return completions;\n\n return new Proxy(completions, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapCompletionCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapEmbeddingsNamespace(embeddings: OpenAIClient['embeddings']) {\n if (!embeddings) return embeddings;\n\n return new Proxy(embeddings, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapEmbeddingsCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Method Wrappers\n// ─────────────────────────────────────────────────────────────\n\nexport function wrapChatCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedChatCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as ChatCompletionRequest;\n const isStreaming = request.stream === true;\n\n try {\n const response = await originalFn(...args);\n\n if (isStreaming && isAsyncIterable(response)) {\n // Return wrapped stream\n return wrapStream(response, request, startTime);\n }\n\n // Non-streaming response\n const durationMs = Date.now() - startTime;\n const extracted = extractChatCompletion(response);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || extracted.model || 'unknown',\n input: request.messages,\n output: extracted.output,\n inputTokens: extracted.tokens?.inputTokens || 0,\n outputTokens: extracted.tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: isStreaming,\n });\n\n throw error;\n }\n };\n}\n\n/**\n * Wrap responses.create() - new Responses API\n */\nexport function wrapResponsesCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedResponsesCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as ResponsesRequest;\n const isStreaming = request.stream === true;\n\n try {\n const response = await originalFn(...args);\n\n if (isStreaming && isAsyncIterable(response)) {\n return wrapResponsesStream(response, request, startTime);\n }\n\n const durationMs = Date.now() - startTime;\n const extracted = extractResponsesResult(response as ResponsesResult);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { instructions: request.instructions, input: request.input },\n output: extracted.output,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n durationMs,\n status: 'success',\n streaming: false,\n metadata: extracted.metadata,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { instructions: request.instructions, input: request.input },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: isStreaming,\n });\n\n throw error;\n }\n };\n}\n\nexport function wrapCompletionCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedCompletionCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as Record<string, unknown>;\n\n try {\n const response = await originalFn(...args);\n const durationMs = Date.now() - startTime;\n const extracted = extractLegacyCompletion(response);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: (request.model as string) || extracted.model || 'unknown',\n input: request.prompt,\n output: extracted.output,\n inputTokens: extracted.tokens?.inputTokens || 0,\n outputTokens: extracted.tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: (request.model as string) || 'unknown',\n input: request.prompt,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: false,\n });\n\n throw error;\n }\n };\n}\n\nexport function wrapEmbeddingsCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedEmbeddingsCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as Record<string, unknown>;\n\n try {\n const response = await originalFn(...args);\n const durationMs = Date.now() - startTime;\n const tokens = extractEmbeddingTokens(response);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: (request.model as string) || 'unknown',\n input: request.input,\n output: '[embedding vectors]',\n inputTokens: tokens?.inputTokens || 0,\n outputTokens: 0,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: (request.model as string) || 'unknown',\n input: request.input,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: false,\n });\n\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Streaming Support\n// ─────────────────────────────────────────────────────────────\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function';\n}\n\nasync function* wrapStream(\n stream: AsyncIterable<unknown>,\n request: ChatCompletionRequest,\n startTime: number\n): AsyncIterable<unknown> {\n const chunks: string[] = [];\n let tokens: TokenUsage | null = null;\n let error: Error | null = null;\n\n try {\n for await (const chunk of stream) {\n // Extract content from chunk\n const content = extractStreamChunkContent(chunk as StreamChunk);\n if (content) {\n chunks.push(content);\n }\n\n // Extract tokens if available (usually in last chunk)\n const chunkTokens = extractStreamChunkTokens(chunk as StreamChunk);\n if (chunkTokens) {\n tokens = chunkTokens;\n }\n\n yield chunk;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n const output = chunks.join('');\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n output,\n inputTokens: tokens?.inputTokens || 0,\n outputTokens: tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractChatCompletion(response: unknown): {\n model: string | null;\n output: unknown;\n tokens: TokenUsage | null;\n} {\n const model = safeExtract(() => getNestedValue(response, 'model') as string, null);\n const output = safeExtract(\n () => getNestedValue(response, 'choices.0.message.content') as string,\n null\n );\n const tokens = extractTokens(response);\n\n return { model, output, tokens };\n}\n\nfunction extractLegacyCompletion(response: unknown): {\n model: string | null;\n output: unknown;\n tokens: TokenUsage | null;\n} {\n const model = safeExtract(() => getNestedValue(response, 'model') as string, null);\n const output = safeExtract(\n () => getNestedValue(response, 'choices.0.text') as string,\n null\n );\n const tokens = extractTokens(response);\n\n return { model, output, tokens };\n}\n\nfunction extractTokens(response: unknown): TokenUsage | null {\n try {\n const usage = getNestedValue(response, 'usage');\n if (!usage || typeof usage !== 'object') return null;\n\n const u = usage as Record<string, unknown>;\n const promptTokens = u.prompt_tokens;\n const completionTokens = u.completion_tokens;\n const totalTokens = u.total_tokens;\n\n if (!isValidNumber(promptTokens) && !isValidNumber(completionTokens)) {\n return null;\n }\n\n return {\n inputTokens: isValidNumber(promptTokens) ? promptTokens : 0,\n outputTokens: isValidNumber(completionTokens) ? completionTokens : 0,\n totalTokens: isValidNumber(totalTokens) ? totalTokens : 0,\n };\n } catch {\n return null;\n }\n}\n\nfunction extractEmbeddingTokens(response: unknown): TokenUsage | null {\n try {\n const usage = getNestedValue(response, 'usage');\n if (!usage || typeof usage !== 'object') return null;\n\n const u = usage as Record<string, unknown>;\n const promptTokens = u.prompt_tokens;\n const totalTokens = u.total_tokens;\n\n return {\n inputTokens: isValidNumber(promptTokens) ? promptTokens : 0,\n outputTokens: 0,\n totalTokens: isValidNumber(totalTokens) ? totalTokens : 0,\n };\n } catch {\n return null;\n }\n}\n\nfunction extractStreamChunkContent(chunk: StreamChunk): string | null {\n try {\n return chunk?.choices?.[0]?.delta?.content ?? null;\n } catch {\n return null;\n }\n}\n\nfunction extractStreamChunkTokens(chunk: StreamChunk): TokenUsage | null {\n try {\n const usage = chunk?.usage;\n if (!usage) return null;\n\n return {\n inputTokens: isValidNumber(usage.prompt_tokens) ? usage.prompt_tokens : 0,\n outputTokens: isValidNumber(usage.completion_tokens) ? usage.completion_tokens : 0,\n totalTokens: 0,\n };\n } catch {\n return null;\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Responses API Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractResponsesResult(response: ResponsesResult): {\n output: unknown;\n inputTokens: number;\n outputTokens: number;\n metadata: Record<string, unknown>;\n} {\n // output_text is the primary text output\n let output: unknown = response.output_text || null;\n\n // If no output_text, try to extract from output array\n if (!output && response.output && Array.isArray(response.output)) {\n const textItems = response.output\n .filter((item: unknown) => {\n const i = item as Record<string, unknown>;\n return i.type === 'message' || i.type === 'text';\n })\n .map((item: unknown) => {\n const i = item as Record<string, unknown>;\n if (i.type === 'message' && i.content) {\n const content = i.content as Array<{ type: string; text?: string }>;\n return content\n .filter((c) => c.type === 'text' || c.type === 'output_text')\n .map((c) => c.text || '')\n .join('');\n }\n return (i as { text?: string }).text || '';\n });\n output = textItems.join('');\n }\n\n const usage = response.usage || {};\n const inputTokens = isValidNumber(usage.input_tokens) ? usage.input_tokens! : 0;\n const outputTokens = isValidNumber(usage.output_tokens) ? usage.output_tokens! : 0;\n\n const metadata: Record<string, unknown> = {};\n if (response.id) {\n metadata.responseId = response.id;\n }\n\n return {\n output,\n inputTokens,\n outputTokens,\n metadata: Object.keys(metadata).length > 0 ? metadata : {},\n };\n}\n\nasync function* wrapResponsesStream(\n stream: AsyncIterable<unknown>,\n request: ResponsesRequest,\n startTime: number\n): AsyncIterable<unknown> {\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let error: Error | null = null;\n\n try {\n for await (const event of stream) {\n const e = event as Record<string, unknown>;\n\n // Extract text content from streaming events\n if (e.type === 'response.output_text.delta' && e.delta) {\n chunks.push(e.delta as string);\n }\n\n // Extract usage from done event\n if (e.type === 'response.done' && e.response) {\n const resp = e.response as ResponsesResult;\n if (resp.usage) {\n inputTokens = resp.usage.input_tokens || 0;\n outputTokens = resp.usage.output_tokens || 0;\n }\n }\n\n yield event;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { instructions: request.instructions, input: request.input },\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { instructions: request.instructions, input: request.input },\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n}\n","/**\n * Anthropic Provider Wrapper\n *\n * Wraps the Anthropic SDK to automatically capture:\n * - messages.create()\n * - messages.stream()\n *\n * Supports both streaming and non-streaming responses.\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\nimport { safeExtract, getNestedValue, isValidNumber } from './base';\nimport { captureTrace, captureError } from '../core/capture';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\ninterface AnthropicClient {\n messages?: {\n create: (...args: unknown[]) => Promise<unknown>;\n stream?: (...args: unknown[]) => unknown;\n };\n completions?: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n}\n\ninterface MessageRequest {\n model?: string;\n messages?: unknown[];\n system?: string;\n stream?: boolean;\n max_tokens?: number;\n [key: string]: unknown;\n}\n\ninterface MessageResponse {\n id?: string;\n type?: string;\n role?: string;\n content?: Array<{ type: string; text?: string }>;\n model?: string;\n stop_reason?: string;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n}\n\ninterface StreamEvent {\n type: string;\n message?: MessageResponse;\n index?: number;\n content_block?: { type: string; text?: string };\n delta?: { type: string; text?: string };\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'anthropic';\n\n/**\n * Check if client is Anthropic SDK\n */\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n\n const constructorName = client.constructor?.name;\n if (constructorName === 'Anthropic') return true;\n\n // Check for characteristic properties\n const c = client as Record<string, unknown>;\n return !!(c.messages && typeof c.messages === 'object');\n}\n\n/**\n * Wrap Anthropic client with tracing\n */\nexport function wrap(client: unknown): unknown {\n const anthropicClient = client as AnthropicClient;\n return new Proxy(anthropicClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'messages' && value && typeof value === 'object') {\n return wrapMessagesNamespace(value as AnthropicClient['messages']);\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Namespace Wrappers\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapMessagesNamespace(messages: AnthropicClient['messages']) {\n if (!messages) return messages;\n\n return new Proxy(messages, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapMessagesCreate(value.bind(target));\n }\n\n if (prop === 'stream' && typeof value === 'function') {\n return wrapMessagesStream(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Method Wrappers\n// ─────────────────────────────────────────────────────────────\n\nexport function wrapMessagesCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedMessagesCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as MessageRequest;\n const isStreaming = request.stream === true;\n\n try {\n const response = await originalFn(...args);\n\n if (isStreaming && isAsyncIterable(response)) {\n return wrapStream(response, request, startTime);\n }\n\n // Non-streaming response\n const durationMs = Date.now() - startTime;\n const extracted = extractMessageResponse(response as MessageResponse);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || extracted.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n output: extracted.output,\n inputTokens: extracted.tokens?.inputTokens || 0,\n outputTokens: extracted.tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: isStreaming,\n });\n\n throw error;\n }\n };\n}\n\nexport function wrapMessagesStream(originalFn: (...args: unknown[]) => unknown) {\n return function wrappedMessagesStream(...args: unknown[]): unknown {\n const startTime = Date.now();\n const request = (args[0] || {}) as MessageRequest;\n\n try {\n const stream = originalFn(...args);\n\n // Anthropic's stream() returns a Stream object with async iterator\n if (stream && typeof stream === 'object') {\n return wrapAnthropicStream(stream, request, startTime);\n }\n\n return stream;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: true,\n });\n\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Streaming Support\n// ─────────────────────────────────────────────────────────────\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function';\n}\n\nfunction wrapAnthropicStream(\n stream: unknown,\n request: MessageRequest,\n startTime: number\n): unknown {\n // Anthropic SDK returns a Stream object with methods like finalMessage()\n // We need to wrap the async iterator and track events\n\n const originalStream = stream as {\n [Symbol.asyncIterator]?: () => AsyncIterator<StreamEvent>;\n finalMessage?: () => Promise<MessageResponse>;\n };\n\n if (!originalStream[Symbol.asyncIterator]) {\n return stream;\n }\n\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let model = request.model || 'unknown';\n let captured = false;\n\n const wrappedIterator = async function* () {\n try {\n for await (const event of originalStream as AsyncIterable<StreamEvent>) {\n // Extract data from events\n if (event.type === 'message_start' && event.message) {\n model = event.message.model || model;\n if (event.message.usage) {\n inputTokens = event.message.usage.input_tokens || 0;\n }\n }\n\n if (event.type === 'content_block_delta' && event.delta?.text) {\n chunks.push(event.delta.text);\n }\n\n if (event.type === 'message_delta' && event.usage) {\n outputTokens = event.usage.output_tokens || 0;\n }\n\n yield event;\n }\n } catch (error) {\n if (!captured) {\n captured = true;\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model,\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: true,\n });\n }\n\n throw error;\n } finally {\n if (!captured) {\n captured = true;\n const durationMs = Date.now() - startTime;\n\n captureTrace({\n provider: PROVIDER_NAME,\n model,\n input: { system: request.system, messages: request.messages },\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n };\n\n // Return a proxy that preserves other methods (like finalMessage)\n return new Proxy(stream as object, {\n get(target, prop, receiver) {\n if (prop === Symbol.asyncIterator) {\n return () => wrappedIterator()[Symbol.asyncIterator]();\n }\n\n return Reflect.get(target, prop, receiver);\n },\n });\n}\n\nasync function* wrapStream(\n stream: AsyncIterable<unknown>,\n request: MessageRequest,\n startTime: number\n): AsyncIterable<unknown> {\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let model = request.model || 'unknown';\n let error: Error | null = null;\n\n try {\n for await (const event of stream as AsyncIterable<StreamEvent>) {\n if (event.type === 'message_start' && event.message) {\n model = event.message.model || model;\n if (event.message.usage) {\n inputTokens = event.message.usage.input_tokens || 0;\n }\n }\n\n if (event.type === 'content_block_delta' && event.delta?.text) {\n chunks.push(event.delta.text);\n }\n\n if (event.type === 'message_delta' && event.usage) {\n outputTokens = event.usage.output_tokens || 0;\n }\n\n yield event;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model,\n input: { system: request.system, messages: request.messages },\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model,\n input: { system: request.system, messages: request.messages },\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractMessageResponse(response: MessageResponse): {\n model: string | null;\n output: string | null;\n tokens: TokenUsage | null;\n} {\n const model = safeExtract(() => response.model ?? null, null);\n\n // Extract text from content blocks\n const output = safeExtract(() => {\n if (!response.content || !Array.isArray(response.content)) return null;\n\n const textBlocks = response.content\n .filter((block) => block.type === 'text' && block.text)\n .map((block) => block.text);\n\n return textBlocks.join('') || null;\n }, null);\n\n const tokens = extractTokens(response);\n\n return { model, output, tokens };\n}\n\nfunction extractTokens(response: MessageResponse): TokenUsage | null {\n try {\n const usage = response.usage;\n if (!usage) return null;\n\n const inputTokens = usage.input_tokens;\n const outputTokens = usage.output_tokens;\n\n if (!isValidNumber(inputTokens) && !isValidNumber(outputTokens)) {\n return null;\n }\n\n return {\n inputTokens: isValidNumber(inputTokens) ? inputTokens : 0,\n outputTokens: isValidNumber(outputTokens) ? outputTokens : 0,\n totalTokens: (isValidNumber(inputTokens) ? inputTokens : 0) + (isValidNumber(outputTokens) ? outputTokens : 0),\n };\n } catch {\n return null;\n }\n}\n","/**\n * AWS Bedrock Provider Wrapper\n *\n * Wraps @aws-sdk/client-bedrock-runtime to automatically capture:\n * - client.send(ConverseCommand)\n * - client.send(ConverseStreamCommand)\n * - client.send(InvokeModelCommand)\n * - client.send(InvokeModelWithResponseStreamCommand)\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\nimport { safeExtract, isValidNumber } from './base';\nimport { captureTrace, captureError } from '../core/capture';\n\n// ─────────────────────────────────────────────────────────────\n// Types (minimal, to avoid SDK dependency)\n// ─────────────────────────────────────────────────────────────\n\ninterface BedrockClient {\n send: (command: BedrockCommand) => Promise<unknown>;\n config?: { region?: string | (() => Promise<string>) };\n}\n\ninterface BedrockCommand {\n constructor: { name: string };\n input: unknown;\n}\n\ninterface ConverseInput {\n modelId: string;\n messages?: Array<{ role: string; content: Array<{ text?: string }> }>;\n system?: Array<{ text?: string }>;\n inferenceConfig?: Record<string, unknown>;\n toolConfig?: Record<string, unknown>;\n guardrailConfig?: Record<string, unknown>;\n performanceConfig?: { latency?: string };\n requestMetadata?: Record<string, string>;\n}\n\ninterface ConverseResponse {\n $metadata: { httpStatusCode: number };\n output?: {\n message?: { role: string; content: Array<{ text?: string; toolUse?: unknown }> };\n };\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cacheReadInputTokens?: number;\n cacheWriteInputTokens?: number;\n };\n stopReason?: string;\n metrics?: { latencyMs?: number };\n}\n\ninterface ConverseStreamResponse {\n $metadata: { httpStatusCode: number };\n stream?: AsyncIterable<ConverseStreamEvent>;\n}\n\ninterface ConverseStreamEvent {\n messageStart?: { role: string };\n contentBlockDelta?: { contentBlockIndex: number; delta?: { text?: string } };\n contentBlockStop?: { contentBlockIndex: number };\n messageStop?: { stopReason?: string };\n metadata?: { usage?: { inputTokens?: number; outputTokens?: number } };\n}\n\ninterface InvokeModelInput {\n modelId: string;\n body: Uint8Array | string;\n contentType?: string;\n}\n\ninterface InvokeModelResponse {\n $metadata: { httpStatusCode: number };\n body: Uint8Array;\n contentType?: string;\n}\n\ninterface InvokeModelStreamResponse {\n $metadata: { httpStatusCode: number };\n body?: AsyncIterable<{ chunk?: { bytes?: Uint8Array } }>;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'bedrock';\n\n/**\n * Check if client is BedrockRuntimeClient\n */\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n\n const constructorName = client.constructor?.name;\n if (constructorName === 'BedrockRuntimeClient') return true;\n\n // Check by shape: has send() and config.region\n const c = client as Record<string, unknown>;\n if (typeof c.send !== 'function') return false;\n if (!c.config || typeof c.config !== 'object') return false;\n\n return 'region' in (c.config as Record<string, unknown>);\n}\n\n/**\n * Wrap BedrockRuntimeClient with tracing\n */\nexport function wrap(client: unknown): unknown {\n const bedrockClient = client as BedrockClient;\n\n return new Proxy(bedrockClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'send' && typeof value === 'function') {\n return wrapSend(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Send Wrapper\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapSend(originalSend: (cmd: BedrockCommand) => Promise<unknown>) {\n return async function tracedSend(command: BedrockCommand): Promise<unknown> {\n const commandName = command.constructor?.name || '';\n\n switch (commandName) {\n case 'ConverseCommand':\n return handleConverse(originalSend, command);\n case 'ConverseStreamCommand':\n return handleConverseStream(originalSend, command);\n case 'InvokeModelCommand':\n return handleInvokeModel(originalSend, command);\n case 'InvokeModelWithResponseStreamCommand':\n return handleInvokeModelStream(originalSend, command);\n default:\n // Pass through non-LLM commands (e.g., ListFoundationModels)\n return originalSend(command);\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Converse API Handlers\n// ─────────────────────────────────────────────────────────────\n\nasync function handleConverse(\n send: (cmd: BedrockCommand) => Promise<unknown>,\n command: BedrockCommand\n): Promise<unknown> {\n const startTime = Date.now();\n const input = command.input as ConverseInput;\n\n try {\n const response = (await send(command)) as ConverseResponse;\n const durationMs = Date.now() - startTime;\n const extracted = extractConverseOutput(response);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: { system: input.system, messages: input.messages },\n output: extracted.output,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n durationMs,\n status: 'success',\n streaming: false,\n metadata: {\n stopReason: response.stopReason,\n hasToolUse: extracted.hasToolUse,\n cacheReadTokens: extracted.cacheReadTokens,\n cacheWriteTokens: extracted.cacheWriteTokens,\n latencyMs: response.metrics?.latencyMs,\n },\n });\n\n return response;\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: { system: input.system, messages: input.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: false,\n });\n throw error;\n }\n}\n\nasync function handleConverseStream(\n send: (cmd: BedrockCommand) => Promise<unknown>,\n command: BedrockCommand\n): Promise<unknown> {\n const startTime = Date.now();\n const input = command.input as ConverseInput;\n\n try {\n const response = (await send(command)) as ConverseStreamResponse;\n\n if (response.stream) {\n return {\n ...response,\n stream: wrapConverseStream(response.stream, input, startTime),\n };\n }\n\n return response;\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: { system: input.system, messages: input.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: true,\n });\n throw error;\n }\n}\n\nasync function* wrapConverseStream(\n stream: AsyncIterable<ConverseStreamEvent>,\n input: ConverseInput,\n startTime: number\n): AsyncIterable<ConverseStreamEvent> {\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let error: Error | null = null;\n\n try {\n for await (const event of stream) {\n if (event.contentBlockDelta?.delta?.text) {\n chunks.push(event.contentBlockDelta.delta.text);\n }\n if (event.metadata?.usage) {\n inputTokens = event.metadata.usage.inputTokens || 0;\n outputTokens = event.metadata.usage.outputTokens || 0;\n }\n yield event;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: { system: input.system, messages: input.messages },\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: { system: input.system, messages: input.messages },\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// InvokeModel API Handlers\n// ─────────────────────────────────────────────────────────────\n\nasync function handleInvokeModel(\n send: (cmd: BedrockCommand) => Promise<unknown>,\n command: BedrockCommand\n): Promise<unknown> {\n const startTime = Date.now();\n const input = command.input as InvokeModelInput;\n\n try {\n const response = (await send(command)) as InvokeModelResponse;\n const durationMs = Date.now() - startTime;\n const parsed = parseInvokeModelBody(response.body);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: parseRequestBody(input.body),\n output: parsed.output,\n inputTokens: parsed.inputTokens,\n outputTokens: parsed.outputTokens,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: parseRequestBody(input.body),\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: false,\n });\n throw error;\n }\n}\n\nasync function handleInvokeModelStream(\n send: (cmd: BedrockCommand) => Promise<unknown>,\n command: BedrockCommand\n): Promise<unknown> {\n const startTime = Date.now();\n const input = command.input as InvokeModelInput;\n\n try {\n const response = (await send(command)) as InvokeModelStreamResponse;\n\n if (response.body) {\n return {\n ...response,\n body: wrapInvokeModelStream(response.body, input, startTime),\n };\n }\n\n return response;\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: parseRequestBody(input.body),\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: true,\n });\n throw error;\n }\n}\n\nasync function* wrapInvokeModelStream(\n stream: AsyncIterable<{ chunk?: { bytes?: Uint8Array } }>,\n input: InvokeModelInput,\n startTime: number\n): AsyncIterable<{ chunk?: { bytes?: Uint8Array } }> {\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let error: Error | null = null;\n\n try {\n for await (const event of stream) {\n if (event.chunk?.bytes) {\n const parsed = tryParseStreamChunk(event.chunk.bytes);\n if (parsed) {\n if (parsed.text) chunks.push(parsed.text);\n if (parsed.inputTokens) inputTokens = parsed.inputTokens;\n if (parsed.outputTokens) outputTokens = parsed.outputTokens;\n }\n }\n yield event;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: parseRequestBody(input.body),\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model: input.modelId || 'unknown',\n input: parseRequestBody(input.body),\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractConverseOutput(response: ConverseResponse): {\n output: unknown;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n hasToolUse: boolean;\n} {\n const content = response.output?.message?.content;\n const hasToolUse = Array.isArray(content) && content.some((c) => c.toolUse);\n\n const output = safeExtract(() => {\n if (!Array.isArray(content)) return null;\n // If there's tool use, return the full content structure\n if (hasToolUse) {\n return content;\n }\n // Otherwise, join text content\n return content.map((c) => c.text || '').join('');\n }, null);\n\n const usage = response.usage || {};\n\n return {\n output,\n inputTokens: isValidNumber(usage.inputTokens) ? usage.inputTokens! : 0,\n outputTokens: isValidNumber(usage.outputTokens) ? usage.outputTokens! : 0,\n cacheReadTokens: isValidNumber(usage.cacheReadInputTokens) ? usage.cacheReadInputTokens! : 0,\n cacheWriteTokens: isValidNumber(usage.cacheWriteInputTokens) ? usage.cacheWriteInputTokens! : 0,\n hasToolUse,\n };\n}\n\nfunction parseInvokeModelBody(body: Uint8Array): {\n output: unknown;\n inputTokens: number;\n outputTokens: number;\n} {\n try {\n const text = new TextDecoder().decode(body);\n const parsed = JSON.parse(text);\n\n // Claude on Bedrock\n if (parsed.content && Array.isArray(parsed.content)) {\n const output = parsed.content\n .filter((c: { type: string }) => c.type === 'text')\n .map((c: { text?: string }) => c.text || '')\n .join('');\n return {\n output,\n inputTokens: parsed.usage?.input_tokens || 0,\n outputTokens: parsed.usage?.output_tokens || 0,\n };\n }\n\n // Amazon Titan\n if (parsed.results) {\n return {\n output: parsed.results[0]?.outputText || parsed.results,\n inputTokens: parsed.inputTextTokenCount || 0,\n outputTokens: parsed.results[0]?.tokenCount || 0,\n };\n }\n\n // Meta Llama\n if (parsed.generation) {\n return {\n output: parsed.generation,\n inputTokens: parsed.prompt_token_count || 0,\n outputTokens: parsed.generation_token_count || 0,\n };\n }\n\n return { output: parsed, inputTokens: 0, outputTokens: 0 };\n } catch {\n return { output: null, inputTokens: 0, outputTokens: 0 };\n }\n}\n\nfunction parseRequestBody(body: Uint8Array | string): unknown {\n try {\n const text = typeof body === 'string' ? body : new TextDecoder().decode(body);\n return JSON.parse(text);\n } catch {\n return body;\n }\n}\n\nfunction tryParseStreamChunk(bytes: Uint8Array): {\n text?: string;\n inputTokens?: number;\n outputTokens?: number;\n} | null {\n try {\n const text = new TextDecoder().decode(bytes);\n const parsed = JSON.parse(text);\n\n // Claude streaming format\n if (parsed.type === 'content_block_delta' && parsed.delta?.text) {\n return { text: parsed.delta.text };\n }\n if (parsed.type === 'message_delta' && parsed.usage) {\n return { outputTokens: parsed.usage.output_tokens };\n }\n if (parsed.type === 'message_start' && parsed.message?.usage) {\n return { inputTokens: parsed.message.usage.input_tokens };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n","/**\n * Google Gemini Provider Wrapper\n *\n * Wraps @google/generative-ai to automatically capture:\n * - model.generateContent()\n * - model.generateContentStream()\n * - chat.sendMessage()\n * - chat.sendMessageStream()\n *\n * Supports both GoogleGenerativeAI (@google/generative-ai)\n * and GoogleGenAI (@google/genai) clients.\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\nimport { safeExtract, isValidNumber } from './base';\nimport { captureTrace, captureError } from '../core/capture';\n\n// ─────────────────────────────────────────────────────────────\n// Types (minimal, to avoid SDK dependency)\n// ─────────────────────────────────────────────────────────────\n\ninterface GeminiClient {\n getGenerativeModel: (config: ModelConfig) => GenerativeModel;\n apiKey?: string;\n}\n\ninterface ModelConfig {\n model: string;\n systemInstruction?: string;\n generationConfig?: GenerationConfig;\n [key: string]: unknown;\n}\n\ninterface GenerationConfig {\n temperature?: number;\n maxOutputTokens?: number;\n responseMimeType?: string;\n responseSchema?: unknown;\n [key: string]: unknown;\n}\n\ninterface GenerativeModel {\n generateContent: (request: GenerateContentRequest | string) => Promise<GenerateContentResult>;\n generateContentStream: (request: GenerateContentRequest | string) => Promise<StreamGenerateContentResult>;\n startChat: (config?: ChatConfig) => ChatSession;\n model: string;\n}\n\ninterface GenerateContentRequest {\n contents?: Content[];\n systemInstruction?: string | Content;\n generationConfig?: GenerationConfig;\n [key: string]: unknown;\n}\n\ninterface Content {\n role?: string;\n parts: Part[];\n}\n\ninterface Part {\n text?: string;\n inlineData?: { mimeType: string; data: string };\n [key: string]: unknown;\n}\n\ninterface GenerateContentResult {\n response: GenerateContentResponse;\n}\n\ninterface StreamGenerateContentResult {\n stream: AsyncIterable<GenerateContentStreamChunk>;\n response: Promise<GenerateContentResponse>;\n}\n\ninterface GenerateContentResponse {\n text: () => string;\n candidates?: Candidate[];\n usageMetadata?: UsageMetadata;\n}\n\ninterface GenerateContentStreamChunk {\n text: () => string;\n candidates?: Candidate[];\n usageMetadata?: UsageMetadata;\n}\n\ninterface Candidate {\n content?: Content;\n finishReason?: string;\n}\n\ninterface UsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n cachedContentTokenCount?: number;\n thoughtsTokenCount?: number;\n}\n\ninterface ChatConfig {\n history?: Content[];\n systemInstruction?: string | Content;\n generationConfig?: GenerationConfig;\n [key: string]: unknown;\n}\n\ninterface ChatSession {\n sendMessage: (request: string | Part[]) => Promise<GenerateContentResult>;\n sendMessageStream: (request: string | Part[]) => Promise<StreamGenerateContentResult>;\n getHistory: () => Promise<Content[]>;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'gemini';\n\n/**\n * Check if client is GoogleGenerativeAI or GoogleGenAI\n */\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n\n const constructorName = client.constructor?.name;\n\n // @google/generative-ai\n if (constructorName === 'GoogleGenerativeAI') return true;\n\n // @google/genai\n if (constructorName === 'GoogleGenAI') return true;\n\n // Check by shape: has getGenerativeModel\n const c = client as Record<string, unknown>;\n if (typeof c.getGenerativeModel === 'function') return true;\n\n // @google/genai has models.generate\n if (c.models && typeof (c.models as Record<string, unknown>).generate === 'function') {\n return true;\n }\n\n return false;\n}\n\n/**\n * Wrap Gemini client with tracing\n */\nexport function wrap(client: unknown): unknown {\n const geminiClient = client as GeminiClient;\n\n return new Proxy(geminiClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'getGenerativeModel' && typeof value === 'function') {\n return wrapGetGenerativeModel(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Model Wrapper\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapGetGenerativeModel(\n originalFn: (config: ModelConfig) => GenerativeModel\n): (config: ModelConfig) => GenerativeModel {\n return function wrappedGetGenerativeModel(config: ModelConfig): GenerativeModel {\n const model = originalFn(config);\n return wrapGenerativeModel(model, config.model);\n };\n}\n\nfunction wrapGenerativeModel(model: GenerativeModel, modelName: string): GenerativeModel {\n return new Proxy(model, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'generateContent' && typeof value === 'function') {\n return wrapGenerateContent(value.bind(target), modelName);\n }\n\n if (prop === 'generateContentStream' && typeof value === 'function') {\n return wrapGenerateContentStream(value.bind(target), modelName);\n }\n\n if (prop === 'startChat' && typeof value === 'function') {\n return wrapStartChat(value.bind(target), modelName);\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// generateContent Wrapper\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapGenerateContent(\n originalFn: (request: GenerateContentRequest | string) => Promise<GenerateContentResult>,\n modelName: string\n) {\n return async function wrappedGenerateContent(\n request: GenerateContentRequest | string\n ): Promise<GenerateContentResult> {\n const startTime = Date.now();\n const input = extractInput(request);\n\n try {\n const result = await originalFn(request);\n const durationMs = Date.now() - startTime;\n const extracted = extractGenerateContentResult(result);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n output: extracted.output,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n durationMs,\n status: 'success',\n streaming: false,\n metadata: extracted.metadata,\n });\n\n return result;\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: false,\n });\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// generateContentStream Wrapper\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapGenerateContentStream(\n originalFn: (request: GenerateContentRequest | string) => Promise<StreamGenerateContentResult>,\n modelName: string\n) {\n return async function wrappedGenerateContentStream(\n request: GenerateContentRequest | string\n ): Promise<StreamGenerateContentResult> {\n const startTime = Date.now();\n const input = extractInput(request);\n\n try {\n const result = await originalFn(request);\n\n // Wrap the stream to capture content\n const wrappedStream = wrapStream(result.stream, modelName, input, startTime);\n\n return {\n ...result,\n stream: wrappedStream,\n };\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: true,\n });\n throw error;\n }\n };\n}\n\nasync function* wrapStream(\n stream: AsyncIterable<GenerateContentStreamChunk>,\n modelName: string,\n input: unknown,\n startTime: number\n): AsyncIterable<GenerateContentStreamChunk> {\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let cachedTokens = 0;\n let thoughtsTokens = 0;\n let error: Error | null = null;\n\n try {\n for await (const chunk of stream) {\n // Extract text from chunk\n try {\n const text = chunk.text();\n if (text) {\n chunks.push(text);\n }\n } catch {\n // text() may throw if no text content\n }\n\n // Extract tokens from final chunk\n if (chunk.usageMetadata) {\n inputTokens = chunk.usageMetadata.promptTokenCount || 0;\n outputTokens = chunk.usageMetadata.candidatesTokenCount || 0;\n cachedTokens = chunk.usageMetadata.cachedContentTokenCount || 0;\n thoughtsTokens = chunk.usageMetadata.thoughtsTokenCount || 0;\n }\n\n yield chunk;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n metadata: {\n cachedTokens: cachedTokens > 0 ? cachedTokens : undefined,\n thoughtsTokens: thoughtsTokens > 0 ? thoughtsTokens : undefined,\n },\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Chat Wrapper\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapStartChat(\n originalFn: (config?: ChatConfig) => ChatSession,\n modelName: string\n): (config?: ChatConfig) => ChatSession {\n return function wrappedStartChat(config?: ChatConfig): ChatSession {\n const chat = originalFn(config);\n return wrapChatSession(chat, modelName);\n };\n}\n\nfunction wrapChatSession(chat: ChatSession, modelName: string): ChatSession {\n return new Proxy(chat, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'sendMessage' && typeof value === 'function') {\n return wrapSendMessage(value.bind(target), modelName);\n }\n\n if (prop === 'sendMessageStream' && typeof value === 'function') {\n return wrapSendMessageStream(value.bind(target), modelName);\n }\n\n return value;\n },\n });\n}\n\nfunction wrapSendMessage(\n originalFn: (request: string | Part[]) => Promise<GenerateContentResult>,\n modelName: string\n) {\n return async function wrappedSendMessage(\n request: string | Part[]\n ): Promise<GenerateContentResult> {\n const startTime = Date.now();\n const input = typeof request === 'string' ? request : request;\n\n try {\n const result = await originalFn(request);\n const durationMs = Date.now() - startTime;\n const extracted = extractGenerateContentResult(result);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n output: extracted.output,\n inputTokens: extracted.inputTokens,\n outputTokens: extracted.outputTokens,\n durationMs,\n status: 'success',\n streaming: false,\n metadata: extracted.metadata,\n });\n\n return result;\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: false,\n });\n throw error;\n }\n };\n}\n\nfunction wrapSendMessageStream(\n originalFn: (request: string | Part[]) => Promise<StreamGenerateContentResult>,\n modelName: string\n) {\n return async function wrappedSendMessageStream(\n request: string | Part[]\n ): Promise<StreamGenerateContentResult> {\n const startTime = Date.now();\n const input = typeof request === 'string' ? request : request;\n\n try {\n const result = await originalFn(request);\n const wrappedStream = wrapStream(result.stream, modelName, input, startTime);\n\n return {\n ...result,\n stream: wrappedStream,\n };\n } catch (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: modelName,\n input,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs: Date.now() - startTime,\n streaming: true,\n });\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractInput(request: GenerateContentRequest | string): unknown {\n if (typeof request === 'string') {\n return request;\n }\n\n // Extract contents (messages)\n if (request.contents) {\n return request.contents;\n }\n\n return request;\n}\n\nfunction extractGenerateContentResult(result: GenerateContentResult): {\n output: unknown;\n inputTokens: number;\n outputTokens: number;\n metadata: Record<string, unknown>;\n} {\n const response = result.response;\n\n // Extract text output\n let output: unknown = null;\n try {\n output = response.text();\n } catch {\n // text() may throw if response has function calls or other non-text content\n output = safeExtract(() => {\n const content = response.candidates?.[0]?.content;\n if (content?.parts) {\n return content.parts;\n }\n return null;\n }, null);\n }\n\n // Extract token usage\n const usage = response.usageMetadata;\n const inputTokens = isValidNumber(usage?.promptTokenCount) ? usage!.promptTokenCount! : 0;\n const outputTokens = isValidNumber(usage?.candidatesTokenCount) ? usage!.candidatesTokenCount! : 0;\n\n // Build metadata\n const metadata: Record<string, unknown> = {};\n\n if (usage?.cachedContentTokenCount && usage.cachedContentTokenCount > 0) {\n metadata.cachedTokens = usage.cachedContentTokenCount;\n }\n\n if (usage?.thoughtsTokenCount && usage.thoughtsTokenCount > 0) {\n metadata.thoughtsTokens = usage.thoughtsTokenCount;\n }\n\n const finishReason = response.candidates?.[0]?.finishReason;\n if (finishReason) {\n metadata.finishReason = finishReason;\n }\n\n return {\n output,\n inputTokens,\n outputTokens,\n metadata: Object.keys(metadata).length > 0 ? metadata : {},\n };\n}\n","/**\n * OpenRouter Provider Wrapper\n *\n * Wraps OpenAI SDK configured with OpenRouter's API.\n * OpenRouter provides unified access to 400+ models from multiple providers.\n *\n * Traced methods:\n * - chat.completions.create()\n *\n * Supports both streaming and non-streaming responses.\n *\n * @see https://openrouter.ai/docs\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\nimport { safeExtract, getNestedValue, isValidNumber } from './base';\nimport { captureTrace, captureError } from '../core/capture';\n\n// ─────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────\n\nconst OPENROUTER_BASE_URL = 'openrouter.ai';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\ninterface OpenRouterClient {\n baseURL?: string;\n chat?: {\n completions: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n };\n}\n\ninterface ChatCompletionRequest {\n model?: string;\n messages?: unknown[];\n stream?: boolean;\n // OpenRouter-specific fields\n provider?: {\n order?: string[];\n allow_fallbacks?: boolean;\n data_collection?: 'allow' | 'deny';\n quantizations?: string[];\n };\n [key: string]: unknown;\n}\n\ninterface ChatCompletionResponse {\n id?: string;\n model?: string;\n choices?: Array<{\n message?: {\n content?: string;\n role?: string;\n };\n finish_reason?: string;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n // OpenRouter may include additional fields\n [key: string]: unknown;\n}\n\ninterface StreamChunk {\n id?: string;\n choices?: Array<{\n delta?: {\n content?: string;\n role?: string;\n };\n finish_reason?: string;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'openrouter';\n\n/**\n * Check if client is OpenAI SDK configured for OpenRouter\n */\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n\n const c = client as OpenRouterClient;\n\n // Must have chat.completions (OpenAI SDK structure)\n if (!c.chat?.completions?.create) return false;\n\n // Check if baseURL points to OpenRouter\n const baseURL = c.baseURL || '';\n return baseURL.includes(OPENROUTER_BASE_URL);\n}\n\n/**\n * Wrap OpenRouter client with tracing\n */\nexport function wrap(client: unknown): unknown {\n const openrouterClient = client as OpenRouterClient;\n\n return new Proxy(openrouterClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'chat' && value && typeof value === 'object') {\n return wrapChatNamespace(value as OpenRouterClient['chat']);\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Namespace Wrappers\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapChatNamespace(chat: OpenRouterClient['chat']) {\n if (!chat) return chat;\n\n return new Proxy(chat, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapChatCompletions(value as { create: (...args: unknown[]) => Promise<unknown> });\n }\n\n return value;\n },\n });\n}\n\nfunction wrapChatCompletions(completions: { create: (...args: unknown[]) => Promise<unknown> }) {\n return new Proxy(completions, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapChatCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Method Wrapper\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapChatCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedChatCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as ChatCompletionRequest;\n const isStreaming = request.stream === true;\n\n try {\n const response = await originalFn(...args);\n\n if (isStreaming && isAsyncIterable(response)) {\n return wrapStream(response, request, startTime);\n }\n\n // Non-streaming response\n const durationMs = Date.now() - startTime;\n const extracted = extractChatCompletion(response as ChatCompletionResponse);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || extracted.model || 'unknown',\n input: request.messages,\n output: extracted.output,\n inputTokens: extracted.tokens?.inputTokens || 0,\n outputTokens: extracted.tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: false,\n metadata: extracted.metadata,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: isStreaming,\n });\n\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Streaming Support\n// ─────────────────────────────────────────────────────────────\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function';\n}\n\nasync function* wrapStream(\n stream: AsyncIterable<unknown>,\n request: ChatCompletionRequest,\n startTime: number\n): AsyncIterable<unknown> {\n const chunks: string[] = [];\n let tokens: TokenUsage | null = null;\n let generationId: string | null = null;\n let error: Error | null = null;\n\n try {\n for await (const chunk of stream) {\n const c = chunk as StreamChunk;\n\n // Extract generation ID from first chunk\n if (!generationId && c.id) {\n generationId = c.id;\n }\n\n // Extract content from chunk\n const content = c.choices?.[0]?.delta?.content;\n if (content) {\n chunks.push(content);\n }\n\n // Extract tokens if available (usually in last chunk)\n const chunkTokens = extractStreamChunkTokens(c);\n if (chunkTokens) {\n tokens = chunkTokens;\n }\n\n yield chunk;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n const output = chunks.join('');\n\n const metadata: Record<string, unknown> = {};\n if (generationId) {\n metadata.generationId = generationId;\n }\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n output,\n inputTokens: tokens?.inputTokens || 0,\n outputTokens: tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: true,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractChatCompletion(response: ChatCompletionResponse): {\n model: string | null;\n output: unknown;\n tokens: TokenUsage | null;\n metadata: Record<string, unknown>;\n} {\n const model = response.model || null;\n const output = response.choices?.[0]?.message?.content || null;\n const tokens = extractTokens(response);\n\n const metadata: Record<string, unknown> = {};\n\n // Capture generation ID for async usage lookup\n if (response.id) {\n metadata.generationId = response.id;\n }\n\n return {\n model,\n output,\n tokens,\n metadata: Object.keys(metadata).length > 0 ? metadata : {},\n };\n}\n\nfunction extractTokens(response: ChatCompletionResponse): TokenUsage | null {\n const usage = response.usage;\n if (!usage) return null;\n\n const promptTokens = usage.prompt_tokens;\n const completionTokens = usage.completion_tokens;\n const totalTokens = usage.total_tokens;\n\n if (!isValidNumber(promptTokens) && !isValidNumber(completionTokens)) {\n return null;\n }\n\n return {\n inputTokens: isValidNumber(promptTokens) ? promptTokens : 0,\n outputTokens: isValidNumber(completionTokens) ? completionTokens : 0,\n totalTokens: isValidNumber(totalTokens) ? totalTokens : 0,\n };\n}\n\nfunction extractStreamChunkTokens(chunk: StreamChunk): TokenUsage | null {\n const usage = chunk.usage;\n if (!usage) return null;\n\n return {\n inputTokens: isValidNumber(usage.prompt_tokens) ? usage.prompt_tokens : 0,\n outputTokens: isValidNumber(usage.completion_tokens) ? usage.completion_tokens : 0,\n totalTokens: 0,\n };\n}\n","/**\n * Observe Function\n *\n * Main entry point for wrapping LLM clients with automatic tracing.\n */\n\nimport * as openai from './providers/openai';\nimport * as anthropic from './providers/anthropic';\nimport * as bedrock from './providers/bedrock';\nimport * as gemini from './providers/gemini';\nimport * as openrouter from './providers/openrouter';\nimport { setGlobalContext } from './core/capture';\nimport { getConfig } from './core/config';\nimport type { ObserveOptions } from './core/types';\nimport { clientWrapped, warn, debug } from './core/logger';\n\n// ─────────────────────────────────────────────────────────────\n// Observe Function\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Wrap an LLM client with automatic tracing\n *\n * @param client - OpenAI, Anthropic, or Bedrock client instance\n * @param options - Optional context (sessionId, userId, etc.)\n * @returns The wrapped client with the same type\n *\n * @example\n * import { observe } from '@lelemondev/sdk';\n * import OpenAI from 'openai';\n *\n * const openai = observe(new OpenAI());\n *\n * // All calls are now automatically traced\n * const response = await openai.chat.completions.create({...});\n */\nexport function observe<T>(client: T, options?: ObserveOptions): T {\n // Set global context if provided\n if (options) {\n setGlobalContext(options);\n }\n\n // Check if disabled\n const config = getConfig();\n if (config.disabled) {\n debug('Tracing disabled, returning unwrapped client');\n return client;\n }\n\n // Detect and wrap based on client shape\n // Note: OpenRouter must be checked BEFORE OpenAI because it uses the OpenAI SDK\n if (openrouter.canHandle(client)) {\n clientWrapped('openrouter');\n return openrouter.wrap(client) as T;\n }\n\n if (openai.canHandle(client)) {\n clientWrapped('openai');\n return wrapOpenAI(client) as T;\n }\n\n if (anthropic.canHandle(client)) {\n clientWrapped('anthropic');\n return wrapAnthropic(client) as T;\n }\n\n if (bedrock.canHandle(client)) {\n clientWrapped('bedrock');\n return bedrock.wrap(client) as T;\n }\n\n if (gemini.canHandle(client)) {\n clientWrapped('gemini');\n return gemini.wrap(client) as T;\n }\n\n // Unknown client type\n warn('Unknown client type. Tracing not enabled. Supported: OpenAI, OpenRouter, Anthropic, Bedrock, Gemini');\n\n return client;\n}\n\n// ─────────────────────────────────────────────────────────────\n// OpenAI Wrapper\n// ─────────────────────────────────────────────────────────────\n\ninterface OpenAIShape {\n chat?: { completions: { create: CallableFunction } };\n responses?: { create: CallableFunction };\n completions?: { create: CallableFunction };\n embeddings?: { create: CallableFunction };\n}\n\nfunction wrapOpenAI(client: unknown): unknown {\n const typed = client as OpenAIShape;\n\n return new Proxy(typed, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'chat' && value && typeof value === 'object') {\n return wrapOpenAIChat(value as OpenAIShape['chat']);\n }\n\n if (prop === 'responses' && value && typeof value === 'object') {\n return wrapOpenAIResponses(value as OpenAIShape['responses']);\n }\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapOpenAICompletions(value as OpenAIShape['completions']);\n }\n\n if (prop === 'embeddings' && value && typeof value === 'object') {\n return wrapOpenAIEmbeddings(value as OpenAIShape['embeddings']);\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAIChat(chat: OpenAIShape['chat']) {\n return new Proxy(chat!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapOpenAIChatCompletions(value as { create: CallableFunction });\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAIChatCompletions(completions: { create: CallableFunction }) {\n return new Proxy(completions, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return openai.wrapChatCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAIResponses(responses: OpenAIShape['responses']) {\n return new Proxy(responses!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return openai.wrapResponsesCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAICompletions(completions: OpenAIShape['completions']) {\n return new Proxy(completions!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return openai.wrapCompletionCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAIEmbeddings(embeddings: OpenAIShape['embeddings']) {\n return new Proxy(embeddings!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return openai.wrapEmbeddingsCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Anthropic Wrapper\n// ─────────────────────────────────────────────────────────────\n\ninterface AnthropicShape {\n messages?: {\n create: CallableFunction;\n stream?: CallableFunction;\n };\n}\n\nfunction wrapAnthropic(client: unknown): unknown {\n const typed = client as AnthropicShape;\n\n return new Proxy(typed, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'messages' && value && typeof value === 'object') {\n return wrapAnthropicMessages(value as AnthropicShape['messages']);\n }\n\n return value;\n },\n });\n}\n\nfunction wrapAnthropicMessages(messages: AnthropicShape['messages']) {\n return new Proxy(messages!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return anthropic.wrapMessagesCreate(value.bind(target));\n }\n\n if (prop === 'stream' && typeof value === 'function') {\n return anthropic.wrapMessagesStream(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Factory Function\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Create a scoped observe function with preset context\n *\n * @example\n * const observeWithSession = createObserve({\n * sessionId: 'session-123',\n * userId: 'user-456',\n * });\n *\n * const openai = observeWithSession(new OpenAI());\n */\nexport function createObserve(defaultOptions: ObserveOptions) {\n return function scopedObserve<T>(client: T, options?: ObserveOptions): T {\n return observe(client, { ...defaultOptions, ...options });\n };\n}\n"]}