{"version":3,"sources":["../../src/monitoring/analytics.ts","../../src/monitoring/performance-monitor.ts","../../src/providers/anthropic-provider.ts","../../src/providers/base-provider.ts","../../src/providers/google-provider.ts","../../src/providers/mock-provider.ts","../../src/providers/openai-provider.ts","../../src/core/cache-manager.ts","../../src/types/index.ts","../../src/core/config-manager.ts","../../src/core/error-handler.ts","../../src/core/rate-limiter.ts","../../src/core/retry-manager.ts","../../src/core/token-manager.ts","../../src/core/ai-engine.ts","../../src/react/hooks/useAI.ts"],"names":["Analytics","event","fullEvent","providerStats","prevTotal","modelStats","provider","providerEvents","e","errors","total","existingError","a","b","interval","limit","intervalMs","now","trends","endTime","startTime","periodEvents","eventTime","successEvents","sum","count","operation","byOperation","acc","stats","model","providers","speedRanked","reliabilityRanked","costRanked","speedRank","p","reliabilityRank","costRank","recommendations","providerComparison","cacheHits","totalRequests","PerformanceMonitor","operationId","metadata","success","error","metrics","report","filters","cutoff","relevantReports","r","latencies","successCount","totalCount","l","operations","errorCounts","errorsByProvider","commonErrors","errorsByType","threshold","defaultThreshold","slowThreshold","values","percentile","index","issues","BaseProvider","config","additionalHeaders","url","options","timeout","controller","timeoutId","response","errorMessage","errorData","_prompt","_options","_text","_labels","_image","_audio","_code","_language","AnthropicProvider","Anthropic","prompt","block","stream","text","labels","jsonMatch","label","systemPrompt","fullPrompt","code","language","GoogleProvider","GoogleGenerativeAI","modelName","generationConfig","result","chunk","image","base64Image","buffer","features","responseText","MockProvider","customDelay","delayTime","resolve","predefinedResponse","variation","words","word","hash","char","_","i","textLength","hasPositiveWords","hasNegativeWords","selectedIndex","scores","score","key","selectedLabel","positiveWords","negativeWords","sentiment","size","style","includeComments","tests","lines","hasFunction","hasClass","value","OpenAIProvider","OpenAI","content","audio","file","transcription","w","arrayBuffer","CacheManager","maxSizeBytes","LRUCache","entry","method","params","keyData","crypto","hitRate","entries","beforeSize","enabled","ttl","fn","cached","data","RateLimitConfigSchema","z","CacheConfigSchema","RetryConfigSchema","AIConfigSchema","ConfigManager","targetProvider","encryptedKey","updates","newConfig","apiKey","apiKeys","safeConfig","ErrorHandler","context","enhancedError","VError","category","message","boomError","Boom","timeWindow","relevantErrors","resolved","errorId","RateLimiter","existingLimiter","limiterConfig","limiter","Bottleneck","id","limiterId","priority","tokens","bucket","counts","reservoir","limiterStats","mergedConfig","stopPromises","requestsPerMinute","minTime","refillRate","TokenBucket","_id","amount","tokensToAdd","RetryManager","mergedOptions","pRetry","attemptNumber","wrappedError","AbortError","backOff","shouldRetry","attempt","args","delay","jitter","errorType","suggestedDelay","TokenManager","encode","encoder","encoding_for_model","get_encoding","maxTokens","responseTokens","promptTokens","modelLimit","valid","availableTokens","preserveEnd","low","high","bestFit","mid","substring","chunkSize","overlap","chunks","sentences","currentChunk","currentTokens","sentence","sentenceTokens","overlapTokens","overlapText","type","pricing","messages","totalTokens","AIEngine","mainProvider","fallbackProviders","allProviders","providerType","providerConfig","rateLimitConfig","mainType","fallbacks","fallbackType","fallbackProvider","execute","perfReport","cacheKey","estimatedTokens","usage","cost","globalEngine","useAI","loading","setLoading","useState","setError","setStats","engineRef","useRef","useEffect","handleError","useCallback","err","wrapAsync","generateText","genOptions","generateStream","summarize","sumOptions","classifyText","generateEmbedding","generateImage","imgOptions","transcribeAudio","transcriptionOptions","generateSpeech","speechOptions","generateCode","codeOptions","updateConfig","reset","useAIChat","setMessages","sendMessage","userMessage","prev","msg","assistantMessage","clearMessages","useAIEmbeddings","findSimilar","query","items","topK","queryEmbedding","itemEmbeddings","item","similarities","cosineSimilarity","dotProduct","normA","normB","minLength","aVal","bVal","denominator"],"mappings":"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","file":"index.cjs","sourcesContent":["import { AIUsageStats, ProviderStats } from \"../types\";\n\ninterface AnalyticsEvent {\n  timestamp: Date;\n  type: \"request\" | \"success\" | \"error\" | \"cache_hit\" | \"rate_limit\";\n  provider: string;\n  operation: string;\n  model?: string;\n  tokens?: {\n    prompt: number;\n    completion: number;\n    total: number;\n  };\n  cost?: number;\n  latency?: number;\n  error?: string;\n  metadata?: Record<string, any>;\n}\n\ninterface UsageTrend {\n  timestamp: string;\n  requests: number;\n  tokens: number;\n  cost: number;\n  errors: number;\n}\n\nexport class Analytics {\n  private events: AnalyticsEvent[] = [];\n  private maxEvents = 100000;\n  private stats: AIUsageStats = {\n    tokensUsed: 0,\n    requestsCount: 0,\n    costEstimate: 0,\n    lastReset: new Date(),\n    byProvider: {},\n    byModel: {},\n    byCapability: {},\n    errors: [],\n  };\n\n  /**\n   * Track an analytics event\n   */\n  trackEvent(event: Omit<AnalyticsEvent, \"timestamp\">): void {\n    const fullEvent: AnalyticsEvent = {\n      ...event,\n      timestamp: new Date(),\n    };\n\n    this.events.push(fullEvent);\n\n    // Update statistics\n    this.updateStats(fullEvent);\n\n    // Maintain event size\n    if (this.events.length > this.maxEvents) {\n      this.events = this.events.slice(-this.maxEvents / 2);\n    }\n  }\n\n  /**\n   * Update statistics based on event\n   */\n  private updateStats(event: AnalyticsEvent): void {\n    if (!this.stats.byProvider) {\n      console.warn(\"No provider stats initialized.\");\n      return;\n    }\n\n    // Update global stats\n    if (event.type === \"success\") {\n      this.stats.requestsCount++;\n\n      if (event.tokens) {\n        this.stats.tokensUsed += event.tokens.total;\n      }\n\n      if (event.cost) {\n        this.stats.costEstimate += event.cost;\n      }\n    }\n\n    // Update provider stats\n    if (!this.stats.byProvider[event.provider]) {\n      this.stats.byProvider[event.provider] = {\n        requests: 0,\n        tokens: 0,\n        cost: 0,\n        averageLatency: 0,\n        errorRate: 0,\n      };\n    }\n\n    const providerStats = this.stats.byProvider[event.provider];\n\n    if (!providerStats) {\n      console.warn(`Unknown provider ${event.provider}.`);\n      return;\n    }\n\n    if (event.type === \"success\" || event.type === \"error\") {\n      providerStats.requests++;\n    }\n\n    if (event.type === \"success\") {\n      if (event.tokens) {\n        providerStats.tokens += event.tokens.total;\n      }\n      if (event.cost) {\n        providerStats.cost += event.cost;\n      }\n      if (event.latency) {\n        // Update average latency\n        const prevTotal =\n          providerStats.averageLatency * (providerStats.requests - 1);\n        providerStats.averageLatency =\n          (prevTotal + event.latency) / providerStats.requests;\n      }\n    }\n\n    if (event.type === \"error\") {\n      providerStats.errorRate = this.calculateErrorRate(event.provider);\n    }\n\n    if (!this.stats.byModel) {\n      console.warn(\"No model stats initialized.\");\n      return;\n    }\n\n    // Update model stats\n    if (event.model) {\n      if (!this.stats.byModel[event.model]) {\n        this.stats.byModel[event.model] = {\n          requests: 0,\n          tokens: 0,\n          inputTokens: 0,\n          outputTokens: 0,\n          cost: 0,\n        };\n      }\n\n      const modelStats = this.stats.byModel[event.model];\n\n      if (!modelStats) {\n        console.warn(`Unknown model ${event.model}.`);\n        return;\n      }\n      if (event.type === \"success\") {\n        modelStats.requests++;\n\n        if (event.tokens) {\n          modelStats.tokens += event.tokens.total;\n          modelStats.inputTokens += event.tokens.prompt;\n          modelStats.outputTokens += event.tokens.completion;\n        }\n\n        if (event.cost) {\n          modelStats.cost += event.cost;\n        }\n      }\n    }\n\n    // Update capability stats\n    if (!this.stats.byCapability) {\n      console.warn(\"No capability stats initialized.\");\n      return;\n    }\n\n    if (!this.stats.byCapability[event.operation]) {\n      this.stats.byCapability[event.operation] = 0;\n    }\n\n    if (event.type === \"success\") {\n      (this.stats.byCapability[event.operation] as number)++;\n    }\n\n    // Update error stats\n    if (event.type === \"error\" && event.error) {\n      this.updateErrorStats(event);\n    }\n  }\n\n  /**\n   * Calculate error rate for a provider\n   */\n  private calculateErrorRate(provider: string): number {\n    const providerEvents = this.events.filter((e) => e.provider === provider);\n    const errors = providerEvents.filter((e) => e.type === \"error\").length;\n    const total = providerEvents.filter(\n      (e) => e.type === \"success\" || e.type === \"error\"\n    ).length;\n\n    return total > 0 ? errors / total : 0;\n  }\n\n  /**\n   * Update error statistics\n   */\n  private updateErrorStats(event: AnalyticsEvent): void {\n    if (!event.error) return;\n\n    const existingError = this.stats.errors?.find(\n      (e) => e.error === event.error && e.provider === event.provider\n    );\n\n    if (existingError) {\n      existingError.count++;\n    } else {\n      this.stats.errors?.push({\n        timestamp: event.timestamp,\n        provider: event.provider,\n        error: event.error,\n        count: 1,\n      });\n    }\n\n    // Keep only recent errors\n    if (this.stats.errors && this.stats.errors.length > 100) {\n      this.stats.errors = this.stats.errors\n        .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n        .slice(0, 50);\n    }\n  }\n\n  /**\n   * Get current usage statistics\n   */\n  getStats(): AIUsageStats {\n    return {\n      ...this.stats,\n      byProvider: { ...this.stats.byProvider },\n      byModel: { ...this.stats.byModel },\n      byCapability: { ...this.stats.byCapability },\n      errors: [...(this.stats.errors || [])],\n    };\n  }\n\n  /**\n   * Get usage trends over time\n   */\n  getTrends(\n    interval: \"hour\" | \"day\" | \"week\" | \"month\" = \"day\",\n    limit: number = 30\n  ): UsageTrend[] {\n    const intervalMs = {\n      hour: 3600000,\n      day: 86400000,\n      week: 604800000,\n      month: 2592000000,\n    }[interval];\n\n    const now = Date.now();\n    const trends: UsageTrend[] = [];\n\n    for (let i = 0; i < limit; i++) {\n      const endTime = now - i * intervalMs;\n      const startTime = endTime - intervalMs;\n\n      const periodEvents = this.events.filter((e) => {\n        const eventTime = e.timestamp.getTime();\n        return eventTime >= startTime && eventTime < endTime;\n      });\n\n      const successEvents = periodEvents.filter((e) => e.type === \"success\");\n\n      trends.unshift({\n        timestamp: new Date(endTime).toISOString(),\n        requests: successEvents.length,\n        tokens: successEvents.reduce(\n          (sum, e) => sum + (e.tokens?.total || 0),\n          0\n        ),\n        cost: successEvents.reduce((sum, e) => sum + (e.cost || 0), 0),\n        errors: periodEvents.filter((e) => e.type === \"error\").length,\n      });\n    }\n\n    return trends;\n  }\n\n  /**\n   * Get top operations by usage\n   */\n  getTopOperations(limit: number = 10): Array<{\n    operation: string;\n    count: number;\n    percentage: number;\n  }> {\n    if (!this.stats.byCapability) return []; // Return empty array if no capabilities are tracked\n\n    const total = Object.values(this.stats.byCapability).reduce(\n      (sum, count) => sum + count,\n      0\n    );\n\n    return Object.entries(this.stats.byCapability)\n      .map(([operation, count]) => ({\n        operation,\n        count,\n        percentage: total > 0 ? (count / total) * 100 : 0,\n      }))\n      .sort((a, b) => b.count - a.count)\n      .slice(0, limit);\n  }\n\n  /**\n   * Get cost breakdown\n   */\n  getCostBreakdown(): {\n    total: number;\n    byProvider: Record<string, number>;\n    byModel: Record<string, number>;\n    byOperation: Record<string, number>;\n  } {\n    if (!this.stats.byProvider || !this.stats.byModel) return {} as any; // Return empty object if no providers are tracked\n\n    const byOperation: Record<string, number> = {};\n\n    // Calculate cost by operation\n    this.events\n      .filter((e) => e.type === \"success\" && e.cost)\n      .forEach((e) => {\n        byOperation[e.operation] =\n          (byOperation[e.operation] || 0) + (e.cost || 0);\n      });\n\n    return {\n      total: this.stats.costEstimate,\n      byProvider: Object.entries(this.stats.byProvider).reduce(\n        (acc, [provider, stats]) => {\n          acc[provider] = stats.cost;\n          return acc;\n        },\n        {} as Record<string, number>\n      ),\n      byModel: Object.entries(this.stats.byModel).reduce(\n        (acc, [model, stats]) => {\n          acc[model] = stats.cost;\n          return acc;\n        },\n        {} as Record<string, number>\n      ),\n      byOperation,\n    };\n  }\n\n  /**\n   * Get provider comparison\n   */\n  getProviderComparison(): Array<{\n    provider: string;\n    stats: ProviderStats;\n    rank: {\n      speed: number;\n      reliability: number;\n      cost: number;\n      overall: number;\n    };\n  }> {\n    if (!this.stats.byProvider) return []; // Return empty array if no providers are tracked\n\n    const providers = Object.entries(this.stats.byProvider).map(\n      ([provider, stats]) => ({\n        provider,\n        stats,\n      })\n    );\n\n    // Rank by different metrics\n    const speedRanked = [...providers].sort(\n      (a, b) => a.stats.averageLatency - b.stats.averageLatency\n    );\n    const reliabilityRanked = [...providers].sort(\n      (a, b) => a.stats.errorRate - b.stats.errorRate\n    );\n    const costRanked = [...providers].sort(\n      (a, b) => a.stats.cost / a.stats.tokens - b.stats.cost / b.stats.tokens\n    );\n\n    return providers.map(({ provider, stats }) => {\n      const speedRank =\n        speedRanked.findIndex((p) => p.provider === provider) + 1;\n      const reliabilityRank =\n        reliabilityRanked.findIndex((p) => p.provider === provider) + 1;\n      const costRank = costRanked.findIndex((p) => p.provider === provider) + 1;\n\n      return {\n        provider,\n        stats,\n        rank: {\n          speed: speedRank,\n          reliability: reliabilityRank,\n          cost: costRank,\n          overall: Math.round((speedRank + reliabilityRank + costRank) / 3),\n        },\n      };\n    });\n  }\n\n  /**\n   * Get recommendations based on usage\n   */\n  getRecommendations(): string[] {\n    const recommendations: string[] = [];\n    const stats = this.getStats();\n    const providerComparison = this.getProviderComparison();\n\n    // Cost optimization\n    if (stats.costEstimate > 100) {\n      recommendations.push(\n        \"Consider using cheaper models for simple tasks to reduce costs\"\n      );\n    }\n\n    // Provider recommendations\n    providerComparison.forEach(({ provider, stats }) => {\n      if (stats.errorRate > 0.05) {\n        recommendations.push(\n          `${provider} has high error rate (${(stats.errorRate * 100).toFixed(1)}%). Consider using fallback providers.`\n        );\n      }\n\n      if (stats.averageLatency > 5000) {\n        recommendations.push(\n          `${provider} has high latency. Enable caching for frequently used prompts.`\n        );\n      }\n    });\n\n    // Cache recommendations\n    const cacheHits = this.events.filter((e) => e.type === \"cache_hit\").length;\n    const totalRequests = stats.requestsCount;\n    const cacheHitRate = totalRequests > 0 ? cacheHits / totalRequests : 0;\n\n    if (cacheHitRate < 0.2 && totalRequests > 100) {\n      recommendations.push(\n        \"Low cache hit rate. Consider increasing cache TTL or size.\"\n      );\n    }\n\n    // Rate limit recommendations\n    const rateLimitEvents = this.events.filter(\n      (e) => e.type === \"rate_limit\"\n    ).length;\n    if (rateLimitEvents > 10) {\n      recommendations.push(\n        \"Frequent rate limiting detected. Implement request queuing or upgrade API limits.\"\n      );\n    }\n\n    return recommendations;\n  }\n\n  /**\n   * Reset statistics\n   */\n  reset(): void {\n    this.stats = {\n      tokensUsed: 0,\n      requestsCount: 0,\n      costEstimate: 0,\n      lastReset: new Date(),\n      byProvider: {},\n      byModel: {},\n      byCapability: {},\n      errors: [],\n    };\n    this.events = [];\n  }\n\n  /**\n   * Export analytics data\n   */\n  exportData(): {\n    stats: AIUsageStats;\n    trends: UsageTrend[];\n    // topOperations: ReturnType<AnalyticsManager[\"getTopOperations\"]>;\n    topOperations: ReturnType<any>;\n    // costBreakdown: ReturnType<AnalyticsManager[\"getCostBreakdown\"]>;\n    costBreakdown: ReturnType<any>;\n    // providerComparison: ReturnType<AnalyticsManager[\"getProviderComparison\"]>;\n    providerComparison: ReturnType<any>;\n    recommendations: string[];\n  } {\n    return {\n      stats: this.getStats(),\n      trends: this.getTrends(),\n      topOperations: this.getTopOperations(),\n      costBreakdown: this.getCostBreakdown(),\n      providerComparison: this.getProviderComparison(),\n      recommendations: this.getRecommendations(),\n    };\n  }\n}\n","interface PerformanceMetrics {\n  operationId: string;\n  operation: string;\n  provider: string;\n  startTime: number;\n  endTime?: number;\n  duration?: number;\n  success: boolean;\n  error?: string;\n  metadata?: Record<string, any>;\n}\n\ninterface PerformanceReport {\n  operationId: string;\n  operation: string;\n  provider: string;\n  duration: number;\n  success: boolean;\n  error?: string;\n  timestamp: string;\n}\n\ninterface PerformanceStats {\n  averageLatency: number;\n  minLatency: number;\n  maxLatency: number;\n  successRate: number;\n  errorRate: number;\n  throughput: number;\n  percentiles: {\n    p50: number;\n    p90: number;\n    p95: number;\n    p99: number;\n  };\n}\n\nexport class PerformanceMonitor {\n  private metrics = new Map<string, PerformanceMetrics>();\n  private history: PerformanceReport[] = [];\n  private maxHistorySize = 10000;\n  private windowSize = 300000; // 5 minutes\n\n  /**\n   * Start monitoring an operation\n   */\n  startOperation(\n    operationId: string,\n    operation: string,\n    provider: string,\n    metadata?: Record<string, any>\n  ): void {\n    this.metrics.set(operationId, {\n      operationId,\n      operation,\n      provider,\n      startTime: performance.now(),\n      success: false,\n      metadata,\n    });\n  }\n\n  /**\n   * End monitoring an operation\n   */\n  endOperation(\n    operationId: string,\n    success: boolean = true,\n    error?: string\n  ): PerformanceReport | null {\n    const metrics = this.metrics.get(operationId);\n    if (!metrics) return null;\n\n    metrics.endTime = performance.now();\n    metrics.duration = metrics.endTime - metrics.startTime;\n    metrics.success = success;\n    metrics.error = error;\n\n    const report: PerformanceReport = {\n      operationId: metrics.operationId,\n      operation: metrics.operation,\n      provider: metrics.provider,\n      duration: metrics.duration,\n      success: metrics.success,\n      error: metrics.error,\n      timestamp: new Date().toISOString(),\n    };\n\n    this.history.push(report);\n    this.metrics.delete(operationId);\n\n    // Maintain history size\n    if (this.history.length > this.maxHistorySize) {\n      this.history = this.history.slice(-this.maxHistorySize / 2);\n    }\n\n    return report;\n  }\n\n  /**\n   * Get performance statistics\n   */\n  getStats(filters?: {\n    provider?: string;\n    operation?: string;\n    timeWindow?: number;\n  }): PerformanceStats {\n    const cutoff = Date.now() - (filters?.timeWindow || this.windowSize);\n\n    let relevantReports = this.history.filter(\n      (report) => new Date(report.timestamp).getTime() > cutoff\n    );\n\n    if (filters?.provider) {\n      relevantReports = relevantReports.filter(\n        (r) => r.provider === filters.provider\n      );\n    }\n\n    if (filters?.operation) {\n      relevantReports = relevantReports.filter(\n        (r) => r.operation === filters.operation\n      );\n    }\n\n    if (relevantReports.length === 0) {\n      return {\n        averageLatency: 0,\n        minLatency: 0,\n        maxLatency: 0,\n        successRate: 0,\n        errorRate: 0,\n        throughput: 0,\n        percentiles: { p50: 0, p90: 0, p95: 0, p99: 0 },\n      };\n    }\n\n    // Calculate metrics\n    const latencies = relevantReports\n      .map((r) => r.duration)\n      .sort((a, b) => a - b);\n    const successCount = relevantReports.filter((r) => r.success).length;\n    const totalCount = relevantReports.length;\n\n    return {\n      averageLatency:\n        latencies.reduce((sum, l) => sum + l, 0) / latencies.length,\n      minLatency: latencies[0] ?? 0,\n      maxLatency: latencies[latencies.length - 1] ?? 0,\n      successRate: successCount / totalCount,\n      errorRate: (totalCount - successCount) / totalCount,\n      throughput:\n        totalCount / ((filters?.timeWindow || this.windowSize) / 1000), // per second\n      percentiles: {\n        p50: this.getPercentile(latencies, 50),\n        p90: this.getPercentile(latencies, 90),\n        p95: this.getPercentile(latencies, 95),\n        p99: this.getPercentile(latencies, 99),\n      },\n    };\n  }\n\n  /**\n   * Get performance by provider\n   */\n  getStatsByProvider(): Record<string, PerformanceStats> {\n    const providers = new Set(this.history.map((r) => r.provider));\n    const stats: Record<string, PerformanceStats> = {};\n\n    for (const provider of providers) {\n      stats[provider] = this.getStats({ provider });\n    }\n\n    return stats;\n  }\n\n  /**\n   * Get performance by operation\n   */\n  getStatsByOperation(): Record<string, PerformanceStats> {\n    const operations = new Set(this.history.map((r) => r.operation));\n    const stats: Record<string, PerformanceStats> = {};\n\n    for (const operation of operations) {\n      stats[operation] = this.getStats({ operation });\n    }\n\n    return stats;\n  }\n\n  /**\n   * Get performance trends\n   */\n  getTrends(\n    interval: \"minute\" | \"hour\" | \"day\" = \"hour\",\n    limit: number = 24\n  ): Array<{\n    timestamp: string;\n    stats: PerformanceStats;\n  }> {\n    const intervalMs = {\n      minute: 60000,\n      hour: 3600000,\n      day: 86400000,\n    }[interval];\n\n    const now = Date.now();\n    const trends: Array<{ timestamp: string; stats: PerformanceStats }> = [];\n\n    for (let i = 0; i < limit; i++) {\n      const endTime = now - i * intervalMs;\n      const startTime = endTime - intervalMs;\n\n      const stats = this.getStats({ timeWindow: now - startTime });\n\n      trends.unshift({\n        timestamp: new Date(endTime).toISOString(),\n        stats,\n      });\n    }\n\n    return trends;\n  }\n\n  /**\n   * Get error analysis\n   */\n  getErrorAnalysis(): {\n    totalErrors: number;\n    errorsByType: Record<string, number>;\n    errorsByProvider: Record<string, number>;\n    commonErrors: Array<{ error: string; count: number }>;\n  } {\n    const errors = this.history.filter((r) => !r.success && r.error);\n    const errorCounts = new Map<string, number>();\n    const errorsByProvider: Record<string, number> = {};\n\n    for (const report of errors) {\n      if (report.error) {\n        errorCounts.set(report.error, (errorCounts.get(report.error) || 0) + 1);\n        errorsByProvider[report.provider] =\n          (errorsByProvider[report.provider] || 0) + 1;\n      }\n    }\n\n    // Get common errors\n    const commonErrors = Array.from(errorCounts.entries())\n      .map(([error, count]) => ({ error, count }))\n      .sort((a, b) => b.count - a.count)\n      .slice(0, 10);\n\n    // Categorize errors\n    const errorsByType: Record<string, number> = {\n      timeout: 0,\n      rateLimit: 0,\n      authentication: 0,\n      network: 0,\n      other: 0,\n    };\n\n    for (const [error, count] of errorCounts) {\n      if (error.includes(\"timeout\"))\n        errorsByType.timeout = (errorsByType.timeout ?? 0) + count;\n      else if (error.includes(\"rate limit\"))\n        errorsByType.rateLimit = (errorsByType.rateLimit ?? 0) + count;\n      else if (error.includes(\"auth\") || error.includes(\"401\"))\n        errorsByType.authentication =\n          (errorsByType.authentication ?? 0) + count;\n      else if (error.includes(\"network\"))\n        errorsByType.network = (errorsByType.network ?? 0) + count;\n      else errorsByType.other = (errorsByType.other ?? 0) + count;\n    }\n\n    return {\n      totalErrors: errors.length,\n      errorsByType,\n      errorsByProvider,\n      commonErrors,\n    };\n  }\n\n  /**\n   * Get slow operations\n   */\n  getSlowOperations(threshold?: number): PerformanceReport[] {\n    const defaultThreshold = this.getStats().percentiles.p95;\n    const slowThreshold = threshold || defaultThreshold || 5000;\n\n    return this.history\n      .filter((r) => r.duration > slowThreshold)\n      .sort((a, b) => b.duration - a.duration)\n      .slice(0, 100);\n  }\n\n  /**\n   * Calculate percentile\n   */\n  private getPercentile(values: number[], percentile: number): number {\n    const index = Math.ceil((percentile / 100) * values.length) - 1;\n    return values[Math.max(0, index)] ?? 0;\n  }\n\n  /**\n   * Clear history\n   */\n  clearHistory(): void {\n    this.history = [];\n    this.metrics.clear();\n  }\n\n  /**\n   * Export performance data\n   */\n  exportData(): {\n    history: PerformanceReport[];\n    stats: PerformanceStats;\n    statsByProvider: Record<string, PerformanceStats>;\n    statsByOperation: Record<string, PerformanceStats>;\n    errorAnalysis: ReturnType<PerformanceMonitor[\"getErrorAnalysis\"]>;\n  } {\n    return {\n      history: this.history,\n      stats: this.getStats(),\n      statsByProvider: this.getStatsByProvider(),\n      statsByOperation: this.getStatsByOperation(),\n      errorAnalysis: this.getErrorAnalysis(),\n    };\n  }\n\n  /**\n   * Get active operations\n   */\n  getActiveOperations(): PerformanceMetrics[] {\n    return Array.from(this.metrics.values());\n  }\n\n  /**\n   * Check health status\n   */\n  getHealthStatus(): {\n    status: \"healthy\" | \"degraded\" | \"unhealthy\";\n    issues: string[];\n  } {\n    const stats = this.getStats();\n    const issues: string[] = [];\n\n    // Check success rate\n    if (stats.successRate < 0.95) {\n      issues.push(`Low success rate: ${(stats.successRate * 100).toFixed(1)}%`);\n    }\n\n    // Check latency\n    if (stats.percentiles.p95 > 5000) {\n      issues.push(`High P95 latency: ${stats.percentiles.p95.toFixed(0)}ms`);\n    }\n\n    // Check throughput\n    if (stats.throughput < 0.1) {\n      issues.push(`Low throughput: ${stats.throughput.toFixed(2)} req/s`);\n    }\n\n    const status =\n      issues.length === 0\n        ? \"healthy\"\n        : issues.length === 1\n          ? \"degraded\"\n          : \"unhealthy\";\n\n    return { status, issues };\n  }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport { Classification, GenerateOptions, SummarizeOptions } from \"../types\";\nimport { BaseProvider, ProviderConfig } from \"./base-provider\";\n\nexport class AnthropicProvider extends BaseProvider {\n  private client: Anthropic;\n\n  constructor(config: ProviderConfig) {\n    super(config);\n    this.validateApiKey();\n\n    this.client = new Anthropic({\n      apiKey: this.config.apiKey!,\n      baseURL: this.config.baseUrl,\n      timeout: this.config.timeout,\n      maxRetries: this.config.maxRetries || 2,\n    });\n  }\n\n  protected getDefaultModel(): string {\n    return \"claude-3-sonnet-20240229\";\n  }\n\n  /**\n   * Generate text completion\n   */\n  override async generateText(\n    prompt: string,\n    options?: GenerateOptions\n  ): Promise<string> {\n    const model = this.getModel(options as { model?: string });\n\n    const response = await this.client.messages.create({\n      model,\n      messages: [\n        {\n          role: \"user\",\n          content: prompt,\n        },\n      ],\n      system: options?.systemPrompt,\n      max_tokens: options?.maxTokens || 1000,\n      temperature: options?.temperature,\n      top_p: options?.topP,\n      top_k: options?.topK,\n      stop_sequences: options?.stopSequences,\n      stream: false,\n    });\n\n    // Extract text from content blocks\n    const content = response.content\n      .filter((block) => block.type === \"text\")\n      .map((block) => (block as any).text)\n      .join(\"\\n\");\n\n    return content;\n  }\n\n  /**\n   * Generate streaming text completion\n   */\n  override async *generateStream(\n    prompt: string,\n    options?: GenerateOptions\n  ): AsyncGenerator<string> {\n    const model = this.getModel(options as { model?: string });\n\n    const stream = await this.client.messages.create({\n      model,\n      messages: [\n        {\n          role: \"user\",\n          content: prompt,\n        },\n      ],\n      system: options?.systemPrompt,\n      max_tokens: options?.maxTokens || 1000,\n      temperature: options?.temperature,\n      top_p: options?.topP,\n      top_k: options?.topK,\n      stop_sequences: options?.stopSequences,\n      stream: true,\n    });\n\n    for await (const event of stream) {\n      if (\n        event.type === \"content_block_delta\" &&\n        event.delta.type === \"text_delta\"\n      ) {\n        yield event.delta.text;\n      }\n    }\n  }\n\n  /**\n   * Classify text\n   */\n  override async classifyText(\n    text: string,\n    labels: string[]\n  ): Promise<Classification> {\n    const prompt = `Classify this text into exactly one category from: ${labels.join(\", \")}.\n\nText: \"${text}\"\n\nRespond with a JSON object:\n{\n  \"label\": \"chosen category\",\n  \"confidence\": 0.0-1.0,\n  \"scores\": { \"category1\": 0.0-1.0, ... }\n}`;\n\n    const response = await this.generateText(prompt, {\n      temperature: 0,\n      maxTokens: 200,\n    });\n\n    try {\n      // Extract JSON from response\n      const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n      if (jsonMatch) {\n        return JSON.parse(jsonMatch[0]);\n      }\n    } catch {\n      // Fallback parsing\n    }\n\n    // Fallback response\n    const label = labels[0] ?? \"\";\n    return {\n      label,\n      confidence: 0.5,\n      scores: labels.reduce(\n        (acc, l) => ({\n          ...acc,\n          [l]: l === label ? 0.5 : 0.5 / (labels.length - 1),\n        }),\n        {}\n      ),\n    };\n  }\n\n  /**\n   * Summarize text\n   */\n  override async summarize(\n    text: string,\n    options?: SummarizeOptions\n  ): Promise<string> {\n    const instructions = {\n      bullet: \"Create a bullet-point summary with key points\",\n      paragraph: \"Write a concise paragraph summary\",\n      tldr: \"Write a one-sentence TL;DR\",\n      \"key-points\": \"Extract the most important key points\",\n      executive: \"Write an executive summary for business leaders\",\n    };\n\n    const prompt = `${instructions[options?.style || \"paragraph\"]} of the following text.\n${options?.maxLength ? `Keep it under ${options.maxLength} characters.` : \"\"}\n\nText:\n\"${text}\"\n\nSummary:`;\n\n    return this.generateText(prompt, {\n      maxTokens: options?.maxLength ? Math.ceil(options.maxLength / 4) : 200,\n      temperature: 0.3,\n    });\n  }\n\n  /**\n   * Analyze sentiment\n   */\n  override async analyzeSentiment(text: string): Promise<any> {\n    const prompt = `Analyze the sentiment of the following text. Respond with JSON:\n{\n  \"sentiment\": \"positive\" | \"negative\" | \"neutral\" | \"mixed\",\n  \"score\": 0.0-1.0,\n  \"aspects\": [\n    { \"aspect\": \"...\", \"sentiment\": \"...\", \"score\": 0.0-1.0 }\n  ]\n}\n\nText: \"${text}\"`;\n\n    const response = await this.generateText(prompt, {\n      temperature: 0,\n      maxTokens: 300,\n    });\n\n    try {\n      const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n      if (jsonMatch) {\n        return JSON.parse(jsonMatch[0]);\n      }\n    } catch {\n      // Fallback\n    }\n\n    return {\n      sentiment: \"neutral\",\n      score: 0.5,\n      aspects: [],\n    };\n  }\n\n  /**\n   * Generate embeddings (not supported by Anthropic)\n   */\n  override async generateEmbedding(_text: string): Promise<number[]> {\n    throw new Error(\n      \"Embeddings not supported by Anthropic. Use a different provider.\"\n    );\n  }\n\n  /**\n   * Generate code\n   */\n  override async generateCode(prompt: string, options?: any): Promise<any> {\n    const systemPrompt = `You are Claude, an expert programmer. Generate clean, efficient code.\n${options?.includeComments ? \"Include helpful comments.\" : \"\"}\n${options?.includeTests ? \"Include unit tests.\" : \"\"}\nAlways respond with valid JSON containing: code, language, explanation, and dependencies array.`;\n\n    const fullPrompt = `Language: ${options?.language || \"auto-detect\"}\nFramework: ${options?.framework || \"none\"}\n\nTask: ${prompt}\n\nRespond with JSON:\n{\n  \"code\": \"the generated code\",\n  \"language\": \"detected or specified language\",\n  \"explanation\": \"brief explanation\",\n  ${options?.includeTests ? '\"tests\": \"unit test code\",' : \"\"}\n  \"dependencies\": [\"required\", \"packages\"]\n}`;\n\n    const response = await this.generateText(fullPrompt, {\n      systemPrompt,\n      temperature: 0.2,\n      maxTokens: 2000,\n    });\n\n    try {\n      const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n      if (jsonMatch) {\n        return JSON.parse(jsonMatch[0]);\n      }\n    } catch {\n      // Fallback\n    }\n\n    return {\n      code: response,\n      language: options?.language || \"unknown\",\n      explanation: \"Generated code\",\n      dependencies: [],\n    };\n  }\n\n  /**\n   * Explain code\n   */\n  override async explainCode(code: string, language?: string): Promise<string> {\n    const prompt = `Explain this ${language || \"code\"} in detail:\n\n\\`\\`\\`${language || \"\"}\n${code}\n\\`\\`\\`\n\nExplain:\n1. What it does\n2. How it works\n3. Key concepts/patterns\n4. Potential improvements`;\n\n    return this.generateText(prompt, {\n      temperature: 0.3,\n      maxTokens: 1000,\n    });\n  }\n\n  /**\n  //  * Extract token usage from response\n  //  */\n  // private _extractTokenUsage(usage: any): TokenUsage {\n  //   return {\n  //     promptTokens: usage?.input_tokens || 0,\n  //     completionTokens: usage?.output_tokens || 0,\n  //     totalTokens: (usage?.input_tokens || 0) + (usage?.output_tokens || 0),\n  //   };\n  // }\n}\n","import {\n  AIProvider,\n  Classification,\n  CodeGenerationOptions,\n  CodeResult,\n  GenerateOptions,\n  ImageAnalysis,\n  ImageAnalysisOptions,\n  ImageGenerationOptions,\n  ImageResult,\n  SentimentAnalysis,\n  SpeechOptions,\n  SummarizeOptions,\n  TranscriptionOptions,\n  TranscriptionResult,\n} from \"../types\";\n\nexport interface ProviderConfig {\n  name: string;\n  apiKey?: string;\n  baseUrl?: string;\n  model?: string;\n  headers?: Record<string, string>;\n  maxRetries?: number;\n  timeout?: number;\n}\n\nexport abstract class BaseProvider implements AIProvider {\n  public name: string;\n  protected config: ProviderConfig;\n  protected defaultModel: string;\n\n  constructor(config: ProviderConfig) {\n    this.name = config.name;\n    this.config = config;\n    this.defaultModel = config.model || this.getDefaultModel();\n  }\n\n  /**\n   * Get default model for provider\n   */\n  protected abstract getDefaultModel(): string;\n\n  /**\n   * Validate API key format\n   */\n  protected validateApiKey(): void {\n    if (!this.config.apiKey) {\n      throw new Error(`API key required for ${this.name} provider`);\n    }\n  }\n\n  /**\n   * Get headers for API requests\n   */\n  protected getHeaders(\n    additionalHeaders?: Record<string, string>\n  ): Record<string, string> {\n    return {\n      \"Content-Type\": \"application/json\",\n      ...this.config.headers,\n      ...additionalHeaders,\n    };\n  }\n\n  /**\n   * Make API request with error handling\n   */\n  protected async makeRequest<T>(\n    url: string,\n    options: RequestInit\n  ): Promise<T> {\n    const timeout = this.config.timeout || 30000;\n    const controller = new AbortController();\n    const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n    try {\n      const response = await fetch(url, {\n        ...options,\n        signal: controller.signal,\n      });\n\n      if (!response.ok) {\n        const error = await this.parseError(response);\n        throw error;\n      }\n\n      return await response.json();\n    } catch (error: any) {\n      if (error.name === \"AbortError\") {\n        throw new Error(`Request timeout after ${timeout}ms`);\n      }\n      throw error;\n    } finally {\n      clearTimeout(timeoutId);\n    }\n  }\n\n  /**\n   * Parse API error response\n   */\n  protected async parseError(response: Response): Promise<Error> {\n    let errorMessage = `${this.name} API error: ${response.status} ${response.statusText}`;\n\n    try {\n      const errorData = await response.json();\n      if (errorData.error?.message) {\n        errorMessage = errorData.error.message;\n      } else if (errorData.message) {\n        errorMessage = errorData.message;\n      }\n    } catch {\n      // Use default error message if parsing fails\n    }\n\n    const error = new Error(errorMessage) as any;\n    error.status = response.status;\n    error.provider = this.name;\n\n    return error;\n  }\n\n  /**\n   * Get model to use for request\n   */\n  protected getModel(options?: { model?: string }): string {\n    return options?.model || this.config.model || this.defaultModel;\n  }\n\n  // Default implementations that throw not implemented errors\n  async generateText(\n    _prompt: string,\n    _options?: GenerateOptions\n  ): Promise<string> {\n    throw new Error(\n      `Text generation not implemented for ${this.name} provider`\n    );\n  }\n\n  async *generateStream(\n    _prompt: string,\n    _options?: GenerateOptions\n  ): AsyncGenerator<string> {\n    throw new Error(\n      `Stream generation not implemented for ${this.name} provider`\n    );\n  }\n\n  async generateEmbedding(_text: string): Promise<number[]> {\n    throw new Error(\n      `Embedding generation not implemented for ${this.name} provider`\n    );\n  }\n\n  async classifyText(\n    _text: string,\n    _labels: string[]\n  ): Promise<Classification> {\n    throw new Error(\n      `Text classification not implemented for ${this.name} provider`\n    );\n  }\n\n  async summarize(_text: string, _options?: SummarizeOptions): Promise<string> {\n    throw new Error(\n      `Text summarization not implemented for ${this.name} provider`\n    );\n  }\n\n  async analyzeSentiment(_text: string): Promise<SentimentAnalysis> {\n    throw new Error(\n      `Sentiment analysis not implemented for ${this.name} provider`\n    );\n  }\n\n  async generateImage(\n    _prompt: string,\n    _options?: ImageGenerationOptions\n  ): Promise<ImageResult> {\n    throw new Error(\n      `Image generation not implemented for ${this.name} provider`\n    );\n  }\n\n  async analyzeImage(\n    _image: string | Blob,\n    _options?: ImageAnalysisOptions\n  ): Promise<ImageAnalysis> {\n    throw new Error(`Image analysis not implemented for ${this.name} provider`);\n  }\n\n  async transcribeAudio(\n    _audio: Blob,\n    _options?: TranscriptionOptions\n  ): Promise<TranscriptionResult> {\n    throw new Error(\n      `Audio transcription not implemented for ${this.name} provider`\n    );\n  }\n\n  async generateSpeech(_text: string, _options?: SpeechOptions): Promise<Blob> {\n    throw new Error(\n      `Speech generation not implemented for ${this.name} provider`\n    );\n  }\n\n  async generateCode(\n    _prompt: string,\n    _options?: CodeGenerationOptions\n  ): Promise<CodeResult> {\n    throw new Error(\n      `Code generation not implemented for ${this.name} provider`\n    );\n  }\n\n  async explainCode(_code: string, _language?: string): Promise<string> {\n    throw new Error(\n      `Code explanation not implemented for ${this.name} provider`\n    );\n  }\n}\n","import { GoogleGenerativeAI } from \"@google/generative-ai\";\nimport {\n  Classification,\n  GenerateOptions,\n  ImageAnalysis,\n  ImageAnalysisOptions,\n  SummarizeOptions,\n} from \"../types\";\nimport { BaseProvider, ProviderConfig } from \"./base-provider\";\n\nexport class GoogleProvider extends BaseProvider {\n  private client: GoogleGenerativeAI;\n\n  constructor(config: ProviderConfig) {\n    super(config);\n    this.validateApiKey();\n\n    this.client = new GoogleGenerativeAI(this.config.apiKey!);\n  }\n\n  protected getDefaultModel(): string {\n    return \"gemini-pro\";\n  }\n\n  /**\n   * Generate text completion\n   */\n  override async generateText(\n    prompt: string,\n    options?: GenerateOptions\n  ): Promise<string> {\n    const modelName = this.getModel(options as { model?: string });\n    const model = this.client.getGenerativeModel({ model: modelName });\n\n    // Configure generation settings\n    const generationConfig = {\n      maxOutputTokens: options?.maxTokens || 1000,\n      temperature: options?.temperature || 0.7,\n      topP: options?.topP || 0.95,\n      topK: options?.topK || 40,\n      stopSequences: options?.stopSequences,\n    };\n\n    // Build prompt with system message if provided\n    const fullPrompt = options?.systemPrompt\n      ? `${options.systemPrompt}\\n\\n${prompt}`\n      : prompt;\n\n    const result = await model.generateContent({\n      contents: [{ role: \"user\", parts: [{ text: fullPrompt }] }],\n      generationConfig,\n    });\n\n    const response = await result.response;\n    return response.text();\n  }\n\n  /**\n   * Generate streaming text completion\n   */\n  override async *generateStream(\n    prompt: string,\n    options?: GenerateOptions\n  ): AsyncGenerator<string> {\n    const modelName = this.getModel(options as { model?: string });\n    const model = this.client.getGenerativeModel({ model: modelName });\n\n    const generationConfig = {\n      maxOutputTokens: options?.maxTokens || 1000,\n      temperature: options?.temperature || 0.7,\n      topP: options?.topP || 0.95,\n      topK: options?.topK || 40,\n      stopSequences: options?.stopSequences,\n    };\n\n    const fullPrompt = options?.systemPrompt\n      ? `${options.systemPrompt}\\n\\n${prompt}`\n      : prompt;\n\n    const result = await model.generateContentStream({\n      contents: [{ role: \"user\", parts: [{ text: fullPrompt }] }],\n      generationConfig,\n    });\n\n    for await (const chunk of result.stream) {\n      const text = chunk.text();\n      if (text) {\n        yield text;\n      }\n    }\n  }\n\n  /**\n   * Generate embeddings\n   */\n  override async generateEmbedding(text: string): Promise<number[]> {\n    const model = this.client.getGenerativeModel({ model: \"embedding-001\" });\n\n    const result = await model.embedContent(text);\n    return result.embedding.values;\n  }\n\n  /**\n   * Classify text\n   */\n  override async classifyText(\n    text: string,\n    labels: string[]\n  ): Promise<Classification> {\n    const prompt = `Classify the following text into exactly one of these categories: ${labels.join(\", \")}.\n\nText: \"${text}\"\n\nRespond with only JSON in this format:\n{\n  \"label\": \"chosen category\",\n  \"confidence\": 0.95,\n  \"scores\": {\n    \"category1\": 0.95,\n    \"category2\": 0.03,\n    \"category3\": 0.02\n  }\n}`;\n\n    const response = await this.generateText(prompt, {\n      temperature: 0,\n      maxTokens: 200,\n    });\n\n    try {\n      // Extract JSON from response\n      const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n      if (jsonMatch) {\n        return JSON.parse(jsonMatch[0]);\n      }\n    } catch {\n      // Fallback\n    }\n\n    // Default response\n    const label = labels[0] || \"unknown\";\n    return {\n      label,\n      confidence: 0.5,\n      scores: labels.reduce(\n        (acc, l) => ({\n          ...acc,\n          [l]: l === label ? 0.5 : 0.5 / (labels.length - 1),\n        }),\n        {}\n      ),\n    };\n  }\n\n  /**\n   * Summarize text\n   */\n  override async summarize(\n    text: string,\n    options?: SummarizeOptions\n  ): Promise<string> {\n    const styleInstructions = {\n      bullet: \"Create a concise bullet-point summary\",\n      paragraph: \"Write a well-structured paragraph summary\",\n      tldr: \"Provide a single sentence TL;DR\",\n      \"key-points\": \"List only the most critical key points\",\n      executive: \"Write a professional executive summary\",\n    };\n\n    const prompt = `${styleInstructions[options?.style || \"paragraph\"]} of this text:\n\n\"${text}\"\n\n${options?.maxLength ? `Limit to ${options.maxLength} characters.` : \"\"}`;\n\n    return this.generateText(prompt, {\n      maxTokens: options?.maxLength ? Math.ceil(options.maxLength / 4) : 200,\n      temperature: 0.3,\n    });\n  }\n\n  /**\n   * Analyze image (Gemini Pro Vision)\n   */\n  override async analyzeImage(\n    image: string | Blob,\n    options?: ImageAnalysisOptions\n  ): Promise<ImageAnalysis> {\n    const model = this.client.getGenerativeModel({\n      model: \"gemini-pro-vision\",\n    });\n\n    // Convert image to base64 if needed\n    let base64Image: string;\n    if (image instanceof Blob) {\n      const buffer = await image.arrayBuffer();\n      base64Image = btoa(String.fromCharCode(...new Uint8Array(buffer)));\n    } else {\n      base64Image = image.replace(/^data:image\\/\\w+;base64,/, \"\");\n    }\n\n    const features = options?.features || [\"description\", \"objects\", \"text\"];\n    const prompt = `Analyze this image and provide a detailed response in JSON format with these features: ${features.join(\", \")}.\n\nExpected format:\n{\n  ${features.includes(\"description\") ? '\"description\": \"detailed description\",' : \"\"}\n  ${features.includes(\"objects\") ? '\"objects\": [{\"label\": \"object\", \"confidence\": 0.9}],' : \"\"}\n  ${features.includes(\"text\") ? '\"text\": [{\"text\": \"extracted text\", \"confidence\": 0.9}],' : \"\"}\n  ${features.includes(\"colors\") ? '\"colors\": [{\"hex\": \"#000000\", \"name\": \"black\", \"percentage\": 30}],' : \"\"}\n  ${features.includes(\"tags\") ? '\"tags\": [\"tag1\", \"tag2\"]' : \"\"}\n}`;\n\n    const result = await model.generateContent({\n      contents: [\n        {\n          role: \"user\",\n          parts: [\n            { text: prompt },\n            {\n              inlineData: {\n                mimeType: \"image/jpeg\",\n                data: base64Image,\n              },\n            },\n          ],\n        },\n      ],\n    });\n\n    const response = await result.response;\n    const responseText = response.text();\n\n    try {\n      const jsonMatch = responseText.match(/\\{[\\s\\S]*\\}/);\n      if (jsonMatch) {\n        return JSON.parse(jsonMatch[0]);\n      }\n    } catch {\n      // Fallback\n    }\n\n    return {\n      description: responseText,\n      objects: [],\n      text: [],\n      colors: [],\n      tags: [],\n    };\n  }\n\n  /**\n   * Generate code\n   */\n  override async generateCode(prompt: string, options?: any): Promise<any> {\n    const systemContext = `You are an expert programmer. Generate high-quality code.\n${options?.includeComments ? \"Include clear comments.\" : \"\"}\n${options?.includeTests ? \"Include comprehensive tests.\" : \"\"}\nStyle: ${options?.style || \"clean and efficient\"}`;\n\n    const fullPrompt = `${systemContext}\n\nLanguage: ${options?.language || \"auto-detect\"}\nFramework: ${options?.framework || \"none\"}\nTask: ${prompt}\n\nProvide response as JSON:\n{\n  \"code\": \"complete code\",\n  \"language\": \"programming language\",\n  \"explanation\": \"what the code does\",\n  ${options?.includeTests ? '\"tests\": \"test code\",' : \"\"}\n  \"dependencies\": [\"list\", \"of\", \"dependencies\"]\n}`;\n\n    const response = await this.generateText(fullPrompt, {\n      temperature: 0.2,\n      maxTokens: 2000,\n    });\n\n    try {\n      const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n      if (jsonMatch) {\n        return JSON.parse(jsonMatch[0]);\n      }\n    } catch {\n      // Fallback\n    }\n\n    return {\n      code: response,\n      language: options?.language || \"unknown\",\n      explanation: \"Generated code\",\n    };\n  }\n\n  /**\n   * Explain code\n   */\n  override async explainCode(code: string, language?: string): Promise<string> {\n    const prompt = `Analyze and explain this ${language || \"code\"}:\n\n\\`\\`\\`${language || \"\"}\n${code}\n\\`\\`\\`\n\nProvide a comprehensive explanation covering:\n1. Purpose and functionality\n2. How it works step by step\n3. Key algorithms or patterns used\n4. Complexity analysis\n5. Potential optimizations or issues`;\n\n    return this.generateText(prompt, {\n      temperature: 0.3,\n      maxTokens: 1500,\n    });\n  }\n}\n","import {\n  Classification,\n  CodeGenerationOptions,\n  CodeResult,\n  GenerateOptions,\n  ImageGenerationOptions,\n  ImageResult,\n  SentimentAnalysis,\n  SummarizeOptions,\n} from \"../types\";\nimport { BaseProvider, ProviderConfig } from \"./base-provider\";\n\ninterface MockProviderOptions extends ProviderConfig {\n  delay?: number;\n  shouldFail?: boolean;\n  failureRate?: number;\n  responses?: Map<string, string>;\n}\n\nexport class MockProvider extends BaseProvider {\n  private delay: number;\n  private shouldFail: boolean;\n  private failureRate: number;\n  private responses: Map<string, string>;\n  private requestCount = 0;\n\n  constructor(config: MockProviderOptions) {\n    super(config);\n    this.delay = config.delay || 100;\n    this.shouldFail = config.shouldFail || false;\n    this.failureRate = config.failureRate || 0;\n    this.responses = config.responses || new Map();\n  }\n\n  protected getDefaultModel(): string {\n    return \"mock-model-v1\";\n  }\n\n  /**\n   * Simulate delay\n   */\n  private async simulateDelay(customDelay?: number): Promise<void> {\n    const delayTime = customDelay || this.delay;\n    if (delayTime > 0) {\n      await new Promise((resolve) => setTimeout(resolve, delayTime));\n    }\n  }\n\n  /**\n   * Check if request should fail\n   */\n  private shouldFailRequest(): boolean {\n    this.requestCount++;\n\n    if (this.shouldFail) return true;\n\n    if (this.failureRate > 0) {\n      return Math.random() < this.failureRate;\n    }\n\n    return false;\n  }\n\n  /**\n   * Generate text completion\n   */\n  override async generateText(\n    prompt: string,\n    options?: GenerateOptions\n  ): Promise<string> {\n    await this.simulateDelay();\n\n    if (this.shouldFailRequest()) {\n      throw new Error(\"Mock provider error: Simulated failure\");\n    }\n\n    // Check for predefined response\n    const predefinedResponse = this.responses.get(prompt);\n    if (predefinedResponse) {\n      return predefinedResponse;\n    }\n\n    // Generate mock response\n    const temperature = options?.temperature || 0.7;\n    const variation =\n      temperature > 0.5 ? \" (creative mode)\" : \" (precise mode)\";\n\n    return `Mock response to: \"${prompt.substring(0, 50)}...\"${variation}\nModel: ${this.getModel(options as { model?: string })}\nMax tokens: ${options?.maxTokens || \"default\"}\nSystem: ${options?.systemPrompt || \"none\"}\nGenerated at: ${new Date().toISOString()}`;\n  }\n\n  /**\n   * Generate streaming text completion\n   */\n  override async *generateStream(\n    prompt: string,\n    options?: GenerateOptions\n  ): AsyncGenerator<string> {\n    const response = await this.generateText(prompt, options);\n    const words = response.split(\" \");\n\n    for (const word of words) {\n      await this.simulateDelay(20);\n      yield word + \" \";\n    }\n  }\n\n  /**\n   * Generate embeddings\n   */\n  override async generateEmbedding(text: string): Promise<number[]> {\n    await this.simulateDelay();\n\n    if (this.shouldFailRequest()) {\n      throw new Error(\"Mock provider error: Embedding generation failed\");\n    }\n\n    // Generate deterministic mock embedding based on text\n    const hash = text\n      .split(\"\")\n      .reduce((acc, char) => acc + char.charCodeAt(0), 0);\n    const embedding = new Array(1536).fill(0).map((_, i) => {\n      return Math.sin(hash + i) * 0.1 + Math.cos(hash - i) * 0.05;\n    });\n\n    return embedding;\n  }\n\n  /**\n   * Classify text\n   */\n  override async classifyText(\n    text: string,\n    labels: string[]\n  ): Promise<Classification> {\n    await this.simulateDelay();\n\n    if (this.shouldFailRequest()) {\n      throw new Error(\"Mock provider error: Classification failed\");\n    }\n\n    // Mock classification based on text length and content\n    const textLength = text.length;\n    const hasPositiveWords = /good|great|excellent|happy|love/i.test(text);\n    const hasNegativeWords = /bad|terrible|hate|awful|poor/i.test(text);\n\n    let selectedIndex = textLength % labels.length;\n    if (hasPositiveWords && labels.includes(\"positive\")) {\n      selectedIndex = labels.indexOf(\"positive\");\n    } else if (hasNegativeWords && labels.includes(\"negative\")) {\n      selectedIndex = labels.indexOf(\"negative\");\n    }\n\n    const scores = labels.reduce(\n      (acc, label, i) => {\n        acc[label] =\n          i === selectedIndex\n            ? 0.8 + Math.random() * 0.15\n            : Math.random() * 0.2;\n        return acc;\n      },\n      {} as Record<string, number>\n    );\n\n    // Normalize scores\n    const total = Object.values(scores).reduce((sum, score) => sum + score, 0);\n    Object.keys(scores).forEach((key) => {\n      scores[key] = (scores[key] ?? 0) / total;\n    });\n\n    const selectedLabel = labels[selectedIndex] ?? \"unknown\";\n    return {\n      label: selectedLabel,\n      confidence: scores[selectedLabel] ?? 0,\n      scores,\n    };\n  }\n\n  /**\n   * Summarize text\n   */\n  override async summarize(\n    text: string,\n    options?: SummarizeOptions\n  ): Promise<string> {\n    await this.simulateDelay();\n\n    if (this.shouldFailRequest()) {\n      throw new Error(\"Mock provider error: Summarization failed\");\n    }\n\n    const words = text.split(\" \");\n    const style = options?.style || \"paragraph\";\n\n    switch (style) {\n      case \"bullet\":\n        return `• First point about \"${words.slice(0, 5).join(\" \")}...\"\n• Key insight from the middle section\n• Final conclusion regarding \"${words.slice(-5).join(\" \")}\"`;\n\n      case \"tldr\":\n        return `TL;DR: ${words.slice(0, 10).join(\" \")}... (${words.length} words total)`;\n\n      case \"key-points\":\n        return `Key Points:\n1. Main topic: ${words[0]}\n2. Important detail: ${words[Math.floor(words.length / 2)]}\n3. Conclusion: ${words[words.length - 1]}`;\n\n      case \"executive\":\n        return `Executive Summary: This document discusses ${words.slice(0, 5).join(\" \")}.\nThe analysis reveals important insights about the subject matter.\nStrategic recommendations include further investigation of key areas.`;\n\n      default:\n        return `Summary: ${words.slice(0, 20).join(\" \")}...\nThe text contains ${words.length} words and covers various topics.`;\n    }\n  }\n\n  /**\n   * Analyze sentiment\n   */\n  override async analyzeSentiment(text: string): Promise<SentimentAnalysis> {\n    await this.simulateDelay();\n\n    if (this.shouldFailRequest()) {\n      throw new Error(\"Mock provider error: Sentiment analysis failed\");\n    }\n\n    const positiveWords = (\n      text.match(/good|great|excellent|happy|love|wonderful/gi) || []\n    ).length;\n    const negativeWords = (\n      text.match(/bad|terrible|hate|awful|poor|horrible/gi) || []\n    ).length;\n\n    let sentiment: \"positive\" | \"negative\" | \"neutral\" | \"mixed\";\n    let score: number;\n\n    if (positiveWords > negativeWords * 2) {\n      sentiment = \"positive\";\n      score = 0.7 + Math.random() * 0.25;\n    } else if (negativeWords > positiveWords * 2) {\n      sentiment = \"negative\";\n      score = 0.2 + Math.random() * 0.2;\n    } else if (positiveWords > 0 && negativeWords > 0) {\n      sentiment = \"mixed\";\n      score = 0.4 + Math.random() * 0.2;\n    } else {\n      sentiment = \"neutral\";\n      score = 0.45 + Math.random() * 0.1;\n    }\n\n    return {\n      sentiment,\n      score,\n      aspects: [\n        {\n          aspect: \"tone\",\n          sentiment: sentiment,\n          score: score,\n        },\n      ],\n    };\n  }\n\n  /**\n   * Generate image\n   */\n  override async generateImage(\n    prompt: string,\n    options?: ImageGenerationOptions\n  ): Promise<ImageResult> {\n    await this.simulateDelay(500); // Longer delay for image generation\n\n    if (this.shouldFailRequest()) {\n      throw new Error(\"Mock provider error: Image generation failed\");\n    }\n\n    const size = options?.size || \"1024x1024\";\n    const style = options?.style || \"realistic\";\n\n    return {\n      url: `https://picsum.photos/${size.split(\"x\")[0]}/${size.split(\"x\")[1]}?random=${Date.now()}`,\n      base64: undefined,\n      revisedPrompt: `Enhanced prompt: ${prompt} in ${style} style`,\n      metadata: {\n        model: \"mock-dalle\",\n        size,\n        style,\n        seed: options?.seed || Math.floor(Math.random() * 1000000),\n      },\n    };\n  }\n\n  /**\n   * Generate code\n   */\n  override async generateCode(\n    prompt: string,\n    options?: CodeGenerationOptions\n  ): Promise<CodeResult> {\n    await this.simulateDelay();\n\n    if (this.shouldFailRequest()) {\n      throw new Error(\"Mock provider error: Code generation failed\");\n    }\n\n    const language = options?.language || \"javascript\";\n    const includeComments = options?.includeComments ?? true;\n\n    const code = `${includeComments ? \"// Mock generated code\\n\" : \"\"}\nfunction mockFunction() {\n  ${includeComments ? \"// Implementation for: \" + prompt.substring(0, 50) + \"\\n  \" : \"\"}\n  console.log(\"This is mock generated code\");\n  return {\n    prompt: \"${prompt.substring(0, 30)}...\",\n    language: \"${language}\",\n    timestamp: new Date().toISOString()\n  };\n}`;\n\n    const tests = options?.includeTests\n      ? `\ndescribe('mockFunction', () => {\n  it('should return expected output', () => {\n    const result = mockFunction();\n    expect(result).toBeDefined();\n    expect(result.language).toBe('${language}');\n  });\n});`\n      : undefined;\n\n    return {\n      code,\n      language,\n      explanation: `This is a mock implementation for: ${prompt}`,\n      tests,\n      dependencies: language === \"javascript\" ? [] : [\"mock-dependency\"],\n    };\n  }\n\n  /**\n   * Explain code\n   */\n  override async explainCode(code: string, language?: string): Promise<string> {\n    await this.simulateDelay();\n\n    if (this.shouldFailRequest()) {\n      throw new Error(\"Mock provider error: Code explanation failed\");\n    }\n\n    const lines = code.split(\"\\n\").length;\n    const hasFunction = /function|=>|def|fn/.test(code);\n    const hasClass = /class|struct|interface/.test(code);\n\n    return `Mock Code Explanation:\n\nThis ${language || \"code\"} snippet contains ${lines} lines.\n\nKey observations:\n${hasFunction ? \"- Contains function definitions\\n\" : \"\"}${hasClass ? \"- Defines class or structural types\\n\" : \"\"}- Uses ${language || \"modern programming\"} syntax\n- Implements mock functionality for testing\n\nThe code structure suggests it's designed for demonstration purposes.\nIn a real implementation, this would ${hasFunction ? \"execute the defined functions\" : \"define the specified behavior\"}.\n\nMock analysis completed at: ${new Date().toISOString()}`;\n  }\n\n  /**\n   * Configure mock behavior\n   */\n  configure(options: Partial<MockProviderOptions>): void {\n    if (options.delay !== undefined) this.delay = options.delay;\n    if (options.shouldFail !== undefined) this.shouldFail = options.shouldFail;\n    if (options.failureRate !== undefined)\n      this.failureRate = options.failureRate;\n    if (options.responses) {\n      options.responses.forEach((value, key) => {\n        this.responses.set(key, value);\n      });\n    }\n  }\n\n  /**\n   * Get request statistics\n   */\n  getStats() {\n    return {\n      totalRequests: this.requestCount,\n      failureRate: this.failureRate,\n      shouldFail: this.shouldFail,\n      averageDelay: this.delay,\n      predefinedResponses: this.responses.size,\n    };\n  }\n\n  /**\n   * Reset mock provider\n   */\n  reset(): void {\n    this.requestCount = 0;\n    this.responses.clear();\n    this.shouldFail = false;\n    this.failureRate = 0;\n  }\n}\n","import OpenAI from \"openai\";\nimport {\n  Classification,\n  CodeGenerationOptions,\n  CodeResult,\n  GenerateOptions,\n  ImageGenerationOptions,\n  ImageResult,\n  SpeechOptions,\n  SummarizeOptions,\n  TranscriptionOptions,\n  TranscriptionResult,\n} from \"../types\";\nimport { BaseProvider, ProviderConfig } from \"./base-provider\";\n\nexport class OpenAIProvider extends BaseProvider {\n  private client: OpenAI;\n\n  constructor(config: ProviderConfig) {\n    super(config);\n    this.validateApiKey();\n\n    this.client = new OpenAI({\n      apiKey: this.config.apiKey,\n      baseURL: this.config.baseUrl,\n      timeout: this.config.timeout,\n      maxRetries: this.config.maxRetries || 2,\n    });\n  }\n\n  protected getDefaultModel(): string {\n    return \"gpt-3.5-turbo\";\n  }\n\n  /**\n   * Generate text completion\n   */\n  override async generateText(\n    prompt: string,\n    options?: GenerateOptions\n  ): Promise<string> {\n    const model = this.getModel(options as { model?: string });\n\n    const completion = await this.client.chat.completions.create({\n      model,\n      messages: [\n        {\n          role: \"system\",\n          content: options?.systemPrompt || \"You are a helpful assistant.\",\n        },\n        {\n          role: \"user\",\n          content: prompt,\n        },\n      ],\n      max_tokens: options?.maxTokens,\n      temperature: options?.temperature,\n      top_p: options?.topP,\n      frequency_penalty: options?.frequencyPenalty,\n      presence_penalty: options?.presencePenalty,\n      stop: options?.stopSequences,\n      seed: options?.seed,\n      response_format: options?.responseFormat,\n      functions: options?.functions as any,\n      stream: false,\n    });\n\n    return completion.choices[0]?.message?.content || \"\";\n  }\n\n  /**\n   * Generate streaming text completion\n   */\n  override async *generateStream(\n    prompt: string,\n    options?: GenerateOptions\n  ): AsyncGenerator<string> {\n    const model = this.getModel(options as { model?: string });\n\n    const stream = await this.client.chat.completions.create({\n      model,\n      messages: [\n        {\n          role: \"system\",\n          content: options?.systemPrompt || \"You are a helpful assistant.\",\n        },\n        {\n          role: \"user\",\n          content: prompt,\n        },\n      ],\n      max_tokens: options?.maxTokens,\n      temperature: options?.temperature,\n      top_p: options?.topP,\n      frequency_penalty: options?.frequencyPenalty,\n      presence_penalty: options?.presencePenalty,\n      stop: options?.stopSequences,\n      seed: options?.seed,\n      stream: true,\n    });\n\n    for await (const chunk of stream) {\n      const content = chunk.choices[0]?.delta?.content;\n      if (content) {\n        yield content;\n      }\n    }\n  }\n\n  /**\n   * Generate embeddings\n   */\n  override async generateEmbedding(text: string): Promise<number[]> {\n    const response = await this.client.embeddings.create({\n      model: \"text-embedding-ada-002\",\n      input: text,\n    });\n\n    return response.data[0]?.embedding || [];\n  }\n\n  /**\n   * Classify text (using completion)\n   */\n  override async classifyText(\n    text: string,\n    labels: string[]\n  ): Promise<Classification> {\n    const prompt = `Classify the following text into one of these categories: ${labels.join(\", \")}.\n\nText: \"${text}\"\n\nRespond with a JSON object containing:\n- label: the chosen category\n- confidence: a number between 0 and 1\n- scores: an object with confidence scores for each category\n\nResponse:`;\n\n    const response = await this.generateText(prompt, {\n      temperature: 0,\n      maxTokens: 200,\n      responseFormat: { type: \"json_object\" },\n    });\n\n    try {\n      return JSON.parse(response);\n    } catch {\n      // Fallback if JSON parsing fails\n      const label = labels[0] || \"unknown\";\n      return {\n        label,\n        confidence: 0.5,\n        scores: labels.reduce(\n          (acc, l) => ({\n            ...acc,\n            [l]: l === label ? 0.5 : 0.5 / (labels.length - 1),\n          }),\n          {}\n        ),\n      };\n    }\n  }\n\n  /**\n   * Summarize text\n   */\n  override async summarize(\n    text: string,\n    options?: SummarizeOptions\n  ): Promise<string> {\n    const stylePrompts = {\n      bullet: \"Create a bullet-point summary with key points.\",\n      paragraph: \"Write a concise paragraph summary.\",\n      tldr: \"Write a one-sentence TL;DR summary.\",\n      \"key-points\": \"Extract and list the most important key points.\",\n      executive: \"Write an executive summary suitable for business leaders.\",\n    };\n\n    const prompt = `${stylePrompts[options?.style || \"paragraph\"]}\n\nText to summarize:\n\"${text}\"\n\nSummary:`;\n\n    return this.generateText(prompt, {\n      maxTokens: options?.maxLength || 200,\n      temperature: 0.3,\n    });\n  }\n\n  /**\n   * Generate images\n   */\n  override async generateImage(\n    prompt: string,\n    options?: ImageGenerationOptions\n  ): Promise<ImageResult> {\n    const response = await this.client.images.generate({\n      model: \"dall-e-3\",\n      prompt,\n      n: options?.n || 1,\n      size: options?.size || \"1024x1024\",\n      quality: options?.quality || \"standard\",\n      style: options?.style === \"realistic\" ? \"natural\" : \"vivid\",\n      response_format: \"url\",\n    });\n\n    if (!response.data) throw new Error(\"No image data returned.\");\n\n    const image = response.data[0];\n\n    return {\n      url: image?.url || \"\",\n      revisedPrompt: image?.revised_prompt || \"\",\n      metadata: {\n        model: \"dall-e-3\",\n        size: options?.size || \"1024x1024\",\n        quality: options?.quality || \"standard\",\n      },\n    };\n  }\n\n  /**\n   * Transcribe audio\n   */\n  override async transcribeAudio(\n    audio: Blob,\n    options?: TranscriptionOptions\n  ): Promise<TranscriptionResult> {\n    // Convert Blob to File\n    const file = new File([audio], \"audio.webm\", { type: audio.type });\n\n    const transcription = await this.client.audio.transcriptions.create({\n      file,\n      model: \"whisper-1\",\n      language: options?.language,\n      response_format: options?.format === \"json\" ? \"verbose_json\" : \"text\",\n      timestamp_granularities: options?.timestamps ? [\"word\"] : undefined,\n    });\n\n    if (typeof transcription === \"string\") {\n      return {\n        text: transcription,\n        language: options?.language,\n      };\n    }\n\n    return {\n      text: transcription.text,\n      language: (transcription as any).language,\n      duration: (transcription as any).duration,\n      words: (transcription as any).words?.map((w: any) => ({\n        word: w.word,\n        start: w.start,\n        end: w.end,\n      })),\n    };\n  }\n\n  /**\n   * Generate speech\n   */\n  override async generateSpeech(\n    text: string,\n    options?: SpeechOptions\n  ): Promise<Blob> {\n    const response = await this.client.audio.speech.create({\n      model: \"tts-1\",\n      input: text,\n      voice: (options?.voice || \"alloy\") as any,\n      speed: options?.speed || 1.0,\n      response_format: options?.format || (\"mp3\" as any),\n    });\n\n    // Convert response to Blob\n    const arrayBuffer = await response.arrayBuffer();\n    return new Blob([arrayBuffer], {\n      type: `audio/${options?.format || \"mp3\"}`,\n    });\n  }\n\n  /**\n   * Generate code\n   */\n  override async generateCode(\n    prompt: string,\n    options?: CodeGenerationOptions\n  ): Promise<CodeResult> {\n    const systemPrompt = `You are an expert programmer. Generate clean, efficient, and well-documented code.\n${options?.includeComments ? \"Include helpful comments.\" : \"Minimize comments.\"}\n${options?.includeTests ? \"Include unit tests.\" : \"\"}\nStyle: ${options?.style || \"concise\"}`;\n\n    const fullPrompt = `Language: ${options?.language || \"auto-detect\"}\nFramework: ${options?.framework || \"none\"}\n\nTask: ${prompt}\n\nRespond with a JSON object containing:\n- code: the generated code\n- language: the programming language used\n- explanation: brief explanation of the code\n${options?.includeTests ? \"- tests: unit test code\" : \"\"}\n- dependencies: array of required dependencies`;\n\n    const response = await this.generateText(fullPrompt, {\n      systemPrompt,\n      temperature: 0.2,\n      maxTokens: 2000,\n      responseFormat: { type: \"json_object\" },\n    });\n\n    try {\n      return JSON.parse(response);\n    } catch {\n      // Fallback\n      return {\n        code: response,\n        language: options?.language || \"unknown\",\n        explanation: \"Generated code\",\n      };\n    }\n  }\n\n  /**\n   * Explain code\n   */\n  override async explainCode(code: string, language?: string): Promise<string> {\n    const prompt = `Explain the following ${language || \"code\"} in detail:\n\n\\`\\`\\`${language || \"\"}\n${code}\n\\`\\`\\`\n\nProvide a clear explanation of:\n1. What the code does\n2. How it works\n3. Any important concepts or patterns used\n4. Potential improvements or issues`;\n\n    return this.generateText(prompt, {\n      temperature: 0.3,\n      maxTokens: 1000,\n    });\n  }\n\n  // /**\n  //  * Calculate token usage from OpenAI response\n  //  */\n  // private _extractTokenUsage(usage: any): TokenUsage {\n  //   return {\n  //     promptTokens: usage?.prompt_tokens || 0,\n  //     completionTokens: usage?.completion_tokens || 0,\n  //     totalTokens: usage?.total_tokens || 0,\n  //   };\n  // }\n}\n","import { LRUCache } from 'lru-cache'\nimport crypto from 'crypto'\nimport { CacheConfig, GenerateOptions } from '../types'\n\ninterface CacheEntry<T = any> {\n  key: string\n  value: T\n  timestamp: number\n  hits: number\n  metadata?: Record<string, any>\n}\n\ninterface CacheOptions extends CacheConfig {\n  namespace?: string\n}\n\nexport class CacheManager {\n  private cache: LRUCache<string, CacheEntry>\n  private enabled: boolean\n  private namespace: string\n  private stats = {\n    hits: 0,\n    misses: 0,\n    evictions: 0\n  }\n\n  constructor(options: CacheOptions) {\n    this.enabled = options.enabled ?? true\n    this.namespace = options.namespace || 'ai-toolkit'\n    \n    // Convert MB to bytes for max size\n    const maxSizeBytes = (options.maxSize || 100) * 1024 * 1024\n    \n    this.cache = new LRUCache<string, CacheEntry>({\n      max: 1000, // Max number of items\n      maxSize: maxSizeBytes,\n      sizeCalculation: (entry) => {\n        // Estimate size of cached entry\n        return JSON.stringify(entry).length\n      },\n      ttl: options.ttl || 600000, // 10 minutes default\n      updateAgeOnGet: true,\n      updateAgeOnHas: false,\n      dispose: () => {\n        this.stats.evictions++\n      }\n    })\n    \n    // Setup periodic cleanup\n    this.setupCleanup()\n  }\n\n  /**\n   * Generate cache key from request parameters\n   */\n  generateKey(\n    method: string,\n    params: any[],\n    options?: Record<string, any>\n  ): string {\n    const keyData = {\n      namespace: this.namespace,\n      method,\n      params: params.map(p => {\n        if (typeof p === 'object') {\n          return JSON.stringify(p, Object.keys(p).sort())\n        }\n        return String(p)\n      }),\n      options: options ? JSON.stringify(options, Object.keys(options).sort()) : null\n    }\n    \n    const hash = crypto\n      .createHash('sha256')\n      .update(JSON.stringify(keyData))\n      .digest('hex')\n    \n    return `${this.namespace}:${method}:${hash}`\n  }\n\n  /**\n   * Get value from cache\n   */\n  async get<T = any>(key: string): Promise<T | null> {\n    if (!this.enabled) return null\n    \n    const entry = this.cache.get(key)\n    \n    if (entry) {\n      this.stats.hits++\n      entry.hits++\n      return entry.value as T\n    }\n    \n    this.stats.misses++\n    return null\n  }\n\n  /**\n   * Set value in cache\n   */\n  async set<T = any>(\n    key: string,\n    value: T,\n    metadata?: Record<string, any>\n  ): Promise<void> {\n    if (!this.enabled) return\n    \n    const entry: CacheEntry<T> = {\n      key,\n      value,\n      timestamp: Date.now(),\n      hits: 0,\n      metadata\n    }\n    \n    this.cache.set(key, entry)\n  }\n\n  /**\n   * Delete from cache\n   */\n  async delete(key: string): Promise<boolean> {\n    return this.cache.delete(key)\n  }\n\n  /**\n   * Clear all cache entries\n   */\n  async clear(): Promise<void> {\n    this.cache.clear()\n    this.stats = {\n      hits: 0,\n      misses: 0,\n      evictions: 0\n    }\n  }\n\n  /**\n   * Check if key exists in cache\n   */\n  has(key: string): boolean {\n    return this.cache.has(key)\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getStats() {\n    const hitRate = this.stats.hits + this.stats.misses > 0\n      ? this.stats.hits / (this.stats.hits + this.stats.misses)\n      : 0\n    \n    return {\n      ...this.stats,\n      hitRate: Math.round(hitRate * 100) / 100,\n      size: this.cache.size,\n      calculatedSize: this.cache.calculatedSize,\n      maxSize: this.cache.maxSize,\n      itemCount: this.cache.size,\n      enabled: this.enabled\n    }\n  }\n\n  /**\n   * Get all cache keys\n   */\n  keys(): string[] {\n    return Array.from(this.cache.keys())\n  }\n\n  /**\n   * Get cache entries with metadata\n   */\n  entries(): Array<{ key: string; metadata?: Record<string, any>; age: number }> {\n    const entries: Array<{ key: string; metadata?: Record<string, any>; age: number }> = []\n    \n    for (const [key, entry] of this.cache.entries()) {\n      entries.push({\n        key,\n        metadata: entry.metadata,\n        age: Date.now() - entry.timestamp\n      })\n    }\n    \n    return entries\n  }\n\n  /**\n   * Prune old entries\n   */\n  prune(): number {\n    const beforeSize = this.cache.size\n    this.cache.purgeStale()\n    return beforeSize - this.cache.size\n  }\n\n  /**\n   * Enable or disable cache\n   */\n  setEnabled(enabled: boolean): void {\n    this.enabled = enabled\n    if (!enabled) {\n      this.clear()\n    }\n  }\n\n  /**\n   * Update TTL for all entries\n   */\n  updateTTL(ttl: number): void {\n    // LRUCache doesn't support updating TTL on existing entries\n    // We need to recreate the cache with new TTL\n    const entries = Array.from(this.cache.entries())\n    \n    this.cache = new LRUCache<string, CacheEntry>({\n      max: this.cache.max,\n      maxSize: this.cache.maxSize,\n      ttl,\n      updateAgeOnGet: true,\n      updateAgeOnHas: false,\n      sizeCalculation: (entry) => JSON.stringify(entry).length,\n      dispose: () => {\n        this.stats.evictions++\n      }\n    })\n    \n    // Restore entries\n    for (const [key, entry] of entries) {\n      this.cache.set(key, entry)\n    }\n  }\n\n  /**\n   * Get memory usage info\n   */\n  getMemoryUsage() {\n    return {\n      used: this.cache.calculatedSize,\n      max: this.cache.maxSize,\n      percentage: Math.round((this.cache.calculatedSize / this.cache.maxSize) * 100)\n    }\n  }\n\n  /**\n   * Setup periodic cleanup\n   */\n  private setupCleanup(): void {\n    // Run cleanup every 5 minutes\n    setInterval(() => {\n      this.prune()\n    }, 5 * 60 * 1000)\n  }\n\n  /**\n   * Cache wrapper for async functions\n   */\n  async wrap<T>(\n    key: string,\n    fn: () => Promise<T>,\n    options?: { ttl?: number; metadata?: Record<string, any> }\n  ): Promise<T> {\n    // Try to get from cache\n    const cached = await this.get<T>(key)\n    if (cached !== null) {\n      return cached\n    }\n    \n    // Execute function\n    const result = await fn()\n    \n    // Store in cache\n    await this.set(key, result, options?.metadata)\n    \n    return result\n  }\n\n  /**\n   * Create a cache key for text generation\n   */\n  createTextGenerationKey(\n    prompt: string,\n    options?: GenerateOptions,\n    provider?: string,\n    model?: string\n  ): string {\n    return this.generateKey('generateText', [prompt], {\n      ...options,\n      provider,\n      model\n    })\n  }\n\n  /**\n   * Create a cache key for embeddings\n   */\n  createEmbeddingKey(\n    text: string,\n    provider?: string,\n    model?: string\n  ): string {\n    return this.generateKey('generateEmbedding', [text], {\n      provider,\n      model\n    })\n  }\n\n  /**\n   * Export cache contents\n   */\n  export(): Record<string, any> {\n    const data: Record<string, any> = {}\n    \n    for (const [key, entry] of this.cache.entries()) {\n      data[key] = {\n        value: entry.value,\n        timestamp: entry.timestamp,\n        hits: entry.hits,\n        metadata: entry.metadata\n      }\n    }\n    \n    return data\n  }\n\n  /**\n   * Import cache contents\n   */\n  import(data: Record<string, any>): void {\n    this.clear()\n    \n    for (const [key, entry] of Object.entries(data)) {\n      if (entry && typeof entry === 'object' && 'value' in entry) {\n        this.cache.set(key, entry as CacheEntry)\n      }\n    }\n  }\n}","import { z } from 'zod'\n\n// Base provider types\nexport type AIProviderType =\n  | 'openai'\n  | 'anthropic'\n  | 'google'\n  | 'cohere'\n  | 'huggingface'\n  | 'replicate'\n  | 'stability'\n  | 'elevenlabs'\n  | 'whisper'\n  | 'custom'\n  | 'local'\n  | 'mock'\n\n// Configuration schemas\nexport const RateLimitConfigSchema = z.object({\n  requestsPerMinute: z.number().optional(),\n  tokensPerMinute: z.number().optional(),\n  requestsPerHour: z.number().optional(),\n  tokensPerHour: z.number().optional(),\n  concurrent: z.number().default(5),\n  strategy: z.enum(['fixed-window', 'sliding-window', 'token-bucket']).default('sliding-window')\n})\n\nexport const CacheConfigSchema = z.object({\n  enabled: z.boolean().default(true),\n  ttl: z.number().default(600000), // 10 minutes\n  maxSize: z.number().default(100), // MB\n  strategy: z.enum(['lru', 'fifo', 'lfu']).default('lru')\n})\n\nexport const RetryConfigSchema = z.object({\n  maxAttempts: z.number().default(3),\n  baseDelay: z.number().default(1000),\n  maxDelay: z.number().default(30000),\n  backoff: z.enum(['exponential', 'linear', 'fixed']).default('exponential')\n})\n\nexport const AIConfigSchema = z.object({\n  provider: z.custom<AIProviderType>(),\n  apiKey: z.string().optional(),\n  apiKeys: z.record(z.string()).optional(),\n  model: z.string().optional(),\n  models: z.record(z.string()).optional(),\n  baseUrl: z.string().optional(),\n  headers: z.record(z.string()).optional(),\n  maxRetries: z.number().optional(),\n  timeout: z.number().optional(),\n  cache: CacheConfigSchema.optional(),\n  rateLimit: RateLimitConfigSchema.optional(),\n  retry: RetryConfigSchema.optional(),\n  fallbackProviders: z.array(z.custom<AIProviderType>()).optional()\n})\n\n// Infer types from schemas\nexport type RateLimitConfig = z.infer<typeof RateLimitConfigSchema>\nexport type CacheConfig = z.infer<typeof CacheConfigSchema>\nexport type RetryConfig = z.infer<typeof RetryConfigSchema>\nexport type AIConfig = z.infer<typeof AIConfigSchema>\n\n// Request/Response types\nexport interface GenerateOptions {\n  maxTokens?: number\n  temperature?: number\n  topP?: number\n  topK?: number\n  frequencyPenalty?: number\n  presencePenalty?: number\n  stopSequences?: string[]\n  systemPrompt?: string\n  stream?: boolean\n  format?: 'text' | 'json' | 'markdown'\n  seed?: number\n  logitBias?: Record<string, number>\n  functions?: FunctionDefinition[]\n  responseFormat?: ResponseFormat\n}\n\nexport interface FunctionDefinition {\n  name: string\n  description: string\n  parameters: Record<string, any>\n}\n\nexport interface ResponseFormat {\n  type: 'text' | 'json_object'\n  schema?: Record<string, any>\n}\n\nexport interface TokenUsage {\n  promptTokens: number\n  completionTokens: number\n  totalTokens: number\n}\n\nexport interface AIResponse {\n  content: string\n  usage: TokenUsage\n  model: string\n  provider: string\n  cached: boolean\n  latency: number\n  metadata?: Record<string, any>\n}\n\n// Classification and analysis\nexport interface Classification {\n  label: string\n  confidence: number\n  scores: Record<string, number>\n}\n\nexport interface SentimentAnalysis {\n  sentiment: 'positive' | 'negative' | 'neutral' | 'mixed'\n  score: number\n  aspects?: AspectSentiment[]\n}\n\nexport interface AspectSentiment {\n  aspect: string\n  sentiment: string\n  score: number\n}\n\nexport interface SummarizeOptions {\n  maxLength?: number\n  minLength?: number\n  style?: 'bullet' | 'paragraph' | 'tldr' | 'key-points' | 'executive'\n  language?: string\n  extractive?: boolean\n}\n\n// Image types\nexport interface ImageGenerationOptions {\n  size?: '256x256' | '512x512' | '1024x1024' | '1792x1024' | '1024x1792'\n  style?: 'realistic' | 'artistic' | 'cartoon' | 'photographic'\n  quality?: 'standard' | 'hd'\n  n?: number\n  negativePrompt?: string\n  seed?: number\n  steps?: number\n  guidanceScale?: number\n}\n\nexport interface ImageResult {\n  url?: string\n  base64?: string\n  revisedPrompt?: string\n  metadata?: Record<string, any>\n}\n\nexport interface ImageAnalysisOptions {\n  features?: ('objects' | 'faces' | 'text' | 'colors' | 'tags' | 'description')[]\n  language?: string\n}\n\nexport interface ImageAnalysis {\n  description?: string\n  objects?: DetectedObject[]\n  faces?: DetectedFace[]\n  text?: ExtractedText[]\n  colors?: ColorInfo[]\n  tags?: string[]\n}\n\nexport interface DetectedObject {\n  label: string\n  confidence: number\n  boundingBox?: BoundingBox\n}\n\nexport interface DetectedFace {\n  age?: number\n  gender?: string\n  emotion?: string\n  boundingBox?: BoundingBox\n}\n\nexport interface ExtractedText {\n  text: string\n  confidence: number\n  boundingBox?: BoundingBox\n}\n\nexport interface ColorInfo {\n  hex: string\n  name: string\n  percentage: number\n}\n\nexport interface BoundingBox {\n  x: number\n  y: number\n  width: number\n  height: number\n}\n\n// Audio types\nexport interface TranscriptionOptions {\n  language?: string\n  translateTo?: string\n  format?: 'text' | 'srt' | 'vtt' | 'json'\n  timestamps?: boolean\n  speakerDiarization?: boolean\n}\n\nexport interface TranscriptionResult {\n  text: string\n  language?: string\n  duration?: number\n  words?: WordTimestamp[]\n  speakers?: SpeakerSegment[]\n}\n\nexport interface WordTimestamp {\n  word: string\n  start: number\n  end: number\n  confidence?: number\n}\n\nexport interface SpeakerSegment {\n  speaker: string\n  start: number\n  end: number\n  text: string\n}\n\nexport interface SpeechOptions {\n  voice?: string\n  speed?: number\n  pitch?: number\n  volume?: number\n  format?: 'mp3' | 'wav' | 'ogg'\n  language?: string\n  emotion?: string\n}\n\n// Code generation\nexport interface CodeGenerationOptions {\n  language?: string\n  framework?: string\n  style?: 'concise' | 'verbose' | 'documented'\n  includeTests?: boolean\n  includeComments?: boolean\n}\n\nexport interface CodeResult {\n  code: string\n  language: string\n  explanation?: string\n  tests?: string\n  dependencies?: string[]\n}\n\n// Chat types\nexport interface ChatMessage {\n  id: string\n  role: 'user' | 'assistant' | 'system' | 'function'\n  content: string\n  timestamp: Date\n  name?: string\n  functionCall?: FunctionCall\n  metadata?: Record<string, any>\n}\n\nexport interface FunctionCall {\n  name: string\n  arguments: string\n}\n\nexport interface ChatOptions {\n  systemPrompt?: string\n  model?: string\n  temperature?: number\n  maxTokens?: number\n  memorySize?: number\n  persistChat?: boolean\n}\n\n// Usage and analytics\nexport interface AIUsageStats {\n  tokensUsed: number\n  requestsCount: number\n  costEstimate: number\n  lastReset: Date\n  byProvider?: Record<string, ProviderStats>\n  byModel?: Record<string, ModelStats>\n  byCapability?: Record<string, number>\n  errors?: ErrorStats[]\n}\n\nexport interface ProviderStats {\n  requests: number\n  tokens: number\n  cost: number\n  averageLatency: number\n  errorRate: number\n}\n\nexport interface ModelStats {\n  requests: number\n  tokens: number\n  inputTokens: number\n  outputTokens: number\n  cost: number\n}\n\nexport interface ErrorStats {\n  timestamp: Date\n  provider: string\n  error: string\n  count: number\n}\n\n// Provider interface\nexport interface AIProvider {\n  name: string\n  \n  // Text capabilities\n  generateText?(prompt: string, options?: GenerateOptions): Promise<string>\n  generateStream?(prompt: string, options?: GenerateOptions): AsyncGenerator<string>\n  generateEmbedding?(text: string): Promise<number[]>\n  classifyText?(text: string, labels: string[]): Promise<Classification>\n  summarize?(text: string, options?: SummarizeOptions): Promise<string>\n  analyzeSentiment?(text: string): Promise<SentimentAnalysis>\n  \n  // Image capabilities\n  generateImage?(prompt: string, options?: ImageGenerationOptions): Promise<ImageResult>\n  analyzeImage?(image: string | Blob, options?: ImageAnalysisOptions): Promise<ImageAnalysis>\n  \n  // Audio capabilities\n  transcribeAudio?(audio: Blob, options?: TranscriptionOptions): Promise<TranscriptionResult>\n  generateSpeech?(text: string, options?: SpeechOptions): Promise<Blob>\n  \n  // Code capabilities\n  generateCode?(prompt: string, options?: CodeGenerationOptions): Promise<CodeResult>\n  explainCode?(code: string, language?: string): Promise<string>\n}","import { AIConfig, AIConfigSchema, AIProviderType } from '../types'\n\nexport class ConfigManager {\n  private config: AIConfig\n  private encryptedKeys = new Map<string, string>()\n\n  constructor(config: Partial<AIConfig>) {\n    // Validate and parse config\n    this.config = AIConfigSchema.parse(config)\n    \n    // Handle API keys\n    if (this.config.apiKey) {\n      this.encryptedKeys.set(this.config.provider, this.encryptApiKey(this.config.apiKey))\n    }\n    \n    if (this.config.apiKeys) {\n      Object.entries(this.config.apiKeys).forEach(([provider, key]) => {\n        this.encryptedKeys.set(provider, this.encryptApiKey(key))\n      })\n    }\n  }\n\n  getConfig(): AIConfig {\n    return { ...this.config }\n  }\n\n  getProviderConfig(provider?: AIProviderType) {\n    const targetProvider = provider || this.config.provider\n    \n    return {\n      provider: targetProvider,\n      apiKey: this.getApiKey(targetProvider),\n      model: this.getModel(targetProvider),\n      baseUrl: this.config.baseUrl,\n      headers: this.config.headers\n    }\n  }\n\n  getApiKey(provider?: AIProviderType): string | undefined {\n    const targetProvider = provider || this.config.provider\n    const encryptedKey = this.encryptedKeys.get(targetProvider)\n    \n    if (encryptedKey) {\n      return this.decryptApiKey(encryptedKey)\n    }\n    \n    return undefined\n  }\n\n  getModel(provider?: AIProviderType): string | undefined {\n    const targetProvider = provider || this.config.provider\n    \n    if (this.config.models && this.config.models[targetProvider]) {\n      return this.config.models[targetProvider]\n    }\n    \n    return this.config.model\n  }\n\n  getCacheConfig() {\n    return this.config.cache || {\n      enabled: true,\n      ttl: 600000,\n      maxSize: 100,\n      strategy: 'lru' as const\n    }\n  }\n\n  getRateLimitConfig() {\n    return this.config.rateLimit || {\n      requestsPerMinute: 60,\n      strategy: 'sliding-window' as const,\n      concurrent: 5\n    }\n  }\n\n  getRetryConfig() {\n    return this.config.retry || {\n      maxAttempts: 3,\n      baseDelay: 1000,\n      maxDelay: 30000,\n      backoff: 'exponential' as const\n    }\n  }\n\n  getFallbackProviders(): AIProviderType[] {\n    return this.config.fallbackProviders || []\n  }\n\n  updateConfig(updates: Partial<AIConfig>) {\n    const newConfig = { ...this.config, ...updates }\n    this.config = AIConfigSchema.parse(newConfig)\n    \n    // Update encrypted keys if needed\n    if (updates.apiKey) {\n      this.encryptedKeys.set(this.config.provider, this.encryptApiKey(updates.apiKey))\n    }\n    \n    if (updates.apiKeys) {\n      Object.entries(updates.apiKeys).forEach(([provider, key]) => {\n        this.encryptedKeys.set(provider, this.encryptApiKey(key))\n      })\n    }\n  }\n\n  // Simple encryption for API keys (in production, use proper encryption)\n  private encryptApiKey(key: string): string {\n    // This is a simple obfuscation - in production, use proper encryption\n    return Buffer.from(key).toString('base64')\n  }\n\n  private decryptApiKey(encryptedKey: string): string {\n    return Buffer.from(encryptedKey, 'base64').toString('utf-8')\n  }\n\n  // Validate provider configuration\n  validateProvider(provider: AIProviderType): { valid: boolean; errors: string[] } {\n    const errors: string[] = []\n    \n    const apiKey = this.getApiKey(provider)\n    if (!apiKey && provider !== 'local' && provider !== 'mock') {\n      errors.push(`API key required for provider: ${provider}`)\n    }\n    \n    const model = this.getModel(provider)\n    if (!model) {\n      errors.push(`Model not specified for provider: ${provider}`)\n    }\n    \n    return {\n      valid: errors.length === 0,\n      errors\n    }\n  }\n\n  // Export configuration (without sensitive data)\n  exportConfig(): Record<string, any> {\n    const { apiKey, apiKeys, ...safeConfig } = this.config\n    \n    return {\n      ...safeConfig,\n      hasApiKey: !!apiKey || !!apiKeys,\n      configuredProviders: Array.from(this.encryptedKeys.keys())\n    }\n  }\n}","import Boom from \"@hapi/boom\";\nimport VError from \"verror\";\n\nexport interface ErrorContext {\n  provider: string;\n  operation: string;\n  model?: string;\n  attempt?: number;\n  metadata?: Record<string, any>;\n}\n\nexport interface EnhancedError extends Error {\n  code?: string;\n  status?: number;\n  category?: string;\n  userMessage?: string;\n  isRetryable?: boolean;\n  context?: ErrorContext;\n  recommendations?: string[];\n  timestamp?: string;\n}\n\nexport class ErrorHandler {\n  private errorHistory: Array<{\n    timestamp: Date;\n    error: EnhancedError;\n    context: ErrorContext;\n    resolved: boolean;\n  }> = [];\n\n  private maxHistorySize = 1000;\n\n  /**\n   * Handle and enhance error\n   */\n  handleError(error: any, context: ErrorContext): EnhancedError {\n    const enhancedError = this.enhanceError(error, context);\n\n    // Add to history\n    this.addToHistory(enhancedError, context);\n\n    return enhancedError;\n  }\n\n  /**\n   * Enhance error with additional information\n   */\n  private enhanceError(error: any, context: ErrorContext): EnhancedError {\n    // Create enhanced error using VError\n    const enhancedError = new VError(\n      {\n        name: this.getErrorName(error),\n        cause: error,\n        info: {\n          ...context,\n          originalError: {\n            message: error.message,\n            code: error.code,\n            status: error.status,\n          },\n        },\n      },\n      this.getErrorMessage(error, context)\n    ) as EnhancedError;\n\n    // Add additional properties\n    enhancedError.code = error.code || this.inferErrorCode(error);\n    enhancedError.status = error.status || this.inferStatusCode(error);\n    enhancedError.category = this.categorizeError(error);\n    enhancedError.userMessage = this.getUserFriendlyMessage(enhancedError);\n    enhancedError.isRetryable = this.isRetryable(enhancedError);\n    enhancedError.context = context;\n    enhancedError.recommendations = this.getRecommendations(enhancedError);\n    enhancedError.timestamp = new Date().toISOString();\n\n    return enhancedError;\n  }\n\n  /**\n   * Get error name based on category\n   */\n  private getErrorName(error: any): string {\n    const category = this.categorizeError(error);\n\n    const errorNames: Record<string, string> = {\n      authentication: \"AuthenticationError\",\n      \"rate-limit\": \"RateLimitError\",\n      \"invalid-request\": \"ValidationError\",\n      \"server-error\": \"ServerError\",\n      network: \"NetworkError\",\n      timeout: \"TimeoutError\",\n      billing: \"BillingError\",\n      \"not-found\": \"NotFoundError\",\n      permission: \"PermissionError\",\n    };\n\n    return errorNames[category] || \"AIProviderError\";\n  }\n\n  /**\n   * Get formatted error message\n   */\n  private getErrorMessage(error: any, context: ErrorContext): string {\n    return `${context.operation} failed on ${context.provider}${\n      context.model ? ` (model: ${context.model})` : \"\"\n    }: ${error.message}`;\n  }\n\n  /**\n   * Categorize error\n   */\n  private categorizeError(error: any): string {\n    const message = error.message?.toLowerCase() || \"\";\n    const code = error.code || error.status;\n\n    if (\n      code === 401 ||\n      message.includes(\"unauthorized\") ||\n      message.includes(\"api key\")\n    ) {\n      return \"authentication\";\n    }\n\n    if (\n      code === 429 ||\n      message.includes(\"rate limit\") ||\n      message.includes(\"quota exceeded\")\n    ) {\n      return \"rate-limit\";\n    }\n\n    if (\n      code === 402 ||\n      message.includes(\"billing\") ||\n      message.includes(\"payment\")\n    ) {\n      return \"billing\";\n    }\n\n    if (\n      code === 400 ||\n      message.includes(\"invalid\") ||\n      message.includes(\"validation\")\n    ) {\n      return \"invalid-request\";\n    }\n\n    if (\n      code === 403 ||\n      message.includes(\"forbidden\") ||\n      message.includes(\"permission\")\n    ) {\n      return \"permission\";\n    }\n\n    if (code === 404 || message.includes(\"not found\")) {\n      return \"not-found\";\n    }\n\n    if (code >= 500 || message.includes(\"internal server\")) {\n      return \"server-error\";\n    }\n\n    if (\n      message.includes(\"network\") ||\n      message.includes(\"econnrefused\") ||\n      message.includes(\"enotfound\")\n    ) {\n      return \"network\";\n    }\n\n    if (message.includes(\"timeout\") || code === \"ETIMEDOUT\") {\n      return \"timeout\";\n    }\n\n    return \"unknown\";\n  }\n\n  /**\n   * Infer error code\n   */\n  private inferErrorCode(error: any): string {\n    if (error.code) return error.code;\n\n    const category = this.categorizeError(error);\n    const codes: Record<string, string> = {\n      authentication: \"AUTH_ERROR\",\n      \"rate-limit\": \"RATE_LIMIT_ERROR\",\n      \"invalid-request\": \"VALIDATION_ERROR\",\n      \"server-error\": \"SERVER_ERROR\",\n      network: \"NETWORK_ERROR\",\n      timeout: \"TIMEOUT_ERROR\",\n      billing: \"BILLING_ERROR\",\n      \"not-found\": \"NOT_FOUND\",\n      permission: \"PERMISSION_DENIED\",\n    };\n\n    return codes[category] || \"UNKNOWN_ERROR\";\n  }\n\n  /**\n   * Infer HTTP status code\n   */\n  private inferStatusCode(error: any): number {\n    if (error.status) return error.status;\n\n    const category = this.categorizeError(error);\n    const statuses: Record<string, number> = {\n      authentication: 401,\n      \"rate-limit\": 429,\n      \"invalid-request\": 400,\n      \"server-error\": 500,\n      network: 503,\n      timeout: 504,\n      billing: 402,\n      \"not-found\": 404,\n      permission: 403,\n    };\n\n    return statuses[category] || 500;\n  }\n\n  /**\n   * Get user-friendly error message\n   */\n  private getUserFriendlyMessage(error: EnhancedError): string {\n    const messages: Record<string, string> = {\n      authentication:\n        \"Authentication failed. Please check your API key and ensure it has the necessary permissions.\",\n      \"rate-limit\":\n        \"Rate limit exceeded. Please wait a moment before trying again.\",\n      billing:\n        \"There is an issue with your billing or quota. Please check your account status.\",\n      \"invalid-request\":\n        \"The request contains invalid parameters. Please check your input and try again.\",\n      \"server-error\":\n        \"The AI service is temporarily unavailable. Please try again later.\",\n      network:\n        \"Network connection issue. Please check your internet connection and try again.\",\n      timeout:\n        \"The request timed out. Please try again with a shorter prompt or wait a moment.\",\n      \"not-found\":\n        \"The requested resource was not found. Please verify the endpoint or model name.\",\n      permission: \"You do not have permission to perform this action.\",\n      unknown:\n        \"An unexpected error occurred. Please try again or contact support if the issue persists.\",\n    };\n\n    return messages[error.category || \"unknown\"] as any;\n  }\n\n  /**\n   * Determine if error is retryable\n   */\n  private isRetryable(error: EnhancedError): boolean {\n    const retryableCategories = [\n      \"rate-limit\",\n      \"server-error\",\n      \"network\",\n      \"timeout\",\n    ];\n    return retryableCategories.includes(error.category || \"\");\n  }\n\n  /**\n   * Get recommendations for resolving the error\n   */\n  private getRecommendations(error: EnhancedError): string[] {\n    const recommendations: string[] = [];\n\n    switch (error.category) {\n      case \"authentication\":\n        recommendations.push(\"Verify your API key is correct\");\n        recommendations.push(\n          \"Check if the API key has been revoked or expired\"\n        );\n        recommendations.push(\n          \"Ensure the API key has the necessary permissions\"\n        );\n        break;\n\n      case \"rate-limit\":\n        recommendations.push(\"Implement request queuing or throttling\");\n        recommendations.push(\n          \"Consider upgrading your API plan for higher limits\"\n        );\n        recommendations.push(\"Spread requests over time to avoid bursts\");\n        break;\n\n      case \"billing\":\n        recommendations.push(\"Check your account balance and payment method\");\n        recommendations.push(\"Review your usage and adjust limits if needed\");\n        recommendations.push(\"Contact support if billing issues persist\");\n        break;\n\n      case \"invalid-request\":\n        recommendations.push(\n          \"Review the API documentation for correct parameters\"\n        );\n        recommendations.push(\"Validate input data before sending requests\");\n        recommendations.push(\n          \"Check for any recent API changes or deprecations\"\n        );\n        break;\n\n      case \"network\":\n        recommendations.push(\"Check your internet connection\");\n        recommendations.push(\"Verify firewall or proxy settings\");\n        recommendations.push(\"Try using a different network\");\n        break;\n\n      case \"timeout\":\n        recommendations.push(\"Reduce the size of your request\");\n        recommendations.push(\"Increase timeout settings if possible\");\n        recommendations.push(\"Break large requests into smaller chunks\");\n        break;\n    }\n\n    // Add context-specific recommendations\n    if (error.context?.attempt && error.context.attempt > 2) {\n      recommendations.push(\"Consider using a fallback provider\");\n      recommendations.push(\"Implement circuit breaker pattern\");\n    }\n\n    return recommendations;\n  }\n\n  /**\n   * Add error to history\n   */\n  private addToHistory(error: EnhancedError, context: ErrorContext): void {\n    this.errorHistory.push({\n      timestamp: new Date(),\n      error,\n      context,\n      resolved: false,\n    });\n\n    // Limit history size\n    if (this.errorHistory.length > this.maxHistorySize) {\n      this.errorHistory = this.errorHistory.slice(-this.maxHistorySize / 2);\n    }\n  }\n\n  /**\n   * Create HTTP-friendly error using Boom\n   */\n  createHttpError(error: EnhancedError): Boom.Boom {\n    const boomError = Boom.boomify(error, {\n      statusCode: error.status || 500,\n      message: error.userMessage,\n    });\n\n    // Add custom data\n    boomError.output.payload.code = error.code;\n    boomError.output.payload.category = error.category;\n    boomError.output.payload.isRetryable = error.isRetryable;\n    boomError.output.payload.recommendations = error.recommendations;\n\n    return boomError;\n  }\n\n  /**\n   * Get error statistics\n   */\n  getErrorStats(timeWindow?: number): {\n    total: number;\n    byCategory: Record<string, number>;\n    byProvider: Record<string, number>;\n    resolutionRate: number;\n    recentErrors: Array<{\n      timestamp: string;\n      category: string;\n      provider: string;\n      message: string;\n    }>;\n  } {\n    const cutoff = timeWindow ? Date.now() - timeWindow : 0;\n    const relevantErrors = this.errorHistory.filter(\n      (entry) => entry.timestamp.getTime() > cutoff\n    );\n\n    const stats = {\n      total: relevantErrors.length,\n      byCategory: {} as Record<string, number>,\n      byProvider: {} as Record<string, number>,\n      resolutionRate: 0,\n      recentErrors: [] as any[],\n    };\n\n    relevantErrors.forEach((entry) => {\n      // Count by category\n      const category = entry.error.category || \"unknown\";\n      stats.byCategory[category] = (stats.byCategory[category] || 0) + 1;\n\n      // Count by provider\n      const provider = entry.context.provider;\n      stats.byProvider[provider] = (stats.byProvider[provider] || 0) + 1;\n\n      // Add to recent errors\n      if (stats.recentErrors.length < 10) {\n        stats.recentErrors.push({\n          timestamp: entry.timestamp.toISOString(),\n          category,\n          provider,\n          message: entry.error.message,\n        });\n      }\n    });\n\n    // Calculate resolution rate\n    const resolved = relevantErrors.filter((e) => e.resolved).length;\n    stats.resolutionRate =\n      relevantErrors.length > 0 ? resolved / relevantErrors.length : 0;\n\n    return stats;\n  }\n\n  /**\n   * Mark error as resolved\n   */\n  markResolved(errorId: string): void {\n    const entry = this.errorHistory.find(\n      (e) => e.timestamp.toISOString() === errorId\n    );\n    if (entry) {\n      entry.resolved = true;\n    }\n  }\n\n  /**\n   * Clear error history\n   */\n  clearHistory(): void {\n    this.errorHistory = [];\n  }\n\n  /**\n   * Export error history\n   */\n  exportHistory(): Array<{\n    timestamp: string;\n    error: any;\n    context: ErrorContext;\n    resolved: boolean;\n  }> {\n    return this.errorHistory.map((entry) => ({\n      timestamp: entry.timestamp.toISOString(),\n      error: {\n        message: entry.error.message,\n        code: entry.error.code,\n        category: entry.error.category,\n        userMessage: entry.error.userMessage,\n        isRetryable: entry.error.isRetryable,\n        recommendations: entry.error.recommendations,\n      },\n      context: entry.context,\n      resolved: entry.resolved,\n    }));\n  }\n}\n","import Bottleneck from \"bottleneck\";\nimport { RateLimitConfig } from \"../types\";\n\ninterface RateLimiterOptions extends RateLimitConfig {\n  id: string;\n}\n\ninterface LimiterStats {\n  running: number;\n  queued: number;\n  done: number;\n  failed: number;\n  reservoir?: number | null;\n}\n\nexport class RateLimiter {\n  private limiters = new Map<string, Bottleneck>();\n  private tokenBuckets = new Map<string, TokenBucket>();\n\n  /**\n   * Create or get a rate limiter for a specific provider/key\n   */\n  createLimiter(options: RateLimiterOptions): Bottleneck {\n    const existingLimiter = this.limiters.get(options.id);\n    if (existingLimiter) {\n      return existingLimiter;\n    }\n\n    // Configure based on strategy\n    let limiterConfig: Bottleneck.ConstructorOptions;\n\n    switch (options.strategy) {\n      case \"token-bucket\":\n        limiterConfig = this.createTokenBucketConfig(options);\n        break;\n\n      case \"fixed-window\":\n        limiterConfig = this.createFixedWindowConfig(options);\n        break;\n\n      case \"sliding-window\":\n      default:\n        limiterConfig = this.createSlidingWindowConfig(options);\n        break;\n    }\n\n    const limiter = new Bottleneck(limiterConfig);\n\n    // Add event handlers\n    limiter.on(\"error\", (error) => {\n      console.error(`Rate limiter error for ${options.id}:`, error);\n    });\n\n    limiter.on(\"failed\", async (error) => {\n      console.warn(`Job failed in rate limiter ${options.id}:`, error);\n      // Retry logic can be added here\n    });\n\n    this.limiters.set(options.id, limiter);\n\n    // Create token bucket if needed\n    if (options.tokensPerMinute || options.tokensPerHour) {\n      this.createTokenBucket(options);\n    }\n\n    return limiter;\n  }\n\n  /**\n   * Get limiter by ID\n   */\n  getLimiter(id: string): Bottleneck | undefined {\n    return this.limiters.get(id);\n  }\n\n  /**\n   * Schedule a job with rate limiting\n   */\n  async schedule<T>(\n    limiterId: string,\n    fn: () => Promise<T>,\n    priority?: number\n  ): Promise<T> {\n    const limiter = this.limiters.get(limiterId);\n    if (!limiter) {\n      throw new Error(`No rate limiter found with ID: ${limiterId}`);\n    }\n\n    const options: Bottleneck.JobOptions = {};\n    if (priority !== undefined) {\n      (options as any).priority = priority;\n    }\n\n    return limiter.schedule(options, fn);\n  }\n\n  /**\n   * Check and consume tokens\n   */\n  async consumeTokens(limiterId: string, tokens: number): Promise<boolean> {\n    const bucket = this.tokenBuckets.get(limiterId);\n    if (!bucket) {\n      return true; // No token limit configured\n    }\n\n    return bucket.consume(tokens);\n  }\n\n  /**\n   * Get statistics for a limiter\n   */\n  async getStats(limiterId: string): Promise<LimiterStats | null> {\n    const limiter = this.limiters.get(limiterId);\n    if (!limiter) {\n      return null;\n    }\n\n    const counts = await limiter.counts();\n    const reservoir = await limiter.currentReservoir();\n\n    return {\n      running: counts.RUNNING,\n      queued: counts.QUEUED,\n      done: counts.DONE || 0,\n      failed: (counts as any).FAILED || 0,\n      reservoir,\n    };\n  }\n\n  /**\n   * Get all limiter statistics\n   */\n  async getAllStats(): Promise<Record<string, LimiterStats>> {\n    const stats: Record<string, LimiterStats> = {};\n\n    for (const [id] of this.limiters) {\n      const limiterStats = await this.getStats(id);\n      if (limiterStats) {\n        stats[id] = limiterStats;\n      }\n    }\n\n    return stats;\n  }\n\n  /**\n   * Update limiter configuration\n   */\n  async updateLimiter(\n    id: string,\n    newConfig: Partial<RateLimiterOptions>\n  ): Promise<void> {\n    const limiter = this.limiters.get(id);\n    if (!limiter) {\n      throw new Error(`No rate limiter found with ID: ${id}`);\n    }\n\n    // Bottleneck doesn't support updating configuration directly\n    // We need to create a new limiter\n    const currentConfig = await this.getLimiterConfig(id);\n    const mergedConfig = { ...currentConfig, ...newConfig, id };\n\n    // Stop the old limiter\n    await limiter.stop();\n    this.limiters.delete(id);\n\n    // Create new limiter with updated config\n    this.createLimiter(mergedConfig as RateLimiterOptions);\n  }\n\n  /**\n   * Clear queued jobs for a limiter\n   */\n  async clearQueue(limiterId: string): Promise<void> {\n    const limiter = this.limiters.get(limiterId);\n    if (limiter) {\n      await limiter.stop({ dropWaitingJobs: true });\n    }\n  }\n\n  /**\n   * Stop a limiter\n   */\n  async stopLimiter(limiterId: string): Promise<void> {\n    const limiter = this.limiters.get(limiterId);\n    if (limiter) {\n      await limiter.stop();\n      this.limiters.delete(limiterId);\n    }\n\n    const bucket = this.tokenBuckets.get(limiterId);\n    if (bucket) {\n      bucket.stop();\n      this.tokenBuckets.delete(limiterId);\n    }\n  }\n\n  /**\n   * Stop all limiters\n   */\n  async stopAll(): Promise<void> {\n    const stopPromises: Promise<void>[] = [];\n\n    for (const [id] of this.limiters) {\n      stopPromises.push(this.stopLimiter(id));\n    }\n\n    await Promise.all(stopPromises);\n  }\n\n  /**\n   * Create sliding window configuration\n   */\n  private createSlidingWindowConfig(\n    options: RateLimiterOptions\n  ): Bottleneck.ConstructorOptions {\n    const requestsPerMinute = options.requestsPerMinute || 60;\n    const minTime = Math.ceil(60000 / requestsPerMinute); // ms between requests\n\n    return {\n      maxConcurrent: options.concurrent || 5,\n      minTime,\n      highWater: Math.max(100, requestsPerMinute * 2), // Queue size\n      strategy: Bottleneck.strategy.LEAK, // Process queue steadily\n      rejectOnDrop: false,\n    };\n  }\n\n  /**\n   * Create fixed window configuration\n   */\n  private createFixedWindowConfig(\n    options: RateLimiterOptions\n  ): Bottleneck.ConstructorOptions {\n    const requestsPerMinute = options.requestsPerMinute || 60;\n\n    return {\n      maxConcurrent: options.concurrent || 5,\n      reservoir: requestsPerMinute,\n      reservoirRefreshInterval: 60000, // 1 minute\n      reservoirRefreshAmount: requestsPerMinute,\n      highWater: Math.max(100, requestsPerMinute * 2),\n      strategy: Bottleneck.strategy.LEAK,\n    };\n  }\n\n  /**\n   * Create token bucket configuration\n   */\n  private createTokenBucketConfig(\n    options: RateLimiterOptions\n  ): Bottleneck.ConstructorOptions {\n    const requestsPerMinute = options.requestsPerMinute || 60;\n    const refillRate = Math.ceil(requestsPerMinute / 60); // tokens per second\n\n    return {\n      maxConcurrent: options.concurrent || 5,\n      reservoir: requestsPerMinute,\n      reservoirRefreshInterval: 1000, // Refill every second\n      reservoirRefreshAmount: refillRate,\n      highWater: Math.max(100, requestsPerMinute * 2),\n      strategy: Bottleneck.strategy.LEAK,\n    };\n  }\n\n  /**\n   * Create token bucket for token-based rate limiting\n   */\n  private createTokenBucket(options: RateLimiterOptions): void {\n    const bucket = new TokenBucket(options);\n    this.tokenBuckets.set(options.id, bucket);\n  }\n\n  /**\n   * Get limiter configuration (mock implementation)\n   */\n  private async getLimiterConfig(\n    _id: string\n  ): Promise<Partial<RateLimiterOptions>> {\n    // In a real implementation, you might store configs separately\n    return {\n      requestsPerMinute: 60,\n      strategy: \"sliding-window\",\n      concurrent: 5,\n    };\n  }\n}\n\n/**\n * Token bucket implementation for token-based rate limiting\n */\nclass TokenBucket {\n  private tokens: number;\n  private maxTokens: number;\n  private refillRate: number;\n  private lastRefill: number;\n  private interval?: NodeJS.Timeout;\n\n  constructor(options: RateLimiterOptions) {\n    this.maxTokens = options.tokensPerMinute || 100000;\n    this.tokens = this.maxTokens;\n    this.refillRate = this.maxTokens / 60000; // tokens per ms\n    this.lastRefill = Date.now();\n\n    // Start refill timer\n    this.startRefillTimer();\n  }\n\n  /**\n   * Try to consume tokens\n   */\n  consume(amount: number): boolean {\n    this.refill();\n\n    if (this.tokens >= amount) {\n      this.tokens -= amount;\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Get available tokens\n   */\n  getAvailable(): number {\n    this.refill();\n    return Math.floor(this.tokens);\n  }\n\n  /**\n   * Refill tokens based on elapsed time\n   */\n  private refill(): void {\n    const now = Date.now();\n    const elapsed = now - this.lastRefill;\n    const tokensToAdd = elapsed * this.refillRate;\n\n    this.tokens = Math.min(this.maxTokens, this.tokens + tokensToAdd);\n    this.lastRefill = now;\n  }\n\n  /**\n   * Start automatic refill timer\n   */\n  private startRefillTimer(): void {\n    this.interval = setInterval(() => {\n      this.refill();\n    }, 1000); // Refill every second\n  }\n\n  /**\n   * Stop the token bucket\n   */\n  stop(): void {\n    if (this.interval) {\n      clearInterval(this.interval);\n    }\n  }\n}\n","import pRetry, { AbortError } from 'p-retry'\nimport { backOff } from 'exponential-backoff'\nimport VError from 'verror'\nimport { RetryConfig } from '../types'\n\ninterface RetryContext {\n  provider: string\n  operation: string\n  model?: string\n  metadata?: Record<string, any>\n}\n\ninterface RetryOptions extends RetryConfig {\n  onRetry?: (error: Error, attempt: number) => void\n  shouldRetry?: (error: any) => boolean\n}\n\nexport class RetryManager {\n  private config: RetryConfig\n\n  constructor(config: RetryConfig) {\n    this.config = config\n  }\n\n  /**\n   * Execute operation with retry logic\n   */\n  async execute<T>(\n    operation: () => Promise<T>,\n    context: RetryContext,\n    options?: Partial<RetryOptions>\n  ): Promise<T> {\n    const mergedOptions = { ...this.config, ...options }\n    \n    return pRetry(\n      async (attemptNumber) => {\n        try {\n          return await operation()\n        } catch (error) {\n          // Wrap error with context\n          const wrappedError = this.wrapError(error, context, attemptNumber)\n          \n          // Check if we should retry\n          if (!this.shouldRetry(error, mergedOptions)) {\n            throw new AbortError(wrappedError)\n          }\n          \n          // Call retry callback if provided\n          if (mergedOptions.onRetry) {\n            mergedOptions.onRetry(wrappedError, attemptNumber)\n          }\n          \n          throw wrappedError\n        }\n      },\n      {\n        retries: mergedOptions.maxAttempts - 1,\n        factor: mergedOptions.backoff === 'exponential' ? 2 : 1,\n        minTimeout: mergedOptions.baseDelay,\n        maxTimeout: mergedOptions.maxDelay,\n        randomize: true,\n        onFailedAttempt: (error) => {\n          // Log failed attempts\n          console.warn(\n            `Retry attempt ${error.attemptNumber} failed for ${context.operation}:`,\n            error.message\n          )\n        }\n      }\n    )\n  }\n\n  /**\n   * Execute with custom exponential backoff\n   */\n  async executeWithBackoff<T>(\n    operation: () => Promise<T>,\n    context: RetryContext,\n    options?: Partial<RetryOptions>\n  ): Promise<T> {\n    const mergedOptions = { ...this.config, ...options }\n    \n    try {\n      return await backOff(operation, {\n        numOfAttempts: mergedOptions.maxAttempts,\n        startingDelay: mergedOptions.baseDelay,\n        maxDelay: mergedOptions.maxDelay,\n        jitter: 'full',\n        timeMultiple: 2,\n        retry: (error, attemptNumber) => {\n          const shouldRetry = this.shouldRetry(error, mergedOptions)\n          \n          if (shouldRetry && mergedOptions.onRetry) {\n            mergedOptions.onRetry(error, attemptNumber)\n          }\n          \n          return shouldRetry\n        }\n      })\n    } catch (error) {\n      throw this.wrapError(error, context, mergedOptions.maxAttempts)\n    }\n  }\n\n  /**\n   * Wrap error with context information\n   */\n  private wrapError(error: any, context: RetryContext, attempt: number): Error {\n    return new VError(\n      {\n        name: 'AIProviderError',\n        cause: error,\n        info: {\n          ...context,\n          attempt,\n          timestamp: new Date().toISOString(),\n          errorCode: error.code || error.status,\n          errorType: this.categorizeError(error)\n        }\n      },\n      `Failed to execute ${context.operation} on ${context.provider} (attempt ${attempt})`\n    )\n  }\n\n  /**\n   * Determine if error should trigger retry\n   */\n  private shouldRetry(error: any, options: RetryOptions): boolean {\n    // Use custom retry logic if provided\n    if (options.shouldRetry) {\n      return options.shouldRetry(error)\n    }\n    \n    // Check error categorization\n    const errorType = this.categorizeError(error)\n    \n    switch (errorType) {\n      case 'authentication':\n      case 'invalid_request':\n      case 'not_found':\n      case 'permission_denied':\n        // Don't retry these errors\n        return false\n      \n      case 'rate_limit':\n        // Always retry rate limits with backoff\n        return true\n      \n      case 'server_error':\n      case 'network':\n      case 'timeout':\n        // Retry these errors\n        return true\n      \n      default:\n        // Default to retry for unknown errors\n        return true\n    }\n  }\n\n  /**\n   * Categorize error type\n   */\n  private categorizeError(error: any): string {\n    const message = error.message?.toLowerCase() || ''\n    const code = error.code || error.status\n    \n    // Authentication errors\n    if (\n      code === 401 ||\n      message.includes('unauthorized') ||\n      message.includes('api key') ||\n      message.includes('authentication')\n    ) {\n      return 'authentication'\n    }\n    \n    // Rate limiting\n    if (code === 429 || message.includes('rate limit')) {\n      return 'rate_limit'\n    }\n    \n    // Invalid request\n    if (\n      code === 400 ||\n      message.includes('invalid') ||\n      message.includes('validation')\n    ) {\n      return 'invalid_request'\n    }\n    \n    // Not found\n    if (code === 404 || message.includes('not found')) {\n      return 'not_found'\n    }\n    \n    // Permission denied\n    if (code === 403 || message.includes('forbidden')) {\n      return 'permission_denied'\n    }\n    \n    // Server errors\n    if (code >= 500 || message.includes('internal server')) {\n      return 'server_error'\n    }\n    \n    // Network errors\n    if (\n      message.includes('network') ||\n      message.includes('econnrefused') ||\n      message.includes('enotfound') ||\n      message.includes('econnreset')\n    ) {\n      return 'network'\n    }\n    \n    // Timeout\n    if (\n      message.includes('timeout') ||\n      message.includes('etimedout') ||\n      code === 'ETIMEDOUT'\n    ) {\n      return 'timeout'\n    }\n    \n    return 'unknown'\n  }\n\n  /**\n   * Create a retry wrapper for a function\n   */\n  wrap<T extends (...args: any[]) => Promise<any>>(\n    fn: T,\n    context: RetryContext,\n    options?: Partial<RetryOptions>\n  ): T {\n    return (async (...args: Parameters<T>) => {\n      return this.execute(() => fn(...args), context, options)\n    }) as T\n  }\n\n  /**\n   * Update configuration\n   */\n  updateConfig(config: Partial<RetryConfig>): void {\n    this.config = { ...this.config, ...config }\n  }\n\n  /**\n   * Get current configuration\n   */\n  getConfig(): RetryConfig {\n    return { ...this.config }\n  }\n\n  /**\n   * Calculate delay for next retry\n   */\n  calculateDelay(attempt: number, options?: Partial<RetryOptions>): number {\n    const mergedOptions = { ...this.config, ...options }\n    \n    let delay: number\n    \n    switch (mergedOptions.backoff) {\n      case 'exponential':\n        delay = Math.min(\n          mergedOptions.baseDelay * Math.pow(2, attempt - 1),\n          mergedOptions.maxDelay\n        )\n        break\n      \n      case 'linear':\n        delay = Math.min(\n          mergedOptions.baseDelay * attempt,\n          mergedOptions.maxDelay\n        )\n        break\n      \n      case 'fixed':\n      default:\n        delay = mergedOptions.baseDelay\n        break\n    }\n    \n    // Add jitter to prevent thundering herd\n    const jitter = delay * 0.2 * Math.random()\n    return Math.floor(delay + jitter)\n  }\n\n  /**\n   * Get retry statistics\n   */\n  getRetryStats(error: any): {\n    shouldRetry: boolean\n    errorType: string\n    suggestedDelay: number\n    maxAttempts: number\n  } {\n    const errorType = this.categorizeError(error)\n    const shouldRetry = this.shouldRetry(error, this.config)\n    \n    // Suggest longer delays for rate limits\n    let suggestedDelay = this.config.baseDelay\n    if (errorType === 'rate_limit') {\n      suggestedDelay = this.config.baseDelay * 2\n    }\n    \n    return {\n      shouldRetry,\n      errorType,\n      suggestedDelay,\n      maxAttempts: this.config.maxAttempts\n    }\n  }\n}","import { encode } from \"gpt-tokenizer\";\nimport { encoding_for_model, get_encoding } from \"tiktoken\";\n\ninterface TokenInfo {\n  count: number;\n  truncated: boolean;\n  originalLength?: number;\n}\n\ninterface ModelTokenLimits {\n  [model: string]: number;\n}\n\nexport class TokenManager {\n  // // private encoders = new Map<string, any>()\n\n  private tokenLimits: ModelTokenLimits = {\n    // OpenAI models\n    \"gpt-4\": 8192,\n    \"gpt-4-32k\": 32768,\n    \"gpt-4-turbo\": 128000,\n    \"gpt-4-turbo-preview\": 128000,\n    \"gpt-3.5-turbo\": 4096,\n    \"gpt-3.5-turbo-16k\": 16384,\n\n    // Anthropic models\n    \"claude-3-opus\": 200000,\n    \"claude-3-sonnet\": 200000,\n    \"claude-3-haiku\": 200000,\n    \"claude-2.1\": 200000,\n    \"claude-2\": 100000,\n\n    // Google models\n    \"gemini-pro\": 30720,\n    \"gemini-pro-vision\": 30720,\n    \"palm-2\": 8192,\n\n    // Default\n    default: 4096,\n  };\n\n  private modelPricing = {\n    // OpenAI pricing per 1K tokens\n    \"gpt-4\": { input: 0.03, output: 0.06 },\n    \"gpt-4-turbo\": { input: 0.01, output: 0.03 },\n    \"gpt-3.5-turbo\": { input: 0.0005, output: 0.0015 },\n\n    // Anthropic pricing per 1K tokens\n    \"claude-3-opus\": { input: 0.015, output: 0.075 },\n    \"claude-3-sonnet\": { input: 0.003, output: 0.015 },\n    \"claude-3-haiku\": { input: 0.00025, output: 0.00125 },\n\n    // Google pricing per 1K tokens\n    \"gemini-pro\": { input: 0.0005, output: 0.0015 },\n\n    // Default free\n    default: { input: 0, output: 0 },\n  };\n\n  /**\n   * Count tokens in text for a specific model\n   */\n  async countTokens(text: string, model: string): Promise<number> {\n    try {\n      // Use tiktoken for OpenAI models\n      if (\n        model.includes(\"gpt\") ||\n        model.includes(\"davinci\") ||\n        model.includes(\"turbo\")\n      ) {\n        return this.countTokensWithTiktoken(text, model);\n      }\n\n      // Use gpt-tokenizer as fallback for other models\n      return encode(text).length;\n    } catch (error) {\n      // Fallback to character-based estimation\n      return this.estimateTokens(text);\n    }\n  }\n\n  /**\n   * Count tokens using tiktoken\n   */\n  private countTokensWithTiktoken(text: string, model: string): number {\n    try {\n      // Try to get encoding for specific model\n      const encoder = encoding_for_model(model as any);\n      const tokens = encoder.encode(text);\n      const count = tokens.length;\n      encoder.free(); // Free memory\n      return count;\n    } catch {\n      // Fallback to cl100k_base encoding\n      const encoder = get_encoding(\"cl100k_base\");\n      const tokens = encoder.encode(text);\n      const count = tokens.length;\n      encoder.free();\n      return count;\n    }\n  }\n\n  /**\n   * Estimate tokens based on character count\n   */\n  private estimateTokens(text: string): number {\n    // Rough estimation: 1 token ≈ 4 characters for English\n    // Adjust for other languages if needed\n    return Math.ceil(text.length / 4);\n  }\n\n  /**\n   * Get token information for text\n   */\n  async getTokenInfo(\n    text: string,\n    model: string,\n    maxTokens?: number\n  ): Promise<TokenInfo> {\n    const count = await this.countTokens(text, model);\n    const limit =\n      maxTokens ?? this.tokenLimits[model] ?? this.tokenLimits.default ?? 4096;\n\n    return {\n      count,\n      truncated: count > limit,\n      originalLength: text.length,\n    };\n  }\n\n  /**\n   * Validate if text fits within token limits\n   */\n  async validateTokenLimits(\n    text: string,\n    model: string,\n    maxTokens?: number,\n    responseTokens: number = 1000\n  ): Promise<{ valid: boolean; availableTokens: number }> {\n    const promptTokens = await this.countTokens(text, model);\n    const modelLimit =\n      this.tokenLimits[model] ?? this.tokenLimits.default ?? 4096;\n    const limit = maxTokens ?? modelLimit;\n\n    const totalRequired = promptTokens + responseTokens;\n    const valid = totalRequired <= limit;\n    const availableTokens = Math.max(0, limit - promptTokens);\n\n    return { valid, availableTokens };\n  }\n\n  /**\n   * Truncate text to fit within token limit\n   */\n  async truncateToTokenLimit(\n    text: string,\n    model: string,\n    maxTokens: number,\n    preserveEnd: boolean = false\n  ): Promise<string> {\n    const currentTokens = await this.countTokens(text, model);\n\n    if (currentTokens <= maxTokens) {\n      return text;\n    }\n\n    // Binary search for the right length\n    let low = 0;\n    let high = text.length;\n    let bestFit = \"\";\n\n    while (low <= high) {\n      const mid = Math.floor((low + high) / 2);\n      const substring = preserveEnd\n        ? text.slice(text.length - mid)\n        : text.slice(0, mid);\n\n      const tokens = await this.countTokens(substring, model);\n\n      if (tokens <= maxTokens) {\n        bestFit = substring;\n        low = mid + 1;\n      } else {\n        high = mid - 1;\n      }\n    }\n\n    // Add ellipsis if truncated\n    if (preserveEnd) {\n      return \"...\" + bestFit;\n    } else {\n      return bestFit + \"...\";\n    }\n  }\n\n  /**\n   * Split text into chunks that fit within token limits\n   */\n  async splitIntoChunks(\n    text: string,\n    model: string,\n    chunkSize: number,\n    overlap: number = 0\n  ): Promise<string[]> {\n    const chunks: string[] = [];\n    const sentences = this.splitIntoSentences(text);\n\n    let currentChunk = \"\";\n    let currentTokens = 0;\n\n    for (const sentence of sentences) {\n      const sentenceTokens = await this.countTokens(sentence, model);\n\n      if (currentTokens + sentenceTokens > chunkSize && currentChunk) {\n        chunks.push(currentChunk.trim());\n\n        // Handle overlap\n        if (overlap > 0) {\n          const overlapText = await this.getOverlapText(\n            currentChunk,\n            model,\n            overlap\n          );\n          currentChunk = overlapText + \" \" + sentence;\n          currentTokens = await this.countTokens(currentChunk, model);\n        } else {\n          currentChunk = sentence;\n          currentTokens = sentenceTokens;\n        }\n      } else {\n        currentChunk += (currentChunk ? \" \" : \"\") + sentence;\n        currentTokens += sentenceTokens;\n      }\n    }\n\n    if (currentChunk) {\n      chunks.push(currentChunk.trim());\n    }\n\n    return chunks;\n  }\n\n  /**\n   * Split text into sentences\n   */\n  private splitIntoSentences(text: string): string[] {\n    // Simple sentence splitting - can be improved with better NLP\n    return text.match(/[^.!?]+[.!?]+/g) || [text];\n  }\n\n  /**\n   * Get overlap text for chunking\n   */\n  private async getOverlapText(\n    text: string,\n    model: string,\n    overlapTokens: number\n  ): Promise<string> {\n    const sentences = this.splitIntoSentences(text).reverse();\n    let overlapText = \"\";\n    let currentTokens = 0;\n\n    for (const sentence of sentences) {\n      const sentenceTokens = await this.countTokens(sentence, model);\n      if (currentTokens + sentenceTokens <= overlapTokens) {\n        overlapText = sentence + \" \" + overlapText;\n        currentTokens += sentenceTokens;\n      } else {\n        break;\n      }\n    }\n\n    return overlapText.trim();\n  }\n\n  /**\n   * Estimate cost for tokens\n   */\n  estimateCost(\n    tokens: number,\n    model: string,\n    type: \"input\" | \"output\" = \"input\"\n  ): number {\n    const pricing =\n      this.modelPricing[model as keyof typeof this.modelPricing] ??\n      this.modelPricing.default;\n    return (tokens / 1000) * pricing[type];\n  }\n\n  /**\n   * Get model token limit\n   */\n  getModelTokenLimit(model: string): number {\n    return this.tokenLimits[model] ?? this.tokenLimits.default ?? 4096;\n  }\n\n  /**\n   * Get all model limits\n   */\n  getAllModelLimits(): ModelTokenLimits {\n    return { ...this.tokenLimits };\n  }\n\n  /**\n   * Estimate tokens for a conversation\n   */\n  async estimateConversationTokens(\n    messages: Array<{ role: string; content: string }>,\n    model: string\n  ): Promise<number> {\n    let totalTokens = 0;\n\n    for (const message of messages) {\n      // Add tokens for role and content\n      totalTokens += await this.countTokens(\n        `${message.role}: ${message.content}`,\n        model\n      );\n      // Add separator tokens (approximate)\n      totalTokens += 4;\n    }\n\n    return totalTokens;\n  }\n}\n","import { Analytics } from \"../monitoring/analytics\";\nimport { PerformanceMonitor } from \"../monitoring/performance-monitor\";\nimport { AnthropicProvider } from \"../providers/anthropic-provider\";\nimport { BaseProvider } from \"../providers/base-provider\";\nimport { GoogleProvider } from \"../providers/google-provider\";\nimport { MockProvider } from \"../providers/mock-provider\";\nimport { OpenAIProvider } from \"../providers/openai-provider\";\nimport {\n  AIConfig,\n  AIProviderType,\n  Classification,\n  CodeGenerationOptions,\n  CodeResult,\n  GenerateOptions,\n  ImageGenerationOptions,\n  ImageResult,\n  SpeechOptions,\n  SummarizeOptions,\n  TokenUsage,\n  TranscriptionOptions,\n  TranscriptionResult,\n} from \"../types\";\nimport { CacheManager } from \"./cache-manager\";\nimport { ConfigManager } from \"./config-manager\";\nimport { ErrorHandler } from \"./error-handler\";\nimport { RateLimiter } from \"./rate-limiter\";\nimport { RetryManager } from \"./retry-manager\";\nimport { TokenManager } from \"./token-manager\";\n\nexport interface AIEngineOptions extends Partial<AIConfig> {\n  debug?: boolean;\n}\n\nexport class AIEngine {\n  private config: ConfigManager;\n  private providers = new Map<AIProviderType, BaseProvider>();\n  private cache: CacheManager;\n  private rateLimiter: RateLimiter;\n  private retryManager: RetryManager;\n  private tokenManager: TokenManager;\n  private errorHandler: ErrorHandler;\n  private performanceMonitor: PerformanceMonitor;\n  private analytics: Analytics;\n  private debug: boolean;\n\n  constructor(options: AIEngineOptions) {\n    this.debug = options.debug || false;\n\n    // Initialize core components\n    this.config = new ConfigManager(options);\n    this.cache = new CacheManager({\n      ...this.config.getCacheConfig(),\n      namespace: \"ai-engine\",\n    });\n    this.rateLimiter = new RateLimiter();\n    this.retryManager = new RetryManager(this.config.getRetryConfig());\n    this.tokenManager = new TokenManager();\n    this.errorHandler = new ErrorHandler();\n    this.performanceMonitor = new PerformanceMonitor();\n    this.analytics = new Analytics();\n\n    // Initialize providers\n    this.initializeProviders();\n\n    // Setup rate limiters\n    this.setupRateLimiters();\n\n    this.log(\"AI Engine initialized\", { config: this.config.exportConfig() });\n  }\n\n  /**\n   * Initialize providers based on configuration\n   */\n  private initializeProviders(): void {\n    const mainProvider = this.config.getConfig().provider;\n    const fallbackProviders = this.config.getFallbackProviders();\n    const allProviders = [mainProvider, ...fallbackProviders];\n\n    for (const providerType of allProviders) {\n      try {\n        const provider = this.createProvider(providerType);\n        if (provider) {\n          this.providers.set(providerType, provider);\n          this.log(`Provider initialized: ${providerType}`);\n        }\n      } catch (error) {\n        this.log(`Failed to initialize provider: ${providerType}`, error);\n      }\n    }\n  }\n\n  /**\n   * Create a provider instance\n   */\n  private createProvider(type: AIProviderType): BaseProvider | null {\n    const providerConfig = this.config.getProviderConfig(type);\n\n    if (!providerConfig.apiKey && type !== \"mock\" && type !== \"local\") {\n      this.log(`No API key for provider: ${type}`);\n      return null;\n    }\n\n    const config = {\n      name: type,\n      apiKey: providerConfig.apiKey,\n      model: providerConfig.model,\n      baseUrl: providerConfig.baseUrl,\n      headers: providerConfig.headers,\n      timeout: this.config.getConfig().timeout,\n      maxRetries: this.config.getConfig().maxRetries,\n    };\n\n    switch (type) {\n      case \"openai\":\n        return new OpenAIProvider(config);\n      case \"anthropic\":\n        return new AnthropicProvider(config);\n      case \"google\":\n        return new GoogleProvider(config);\n      case \"mock\":\n        return new MockProvider(config);\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * Setup rate limiters for each provider\n   */\n  private setupRateLimiters(): void {\n    const rateLimitConfig = this.config.getRateLimitConfig();\n\n    for (const [providerType] of this.providers) {\n      this.rateLimiter.createLimiter({\n        id: providerType,\n        ...rateLimitConfig,\n      });\n    }\n  }\n\n  /**\n   * Get provider with fallback support\n   */\n  private async getProvider(): Promise<{\n    provider: BaseProvider;\n    type: AIProviderType;\n  }> {\n    const mainType = this.config.getConfig().provider;\n    const mainProvider = this.providers.get(mainType);\n\n    if (mainProvider) {\n      return { provider: mainProvider, type: mainType };\n    }\n\n    // Try fallback providers\n    const fallbacks = this.config.getFallbackProviders();\n    for (const fallbackType of fallbacks) {\n      const fallbackProvider = this.providers.get(fallbackType);\n      if (fallbackProvider) {\n        this.log(`Using fallback provider: ${fallbackType}`);\n        return { provider: fallbackProvider, type: fallbackType };\n      }\n    }\n\n    throw new Error(\"No available providers\");\n  }\n\n  /**\n   * Execute operation with full pipeline\n   */\n  private async executeOperation<T>(\n    operation: string,\n    execute: (provider: BaseProvider) => Promise<T>,\n    options?: {\n      cacheKey?: string;\n      estimatedTokens?: number;\n      skipCache?: boolean;\n    }\n  ): Promise<T> {\n    const operationId = `${operation}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n    // Check cache\n    if (!options?.skipCache && options?.cacheKey) {\n      const cached = await this.cache.get<T>(options.cacheKey);\n      if (cached !== null) {\n        this.analytics.trackEvent({\n          type: \"cache_hit\",\n          provider: \"cache\",\n          operation,\n        });\n        return cached;\n      }\n    }\n\n    // Get provider\n    const { provider, type: providerType } = await this.getProvider();\n\n    // Start performance monitoring\n    this.performanceMonitor.startOperation(\n      operationId,\n      operation,\n      providerType\n    );\n\n    try {\n      // Check token limits if needed\n      if (options?.estimatedTokens) {\n        const consumed = await this.rateLimiter.consumeTokens(\n          providerType,\n          options.estimatedTokens\n        );\n        if (!consumed) {\n          throw new Error(\"Token limit exceeded\");\n        }\n      }\n\n      // Execute with rate limiting and retry\n      const result = await this.rateLimiter.schedule(providerType, () =>\n        this.retryManager.execute(() => execute(provider), {\n          provider: providerType,\n          operation,\n        })\n      );\n\n      // End performance monitoring\n      const perfReport = this.performanceMonitor.endOperation(\n        operationId,\n        true\n      );\n\n      // Track analytics\n      this.analytics.trackEvent({\n        type: \"success\",\n        provider: providerType,\n        operation,\n        model: this.config.getModel(providerType),\n        latency: perfReport?.duration,\n      });\n\n      // Cache result if applicable\n      if (!options?.skipCache && options?.cacheKey) {\n        await this.cache.set(options.cacheKey, result);\n      }\n\n      return result;\n    } catch (error) {\n      // Handle error\n      const enhancedError = this.errorHandler.handleError(error, {\n        provider: providerType,\n        operation,\n      });\n\n      // End performance monitoring\n      this.performanceMonitor.endOperation(\n        operationId,\n        false,\n        enhancedError.message\n      );\n\n      // Track error\n      this.analytics.trackEvent({\n        type: \"error\",\n        provider: providerType,\n        operation,\n        error: enhancedError.message,\n      });\n\n      throw enhancedError;\n    }\n  }\n\n  /**\n   * Generate text completion\n   */\n  async generateText(\n    prompt: string,\n    options?: GenerateOptions\n  ): Promise<string> {\n    const cacheKey = this.cache.createTextGenerationKey(\n      prompt,\n      options,\n      this.config.getConfig().provider,\n      this.config.getModel()\n    );\n\n    const estimatedTokens = await this.tokenManager.countTokens(\n      prompt,\n      this.config.getModel() || \"gpt-3.5-turbo\"\n    );\n\n    const result = await this.executeOperation(\n      \"generateText\",\n      (provider) => provider.generateText(prompt, options),\n      {\n        cacheKey,\n        estimatedTokens,\n        skipCache: options?.stream,\n      }\n    );\n\n    // Track token usage\n    const responseTokens = await this.tokenManager.countTokens(\n      result,\n      this.config.getModel() || \"gpt-3.5-turbo\"\n    );\n\n    const usage: TokenUsage = {\n      promptTokens: estimatedTokens,\n      completionTokens: responseTokens,\n      totalTokens: estimatedTokens + responseTokens,\n    };\n\n    const cost =\n      this.tokenManager.estimateCost(\n        usage.promptTokens,\n        this.config.getModel() || \"gpt-3.5-turbo\",\n        \"input\"\n      ) +\n      this.tokenManager.estimateCost(\n        usage.completionTokens,\n        this.config.getModel() || \"gpt-3.5-turbo\",\n        \"output\"\n      );\n\n    this.analytics.trackEvent({\n      type: \"success\",\n      provider: this.config.getConfig().provider,\n      operation: \"generateText\",\n      model: this.config.getModel(),\n      tokens: {\n        prompt: usage.promptTokens,\n        completion: usage.completionTokens,\n        total: usage.totalTokens,\n      },\n      cost,\n    });\n\n    return result;\n  }\n\n  /**\n   * Generate streaming text completion\n   */\n  async *generateStream(\n    prompt: string,\n    options?: GenerateOptions\n  ): AsyncGenerator<string> {\n    const { provider, type: providerType } = await this.getProvider();\n\n    if (!provider.generateStream) {\n      throw new Error(`Provider ${providerType} does not support streaming`);\n    }\n\n    const operationId = `generateStream-${Date.now()}`;\n    this.performanceMonitor.startOperation(\n      operationId,\n      \"generateStream\",\n      providerType\n    );\n\n    try {\n      yield* provider.generateStream(prompt, options);\n\n      this.performanceMonitor.endOperation(operationId, true);\n\n      this.analytics.trackEvent({\n        type: \"success\",\n        provider: providerType,\n        operation: \"generateStream\",\n        model: this.config.getModel(providerType),\n      });\n    } catch (error: any) {\n      this.performanceMonitor.endOperation(operationId, false, error.message);\n\n      this.analytics.trackEvent({\n        type: \"error\",\n        provider: providerType,\n        operation: \"generateStream\",\n        error: error.message,\n      });\n\n      throw error;\n    }\n  }\n\n  /**\n   * Generate embeddings\n   */\n  async generateEmbedding(text: string): Promise<number[]> {\n    const cacheKey = this.cache.createEmbeddingKey(\n      text,\n      this.config.getConfig().provider,\n      this.config.getModel()\n    );\n\n    return this.executeOperation(\n      \"generateEmbedding\",\n      (provider) => provider.generateEmbedding(text),\n      { cacheKey }\n    );\n  }\n\n  /**\n   * Classify text\n   */\n  async classifyText(text: string, labels: string[]): Promise<Classification> {\n    const cacheKey = this.cache.generateKey(\"classifyText\", [text, labels]);\n\n    return this.executeOperation(\n      \"classifyText\",\n      (provider) => provider.classifyText(text, labels),\n      { cacheKey }\n    );\n  }\n\n  /**\n   * Summarize text\n   */\n  async summarize(text: string, options?: SummarizeOptions): Promise<string> {\n    const cacheKey = this.cache.generateKey(\"summarize\", [text, options]);\n\n    return this.executeOperation(\n      \"summarize\",\n      (provider) => provider.summarize(text, options),\n      { cacheKey }\n    );\n  }\n\n  /**\n   * Generate image\n   */\n  async generateImage(\n    prompt: string,\n    options?: ImageGenerationOptions\n  ): Promise<ImageResult> {\n    return this.executeOperation(\"generateImage\", (provider) =>\n      provider.generateImage(prompt, options)\n    );\n  }\n\n  /**\n   * Transcribe audio\n   */\n  async transcribeAudio(\n    audio: Blob,\n    options?: TranscriptionOptions\n  ): Promise<TranscriptionResult> {\n    return this.executeOperation(\"transcribeAudio\", (provider) =>\n      provider.transcribeAudio(audio, options)\n    );\n  }\n\n  /**\n   * Generate speech\n   */\n  async generateSpeech(text: string, options?: SpeechOptions): Promise<Blob> {\n    return this.executeOperation(\"generateSpeech\", (provider) =>\n      provider.generateSpeech(text, options)\n    );\n  }\n\n  /**\n   * Generate code\n   */\n  async generateCode(\n    prompt: string,\n    options?: CodeGenerationOptions\n  ): Promise<CodeResult> {\n    return this.executeOperation(\"generateCode\", (provider) =>\n      provider.generateCode(prompt, options)\n    );\n  }\n\n  /**\n   * Update configuration\n   */\n  async updateConfig(config: Partial<AIConfig>): Promise<void> {\n    this.config.updateConfig(config);\n\n    // Reinitialize components if needed\n    this.initializeProviders();\n    this.setupRateLimiters();\n\n    this.log(\"Configuration updated\", { config: this.config.exportConfig() });\n  }\n\n  /**\n   * Get current statistics\n   */\n  getStats() {\n    return {\n      usage: this.analytics.getStats(),\n      performance: this.performanceMonitor.getStats(),\n      cache: this.cache.getStats(),\n      rateLimiter: this.rateLimiter.getAllStats(),\n      errors: this.errorHandler.getErrorStats(),\n      health: this.performanceMonitor.getHealthStatus(),\n    } as any;\n  }\n\n  /**\n   * Clear all caches and reset statistics\n   */\n  async reset(): Promise<void> {\n    await this.cache.clear();\n    this.analytics.reset();\n    this.performanceMonitor.clearHistory();\n    this.errorHandler.clearHistory();\n\n    this.log(\"AI Engine reset\");\n  }\n\n  /**\n   * Log debug information\n   */\n  private log(message: string, data?: any): void {\n    if (this.debug) {\n      console.log(`[AI Engine] ${message}`, data || \"\");\n    }\n  }\n\n  /**\n   * Export configuration\n   */\n  exportConfig() {\n    return this.config.exportConfig();\n  }\n\n  /**\n   * Get available providers\n   */\n  getAvailableProviders(): AIProviderType[] {\n    return Array.from(this.providers.keys());\n  }\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { AIEngine } from \"../../core/ai-engine\";\nimport {\n  AIConfig,\n  Classification,\n  CodeGenerationOptions,\n  CodeResult,\n  GenerateOptions,\n  ImageGenerationOptions,\n  ImageResult,\n  SpeechOptions,\n  SummarizeOptions,\n  TranscriptionOptions,\n  TranscriptionResult,\n} from \"../../types\";\n\ninterface UseAIOptions {\n  config?: Partial<AIConfig>;\n  onError?: (error: Error) => void;\n  debug?: boolean;\n}\n\ninterface UseAIReturn {\n  // Text operations\n  generateText: (prompt: string, options?: GenerateOptions) => Promise<string>;\n  generateStream: (\n    prompt: string,\n    options?: GenerateOptions\n  ) => AsyncGenerator<string>;\n  summarize: (text: string, options?: SummarizeOptions) => Promise<string>;\n  classifyText: (text: string, labels: string[]) => Promise<Classification>;\n\n  // Embeddings\n  generateEmbedding: (text: string) => Promise<number[]>;\n\n  // Images\n  generateImage: (\n    prompt: string,\n    options?: ImageGenerationOptions\n  ) => Promise<ImageResult>;\n\n  // Audio\n  transcribeAudio: (\n    audio: Blob,\n    options?: TranscriptionOptions\n  ) => Promise<TranscriptionResult>;\n  generateSpeech: (text: string, options?: SpeechOptions) => Promise<Blob>;\n\n  // Code\n  generateCode: (\n    prompt: string,\n    options?: CodeGenerationOptions\n  ) => Promise<CodeResult>;\n\n  // State\n  loading: boolean;\n  error: Error | null;\n\n  // Stats\n  stats: any;\n\n  // Control\n  updateConfig: (config: Partial<AIConfig>) => Promise<void>;\n  reset: () => Promise<void>;\n}\n\n// Global AI engine instance\nlet globalEngine: AIEngine | null = null;\n\nexport function useAI(options?: UseAIOptions): UseAIReturn {\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n  const [stats, setStats] = useState<any>(null);\n  const engineRef = useRef<AIEngine>();\n\n  // Initialize engine\n  useEffect(() => {\n    if (!engineRef.current) {\n      if (!globalEngine) {\n        globalEngine = new AIEngine({\n          provider: \"openai\",\n          ...options?.config,\n          debug: options?.debug,\n        });\n      }\n      engineRef.current = globalEngine;\n    }\n\n    // Update stats periodically\n    const interval = setInterval(() => {\n      if (engineRef.current) {\n        setStats(engineRef.current.getStats());\n      }\n    }, 5000);\n\n    return () => clearInterval(interval);\n  }, [options?.config, options?.debug]);\n\n  // Error handler\n  const handleError = useCallback(\n    (err: Error) => {\n      setError(err);\n      options?.onError?.(err);\n    },\n    [options]\n  );\n\n  // Wrap async operations\n  const wrapAsync = useCallback(\n    async <T>(operation: () => Promise<T>): Promise<T> => {\n      setLoading(true);\n      setError(null);\n\n      try {\n        const result = await operation();\n        return result;\n      } catch (err) {\n        const error = err as Error;\n        handleError(error);\n        throw error;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [handleError]\n  );\n\n  // Text generation\n  const generateText = useCallback(\n    async (prompt: string, genOptions?: GenerateOptions): Promise<string> => {\n      return wrapAsync(() =>\n        engineRef.current!.generateText(prompt, genOptions)\n      );\n    },\n    [wrapAsync]\n  );\n\n  // Stream generation\n  const generateStream = useCallback(\n    async function* (\n      prompt: string,\n      genOptions?: GenerateOptions\n    ): AsyncGenerator<string> {\n      setLoading(true);\n      setError(null);\n\n      try {\n        yield* engineRef.current!.generateStream(prompt, genOptions);\n      } catch (err) {\n        handleError(err as Error);\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [handleError]\n  );\n\n  // Summarization\n  const summarize = useCallback(\n    async (text: string, sumOptions?: SummarizeOptions): Promise<string> => {\n      return wrapAsync(() => engineRef.current!.summarize(text, sumOptions));\n    },\n    [wrapAsync]\n  );\n\n  // Classification\n  const classifyText = useCallback(\n    async (text: string, labels: string[]): Promise<Classification> => {\n      return wrapAsync(() => engineRef.current!.classifyText(text, labels));\n    },\n    [wrapAsync]\n  );\n\n  // Embeddings\n  const generateEmbedding = useCallback(\n    async (text: string): Promise<number[]> => {\n      return wrapAsync(() => engineRef.current!.generateEmbedding(text));\n    },\n    [wrapAsync]\n  );\n\n  // Image generation\n  const generateImage = useCallback(\n    async (\n      prompt: string,\n      imgOptions?: ImageGenerationOptions\n    ): Promise<ImageResult> => {\n      return wrapAsync(() =>\n        engineRef.current!.generateImage(prompt, imgOptions)\n      );\n    },\n    [wrapAsync]\n  );\n\n  // Audio transcription\n  const transcribeAudio = useCallback(\n    async (\n      audio: Blob,\n      transcriptionOptions?: TranscriptionOptions\n    ): Promise<TranscriptionResult> => {\n      return wrapAsync(() =>\n        engineRef.current!.transcribeAudio(audio, transcriptionOptions)\n      );\n    },\n    [wrapAsync]\n  );\n\n  // Speech generation\n  const generateSpeech = useCallback(\n    async (text: string, speechOptions?: SpeechOptions): Promise<Blob> => {\n      return wrapAsync(() =>\n        engineRef.current!.generateSpeech(text, speechOptions)\n      );\n    },\n    [wrapAsync]\n  );\n\n  // Code generation\n  const generateCode = useCallback(\n    async (\n      prompt: string,\n      codeOptions?: CodeGenerationOptions\n    ): Promise<CodeResult> => {\n      return wrapAsync(() =>\n        engineRef.current!.generateCode(prompt, codeOptions)\n      );\n    },\n    [wrapAsync]\n  );\n\n  // Configuration update\n  const updateConfig = useCallback(\n    async (config: Partial<AIConfig>): Promise<void> => {\n      return wrapAsync(() => engineRef.current!.updateConfig(config));\n    },\n    [wrapAsync]\n  );\n\n  // Reset\n  const reset = useCallback(async (): Promise<void> => {\n    return wrapAsync(() => engineRef.current!.reset());\n  }, [wrapAsync]);\n\n  return {\n    generateText,\n    generateStream,\n    summarize,\n    classifyText,\n    generateEmbedding,\n    generateImage,\n    transcribeAudio,\n    generateSpeech,\n    generateCode,\n    loading,\n    error,\n    stats,\n    updateConfig,\n    reset,\n  };\n}\n\n// Hook for chat functionality\nexport function useAIChat(systemPrompt?: string) {\n  const [messages, setMessages] = useState<\n    Array<{\n      id: string;\n      role: \"user\" | \"assistant\" | \"system\";\n      content: string;\n      timestamp: Date;\n    }>\n  >([]);\n\n  const { generateText, loading, error } = useAI();\n\n  const sendMessage = useCallback(\n    async (content: string) => {\n      // Add user message\n      const userMessage = {\n        id: Date.now().toString(),\n        role: \"user\" as const,\n        content,\n        timestamp: new Date(),\n      };\n\n      setMessages((prev) => [...prev, userMessage]);\n\n      // Build conversation context\n      const conversation = messages\n        .map((msg) => `${msg.role}: ${msg.content}`)\n        .join(\"\\n\");\n\n      const prompt = `${conversation}\\nuser: ${content}\\nassistant:`;\n\n      try {\n        const response = await generateText(prompt, {\n          systemPrompt: systemPrompt || \"You are a helpful AI assistant.\",\n          maxTokens: 1000,\n        });\n\n        // Add assistant message\n        const assistantMessage = {\n          id: (Date.now() + 1).toString(),\n          role: \"assistant\" as const,\n          content: response,\n          timestamp: new Date(),\n        };\n\n        setMessages((prev) => [...prev, assistantMessage]);\n\n        return response;\n      } catch (error) {\n        // Error is already handled by useAI\n        throw error;\n      }\n    },\n    [messages, generateText, systemPrompt]\n  );\n\n  const clearMessages = useCallback(() => {\n    setMessages([]);\n  }, []);\n\n  return {\n    messages,\n    sendMessage,\n    clearMessages,\n    loading,\n    error,\n  };\n}\n\n// Hook for embeddings and similarity search\nexport function useAIEmbeddings() {\n  const { generateEmbedding } = useAI();\n\n  const findSimilar = useCallback(\n    async (\n      query: string,\n      items: Array<{ id: string; text: string }>,\n      topK: number = 5\n    ) => {\n      // Generate embeddings for query\n      const queryEmbedding = await generateEmbedding(query);\n\n      // Generate embeddings for all items\n      const itemEmbeddings = await Promise.all(\n        items.map((item) => generateEmbedding(item.text))\n      );\n\n      // Calculate similarities\n      const similarities = items.map((item, i) => ({\n        ...item,\n        similarity: cosineSimilarity(queryEmbedding, itemEmbeddings[i] ?? []),\n      }));\n\n      // Sort by similarity\n      similarities.sort((a, b) => b.similarity - a.similarity);\n\n      return similarities.slice(0, topK);\n    },\n    [generateEmbedding]\n  );\n\n  return {\n    generateEmbedding,\n    findSimilar,\n  };\n}\n\n// Utility function for cosine similarity\nfunction cosineSimilarity(a: number[], b: number[]): number {\n  let dotProduct = 0;\n  let normA = 0;\n  let normB = 0;\n\n  const minLength = Math.min(a.length, b.length);\n\n  for (let i = 0; i < minLength; i++) {\n    const aVal = a[i] ?? 0;\n    const bVal = b[i] ?? 0;\n    dotProduct += aVal * bVal;\n    normA += aVal * aVal;\n    normB += bVal * bVal;\n  }\n\n  const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n  return denominator === 0 ? 0 : dotProduct / denominator;\n}\n"]}