{"version":3,"sources":["../../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/utils/errors.ts","../../src/utils/logger.ts","../../src/models/ModelSelector.ts","../../src/models/strategies/CascadingStrategy.ts","../../src/models/strategies/WeightedStrategy.ts","../../src/models/strategies/ContextAwareStrategy.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["[\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","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 { 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 * 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"]}