{"version":3,"sources":["../src/utils/errors.ts","../src/utils/logger.ts","../src/http/HttpClient.ts","../src/http/RetryPolicy.ts","../src/http/CircuitBreaker.ts","../src/config/defaults.ts","../src/api/OpenRouterAPI.ts","../data/models.json","../src/models/ModelCatalog.ts","../src/models/routers/CostOptimizer.ts","../src/models/routers/PerformanceRouter.ts","../src/models/routers/BalancedRouter.ts","../src/models/routers/CapabilityRouter.ts","../src/models/ModelSelector.ts","../src/utils/tokenCounter.ts","../src/pricing/PricingCalculator.ts","../src/pricing/CostTracker.ts","../src/config/schema.ts","../src/utils/validation.ts","../src/client/OpenRouterClient.ts","../src/models/strategies/CascadingStrategy.ts","../src/models/strategies/WeightedStrategy.ts","../src/models/strategies/ContextAwareStrategy.ts","../src/pricing/budgets/Alerting.ts","../src/adapters/express.ts","../src/adapters/fastify.ts","../src/adapters/nestjs.ts","../src/cache/MemoryCache.ts","../src/cache/LRUCache.ts","../src/cache/RequestDeduplicator.ts","../src/cache/CacheManager.ts","../src/monitoring/MetricsCollector.ts","../src/monitoring/HealthCheck.ts","../src/monitoring/Analytics.ts","../src/providers/BaseProvider.ts","../src/providers/providers/OpenAIProvider.ts","../src/providers/providers/AnthropicProvider.ts","../src/providers/providers/LlamaProvider.ts","../src/providers/providers/MistralProvider.ts","../src/providers/providers/CohereProvider.ts","../src/providers/ProviderRegistry.ts"],"names":["EventEmitter","z"],"mappings":"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","file":"index.mjs","sourcesContent":["export class OpenRouterError extends Error {\n  constructor(\n    message: string,\n    public code: string,\n    public statusCode?: number,\n    public details?: Record<string, unknown>,\n  ) {\n    super(message);\n    this.name = 'OpenRouterError';\n    Object.setPrototypeOf(this, OpenRouterError.prototype);\n  }\n}\n\nexport class AuthenticationError extends OpenRouterError {\n  constructor(message: string = 'Invalid API key', details?: Record<string, unknown>) {\n    super(message, 'AUTHENTICATION_ERROR', 401, details);\n    this.name = 'AuthenticationError';\n  }\n}\n\nexport class RateLimitError extends OpenRouterError {\n  constructor(\n    message: string = 'Rate limit exceeded',\n    public retryAfter?: number,\n    details?: Record<string, unknown>,\n  ) {\n    super(message, 'RATE_LIMIT_ERROR', 429, details);\n    this.name = 'RateLimitError';\n  }\n}\n\nexport class ModelNotFoundError extends OpenRouterError {\n  constructor(modelId: string) {\n    super(`Model not found: ${modelId}`, 'MODEL_NOT_FOUND', 404, { modelId });\n    this.name = 'ModelNotFoundError';\n  }\n}\n\nexport class InvalidRequestError extends OpenRouterError {\n  constructor(message: string, details?: Record<string, unknown>) {\n    super(message, 'INVALID_REQUEST', 400, details);\n    this.name = 'InvalidRequestError';\n  }\n}\n\nexport class NetworkError extends OpenRouterError {\n  constructor(\n    message: string,\n    public originalError?: Error,\n  ) {\n    super(message, 'NETWORK_ERROR', undefined, { originalError: originalError?.message });\n    this.name = 'NetworkError';\n  }\n}\n\nexport class TimeoutError extends OpenRouterError {\n  constructor(timeout: number) {\n    super(`Request timed out after ${timeout}ms`, 'TIMEOUT_ERROR', 408, { timeout });\n    this.name = 'TimeoutError';\n  }\n}\n\nexport class BudgetExceededError extends OpenRouterError {\n  constructor(current: number, limit: number, period: string) {\n    super(`Budget exceeded: ${current} / ${limit} (${period})`, 'BUDGET_EXCEEDED', 402, {\n      current,\n      limit,\n      period,\n    });\n    this.name = 'BudgetExceededError';\n  }\n}\n\nexport class ModelSelectionError extends OpenRouterError {\n  constructor(message: string, details?: Record<string, unknown>) {\n    super(message, 'MODEL_SELECTION_ERROR', undefined, details);\n    this.name = 'ModelSelectionError';\n  }\n}\n\nexport class StreamError extends OpenRouterError {\n  constructor(message: string, details?: Record<string, unknown>) {\n    super(message, 'STREAM_ERROR', undefined, details);\n    this.name = 'StreamError';\n  }\n}\n\nexport function isRetryableError(error: Error): boolean {\n  if (error instanceof RateLimitError) return true;\n  if (error instanceof NetworkError) return true;\n  if (error instanceof TimeoutError) return true;\n\n  if (error instanceof OpenRouterError) {\n    const retryableCodes = [408, 429, 500, 502, 503, 504];\n    return error.statusCode ? retryableCodes.includes(error.statusCode) : false;\n  }\n\n  return false;\n}\n\nexport function parseOpenRouterError(statusCode: number, body: any): OpenRouterError {\n  const message = body?.error?.message || 'Unknown error';\n  const details = body?.error?.metadata || {};\n\n  switch (statusCode) {\n    case 401:\n    case 403:\n      return new AuthenticationError(message, details);\n    case 404:\n      return new ModelNotFoundError(message);\n    case 429:\n      const retryAfter = body?.error?.metadata?.retry_after;\n      return new RateLimitError(message, retryAfter, details);\n    case 400:\n      return new InvalidRequestError(message, details);\n    default:\n      return new OpenRouterError(message, 'API_ERROR', statusCode, details);\n  }\n}\n","type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\ninterface LoggerOptions {\n  enabled: boolean;\n  level: LogLevel;\n  prefix?: string;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n  debug: 0,\n  info: 1,\n  warn: 2,\n  error: 3,\n};\n\nexport class Logger {\n  private options: LoggerOptions;\n\n  constructor(options: Partial<LoggerOptions> = {}) {\n    this.options = {\n      enabled: options.enabled ?? true,\n      level: options.level ?? 'info',\n      prefix: options.prefix ?? '[OpenRouter]',\n    };\n  }\n\n  private shouldLog(level: LogLevel): boolean {\n    if (!this.options.enabled) return false;\n    return LOG_LEVELS[level] >= LOG_LEVELS[this.options.level];\n  }\n\n  private formatMessage(level: LogLevel, message: string, meta?: Record<string, unknown>): string {\n    const timestamp = new Date().toISOString();\n    const prefix = this.options.prefix;\n    let formatted = `${timestamp} ${prefix} [${level.toUpperCase()}] ${message}`;\n\n    if (meta && Object.keys(meta).length > 0) {\n      formatted += `\\n${JSON.stringify(meta, null, 2)}`;\n    }\n\n    return formatted;\n  }\n\n  debug(message: string, meta?: Record<string, unknown>): void {\n    if (this.shouldLog('debug')) {\n      // eslint-disable-next-line no-console\n      console.debug(this.formatMessage('debug', message, meta));\n    }\n  }\n\n  info(message: string, meta?: Record<string, unknown>): void {\n    if (this.shouldLog('info')) {\n      // eslint-disable-next-line no-console\n      console.info(this.formatMessage('info', message, meta));\n    }\n  }\n\n  warn(message: string, meta?: Record<string, unknown>): void {\n    if (this.shouldLog('warn')) {\n      console.warn(this.formatMessage('warn', message, meta));\n    }\n  }\n\n  error(message: string, error?: Error | Record<string, unknown>): void {\n    if (this.shouldLog('error')) {\n      const meta = error instanceof Error ? { message: error.message, stack: error.stack } : error;\n      console.error(this.formatMessage('error', message, meta));\n    }\n  }\n\n  setLevel(level: LogLevel): void {\n    this.options.level = level;\n  }\n\n  setEnabled(enabled: boolean): void {\n    this.options.enabled = enabled;\n  }\n}\n\nexport const createLogger = (options?: Partial<LoggerOptions>): Logger => {\n  return new Logger(options);\n};\n","import * as https from 'https';\nimport * as http from 'http';\nimport { OpenRouterConfig } from '../types/config';\nimport { NetworkError, TimeoutError, parseOpenRouterError } from '../utils/errors';\nimport { Logger } from '../utils/logger';\n\nexport interface RequestOptions {\n  method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n  headers?: Record<string, string>;\n  body?: unknown;\n  timeout?: number;\n}\n\nexport interface HttpResponse<T = any> {\n  status: number;\n  headers: Record<string, string>;\n  data: T;\n}\n\nexport class HttpClient {\n  private agent: https.Agent;\n  private logger: Logger;\n\n  constructor(\n    private config: OpenRouterConfig,\n    logger?: Logger,\n  ) {\n    this.logger = logger || new Logger({ enabled: config.logging?.enabled });\n\n    this.agent = new https.Agent({\n      keepAlive: true,\n      maxSockets: 50,\n      maxFreeSockets: 10,\n      timeout: config.timeout || 30000,\n      keepAliveMsecs: 1000,\n    });\n  }\n\n  async request<T = any>(url: string, options: RequestOptions): Promise<HttpResponse<T>> {\n    const fullUrl = url.startsWith('http') ? url : `${this.config.baseURL}${url}`;\n    const timeout = options.timeout || this.config.timeout || 30000;\n\n    return new Promise((resolve, reject) => {\n      const parsedUrl = new URL(fullUrl);\n      const isHttps = parsedUrl.protocol === 'https:';\n      const lib = isHttps ? https : http;\n\n      const requestOptions: http.RequestOptions = {\n        method: options.method,\n        hostname: parsedUrl.hostname,\n        port: parsedUrl.port,\n        path: parsedUrl.pathname + parsedUrl.search,\n        headers: {\n          'Content-Type': 'application/json',\n          'User-Agent': `Payaar-OpenRouter-Client/1.0.0 (${this.config.appName || 'Unknown'})`,\n          Authorization: `Bearer ${this.config.apiKey}`,\n          'HTTP-Referer': this.config.httpReferer || 'https://github.com/3bd0-shaban/payaar-core',\n          'X-Title': (this.config.appName || 'Payaar-OpenRouter-Client').replace(\n            /[^a-zA-Z0-9-_]/g,\n            '-',\n          ),\n          'X-Project': this.config.appName || 'payaar-core',\n          ...options.headers,\n        },\n        agent: isHttps ? this.agent : undefined,\n        timeout,\n      };\n\n      this.logger.debug(`HTTP ${options.method} ${fullUrl}`, {\n        headers: requestOptions.headers,\n      });\n\n      const req = lib.request(requestOptions, (res) => {\n        let data = '';\n\n        res.on('data', (chunk) => {\n          data += chunk;\n        });\n\n        res.on('end', () => {\n          try {\n            const statusCode = res.statusCode || 500;\n            const headers: Record<string, string> = {};\n\n            Object.entries(res.headers).forEach(([key, value]) => {\n              headers[key] = Array.isArray(value) ? value.join(', ') : value || '';\n            });\n\n            this.logger.debug(`HTTP Response ${statusCode}`, {\n              url: fullUrl,\n              status: statusCode,\n            });\n\n            if (statusCode >= 200 && statusCode < 300) {\n              const parsedData = data ? JSON.parse(data) : null;\n              resolve({\n                status: statusCode,\n                headers,\n                data: parsedData,\n              });\n            } else {\n              const errorBody = data ? JSON.parse(data) : {};\n              reject(parseOpenRouterError(statusCode, errorBody));\n            }\n          } catch (error) {\n            reject(\n              new NetworkError(\n                `Failed to parse response: ${(error as Error).message}`,\n                error as Error,\n              ),\n            );\n          }\n        });\n      });\n\n      req.on('error', (error) => {\n        this.logger.error('HTTP request failed', error);\n        reject(new NetworkError(`Request failed: ${error.message}`, error));\n      });\n\n      req.on('timeout', () => {\n        req.destroy();\n        reject(new TimeoutError(timeout));\n      });\n\n      if (options.body) {\n        const body = JSON.stringify(options.body);\n        req.write(body);\n      }\n\n      req.end();\n    });\n  }\n\n  async get<T = any>(url: string, headers?: Record<string, string>): Promise<HttpResponse<T>> {\n    return this.request<T>(url, { method: 'GET', headers });\n  }\n\n  async post<T = any>(\n    url: string,\n    body: unknown,\n    headers?: Record<string, string>,\n  ): Promise<HttpResponse<T>> {\n    return this.request<T>(url, { method: 'POST', body, headers });\n  }\n\n  async put<T = any>(\n    url: string,\n    body: unknown,\n    headers?: Record<string, string>,\n  ): Promise<HttpResponse<T>> {\n    return this.request<T>(url, { method: 'PUT', body, headers });\n  }\n\n  async delete<T = any>(url: string, headers?: Record<string, string>): Promise<HttpResponse<T>> {\n    return this.request<T>(url, { method: 'DELETE', headers });\n  }\n\n  /**\n   * POST request with SSE streaming support\n   */\n  async *postStream<T = any>(\n    url: string,\n    body: unknown,\n    headers?: Record<string, string>,\n  ): AsyncIterable<T> {\n    const fullUrl = `${this.config.baseURL}${url}`;\n    const timeout = this.config.timeout || 30000;\n    const parsedUrl = new URL(fullUrl);\n    const isHttps = parsedUrl.protocol === 'https:';\n    const lib = isHttps ? https : http;\n\n    const requestOptions: http.RequestOptions = {\n      method: 'POST',\n      hostname: parsedUrl.hostname,\n      port: parsedUrl.port,\n      path: parsedUrl.pathname + parsedUrl.search,\n      headers: {\n        'Content-Type': 'application/json',\n        'User-Agent': `Payaar-OpenRouter-Client/1.0.0 (${this.config.appName || 'Unknown'})`,\n        Authorization: `Bearer ${this.config.apiKey}`,\n        'HTTP-Referer': this.config.httpReferer || 'https://github.com/3bd0-shaban/payaar-core',\n        'X-Title': (this.config.appName || 'Payaar-OpenRouter-Client').replace(\n          /[^a-zA-Z0-9-_]/g,\n          '-',\n        ),\n        'X-Project': this.config.appName || 'payaar-core',\n        Accept: 'text/event-stream',\n        ...headers,\n      },\n      agent: isHttps ? this.agent : undefined,\n      timeout,\n    };\n\n    this.logger.debug(`HTTP POST (stream) ${fullUrl}`);\n\n    const generator = await new Promise<AsyncIterable<T>>((resolve, reject) => {\n      const req = lib.request(requestOptions, (res) => {\n        const statusCode = res.statusCode || 0;\n\n        if (statusCode < 200 || statusCode >= 300) {\n          let errorData = '';\n          res.on('data', (chunk) => (errorData += chunk));\n          res.on('end', () => {\n            try {\n              const errorBody = errorData ? JSON.parse(errorData) : {};\n              reject(parseOpenRouterError(statusCode, errorBody));\n            } catch {\n              reject(new NetworkError(`HTTP ${statusCode}: ${errorData}`));\n            }\n          });\n          return;\n        }\n\n        // Create async generator for SSE stream\n        const streamGenerator = (async function* () {\n          let buffer = '';\n\n          for await (const chunk of res) {\n            buffer += chunk.toString();\n            const lines = buffer.split('\\n');\n            buffer = lines.pop() || '';\n\n            for (const line of lines) {\n              const trimmed = line.trim();\n              if (trimmed.startsWith('data: ')) {\n                const data = trimmed.slice(6);\n\n                if (data === '[DONE]') {\n                  return;\n                }\n\n                try {\n                  yield JSON.parse(data) as T;\n                } catch {\n                  // Skip invalid JSON\n                  continue;\n                }\n              }\n            }\n          }\n        })();\n\n        resolve(streamGenerator);\n      });\n\n      req.on('error', (error) => {\n        reject(new NetworkError(`Network request failed: ${error.message}`, error));\n      });\n\n      req.on('timeout', () => {\n        req.destroy();\n        reject(new TimeoutError(timeout));\n      });\n\n      if (body) {\n        req.write(JSON.stringify(body));\n      }\n\n      req.end();\n    });\n\n    // Yield all chunks from the generator\n    for await (const chunk of generator) {\n      yield chunk;\n    }\n  }\n\n  destroy(): void {\n    this.agent.destroy();\n  }\n}\n","import { Logger } from '../utils/logger';\nimport { OpenRouterError } from '../utils/errors';\n\nexport interface RetryPolicyOptions {\n  maxAttempts: number;\n  baseDelay: number;\n  maxDelay: number;\n  exponential: boolean;\n  retryableStatusCodes: number[];\n}\n\nexport class RetryPolicy {\n  private logger: Logger;\n\n  constructor(\n    private options: RetryPolicyOptions,\n    logger?: Logger,\n  ) {\n    this.logger = logger || new Logger({ enabled: false });\n  }\n\n  async execute<T>(operation: () => Promise<T>, context?: string): Promise<T> {\n    let lastError: Error | null = null;\n    let attempt = 0;\n\n    while (attempt < this.options.maxAttempts) {\n      try {\n        const result = await operation();\n\n        if (attempt > 0) {\n          this.logger.info(`Operation succeeded after ${attempt} retries`, { context });\n        }\n\n        return result;\n      } catch (error) {\n        lastError = error as Error;\n        attempt++;\n\n        if (!this.shouldRetry(error as Error)) {\n          this.logger.debug('Error is not retryable, throwing immediately', {\n            context,\n            error: (error as Error).message,\n          });\n          throw error;\n        }\n\n        if (attempt >= this.options.maxAttempts) {\n          this.logger.warn(`Max retry attempts (${this.options.maxAttempts}) reached`, {\n            context,\n            error: (error as Error).message,\n          });\n          break;\n        }\n\n        const delay = this.calculateDelay(attempt);\n        this.logger.info(`Retrying operation (attempt ${attempt}/${this.options.maxAttempts})`, {\n          context,\n          delay,\n          error: (error as Error).message,\n        });\n\n        await this.sleep(delay);\n      }\n    }\n\n    throw lastError;\n  }\n\n  private shouldRetry(error: Error): boolean {\n    if (error instanceof OpenRouterError) {\n      return error.statusCode\n        ? this.options.retryableStatusCodes.includes(error.statusCode)\n        : false;\n    }\n\n    // Network errors are retryable\n    return error.name === 'NetworkError' || error.name === 'TimeoutError';\n  }\n\n  private calculateDelay(attempt: number): number {\n    if (this.options.exponential) {\n      const exponentialDelay = this.options.baseDelay * Math.pow(2, attempt - 1);\n      return Math.min(exponentialDelay, this.options.maxDelay);\n    }\n\n    return Math.min(this.options.baseDelay * attempt, this.options.maxDelay);\n  }\n\n  private sleep(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n}\n","import { EventEmitter } from 'eventemitter3';\nimport { Logger } from '../utils/logger';\n\ntype CircuitState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';\n\nexport interface CircuitBreakerOptions {\n  failureThreshold: number;\n  resetTimeout: number;\n  monitorInterval: number;\n}\n\ninterface CircuitBreakerEvents {\n  'state:changed': (oldState: CircuitState, newState: CircuitState) => void;\n  'circuit:opened': (failures: number) => void;\n  'circuit:closed': () => void;\n  'failure:recorded': (total: number) => void;\n}\n\nexport class CircuitBreaker extends EventEmitter<CircuitBreakerEvents> {\n  private state: CircuitState = 'CLOSED';\n  private failureCount = 0;\n  private lastFailureTime?: Date;\n  private resetTimer?: NodeJS.Timeout;\n  private logger: Logger;\n\n  constructor(\n    private options: CircuitBreakerOptions,\n    logger?: Logger,\n  ) {\n    super();\n    this.logger = logger || new Logger({ enabled: false });\n  }\n\n  async execute<T>(operation: () => Promise<T>): Promise<T> {\n    if (this.state === 'OPEN') {\n      throw new Error('Circuit breaker is OPEN');\n    }\n\n    try {\n      const result = await operation();\n      this.onSuccess();\n      return result;\n    } catch (error) {\n      this.onFailure();\n      throw error;\n    }\n  }\n\n  private onSuccess(): void {\n    if (this.state === 'HALF_OPEN') {\n      this.close();\n    } else {\n      this.failureCount = 0;\n    }\n  }\n\n  private onFailure(): void {\n    this.failureCount++;\n    this.lastFailureTime = new Date();\n\n    this.emit('failure:recorded', this.failureCount);\n    this.logger.debug(`Circuit breaker failure recorded`, {\n      failures: this.failureCount,\n      threshold: this.options.failureThreshold,\n    });\n\n    if (this.failureCount >= this.options.failureThreshold) {\n      this.open();\n    }\n  }\n\n  private open(): void {\n    if (this.state === 'OPEN') return;\n\n    const oldState = this.state;\n    this.state = 'OPEN';\n\n    this.emit('state:changed', oldState, 'OPEN');\n    this.emit('circuit:opened', this.failureCount);\n\n    this.logger.warn('Circuit breaker opened', {\n      failures: this.failureCount,\n      threshold: this.options.failureThreshold,\n    });\n\n    // Schedule transition to HALF_OPEN\n    this.resetTimer = setTimeout(() => {\n      this.halfOpen();\n    }, this.options.resetTimeout);\n  }\n\n  private halfOpen(): void {\n    if (this.state !== 'OPEN') return;\n\n    const oldState = this.state;\n    this.state = 'HALF_OPEN';\n\n    this.emit('state:changed', oldState, 'HALF_OPEN');\n    this.logger.info('Circuit breaker half-opened (testing recovery)');\n  }\n\n  private close(): void {\n    if (this.state === 'CLOSED') return;\n\n    const oldState = this.state;\n    this.state = 'CLOSED';\n    this.failureCount = 0;\n\n    if (this.resetTimer) {\n      clearTimeout(this.resetTimer);\n      this.resetTimer = undefined;\n    }\n\n    this.emit('state:changed', oldState, 'CLOSED');\n    this.emit('circuit:closed');\n    this.logger.info('Circuit breaker closed (recovered)');\n  }\n\n  getState(): CircuitState {\n    return this.state;\n  }\n\n  getFailureCount(): number {\n    return this.failureCount;\n  }\n\n  isOpen(): boolean {\n    return this.state === 'OPEN';\n  }\n\n  reset(): void {\n    this.close();\n  }\n\n  destroy(): void {\n    if (this.resetTimer) {\n      clearTimeout(this.resetTimer);\n    }\n    this.removeAllListeners();\n  }\n}\n","import { OpenRouterConfig } from '../types/config';\n\nexport const DEFAULT_CONFIG: Partial<OpenRouterConfig> = {\n  baseURL: 'https://openrouter.ai/api/v1',\n  timeout: 30000,\n  maxRetries: 3,\n  retryDelay: 1000,\n\n  modelSelection: {\n    strategy: 'balanced',\n    fallbackEnabled: true,\n    maxFallbacks: 3,\n    autoSelect: true,\n  },\n\n  cache: {\n    enabled: true,\n    ttl: 600000, // 10 minutes\n    maxSize: 1000,\n  },\n\n  logging: {\n    enabled: true,\n    level: 'info',\n  },\n\n  budgets: {\n    alertThreshold: 0.8,\n  },\n};\n\nexport const DEFAULT_MODELS = {\n  budget: 'google/gemini-flash-1.5',\n  balanced: 'anthropic/claude-3.5-sonnet',\n  premium: 'anthropic/claude-3-opus',\n  vision: 'anthropic/claude-3.5-sonnet',\n  coding: 'anthropic/claude-3.5-sonnet',\n};\n\nexport const RETRY_STATUS_CODES = [408, 429, 500, 502, 503, 504];\n\nexport const OPENROUTER_ENDPOINTS = {\n  CHAT: '/chat/completions',\n  MODELS: '/models',\n  GENERATION: '/generation',\n} as const;\n","import {\n  ChatCompletionRequest,\n  ChatCompletionResponse,\n  StreamChunk,\n  ModelsListResponse,\n} from '../types/api';\nimport { HttpClient } from '../http/HttpClient';\nimport { OPENROUTER_ENDPOINTS } from '../config/defaults';\nimport { Logger } from '../utils/logger';\n\nexport class OpenRouterAPI {\n  constructor(\n    private httpClient: HttpClient,\n    private logger: Logger,\n  ) {}\n\n  /**\n   * Create a chat completion\n   */\n  async createChatCompletion(request: ChatCompletionRequest): Promise<ChatCompletionResponse> {\n    this.logger.debug('Creating chat completion', {\n      model: request.model,\n      messages: request.messages.length,\n    });\n\n    const response = await this.httpClient.post<ChatCompletionResponse>(\n      OPENROUTER_ENDPOINTS.CHAT,\n      request,\n    );\n\n    return response.data;\n  }\n\n  /**\n   * Create a streaming chat completion\n   */\n  async *createStreamingChatCompletion(request: ChatCompletionRequest): AsyncIterable<StreamChunk> {\n    this.logger.debug('Creating streaming chat completion', {\n      model: request.model,\n      messages: request.messages.length,\n    });\n\n    const streamRequest = {\n      ...request,\n      stream: true,\n    };\n\n    // Use raw streaming method to yield chunks\n    yield* this.httpClient.postStream<StreamChunk>(OPENROUTER_ENDPOINTS.CHAT, streamRequest);\n  }\n\n  /**\n   * List available models\n   */\n  async listModels(): Promise<ModelsListResponse> {\n    this.logger.debug('Listing models');\n\n    const response = await this.httpClient.get<ModelsListResponse>(OPENROUTER_ENDPOINTS.MODELS);\n\n    return response.data;\n  }\n\n  /**\n   * Get generation info (for cost tracking)\n   */\n  async getGeneration(generationId: string): Promise<any> {\n    this.logger.debug('Getting generation info', { generationId });\n\n    const response = await this.httpClient.get(\n      `${OPENROUTER_ENDPOINTS.GENERATION}?id=${generationId}`,\n    );\n\n    return response.data;\n  }\n}\n","[\n  {\n    \"id\": \"anthropic/claude-3.5-sonnet\",\n    \"name\": \"Claude 3.5 Sonnet\",\n    \"provider\": \"anthropic\",\n    \"description\": \"Most intelligent Claude model with best-in-class coding and vision\",\n    \"capabilities\": {\n      \"vision\": true,\n      \"functionCalling\": true,\n      \"jsonMode\": true,\n      \"tools\": true,\n      \"streaming\": true,\n      \"codeGeneration\": true\n    },\n    \"pricing\": {\n      \"inputTokens\": 3.0,\n      \"outputTokens\": 15.0\n    },\n    \"contextWindow\": 200000,\n    \"maxCompletionTokens\": 8192,\n    \"deprecated\": false,\n    \"modality\": \"multimodal\",\n    \"tier\": \"balanced\",\n    \"tags\": [\"balanced\", \"vision\", \"coding\", \"recommended\"],\n    \"rating\": 9.5,\n    \"releaseDate\": \"2024-06-20\"\n  },\n  {\n    \"id\": \"openai/gpt-4-turbo\",\n    \"name\": \"GPT-4 Turbo\",\n    \"provider\": \"openai\",\n    \"description\": \"Latest GPT-4 Turbo with vision capabilities\",\n    \"capabilities\": {\n      \"vision\": true,\n      \"functionCalling\": true,\n      \"jsonMode\": true,\n      \"tools\": true,\n      \"streaming\": true\n    },\n    \"pricing\": {\n      \"inputTokens\": 10.0,\n      \"outputTokens\": 30.0\n    },\n    \"contextWindow\": 128000,\n    \"maxCompletionTokens\": 4096,\n    \"deprecated\": false,\n    \"modality\": \"multimodal\",\n    \"tier\": \"premium\",\n    \"tags\": [\"premium\", \"vision\", \"function-calling\"],\n    \"rating\": 9.3,\n    \"releaseDate\": \"2024-04-09\"\n  },\n  {\n    \"id\": \"openai/gpt-3.5-turbo\",\n    \"name\": \"GPT-3.5 Turbo\",\n    \"provider\": \"openai\",\n    \"description\": \"Fast and efficient model for everyday tasks\",\n    \"capabilities\": {\n      \"vision\": false,\n      \"functionCalling\": true,\n      \"jsonMode\": true,\n      \"tools\": true,\n      \"streaming\": true\n    },\n    \"pricing\": {\n      \"inputTokens\": 0.5,\n      \"outputTokens\": 1.5\n    },\n    \"contextWindow\": 16385,\n    \"maxCompletionTokens\": 4096,\n    \"deprecated\": false,\n    \"modality\": \"text\",\n    \"tier\": \"budget\",\n    \"tags\": [\"budget\", \"fast\", \"general\"],\n    \"rating\": 8.5,\n    \"releaseDate\": \"2023-03-01\"\n  },\n  {\n    \"id\": \"anthropic/claude-3-opus\",\n    \"name\": \"Claude 3 Opus\",\n    \"provider\": \"anthropic\",\n    \"description\": \"Most capable Claude model for complex tasks\",\n    \"capabilities\": {\n      \"vision\": true,\n      \"functionCalling\": true,\n      \"jsonMode\": true,\n      \"tools\": true,\n      \"streaming\": true\n    },\n    \"pricing\": {\n      \"inputTokens\": 15.0,\n      \"outputTokens\": 75.0\n    },\n    \"contextWindow\": 200000,\n    \"maxCompletionTokens\": 4096,\n    \"deprecated\": false,\n    \"modality\": \"multimodal\",\n    \"tags\": [\"premium\", \"vision\"]\n  },\n  {\n    \"id\": \"google/gemini-flash-1.5\",\n    \"name\": \"Gemini 1.5 Flash\",\n    \"provider\": \"google\",\n    \"description\": \"Fast and cost-effective multimodal model\",\n    \"capabilities\": {\n      \"vision\": true,\n      \"functionCalling\": true,\n      \"jsonMode\": true,\n      \"tools\": true,\n      \"streaming\": true\n    },\n    \"pricing\": {\n      \"inputTokens\": 0.075,\n      \"outputTokens\": 0.3\n    },\n    \"contextWindow\": 1000000,\n    \"maxCompletionTokens\": 8192,\n    \"deprecated\": false,\n    \"modality\": \"multimodal\",\n    \"tags\": [\"budget\", \"vision\", \"long-context\"]\n  },\n  {\n    \"id\": \"google/gemini-pro-1.5\",\n    \"name\": \"Gemini 1.5 Pro\",\n    \"provider\": \"google\",\n    \"description\": \"Powerful multimodal model with 1M token context\",\n    \"capabilities\": {\n      \"vision\": true,\n      \"functionCalling\": true,\n      \"jsonMode\": true,\n      \"tools\": true,\n      \"streaming\": true\n    },\n    \"pricing\": {\n      \"inputTokens\": 1.25,\n      \"outputTokens\": 5.0\n    },\n    \"contextWindow\": 1000000,\n    \"maxCompletionTokens\": 8192,\n    \"deprecated\": false,\n    \"modality\": \"multimodal\",\n    \"tags\": [\"balanced\", \"vision\", \"long-context\"]\n  },\n  {\n    \"id\": \"meta-llama/llama-3.1-405b-instruct\",\n    \"name\": \"Llama 3.1 405B Instruct\",\n    \"provider\": \"meta\",\n    \"description\": \"Most powerful open-source model\",\n    \"capabilities\": {\n      \"vision\": false,\n      \"functionCalling\": true,\n      \"jsonMode\": true,\n      \"tools\": true,\n      \"streaming\": true,\n      \"codeGeneration\": true\n    },\n    \"pricing\": {\n      \"inputTokens\": 3.0,\n      \"outputTokens\": 3.0\n    },\n    \"contextWindow\": 128000,\n    \"maxCompletionTokens\": 4096,\n    \"deprecated\": false,\n    \"modality\": \"text\",\n    \"tags\": [\"balanced\", \"open-source\", \"coding\"]\n  },\n  {\n    \"id\": \"meta-llama/llama-3.1-70b-instruct\",\n    \"name\": \"Llama 3.1 70B Instruct\",\n    \"provider\": \"meta\",\n    \"description\": \"Powerful open-source model, good quality/cost ratio\",\n    \"capabilities\": {\n      \"vision\": false,\n      \"functionCalling\": true,\n      \"jsonMode\": true,\n      \"tools\": true,\n      \"streaming\": true,\n      \"codeGeneration\": true\n    },\n    \"pricing\": {\n      \"inputTokens\": 0.52,\n      \"outputTokens\": 0.75\n    },\n    \"contextWindow\": 128000,\n    \"maxCompletionTokens\": 4096,\n    \"deprecated\": false,\n    \"modality\": \"text\",\n    \"tags\": [\"budget\", \"open-source\", \"coding\"]\n  },\n  {\n    \"id\": \"mistralai/mistral-large\",\n    \"name\": \"Mistral Large\",\n    \"provider\": \"mistral\",\n    \"description\": \"Flagship Mistral model with strong performance\",\n    \"capabilities\": {\n      \"vision\": false,\n      \"functionCalling\": true,\n      \"jsonMode\": true,\n      \"tools\": true,\n      \"streaming\": true\n    },\n    \"pricing\": {\n      \"inputTokens\": 4.0,\n      \"outputTokens\": 12.0\n    },\n    \"contextWindow\": 128000,\n    \"maxCompletionTokens\": 4096,\n    \"deprecated\": false,\n    \"modality\": \"text\",\n    \"tier\": \"balanced\",\n    \"tags\": [\"balanced\", \"multilingual\"],\n    \"rating\": 8.7,\n    \"releaseDate\": \"2024-02-26\"\n  },\n  {\n    \"id\": \"deepseek/deepseek-chat\",\n    \"name\": \"DeepSeek Chat\",\n    \"provider\": \"deepseek\",\n    \"description\": \"FREE - High-quality open model with excellent coding capabilities\",\n    \"capabilities\": {\n      \"vision\": false,\n      \"functionCalling\": true,\n      \"jsonMode\": true,\n      \"tools\": true,\n      \"streaming\": true,\n      \"codeGeneration\": true\n    },\n    \"pricing\": {\n      \"inputTokens\": 0.0,\n      \"outputTokens\": 0.0\n    },\n    \"contextWindow\": 64000,\n    \"maxCompletionTokens\": 4096,\n    \"deprecated\": false,\n    \"modality\": \"text\",\n    \"tier\": \"free\",\n    \"tags\": [\"free\", \"coding\", \"open-source\", \"recommended\"],\n    \"rating\": 8.8,\n    \"releaseDate\": \"2024-01-15\"\n  },\n  {\n    \"id\": \"mistralai/mistral-7b-instruct\",\n    \"name\": \"Mistral 7B Instruct\",\n    \"provider\": \"mistral\",\n    \"description\": \"FREE - Efficient small model for simple tasks\",\n    \"capabilities\": {\n      \"vision\": false,\n      \"functionCalling\": true,\n      \"jsonMode\": true,\n      \"tools\": true,\n      \"streaming\": true\n    },\n    \"pricing\": {\n      \"inputTokens\": 0.0,\n      \"outputTokens\": 0.0\n    },\n    \"contextWindow\": 32768,\n    \"maxCompletionTokens\": 4096,\n    \"deprecated\": false,\n    \"modality\": \"text\",\n    \"tier\": \"free\",\n    \"tags\": [\"free\", \"fast\", \"open-source\"],\n    \"rating\": 8.0,\n    \"releaseDate\": \"2023-09-27\"\n  },\n  {\n    \"id\": \"mistralai/mistral-7b-instruct\",\n    \"name\": \"Mistral 7B Instruct\",\n    \"provider\": \"mistral\",\n    \"description\": \"FREE - Efficient small model for simple tasks\",\n    \"capabilities\": {\n      \"vision\": false,\n      \"functionCalling\": false,\n      \"jsonMode\": true,\n      \"tools\": false,\n      \"streaming\": true\n    },\n    \"pricing\": {\n      \"inputTokens\": 0.0,\n      \"outputTokens\": 0.0\n    },\n    \"contextWindow\": 32768,\n    \"maxCompletionTokens\": 4096,\n    \"deprecated\": false,\n    \"modality\": \"text\",\n    \"tier\": \"free\",\n    \"tags\": [\"free\", \"fast\", \"lightweight\"],\n    \"rating\": 8.0,\n    \"releaseDate\": \"2023-09-27\"\n  },\n  {\n    \"id\": \"meta-llama/llama-3.1-8b-instruct:free\",\n    \"name\": \"Llama 3.1 8B Instruct (Free)\",\n    \"provider\": \"meta\",\n    \"description\": \"FREE - Fast and efficient model for basic tasks\",\n    \"capabilities\": {\n      \"vision\": false,\n      \"functionCalling\": true,\n      \"jsonMode\": true,\n      \"tools\": true,\n      \"streaming\": true\n    },\n    \"pricing\": {\n      \"inputTokens\": 0.0,\n      \"outputTokens\": 0.0\n    },\n    \"contextWindow\": 128000,\n    \"maxCompletionTokens\": 4096,\n    \"deprecated\": false,\n    \"modality\": \"text\",\n    \"tier\": \"free\",\n    \"tags\": [\"free\", \"fast\", \"open-source\"],\n    \"rating\": 8.2,\n    \"releaseDate\": \"2024-07-23\"\n  }\n]\n","import { Model, ModelFilter } from '../types/models';\nimport modelsData from '../../data/models.json';\n\nexport class ModelCatalog {\n  private models: Map<string, Model> = new Map();\n  private lastSync?: Date;\n\n  constructor() {\n    this.loadEmbeddedModels();\n  }\n\n  /**\n   * Load embedded model catalog from JSON\n   */\n  private loadEmbeddedModels(): void {\n    for (const modelData of modelsData) {\n      const model: Model = {\n        ...modelData,\n        releaseDate: undefined,\n      } as Model;\n\n      this.models.set(model.id, model);\n    }\n\n    this.lastSync = new Date();\n  }\n\n  /**\n   * Get a specific model by ID\n   */\n  getModel(id: string): Model | null {\n    return this.models.get(id) || null;\n  }\n\n  /**\n   * Get all models\n   */\n  getAllModels(): Model[] {\n    return Array.from(this.models.values());\n  }\n\n  /**\n   * Get models by provider\n   */\n  getModelsByProvider(provider: string): Model[] {\n    return this.getAllModels().filter((m) => m.provider.toLowerCase() === provider.toLowerCase());\n  }\n\n  /**\n   * Filter models by criteria\n   */\n  filterModels(filter: ModelFilter): Model[] {\n    let results = this.getAllModels();\n\n    // Filter by deprecated\n    if (filter.excludeDeprecated !== false) {\n      results = results.filter((m) => !m.deprecated);\n    }\n\n    // Filter by providers\n    if (filter.providers && filter.providers.length > 0) {\n      results = results.filter((m) =>\n        filter.providers!.some((p) => p.toLowerCase() === m.provider.toLowerCase()),\n      );\n    }\n\n    // Filter by capabilities\n    if (filter.capabilities) {\n      results = results.filter((m) => {\n        for (const [key, value] of Object.entries(filter.capabilities!)) {\n          // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n          if (value !== undefined && m.capabilities[key as keyof typeof m.capabilities] !== value) {\n            return false;\n          }\n        }\n        return true;\n      });\n    }\n\n    // Filter by max cost\n    if (filter.maxCost !== undefined) {\n      results = results.filter(\n        (m) =>\n          m.pricing.inputTokens <= filter.maxCost! && m.pricing.outputTokens <= filter.maxCost!,\n      );\n    }\n\n    // Filter by context window\n    if (filter.minContextWindow !== undefined) {\n      results = results.filter((m) => m.contextWindow >= filter.minContextWindow!);\n    }\n\n    // Filter by modality\n    if (filter.modality) {\n      results = results.filter((m) => m.modality === filter.modality);\n    }\n\n    // Filter by tags\n    if (filter.tags && filter.tags.length > 0) {\n      results = results.filter((m) => m.tags && filter.tags!.some((tag) => m.tags!.includes(tag)));\n    }\n\n    return results;\n  }\n\n  /**\n   * Get models with specific capability\n   */\n  getModelsByCapability(capability: keyof Model['capabilities']): Model[] {\n    return this.getAllModels().filter((m) => m.capabilities[capability]);\n  }\n\n  /**\n   * Get cheapest models (sorted by total cost)\n   */\n  getCheapestModels(limit = 10): Model[] {\n    const sorted = this.getAllModels()\n      .filter((m) => !m.deprecated)\n      .sort((a, b) => {\n        const costA = a.pricing.inputTokens + a.pricing.outputTokens;\n        const costB = b.pricing.inputTokens + b.pricing.outputTokens;\n        return costA - costB;\n      });\n\n    return sorted.slice(0, limit);\n  }\n\n  /**\n   * Get all free models\n   */\n  getFreeModels(): Model[] {\n    return this.getAllModels().filter(\n      (m) => !m.deprecated && m.pricing.inputTokens === 0 && m.pricing.outputTokens === 0,\n    );\n  }\n\n  /**\n   * Search models by name or description\n   */\n\n  /**\n   * Search models by name or description\n   */\n  searchModels(query: string): Model[] {\n    const lowerQuery = query.toLowerCase();\n    return this.getAllModels().filter(\n      (m) =>\n        m.name.toLowerCase().includes(lowerQuery) ||\n        m.id.toLowerCase().includes(lowerQuery) ||\n        m.description?.toLowerCase().includes(lowerQuery),\n    );\n  }\n\n  /**\n   * Get total number of models\n   */\n  count(): number {\n    return this.models.size;\n  }\n\n  /**\n   * Check if model exists\n   */\n  hasModel(id: string): boolean {\n    return this.models.has(id);\n  }\n\n  /**\n   * Get last sync time\n   */\n  getLastSync(): Date | undefined {\n    return this.lastSync;\n  }\n\n  /**\n   * Add or update a model (for testing or dynamic updates)\n   */\n  addModel(model: Model): void {\n    this.models.set(model.id, model);\n  }\n\n  /**\n   * Remove a model\n   */\n  removeModel(id: string): boolean {\n    return this.models.delete(id);\n  }\n\n  /**\n   * Clear all models\n   */\n  clear(): void {\n    this.models.clear();\n  }\n}\n\n// Singleton instance\nlet catalogInstance: ModelCatalog | null = null;\n\nexport function getModelCatalog(): ModelCatalog {\n  if (!catalogInstance) {\n    catalogInstance = new ModelCatalog();\n  }\n  return catalogInstance;\n}\n","import { IRouter, SelectionCriteria, SelectionResult } from '../../types/routing';\nimport { ModelCatalog } from '../ModelCatalog';\nimport { Logger } from '../../utils/logger';\nimport { Model } from '../../types/models';\n\nexport class CostOptimizer implements IRouter {\n  constructor(\n    private catalog: ModelCatalog,\n    private logger: Logger,\n  ) {}\n\n  getName(): string {\n    return 'cost';\n  }\n\n  async route(query: string, criteria: SelectionCriteria): Promise<SelectionResult> {\n    await Promise.resolve(); // Keep async for consistent interface\n    this.logger.debug('CostOptimizer: Finding cheapest model (prioritizing free)', { criteria });\n\n    // First, try to get free models\n    let candidates = this.catalog.getFreeModels();\n\n    // If no free models or criteria specified, get filtered models\n    if (candidates.length === 0 || Object.keys(criteria).length > 0) {\n      candidates = this.catalog.filterModels(criteria);\n    }\n\n    if (candidates.length === 0) {\n      throw new Error('No models match the specified criteria');\n    }\n\n    // Sort by total cost (input + output) - free models naturally come first\n    const sorted = candidates.sort((a, b) => {\n      const aCost = a.pricing.inputTokens + a.pricing.outputTokens;\n      const bCost = b.pricing.inputTokens + b.pricing.outputTokens;\n      return aCost - bCost;\n    });\n\n    const selected = sorted[0];\n    const isFree = selected.pricing.inputTokens === 0 && selected.pricing.outputTokens === 0;\n\n    const alternatives = sorted.slice(1, 4).map((m, idx) => {\n      const mIsFree = m.pricing.inputTokens === 0 && m.pricing.outputTokens === 0;\n      return {\n        modelId: m.id,\n        score: this.calculateCostScore(m),\n        reason: mIsFree\n          ? `Alternative ${idx + 1}: FREE`\n          : `Alternative ${idx + 1}: ${this.formatCost(m)}`,\n      };\n    });\n\n    const expectedCost = (selected.pricing.inputTokens + selected.pricing.outputTokens) / 2;\n\n    return {\n      modelId: selected.id,\n      model: selected,\n      provider: selected.provider,\n      expectedCost,\n      reason: isFree\n        ? `FREE model: ${selected.name}`\n        : `Cheapest option: ${this.formatCost(selected)}`,\n      alternatives,\n      confidence: 0.95,\n    };\n  }\n\n  private calculateCostScore(model: Model): number {\n    // Lower cost = higher score\n    const totalCost = model.pricing.inputTokens + model.pricing.outputTokens;\n    return 1 / (totalCost + 1);\n  }\n\n  private formatCost(model: Model): string {\n    const input = model.pricing.inputTokens.toFixed(2);\n    const output = model.pricing.outputTokens.toFixed(2);\n    return `$${input}/$${output} per 1M tokens`;\n  }\n}\n","import { IRouter, SelectionCriteria, SelectionResult } from '../../types/routing';\nimport { ModelCatalog } from '../ModelCatalog';\nimport { Logger } from '../../utils/logger';\nimport { Model } from '../../types/models';\n\nexport class PerformanceRouter implements IRouter {\n  private performanceMetrics: Map<string, number> = new Map();\n\n  constructor(\n    private catalog: ModelCatalog,\n    private logger: Logger,\n  ) {\n    this.initializeMetrics();\n  }\n\n  getName(): string {\n    return 'performance';\n  }\n\n  async route(query: string, criteria: SelectionCriteria): Promise<SelectionResult> {\n    await Promise.resolve(); // Keep async for consistent interface\n    this.logger.debug('PerformanceRouter: Finding fastest model', { criteria });\n\n    const candidates = this.catalog.filterModels(criteria);\n\n    if (candidates.length === 0) {\n      throw new Error('No models match the specified criteria');\n    }\n\n    // Sort by performance score\n    const sorted = candidates.sort((a, b) => {\n      const aScore = this.getPerformanceScore(a);\n      const bScore = this.getPerformanceScore(b);\n      return bScore - aScore; // Higher is better\n    });\n\n    const selected = sorted[0];\n    const alternatives = sorted.slice(1, 4).map((m, idx) => ({\n      modelId: m.id,\n      score: this.getPerformanceScore(m),\n      reason: `Alternative ${idx + 1}: estimated ${this.getLatency(m)}ms latency`,\n    }));\n\n    const expectedCost = (selected.pricing.inputTokens + selected.pricing.outputTokens) / 2;\n\n    return {\n      modelId: selected.id,\n      model: selected,\n      provider: selected.provider,\n      expectedCost,\n      estimatedLatency: this.getLatency(selected),\n      reason: `Fastest option: estimated ${this.getLatency(selected)}ms latency`,\n      alternatives,\n      confidence: 0.85,\n    };\n  }\n\n  private initializeMetrics(): void {\n    // Simulated performance metrics (in production, these would come from monitoring)\n    this.performanceMetrics.set('google/gemini-flash-1.5', 500);\n    this.performanceMetrics.set('google/gemini-pro-1.5', 800);\n    this.performanceMetrics.set('anthropic/claude-3.5-sonnet', 1000);\n    this.performanceMetrics.set('openai/gpt-4-turbo', 1200);\n    this.performanceMetrics.set('anthropic/claude-3-opus', 1500);\n    this.performanceMetrics.set('meta-llama/llama-3.1-70b-instruct', 900);\n    this.performanceMetrics.set('meta-llama/llama-3.1-405b-instruct', 1400);\n  }\n\n  private getPerformanceScore(model: Model): number {\n    const latency = this.getLatency(model);\n    // Lower latency = higher score\n    return 10000 / latency;\n  }\n\n  private getLatency(model: Model): number {\n    return this.performanceMetrics.get(model.id) || 1000;\n  }\n\n  /**\n   * Update performance metrics (for production use)\n   */\n  updateMetrics(modelId: string, latency: number): void {\n    this.performanceMetrics.set(modelId, latency);\n  }\n}\n","import { IRouter, SelectionCriteria, SelectionResult } from '../../types/routing';\nimport { ModelCatalog } from '../ModelCatalog';\nimport { Logger } from '../../utils/logger';\nimport { Model } from '../../types/models';\n\nexport interface BalancedWeights {\n  cost: number;\n  performance: number;\n  capability: number;\n  reliability: number;\n}\n\nexport class BalancedRouter implements IRouter {\n  private weights: BalancedWeights = {\n    cost: 0.4,\n    performance: 0.3,\n    capability: 0.2,\n    reliability: 0.1,\n  };\n\n  private performanceMetrics: Map<string, number> = new Map();\n\n  constructor(\n    private catalog: ModelCatalog,\n    private logger: Logger,\n    weights?: Partial<BalancedWeights>,\n  ) {\n    if (weights) {\n      this.weights = { ...this.weights, ...weights };\n    }\n    this.initializeMetrics();\n  }\n\n  getName(): string {\n    return 'balanced';\n  }\n\n  async route(query: string, criteria: SelectionCriteria): Promise<SelectionResult> {\n    await Promise.resolve(); // Keep async for consistent interface\n    this.logger.debug('BalancedRouter: Finding balanced model', {\n      criteria,\n      weights: this.weights,\n    });\n\n    let candidates = this.catalog.filterModels(criteria);\n\n    // Boost free models by including them if available\n    const freeModels = this.catalog.getFreeModels();\n    if (freeModels.length > 0 && Object.keys(criteria).length === 0) {\n      // Merge free models with candidates, avoiding duplicates\n      const candidateIds = new Set(candidates.map((c) => c.id));\n      const newFreeModels = freeModels.filter((fm) => !candidateIds.has(fm.id));\n      candidates = [...candidates, ...newFreeModels];\n    }\n\n    if (candidates.length === 0) {\n      throw new Error('No models match the specified criteria');\n    }\n\n    // Score each model (free models get a significant boost)\n    const scored = candidates.map((model) => {\n      const isFree = model.pricing.inputTokens === 0 && model.pricing.outputTokens === 0;\n      const baseScore = this.calculateBalancedScore(model);\n      // Give free models a 20 point bonus to make them competitive\n      const finalScore = isFree ? baseScore + 20 : baseScore;\n\n      return {\n        model,\n        score: finalScore,\n        isFree,\n      };\n    });\n\n    // Sort by score (higher is better)\n    scored.sort((a, b) => b.score - a.score);\n\n    const selected = scored[0];\n    const alternatives = scored.slice(1, 4).map((s, idx) => ({\n      modelId: s.model.id,\n      score: s.score,\n      reason: s.isFree\n        ? `Alternative ${idx + 1}: FREE (Score ${s.score.toFixed(2)})`\n        : `Alternative ${idx + 1}: Score ${s.score.toFixed(2)}`,\n    }));\n\n    const expectedCost =\n      (selected.model.pricing.inputTokens + selected.model.pricing.outputTokens) / 2;\n\n    const reasonPrefix = selected.isFree ? 'Best FREE balanced model' : 'Best balanced option';\n    return {\n      modelId: selected.model.id,\n      model: selected.model,\n      provider: selected.model.provider,\n      expectedCost,\n      reason: `${reasonPrefix}: score ${selected.score.toFixed(2)} (cost + performance + capability)`,\n      alternatives,\n      confidence: 0.88,\n    };\n  }\n\n  private calculateBalancedScore(model: Model): number {\n    const costScore = this.calculateCostScore(model);\n    const perfScore = this.calculatePerformanceScore(model);\n    const capScore = this.calculateCapabilityScore(model);\n    const relScore = this.calculateReliabilityScore(model);\n\n    const totalScore =\n      costScore * this.weights.cost +\n      perfScore * this.weights.performance +\n      capScore * this.weights.capability +\n      relScore * this.weights.reliability;\n\n    return totalScore;\n  }\n\n  private calculateCostScore(model: Model): number {\n    const totalCost = model.pricing.inputTokens + model.pricing.outputTokens;\n    // Normalize: cheaper is better, max cost ~100, min ~0.1\n    const normalized = Math.max(0, 1 - totalCost / 100);\n    return normalized * 100;\n  }\n\n  private calculatePerformanceScore(model: Model): number {\n    const latency = this.getLatency(model);\n    // Normalize: faster is better, max latency ~2000ms\n    const normalized = Math.max(0, 1 - latency / 2000);\n    return normalized * 100;\n  }\n\n  private calculateCapabilityScore(model: Model): number {\n    let score = 0;\n    const caps = model.capabilities;\n\n    if (caps.vision) score += 20;\n    if (caps.functionCalling) score += 20;\n    if (caps.tools) score += 15;\n    if (caps.jsonMode) score += 15;\n    if (caps.streaming) score += 10;\n    if (caps.codeGeneration) score += 20;\n\n    // Context window bonus\n    if (model.contextWindow >= 100000) score += 10;\n    else if (model.contextWindow >= 32000) score += 5;\n\n    return Math.min(score, 100);\n  }\n\n  private calculateReliabilityScore(model: Model): number {\n    // Favor well-known providers and non-deprecated models\n    let score = 50;\n\n    if (!model.deprecated) score += 30;\n\n    // Provider reliability (subjective, can be updated with real metrics)\n    const providerScores: Record<string, number> = {\n      anthropic: 20,\n      openai: 20,\n      google: 15,\n      meta: 10,\n      mistral: 15,\n    };\n\n    score += providerScores[model.provider] || 5;\n\n    return Math.min(score, 100);\n  }\n\n  private initializeMetrics(): void {\n    // Simulated latency metrics\n    this.performanceMetrics.set('google/gemini-flash-1.5', 500);\n    this.performanceMetrics.set('google/gemini-pro-1.5', 800);\n    this.performanceMetrics.set('anthropic/claude-3.5-sonnet', 1000);\n    this.performanceMetrics.set('openai/gpt-4-turbo', 1200);\n    this.performanceMetrics.set('anthropic/claude-3-opus', 1500);\n    this.performanceMetrics.set('meta-llama/llama-3.1-70b-instruct', 900);\n    this.performanceMetrics.set('meta-llama/llama-3.1-405b-instruct', 1400);\n    this.performanceMetrics.set('mistralai/mistral-large', 1000);\n  }\n\n  private getLatency(model: Model): number {\n    return this.performanceMetrics.get(model.id) || 1000;\n  }\n\n  /**\n   * Update weights for custom balancing\n   */\n  setWeights(weights: Partial<BalancedWeights>): void {\n    this.weights = { ...this.weights, ...weights };\n\n    // Normalize weights to sum to 1\n    const total = Object.values(this.weights).reduce((a, b) => a + b, 0);\n    this.weights = {\n      cost: this.weights.cost / total,\n      performance: this.weights.performance / total,\n      capability: this.weights.capability / total,\n      reliability: this.weights.reliability / total,\n    };\n  }\n}\n","import { IRouter, SelectionCriteria, SelectionResult } from '../../types/routing';\nimport { ModelCatalog } from '../ModelCatalog';\nimport { Logger } from '../../utils/logger';\nimport { Model, ModelCapabilities } from '../../types/models';\n\nexport class CapabilityRouter implements IRouter {\n  constructor(\n    private catalog: ModelCatalog,\n    private logger: Logger,\n  ) {}\n\n  getName(): string {\n    return 'capability';\n  }\n\n  async route(query: string, criteria: SelectionCriteria): Promise<SelectionResult> {\n    await Promise.resolve(); // Keep async for consistent interface\n    this.logger.debug('CapabilityRouter: Finding best model for capabilities', { criteria });\n\n    // Detect required capabilities from query\n    const detectedCaps = this.detectCapabilities(query);\n\n    // Merge detected capabilities with criteria\n    const requiredCapabilities = {\n      ...detectedCaps,\n      ...(criteria.capabilities || {}),\n    };\n\n    this.logger.debug('Required capabilities', { requiredCapabilities });\n\n    // Filter models by capabilities\n    const candidates = this.catalog.filterModels({\n      ...criteria,\n      capabilities: requiredCapabilities,\n    });\n\n    if (candidates.length === 0) {\n      throw new Error('No models match the required capabilities');\n    }\n\n    // Score models by capability match\n    const scored = candidates.map((model) => ({\n      model,\n      score: this.calculateCapabilityScore(model, requiredCapabilities),\n    }));\n\n    // Sort by score\n    scored.sort((a, b) => b.score - a.score);\n\n    const selected = scored[0];\n    const alternatives = scored.slice(1, 4).map((item, idx) => ({\n      modelId: item.model.id,\n      score: item.score,\n      reason: `Alternative ${idx + 1}: ${this.formatCapabilities(item.model)}`,\n    }));\n\n    const expectedCost =\n      (selected.model.pricing.inputTokens + selected.model.pricing.outputTokens) / 2;\n\n    return {\n      modelId: selected.model.id,\n      model: selected.model,\n      provider: selected.model.provider,\n      expectedCost,\n      reason: `Best capability match: ${this.formatCapabilities(selected.model)}`,\n      alternatives,\n      confidence: 0.85,\n    };\n  }\n\n  private detectCapabilities(query: string): Partial<ModelCapabilities> {\n    const lowerQuery = query.toLowerCase();\n    const capabilities: Partial<ModelCapabilities> = {};\n\n    // Detect vision needs\n    if (\n      lowerQuery.includes('image') ||\n      lowerQuery.includes('picture') ||\n      lowerQuery.includes('photo') ||\n      lowerQuery.includes('visual') ||\n      lowerQuery.includes('see')\n    ) {\n      capabilities.vision = true;\n    }\n\n    // Detect function calling needs\n    if (\n      lowerQuery.includes('function') ||\n      lowerQuery.includes('tool') ||\n      lowerQuery.includes('api') ||\n      lowerQuery.includes('call')\n    ) {\n      capabilities.functionCalling = true;\n      capabilities.tools = true;\n    }\n\n    // Detect JSON mode needs\n    if (\n      lowerQuery.includes('json') ||\n      lowerQuery.includes('structured') ||\n      lowerQuery.includes('format')\n    ) {\n      capabilities.jsonMode = true;\n    }\n\n    // Detect code generation needs\n    if (\n      lowerQuery.includes('code') ||\n      lowerQuery.includes('program') ||\n      lowerQuery.includes('script') ||\n      lowerQuery.includes('implement')\n    ) {\n      capabilities.codeGeneration = true;\n    }\n\n    return capabilities;\n  }\n\n  private calculateCapabilityScore(model: Model, required: Partial<ModelCapabilities>): number {\n    let score = 0;\n    let totalRequired = 0;\n\n    // Check each required capability\n    for (const [key, value] of Object.entries(required)) {\n      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n      if (value !== undefined) {\n        totalRequired++;\n        const capKey = key as keyof ModelCapabilities;\n\n        if (model.capabilities[capKey] === value) {\n          score += 20; // Base score for matching\n        }\n      }\n    }\n\n    // Bonus for additional capabilities\n    const additionalCaps = Object.values(model.capabilities).filter(Boolean).length;\n    score += additionalCaps * 2;\n\n    // Bonus for larger context window (useful for complex tasks)\n    if (model.contextWindow >= 100000) score += 10;\n    else if (model.contextWindow >= 32000) score += 5;\n\n    // Normalize by number of required capabilities\n    if (totalRequired > 0) {\n      score = score / totalRequired;\n    }\n\n    return score;\n  }\n\n  private formatCapabilities(model: Model): string {\n    const caps: string[] = [];\n\n    if (model.capabilities.vision) caps.push('vision');\n    if (model.capabilities.functionCalling) caps.push('functions');\n    if (model.capabilities.tools) caps.push('tools');\n    if (model.capabilities.jsonMode) caps.push('JSON');\n    if (model.capabilities.codeGeneration) caps.push('coding');\n\n    return caps.join(', ') || 'basic';\n  }\n}\n","import { SelectionCriteria, SelectionResult, IRouter } from '../types/routing';\nimport { ModelCatalog } from './ModelCatalog';\nimport { CostOptimizer } from './routers/CostOptimizer';\nimport { PerformanceRouter } from './routers/PerformanceRouter';\nimport { BalancedRouter } from './routers/BalancedRouter';\nimport { CapabilityRouter } from './routers/CapabilityRouter';\nimport { ModelSelectionError } from '../utils/errors';\nimport { Logger } from '../utils/logger';\n\nexport class ModelSelector {\n  private catalog: ModelCatalog;\n  private routers: Map<string, IRouter>;\n  private logger: Logger;\n\n  constructor(catalog?: ModelCatalog, logger?: Logger) {\n    this.catalog = catalog || new ModelCatalog();\n    this.logger = logger || new Logger({ enabled: false });\n\n    // Initialize routers\n    this.routers = new Map<string, IRouter>();\n    this.routers.set('cost', new CostOptimizer(this.catalog, this.logger));\n    this.routers.set('performance', new PerformanceRouter(this.catalog, this.logger));\n    this.routers.set('balanced', new BalancedRouter(this.catalog, this.logger));\n    this.routers.set('capability', new CapabilityRouter(this.catalog, this.logger));\n  }\n\n  /**\n   * Select a model based on criteria\n   */\n  async selectModel(query: string, criteria: SelectionCriteria = {}): Promise<SelectionResult> {\n    this.logger.debug('Selecting model', { criteria });\n\n    const strategy = criteria.strategy || 'balanced';\n    const router = this.routers.get(strategy);\n\n    if (!router) {\n      throw new ModelSelectionError(`Unknown routing strategy: ${strategy}`);\n    }\n\n    try {\n      const result = await router.route(query, criteria);\n\n      this.logger.info('Model selected', {\n        modelId: result.modelId,\n        strategy,\n        reason: result.reason,\n      });\n\n      return result;\n    } catch (error) {\n      this.logger.error('Model selection failed', error as Error);\n      throw new ModelSelectionError(`Failed to select model: ${(error as Error).message}`, {\n        query,\n        criteria,\n        strategy,\n      });\n    }\n  }\n\n  /**\n   * Select model by explicit ID\n   */\n  async selectById(modelId: string): Promise<SelectionResult> {\n    await Promise.resolve(); // Keep async for consistent interface\n    const model = this.catalog.getModel(modelId);\n\n    if (!model) {\n      throw new ModelSelectionError(`Model not found: ${modelId}`);\n    }\n\n    return {\n      modelId: model.id,\n      model,\n      provider: model.provider,\n      expectedCost: (model.pricing.inputTokens + model.pricing.outputTokens) / 2,\n      reason: 'Explicitly specified model ID',\n      alternatives: [],\n      confidence: 1.0,\n    };\n  }\n\n  /**\n   * Get fallback models\n   */\n  async getFallbacks(primaryModel: string, criteria: SelectionCriteria = {}): Promise<string[]> {\n    await Promise.resolve(); // Keep async for consistent interface\n    // If fallbacks are explicitly specified, use those\n    if (criteria.fallbackModels && criteria.fallbackModels.length > 0) {\n      return criteria.fallbackModels.filter((id) => this.catalog.hasModel(id));\n    }\n\n    // Get the primary model\n    const primary = this.catalog.getModel(primaryModel);\n    if (!primary) {\n      return [];\n    }\n\n    // Find similar models from the same provider first\n    const sameProviderModels = this.catalog\n      .getModelsByProvider(primary.provider)\n      .filter((m) => m.id !== primaryModel && !m.deprecated)\n      .slice(0, 2);\n\n    // Then find models with similar capabilities from other providers\n    const otherModels = this.catalog\n      .filterModels({\n        ...criteria,\n        capabilities: primary.capabilities,\n        excludeDeprecated: true,\n      })\n      .filter((m) => m.id !== primaryModel && m.provider !== primary.provider)\n      .slice(0, 2);\n\n    return [...sameProviderModels.map((m) => m.id), ...otherModels.map((m) => m.id)].slice(\n      0,\n      criteria.maxFallbacks || 3,\n    );\n  }\n\n  /**\n   * Register a custom router\n   */\n  registerRouter(name: string, router: IRouter): void {\n    this.routers.set(name, router);\n    this.logger.info(`Custom router registered: ${name}`);\n  }\n\n  /**\n   * Get available strategies\n   */\n  getAvailableStrategies(): string[] {\n    return Array.from(this.routers.keys());\n  }\n}\n","/**\n * Simple token counter using approximate heuristics\n * For more accurate counting, consider using tiktoken library\n */\n\nconst CHARS_PER_TOKEN = 4; // OpenAI's rule of thumb\nconst AVG_TOKENS_PER_MESSAGE = 4; // Message formatting overhead\n\nexport interface TokenEstimate {\n  tokens: number;\n  characters: number;\n  method: 'approximate' | 'exact';\n}\n\nexport class TokenCounter {\n  /**\n   * Estimate tokens for a string\n   */\n  static estimateTokens(text: string): TokenEstimate {\n    const characters = text.length;\n    const tokens = Math.ceil(characters / CHARS_PER_TOKEN);\n\n    return {\n      tokens,\n      characters,\n      method: 'approximate',\n    };\n  }\n\n  /**\n   * Estimate tokens for chat messages\n   */\n  static estimateMessageTokens(messages: Array<{ role: string; content: string }>): TokenEstimate {\n    let totalTokens = 0;\n    let totalCharacters = 0;\n\n    for (const message of messages) {\n      const contentTokens = this.estimateTokens(message.content);\n      totalTokens += contentTokens.tokens + AVG_TOKENS_PER_MESSAGE;\n      totalCharacters += contentTokens.characters;\n    }\n\n    return {\n      tokens: totalTokens,\n      characters: totalCharacters,\n      method: 'approximate',\n    };\n  }\n\n  /**\n   * Estimate completion cost\n   */\n  static estimateCost(\n    inputTokens: number,\n    outputTokens: number,\n    inputPrice: number, // per 1M tokens\n    outputPrice: number, // per 1M tokens\n  ): number {\n    const inputCost = (inputTokens / 1_000_000) * inputPrice;\n    const outputCost = (outputTokens / 1_000_000) * outputPrice;\n    return inputCost + outputCost;\n  }\n\n  /**\n   * Check if text exceeds token limit\n   */\n  static exceedsLimit(text: string, limit: number): boolean {\n    const estimate = this.estimateTokens(text);\n    return estimate.tokens > limit;\n  }\n\n  /**\n   * Truncate text to fit within token limit\n   */\n  static truncateToLimit(text: string, limit: number): string {\n    const estimate = this.estimateTokens(text);\n\n    if (estimate.tokens <= limit) {\n      return text;\n    }\n\n    const ratio = limit / estimate.tokens;\n    const maxChars = Math.floor(text.length * ratio * 0.95); // 5% buffer\n    return text.substring(0, maxChars);\n  }\n}\n","import { CostEstimate, TokenUsage, CostComparison } from '../types/pricing';\nimport { ModelCatalog } from '../models/ModelCatalog';\nimport { TokenCounter } from '../utils/tokenCounter';\n\nexport class PricingCalculator {\n  constructor(private catalog: ModelCatalog) {}\n\n  /**\n   * Estimate cost for a specific model\n   */\n  estimateCost(\n    modelId: string,\n    tokens: TokenUsage | { input: number; output: number },\n  ): CostEstimate {\n    const model = this.catalog.getModel(modelId);\n\n    if (!model) {\n      throw new Error(`Model not found: ${modelId}`);\n    }\n\n    const tokenUsage: TokenUsage =\n      'totalTokens' in tokens\n        ? tokens\n        : {\n            promptTokens: tokens.input,\n            completionTokens: tokens.output,\n            totalTokens: tokens.input + tokens.output,\n          };\n\n    const inputCost = (tokenUsage.promptTokens / 1_000_000) * model.pricing.inputTokens;\n    const outputCost = (tokenUsage.completionTokens / 1_000_000) * model.pricing.outputTokens;\n    const totalCost = inputCost + outputCost;\n\n    return {\n      inputCost,\n      outputCost,\n      totalCost,\n      currency: model.pricing.currency || 'USD',\n      tokenUsage,\n      modelId,\n    };\n  }\n\n  /**\n   * Estimate cost from text (approximation)\n   */\n  estimateFromText(\n    modelId: string,\n    inputText: string,\n    estimatedOutputTokens: number,\n  ): CostEstimate {\n    const inputEstimate = TokenCounter.estimateTokens(inputText);\n\n    return this.estimateCost(modelId, {\n      input: inputEstimate.tokens,\n      output: estimatedOutputTokens,\n    });\n  }\n\n  /**\n   * Compare costs across multiple models\n   */\n  compareModels(\n    modelIds: string[],\n    tokens: TokenUsage | { input: number; output: number },\n  ): CostComparison {\n    const estimates = new Map<string, CostEstimate>();\n    let cheapestId = '';\n    let cheapestCost = Infinity;\n    let mostExpensiveId = '';\n    let mostExpensiveCost = -Infinity;\n    let totalCost = 0;\n\n    for (const modelId of modelIds) {\n      try {\n        const estimate = this.estimateCost(modelId, tokens);\n        estimates.set(modelId, estimate);\n\n        totalCost += estimate.totalCost;\n\n        if (estimate.totalCost < cheapestCost) {\n          cheapestCost = estimate.totalCost;\n          cheapestId = modelId;\n        }\n\n        if (estimate.totalCost > mostExpensiveCost) {\n          mostExpensiveCost = estimate.totalCost;\n          mostExpensiveId = modelId;\n        }\n      } catch {\n        // Skip models that don't exist\n        continue;\n      }\n    }\n\n    const averageCost = estimates.size > 0 ? totalCost / estimates.size : 0;\n\n    // Add savings calculation to each estimate\n    estimates.forEach((estimate) => {\n      estimate.savingsVsDefault = cheapestCost - estimate.totalCost;\n      estimate.percentileCost =\n        estimates.size > 0\n          ? (Array.from(estimates.values()).filter((e) => e.totalCost <= estimate.totalCost)\n              .length /\n              estimates.size) *\n            100\n          : 0;\n    });\n\n    return {\n      models: estimates,\n      cheapest: {\n        modelId: cheapestId,\n        cost: cheapestCost,\n      },\n      mostExpensive: {\n        modelId: mostExpensiveId,\n        cost: mostExpensiveCost,\n      },\n      averageCost,\n    };\n  }\n\n  /**\n   * Get cheapest model for a task\n   */\n  getCheapestModel(\n    modelIds: string[],\n    tokens: TokenUsage | { input: number; output: number },\n  ): {\n    modelId: string;\n    estimate: CostEstimate;\n  } {\n    const comparison = this.compareModels(modelIds, tokens);\n    const estimate = comparison.models.get(comparison.cheapest.modelId);\n\n    if (!estimate) {\n      throw new Error('No valid models found');\n    }\n\n    return {\n      modelId: comparison.cheapest.modelId,\n      estimate,\n    };\n  }\n\n  /**\n   * Calculate potential savings\n   */\n  calculateSavings(\n    currentModelId: string,\n    alternativeModelId: string,\n    tokens: TokenUsage | { input: number; output: number },\n  ): {\n    savings: number;\n    savingsPercentage: number;\n    currentCost: number;\n    alternativeCost: number;\n  } {\n    const currentCost = this.estimateCost(currentModelId, tokens).totalCost;\n    const alternativeCost = this.estimateCost(alternativeModelId, tokens).totalCost;\n    const savings = currentCost - alternativeCost;\n    const savingsPercentage = currentCost > 0 ? (savings / currentCost) * 100 : 0;\n\n    return {\n      savings,\n      savingsPercentage,\n      currentCost,\n      alternativeCost,\n    };\n  }\n}\n","import { UsageRecord, CostSummary } from '../types/pricing';\nimport { EventEmitter } from 'eventemitter3';\n\ninterface CostTrackerEvents {\n  'usage:recorded': (record: UsageRecord) => void;\n  'threshold:exceeded': (\n    period: 'daily' | 'monthly' | 'total',\n    current: number,\n    limit: number,\n  ) => void;\n}\n\nexport class CostTracker extends EventEmitter<CostTrackerEvents> {\n  private usageHistory: UsageRecord[] = [];\n  private totalCost: number = 0;\n  private costByModel: Map<string, number> = new Map();\n  private costByProvider: Map<string, number> = new Map();\n\n  constructor(private retentionDays: number = 30) {\n    super();\n    this.startCleanupInterval();\n  }\n\n  /**\n   * Record a usage event\n   */\n  recordUsage(record: UsageRecord): void {\n    this.usageHistory.push(record);\n\n    // Update totals\n    this.totalCost += record.cost.totalCost;\n\n    // Update by model\n    const modelCost = this.costByModel.get(record.modelId) || 0;\n    this.costByModel.set(record.modelId, modelCost + record.cost.totalCost);\n\n    // Update by provider\n    const providerCost = this.costByProvider.get(record.provider) || 0;\n    this.costByProvider.set(record.provider, providerCost + record.cost.totalCost);\n\n    this.emit('usage:recorded', record);\n  }\n\n  /**\n   * Get usage summary for a time period\n   */\n  getSummary(startDate?: Date, endDate?: Date): CostSummary {\n    const end = endDate || new Date();\n    const start = startDate || new Date(end.getTime() - 30 * 24 * 60 * 60 * 1000); // 30 days ago\n\n    const records = this.usageHistory.filter((r) => r.timestamp >= start && r.timestamp <= end);\n\n    const totalCost = records.reduce(\n      (sum, r) => sum + (isNaN(r.cost.totalCost) ? 0 : r.cost.totalCost),\n      0,\n    );\n    const totalTokens = records.reduce(\n      (sum, r) => sum + (isNaN(r.tokenUsage.totalTokens) ? 0 : r.tokenUsage.totalTokens),\n      0,\n    );\n    const totalRequests = records.length;\n    const averageCostPerRequest = totalRequests > 0 ? totalCost / totalRequests : 0;\n\n    const costByModel = new Map<string, number>();\n    const costByProvider = new Map<string, number>();\n\n    for (const record of records) {\n      costByModel.set(\n        record.modelId,\n        (costByModel.get(record.modelId) || 0) + record.cost.totalCost,\n      );\n\n      costByProvider.set(\n        record.provider,\n        (costByProvider.get(record.provider) || 0) + record.cost.totalCost,\n      );\n    }\n\n    return {\n      totalCost,\n      totalRequests,\n      totalTokens,\n      averageCostPerRequest,\n      costByModel,\n      costByProvider,\n      period: { start, end },\n    };\n  }\n\n  /**\n   * Get daily costs\n   */\n  getDailyCost(date?: Date): number {\n    const targetDate = date || new Date();\n    const start = new Date(targetDate.getFullYear(), targetDate.getMonth(), targetDate.getDate());\n    const end = new Date(start.getTime() + 24 * 60 * 60 * 1000);\n\n    return this.usageHistory\n      .filter((r) => r.timestamp >= start && r.timestamp < end)\n      .reduce((sum, r) => sum + r.cost.totalCost, 0);\n  }\n\n  /**\n   * Get monthly costs\n   */\n  getMonthlyCost(year?: number, month?: number): number {\n    const now = new Date();\n    const targetYear = year ?? now.getFullYear();\n    const targetMonth = month ?? now.getMonth();\n\n    const start = new Date(targetYear, targetMonth, 1);\n    const end = new Date(targetYear, targetMonth + 1, 1);\n\n    return this.usageHistory\n      .filter((r) => r.timestamp >= start && r.timestamp < end)\n      .reduce((sum, r) => sum + r.cost.totalCost, 0);\n  }\n\n  /**\n   * Get total cost\n   */\n  getTotalCost(): number {\n    return this.totalCost;\n  }\n\n  /**\n   * Get usage by model\n   */\n  getUsageByModel(): Map<string, CostSummary> {\n    const modelSummaries = new Map<string, CostSummary>();\n\n    for (const modelId of this.costByModel.keys()) {\n      const records = this.usageHistory.filter((r) => r.modelId === modelId);\n      const totalCost = records.reduce((sum, r) => sum + r.cost.totalCost, 0);\n      const totalTokens = records.reduce((sum, r) => sum + r.tokenUsage.totalTokens, 0);\n      const totalRequests = records.length;\n\n      modelSummaries.set(modelId, {\n        totalCost,\n        totalRequests,\n        totalTokens,\n        averageCostPerRequest: totalRequests > 0 ? totalCost / totalRequests : 0,\n        costByModel: new Map([[modelId, totalCost]]),\n        costByProvider: new Map(),\n        period: {\n          start: records[0]?.timestamp,\n          end: records[records.length - 1]?.timestamp,\n        },\n      });\n    }\n\n    return modelSummaries;\n  }\n\n  /**\n   * Get usage by provider\n   */\n  getUsageByProvider(): Map<string, CostSummary> {\n    const providerSummaries = new Map<string, CostSummary>();\n\n    for (const provider of this.costByProvider.keys()) {\n      const records = this.usageHistory.filter((r) => r.provider === provider);\n      const totalCost = records.reduce((sum, r) => sum + r.cost.totalCost, 0);\n      const totalTokens = records.reduce((sum, r) => sum + r.tokenUsage.totalTokens, 0);\n      const totalRequests = records.length;\n\n      providerSummaries.set(provider, {\n        totalCost,\n        totalRequests,\n        totalTokens,\n        averageCostPerRequest: totalRequests > 0 ? totalCost / totalRequests : 0,\n        costByModel: new Map(),\n        costByProvider: new Map([[provider, totalCost]]),\n        period: {\n          start: records[0]?.timestamp,\n          end: records[records.length - 1]?.timestamp,\n        },\n      });\n    }\n\n    return providerSummaries;\n  }\n\n  /**\n   * Clear old records\n   */\n  private cleanup(): void {\n    const cutoffDate = new Date(Date.now() - this.retentionDays * 24 * 60 * 60 * 1000);\n    this.usageHistory = this.usageHistory.filter((r) => r.timestamp >= cutoffDate);\n  }\n\n  private startCleanupInterval(): void {\n    setInterval(() => this.cleanup(), 24 * 60 * 60 * 1000); // Daily cleanup\n  }\n\n  /**\n   * Export usage data\n   */\n  exportData(): UsageRecord[] {\n    return [...this.usageHistory];\n  }\n\n  /**\n   * Reset all tracking data\n   */\n  reset(): void {\n    this.usageHistory = [];\n    this.totalCost = 0;\n    this.costByModel.clear();\n    this.costByProvider.clear();\n  }\n}\n","import { z } from 'zod';\n\nexport const ModelCapabilitiesSchema = z.object({\n  vision: z.boolean().default(false),\n  functionCalling: z.boolean().default(false),\n  jsonMode: z.boolean().default(false),\n  tools: z.boolean().default(false),\n  streaming: z.boolean().default(true),\n  codeGeneration: z.boolean().optional(),\n  multilingual: z.boolean().optional(),\n});\n\nexport const ModelPricingSchema = z.object({\n  inputTokens: z.number().min(0),\n  outputTokens: z.number().min(0),\n  imageInput: z.number().optional(),\n  currency: z.string().default('USD'),\n});\n\nexport const OpenRouterConfigSchema = z.object({\n  apiKey: z.string().min(1, 'API key is required'),\n  baseURL: z.string().url().default('https://openrouter.ai/api/v1'),\n  appName: z.string().optional(),\n  httpReferer: z.string().url().optional(),\n  defaultModel: z.string().optional(),\n\n  timeout: z.number().min(1000).default(30000),\n  maxRetries: z.number().min(0).max(10).default(3),\n  retryDelay: z.number().min(100).default(1000),\n\n  modelSelection: z\n    .object({\n      strategy: z\n        .enum(['cost', 'performance', 'balanced', 'capability', 'custom'])\n        .default('balanced'),\n      fallbackEnabled: z.boolean().default(true),\n      maxFallbacks: z.number().min(0).max(5).default(3),\n      autoSelect: z.boolean().default(true),\n    })\n    .optional(),\n\n  budgets: z\n    .object({\n      daily: z.number().min(0).optional(),\n      monthly: z.number().min(0).optional(),\n      total: z.number().min(0).optional(),\n      alertThreshold: z.number().min(0).max(1).default(0.8),\n    })\n    .optional(),\n\n  cache: z\n    .object({\n      enabled: z.boolean().default(true),\n      ttl: z.number().min(0).default(600000), // 10 minutes\n      maxSize: z.number().min(0).default(1000),\n    })\n    .optional(),\n\n  logging: z\n    .object({\n      enabled: z.boolean().default(true),\n      level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n    })\n    .optional(),\n});\n\nexport const SendOptionsSchema = z.object({\n  model: z.string().optional(),\n  temperature: z.number().min(0).max(2).optional(),\n  maxTokens: z.number().min(1).optional(),\n  topP: z.number().min(0).max(1).optional(),\n  stream: z.boolean().optional(),\n  functions: z.array(z.any()).optional(),\n  tools: z.array(z.any()).optional(),\n  responseFormat: z.object({ type: z.enum(['text', 'json_object']) }).optional(),\n  metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const SelectionCriteriaSchema = z.object({\n  providers: z.array(z.string()).optional(),\n  capabilities: ModelCapabilitiesSchema.partial().optional(),\n  maxCost: z.number().min(0).optional(),\n  minContextWindow: z.number().min(0).optional(),\n  modality: z.enum(['text', 'multimodal']).optional(),\n  excludeDeprecated: z.boolean().default(true),\n  tags: z.array(z.string()).optional(),\n  tier: z.enum(['budget', 'balanced', 'premium']).optional(),\n  fallbackModels: z.array(z.string()).optional(),\n  preferredProviders: z.array(z.string()).optional(),\n  excludeProviders: z.array(z.string()).optional(),\n  strategy: z.enum(['cost', 'performance', 'balanced', 'capability', 'custom']).optional(),\n});\n\nexport type ValidatedConfig = z.infer<typeof OpenRouterConfigSchema>;\nexport type ValidatedSendOptions = z.infer<typeof SendOptionsSchema>;\nexport type ValidatedSelectionCriteria = z.infer<typeof SelectionCriteriaSchema>;\n","import { z } from 'zod';\nimport {\n  OpenRouterConfigSchema,\n  SendOptionsSchema,\n  SelectionCriteriaSchema,\n} from '../config/schema';\nimport { InvalidRequestError } from './errors';\n\nexport class Validator {\n  static validateConfig(config: unknown) {\n    try {\n      return OpenRouterConfigSchema.parse(config);\n    } catch (error) {\n      if (error instanceof z.ZodError) {\n        const messages = error.issues\n          .map((e: z.ZodIssue) => `${e.path.join('.')}: ${e.message}`)\n          .join(', ');\n        throw new InvalidRequestError(`Invalid configuration: ${messages}`, {\n          errors: error.issues,\n        });\n      }\n      throw error;\n    }\n  }\n\n  static validateSendOptions(options: unknown) {\n    try {\n      return SendOptionsSchema.parse(options);\n    } catch (error) {\n      if (error instanceof z.ZodError) {\n        const messages = error.issues\n          .map((e: z.ZodIssue) => `${e.path.join('.')}: ${e.message}`)\n          .join(', ');\n        throw new InvalidRequestError(`Invalid send options: ${messages}`, {\n          errors: error.issues,\n        });\n      }\n      throw error;\n    }\n  }\n\n  static validateSelectionCriteria(criteria: unknown) {\n    try {\n      return SelectionCriteriaSchema.parse(criteria);\n    } catch (error) {\n      if (error instanceof z.ZodError) {\n        const messages = error.issues\n          .map((e: z.ZodIssue) => `${e.path.join('.')}: ${e.message}`)\n          .join(', ');\n        throw new InvalidRequestError(`Invalid selection criteria: ${messages}`, {\n          errors: error.issues,\n        });\n      }\n      throw error;\n    }\n  }\n\n  static validateApiKey(apiKey: string): void {\n    if (!apiKey || typeof apiKey !== 'string') {\n      throw new InvalidRequestError('API key must be a non-empty string');\n    }\n\n    if (apiKey.length < 10) {\n      throw new InvalidRequestError('API key appears to be invalid (too short)');\n    }\n  }\n\n  static validateMessages(messages: any[]): void {\n    if (!Array.isArray(messages) || messages.length === 0) {\n      throw new InvalidRequestError('Messages must be a non-empty array');\n    }\n\n    for (const message of messages) {\n      if (!message.role || !message.content) {\n        throw new InvalidRequestError('Each message must have a role and content');\n      }\n\n      if (!['system', 'user', 'assistant', 'function', 'tool'].includes(message.role)) {\n        throw new InvalidRequestError(`Invalid message role: ${message.role}`);\n      }\n    }\n  }\n}\n","import { EventEmitter } from 'eventemitter3';\nimport { OpenRouterConfig } from '../types/config';\nimport { SendOptions, ClientEvents } from '../types/client';\nimport { ChatMessage, ChatCompletionResponse, StreamChunk } from '../types/api';\nimport { TokenUsage } from '../types/pricing';\nimport { HttpClient } from '../http/HttpClient';\nimport { RetryPolicy } from '../http/RetryPolicy';\nimport { CircuitBreaker } from '../http/CircuitBreaker';\nimport { OpenRouterAPI } from '../api/OpenRouterAPI';\nimport { ModelSelector } from '../models/ModelSelector';\nimport { ModelCatalog } from '../models/ModelCatalog';\nimport { PricingCalculator } from '../pricing/PricingCalculator';\nimport { CostTracker } from '../pricing/CostTracker';\nimport { TokenCounter } from '../utils/tokenCounter';\nimport { Logger } from '../utils/logger';\nimport { Validator } from '../utils/validation';\nimport { DEFAULT_CONFIG, RETRY_STATUS_CODES } from '../config/defaults';\nimport { BudgetExceededError } from '../utils/errors';\n\nexport class OpenRouterClient extends EventEmitter<ClientEvents> {\n  private httpClient: HttpClient;\n  private retryPolicy: RetryPolicy;\n  private circuitBreaker: CircuitBreaker;\n  private api: OpenRouterAPI;\n  private modelSelector: ModelSelector;\n  private catalog: ModelCatalog;\n  private pricingCalculator: PricingCalculator;\n  private costTracker: CostTracker;\n  private logger: Logger;\n  private config: OpenRouterConfig;\n\n  constructor(config: OpenRouterConfig) {\n    super();\n\n    // Validate configuration\n    Validator.validateApiKey(config.apiKey);\n    this.config = { ...DEFAULT_CONFIG, ...config };\n\n    // Initialize logger\n    this.logger = new Logger({\n      enabled: this.config.logging?.enabled ?? true,\n      level: this.config.logging?.level ?? 'info',\n    });\n\n    // Initialize HTTP layer\n    this.httpClient = new HttpClient(this.config, this.logger);\n\n    this.retryPolicy = new RetryPolicy(\n      {\n        maxAttempts: this.config.maxRetries ?? 3,\n        baseDelay: this.config.retryDelay ?? 1000,\n        maxDelay: 30000,\n        exponential: true,\n        retryableStatusCodes: RETRY_STATUS_CODES,\n      },\n      this.logger,\n    );\n\n    this.circuitBreaker = new CircuitBreaker(\n      {\n        failureThreshold: 5,\n        resetTimeout: 60000,\n        monitorInterval: 5000,\n      },\n      this.logger,\n    );\n\n    // Initialize API\n    this.api = new OpenRouterAPI(this.httpClient, this.logger);\n\n    // Initialize model management\n    this.catalog = new ModelCatalog();\n    this.modelSelector = new ModelSelector(this.catalog, this.logger);\n\n    // Initialize pricing\n    this.pricingCalculator = new PricingCalculator(this.catalog);\n    this.costTracker = new CostTracker();\n\n    this.setupEventListeners();\n  }\n\n  /**\n   * Send a message to OpenRouter\n   */\n  async sendMessage(\n    message: string | ChatMessage[],\n    options: SendOptions = {},\n  ): Promise<ChatCompletionResponse> {\n    const messages = this.normalizeMessages(message);\n    Validator.validateMessages(messages);\n\n    // Select model\n    const modelId = await this.selectModel(options);\n\n    this.logger.info('Sending message', { model: modelId, messageCount: messages.length });\n\n    // Check budget\n    await this.checkBudget(modelId, messages);\n\n    // Build request\n    const request = this.buildRequest(modelId, messages, options);\n\n    // Send with retry and circuit breaker\n    const response = await this.executeWithResilience(async () => {\n      return await this.api.createChatCompletion(request);\n    });\n\n    // Track cost\n    this.trackCost(modelId, response, messages);\n\n    this.emit('message:received', response);\n    return response;\n  }\n\n  /**\n   * Stream a message response\n   */\n  async *streamMessage(\n    message: string | ChatMessage[],\n    options: SendOptions = {},\n  ): AsyncIterable<StreamChunk> {\n    const messages = this.normalizeMessages(message);\n    Validator.validateMessages(messages);\n\n    const modelId = await this.selectModel(options);\n\n    this.logger.info('Starting stream', { model: modelId, messageCount: messages.length });\n\n    await this.checkBudget(modelId, messages);\n\n    const request = this.buildRequest(modelId, messages, { ...options, stream: true });\n\n    this.emit('stream:start', request.model);\n\n    try {\n      for await (const chunk of this.api.createStreamingChatCompletion(request)) {\n        this.emit('stream:chunk', chunk);\n        yield chunk;\n      }\n\n      this.emit('stream:end', request.model);\n    } catch (error) {\n      this.emit('stream:error', error as Error);\n      throw error;\n    }\n  }\n\n  /**\n   * List available models\n   */\n  async listModels() {\n    return this.api.listModels();\n  }\n\n  /**\n   * Get model catalog\n   */\n  getModelCatalog(): ModelCatalog {\n    return this.catalog;\n  }\n\n  /**\n   * Get pricing calculator\n   */\n  getPricingCalculator(): PricingCalculator {\n    return this.pricingCalculator;\n  }\n\n  /**\n   * Get cost tracker\n   */\n  getCostTracker(): CostTracker {\n    return this.costTracker;\n  }\n\n  /**\n   * Get model selector\n   */\n  getModelSelector(): ModelSelector {\n    return this.modelSelector;\n  }\n\n  /**\n   * Destroy client and cleanup resources\n   */\n  destroy(): void {\n    this.httpClient.destroy();\n    this.circuitBreaker.destroy();\n    this.removeAllListeners();\n  }\n\n  // Private methods\n\n  private normalizeMessages(message: string | ChatMessage[]): ChatMessage[] {\n    if (typeof message === 'string') {\n      return [{ role: 'user', content: message }];\n    }\n    return message;\n  }\n\n  private async selectModel(options: SendOptions): Promise<string> {\n    // Explicit model specified\n    if (options.model) {\n      this.logger.debug('Using explicitly specified model', { model: options.model });\n      return options.model;\n    }\n\n    // Use default model if configured\n    if (this.config.defaultModel) {\n      this.logger.debug('Using default model', { model: this.config.defaultModel });\n      return this.config.defaultModel;\n    }\n\n    // Auto-select based on criteria\n    if (this.config.modelSelection?.autoSelect) {\n      const query = options.modelSelection ? JSON.stringify(options.modelSelection) : '';\n      const result = await this.modelSelector.selectModel(query, {\n        strategy: this.config.modelSelection.strategy,\n        ...options.modelSelection,\n      });\n\n      this.emit('model:selected', result.modelId, result.reason);\n      return result.modelId;\n    }\n\n    // Fallback to Claude 3.5 Sonnet\n    return 'anthropic/claude-3.5-sonnet';\n  }\n\n  private buildRequest(modelId: string, messages: ChatMessage[], options: SendOptions) {\n    return {\n      model: modelId,\n      messages,\n      temperature: options.temperature,\n      max_tokens: options.maxTokens,\n      top_p: options.topP,\n      stream: options.stream,\n      functions: options.functions,\n      tools: options.tools,\n      response_format: options.responseFormat,\n    };\n  }\n\n  private async checkBudget(modelId: string, messages: ChatMessage[]): Promise<void> {\n    await Promise.resolve(); // Keep async for future extensibility\n    if (!this.config.budgets) return;\n\n    const { daily, monthly, total, alertThreshold } = this.config.budgets;\n\n    // Estimate cost\n    const inputText = messages\n      .map((m) => (typeof m.content === 'string' ? m.content : JSON.stringify(m.content)))\n      .join(' ');\n\n    const estimate = this.pricingCalculator.estimateFromText(modelId, inputText, 500);\n\n    // Check budgets\n    if (daily) {\n      const currentDaily = this.costTracker.getDailyCost();\n      const projectedDaily = currentDaily + estimate.totalCost;\n\n      if (projectedDaily > daily) {\n        throw new BudgetExceededError(projectedDaily, daily, 'daily');\n      }\n\n      if (projectedDaily / daily >= (alertThreshold || 0.8)) {\n        this.emit('budget:warning', projectedDaily, daily);\n      }\n    }\n\n    if (monthly) {\n      const currentMonthly = this.costTracker.getMonthlyCost();\n      const projectedMonthly = currentMonthly + estimate.totalCost;\n\n      if (projectedMonthly > monthly) {\n        throw new BudgetExceededError(projectedMonthly, monthly, 'monthly');\n      }\n\n      if (projectedMonthly / monthly >= (alertThreshold || 0.8)) {\n        this.emit('budget:warning', projectedMonthly, monthly);\n      }\n    }\n\n    if (total) {\n      const currentTotal = this.costTracker.getTotalCost();\n      const projectedTotal = currentTotal + estimate.totalCost;\n\n      if (projectedTotal > total) {\n        throw new BudgetExceededError(projectedTotal, total, 'total');\n      }\n\n      if (projectedTotal / total >= (alertThreshold || 0.8)) {\n        this.emit('budget:warning', projectedTotal, total);\n      }\n    }\n  }\n\n  private trackCost(\n    modelId: string,\n    response: ChatCompletionResponse,\n    messages: ChatMessage[],\n  ): void {\n    const model = this.catalog.getModel(modelId);\n    if (!model) return;\n\n    let tokenUsage: TokenUsage;\n\n    if (response.usage) {\n      // Use actual usage from API\n      tokenUsage = response.usage;\n    } else {\n      // Estimate usage when not provided by API\n      const simpleMessages = messages.map((msg) => ({\n        role: msg.role,\n        content:\n          typeof msg.content === 'string'\n            ? msg.content\n            : Array.isArray(msg.content)\n              ? msg.content.map((c) => (c.type === 'text' ? c.text : '[image]')).join(' ')\n              : '',\n      }));\n      const inputEstimate = TokenCounter.estimateMessageTokens(simpleMessages);\n      const outputText = response.choices[0]?.message?.content;\n      const outputContent =\n        typeof outputText === 'string'\n          ? outputText\n          : Array.isArray(outputText)\n            ? outputText.map((c) => (c.type === 'text' ? c.text : '[image]')).join(' ')\n            : '';\n      const outputEstimate = TokenCounter.estimateTokens(outputContent);\n\n      tokenUsage = {\n        promptTokens: Math.max(0, inputEstimate.tokens || 0),\n        completionTokens: Math.max(0, outputEstimate.tokens || 0),\n        totalTokens: Math.max(0, (inputEstimate.tokens || 0) + (outputEstimate.tokens || 0)),\n      };\n    }\n\n    try {\n      const estimate = this.pricingCalculator.estimateCost(modelId, tokenUsage);\n\n      this.costTracker.recordUsage({\n        timestamp: new Date(),\n        modelId,\n        provider: model.provider,\n        tokenUsage,\n        cost: estimate,\n        requestId: response.id || 'unknown',\n        success: true,\n      });\n\n      this.emit('cost:tracked', estimate.totalCost, modelId);\n    } catch (error) {\n      this.logger.warn('Failed to track cost', {\n        error: error instanceof Error ? error.message : String(error),\n        modelId,\n      });\n    }\n  }\n\n  private async executeWithResilience<T>(operation: () => Promise<T>): Promise<T> {\n    return this.retryPolicy.execute(async () => {\n      return this.circuitBreaker.execute(operation);\n    });\n  }\n\n  private setupEventListeners(): void {\n    this.circuitBreaker.on('circuit:opened', (failures) => {\n      this.logger.warn('Circuit breaker opened', { failures });\n    });\n\n    this.circuitBreaker.on('circuit:closed', () => {\n      this.logger.info('Circuit breaker closed (recovered)');\n    });\n\n    this.costTracker.on('usage:recorded', (record) => {\n      this.logger.debug('Usage recorded', {\n        model: record.modelId,\n        cost: record.cost.totalCost,\n        tokens: record.tokenUsage.totalTokens,\n      });\n    });\n  }\n}\n","/**\n * Cascading Strategy\n * Tries multiple models in sequence until one succeeds\n */\n\nimport type { ChatCompletionRequest, ChatCompletionResponse } from '../../types/api';\nimport type { ModelCatalog } from '../ModelCatalog';\nimport type { Logger } from '../../utils/logger';\nimport { ModelNotFoundError } from '../../utils/errors';\n\nexport interface CascadingOptions {\n  models: string[]; // Ordered list of models to try\n  maxAttempts?: number; // Maximum number of models to try\n  retryableErrors?: string[]; // Error types that trigger fallback\n  onFallback?: (modelId: string, error: Error) => void;\n}\n\nexport class CascadingStrategy {\n  private catalog: ModelCatalog;\n  private logger: Logger;\n  private options: Required<CascadingOptions>;\n\n  constructor(catalog: ModelCatalog, logger: Logger, options: CascadingOptions) {\n    this.catalog = catalog;\n    this.logger = logger;\n    this.options = {\n      models: options.models,\n      maxAttempts: options.maxAttempts || options.models.length,\n      retryableErrors: options.retryableErrors || [\n        'rate_limit',\n        'timeout',\n        'service_unavailable',\n        'model_unavailable',\n      ],\n      onFallback: options.onFallback || (() => {}),\n    };\n  }\n\n  /**\n   * Execute request with cascading fallback\n   */\n  async execute(\n    request: ChatCompletionRequest,\n    executor: (modelId: string, request: ChatCompletionRequest) => Promise<ChatCompletionResponse>,\n  ): Promise<ChatCompletionResponse> {\n    const attemptedModels: string[] = [];\n    let lastError: Error | null = null;\n\n    // Try each model in sequence\n    for (let i = 0; i < this.options.maxAttempts && i < this.options.models.length; i++) {\n      const modelId = this.options.models[i];\n      attemptedModels.push(modelId);\n\n      try {\n        // Verify model exists\n        const model = this.catalog.getModel(modelId);\n        if (!model) {\n          throw new ModelNotFoundError(`Model ${modelId} not found in catalog`);\n        }\n\n        this.logger.info('Attempting model', { modelId, attempt: i + 1 });\n\n        // Execute request with this model\n        const response = await executor(modelId, {\n          ...request,\n          model: modelId,\n        });\n\n        this.logger.info('Model succeeded', { modelId });\n        return response;\n      } catch (error) {\n        lastError = error instanceof Error ? error : new Error(String(error));\n\n        this.logger.warn('Model failed', {\n          modelId,\n          error: lastError.message,\n          attempt: i + 1,\n        });\n\n        // Check if error is retryable\n        if (!this.isRetryableError(lastError)) {\n          throw lastError;\n        }\n\n        // Call fallback callback\n        this.options.onFallback(modelId, lastError);\n\n        // Continue to next model\n        continue;\n      }\n    }\n\n    // All models failed\n    throw new Error(\n      `All models failed in cascade: ${attemptedModels.join(', ')}. Last error: ${lastError?.message || 'Unknown'}`,\n    );\n  }\n\n  /**\n   * Check if error should trigger fallback\n   */\n  private isRetryableError(error: Error): boolean {\n    const errorMessage = error.message.toLowerCase();\n\n    return this.options.retryableErrors.some((errorType) =>\n      errorMessage.includes(errorType.toLowerCase()),\n    );\n  }\n\n  /**\n   * Get cascade configuration\n   */\n  getConfiguration(): CascadingOptions {\n    return {\n      models: this.options.models,\n      maxAttempts: this.options.maxAttempts,\n      retryableErrors: this.options.retryableErrors,\n    };\n  }\n\n  /**\n   * Update models list\n   */\n  setModels(models: string[]): void {\n    this.options.models = models;\n    this.logger.info('Updated cascade models', { models });\n  }\n\n  /**\n   * Add a model to the cascade\n   */\n  addModel(modelId: string, position?: number): void {\n    if (position !== undefined && position >= 0 && position < this.options.models.length) {\n      this.options.models.splice(position, 0, modelId);\n    } else {\n      this.options.models.push(modelId);\n    }\n\n    this.logger.info('Added model to cascade', { modelId, position });\n  }\n\n  /**\n   * Remove a model from the cascade\n   */\n  removeModel(modelId: string): boolean {\n    const index = this.options.models.indexOf(modelId);\n\n    if (index !== -1) {\n      this.options.models.splice(index, 1);\n      this.logger.info('Removed model from cascade', { modelId });\n      return true;\n    }\n\n    return false;\n  }\n}\n","/**\n * Weighted Strategy\n * Selects models based on custom weighted scoring\n */\n\nimport type { SelectionCriteria, SelectionResult } from '../../types/routing';\nimport type { Model } from '../../types/models';\nimport type { ModelCatalog } from '../ModelCatalog';\nimport type { Logger } from '../../utils/logger';\n\nexport interface WeightConfig {\n  cost: number; // Weight for cost (0-1)\n  performance: number; // Weight for performance/speed (0-1)\n  capability: number; // Weight for capabilities (0-1)\n  reliability: number; // Weight for reliability/rating (0-1)\n}\n\nexport interface WeightedStrategyOptions {\n  weights?: Partial<WeightConfig>;\n  normalize?: boolean; // Auto-normalize weights to sum to 1\n}\n\nexport class WeightedStrategy {\n  private catalog: ModelCatalog;\n  private logger: Logger;\n  private weights: WeightConfig;\n\n  constructor(catalog: ModelCatalog, logger: Logger, options: WeightedStrategyOptions = {}) {\n    this.catalog = catalog;\n    this.logger = logger;\n\n    // Default weights\n    const defaultWeights: WeightConfig = {\n      cost: 0.4,\n      performance: 0.3,\n      capability: 0.2,\n      reliability: 0.1,\n    };\n\n    this.weights = {\n      ...defaultWeights,\n      ...options.weights,\n    };\n\n    // Normalize weights if requested\n    if (options.normalize !== false) {\n      this.normalizeWeights();\n    }\n  }\n\n  /**\n   * Select model using weighted scoring\n   */\n  select(query: string, criteria: SelectionCriteria): SelectionResult {\n    // Get candidate models\n    const candidates = this.catalog.filterModels(criteria);\n\n    if (candidates.length === 0) {\n      throw new Error('No models match the selection criteria');\n    }\n\n    // Score each model\n    const scored = candidates.map((model) => ({\n      model,\n      score: this.calculateScore(model, criteria),\n    }));\n\n    // Sort by score (descending)\n    scored.sort((a, b) => b.score - a.score);\n\n    const best = scored[0];\n\n    this.logger.info('Selected model using weighted strategy', {\n      modelId: best.model.id,\n      score: best.score,\n      weights: this.weights,\n    });\n\n    return {\n      modelId: best.model.id,\n      model: best.model,\n      provider: best.model.provider,\n      expectedCost: this.estimateCost(best.model, query),\n      estimatedLatency: this.estimateLatency(best.model),\n      reason: `Weighted selection (score: ${best.score.toFixed(3)})`,\n      alternatives: scored.slice(1, 4).map((s) => ({\n        modelId: s.model.id,\n        score: s.score,\n        reason: `Score: ${s.score.toFixed(3)}`,\n      })),\n      confidence: this.calculateConfidence(scored),\n    };\n  }\n\n  /**\n   * Calculate weighted score for a model\n   */\n  private calculateScore(model: Model, criteria: SelectionCriteria): number {\n    let score = 0;\n\n    // Cost score (lower is better)\n    const costScore = this.calculateCostScore(model);\n    score += costScore * this.weights.cost;\n\n    // Performance score (faster is better)\n    const performanceScore = this.calculatePerformanceScore(model);\n    score += performanceScore * this.weights.performance;\n\n    // Capability score (more capabilities is better)\n    const capabilityScore = this.calculateCapabilityScore(model, criteria);\n    score += capabilityScore * this.weights.capability;\n\n    // Reliability score (higher rating is better)\n    const reliabilityScore = this.calculateReliabilityScore(model);\n    score += reliabilityScore * this.weights.reliability;\n\n    return score;\n  }\n\n  /**\n   * Calculate cost score (normalized 0-1, lower cost = higher score)\n   */\n  private calculateCostScore(model: Model): number {\n    const avgCost = (model.pricing.inputTokens + model.pricing.outputTokens) / 2;\n\n    // Normalize using a reference cost (e.g., $10 per 1M tokens)\n    const referenceCost = 10;\n    const normalizedCost = Math.min(avgCost / referenceCost, 1);\n\n    // Invert so lower cost = higher score\n    return 1 - normalizedCost;\n  }\n\n  /**\n   * Calculate performance score (normalized 0-1)\n   */\n  private calculatePerformanceScore(model: Model): number {\n    // Simple heuristic based on model type\n    // In production, use actual latency metrics\n    const performanceMap: Record<string, number> = {\n      'gpt-4o-mini': 0.9,\n      'gpt-4o': 0.7,\n      'claude-3-haiku': 0.9,\n      'claude-3-sonnet': 0.7,\n      'claude-3-opus': 0.5,\n      'gemini-flash': 0.95,\n      'gemini-pro': 0.75,\n    };\n\n    return performanceMap[model.id] || 0.6; // Default medium performance\n  }\n\n  /**\n   * Calculate capability score based on requirements\n   */\n  private calculateCapabilityScore(model: Model, criteria: SelectionCriteria): number {\n    if (!criteria.capabilities) {\n      return 1; // No specific requirements\n    }\n\n    let matchedCapabilities = 0;\n    let totalCapabilities = 0;\n\n    const requiredCaps = criteria.capabilities as Record<string, boolean>;\n\n    for (const [capability, required] of Object.entries(requiredCaps)) {\n      if (required) {\n        totalCapabilities++;\n        if (model.capabilities[capability as keyof typeof model.capabilities]) {\n          matchedCapabilities++;\n        }\n      }\n    }\n\n    return totalCapabilities > 0 ? matchedCapabilities / totalCapabilities : 1;\n  }\n\n  /**\n   * Calculate reliability score (normalized 0-1)\n   */\n  private calculateReliabilityScore(model: Model): number {\n    // Use model rating if available, otherwise default\n    return model.rating ? model.rating / 5 : 0.8;\n  }\n\n  /**\n   * Estimate cost for a query\n   */\n  private estimateCost(model: Model, query: string): number {\n    // Rough estimation: ~1 token per 4 characters\n    const estimatedTokens = Math.ceil(query.length / 4);\n    const inputCost = (estimatedTokens / 1000000) * model.pricing.inputTokens;\n    const outputCost = (estimatedTokens / 1000000) * model.pricing.outputTokens; // Assume similar output\n\n    return inputCost + outputCost;\n  }\n\n  /**\n   * Estimate latency for a model\n   */\n  private estimateLatency(model: Model): number {\n    // Simple heuristic - in production, use actual metrics\n    const latencyMap: Record<string, number> = {\n      'gpt-4o-mini': 500,\n      'gpt-4o': 1200,\n      'claude-3-haiku': 600,\n      'claude-3-sonnet': 1000,\n      'claude-3-opus': 2000,\n      'gemini-flash': 400,\n      'gemini-pro': 800,\n    };\n\n    return latencyMap[model.id] || 1000;\n  }\n\n  /**\n   * Calculate confidence based on score distribution\n   */\n  private calculateConfidence(scored: Array<{ model: Model; score: number }>): number {\n    if (scored.length < 2) {\n      return 1;\n    }\n\n    // Confidence based on gap between best and second-best\n    const gap = scored[0].score - scored[1].score;\n    return Math.min(0.5 + gap, 1);\n  }\n\n  /**\n   * Normalize weights to sum to 1\n   */\n  private normalizeWeights(): void {\n    const sum =\n      this.weights.cost +\n      this.weights.performance +\n      this.weights.capability +\n      this.weights.reliability;\n\n    if (sum !== 1 && sum > 0) {\n      this.weights.cost /= sum;\n      this.weights.performance /= sum;\n      this.weights.capability /= sum;\n      this.weights.reliability /= sum;\n\n      this.logger.debug('Normalized weights', { weights: this.weights });\n    }\n  }\n\n  /**\n   * Update weights\n   */\n  setWeights(weights: Partial<WeightConfig>, normalize = true): void {\n    this.weights = {\n      ...this.weights,\n      ...weights,\n    };\n\n    if (normalize) {\n      this.normalizeWeights();\n    }\n\n    this.logger.info('Updated weights', { weights: this.weights });\n  }\n\n  /**\n   * Get current weights\n   */\n  getWeights(): WeightConfig {\n    return { ...this.weights };\n  }\n}\n","/**\n * Context-Aware Strategy\n * Selects models based on query context and requirements\n */\n\nimport type { SelectionCriteria, SelectionResult } from '../../types/routing';\nimport type { ModelCatalog } from '../ModelCatalog';\nimport type { Logger } from '../../utils/logger';\n\nexport interface ContextAnalysis {\n  hasCode: boolean;\n  hasImage: boolean;\n  hasJson: boolean;\n  requiresFunctions: boolean;\n  complexity: 'simple' | 'medium' | 'complex';\n  estimatedTokens: number;\n  language?: string;\n}\n\nexport class ContextAwareStrategy {\n  private catalog: ModelCatalog;\n  private logger: Logger;\n\n  constructor(catalog: ModelCatalog, logger: Logger) {\n    this.catalog = catalog;\n    this.logger = logger;\n  }\n\n  /**\n   * Select model based on query context\n   */\n  select(query: string, criteria: SelectionCriteria = {}): SelectionResult {\n    // Analyze query context\n    const context = this.analyzeContext(query);\n\n    this.logger.debug('Analyzed query context', { context });\n\n    // Build enhanced criteria based on context\n    const enhancedCriteria = this.enhanceCriteria(criteria, context);\n\n    // Get candidate models\n    const candidates = this.catalog.filterModels(enhancedCriteria);\n\n    if (candidates.length === 0) {\n      throw new Error('No models match the context-aware criteria');\n    }\n\n    // Score models based on context fit\n    const scored = candidates.map((model) => ({\n      model,\n      score: this.calculateContextScore(model, context),\n    }));\n\n    // Sort by score\n    scored.sort((a, b) => b.score - a.score);\n\n    const best = scored[0];\n\n    return {\n      modelId: best.model.id,\n      model: best.model,\n      provider: best.model.provider,\n      expectedCost: this.estimateCost(best.model, context),\n      estimatedLatency: this.estimateLatency(best.model, context),\n      reason: `Context-aware selection: ${this.explainSelection(context)}`,\n      alternatives: scored.slice(1, 4).map((s) => ({\n        modelId: s.model.id,\n        score: s.score,\n        reason: `Context score: ${s.score.toFixed(2)}`,\n      })),\n      confidence: best.score,\n    };\n  }\n\n  /**\n   * Analyze query context\n   */\n  private analyzeContext(query: string): ContextAnalysis {\n    const hasCode = this.detectCode(query);\n    const hasImage = this.detectImageRequest(query);\n    const hasJson = this.detectJsonRequest(query);\n    const requiresFunctions = this.detectFunctionNeed(query);\n    const complexity = this.assessComplexity(query);\n    const estimatedTokens = this.estimateTokens(query);\n    const language = this.detectLanguage(query);\n\n    return {\n      hasCode,\n      hasImage,\n      hasJson,\n      requiresFunctions,\n      complexity,\n      estimatedTokens,\n      language,\n    };\n  }\n\n  /**\n   * Enhance criteria based on context\n   */\n  private enhanceCriteria(\n    criteria: SelectionCriteria,\n    context: ContextAnalysis,\n  ): SelectionCriteria {\n    const enhanced = { ...criteria };\n\n    // Add capability requirements based on context\n    if (!enhanced.capabilities) {\n      enhanced.capabilities = {};\n    }\n\n    if (context.hasImage) {\n      enhanced.capabilities.vision = true;\n    }\n\n    if (context.hasJson) {\n      enhanced.capabilities.jsonMode = true;\n    }\n\n    if (context.requiresFunctions) {\n      enhanced.capabilities.functionCalling = true;\n    }\n\n    // Code capability would be handled by other capabilities\n    // (not a standard OpenRouter capability)\n\n    // Adjust tier based on complexity\n    if (!enhanced.tier) {\n      if (context.complexity === 'simple') {\n        enhanced.tier = 'budget';\n      } else if (context.complexity === 'complex') {\n        enhanced.tier = 'premium';\n      } else {\n        enhanced.tier = 'balanced';\n      }\n    }\n\n    return enhanced;\n  }\n\n  /**\n   * Calculate context-based score for model\n   */\n  private calculateContextScore(model: any, context: ContextAnalysis): number {\n    let score = 0.5; // Base score\n\n    // Capability matches\n    if (context.hasImage && model.capabilities.vision) {\n      score += 0.2;\n    }\n    if (context.hasJson && model.capabilities.jsonMode) {\n      score += 0.1;\n    }\n    if (context.requiresFunctions && model.capabilities.functionCalling) {\n      score += 0.1;\n    }\n    if (context.hasCode && model.capabilities.code) {\n      score += 0.1;\n    }\n\n    // Complexity match\n    if (context.complexity === 'simple' && model.pricing.inputTokens < 1.0) {\n      score += 0.1; // Prefer cheaper models for simple tasks\n    } else if (context.complexity === 'complex' && model.contextWindow >= 32000) {\n      score += 0.1; // Prefer larger context for complex tasks\n    }\n\n    // Token capacity match\n    if (context.estimatedTokens < model.contextWindow * 0.5) {\n      score += 0.05; // Good token headroom\n    }\n\n    return Math.min(score, 1);\n  }\n\n  /**\n   * Detect if query involves code\n   */\n  private detectCode(query: string): boolean {\n    const codePatterns = [\n      /```/,\n      /function\\s+\\w+/,\n      /class\\s+\\w+/,\n      /import\\s+/,\n      /const\\s+\\w+\\s*=/,\n      /def\\s+\\w+/,\n      /write.*code/i,\n      /implement/i,\n      /refactor/i,\n    ];\n\n    return codePatterns.some((pattern) => pattern.test(query));\n  }\n\n  /**\n   * Detect if query involves images\n   */\n  private detectImageRequest(query: string): boolean {\n    const imagePatterns = [/image/i, /picture/i, /photo/i, /visual/i, /screenshot/i, /diagram/i];\n\n    return imagePatterns.some((pattern) => pattern.test(query));\n  }\n\n  /**\n   * Detect if query needs JSON output\n   */\n  private detectJsonRequest(query: string): boolean {\n    const jsonPatterns = [/json/i, /structured.*data/i, /format.*as.*object/i, /return.*object/i];\n\n    return jsonPatterns.some((pattern) => pattern.test(query));\n  }\n\n  /**\n   * Detect if query needs function calling\n   */\n  private detectFunctionNeed(query: string): boolean {\n    const functionPatterns = [/call.*function/i, /use.*tool/i, /execute.*action/i, /api.*call/i];\n\n    return functionPatterns.some((pattern) => pattern.test(query));\n  }\n\n  /**\n   * Assess query complexity\n   */\n  private assessComplexity(query: string): 'simple' | 'medium' | 'complex' {\n    const words = query.split(/\\s+/).length;\n    const sentences = query.split(/[.!?]+/).length;\n    const hasMultipleTopics = /and|also|additionally|furthermore/i.test(query);\n    const hasConstraints = /must|should|require|need|ensure/i.test(query);\n\n    if (words < 20 && sentences <= 2 && !hasMultipleTopics) {\n      return 'simple';\n    }\n\n    if (words > 100 || sentences > 5 || (hasMultipleTopics && hasConstraints)) {\n      return 'complex';\n    }\n\n    return 'medium';\n  }\n\n  /**\n   * Estimate tokens in query\n   */\n  private estimateTokens(query: string): number {\n    // Rough estimate: ~1 token per 4 characters\n    return Math.ceil(query.length / 4);\n  }\n\n  /**\n   * Detect language from query\n   */\n  private detectLanguage(query: string): string | undefined {\n    const languagePatterns: Record<string, RegExp> = {\n      python: /python/i,\n      javascript: /javascript|typescript|js|ts/i,\n      java: /\\bjava\\b/i,\n      csharp: /c#|csharp/i,\n      go: /\\bgo\\b|golang/i,\n      rust: /rust/i,\n      ruby: /ruby/i,\n    };\n\n    for (const [lang, pattern] of Object.entries(languagePatterns)) {\n      if (pattern.test(query)) {\n        return lang;\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Estimate cost based on context\n   */\n  private estimateCost(model: any, context: ContextAnalysis): number {\n    const inputCost = (context.estimatedTokens / 1000000) * model.pricing.inputTokens;\n    const estimatedOutput =\n      context.complexity === 'complex' ? context.estimatedTokens * 2 : context.estimatedTokens;\n    const outputCost = (estimatedOutput / 1000000) * model.pricing.outputTokens;\n\n    return inputCost + outputCost;\n  }\n\n  /**\n   * Estimate latency based on context\n   */\n  private estimateLatency(model: any, context: ContextAnalysis): number {\n    const baseLatency = 1000; // Base 1 second\n    const complexityMultiplier =\n      context.complexity === 'simple' ? 0.5 : context.complexity === 'complex' ? 2 : 1;\n    const tokenMultiplier = Math.log10(context.estimatedTokens + 1) / 2;\n\n    return Math.round(baseLatency * complexityMultiplier * tokenMultiplier);\n  }\n\n  /**\n   * Explain selection reasoning\n   */\n  private explainSelection(context: ContextAnalysis): string {\n    const reasons: string[] = [];\n\n    if (context.hasCode) {\n      reasons.push('code generation');\n    }\n    if (context.hasImage) {\n      reasons.push('vision capability');\n    }\n    if (context.hasJson) {\n      reasons.push('structured output');\n    }\n    if (context.requiresFunctions) {\n      reasons.push('function calling');\n    }\n\n    reasons.push(`${context.complexity} complexity`);\n\n    return reasons.join(', ');\n  }\n}\n","/**\n * Budget Alerting System\n * Monitors spending and triggers alerts\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport type { Logger } from '../../utils/logger';\n\nexport interface AlertThreshold {\n  percentage: number; // Percentage of budget (e.g., 80 for 80%)\n  action: 'warn' | 'notify' | 'block';\n  message?: string;\n}\n\nexport interface AlertConfig {\n  daily?: AlertThreshold[];\n  monthly?: AlertThreshold[];\n  total?: AlertThreshold[];\n  email?: string;\n  webhook?: string;\n}\n\nexport interface AlertEvent {\n  type: 'daily' | 'monthly' | 'total';\n  threshold: number;\n  current: number;\n  limit: number;\n  percentage: number;\n  action: 'warn' | 'notify' | 'block';\n  timestamp: number;\n}\n\nexport class BudgetAlerting extends EventEmitter {\n  private config: AlertConfig;\n  private logger: Logger;\n  private triggeredAlerts: Set<string>;\n\n  constructor(config: AlertConfig, logger: Logger) {\n    super();\n    this.config = config;\n    this.logger = logger;\n    this.triggeredAlerts = new Set();\n  }\n\n  /**\n   * Check if budget threshold is exceeded\n   */\n  check(type: 'daily' | 'monthly' | 'total', current: number, limit: number): AlertEvent | null {\n    const thresholds = this.config[type];\n\n    if (!thresholds || thresholds.length === 0) {\n      return null;\n    }\n\n    const percentage = (current / limit) * 100;\n\n    // Find highest triggered threshold\n    let triggeredThreshold: AlertThreshold | null = null;\n\n    for (const threshold of thresholds.sort((a, b) => b.percentage - a.percentage)) {\n      if (percentage >= threshold.percentage) {\n        triggeredThreshold = threshold;\n        break;\n      }\n    }\n\n    if (!triggeredThreshold) {\n      return null;\n    }\n\n    // Create alert key to prevent duplicate alerts\n    const alertKey = `${type}-${triggeredThreshold.percentage}-${Math.floor(percentage)}`;\n\n    // Check if already triggered\n    if (this.triggeredAlerts.has(alertKey)) {\n      return null;\n    }\n\n    // Mark as triggered\n    this.triggeredAlerts.add(alertKey);\n\n    const alert: AlertEvent = {\n      type,\n      threshold: triggeredThreshold.percentage,\n      current,\n      limit,\n      percentage,\n      action: triggeredThreshold.action,\n      timestamp: Date.now(),\n    };\n\n    // Emit appropriate event\n    this.emitAlert(alert);\n\n    return alert;\n  }\n\n  /**\n   * Emit alert events\n   */\n  private emitAlert(alert: AlertEvent): void {\n    this.emit('alert', alert);\n    this.emit(`alert:${alert.action}`, alert);\n    this.emit(`alert:${alert.type}`, alert);\n\n    // Log alert\n    const message = `Budget alert: ${alert.type} spending at ${alert.percentage.toFixed(1)}% ($${alert.current.toFixed(2)}/$${alert.limit.toFixed(2)})`;\n\n    if (alert.action === 'block') {\n      this.logger.error(message, { alert });\n    } else if (alert.action === 'warn') {\n      this.logger.warn(message, { alert });\n    } else {\n      this.logger.info(message, { alert });\n    }\n\n    // Send notifications if configured\n    if (this.config.email) {\n      this.sendEmailAlert(alert);\n    }\n\n    if (this.config.webhook) {\n      this.sendWebhookAlert(alert);\n    }\n  }\n\n  /**\n   * Send email alert\n   */\n  private sendEmailAlert(alert: AlertEvent): void {\n    // Placeholder - implement email sending\n    this.logger.info('Sending email alert', {\n      to: this.config.email,\n      alert,\n    });\n\n    this.emit('alert:email:sent', { to: this.config.email, alert });\n  }\n\n  /**\n   * Send webhook alert\n   */\n  private sendWebhookAlert(alert: AlertEvent): void {\n    // Placeholder - implement webhook POST\n    this.logger.info('Sending webhook alert', {\n      url: this.config.webhook,\n      alert,\n    });\n\n    this.emit('alert:webhook:sent', { url: this.config.webhook, alert });\n  }\n\n  /**\n   * Reset triggered alerts\n   */\n  reset(): void {\n    this.triggeredAlerts.clear();\n    this.logger.info('Reset triggered alerts');\n  }\n\n  /**\n   * Update alert configuration\n   */\n  updateConfig(config: Partial<AlertConfig>): void {\n    this.config = {\n      ...this.config,\n      ...config,\n    };\n\n    this.logger.info('Updated alert configuration', { config: this.config });\n  }\n\n  /**\n   * Get alert configuration\n   */\n  getConfig(): AlertConfig {\n    return { ...this.config };\n  }\n\n  /**\n   * Check if alert has been triggered\n   */\n  hasTriggered(type: string, threshold: number): boolean {\n    const key = `${type}-${threshold}`;\n    return Array.from(this.triggeredAlerts).some((k) => k.startsWith(key));\n  }\n}\n","import { OpenRouterClient } from '../client/OpenRouterClient';\nimport { SendOptions } from '../types/client';\n\nexport class ExpressAdapter {\n  constructor(private client: OpenRouterClient) {}\n\n  /**\n   * Middleware for chat completion\n   */\n  chatMiddleware() {\n    return async (req: any, res: any, next: any) => {\n      try {\n        const { message, messages, options } = req.body;\n\n        if (!message && !messages) {\n          return res.status(400).json({\n            error: 'Either \"message\" (string) or \"messages\" (array) is required',\n          });\n        }\n\n        const input = messages || message;\n        const sendOptions: SendOptions = options || {};\n\n        const response = await this.client.sendMessage(input, sendOptions);\n\n        res.json({\n          success: true,\n          data: response,\n        });\n      } catch (error) {\n        next(error);\n      }\n    };\n  }\n\n  /**\n   * Middleware for streaming chat completion\n   */\n  streamMiddleware() {\n    return async (req: any, res: any, next: any) => {\n      try {\n        const { message, messages, options } = req.body;\n\n        if (!message && !messages) {\n          return res.status(400).json({\n            error: 'Either \"message\" (string) or \"messages\" (array) is required',\n          });\n        }\n\n        const input = messages || message;\n        const sendOptions: SendOptions = options || {};\n\n        // Set SSE headers\n        res.setHeader('Content-Type', 'text/event-stream');\n        res.setHeader('Cache-Control', 'no-cache');\n        res.setHeader('Connection', 'keep-alive');\n\n        for await (const chunk of this.client.streamMessage(input, sendOptions)) {\n          res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n        }\n\n        res.write('data: [DONE]\\n\\n');\n        res.end();\n      } catch (error) {\n        next(error);\n      }\n    };\n  }\n\n  /**\n   * Middleware for listing models\n   */\n  modelsMiddleware() {\n    return (_req: any, res: any, next: any) => {\n      try {\n        const models = this.client.getModelCatalog().getAllModels();\n\n        res.json({\n          success: true,\n          data: models,\n          count: models.length,\n        });\n      } catch (error) {\n        next(error);\n      }\n    };\n  }\n\n  /**\n   * Middleware for getting cost summary\n   */\n  costsMiddleware() {\n    return (req: any, res: any, next: any) => {\n      try {\n        const { startDate, endDate } = req.query;\n\n        const summary = this.client\n          .getCostTracker()\n          .getSummary(\n            startDate ? new Date(startDate) : undefined,\n            endDate ? new Date(endDate) : undefined,\n          );\n\n        res.json({\n          success: true,\n          data: summary,\n        });\n      } catch (error) {\n        next(error);\n      }\n    };\n  }\n\n  /**\n   * Error handling middleware\n   */\n  errorMiddleware() {\n    return (error: any, _req: any, res: any, _next: any) => {\n      const statusCode = error.statusCode || 500;\n\n      res.status(statusCode).json({\n        success: false,\n        error: {\n          message: error.message,\n          code: error.code || 'INTERNAL_ERROR',\n          ...(error.details && { details: error.details }),\n        },\n      });\n    };\n  }\n\n  /**\n   * Setup complete Express router\n   */\n  setupRouter(router: any) {\n    router.post('/chat', this.chatMiddleware());\n    router.post('/chat/stream', this.streamMiddleware());\n    router.get('/models', this.modelsMiddleware());\n    router.get('/costs', this.costsMiddleware());\n\n    // Error handler should be last\n    router.use(this.errorMiddleware());\n\n    return router;\n  }\n}\n\n/**\n * Factory function for Express integration\n */\nexport function createExpressAdapter(client: OpenRouterClient): ExpressAdapter {\n  return new ExpressAdapter(client);\n}\n","import { OpenRouterClient } from '../client/OpenRouterClient';\nimport { SendOptions } from '../types/client';\n\nexport class FastifyAdapter {\n  constructor(private client: OpenRouterClient) {}\n\n  /**\n   * Chat completion route handler\n   */\n  async chatHandler(request: any, reply: any) {\n    const { message, messages, options } = request.body;\n\n    if (!message && !messages) {\n      return reply.status(400).send({\n        error: 'Either \"message\" (string) or \"messages\" (array) is required',\n      });\n    }\n\n    const input = messages || message;\n    const sendOptions: SendOptions = options || {};\n\n    try {\n      const response = await this.client.sendMessage(input, sendOptions);\n      return { success: true, data: response };\n    } catch (error: any) {\n      return reply.status(error.statusCode || 500).send({\n        success: false,\n        error: {\n          message: error.message,\n          code: error.code || 'INTERNAL_ERROR',\n        },\n      });\n    }\n  }\n\n  /**\n   * Stream chat completion route handler\n   */\n  async streamHandler(request: any, reply: any) {\n    const { message, messages, options } = request.body;\n\n    if (!message && !messages) {\n      return reply.status(400).send({\n        error: 'Either \"message\" (string) or \"messages\" (array) is required',\n      });\n    }\n\n    const input = messages || message;\n    const sendOptions: SendOptions = options || {};\n\n    reply.raw.setHeader('Content-Type', 'text/event-stream');\n    reply.raw.setHeader('Cache-Control', 'no-cache');\n    reply.raw.setHeader('Connection', 'keep-alive');\n\n    try {\n      for await (const chunk of this.client.streamMessage(input, sendOptions)) {\n        reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n      }\n\n      reply.raw.write('data: [DONE]\\n\\n');\n      reply.raw.end();\n    } catch (error: any) {\n      reply.raw.write(`data: ${JSON.stringify({ error: error.message })}\\n\\n`);\n      reply.raw.end();\n    }\n  }\n\n  /**\n   * List models route handler\n   */\n  modelsHandler() {\n    const models = this.client.getModelCatalog().getAllModels();\n    return { success: true, data: models, count: models.length };\n  }\n\n  /**\n   * Cost summary route handler\n   */\n  costsHandler(request: any) {\n    const { startDate, endDate } = request.query;\n\n    const summary = this.client\n      .getCostTracker()\n      .getSummary(\n        startDate ? new Date(startDate) : undefined,\n        endDate ? new Date(endDate) : undefined,\n      );\n\n    return { success: true, data: summary };\n  }\n\n  /**\n   * Register Fastify plugin\n   */\n  plugin(fastify: any, _options: any) {\n    fastify.post('/chat', this.chatHandler.bind(this));\n    fastify.post('/chat/stream', this.streamHandler.bind(this));\n    fastify.get('/models', this.modelsHandler.bind(this));\n    fastify.get('/costs', this.costsHandler.bind(this));\n  }\n}\n\n/**\n * Factory function for Fastify integration\n */\nexport function createFastifyAdapter(client: OpenRouterClient): FastifyAdapter {\n  return new FastifyAdapter(client);\n}\n\n/**\n * Create Fastify plugin directly\n */\nexport function createFastifyPlugin(client: OpenRouterClient) {\n  const adapter = new FastifyAdapter(client);\n  return adapter.plugin.bind(adapter);\n}\n","import { OpenRouterClient } from '../client/OpenRouterClient';\nimport { SendOptions } from '../types/client';\n\n/**\n * NestJS Injectable Service\n * Usage:\n *\n * @Module({\n *   providers: [\n *     {\n *       provide: OpenRouterService,\n *       useFactory: () => {\n *         const client = new OpenRouterClient({ apiKey: 'your-key' });\n *         return new OpenRouterService(client);\n *       }\n *     }\n *   ]\n * })\n */\nexport class OpenRouterService {\n  constructor(private readonly client: OpenRouterClient) {}\n\n  async sendMessage(message: string | any[], options?: SendOptions) {\n    return this.client.sendMessage(message, options);\n  }\n\n  streamMessage(message: string | any[], options?: SendOptions) {\n    return this.client.streamMessage(message, options);\n  }\n\n  async listModels() {\n    return this.client.listModels();\n  }\n\n  getModelCatalog() {\n    return this.client.getModelCatalog();\n  }\n\n  getPricingCalculator() {\n    return this.client.getPricingCalculator();\n  }\n\n  getCostTracker() {\n    return this.client.getCostTracker();\n  }\n\n  getModelSelector() {\n    return this.client.getModelSelector();\n  }\n\n  destroy() {\n    this.client.destroy();\n  }\n}\n\n/**\n * NestJS Controller example\n *\n * @Controller('openrouter')\n * export class OpenRouterController {\n *   constructor(private readonly openrouterService: OpenRouterService) {}\n *\n *   @Post('chat')\n *   async chat(@Body() body: ChatDto) {\n *     return this.openrouterService.sendMessage(body.message, body.options);\n *   }\n *\n *   @Post('chat/stream')\n *   async stream(@Body() body: ChatDto, @Res() res: Response) {\n *     res.setHeader('Content-Type', 'text/event-stream');\n *\n *     for await (const chunk of this.openrouterService.streamMessage(body.message, body.options)) {\n *       res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n *     }\n *\n *     res.end();\n *   }\n * }\n */\n\n/**\n * Factory function for NestJS integration\n */\nexport function createNestJSService(client: OpenRouterClient): OpenRouterService {\n  return new OpenRouterService(client);\n}\n","/**\n * Memory-based cache implementation\n * Provides simple in-memory caching with TTL support\n */\n\nexport interface CacheEntry<T> {\n  value: T;\n  expiresAt: number;\n  size: number;\n}\n\nexport interface MemoryCacheOptions {\n  maxSize?: number; // Maximum number of entries\n  defaultTTL?: number; // Default TTL in milliseconds\n}\n\nexport class MemoryCache<T = any> {\n  private cache: Map<string, CacheEntry<T>>;\n  private maxSize: number;\n  private defaultTTL: number;\n\n  constructor(options: MemoryCacheOptions = {}) {\n    this.cache = new Map();\n    this.maxSize = options.maxSize || 1000;\n    this.defaultTTL = options.defaultTTL || 600000; // 10 minutes\n  }\n\n  /**\n   * Set a value in the cache\n   */\n  set(key: string, value: T, ttl?: number): void {\n    // Evict if at capacity\n    if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\n      this.evictOldest();\n    }\n\n    const expiresAt = Date.now() + (ttl || this.defaultTTL);\n    const size = this.estimateSize(value);\n\n    this.cache.set(key, {\n      value,\n      expiresAt,\n      size,\n    });\n  }\n\n  /**\n   * Get a value from the cache\n   */\n  get(key: string): T | null {\n    const entry = this.cache.get(key);\n\n    if (!entry) {\n      return null;\n    }\n\n    // Check if expired\n    if (Date.now() > entry.expiresAt) {\n      this.cache.delete(key);\n      return null;\n    }\n\n    return entry.value;\n  }\n\n  /**\n   * Check if key exists and is not expired\n   */\n  has(key: string): boolean {\n    const entry = this.cache.get(key);\n\n    if (!entry) {\n      return false;\n    }\n\n    if (Date.now() > entry.expiresAt) {\n      this.cache.delete(key);\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Delete a key from the cache\n   */\n  delete(key: string): boolean {\n    return this.cache.delete(key);\n  }\n\n  /**\n   * Clear all entries\n   */\n  clear(): void {\n    this.cache.clear();\n  }\n\n  /**\n   * Get cache size\n   */\n  size(): number {\n    return this.cache.size;\n  }\n\n  /**\n   * Get all keys\n   */\n  keys(): string[] {\n    return Array.from(this.cache.keys());\n  }\n\n  /**\n   * Remove expired entries\n   */\n  cleanup(): number {\n    const now = Date.now();\n    let removed = 0;\n\n    for (const [key, entry] of this.cache.entries()) {\n      if (now > entry.expiresAt) {\n        this.cache.delete(key);\n        removed++;\n      }\n    }\n\n    return removed;\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getStats(): {\n    size: number;\n    maxSize: number;\n    totalSize: number;\n    oldestEntry: number | null;\n    newestEntry: number | null;\n  } {\n    let totalSize = 0;\n    let oldestEntry: number | null = null;\n    let newestEntry: number | null = null;\n\n    for (const entry of this.cache.values()) {\n      totalSize += entry.size;\n\n      if (oldestEntry === null || entry.expiresAt < oldestEntry) {\n        oldestEntry = entry.expiresAt;\n      }\n\n      if (newestEntry === null || entry.expiresAt > newestEntry) {\n        newestEntry = entry.expiresAt;\n      }\n    }\n\n    return {\n      size: this.cache.size,\n      maxSize: this.maxSize,\n      totalSize,\n      oldestEntry,\n      newestEntry,\n    };\n  }\n\n  /**\n   * Evict the oldest entry\n   */\n  private evictOldest(): void {\n    let oldestKey: string | null = null;\n    let oldestTime = Infinity;\n\n    for (const [key, entry] of this.cache.entries()) {\n      if (entry.expiresAt < oldestTime) {\n        oldestTime = entry.expiresAt;\n        oldestKey = key;\n      }\n    }\n\n    if (oldestKey) {\n      this.cache.delete(oldestKey);\n    }\n  }\n\n  /**\n   * Estimate size of value in bytes\n   */\n  private estimateSize(value: T): number {\n    try {\n      return JSON.stringify(value).length;\n    } catch {\n      return 1; // Fallback for non-serializable values\n    }\n  }\n}\n","/**\n * LRU (Least Recently Used) Cache Implementation\n * Evicts least recently used entries when capacity is reached\n */\n\nexport interface LRUCacheOptions {\n  maxSize?: number; // Maximum number of entries\n  maxMemory?: number; // Maximum memory in bytes\n  defaultTTL?: number; // Default TTL in milliseconds\n}\n\ninterface LRUNode<T> {\n  key: string;\n  value: T;\n  expiresAt: number;\n  size: number;\n  prev: LRUNode<T> | null;\n  next: LRUNode<T> | null;\n}\n\nexport class LRUCache<T = any> {\n  private cache: Map<string, LRUNode<T>>;\n  private head: LRUNode<T> | null;\n  private tail: LRUNode<T> | null;\n  private maxSize: number;\n  private maxMemory: number;\n  private currentMemory: number;\n  private defaultTTL: number;\n\n  constructor(options: LRUCacheOptions = {}) {\n    this.cache = new Map();\n    this.head = null;\n    this.tail = null;\n    this.maxSize = options.maxSize || 1000;\n    this.maxMemory = options.maxMemory || 50 * 1024 * 1024; // 50MB default\n    this.currentMemory = 0;\n    this.defaultTTL = options.defaultTTL || 600000; // 10 minutes\n  }\n\n  /**\n   * Set a value in the cache\n   */\n  set(key: string, value: T, ttl?: number): void {\n    const size = this.estimateSize(value);\n    const expiresAt = Date.now() + (ttl || this.defaultTTL);\n\n    // If key exists, remove old node\n    if (this.cache.has(key)) {\n      this.remove(key);\n    }\n\n    // Evict until we have space\n    while (\n      (this.cache.size >= this.maxSize || this.currentMemory + size > this.maxMemory) &&\n      this.tail\n    ) {\n      this.removeTail();\n    }\n\n    // Create new node\n    const node: LRUNode<T> = {\n      key,\n      value,\n      expiresAt,\n      size,\n      prev: null,\n      next: null,\n    };\n\n    this.cache.set(key, node);\n    this.addToHead(node);\n    this.currentMemory += size;\n  }\n\n  /**\n   * Get a value from the cache\n   */\n  get(key: string): T | null {\n    const node = this.cache.get(key);\n\n    if (!node) {\n      return null;\n    }\n\n    // Check if expired\n    if (Date.now() > node.expiresAt) {\n      this.remove(key);\n      return null;\n    }\n\n    // Move to head (most recently used)\n    this.moveToHead(node);\n\n    return node.value;\n  }\n\n  /**\n   * Check if key exists and is not expired\n   */\n  has(key: string): boolean {\n    const node = this.cache.get(key);\n\n    if (!node) {\n      return false;\n    }\n\n    if (Date.now() > node.expiresAt) {\n      this.remove(key);\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Delete a key from the cache\n   */\n  delete(key: string): boolean {\n    return this.remove(key);\n  }\n\n  /**\n   * Clear all entries\n   */\n  clear(): void {\n    this.cache.clear();\n    this.head = null;\n    this.tail = null;\n    this.currentMemory = 0;\n  }\n\n  /**\n   * Get cache size\n   */\n  size(): number {\n    return this.cache.size;\n  }\n\n  /**\n   * Get all keys (from most to least recently used)\n   */\n  keys(): string[] {\n    const keys: string[] = [];\n    let current = this.head;\n\n    while (current) {\n      keys.push(current.key);\n      current = current.next;\n    }\n\n    return keys;\n  }\n\n  /**\n   * Remove expired entries\n   */\n  cleanup(): number {\n    const now = Date.now();\n    let removed = 0;\n    const keysToRemove: string[] = [];\n\n    for (const [key, node] of this.cache.entries()) {\n      if (now > node.expiresAt) {\n        keysToRemove.push(key);\n      }\n    }\n\n    for (const key of keysToRemove) {\n      this.remove(key);\n      removed++;\n    }\n\n    return removed;\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getStats(): {\n    size: number;\n    maxSize: number;\n    memoryUsed: number;\n    maxMemory: number;\n    hitRate?: number;\n  } {\n    return {\n      size: this.cache.size,\n      maxSize: this.maxSize,\n      memoryUsed: this.currentMemory,\n      maxMemory: this.maxMemory,\n    };\n  }\n\n  /**\n   * Add node to head of list\n   */\n  private addToHead(node: LRUNode<T>): void {\n    node.next = this.head;\n    node.prev = null;\n\n    if (this.head) {\n      this.head.prev = node;\n    }\n\n    this.head = node;\n\n    if (!this.tail) {\n      this.tail = node;\n    }\n  }\n\n  /**\n   * Remove node from list\n   */\n  private removeNode(node: LRUNode<T>): void {\n    if (node.prev) {\n      node.prev.next = node.next;\n    } else {\n      this.head = node.next;\n    }\n\n    if (node.next) {\n      node.next.prev = node.prev;\n    } else {\n      this.tail = node.prev;\n    }\n  }\n\n  /**\n   * Move node to head of list\n   */\n  private moveToHead(node: LRUNode<T>): void {\n    this.removeNode(node);\n    this.addToHead(node);\n  }\n\n  /**\n   * Remove tail (least recently used)\n   */\n  private removeTail(): void {\n    if (!this.tail) {\n      return;\n    }\n\n    const key = this.tail.key;\n    this.remove(key);\n  }\n\n  /**\n   * Remove a key from cache\n   */\n  private remove(key: string): boolean {\n    const node = this.cache.get(key);\n\n    if (!node) {\n      return false;\n    }\n\n    this.removeNode(node);\n    this.cache.delete(key);\n    this.currentMemory -= node.size;\n\n    return true;\n  }\n\n  /**\n   * Estimate size of value in bytes\n   */\n  private estimateSize(value: T): number {\n    try {\n      return JSON.stringify(value).length;\n    } catch {\n      return 1;\n    }\n  }\n}\n","/**\n * Request Deduplicator\n * Prevents duplicate concurrent requests for the same data\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport crypto from 'crypto';\n\nexport interface DeduplicationOptions {\n  enabled?: boolean;\n  ttl?: number; // How long to deduplicate (ms)\n  maxPendingRequests?: number;\n}\n\ninterface PendingRequest<T> {\n  promise: Promise<T>;\n  timestamp: number;\n  resolvers: Array<(value: T) => void>;\n  rejectors: Array<(error: Error) => void>;\n}\n\nexport class RequestDeduplicator extends EventEmitter {\n  private pendingRequests: Map<string, PendingRequest<any>>;\n  private enabled: boolean;\n  private ttl: number;\n  private maxPendingRequests: number;\n  private stats: {\n    totalRequests: number;\n    deduplicatedRequests: number;\n    activeDeduplications: number;\n  };\n\n  constructor(options: DeduplicationOptions = {}) {\n    super();\n    this.pendingRequests = new Map();\n    this.enabled = options.enabled !== false;\n    this.ttl = options.ttl || 5000; // 5 seconds default\n    this.maxPendingRequests = options.maxPendingRequests || 1000;\n    this.stats = {\n      totalRequests: 0,\n      deduplicatedRequests: 0,\n      activeDeduplications: 0,\n    };\n  }\n\n  /**\n   * Execute a request with deduplication\n   */\n  async execute<T>(\n    key: string | object,\n    executor: () => Promise<T>,\n    options?: { ttl?: number },\n  ): Promise<T> {\n    this.stats.totalRequests++;\n\n    if (!this.enabled) {\n      return executor();\n    }\n\n    const cacheKey = this.generateKey(key);\n    const pending = this.pendingRequests.get(cacheKey);\n\n    // If there's a pending request, wait for it\n    if (pending) {\n      this.stats.deduplicatedRequests++;\n      this.emit('deduplicated', { key: cacheKey });\n\n      // Return a promise that resolves when the original request completes\n      return new Promise<T>((resolve, reject) => {\n        pending.resolvers.push(resolve);\n        pending.rejectors.push(reject);\n      });\n    }\n\n    // Check capacity\n    if (this.pendingRequests.size >= this.maxPendingRequests) {\n      this.cleanup();\n    }\n\n    // Execute the request\n    const resolvers: Array<(value: T) => void> = [];\n    const rejectors: Array<(error: Error) => void> = [];\n\n    const promise = executor()\n      .then((result) => {\n        // Resolve all waiting promises\n        resolvers.forEach((resolve) => resolve(result));\n        this.pendingRequests.delete(cacheKey);\n        this.stats.activeDeduplications = this.pendingRequests.size;\n        return result;\n      })\n      .catch((error) => {\n        // Reject all waiting promises\n        rejectors.forEach((reject) => reject(error));\n        this.pendingRequests.delete(cacheKey);\n        this.stats.activeDeduplications = this.pendingRequests.size;\n        throw error;\n      });\n\n    // Store pending request\n    this.pendingRequests.set(cacheKey, {\n      promise,\n      timestamp: Date.now(),\n      resolvers,\n      rejectors,\n    });\n\n    this.stats.activeDeduplications = this.pendingRequests.size;\n\n    // Auto-cleanup after TTL\n    const ttl = options?.ttl || this.ttl;\n    setTimeout(() => {\n      this.pendingRequests.delete(cacheKey);\n      this.stats.activeDeduplications = this.pendingRequests.size;\n    }, ttl);\n\n    return promise;\n  }\n\n  /**\n   * Generate cache key from input\n   */\n  private generateKey(input: string | object): string {\n    if (typeof input === 'string') {\n      return input;\n    }\n\n    // Generate hash from object\n    const json = JSON.stringify(input, Object.keys(input).sort());\n    return crypto.createHash('sha256').update(json).digest('hex').substring(0, 16);\n  }\n\n  /**\n   * Clean up expired pending requests\n   */\n  private cleanup(): void {\n    const now = Date.now();\n    const keysToDelete: string[] = [];\n\n    for (const [key, pending] of this.pendingRequests.entries()) {\n      if (now - pending.timestamp > this.ttl) {\n        keysToDelete.push(key);\n      }\n    }\n\n    for (const key of keysToDelete) {\n      this.pendingRequests.delete(key);\n    }\n\n    this.stats.activeDeduplications = this.pendingRequests.size;\n  }\n\n  /**\n   * Clear all pending requests\n   */\n  clear(): void {\n    this.pendingRequests.clear();\n    this.stats.activeDeduplications = 0;\n  }\n\n  /**\n   * Get deduplication statistics\n   */\n  getStats(): {\n    totalRequests: number;\n    deduplicatedRequests: number;\n    activeDeduplications: number;\n    deduplicationRate: number;\n  } {\n    return {\n      ...this.stats,\n      deduplicationRate:\n        this.stats.totalRequests > 0\n          ? this.stats.deduplicatedRequests / this.stats.totalRequests\n          : 0,\n    };\n  }\n\n  /**\n   * Enable/disable deduplication\n   */\n  setEnabled(enabled: boolean): void {\n    this.enabled = enabled;\n    if (!enabled) {\n      this.clear();\n    }\n  }\n\n  /**\n   * Check if deduplication is enabled\n   */\n  isEnabled(): boolean {\n    return this.enabled;\n  }\n}\n","/**\n * Cache Manager\n * Orchestrates caching with multiple strategies\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { MemoryCache } from './MemoryCache';\nimport { LRUCache } from './LRUCache';\nimport { RequestDeduplicator } from './RequestDeduplicator';\nimport { Logger } from '../utils/logger';\n\nexport type CacheStrategy = 'memory' | 'lru' | 'none';\n\nexport interface CacheManagerOptions {\n  strategy?: CacheStrategy;\n  maxSize?: number;\n  maxMemory?: number;\n  defaultTTL?: number;\n  deduplication?: boolean;\n  logger?: Logger;\n}\n\nexport interface CacheStats {\n  strategy: CacheStrategy;\n  size: number;\n  hits: number;\n  misses: number;\n  hitRate: number;\n  deduplicationStats?: {\n    totalRequests: number;\n    deduplicatedRequests: number;\n    deduplicationRate: number;\n  };\n}\n\nexport class CacheManager extends EventEmitter {\n  private cache: MemoryCache | LRUCache | null;\n  private deduplicator: RequestDeduplicator;\n  private strategy: CacheStrategy;\n  private logger: Logger;\n  private stats: {\n    hits: number;\n    misses: number;\n  };\n\n  constructor(options: CacheManagerOptions = {}) {\n    super();\n    this.strategy = options.strategy || 'lru';\n    this.logger = options.logger || new Logger({ enabled: false });\n    this.stats = {\n      hits: 0,\n      misses: 0,\n    };\n\n    // Initialize cache based on strategy\n    switch (this.strategy) {\n      case 'memory':\n        this.cache = new MemoryCache({\n          maxSize: options.maxSize,\n          defaultTTL: options.defaultTTL,\n        });\n        break;\n      case 'lru':\n        this.cache = new LRUCache({\n          maxSize: options.maxSize,\n          maxMemory: options.maxMemory,\n          defaultTTL: options.defaultTTL,\n        });\n        break;\n      case 'none':\n        this.cache = null;\n        break;\n      default:\n        throw new Error(`Unknown cache strategy: ${this.strategy}`);\n    }\n\n    // Initialize deduplicator\n    this.deduplicator = new RequestDeduplicator({\n      enabled: options.deduplication !== false,\n    });\n\n    // Set up cleanup interval\n    if (this.cache) {\n      setInterval(() => {\n        this.cleanup();\n      }, 60000); // Clean up every minute\n    }\n  }\n\n  /**\n   * Get a value from cache\n   */\n  async get<T>(key: string): Promise<T | null> {\n    await Promise.resolve(); // Keep async for consistent interface\n    if (!this.cache) {\n      this.stats.misses++;\n      return null;\n    }\n\n    const value = this.cache.get(key);\n\n    if (value !== null) {\n      this.stats.hits++;\n      this.logger.debug('Cache hit', { key });\n      this.emit('hit', { key });\n      return value as T;\n    }\n\n    this.stats.misses++;\n    this.logger.debug('Cache miss', { key });\n    this.emit('miss', { key });\n    return null;\n  }\n\n  /**\n   * Set a value in cache\n   */\n  async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n    await Promise.resolve(); // Keep async for consistent interface\n    if (!this.cache) {\n      return;\n    }\n\n    this.cache.set(key, value, ttl);\n    this.logger.debug('Cache set', { key, ttl });\n    this.emit('set', { key, ttl });\n  }\n\n  /**\n   * Get or compute a value with caching and deduplication\n   */\n  async getOrCompute<T>(\n    key: string,\n    computer: () => Promise<T>,\n    options?: { ttl?: number; skipCache?: boolean },\n  ): Promise<T> {\n    // Check cache first (unless skipped)\n    if (!options?.skipCache) {\n      const cached = await this.get<T>(key);\n      if (cached !== null) {\n        return cached;\n      }\n    }\n\n    // Use deduplicator to prevent concurrent requests\n    const value = await this.deduplicator.execute(key, computer, options);\n\n    // Store in cache\n    if (!options?.skipCache) {\n      await this.set(key, value, options?.ttl);\n    }\n\n    return value;\n  }\n\n  /**\n   * Delete a key from cache\n   */\n  async delete(key: string): Promise<boolean> {\n    await Promise.resolve(); // Keep async for consistent interface\n    if (!this.cache) {\n      return false;\n    }\n\n    const result = this.cache.delete(key);\n    if (result) {\n      this.logger.debug('Cache delete', { key });\n      this.emit('delete', { key });\n    }\n    return result;\n  }\n\n  /**\n   * Check if key exists in cache\n   */\n  async has(key: string): Promise<boolean> {\n    await Promise.resolve(); // Keep async for consistent interface\n    if (!this.cache) {\n      return false;\n    }\n\n    return this.cache.has(key);\n  }\n\n  /**\n   * Clear all cache entries\n   */\n  async clear(): Promise<void> {\n    await Promise.resolve(); // Keep async for consistent interface\n    if (!this.cache) {\n      return;\n    }\n\n    this.cache.clear();\n    this.deduplicator.clear();\n    this.stats.hits = 0;\n    this.stats.misses = 0;\n    this.logger.info('Cache cleared');\n    this.emit('clear');\n  }\n\n  /**\n   * Get cache size\n   */\n  size(): number {\n    if (!this.cache) {\n      return 0;\n    }\n\n    return this.cache.size();\n  }\n\n  /**\n   * Get all keys\n   */\n  keys(): string[] {\n    if (!this.cache) {\n      return [];\n    }\n\n    return this.cache.keys();\n  }\n\n  /**\n   * Clean up expired entries\n   */\n  cleanup(): number {\n    if (!this.cache) {\n      return 0;\n    }\n\n    const removed = this.cache.cleanup();\n    if (removed > 0) {\n      this.logger.debug('Cache cleanup', { removed });\n      this.emit('cleanup', { removed });\n    }\n    return removed;\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getStats(): CacheStats {\n    const totalRequests = this.stats.hits + this.stats.misses;\n    const hitRate = totalRequests > 0 ? this.stats.hits / totalRequests : 0;\n\n    const stats: CacheStats = {\n      strategy: this.strategy,\n      size: this.size(),\n      hits: this.stats.hits,\n      misses: this.stats.misses,\n      hitRate,\n    };\n\n    // Add deduplication stats\n    const dedupStats = this.deduplicator.getStats();\n    if (dedupStats.totalRequests > 0) {\n      stats.deduplicationStats = {\n        totalRequests: dedupStats.totalRequests,\n        deduplicatedRequests: dedupStats.deduplicatedRequests,\n        deduplicationRate: dedupStats.deduplicationRate,\n      };\n    }\n\n    return stats;\n  }\n\n  /**\n   * Generate cache key from request parameters\n   */\n  static generateKey(params: Record<string, any>): string {\n    const sorted = Object.keys(params)\n      .sort()\n      .reduce(\n        (acc, key) => {\n          acc[key] = params[key];\n          return acc;\n        },\n        {} as Record<string, any>,\n      );\n\n    return JSON.stringify(sorted);\n  }\n\n  /**\n   * Enable/disable deduplication\n   */\n  setDeduplicationEnabled(enabled: boolean): void {\n    this.deduplicator.setEnabled(enabled);\n  }\n\n  /**\n   * Check if deduplication is enabled\n   */\n  isDeduplicationEnabled(): boolean {\n    return this.deduplicator.isEnabled();\n  }\n}\n","/**\n * Metrics Collector\n * Tracks latency, token usage, costs, and other performance metrics\n */\n\nimport { EventEmitter } from 'eventemitter3';\n\nexport interface RequestMetrics {\n  modelId: string;\n  provider: string;\n  startTime: number;\n  endTime: number;\n  duration: number;\n  inputTokens: number;\n  outputTokens: number;\n  totalTokens: number;\n  cost: number;\n  success: boolean;\n  errorType?: string;\n  cacheHit?: boolean;\n}\n\nexport interface AggregatedMetrics {\n  totalRequests: number;\n  successfulRequests: number;\n  failedRequests: number;\n  averageLatency: number;\n  p50Latency: number;\n  p95Latency: number;\n  p99Latency: number;\n  totalTokens: number;\n  totalCost: number;\n  cacheHitRate: number;\n  byModel: Map<string, ModelMetrics>;\n  byProvider: Map<string, ProviderMetrics>;\n}\n\nexport interface ModelMetrics {\n  requests: number;\n  successRate: number;\n  averageLatency: number;\n  totalTokens: number;\n  totalCost: number;\n}\n\nexport interface ProviderMetrics {\n  requests: number;\n  successRate: number;\n  averageLatency: number;\n  totalCost: number;\n  errorRate: number;\n}\n\nexport class MetricsCollector extends EventEmitter {\n  private metrics: RequestMetrics[];\n  private maxMetricsHistory: number;\n  private aggregationInterval: number;\n  private aggregationTimer?: NodeJS.Timeout;\n\n  constructor(options: { maxHistory?: number; aggregationInterval?: number } = {}) {\n    super();\n    this.metrics = [];\n    this.maxMetricsHistory = options.maxHistory || 10000;\n    this.aggregationInterval = options.aggregationInterval || 60000; // 1 minute\n\n    // Start periodic aggregation\n    this.startAggregation();\n  }\n\n  /**\n   * Record a request metric\n   */\n  record(metric: RequestMetrics): void {\n    this.metrics.push(metric);\n\n    // Trim history if needed\n    if (this.metrics.length > this.maxMetricsHistory) {\n      this.metrics = this.metrics.slice(-this.maxMetricsHistory);\n    }\n\n    this.emit('metric:recorded', metric);\n  }\n\n  /**\n   * Start a request timer\n   */\n  startRequest(\n    modelId: string,\n    provider: string,\n  ): {\n    finish: (result: {\n      inputTokens: number;\n      outputTokens: number;\n      cost: number;\n      success: boolean;\n      errorType?: string;\n      cacheHit?: boolean;\n    }) => void;\n  } {\n    const startTime = Date.now();\n\n    return {\n      finish: (result) => {\n        const endTime = Date.now();\n        const metric: RequestMetrics = {\n          modelId,\n          provider,\n          startTime,\n          endTime,\n          duration: endTime - startTime,\n          inputTokens: result.inputTokens,\n          outputTokens: result.outputTokens,\n          totalTokens: result.inputTokens + result.outputTokens,\n          cost: result.cost,\n          success: result.success,\n          errorType: result.errorType,\n          cacheHit: result.cacheHit,\n        };\n\n        this.record(metric);\n      },\n    };\n  }\n\n  /**\n   * Get aggregated metrics\n   */\n  getAggregatedMetrics(timeRange?: { start: number; end: number }): AggregatedMetrics {\n    let filtered = this.metrics;\n\n    // Filter by time range\n    if (timeRange) {\n      filtered = this.metrics.filter(\n        (m) => m.startTime >= timeRange.start && m.startTime <= timeRange.end,\n      );\n    }\n\n    if (filtered.length === 0) {\n      return this.getEmptyMetrics();\n    }\n\n    const totalRequests = filtered.length;\n    const successfulRequests = filtered.filter((m) => m.success).length;\n    const failedRequests = totalRequests - successfulRequests;\n\n    // Calculate latency metrics\n    const sortedLatencies = filtered.map((m) => m.duration).sort((a, b) => a - b);\n    const averageLatency = sortedLatencies.reduce((sum, l) => sum + l, 0) / sortedLatencies.length;\n    const p50Latency = this.percentile(sortedLatencies, 50);\n    const p95Latency = this.percentile(sortedLatencies, 95);\n    const p99Latency = this.percentile(sortedLatencies, 99);\n\n    // Calculate token and cost metrics\n    const totalTokens = filtered.reduce((sum, m) => sum + m.totalTokens, 0);\n    const totalCost = filtered.reduce((sum, m) => sum + m.cost, 0);\n\n    // Calculate cache hit rate\n    const cacheHits = filtered.filter((m) => m.cacheHit).length;\n    const cacheHitRate = cacheHits / totalRequests;\n\n    // Aggregate by model\n    const byModel = this.aggregateByModel(filtered);\n\n    // Aggregate by provider\n    const byProvider = this.aggregateByProvider(filtered);\n\n    return {\n      totalRequests,\n      successfulRequests,\n      failedRequests,\n      averageLatency,\n      p50Latency,\n      p95Latency,\n      p99Latency,\n      totalTokens,\n      totalCost,\n      cacheHitRate,\n      byModel,\n      byProvider,\n    };\n  }\n\n  /**\n   * Get metrics for a specific model\n   */\n  getModelMetrics(modelId: string): ModelMetrics | null {\n    const filtered = this.metrics.filter((m) => m.modelId === modelId);\n\n    if (filtered.length === 0) {\n      return null;\n    }\n\n    const successful = filtered.filter((m) => m.success).length;\n    const totalLatency = filtered.reduce((sum, m) => sum + m.duration, 0);\n    const totalTokens = filtered.reduce((sum, m) => sum + m.totalTokens, 0);\n    const totalCost = filtered.reduce((sum, m) => sum + m.cost, 0);\n\n    return {\n      requests: filtered.length,\n      successRate: successful / filtered.length,\n      averageLatency: totalLatency / filtered.length,\n      totalTokens,\n      totalCost,\n    };\n  }\n\n  /**\n   * Get metrics for a specific provider\n   */\n  getProviderMetrics(provider: string): ProviderMetrics | null {\n    const filtered = this.metrics.filter((m) => m.provider === provider);\n\n    if (filtered.length === 0) {\n      return null;\n    }\n\n    const successful = filtered.filter((m) => m.success).length;\n    const failed = filtered.length - successful;\n    const totalLatency = filtered.reduce((sum, m) => sum + m.duration, 0);\n    const totalCost = filtered.reduce((sum, m) => sum + m.cost, 0);\n\n    return {\n      requests: filtered.length,\n      successRate: successful / filtered.length,\n      averageLatency: totalLatency / filtered.length,\n      totalCost,\n      errorRate: failed / filtered.length,\n    };\n  }\n\n  /**\n   * Clear all metrics\n   */\n  clear(): void {\n    this.metrics = [];\n    this.emit('metrics:cleared');\n  }\n\n  /**\n   * Stop metrics collection\n   */\n  stop(): void {\n    if (this.aggregationTimer) {\n      clearInterval(this.aggregationTimer);\n    }\n  }\n\n  /**\n   * Calculate percentile\n   */\n  private percentile(sortedArray: number[], percentile: number): number {\n    if (sortedArray.length === 0) {\n      return 0;\n    }\n\n    const index = Math.ceil((percentile / 100) * sortedArray.length) - 1;\n    return sortedArray[index];\n  }\n\n  /**\n   * Aggregate metrics by model\n   */\n  private aggregateByModel(metrics: RequestMetrics[]): Map<string, ModelMetrics> {\n    const byModel = new Map<string, ModelMetrics>();\n\n    for (const metric of metrics) {\n      const existing = byModel.get(metric.modelId);\n\n      if (!existing) {\n        byModel.set(metric.modelId, {\n          requests: 1,\n          successRate: metric.success ? 1 : 0,\n          averageLatency: metric.duration,\n          totalTokens: metric.totalTokens,\n          totalCost: metric.cost,\n        });\n      } else {\n        const totalRequests = existing.requests + 1;\n        const successfulRequests =\n          existing.successRate * existing.requests + (metric.success ? 1 : 0);\n\n        byModel.set(metric.modelId, {\n          requests: totalRequests,\n          successRate: successfulRequests / totalRequests,\n          averageLatency:\n            (existing.averageLatency * existing.requests + metric.duration) / totalRequests,\n          totalTokens: existing.totalTokens + metric.totalTokens,\n          totalCost: existing.totalCost + metric.cost,\n        });\n      }\n    }\n\n    return byModel;\n  }\n\n  /**\n   * Aggregate metrics by provider\n   */\n  private aggregateByProvider(metrics: RequestMetrics[]): Map<string, ProviderMetrics> {\n    const byProvider = new Map<string, ProviderMetrics>();\n\n    for (const metric of metrics) {\n      const existing = byProvider.get(metric.provider);\n\n      if (!existing) {\n        byProvider.set(metric.provider, {\n          requests: 1,\n          successRate: metric.success ? 1 : 0,\n          averageLatency: metric.duration,\n          totalCost: metric.cost,\n          errorRate: metric.success ? 0 : 1,\n        });\n      } else {\n        const totalRequests = existing.requests + 1;\n        const successfulRequests =\n          existing.successRate * existing.requests + (metric.success ? 1 : 0);\n        const failedRequests = totalRequests - successfulRequests;\n\n        byProvider.set(metric.provider, {\n          requests: totalRequests,\n          successRate: successfulRequests / totalRequests,\n          averageLatency:\n            (existing.averageLatency * existing.requests + metric.duration) / totalRequests,\n          totalCost: existing.totalCost + metric.cost,\n          errorRate: failedRequests / totalRequests,\n        });\n      }\n    }\n\n    return byProvider;\n  }\n\n  /**\n   * Get empty metrics object\n   */\n  private getEmptyMetrics(): AggregatedMetrics {\n    return {\n      totalRequests: 0,\n      successfulRequests: 0,\n      failedRequests: 0,\n      averageLatency: 0,\n      p50Latency: 0,\n      p95Latency: 0,\n      p99Latency: 0,\n      totalTokens: 0,\n      totalCost: 0,\n      cacheHitRate: 0,\n      byModel: new Map(),\n      byProvider: new Map(),\n    };\n  }\n\n  /**\n   * Start periodic aggregation\n   */\n  private startAggregation(): void {\n    this.aggregationTimer = setInterval(() => {\n      const aggregated = this.getAggregatedMetrics();\n      this.emit('metrics:aggregated', aggregated);\n    }, this.aggregationInterval);\n  }\n}\n","/**\n * Health Check System\n * Monitors service health and provider status\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { Logger } from '../utils/logger';\n\nexport interface HealthStatus {\n  status: 'healthy' | 'degraded' | 'unhealthy';\n  timestamp: number;\n  checks: {\n    api: CheckResult;\n    providers: Map<string, CheckResult>;\n    cache?: CheckResult;\n    database?: CheckResult;\n  };\n  uptime: number;\n  version: string;\n}\n\nexport interface CheckResult {\n  status: 'pass' | 'warn' | 'fail';\n  latency?: number;\n  message?: string;\n  timestamp: number;\n}\n\nexport interface HealthCheckOptions {\n  interval?: number;\n  timeout?: number;\n  logger?: Logger;\n}\n\nexport class HealthCheck extends EventEmitter {\n  private interval: number;\n  private timeout: number;\n  private logger: Logger;\n  private checkTimer?: NodeJS.Timeout;\n  private startTime: number;\n  private lastStatus?: HealthStatus;\n\n  constructor(options: HealthCheckOptions = {}) {\n    super();\n    this.interval = options.interval || 30000; // 30 seconds\n    this.timeout = options.timeout || 5000; // 5 seconds\n    this.logger = options.logger || new Logger({ enabled: false });\n    this.startTime = Date.now();\n  }\n\n  /**\n   * Start health checks\n   */\n  start(): void {\n    this.logger.info('Starting health checks', {\n      interval: this.interval,\n      timeout: this.timeout,\n    });\n\n    // Run initial check\n    void this.runHealthCheck();\n\n    // Schedule periodic checks\n    this.checkTimer = setInterval(() => {\n      void this.runHealthCheck();\n    }, this.interval);\n  }\n\n  /**\n   * Stop health checks\n   */\n  stop(): void {\n    if (this.checkTimer) {\n      clearInterval(this.checkTimer);\n      this.checkTimer = undefined;\n    }\n    this.logger.info('Stopped health checks');\n  }\n\n  /**\n   * Run a health check\n   */\n  async runHealthCheck(): Promise<HealthStatus> {\n    const timestamp = Date.now();\n    const uptime = timestamp - this.startTime;\n\n    try {\n      // Check API health\n      const apiCheck = await this.checkAPI();\n\n      // Check provider health\n      const providerChecks = await this.checkProviders();\n\n      // Determine overall status\n      const status = this.determineStatus(apiCheck, providerChecks);\n\n      const healthStatus: HealthStatus = {\n        status,\n        timestamp,\n        checks: {\n          api: apiCheck,\n          providers: providerChecks,\n        },\n        uptime,\n        version: process.env.npm_package_version || '1.0.0',\n      };\n\n      this.lastStatus = healthStatus;\n      this.emit('health:checked', healthStatus);\n\n      if (status === 'unhealthy') {\n        this.emit('health:unhealthy', healthStatus);\n      } else if (status === 'degraded') {\n        this.emit('health:degraded', healthStatus);\n      }\n\n      return healthStatus;\n    } catch (error) {\n      const errorStatus: HealthStatus = {\n        status: 'unhealthy',\n        timestamp,\n        checks: {\n          api: {\n            status: 'fail',\n            message: error instanceof Error ? error.message : 'Unknown error',\n            timestamp,\n          },\n          providers: new Map(),\n        },\n        uptime,\n        version: process.env.npm_package_version || '1.0.0',\n      };\n\n      this.lastStatus = errorStatus;\n      this.emit('health:error', error);\n      return errorStatus;\n    }\n  }\n\n  /**\n   * Get last health status\n   */\n  getLastStatus(): HealthStatus | undefined {\n    return this.lastStatus;\n  }\n\n  /**\n   * Check API health\n   */\n  private async checkAPI(): Promise<CheckResult> {\n    const startTime = Date.now();\n\n    try {\n      // Simple ping check (you can customize this)\n      await new Promise((resolve) => setTimeout(resolve, 10));\n\n      const latency = Date.now() - startTime;\n\n      return {\n        status: latency < 1000 ? 'pass' : 'warn',\n        latency,\n        message: 'API is responsive',\n        timestamp: Date.now(),\n      };\n    } catch (error) {\n      return {\n        status: 'fail',\n        message: error instanceof Error ? error.message : 'API check failed',\n        timestamp: Date.now(),\n      };\n    }\n  }\n\n  /**\n   * Check provider health\n   */\n  private async checkProviders(): Promise<Map<string, CheckResult>> {\n    const providers = ['openai', 'anthropic', 'meta', 'mistral', 'google'];\n    const results = new Map<string, CheckResult>();\n\n    for (const provider of providers) {\n      const result = await this.checkProvider(provider);\n      results.set(provider, result);\n    }\n\n    return results;\n  }\n\n  /**\n   * Check individual provider health\n   */\n  private async checkProvider(provider: string): Promise<CheckResult> {\n    const startTime = Date.now();\n\n    try {\n      // Simulate provider check (replace with actual API calls)\n      await new Promise((resolve) => setTimeout(resolve, 50));\n\n      const latency = Date.now() - startTime;\n\n      return {\n        status: latency < 2000 ? 'pass' : 'warn',\n        latency,\n        message: `${provider} is operational`,\n        timestamp: Date.now(),\n      };\n    } catch (error) {\n      return {\n        status: 'fail',\n        message: error instanceof Error ? error.message : `${provider} check failed`,\n        timestamp: Date.now(),\n      };\n    }\n  }\n\n  /**\n   * Determine overall health status\n   */\n  private determineStatus(\n    apiCheck: CheckResult,\n    providerChecks: Map<string, CheckResult>,\n  ): 'healthy' | 'degraded' | 'unhealthy' {\n    // If API is failing, system is unhealthy\n    if (apiCheck.status === 'fail') {\n      return 'unhealthy';\n    }\n\n    // Count provider statuses\n    let failedProviders = 0;\n    let warnProviders = 0;\n\n    for (const check of providerChecks.values()) {\n      if (check.status === 'fail') {\n        failedProviders++;\n      } else if (check.status === 'warn') {\n        warnProviders++;\n      }\n    }\n\n    // If more than half of providers are failing, system is unhealthy\n    if (failedProviders > providerChecks.size / 2) {\n      return 'unhealthy';\n    }\n\n    // If any providers are failing or API is degraded, system is degraded\n    if (failedProviders > 0 || warnProviders > 0 || apiCheck.status === 'warn') {\n      return 'degraded';\n    }\n\n    return 'healthy';\n  }\n}\n","/**\n * Analytics System\n * Track usage patterns, trends, and insights\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport type { RequestMetrics } from './MetricsCollector';\n\nexport interface UsageAnalytics {\n  timeRange: { start: number; end: number };\n  summary: {\n    totalRequests: number;\n    uniqueModels: number;\n    uniqueProviders: number;\n    totalCost: number;\n    totalTokens: number;\n    averageRequestsPerMinute: number;\n  };\n  trends: {\n    mostUsedModels: Array<{ modelId: string; count: number; percentage: number }>;\n    costByProvider: Map<string, number>;\n    requestsByHour: Map<number, number>;\n    successRate: number;\n    averageCostPerRequest: number;\n  };\n  recommendations?: {\n    suggestedModels?: string[];\n    potentialSavings?: number;\n    optimizationTips?: string[];\n  };\n}\n\nexport class Analytics extends EventEmitter {\n  private metrics: RequestMetrics[];\n\n  constructor() {\n    super();\n    this.metrics = [];\n  }\n\n  /**\n   * Add a metric for analysis\n   */\n  addMetric(metric: RequestMetrics): void {\n    this.metrics.push(metric);\n    this.emit('metric:added', metric);\n  }\n\n  /**\n   * Add multiple metrics\n   */\n  addMetrics(metrics: RequestMetrics[]): void {\n    this.metrics.push(...metrics);\n    this.emit('metrics:added', { count: metrics.length });\n  }\n\n  /**\n   * Get usage analytics for a time range\n   */\n  getAnalytics(timeRange?: { start: number; end: number }): UsageAnalytics {\n    let filtered = this.metrics;\n\n    // Apply time range filter\n    let effectiveTimeRange: { start: number; end: number };\n\n    if (timeRange) {\n      filtered = this.metrics.filter(\n        (m) => m.startTime >= timeRange.start && m.startTime <= timeRange.end,\n      );\n      effectiveTimeRange = timeRange;\n    } else {\n      // Default to last 24 hours\n      const oneDayAgo = Date.now() - 24 * 60 * 60 * 1000;\n      filtered = this.metrics.filter((m) => m.startTime >= oneDayAgo);\n      effectiveTimeRange = { start: oneDayAgo, end: Date.now() };\n    }\n\n    if (filtered.length === 0) {\n      return this.getEmptyAnalytics(effectiveTimeRange);\n    }\n\n    // Calculate summary statistics\n    const uniqueModels = new Set(filtered.map((m) => m.modelId)).size;\n    const uniqueProviders = new Set(filtered.map((m) => m.provider)).size;\n    const totalCost = filtered.reduce((sum, m) => sum + m.cost, 0);\n    const totalTokens = filtered.reduce((sum, m) => sum + m.totalTokens, 0);\n    const timeRangeMinutes = (effectiveTimeRange.end - effectiveTimeRange.start) / 60000;\n    const averageRequestsPerMinute = filtered.length / timeRangeMinutes;\n\n    // Calculate trends\n    const trends = this.calculateTrends(filtered, totalCost);\n\n    // Generate recommendations\n    const recommendations = this.generateRecommendations(filtered, trends);\n\n    return {\n      timeRange: effectiveTimeRange,\n      summary: {\n        totalRequests: filtered.length,\n        uniqueModels,\n        uniqueProviders,\n        totalCost,\n        totalTokens,\n        averageRequestsPerMinute,\n      },\n      trends,\n      recommendations,\n    };\n  }\n\n  /**\n   * Get model usage statistics\n   */\n  getModelUsage(): Map<string, { count: number; cost: number; tokens: number }> {\n    const usage = new Map<string, { count: number; cost: number; tokens: number }>();\n\n    for (const metric of this.metrics) {\n      const existing = usage.get(metric.modelId);\n\n      if (!existing) {\n        usage.set(metric.modelId, {\n          count: 1,\n          cost: metric.cost,\n          tokens: metric.totalTokens,\n        });\n      } else {\n        existing.count++;\n        existing.cost += metric.cost;\n        existing.tokens += metric.totalTokens;\n      }\n    }\n\n    return usage;\n  }\n\n  /**\n   * Get provider usage statistics\n   */\n  getProviderUsage(): Map<string, { count: number; cost: number; successRate: number }> {\n    const usage = new Map<string, { count: number; cost: number; successRate: number }>();\n\n    for (const metric of this.metrics) {\n      const existing = usage.get(metric.provider);\n\n      if (!existing) {\n        usage.set(metric.provider, {\n          count: 1,\n          cost: metric.cost,\n          successRate: metric.success ? 1 : 0,\n        });\n      } else {\n        existing.count++;\n        existing.cost += metric.cost;\n        existing.successRate =\n          (existing.successRate * (existing.count - 1) + (metric.success ? 1 : 0)) / existing.count;\n      }\n    }\n\n    return usage;\n  }\n\n  /**\n   * Get cost trends over time\n   */\n  getCostTrends(\n    granularity: 'hour' | 'day' = 'hour',\n  ): Map<number, { cost: number; requests: number }> {\n    const trends = new Map<number, { cost: number; requests: number }>();\n    const bucketSize = granularity === 'hour' ? 60 * 60 * 1000 : 24 * 60 * 60 * 1000;\n\n    for (const metric of this.metrics) {\n      const bucket = Math.floor(metric.startTime / bucketSize) * bucketSize;\n      const existing = trends.get(bucket);\n\n      if (!existing) {\n        trends.set(bucket, {\n          cost: metric.cost,\n          requests: 1,\n        });\n      } else {\n        existing.cost += metric.cost;\n        existing.requests++;\n      }\n    }\n\n    return trends;\n  }\n\n  /**\n   * Clear all metrics\n   */\n  clear(): void {\n    this.metrics = [];\n    this.emit('analytics:cleared');\n  }\n\n  /**\n   * Calculate trends\n   */\n  private calculateTrends(metrics: RequestMetrics[], totalCost: number): UsageAnalytics['trends'] {\n    // Most used models\n    const modelCounts = new Map<string, number>();\n    for (const metric of metrics) {\n      modelCounts.set(metric.modelId, (modelCounts.get(metric.modelId) || 0) + 1);\n    }\n\n    const mostUsedModels = Array.from(modelCounts.entries())\n      .map(([modelId, count]) => ({\n        modelId,\n        count,\n        percentage: (count / metrics.length) * 100,\n      }))\n      .sort((a, b) => b.count - a.count)\n      .slice(0, 10);\n\n    // Cost by provider\n    const costByProvider = new Map<string, number>();\n    for (const metric of metrics) {\n      costByProvider.set(metric.provider, (costByProvider.get(metric.provider) || 0) + metric.cost);\n    }\n\n    // Requests by hour\n    const requestsByHour = new Map<number, number>();\n    for (const metric of metrics) {\n      const hour = new Date(metric.startTime).getHours();\n      requestsByHour.set(hour, (requestsByHour.get(hour) || 0) + 1);\n    }\n\n    // Success rate\n    const successfulRequests = metrics.filter((m) => m.success).length;\n    const successRate = successfulRequests / metrics.length;\n\n    // Average cost per request\n    const averageCostPerRequest = totalCost / metrics.length;\n\n    return {\n      mostUsedModels,\n      costByProvider,\n      requestsByHour,\n      successRate,\n      averageCostPerRequest,\n    };\n  }\n\n  /**\n   * Generate recommendations based on usage patterns\n   */\n  private generateRecommendations(\n    metrics: RequestMetrics[],\n    trends: UsageAnalytics['trends'],\n  ): UsageAnalytics['recommendations'] {\n    const suggestions: string[] = [];\n    let potentialSavings = 0;\n\n    // Check for high-cost models\n    const modelCosts = new Map<string, { totalCost: number; count: number }>();\n    for (const metric of metrics) {\n      const existing = modelCosts.get(metric.modelId);\n      if (!existing) {\n        modelCosts.set(metric.modelId, { totalCost: metric.cost, count: 1 });\n      } else {\n        existing.totalCost += metric.cost;\n        existing.count++;\n      }\n    }\n\n    // Find expensive models\n    const expensiveModels = Array.from(modelCosts.entries())\n      .filter(([, data]) => data.totalCost / data.count > 0.01) // More than $0.01 per request\n      .sort((a, b) => b[1].totalCost - a[1].totalCost);\n\n    if (expensiveModels.length > 0) {\n      suggestions.push(\n        `Consider using cheaper alternatives for ${expensiveModels[0][0]} (avg cost: $${(expensiveModels[0][1].totalCost / expensiveModels[0][1].count).toFixed(4)}/request)`,\n      );\n      potentialSavings += expensiveModels[0][1].totalCost * 0.3; // Estimate 30% savings\n    }\n\n    // Check success rate\n    if (trends.successRate < 0.95) {\n      suggestions.push(\n        `Success rate is ${(trends.successRate * 100).toFixed(1)}%. Consider implementing fallback strategies.`,\n      );\n    }\n\n    // Check for cache opportunities\n    const duplicateRequests = this.findDuplicatePatterns(metrics);\n    if (duplicateRequests > 0) {\n      suggestions.push(\n        `${duplicateRequests} similar requests detected. Enable caching to reduce costs.`,\n      );\n      potentialSavings += duplicateRequests * trends.averageCostPerRequest * 0.9;\n    }\n\n    return {\n      suggestedModels: this.suggestAlternativeModels(metrics),\n      potentialSavings,\n      optimizationTips: suggestions,\n    };\n  }\n\n  /**\n   * Find duplicate request patterns\n   */\n  private findDuplicatePatterns(metrics: RequestMetrics[]): number {\n    // Simple heuristic: requests within 5 minutes with same model\n    const seen = new Set<string>();\n    let duplicates = 0;\n\n    for (const metric of metrics) {\n      const key = `${metric.modelId}-${Math.floor(metric.startTime / 300000)}`;\n      if (seen.has(key)) {\n        duplicates++;\n      } else {\n        seen.add(key);\n      }\n    }\n\n    return duplicates;\n  }\n\n  /**\n   * Suggest alternative models based on usage\n   */\n  private suggestAlternativeModels(metrics: RequestMetrics[]): string[] {\n    // Analyze token usage patterns\n    const avgTokens = metrics.reduce((sum, m) => sum + m.totalTokens, 0) / metrics.length;\n\n    const suggestions: string[] = [];\n\n    if (avgTokens < 500) {\n      suggestions.push('mistral/mistral-small', 'anthropic/claude-3-haiku');\n    } else if (avgTokens < 2000) {\n      suggestions.push('anthropic/claude-3-sonnet', 'openai/gpt-4o-mini');\n    }\n\n    return suggestions;\n  }\n\n  /**\n   * Get empty analytics object\n   */\n  private getEmptyAnalytics(timeRange: { start: number; end: number }): UsageAnalytics {\n    return {\n      timeRange,\n      summary: {\n        totalRequests: 0,\n        uniqueModels: 0,\n        uniqueProviders: 0,\n        totalCost: 0,\n        totalTokens: 0,\n        averageRequestsPerMinute: 0,\n      },\n      trends: {\n        mostUsedModels: [],\n        costByProvider: new Map(),\n        requestsByHour: new Map(),\n        successRate: 0,\n        averageCostPerRequest: 0,\n      },\n    };\n  }\n}\n","/**\n * Base Provider Interface\n * Abstract class for provider-specific implementations\n */\n\nimport { Logger } from '../utils/logger';\n\nexport interface ProviderConfig {\n  name: string;\n  apiKey?: string;\n  baseURL?: string;\n  timeout?: number;\n  retryAttempts?: number;\n  rateLimit?: {\n    requestsPerSecond: number;\n    tokensPerMinute?: number;\n  };\n}\n\nexport interface ProviderCapabilities {\n  streaming: boolean;\n  vision: boolean;\n  functionCalling: boolean;\n  jsonMode: boolean;\n  tools: boolean;\n  multimodal: boolean;\n}\n\nexport interface ProviderStats {\n  averageLatency: number;\n  successRate: number;\n  totalRequests: number;\n  failedRequests: number;\n  lastError?: string;\n  lastErrorTime?: number;\n}\n\nexport interface ProviderHealth {\n  status: 'healthy' | 'degraded' | 'unhealthy';\n  lastCheck: number;\n  latency?: number;\n  error?: string;\n}\n\nexport abstract class BaseProvider {\n  protected config: ProviderConfig;\n  protected logger: Logger;\n  protected metrics: ProviderStats;\n  protected health: ProviderHealth;\n\n  constructor(config: ProviderConfig, logger?: Logger) {\n    this.config = config;\n    this.logger = logger || new Logger({ enabled: false });\n    this.metrics = {\n      averageLatency: 0,\n      successRate: 100,\n      totalRequests: 0,\n      failedRequests: 0,\n    };\n    this.health = {\n      status: 'healthy',\n      lastCheck: Date.now(),\n    };\n  }\n\n  /**\n   * Get provider name\n   */\n  getName(): string {\n    return this.config.name;\n  }\n\n  /**\n   * Get provider capabilities\n   */\n  abstract getCapabilities(): ProviderCapabilities;\n\n  /**\n   * Get available models for this provider\n   */\n  abstract getModels(): Promise<string[]>;\n\n  /**\n   * Check if provider supports a specific model\n   */\n  abstract supportsModel(modelId: string): boolean;\n\n  /**\n   * Transform OpenRouter request to provider-specific format\n   */\n  abstract transformRequest(request: any): any;\n\n  /**\n   * Transform provider-specific response to OpenRouter format\n   */\n  abstract transformResponse(response: any): any;\n\n  /**\n   * Get provider-specific rate limits\n   */\n  getRateLimits(): { requestsPerSecond: number; tokensPerMinute?: number } {\n    return (\n      this.config.rateLimit || {\n        requestsPerSecond: 10,\n        tokensPerMinute: 100000,\n      }\n    );\n  }\n\n  /**\n   * Get provider statistics\n   */\n  getStats(): ProviderStats {\n    return { ...this.metrics };\n  }\n\n  /**\n   * Get provider health status\n   */\n  getHealth(): ProviderHealth {\n    return { ...this.health };\n  }\n\n  /**\n   * Update metrics after request\n   */\n  protected updateMetrics(success: boolean, latency: number, error?: string): void {\n    this.metrics.totalRequests++;\n\n    if (success) {\n      // Update average latency with exponential moving average\n      this.metrics.averageLatency = this.metrics.averageLatency * 0.9 + latency * 0.1;\n    } else {\n      this.metrics.failedRequests++;\n      this.metrics.lastError = error;\n      this.metrics.lastErrorTime = Date.now();\n    }\n\n    // Calculate success rate\n    this.metrics.successRate =\n      ((this.metrics.totalRequests - this.metrics.failedRequests) / this.metrics.totalRequests) *\n      100;\n  }\n\n  /**\n   * Check provider health\n   */\n  async checkHealth(): Promise<ProviderHealth> {\n    const startTime = Date.now();\n\n    try {\n      // Attempt to get models list as health check\n      await this.getModels();\n\n      const latency = Date.now() - startTime;\n\n      this.health = {\n        status: latency < 1000 ? 'healthy' : 'degraded',\n        lastCheck: Date.now(),\n        latency,\n      };\n    } catch (error) {\n      this.health = {\n        status: 'unhealthy',\n        lastCheck: Date.now(),\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n\n    return this.health;\n  }\n\n  /**\n   * Reset metrics\n   */\n  resetMetrics(): void {\n    this.metrics = {\n      averageLatency: 0,\n      successRate: 100,\n      totalRequests: 0,\n      failedRequests: 0,\n    };\n  }\n}\n","/**\n * OpenAI Provider Implementation\n */\n\nimport { BaseProvider, ProviderCapabilities, ProviderConfig } from '../BaseProvider';\n\nexport class OpenAIProvider extends BaseProvider {\n  constructor(config: Partial<ProviderConfig> = {}) {\n    super({\n      name: 'openai',\n      baseURL: 'https://api.openai.com/v1',\n      rateLimit: {\n        requestsPerSecond: 50,\n        tokensPerMinute: 200000,\n      },\n      ...config,\n    });\n  }\n\n  getCapabilities(): ProviderCapabilities {\n    return {\n      streaming: true,\n      vision: true,\n      functionCalling: true,\n      jsonMode: true,\n      tools: true,\n      multimodal: true,\n    };\n  }\n\n  getModels(): Promise<string[]> {\n    return Promise.resolve([\n      'gpt-4-turbo',\n      'gpt-4',\n      'gpt-4-32k',\n      'gpt-3.5-turbo',\n      'gpt-3.5-turbo-16k',\n      'gpt-4-vision-preview',\n    ]);\n  }\n\n  supportsModel(modelId: string): boolean {\n    return (\n      modelId.startsWith('gpt-') || modelId.startsWith('openai/') || modelId.includes('chatgpt')\n    );\n  }\n\n  transformRequest(request: any): any {\n    // Transform to OpenAI format\n    return {\n      model: request.model?.replace('openai/', ''),\n      messages: request.messages,\n      temperature: request.temperature,\n      max_tokens: request.max_tokens,\n      stream: request.stream,\n      response_format: request.response_format,\n      tools: request.tools,\n    };\n  }\n\n  transformResponse(response: any): any {\n    // OpenRouter already uses OpenAI format\n    return response;\n  }\n}\n","/**\n * Anthropic Provider Implementation\n */\n\nimport { BaseProvider, ProviderCapabilities, ProviderConfig } from '../BaseProvider';\n\nexport class AnthropicProvider extends BaseProvider {\n  constructor(config: Partial<ProviderConfig> = {}) {\n    super({\n      name: 'anthropic',\n      baseURL: 'https://api.anthropic.com/v1',\n      rateLimit: {\n        requestsPerSecond: 30,\n        tokensPerMinute: 150000,\n      },\n      ...config,\n    });\n  }\n\n  getCapabilities(): ProviderCapabilities {\n    return {\n      streaming: true,\n      vision: true,\n      functionCalling: true,\n      jsonMode: false,\n      tools: true,\n      multimodal: true,\n    };\n  }\n\n  getModels(): Promise<string[]> {\n    return Promise.resolve([\n      'claude-3-opus-20240229',\n      'claude-3-sonnet-20240229',\n      'claude-3-haiku-20240307',\n      'claude-2.1',\n      'claude-2.0',\n      'claude-instant-1.2',\n    ]);\n  }\n\n  supportsModel(modelId: string): boolean {\n    return modelId.startsWith('claude-') || modelId.startsWith('anthropic/');\n  }\n\n  transformRequest(request: any): any {\n    // Transform to Anthropic format\n    return {\n      model: request.model?.replace('anthropic/', ''),\n      messages: request.messages,\n      max_tokens: request.max_tokens || 4096,\n      temperature: request.temperature,\n      stream: request.stream,\n      tools: request.tools,\n    };\n  }\n\n  transformResponse(response: any): any {\n    // Transform from Anthropic to OpenRouter format\n    return {\n      id: response.id,\n      model: response.model,\n      choices: [\n        {\n          message: {\n            role: 'assistant',\n            content: response.content?.[0]?.text || '',\n          },\n          finish_reason: response.stop_reason,\n        },\n      ],\n      usage: {\n        prompt_tokens: response.usage?.input_tokens || 0,\n        completion_tokens: response.usage?.output_tokens || 0,\n        total_tokens: (response.usage?.input_tokens || 0) + (response.usage?.output_tokens || 0),\n      },\n    };\n  }\n}\n","/**\n * Meta (Llama) Provider Implementation\n */\n\nimport { BaseProvider, ProviderCapabilities, ProviderConfig } from '../BaseProvider';\n\nexport class LlamaProvider extends BaseProvider {\n  constructor(config: Partial<ProviderConfig> = {}) {\n    super({\n      name: 'meta',\n      rateLimit: {\n        requestsPerSecond: 100,\n        tokensPerMinute: 500000,\n      },\n      ...config,\n    });\n  }\n\n  getCapabilities(): ProviderCapabilities {\n    return {\n      streaming: true,\n      vision: false,\n      functionCalling: false,\n      jsonMode: false,\n      tools: false,\n      multimodal: false,\n    };\n  }\n\n  getModels(): Promise<string[]> {\n    return Promise.resolve([\n      'llama-3-70b-instruct',\n      'llama-3-8b-instruct',\n      'llama-2-70b-chat',\n      'llama-2-13b-chat',\n      'llama-2-7b-chat',\n      'codellama-34b-instruct',\n    ]);\n  }\n\n  supportsModel(modelId: string): boolean {\n    return modelId.startsWith('llama') || modelId.startsWith('meta/');\n  }\n\n  transformRequest(request: any): any {\n    return {\n      model: request.model?.replace('meta/', ''),\n      messages: request.messages,\n      temperature: request.temperature,\n      max_tokens: request.max_tokens,\n      stream: request.stream,\n    };\n  }\n\n  transformResponse(response: any): any {\n    return response;\n  }\n}\n","/**\n * Mistral Provider Implementation\n */\n\nimport { BaseProvider, ProviderCapabilities, ProviderConfig } from '../BaseProvider';\n\nexport class MistralProvider extends BaseProvider {\n  constructor(config: Partial<ProviderConfig> = {}) {\n    super({\n      name: 'mistral',\n      baseURL: 'https://api.mistral.ai/v1',\n      rateLimit: {\n        requestsPerSecond: 40,\n        tokensPerMinute: 200000,\n      },\n      ...config,\n    });\n  }\n\n  getCapabilities(): ProviderCapabilities {\n    return {\n      streaming: true,\n      vision: false,\n      functionCalling: true,\n      jsonMode: true,\n      tools: true,\n      multimodal: false,\n    };\n  }\n\n  getModels(): Promise<string[]> {\n    return Promise.resolve([\n      'mistral-large-latest',\n      'mistral-medium-latest',\n      'mistral-small-latest',\n      'mistral-tiny',\n      'mixtral-8x7b-instruct',\n      'mixtral-8x22b-instruct',\n    ]);\n  }\n\n  supportsModel(modelId: string): boolean {\n    return (\n      modelId.startsWith('mistral') ||\n      modelId.startsWith('mixtral') ||\n      modelId.startsWith('mistral/')\n    );\n  }\n\n  transformRequest(request: any): any {\n    return {\n      model: request.model?.replace('mistral/', ''),\n      messages: request.messages,\n      temperature: request.temperature,\n      max_tokens: request.max_tokens,\n      stream: request.stream,\n      response_format: request.response_format,\n      tools: request.tools,\n    };\n  }\n\n  transformResponse(response: any): any {\n    return response;\n  }\n}\n","/**\n * Cohere Provider Implementation\n */\n\nimport { BaseProvider, ProviderCapabilities, ProviderConfig } from '../BaseProvider';\n\nexport class CohereProvider extends BaseProvider {\n  constructor(config: Partial<ProviderConfig> = {}) {\n    super({\n      name: 'cohere',\n      baseURL: 'https://api.cohere.ai/v1',\n      rateLimit: {\n        requestsPerSecond: 25,\n        tokensPerMinute: 100000,\n      },\n      ...config,\n    });\n  }\n\n  getCapabilities(): ProviderCapabilities {\n    return {\n      streaming: true,\n      vision: false,\n      functionCalling: false,\n      jsonMode: false,\n      tools: false,\n      multimodal: false,\n    };\n  }\n\n  getModels(): Promise<string[]> {\n    return Promise.resolve(['command-r-plus', 'command-r', 'command', 'command-light']);\n  }\n\n  supportsModel(modelId: string): boolean {\n    return modelId.startsWith('command') || modelId.startsWith('cohere/');\n  }\n\n  transformRequest(request: any): any {\n    // Cohere uses different parameter names\n    return {\n      model: request.model?.replace('cohere/', ''),\n      message: request.messages?.[request.messages.length - 1]?.content || '',\n      chat_history: request.messages?.slice(0, -1).map((m: any) => ({\n        role: m.role === 'assistant' ? 'CHATBOT' : 'USER',\n        message: m.content,\n      })),\n      temperature: request.temperature,\n      max_tokens: request.max_tokens,\n      stream: request.stream,\n    };\n  }\n\n  transformResponse(response: any): any {\n    // Transform from Cohere to OpenRouter format\n    return {\n      id: response.generation_id || response.id,\n      model: response.model,\n      choices: [\n        {\n          message: {\n            role: 'assistant',\n            content: response.text || response.message || '',\n          },\n          finish_reason: response.finish_reason || 'stop',\n        },\n      ],\n      usage: {\n        prompt_tokens: response.meta?.tokens?.input_tokens || 0,\n        completion_tokens: response.meta?.tokens?.output_tokens || 0,\n        total_tokens:\n          (response.meta?.tokens?.input_tokens || 0) + (response.meta?.tokens?.output_tokens || 0),\n      },\n    };\n  }\n}\n","/**\n * Provider Registry\n * Manages all available providers and their instances\n */\n\nimport { BaseProvider } from './BaseProvider';\nimport {\n  OpenAIProvider,\n  AnthropicProvider,\n  LlamaProvider,\n  MistralProvider,\n  CohereProvider,\n} from './providers';\nimport { Logger } from '../utils/logger';\n\nexport interface ProviderRegistryOptions {\n  logger?: Logger;\n  defaultProviders?: boolean;\n}\n\nexport class ProviderRegistry {\n  private providers: Map<string, BaseProvider>;\n  private logger: Logger;\n\n  constructor(options: ProviderRegistryOptions = {}) {\n    this.providers = new Map();\n    this.logger = options.logger || new Logger({ enabled: false });\n\n    if (options.defaultProviders !== false) {\n      this.registerDefaultProviders();\n    }\n  }\n\n  /**\n   * Register default providers\n   */\n  private registerDefaultProviders(): void {\n    this.register(new OpenAIProvider());\n    this.register(new AnthropicProvider());\n    this.register(new LlamaProvider());\n    this.register(new MistralProvider());\n    this.register(new CohereProvider());\n\n    this.logger.info('Registered default providers', {\n      count: this.providers.size,\n      providers: Array.from(this.providers.keys()),\n    });\n  }\n\n  /**\n   * Register a provider\n   */\n  register(provider: BaseProvider): void {\n    const name = provider.getName();\n    this.providers.set(name, provider);\n    this.logger.debug(`Registered provider: ${name}`);\n  }\n\n  /**\n   * Unregister a provider\n   */\n  unregister(providerName: string): boolean {\n    const result = this.providers.delete(providerName);\n    if (result) {\n      this.logger.debug(`Unregistered provider: ${providerName}`);\n    }\n    return result;\n  }\n\n  /**\n   * Get a provider by name\n   */\n  getProvider(name: string): BaseProvider | undefined {\n    return this.providers.get(name);\n  }\n\n  /**\n   * Get all providers\n   */\n  getAllProviders(): BaseProvider[] {\n    return Array.from(this.providers.values());\n  }\n\n  /**\n   * Get provider for a specific model\n   */\n  getProviderForModel(modelId: string): BaseProvider | undefined {\n    for (const provider of this.providers.values()) {\n      if (provider.supportsModel(modelId)) {\n        return provider;\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Get all available models across all providers\n   */\n  async getAllModels(): Promise<Map<string, string[]>> {\n    const modelsByProvider = new Map<string, string[]>();\n\n    for (const provider of this.providers.values()) {\n      try {\n        const models = await provider.getModels();\n        modelsByProvider.set(provider.getName(), models);\n      } catch (error) {\n        this.logger.warn(`Failed to get models from ${provider.getName()}`, { error });\n      }\n    }\n\n    return modelsByProvider;\n  }\n\n  /**\n   * Check health of all providers\n   */\n  async checkAllHealth(): Promise<Map<string, any>> {\n    const healthStatus = new Map();\n\n    const checks = Array.from(this.providers.values()).map(async (provider) => {\n      const name = provider.getName();\n      try {\n        const health = await provider.checkHealth();\n        healthStatus.set(name, health);\n      } catch (error) {\n        healthStatus.set(name, {\n          status: 'unhealthy',\n          error: error instanceof Error ? error.message : 'Unknown error',\n          lastCheck: Date.now(),\n        });\n      }\n    });\n\n    await Promise.all(checks);\n    return healthStatus;\n  }\n\n  /**\n   * Get statistics from all providers\n   */\n  getAllStats(): Map<string, any> {\n    const stats = new Map();\n\n    for (const provider of this.providers.values()) {\n      stats.set(provider.getName(), provider.getStats());\n    }\n\n    return stats;\n  }\n\n  /**\n   * Get healthy providers only\n   */\n  getHealthyProviders(): BaseProvider[] {\n    return Array.from(this.providers.values()).filter((provider) => {\n      const health = provider.getHealth();\n      return health.status === 'healthy' || health.status === 'degraded';\n    });\n  }\n\n  /**\n   * Get providers by capability\n   */\n  getProvidersByCapability(capability: string): BaseProvider[] {\n    return Array.from(this.providers.values()).filter((provider) => {\n      const capabilities = provider.getCapabilities();\n      return (capabilities as any)[capability];\n    });\n  }\n\n  /**\n   * Clear all providers\n   */\n  clear(): void {\n    this.providers.clear();\n    this.logger.debug('Cleared all providers');\n  }\n}\n"]}