{"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"],"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"]}