@mayank3238/keymux 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/index.ts","../src/tracking/keyTracker.ts","../src/strategies/selectionStrategies.ts","../src/core/keyRouter.ts","../src/utils/helpers.ts","../src/core/multiProviderRouter.ts","../src/core/fetcher.ts","../src/core/usageTracker.ts","../src/proxy/translators/requestTranslator.ts","../src/proxy/translators/streamTranslator.ts","../src/proxy/translators/responseTranslator.ts","../src/proxy/server.ts","../src/index.ts"],"names":["CircuitState","config","router","meta","limit","sleep","os","globalUsageTracker","fs","path","ep"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core type definitions for keymux\n * Public API types exported for consumers\n */\n\n/**\n * Configuration for a single API key in the pool\n */\nexport interface KeyConfig {\n /** Unique identifier - each key has its own ID */\n id: string;\n /** Actual API key string */\n key: string;\n /** RPM limit - how many requests can run in one minute (default: 40) */\n rpmLimit?: number;\n /** Weight - increase weight for more important keys (default: 1) */\n weight?: number;\n /** Base URL - custom URL if you don't want to use the provider's default URL */\n baseURL?: string;\n /** Custom metadata - for storing extra info */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Internal state tracking for a key\n */\nexport interface KeyState {\n config: KeyConfig;\n /** Current RPM - how many requests have been made in the current minute */\n rpm: number;\n /** Last request timestamp */\n lastUsed: number;\n /** Circuit breaker state - HEALTHY, DEGRADED or OPEN */\n circuitState: CircuitState;\n /** Continuous failures - circuit opens if this gets too high */\n failures: number;\n /** Cooldown until - how long to wait before retrying */\n cooldownUntil: number;\n /** Average latency - calculated from last 25 requests */\n avgLatencyMs: number;\n /** Raw TTFT history - sliding window of last 25 readings for true average calculation */\n latencyHistory: number[];\n /** Total requests - how many requests processed so far */\n totalRequests: number;\n /** Total errors - how many errors encountered so far */\n totalErrors: number;\n /** Timestamps of requests in the current window */\n requestTimestamps: number[];\n}\n\n/**\n * Circuit breaker states\n * HEALTHY -> DEGRADED -> OPEN (recovers after cooldown)\n */\nexport enum CircuitState {\n HEALTHY = 'healthy', // Everything is fine, can be used\n DEGRADED = 'degraded', // Some issues, use carefully\n OPEN = 'open' // Too many failures - do not use, wait for cooldown\n}\n\n/**\n * Configuration for the key router\n */\nexport interface KeyRouterConfig {\n /** All API keys to manage */\n keys: KeyConfig[];\n /** Default RPM limit - used if key-specific limit is not provided (default: 40) */\n defaultRpmLimit?: number;\n /** Default weight - equal importance for all keys? Or some more important? (default: 1) */\n defaultWeight?: number;\n /** Circuit breaker - block key after this many failures (default: 3) */\n failureThreshold?: number;\n /** Circuit breaker - recovery time in milliseconds after being blocked (default: 30000 = 30sec) */\n cooldownMs?: number;\n /** Sliding window - RPM is counted within a 1 minute (60000ms) window */\n windowMs?: number;\n /** Latency tracking - track how fast requests complete? (default: true) */\n trackLatency?: boolean;\n /** Callback - called when a key's state changes (e.g. healthy to degraded) */\n onStateChange?: (keyId: string, state: CircuitState) => void;\n /** Debug callback - for understanding what is happening in development */\n onDebug?: (event: DebugEvent) => void;\n}\n\n/**\n * Debug events - for logging and monitoring\n * What event occurred (selected, failed, recovered), which key, when, and extra details\n */\nexport interface DebugEvent {\n type: 'key_selected' | 'key_failed' | 'key_recovered' | 'circuit_opened' | 'all_exhausted';\n // key_selected: a key was selected\n // key_failed: a request failed\n // key_recovered: a failed key recovered\n // circuit_opened: circuit breaker opened\n // all_exhausted: all keys exhausted\n \n keyId?: string;\n keyIndex?: number;\n timestamp: number;\n details?: Record<string, unknown>;\n}\n\n/**\n * Result of key selection\n */\nexport interface KeySelectionResult {\n /** The selected API key */\n key: string;\n /** Key configuration */\n config: KeyConfig;\n /** Internal key ID */\n keyId: string;\n /** Current utilization (0-1) */\n utilization: number;\n}\n\n/**\n * Statistics for a single key\n */\nexport interface KeyStats {\n id: string;\n key: string; // masked (last 4 chars)\n rpm: number;\n rpmLimit: number;\n utilization: number;\n circuitState: CircuitState;\n failures: number;\n avgLatencyMs: number;\n totalRequests: number;\n totalErrors: number;\n isHealthy: boolean;\n cooldownRemainingMs?: number;\n}\n\n/**\n * Overall router statistics\n */\nexport interface RouterStats {\n totalKeys: number;\n healthyKeys: number;\n totalRpm: number;\n totalRpmLimit: number;\n overallUtilization: number;\n keys: KeyStats[];\n}\n\n/**\n * Options for key selection\n */\nexport interface SelectionOptions {\n /** Preferred key IDs (will try these first if healthy) */\n preferredKeys?: string[];\n /** Minimum utilization threshold (0-1) - skip keys above this */\n maxUtilization?: number;\n /** Custom selection strategy name */\n strategy?: string;\n}\n\n/**\n * Error types for better error handling\n */\nexport class KeyRouterError extends Error {\n constructor(\n message: string,\n public readonly code: 'ALL_KEYS_EXHAUSTED' | 'NO_KEYS_CONFIGURED' | 'KEY_NOT_FOUND' | 'CIRCUIT_OPEN' | 'INVALID_CONFIG',\n public readonly keyId?: string\n ) {\n super(message);\n this.name = 'KeyRouterError';\n }\n}\n\nexport class RateLimitError extends KeyRouterError {\n constructor(keyId: string) {\n super(`Rate limit exceeded for key ${keyId}`, 'ALL_KEYS_EXHAUSTED', keyId);\n this.name = 'RateLimitError';\n }\n}\n\n/**\n * Provider preset configurations\n */\nexport interface ProviderPreset {\n name: string;\n baseURL: string;\n defaultRpmLimit: number;\n models: string[];\n}\n\nexport const PROVIDER_PRESETS: Record<string, ProviderPreset> = {\n mistral: {\n name: 'Mistral AI',\n baseURL: 'https://api.mistral.ai/v1',\n defaultRpmLimit: 30,\n models: [\n 'codestral-2508',\n 'mistral-large-latest',\n 'open-mistral-nemo'\n ]\n },\n nvidia: {\n name: 'NVIDIA',\n baseURL: 'https://integrate.api.nvidia.com/v1',\n defaultRpmLimit: 40,\n models: [\n 'nvidia/nemotron-3-ultra-550b-a55b',\n 'nvidia/nemotron-3-super-120b-a12b',\n 'stepfun-ai/step-3.7-flash'\n ]\n },\n gemini: {\n name: 'Google Gemini',\n baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai',\n defaultRpmLimit: 15,\n models: [\n 'gemini-3.1-pro-preview',\n 'gemini-2.5-pro',\n 'gemini-2.5-flash',\n 'gemini-2.5-flash-thinking',\n 'gemini-3.5-flash'\n ]\n },\n openrouter: {\n name: 'OpenRouter',\n baseURL: 'https://openrouter.ai/api/v1',\n defaultRpmLimit: 20,\n models: [\n 'nex-agi/nex-n2.5-mini:free',\n 'meta-llama/llama-3.3-70b-instruct:free',\n 'qwen/qwen3-235b-a22b:free'\n ]\n },\n deepseek: {\n name: 'DeepSeek',\n baseURL: 'https://api.deepseek.com/v1',\n defaultRpmLimit: 60,\n models: ['deepseek-chat', 'deepseek-reasoner']\n },\n together: {\n name: 'Together AI',\n baseURL: 'https://api.together.xyz/v1',\n defaultRpmLimit: 60,\n models: [\n 'meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo',\n 'meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo'\n ]\n },\n sambanova: {\n name: 'SambaNova',\n baseURL: 'https://api.sambanova.ai/v1',\n defaultRpmLimit: 30,\n models: ['Meta-Llama-3.1-405B-Instruct', 'Meta-Llama-3.1-70B-Instruct']\n },\n\n openai: {\n name: 'OpenAI',\n baseURL: 'https://api.openai.com/v1',\n defaultRpmLimit: 500,\n models: ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'gpt-3.5-turbo']\n },\n groq: {\n name: 'Groq',\n baseURL: 'https://api.groq.com/openai/v1',\n defaultRpmLimit: 30,\n models: ['qwen/qwen3.8-27b', 'openai/gpt-oss-120b', 'groq/compound']\n }\n};\n\n// ====================================================================\n// Multi-Provider Types\n// ====================================================================\n\n/**\n * Configuration for one provider in a multi-provider pool\n * Each provider can have multiple API keys\n */\nexport interface ProviderPoolEntry {\n /** Provider name - use preset name ('nvidia', 'gemini', etc.) or any custom string */\n provider: string;\n /** API keys for this provider (multiple keys = more RPM capacity) */\n keys: string[];\n /** Base URL - auto-filled from PROVIDER_PRESETS for known providers */\n baseURL?: string;\n /** Models this provider serves - first model is the default */\n models?: string[];\n /** Per-key RPM limit - auto-filled from PROVIDER_PRESETS for known providers */\n rpmLimit?: number;\n /** Provider priority weight - higher weight = more requests routed here (default: 1) */\n weight?: number;\n /** Custom metadata - for storing extra info per provider */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Result of getEndpoint() — everything needed to make an API call\n * Unlike getKey() which returns just a string, this returns the full endpoint info\n */\nexport interface EndpointResult {\n /** The API key to use */\n key: string;\n /** Provider's base URL for API calls */\n baseURL: string;\n /** Model to use for this request */\n model: string;\n /** Provider name (e.g. 'nvidia', 'gemini', 'openrouter') */\n provider: string;\n /** Unique endpoint ID for reporting success/failure */\n endpointId: string;\n /** Current utilization of this endpoint (0-1) */\n utilization: number;\n}\n\n/**\n * Options for getEndpoint() - filter and control which endpoint is selected\n */\nexport interface EndpointOptions {\n /** Try these providers first if healthy (e.g. ['gemini', 'nvidia']) */\n preferProviders?: string[];\n /** Never use these providers for this request */\n excludeProviders?: string[];\n /** Request a specific model - router picks the provider that has it */\n model?: string;\n /** Skip endpoints above this utilization (0-1) */\n maxUtilization?: number;\n /** Override selection strategy for this request */\n strategy?: string;\n}\n\n/**\n * Configuration options for MultiProviderRouter\n */\nexport interface MultiProviderConfig {\n /** Circuit breaker - block key after this many failures (default: 3) */\n failureThreshold?: number;\n /** Circuit breaker - recovery time in ms after being blocked (default: 30000) */\n cooldownMs?: number;\n /** Sliding window for RPM counting in ms (default: 60000) */\n windowMs?: number;\n /** Track latency per endpoint? (default: true) */\n trackLatency?: boolean;\n /** Default selection strategy (default: 'weighted-least-utilization') */\n strategy?: string;\n /** Callback when an endpoint's state changes */\n onStateChange?: (endpointId: string, state: CircuitState) => void;\n /** Debug callback for monitoring */\n onDebug?: (event: DebugEvent) => void;\n}","/**\n * KeyTracker - Tracks per-key state: RPM, circuit breaker, latency\n * Single responsibility: tracks and updates key metrics\n */\n\nimport type { KeyConfig, KeyState, KeyStats, DebugEvent } from '../types';\nimport { CircuitState } from '../types';\n\nexport interface KeyTrackerOptions {\n defaultRpmLimit: number;\n defaultWeight: number;\n failureThreshold: number;\n cooldownMs: number;\n windowMs: number;\n trackLatency: boolean;\n onStateChange?: (keyId: string, state: CircuitState) => void;\n onDebug?: (event: DebugEvent) => void;\n}\n\nexport class KeyTracker {\n private keys: Map<string, KeyState> = new Map();\n private options: KeyTrackerOptions;\n private cleanupInterval?: NodeJS.Timeout;\n\n constructor(options: KeyTrackerOptions) {\n this.options = options;\n this.startCleanupLoop();\n }\n\n initialize(keyConfigs: KeyConfig[]): void {\n const oldKeys = new Map(this.keys);\n this.keys.clear();\n for (const config of keyConfigs) {\n const existing = oldKeys.get(config.id);\n if (existing) {\n existing.config = {\n ...config,\n rpmLimit: config.rpmLimit ?? this.options.defaultRpmLimit,\n weight: config.weight ?? this.options.defaultWeight\n };\n this.keys.set(config.id, existing);\n } else {\n const state: KeyState = {\n config: {\n ...config,\n rpmLimit: config.rpmLimit ?? this.options.defaultRpmLimit,\n weight: config.weight ?? this.options.defaultWeight\n },\n rpm: 0,\n lastUsed: 0,\n circuitState: CircuitState.HEALTHY,\n failures: 0,\n cooldownUntil: 0,\n avgLatencyMs: 0,\n latencyHistory: [],\n totalRequests: 0,\n totalErrors: 0,\n requestTimestamps: []\n };\n this.keys.set(config.id, state);\n }\n }\n }\n\n /**\n * Get all key states - for debugging or stats\n */\n getAllStates(): KeyState[] {\n return Array.from(this.keys.values());\n }\n\n /**\n * Get state of a specific key\n */\n getState(keyId: string): KeyState | undefined {\n return this.keys.get(keyId);\n }\n\n /**\n * Get only healthy and available keys\n * Checks circuit breaker state and RPM limits\n */\n getAvailableKeys(): KeyState[] {\n const now = Date.now();\n return Array.from(this.keys.values()).filter(state => {\n if (state.circuitState === CircuitState.OPEN) {\n if (now >= state.cooldownUntil) {\n this.transitionToHealthy(state);\n return state.rpm < state.config.rpmLimit!;\n }\n return false;\n }\n return state.rpm < state.config.rpmLimit!;\n });\n }\n\n /**\n * Record a request attempt (reservation)\n * Increments RPM count without touching failures or circuit state.\n */\n recordAttempt(keyId: string): void {\n const state = this.keys.get(keyId);\n if (!state) return;\n\n state.requestTimestamps.push(Date.now());\n state.rpm = state.requestTimestamps.length;\n state.lastUsed = Date.now();\n state.totalRequests++;\n }\n\n /**\n * Record a successful request completion\n * Updates latency and resets failures (RPM already incremented by recordAttempt).\n */\n recordSuccess(keyId: string, latencyMs?: number): void {\n const state = this.keys.get(keyId);\n if (!state) return;\n\n state.lastUsed = Date.now();\n state.failures = 0;\n\n if (this.options.trackLatency && latencyMs != null) {\n // Sliding window: keep last 25 readings, calculate true average\n state.latencyHistory.push(latencyMs);\n if (state.latencyHistory.length > 25) {\n state.latencyHistory.shift();\n }\n state.avgLatencyMs = Math.round(\n state.latencyHistory.reduce((sum, v) => sum + v, 0) / state.latencyHistory.length\n );\n }\n\n // Recover if it was in degraded or open state\n if (state.circuitState === CircuitState.DEGRADED || state.circuitState === CircuitState.OPEN) {\n this.transitionToHealthy(state);\n }\n\n this.emitDebug({\n type: 'key_selected',\n keyId,\n timestamp: Date.now(),\n details: { rpm: state.rpm, latencyMs }\n });\n }\n\n /**\n * Record a failed request (rate limit, server error, etc.)\n * Triggers circuit breaker logic (RPM already incremented by recordAttempt).\n */\n recordFailure(keyId: string, isRateLimit: boolean = false): void {\n const state = this.keys.get(keyId);\n if (!state) return;\n\n state.failures++;\n state.totalErrors++;\n state.lastUsed = Date.now();\n\n this.emitDebug({\n type: 'key_failed',\n keyId,\n timestamp: Date.now(),\n details: { failures: state.failures, isRateLimit }\n });\n\n if (state.failures >= this.options.failureThreshold) {\n this.openCircuit(state);\n } else if (state.failures >= Math.ceil(this.options.failureThreshold / 2)) {\n if (state.circuitState === CircuitState.HEALTHY) {\n state.circuitState = CircuitState.DEGRADED;\n if (this.options.onStateChange) {\n this.options.onStateChange(keyId, CircuitState.DEGRADED);\n }\n this.emitDebug({\n type: 'key_failed',\n keyId,\n timestamp: Date.now(),\n details: { circuitState: CircuitState.DEGRADED }\n });\n }\n }\n }\n\n /**\n * Manually report a key as recovered (for external health checks)\n */\n reportRecovery(keyId: string): void {\n const state = this.keys.get(keyId);\n if (!state) return;\n\n this.transitionToHealthy(state);\n this.emitDebug({\n type: 'key_recovered',\n keyId,\n timestamp: Date.now()\n });\n }\n\n /**\n * Get statistics for all keys\n */\n getStats(): KeyStats[] {\n return Array.from(this.keys.values()).map(state => this.toStats(state));\n }\n\n /**\n * Get overall router statistics\n */\n getOverallStats() {\n const stats = this.getStats();\n const totalRpm = stats.reduce((sum, s) => sum + s.rpm, 0);\n const totalRpmLimit = stats.reduce((sum, s) => sum + s.rpmLimit, 0);\n\n return {\n totalKeys: stats.length,\n healthyKeys: stats.filter(s => s.isHealthy).length,\n totalRpm,\n totalRpmLimit,\n overallUtilization: totalRpmLimit > 0 ? totalRpm / totalRpmLimit : 0,\n keys: stats\n };\n }\n\n /**\n * Reset all tracking (useful for testing)\n */\n reset(): void {\n for (const state of this.keys.values()) {\n state.rpm = 0;\n state.lastUsed = 0;\n state.circuitState = CircuitState.HEALTHY;\n state.failures = 0;\n state.cooldownUntil = 0;\n state.totalRequests = 0;\n state.totalErrors = 0;\n state.avgLatencyMs = 0;\n state.latencyHistory = [];\n state.requestTimestamps = [];\n }\n }\n\n /**\n * Shutdown cleanup\n */\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = undefined;\n }\n }\n\n // ==================== Private Methods ====================\n\n private transitionToHealthy(state: KeyState): void {\n const wasUnhealthy = state.circuitState !== CircuitState.HEALTHY;\n state.circuitState = CircuitState.HEALTHY;\n state.failures = 0;\n state.cooldownUntil = 0;\n\n if (wasUnhealthy) {\n if (this.options.onStateChange) {\n this.options.onStateChange(state.config.id, CircuitState.HEALTHY);\n }\n this.emitDebug({\n type: 'key_recovered',\n keyId: state.config.id,\n timestamp: Date.now()\n });\n }\n }\n\n private openCircuit(state: KeyState): void {\n if (state.circuitState === CircuitState.OPEN) return;\n\n state.circuitState = CircuitState.OPEN;\n state.cooldownUntil = Date.now() + this.options.cooldownMs;\n\n if (this.options.onStateChange) {\n this.options.onStateChange(state.config.id, CircuitState.OPEN);\n }\n \n this.emitDebug({\n type: 'circuit_opened',\n keyId: state.config.id,\n timestamp: Date.now(),\n details: { cooldownUntil: state.cooldownUntil, failures: state.failures }\n });\n }\n\n private toStats(state: KeyState): KeyStats {\n const rpmLimit = state.config.rpmLimit ?? this.options.defaultRpmLimit;\n const now = Date.now();\n const cooldownRemainingMs = state.cooldownUntil > now ? state.cooldownUntil - now : 0;\n return {\n id: state.config.id,\n key: this.maskKey(state.config.key),\n rpm: state.rpm,\n rpmLimit,\n utilization: rpmLimit > 0 ? state.rpm / rpmLimit : 0,\n circuitState: state.circuitState,\n failures: state.failures,\n avgLatencyMs: state.avgLatencyMs,\n totalRequests: state.totalRequests,\n totalErrors: state.totalErrors,\n isHealthy: (state.circuitState !== CircuitState.OPEN || cooldownRemainingMs === 0) && state.rpm < rpmLimit,\n cooldownRemainingMs\n };\n }\n\n private maskKey(key: string): string {\n if (key.length <= 8) return '****';\n return key.slice(0, 4) + '****' + key.slice(-4);\n }\n\n private emitDebug(event: DebugEvent): void {\n if (this.options.onDebug) {\n this.options.onDebug(event);\n }\n }\n\n private startCleanupLoop(): void {\n this.cleanupInterval = setInterval(() => {\n this.cleanupExpiredWindows();\n this.checkCircuitRecovery();\n }, Math.min(this.options.windowMs / 10, 10000)); // At least every 10s\n }\n\n private cleanupExpiredWindows(): void {\n const now = Date.now();\n const windowStart = now - this.options.windowMs;\n\n for (const state of this.keys.values()) {\n state.requestTimestamps = state.requestTimestamps.filter(ts => ts >= windowStart);\n state.rpm = state.requestTimestamps.length;\n }\n }\n\n private checkCircuitRecovery(): void {\n const now = Date.now();\n for (const state of this.keys.values()) {\n if (state.circuitState === CircuitState.OPEN && now >= state.cooldownUntil) {\n this.transitionToHealthy(state);\n }\n }\n }\n}","/**\n * Key Selection Strategies\n * Pure functions that select the best key from the available keys\n */\n\nimport type { KeyState, KeyStats, SelectionOptions } from '../types';\n\n/**\n * Strategy interface\n */\nexport interface SelectionStrategy {\n name: string;\n select(keys: KeyState[], options?: SelectionOptions): KeyState | null;\n}\n\n/**\n * Weighted Least Utilization Strategy (RECOMMENDED)\n * Picks key with lowest (rpm / rpmLimit) ratio, weighted by key weight\n * Handles different RPM limits per key fairly\n */\nexport class WeightedLeastUtilizationStrategy implements SelectionStrategy {\n name = 'weighted-least-utilization';\n\n select(keys: KeyState[], options?: SelectionOptions): KeyState | null {\n if (keys.length === 0) return null;\n\n // Filter by max utilization if specified\n let candidates = keys;\n if (options?.maxUtilization != null) {\n candidates = keys.filter((k: KeyState) => {\n const limit = k.config.rpmLimit ?? 40;\n return k.rpm / limit <= options.maxUtilization!!;\n });\n if (candidates.length === 0) return null;\n }\n\n // Sort by utilization (rpm / limit / weight) ascending\n candidates.sort((a, b) => {\n const limitA = a.config.rpmLimit ?? 40;\n const limitB = b.config.rpmLimit ?? 40;\n const weightA = a.config.weight ?? 1;\n const weightB = b.config.weight ?? 1;\n\n const utilA = (a.rpm / limitA) / weightA;\n const utilB = (b.rpm / limitB) / weightB;\n\n return utilA - utilB;\n });\n\n return candidates[0] ?? null;\n }\n}\n\n/**\n * Least Requests Strategy\n * Picks key with absolute lowest RPM count\n * Good when all keys have same limits\n */\nexport class LeastRequestsStrategy implements SelectionStrategy {\n name = 'least-requests';\n\n select(keys: KeyState[], options?: SelectionOptions): KeyState | null {\n if (keys.length === 0) return null;\n\n let candidates = keys;\n if (options?.maxUtilization != null) {\n candidates = keys.filter(k => {\n const limit = k.config.rpmLimit ?? 40;\n return k.rpm / limit <= options.maxUtilization!!;\n });\n if (candidates.length === 0) return null;\n }\n\n // Sort by absolute RPM count\n candidates.sort((a, b) => a.rpm - b.rpm);\n return candidates[0] ?? null;\n }\n}\n\n/**\n * Smart Routing Strategy\n * 1. Filters out keys exceeding max utilization.\n * 2. Forms a \"fast pool\" of keys within 100ms of the fastest key. Always includes keys with no latency data (e.g., avgLatencyMs === 0) so they don't get starved.\n * 3. Sorts the pool by RPM (ascending) and then totalRequests (ascending) to balance load (Least Used).\n */\nexport class SmartRoutingStrategy implements SelectionStrategy {\n name = 'smart';\n\n select(keys: KeyState[], options?: SelectionOptions): KeyState | null {\n if (!keys || keys.length === 0) return null;\n\n let candidates = keys;\n \n // 1. Max Utilization Filter\n if (options?.maxUtilization != null) {\n candidates = keys.filter(k => {\n const limit = k.config.rpmLimit ?? 40;\n return (k.rpm / limit) <= options.maxUtilization!;\n });\n if (candidates.length === 0) return null;\n }\n\n // 2. Give untested keys a chance first (cold start)\n const untestedKeys = candidates.filter(k => (k.latencyHistory?.length ?? 0) === 0);\n if (untestedKeys.length > 0) {\n // Pick the least used untested key\n untestedKeys.sort((a, b) => (a.totalRequests ?? 0) - (b.totalRequests ?? 0));\n return untestedKeys[0] ?? null;\n }\n\n // 3. Fast Pool: keys within +100ms of the best avg TTFT\n const keysWithLatency = candidates.filter(\n (k: KeyState) => typeof k.avgLatencyMs === 'number' && !isNaN(k.avgLatencyMs) && k.avgLatencyMs > 0\n );\n \n let pool = candidates;\n if (keysWithLatency.length > 0) {\n const fastest = Math.min(...keysWithLatency.map((k: KeyState) => k.avgLatencyMs));\n pool = keysWithLatency.filter((k: KeyState) => k.avgLatencyMs <= fastest + 100);\n }\n\n if (pool.length === 0) {\n pool = candidates;\n }\n\n // 4. Within the fast pool, pick the key with lowest avg TTFT.\n // Tie-breaker: lowest utilization (rpm / limit).\n pool.sort((a: KeyState, b: KeyState) => {\n if (a.avgLatencyMs !== b.avgLatencyMs) return a.avgLatencyMs - b.avgLatencyMs;\n \n const limitA = a.config.rpmLimit ?? 40;\n const limitB = b.config.rpmLimit ?? 40;\n return (a.rpm / limitA) - (b.rpm / limitB);\n });\n\n return pool[0] ?? null;\n }\n}\n\n/**\n * Least Latency Strategy\n * Picks key with lowest average latency\n * Requires latency tracking to be enabled\n * Falls back to LeastRequestsStrategy if no latency data is available\n */\nexport class LeastLatencyStrategy implements SelectionStrategy {\n name = 'least-latency';\n\n select(keys: KeyState[], options?: SelectionOptions): KeyState | null {\n if (keys.length === 0) return null;\n\n let candidates = keys;\n if (options?.maxUtilization != null) {\n candidates = keys.filter(k => {\n const limit = k.config.rpmLimit ?? 40;\n return k.rpm / limit <= options.maxUtilization!!;\n });\n if (candidates.length === 0) return null;\n }\n\n // Filter to keys with latency data\n candidates = candidates.filter(k => k.avgLatencyMs > 0);\n if (candidates.length === 0) {\n // Fallback to least requests if no latency data\n return new LeastRequestsStrategy().select(keys, options);\n }\n\n candidates.sort((a, b) => a.avgLatencyMs - b.avgLatencyMs);\n return candidates[0] ?? null;\n }\n}\n\n/**\n * Preferred Keys Strategy\n * Tries preferred keys first, falls back to another strategy\n */\nexport class PreferredKeysStrategy implements SelectionStrategy {\n name = 'preferred-keys';\n\n constructor(private fallbackStrategy: SelectionStrategy) {}\n\n select(keys: KeyState[], options?: SelectionOptions): KeyState | null {\n if (!options?.preferredKeys?.length) {\n return this.fallbackStrategy.select(keys, options);\n }\n\n // Filter available keys that match preferred IDs\n const preferredKeysSet = new Set(options.preferredKeys);\n const preferredCandidates = keys.filter(k => preferredKeysSet.has(k.config.id));\n\n if (preferredCandidates.length > 0) {\n const selected = this.fallbackStrategy.select(preferredCandidates, options);\n if (selected) return selected;\n }\n\n // Fall back to default strategy across all keys\n return this.fallbackStrategy.select(keys, options);\n }\n}\n\n/**\n * Random Strategy\n * Selects a key randomly - good for distributing load evenly over time\n * Applies utilization filter so overloaded keys are not selected\n */\nexport class RandomStrategy implements SelectionStrategy {\n name = 'random';\n\n select(keys: KeyState[], options?: SelectionOptions): KeyState | null {\n if (keys.length === 0) return null;\n\n let candidates = keys;\n if (options?.maxUtilization != null) {\n candidates = keys.filter(k => {\n const limit = k.config.rpmLimit ?? 40;\n return k.rpm / limit <= options.maxUtilization!!;\n });\n if (candidates.length === 0) return null;\n }\n\n const index = Math.floor(Math.random() * candidates.length);\n return candidates[index] ?? null;\n }\n}\n\n/**\n * Round Robin Strategy\n * Selects keys in sequential order (using oldest lastUsed timestamp).\n */\nexport class RoundRobinStrategy implements SelectionStrategy {\n name = 'round-robin';\n private index = 0;\n\n select(keys: KeyState[], options?: SelectionOptions): KeyState | null {\n if (keys.length === 0) return null;\n\n let candidates = keys;\n if (options?.maxUtilization != null) {\n candidates = keys.filter(k => {\n const limit = k.config.rpmLimit ?? 40;\n return limit > 0 ? (k.rpm / limit <= options.maxUtilization!!) : true;\n });\n if (candidates.length === 0) return null;\n }\n\n const selected = candidates[this.index % candidates.length];\n this.index++;\n return selected || null;\n }\n}\n\n/**\n * Strategy Factory - creates strategy by name\n */\nexport function createStrategy(name: string, fallback?: SelectionStrategy): SelectionStrategy {\n switch (name) {\n case 'weighted-least-utilization':\n return new WeightedLeastUtilizationStrategy();\n case 'least-requests':\n return new LeastRequestsStrategy();\n case 'round-robin':\n return new RoundRobinStrategy();\n case 'smart':\n return new SmartRoutingStrategy();\n case 'least-latency':\n return new LeastLatencyStrategy();\n case 'random':\n return new RandomStrategy();\n case 'preferred-keys':\n return new PreferredKeysStrategy(fallback ?? new WeightedLeastUtilizationStrategy());\n default:\n return new WeightedLeastUtilizationStrategy();\n }\n}\n\n/**\n * Default strategy instance (singleton)\n */\nexport const defaultStrategy = new WeightedLeastUtilizationStrategy();","/**\n * KeyRouter - Main entry point of the keymux library\n * Manages keys, tracks state, and distributes requests\n * Uses a selection strategy to pick the best key\n */\n\nimport type {\n KeyConfig,\n KeyRouterConfig,\n KeySelectionResult,\n KeyStats,\n RouterStats,\n SelectionOptions,\n KeyRouterError,\n RateLimitError,\n ProviderPreset,\n DebugEvent\n} from '../types';\nimport { KeyRouterError as KeyRouterErrorClass, RateLimitError as RateLimitErrorClass, PROVIDER_PRESETS, CircuitState } from '../types';\nimport { KeyTracker } from '../tracking/keyTracker';\nimport type { SelectionStrategy } from '../strategies/selectionStrategies';\nimport { WeightedLeastUtilizationStrategy, createStrategy } from '../strategies/selectionStrategies';\n\nexport class KeyRouter {\n private tracker: KeyTracker;\n private strategy: SelectionStrategy;\n private config: Required<KeyRouterConfig>;\n private initialized = false;\n\n constructor(config: KeyRouterConfig) {\n this.config = {\n keys: config.keys ? config.keys.map(k => ({ ...k })) : [],\n defaultRpmLimit: config.defaultRpmLimit ?? 40,\n defaultWeight: config.defaultWeight ?? 1,\n failureThreshold: config.failureThreshold ?? 3,\n cooldownMs: config.cooldownMs ?? 30_000,\n windowMs: config.windowMs ?? 60_000,\n trackLatency: config.trackLatency ?? true,\n onStateChange: config.onStateChange ?? (() => {}),\n onDebug: config.onDebug ?? (() => {})\n };\n\n if (this.config.defaultRpmLimit <= 0) throw new KeyRouterErrorClass('Invalid config: defaultRpmLimit must be > 0', 'INVALID_CONFIG');\n if (this.config.defaultWeight <= 0) throw new KeyRouterErrorClass('Invalid config: defaultWeight must be > 0', 'INVALID_CONFIG');\n if (this.config.failureThreshold <= 0) throw new KeyRouterErrorClass('Invalid config: failureThreshold must be > 0', 'INVALID_CONFIG');\n if (this.config.cooldownMs <= 0) throw new KeyRouterErrorClass('Invalid config: cooldownMs must be > 0', 'INVALID_CONFIG');\n if (this.config.windowMs <= 0) throw new KeyRouterErrorClass('Invalid config: windowMs must be > 0', 'INVALID_CONFIG');\n\n for (const key of this.config.keys) {\n if (key.rpmLimit !== undefined && key.rpmLimit <= 0) {\n throw new KeyRouterErrorClass('Invalid config: rpmLimit must be > 0', 'INVALID_CONFIG');\n }\n if (key.weight !== undefined && key.weight <= 0) {\n throw new KeyRouterErrorClass('Invalid config: weight must be > 0', 'INVALID_CONFIG');\n }\n }\n\n this.tracker = new KeyTracker({\n defaultRpmLimit: this.config.defaultRpmLimit,\n defaultWeight: this.config.defaultWeight,\n failureThreshold: this.config.failureThreshold,\n cooldownMs: this.config.cooldownMs,\n windowMs: this.config.windowMs,\n trackLatency: this.config.trackLatency,\n onStateChange: this.config.onStateChange,\n onDebug: this.config.onDebug\n });\n\n this.strategy = new WeightedLeastUtilizationStrategy();\n }\n\n /**\n * Initialize the router with keys\n * Must be called before using getKey()\n */\n initialize(): void {\n if (this.initialized) {\n return;\n }\n\n if (!this.config.keys.length) {\n throw new KeyRouterErrorClass(\n 'No keys configured. At least one key must be provided.',\n 'NO_KEYS_CONFIGURED'\n );\n }\n\n for (const keyConfig of this.config.keys) {\n if (!keyConfig.key || !keyConfig.id) {\n throw new KeyRouterErrorClass(\n `Invalid key config: each key must have 'id' and 'key' properties`,\n 'NO_KEYS_CONFIGURED'\n );\n }\n }\n\n this.tracker.initialize(this.config.keys);\n this.initialized = true;\n\n this.config.onDebug?.({\n type: 'key_selected',\n timestamp: Date.now(),\n details: { initialized: true, keyCount: this.config.keys.length }\n });\n }\n\n /**\n * Get the next available API key\n * Returns key string ready to use with OpenAI/LangChain SDKs\n */\n async getKey(options?: SelectionOptions): Promise<string> {\n this.ensureInitialized();\n\n const availableKeys = this.tracker.getAvailableKeys();\n\n if (availableKeys.length === 0) {\n this.config.onDebug?.({\n type: 'all_exhausted',\n timestamp: Date.now(),\n details: { totalKeys: this.config.keys.length }\n });\n\n throw new RateLimitErrorClass('all');\n }\n\n // Apply preferred keys strategy if specified\n let strategy = this.strategy;\n if (options?.preferredKeys?.length) {\n strategy = createStrategy('preferred-keys', this.strategy);\n } else if (options?.strategy) {\n strategy = createStrategy(options.strategy, this.strategy);\n }\n\n const selected = strategy.select(availableKeys, options);\n\n if (!selected) {\n throw new RateLimitErrorClass('all');\n }\n\n // Record the selection attempt (reserves RPM)\n this.tracker.recordAttempt(selected.config.id);\n\n return selected.config.key;\n }\n\n /**\n * Get key with full metadata (for debugging/logging)\n */\n async getKeyWithMeta(options?: SelectionOptions): Promise<KeySelectionResult> {\n this.ensureInitialized();\n\n const availableKeys = this.tracker.getAvailableKeys();\n\n if (availableKeys.length === 0) {\n throw new RateLimitErrorClass('all');\n }\n\n const strategy = options?.strategy\n ? createStrategy(options.strategy, this.strategy)\n : this.strategy;\n\n const selected = strategy.select(availableKeys, options);\n\n if (!selected) {\n throw new RateLimitErrorClass('all');\n }\n\n const limit = selected.config.rpmLimit ?? this.config.defaultRpmLimit;\n return {\n key: selected.config.key,\n config: selected.config,\n keyId: selected.config.id,\n utilization: limit > 0 ? selected.rpm / limit : 0\n };\n }\n\n /**\n * Report a failed request for a specific key or key ID\n * Call this when you catch a 429/5xx error from the API\n */\n reportFailure(keyOrId: string, isRateLimit: boolean = false): void {\n const state = this.findKeyOrId(keyOrId);\n if (state) {\n this.tracker.recordFailure(state.config.id, isRateLimit);\n }\n }\n\n /**\n * Report a successful request for a specific key or key ID\n * Optional: call this if you want to track latency manually\n */\n reportSuccess(keyOrId: string, latencyMs?: number): void {\n const state = this.findKeyOrId(keyOrId);\n if (state) {\n this.tracker.recordSuccess(state.config.id, latencyMs);\n }\n }\n\n /**\n * Manually mark a key as recovered\n */\n reportRecovery(keyOrId: string): void {\n const state = this.findKeyOrId(keyOrId);\n if (state) {\n this.tracker.reportRecovery(state.config.id);\n }\n }\n\n /**\n * Get statistics for all keys\n */\n getStats(): KeyStats[] {\n return this.tracker.getStats();\n }\n\n /**\n * Get overall router statistics\n */\n getOverallStats() {\n return this.tracker.getOverallStats();\n }\n\n /**\n * Get a specific key's stats by ID\n */\n getKeyStats(keyId: string): KeyStats | undefined {\n const state = this.tracker.getState(keyId);\n if (!state) return undefined;\n\n const stats = this.tracker.getStats();\n return stats.find(s => s.id === keyId);\n }\n\n /**\n * Check if a specific key is healthy\n */\n isKeyHealthy(keyId: string): boolean {\n const state = this.tracker.getState(keyId);\n if (!state) return false;\n const limit = state.config.rpmLimit ?? this.config.defaultRpmLimit;\n if (state.circuitState === CircuitState.OPEN) {\n if (Date.now() >= state.cooldownUntil) {\n return state.rpm < limit;\n }\n return false;\n }\n return state.rpm < limit;\n }\n\n /**\n * Get all available (healthy + under limit) key IDs\n */\n getAvailableKeyIds(): string[] {\n return this.tracker.getAvailableKeys().map(s => s.config.id);\n }\n\n /**\n * Set custom selection strategy\n */\n setStrategy(strategy: SelectionStrategy | string): void {\n if (typeof strategy === 'string') {\n this.strategy = createStrategy(strategy, this.strategy);\n } else {\n this.strategy = strategy;\n }\n }\n\n /**\n * Add a new key at runtime\n */\n addKey(keyConfig: KeyConfig): void {\n this.ensureInitialized();\n this.tracker.initialize([...this.config.keys, keyConfig]);\n this.config.keys.push(keyConfig);\n }\n\n /**\n * Remove a key at runtime\n */\n removeKey(keyId: string): boolean {\n const index = this.config.keys.findIndex(k => k.id === keyId);\n if (index === -1) return false;\n\n this.config.keys.splice(index, 1);\n this.tracker.initialize(this.config.keys);\n return true;\n }\n\n /**\n * Update key configuration at runtime\n */\n updateKey(keyId: string, updates: Partial<KeyConfig>): boolean {\n const key = this.config.keys.find(k => k.id === keyId);\n if (!key) return false;\n\n Object.assign(key, updates);\n this.tracker.initialize(this.config.keys);\n return true;\n }\n\n /**\n * Reset all tracking (useful for testing)\n */\n reset(): void {\n this.tracker.reset();\n }\n\n /**\n * Shutdown and cleanup\n */\n destroy(): void {\n this.tracker.destroy();\n this.initialized = false;\n }\n\n // ==================== Provider Preset Helpers ====================\n\n /**\n * Create a router from a provider preset\n */\n static fromProvider(\n provider: keyof typeof PROVIDER_PRESETS,\n keys: string[],\n options?: Partial<KeyRouterConfig>\n ): KeyRouter {\n const preset = PROVIDER_PRESETS[provider];\n if (!preset) {\n throw new KeyRouterErrorClass(\n `Unknown provider: ${provider}. Available: ${Object.keys(PROVIDER_PRESETS).join(', ')}`,\n 'NO_KEYS_CONFIGURED'\n );\n }\n\n const keyConfigs: KeyConfig[] = keys.map((key, index) => ({\n id: `${provider}-${index + 1}`,\n key,\n rpmLimit: preset.defaultRpmLimit,\n baseURL: preset.baseURL\n }));\n\n return new KeyRouter({\n keys: keyConfigs,\n ...options\n });\n }\n\n /**\n * Create a router for NVIDIA specifically (most common use case)\n */\n static forNvidia(keys: string[], options?: Partial<KeyRouterConfig>): KeyRouter {\n return KeyRouter.fromProvider('nvidia', keys, options);\n }\n\n /**\n * Create router from environment variable (comma-separated keys)\n */\n static fromEnv(\n envVar: string,\n options?: Partial<KeyRouterConfig>\n ): KeyRouter {\n const keys = process.env[envVar]?.split(',').map(k => k.trim()).filter(Boolean) ?? [];\n if (!keys.length) {\n throw new KeyRouterErrorClass(\n `Environment variable ${envVar} not set or empty`,\n 'NO_KEYS_CONFIGURED'\n );\n }\n return new KeyRouter({\n keys: keys.map((key, i) => ({ id: `env-${i + 1}`, key })),\n ...options\n });\n }\n\n // ==================== Private Helpers ====================\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n this.initialize();\n }\n }\n\n private findKeyOrId(keyOrId: string): ReturnType<typeof this.tracker.getState> {\n for (const state of this.tracker.getAllStates()) {\n if (state.config.id === keyOrId || state.config.key === keyOrId) {\n return state;\n }\n }\n return undefined;\n }\n}\n\n// Re-export types and errors for convenience\nexport type {\n KeyConfig,\n KeyRouterConfig,\n KeySelectionResult,\n KeyStats,\n RouterStats,\n SelectionOptions,\n CircuitState,\n ProviderPreset\n} from '../types';\n\nexport { KeyRouterError, RateLimitError } from '../types';\nexport { PROVIDER_PRESETS } from '../types';","/**\n * Utility helpers for keymux\n */\n\n/**\n * Check if an error is a rate limit error (429)\n */\nexport function isRateLimitError(error: unknown, seen = new WeakSet<object>()): boolean {\n if (!error) return false;\n\n // OpenAI SDK error structure\n if (error instanceof Error || (typeof error === 'object' && error !== null)) {\n if (seen.has(error as object)) return false; // Prevent infinite recursion\n seen.add(error as object);\n \n if (error instanceof Error) {\n // Check error message\n const message = error.message.toLowerCase();\n if (message.includes('429') || message.includes('rate limit') || message.includes('too many requests')) {\n return true;\n }\n }\n\n // Check for status code on error object\n const errWithStatus = error as { status?: number; statusCode?: number; code?: string; cause?: any };\n if (errWithStatus.status === 429 || errWithStatus.statusCode === 429 || errWithStatus.code === '429') {\n return true;\n }\n\n // Check cause chain\n if (errWithStatus.cause) {\n return isRateLimitError(errWithStatus.cause, seen);\n }\n }\n\n return false;\n}\n\n/**\n * Check if an error is a server error (5xx)\n */\nexport function isServerError(error: unknown, seen = new WeakSet<object>()): boolean {\n if (!error) return false;\n\n if (error instanceof Error || (typeof error === 'object' && error !== null)) {\n if (seen.has(error as object)) return false; // Prevent infinite recursion\n seen.add(error as object);\n \n const errWithStatus = error as { status?: number; statusCode?: number; cause?: any };\n const status = errWithStatus.status ?? errWithStatus.statusCode;\n if (status && status >= 500 && status < 600) {\n return true;\n }\n\n if (errWithStatus.cause) {\n return isServerError(errWithStatus.cause, seen);\n }\n }\n\n return false;\n}\n\n/**\n * Check if an error is retryable (rate limit or server error)\n */\nexport function isRetryableError(error: unknown): boolean {\n return isRateLimitError(error) || isServerError(error);\n}\n\n/**\n * Calculate exponential backoff delay with jitter\n */\nexport function calculateBackoff(attempt: number, baseMs: number = 1000, maxMs: number = 30000): number {\n const delay = Math.min(baseMs * Math.pow(2, attempt), maxMs);\n const jitter = delay * 0.25 * (Math.random() * 2 - 1);\n return Math.min(Math.max(0, Math.round(delay + jitter)), maxMs);\n}\n\n/**\n * Mask API key for logging (show only first 4 and last 4 chars)\n * Example: sk-abcdef1234567890 -> sk-ab****7890\n */\nexport function maskKey(key: string): string {\n if (!key || key.length <= 8) return '****';\n return key.slice(0, 4) + '****' + key.slice(-4);\n}\n\n/**\n * Parse comma-separated keys from string\n * Reads keys from environment variables - splits by comma to create an array\n * Filters out empty strings\n */\nexport function parseKeys(keysString: string): string[] {\n return keysString\n .split(',')\n .map(k => k.trim())\n .filter(Boolean);\n}\n\n/**\n * Create a simple async key getter for OpenAI SDK / LangChain\n * Usage: new ChatOpenAI({ apiKey: createKeyGetter(router) })\n * This function returns an async getter that calls router.getKey()\n */\nexport function createKeyGetter(router: { getKey(): Promise<string> }) {\n return async (): Promise<string> => {\n return router.getKey();\n };\n}\n\n/**\n * Create a key getter with automatic failover\n * Usage: new ChatOpenAI({ apiKey: createFailoverKeyGetter(router, 3) })\n */\nexport function createFailoverKeyGetter(\n router: {\n getKey(): Promise<string>;\n reportFailure(key: string, isRateLimit?: boolean): void;\n reportSuccess(key: string): void;\n },\n maxRetries: number = 3\n) {\n return async (): Promise<string> => {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const key = await router.getKey();\n return key;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // If it's a rate limit error from our router (all keys exhausted), don't retry\n if (error instanceof Error && error.name === 'RateLimitError') {\n throw error;\n }\n\n // Wait before retry\n if (attempt < maxRetries - 1) {\n await new Promise(resolve => setTimeout(resolve, calculateBackoff(attempt)));\n }\n }\n }\n\n throw lastError;\n };\n}\n\n/**\n * Sleep utility\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Format router stats for pretty logging\n */\nexport function formatStats(stats: ReturnType<import('../core/keyRouter').KeyRouter['getOverallStats']>): string {\n const { totalKeys, healthyKeys, totalRpm, totalRpmLimit, overallUtilization, keys } = stats;\n\n const lines = [\n `📊 KeyRouter Stats: ${healthyKeys}/${totalKeys} healthy | ${totalRpm}/${totalRpmLimit} RPM (${(overallUtilization * 100).toFixed(1)}%)`,\n ''\n ];\n\n for (const key of keys) {\n const status = key.isHealthy ? '✅' : '❌';\n const circuit = key.circuitState === 'open' ? ' 🔴' : key.circuitState === 'degraded' ? ' 🟡' : '';\n lines.push(\n ` ${status} ${key.id}: ${key.rpm}/${key.rpmLimit} RPM (${(key.utilization * 100).toFixed(1)}%)${circuit} | ` +\n `Latency: ${key.avgLatencyMs}ms | Req: ${key.totalRequests} | Err: ${key.totalErrors}`\n );\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Create a periodic stats logger\n */\nexport function createStatsLogger(\n router: { getOverallStats(): ReturnType<import('../core/keyRouter').KeyRouter['getOverallStats']> },\n intervalMs: number = 60_000\n): NodeJS.Timeout {\n return setInterval(() => {\n console.log(formatStats(router.getOverallStats()));\n }, intervalMs);\n}","/**\n * MultiProviderRouter - Routes requests across multiple AI providers\n *\n * Internally uses KeyTracker + SelectionStrategy directly (same engine as KeyRouter)\n * but adds provider-awareness: baseURL, model, and provider-level filtering.\n *\n * Architecture:\n * - Flattens all providers' keys into a single pool of KeyConfig entries\n * - Each entry gets a unique ID: `${provider}-${keyIndex}` (e.g. 'nvidia-0', 'gemini-1')\n * - An endpointMap stores the metadata (baseURL, model, provider) for each key ID\n * - A providerGroups map tracks which key IDs belong to which provider\n * - Selection uses existing KeyTracker (circuit breakers, RPM) + SelectionStrategy\n */\n\nimport type {\n KeyConfig,\n KeyStats,\n ProviderPoolEntry,\n EndpointResult,\n EndpointOptions,\n MultiProviderConfig,\n DebugEvent,\n} from '../types';\nimport {\n CircuitState,\n KeyRouterError,\n RateLimitError,\n PROVIDER_PRESETS,\n} from '../types';\nimport { KeyTracker } from '../tracking/keyTracker';\nimport type { SelectionStrategy } from '../strategies/selectionStrategies';\nimport {\n WeightedLeastUtilizationStrategy,\n PreferredKeysStrategy,\n createStrategy,\n} from '../strategies/selectionStrategies';\n\n/**\n * Internal metadata stored per endpoint (per key ID)\n */\ninterface EndpointMeta {\n baseURL: string;\n model: string;\n provider: string;\n}\n\n/**\n * Per-provider statistics\n */\nexport interface ProviderStats {\n provider: string;\n totalKeys: number;\n healthyKeys: number;\n totalRpm: number;\n totalRpmLimit: number;\n utilization: number;\n keys: KeyStats[];\n}\n\nexport class MultiProviderRouter {\n private tracker: KeyTracker;\n private strategy: SelectionStrategy;\n private endpointMap: Map<string, EndpointMeta> = new Map();\n private providerGroups: Map<string, string[]> = new Map();\n public lastRoute: { provider: string, model: string, key: string, time: number } | null = null;\n private keyConfigs: KeyConfig[] = [];\n private providers: ProviderPoolEntry[];\n private config: Required<MultiProviderConfig>;\n\n constructor(providers: ProviderPoolEntry[], config?: MultiProviderConfig) {\n if (!providers.length) {\n throw new KeyRouterError(\n 'At least one provider must be configured.',\n 'NO_KEYS_CONFIGURED'\n );\n }\n\n // Deep clone to prevent mutation of the caller's array\n this.providers = providers.map((p) => ({\n ...p,\n keys: [...p.keys],\n models: p.models ? [...p.models] : undefined,\n }));\n\n this.config = {\n failureThreshold: config?.failureThreshold ?? 3,\n cooldownMs: config?.cooldownMs ?? 30_000,\n windowMs: config?.windowMs ?? 60_000,\n trackLatency: config?.trackLatency ?? true,\n strategy: config?.strategy ?? 'weighted-least-utilization',\n onStateChange: config?.onStateChange ?? (() => {}),\n onDebug: config?.onDebug ?? (() => {}),\n };\n\n if (this.config.failureThreshold <= 0) throw new KeyRouterError('Invalid config: failureThreshold must be > 0', 'INVALID_CONFIG');\n if (this.config.cooldownMs <= 0) throw new KeyRouterError('Invalid config: cooldownMs must be > 0', 'INVALID_CONFIG');\n if (this.config.windowMs <= 0) throw new KeyRouterError('Invalid config: windowMs must be > 0', 'INVALID_CONFIG');\n\n for (const provider of this.providers) {\n if (provider.rpmLimit !== undefined && provider.rpmLimit <= 0) {\n throw new KeyRouterError('Invalid config: rpmLimit must be > 0', 'INVALID_CONFIG');\n }\n if (provider.weight !== undefined && provider.weight <= 0) {\n throw new KeyRouterError('Invalid config: weight must be > 0', 'INVALID_CONFIG');\n }\n }\n\n // Create the tracker (same engine KeyRouter uses internally)\n this.tracker = new KeyTracker({\n defaultRpmLimit: 40,\n defaultWeight: 1,\n failureThreshold: this.config.failureThreshold,\n cooldownMs: this.config.cooldownMs,\n windowMs: this.config.windowMs,\n trackLatency: this.config.trackLatency,\n onStateChange: this.config.onStateChange,\n onDebug: this.config.onDebug,\n });\n\n // Create the selection strategy\n this.strategy = createStrategy(this.config.strategy);\n\n // Flatten all providers into a single key pool\n this.buildPool(providers);\n }\n\n // ==================== Core Methods ====================\n\n /**\n * Get the next best endpoint for making an API call\n * Returns key + baseURL + model + provider — everything needed for a request\n *\n * Supports filtering:\n * - preferProviders: try these first\n * - excludeProviders: skip these entirely\n * - model: pick a provider that has this model\n * - maxUtilization: skip overloaded endpoints\n */\n async getEndpoint(options?: EndpointOptions): Promise<EndpointResult> {\n let availableKeys = this.tracker.getAvailableKeys();\n\n // Filter by excludeProviders\n if (options?.excludeProviders?.length) {\n availableKeys = availableKeys.filter((k) => {\n const meta = this.endpointMap.get(k.config.id);\n return meta ? !options.excludeProviders!.includes(meta.provider) : true;\n });\n }\n\n // Filter by specific model\n if (options?.model) {\n availableKeys = availableKeys.filter((k) => {\n const meta = this.endpointMap.get(k.config.id);\n return meta ? meta.model === options.model : false;\n });\n }\n\n // Filter by maxUtilization\n if (options?.maxUtilization != null) {\n availableKeys = availableKeys.filter((k) => {\n const limit = k.config.rpmLimit ?? 40;\n return k.rpm / limit <= options.maxUtilization!;\n });\n }\n\n if (availableKeys.length === 0) {\n this.config.onDebug({\n type: 'all_exhausted',\n timestamp: Date.now(),\n details: { totalEndpoints: this.endpointMap.size },\n });\n throw new RateLimitError('all');\n }\n\n // Build selection options\n const preferredKeys = options?.preferProviders?.length\n ? options.preferProviders.flatMap(\n (p) => this.providerGroups.get(p) ?? []\n )\n : undefined;\n\n // Pick the strategy (per-request override or default)\n let activeStrategy = options?.strategy\n ? createStrategy(options.strategy, this.strategy)\n : this.strategy;\n\n // Wrap with PreferredKeysStrategy when provider preferences are specified\n if (preferredKeys?.length) {\n activeStrategy = new PreferredKeysStrategy(activeStrategy);\n }\n\n const selected = activeStrategy.select(availableKeys, { preferredKeys });\n\n if (!selected) {\n throw new RateLimitError('all');\n }\n\n // Record the selection attempt (reserves RPM)\n this.tracker.recordAttempt(selected.config.id);\n const m = this.endpointMap.get(selected.config.id);\n if (m) {\n this.lastRoute = {\n provider: m.provider,\n model: m.model,\n key: selected.config.key,\n time: Date.now()\n };\n }\n\n const meta = this.endpointMap.get(selected.config.id);\n if (!meta) {\n throw new KeyRouterError(\n `Endpoint metadata not found for ${selected.config.id}`,\n 'KEY_NOT_FOUND',\n selected.config.id\n );\n }\n\n const limit = selected.config.rpmLimit ?? 40;\n\n return {\n key: selected.config.key,\n baseURL: meta.baseURL,\n model: meta.model,\n provider: meta.provider,\n endpointId: selected.config.id,\n utilization: limit > 0 ? selected.rpm / limit : 0,\n };\n }\n\n /**\n * Report a successful request for an endpoint\n * Resets failure count, updates latency (EMA), recovers degraded state\n */\n reportSuccess(endpointId: string, latencyMs?: number): void {\n this.tracker.recordSuccess(endpointId, latencyMs);\n }\n\n /**\n * Report a failed request for an endpoint\n * Increments failure count, may open circuit breaker\n * Next getEndpoint() call will automatically route to a different provider\n */\n reportFailure(endpointId: string, isRateLimit: boolean = false): void {\n this.tracker.recordFailure(endpointId, isRateLimit);\n }\n\n /**\n * Manually recover an endpoint (e.g. after external health check)\n */\n reportRecovery(endpointId: string): void {\n this.tracker.reportRecovery(endpointId);\n }\n\n // ==================== Stats & Monitoring ====================\n\n /**\n * Get overall stats across all providers (same familiar format as KeyRouter)\n */\n getOverallStats() {\n return this.tracker.getOverallStats();\n }\n\n /**\n * Get stats for all endpoints\n */\n getStats(): KeyStats[] {\n return this.tracker.getStats();\n }\n\n /**\n * Get stats for a specific provider\n */\n getProviderStats(provider: string): ProviderStats {\n const keyIds = this.providerGroups.get(provider) ?? [];\n const allStats = this.tracker.getStats();\n const providerKeyStats = allStats.filter((s) => keyIds.includes(s.id));\n\n const totalRpm = providerKeyStats.reduce((sum, s) => sum + s.rpm, 0);\n const totalRpmLimit = providerKeyStats.reduce(\n (sum, s) => sum + s.rpmLimit,\n 0\n );\n\n return {\n provider,\n totalKeys: providerKeyStats.length,\n healthyKeys: providerKeyStats.filter((s) => s.isHealthy).length,\n totalRpm,\n totalRpmLimit,\n utilization: totalRpmLimit > 0 ? totalRpm / totalRpmLimit : 0,\n keys: providerKeyStats,\n };\n }\n\n /**\n * Get list of all configured provider names\n */\n getProviderNames(): string[] {\n return Array.from(this.providerGroups.keys());\n }\n\n /**\n * Get all available (healthy + under limit) endpoint IDs\n */\n getLastRoute() { return this.lastRoute; }\n \n getAvailableEndpointIds(): string[] {\n return this.tracker.getAvailableKeys().map((s) => s.config.id);\n }\n\n /**\n * Check if a specific endpoint is healthy\n */\n isEndpointHealthy(endpointId: string): boolean {\n const state = this.tracker.getState(endpointId);\n if (!state) return false;\n const limit = state.config.rpmLimit ?? 40;\n\n // Check if circuit has recovered from cooldown (lazy recovery)\n if (state.circuitState === CircuitState.OPEN) {\n if (Date.now() >= state.cooldownUntil) {\n return state.rpm < limit;\n }\n return false;\n }\n\n return state.rpm < limit;\n }\n\n /**\n * Check if a provider has any healthy endpoints\n */\n isProviderHealthy(provider: string): boolean {\n const keyIds = this.providerGroups.get(provider) ?? [];\n return keyIds.some((id) => this.isEndpointHealthy(id));\n }\n\n // ==================== Dynamic Management ====================\n\n /**\n * Add a new provider at runtime\n */\n addProvider(entry: ProviderPoolEntry): void {\n if (!entry.keys.length) {\n throw new KeyRouterError(\n `Provider '${entry.provider}' must have at least one key.`,\n 'NO_KEYS_CONFIGURED'\n );\n }\n\n const clonedEntry = JSON.parse(JSON.stringify(entry));\n this.providers.push(clonedEntry);\n this.rebuildPool();\n }\n\n /**\n * Add a key to an existing provider at runtime\n */\n addKeyToProvider(provider: string, key: string): void {\n const entry = this.providers.find((p) => p.provider === provider);\n if (!entry) {\n throw new KeyRouterError(\n `Provider '${provider}' not found. Use addProvider() to add a new provider.`,\n 'KEY_NOT_FOUND'\n );\n }\n\n const clonedKey = JSON.parse(JSON.stringify(key));\n entry.keys.push(clonedKey);\n this.rebuildPool();\n }\n\n /**\n * Remove a provider entirely at runtime\n */\n removeProvider(provider: string): boolean {\n const index = this.providers.findIndex((p) => p.provider === provider);\n if (index === -1) return false;\n\n this.providers.splice(index, 1);\n this.rebuildPool();\n return true;\n }\n\n /**\n * Remove a specific key from a provider at runtime\n */\n removeKey(provider: string, key: string): boolean {\n const entry = this.providers.find((p) => p.provider === provider);\n if (!entry) return false;\n\n const keyIndex = entry.keys.indexOf(key);\n if (keyIndex === -1) return false;\n\n entry.keys.splice(keyIndex, 1);\n\n // If provider has no keys left, remove it entirely\n if (entry.keys.length === 0) {\n return this.removeProvider(provider);\n }\n\n this.rebuildPool();\n return true;\n }\n\n // ==================== Strategy ====================\n\n /**\n * Set the selection strategy\n */\n setStrategy(strategy: SelectionStrategy | string): void {\n if (typeof strategy === 'string') {\n this.strategy = createStrategy(strategy, this.strategy);\n } else {\n this.strategy = strategy;\n }\n }\n\n // ==================== Lifecycle ====================\n\n /**\n * Reset all tracking data (useful for testing)\n */\n reset(): void {\n this.tracker.reset();\n }\n\n /**\n * Shutdown and cleanup (stops background cleanup timer)\n */\n destroy(): void {\n this.tracker.destroy();\n }\n\n // ==================== Private Helpers ====================\n\n /**\n * Flatten all providers into a single key pool\n * Each key gets a unique ID: `${provider}-${keyIndex}`\n * Provider metadata (baseURL, model) is stored in endpointMap\n */\n private buildPool(providers: ProviderPoolEntry[]): void {\n this.keyConfigs = [];\n this.endpointMap.clear();\n this.providerGroups.clear();\n\n for (const entry of providers) {\n const preset = PROVIDER_PRESETS[entry.provider];\n const baseURL =\n entry.baseURL ?? preset?.baseURL ?? '';\n const rpmLimit =\n entry.rpmLimit ?? preset?.defaultRpmLimit ?? 40;\n const models =\n entry.models ?? preset?.models ?? [];\n const defaultModel = models[0] ?? '';\n const weight = entry.weight ?? 1;\n\n if (!baseURL) {\n throw new KeyRouterError(\n `Provider '${entry.provider}' has no baseURL. Provide one or use a known provider preset.`,\n 'NO_KEYS_CONFIGURED'\n );\n }\n\n const groupIds: string[] = [];\n\n for (let i = 0; i < entry.keys.length; i++) {\n const key = entry.keys[i]!;\n const id = `${entry.provider}-${i}`;\n\n // KeyConfig for the tracker\n this.keyConfigs.push({\n id,\n key,\n rpmLimit,\n weight,\n baseURL,\n metadata: {\n provider: entry.provider,\n model: defaultModel,\n ...entry.metadata,\n },\n });\n\n // Endpoint metadata\n this.endpointMap.set(id, {\n baseURL,\n model: defaultModel,\n provider: entry.provider,\n });\n\n groupIds.push(id);\n }\n\n this.providerGroups.set(entry.provider, groupIds);\n }\n\n // Initialize the tracker with the flat key pool\n this.tracker.initialize(this.keyConfigs);\n }\n\n /**\n * Rebuild the pool from current providers (used after dynamic changes)\n */\n private rebuildPool(): void {\n this.buildPool(this.providers);\n }\n}\n","import { MultiProviderRouter } from './multiProviderRouter';\nimport type { EndpointResult, EndpointOptions } from '../types';\n\nexport interface FetchConfig {\n router: MultiProviderRouter;\n maxRetries?: number;\n preferProviders?: string[];\n excludeProviders?: string[];\n model?: string;\n}\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport async function fetchWithFailover(\n urlBuilder: (ep: EndpointResult) => string | URL,\n fetchOptionsBuilder: (ep: EndpointResult) => RequestInit,\n config: FetchConfig\n): Promise<Response> {\n const router = config.router;\n const maxRetries = config.maxRetries ?? 3;\n let attempts = 0;\n let lastResponse: Response | null = null;\n let lastError: Error | null = null;\n const dynamicExcludeProviders = [...(config.excludeProviders || [])];\n\n while (attempts < maxRetries) {\n attempts++;\n \n let ep: EndpointResult;\n try {\n ep = await router.getEndpoint({\n preferProviders: config.preferProviders,\n excludeProviders: dynamicExcludeProviders,\n model: config.model\n });\n } catch (error: any) {\n if (attempts >= maxRetries) continue;\n \n if (lastResponse) {\n return lastResponse;\n }\n throw error;\n }\n\n const url = urlBuilder(ep);\n const options = fetchOptionsBuilder(ep);\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 300000); // 5 mins timeout\n \n const response = await fetch(url, { ...options, signal: controller.signal as any });\n clearTimeout(timeoutId);\n lastResponse = response;\n\n if (!response.ok) {\n let errorText = '';\n try {\n const clone = response.clone();\n if (clone.body) {\n const reader = clone.body.getReader();\n const { value } = await reader.read();\n if (value) {\n errorText = new TextDecoder().decode(value).slice(0, 2048);\n }\n reader.cancel().catch(() => {});\n } else {\n errorText = (await clone.text()).slice(0, 2048);\n }\n } catch(e) {}\n\n const lower = errorText.toLowerCase();\n const isContextError = lower.includes(\"context length exceeded\") || lower.includes(\"maximum context length\");\n const isModelError = lower.includes(\"decommissioned\") || lower.includes(\"not a valid model\") || lower.includes(\"model not found\") || lower.includes(\"does not exist\") || lower.includes(\"not supported\");\n const isAuthError = response.status === 401 || response.status === 403;\n const isRateLimit = response.status === 429;\n\n // Report failure to circuit breaker\n router.reportFailure(ep.endpointId, isRateLimit);\n\n // Exclude the ENTIRE provider if the error is provider-specific\n // (retrying the same provider with a different key won't fix model/auth issues)\n if (isContextError || isModelError || isAuthError || response.status === 402 || response.status === 404) {\n if (!dynamicExcludeProviders.includes(ep.provider)) {\n dynamicExcludeProviders.push(ep.provider);\n }\n }\n\n // Backoff on rate limits and server errors\n if (isRateLimit || response.status >= 500) {\n await sleep(Math.min(1000 * Math.pow(2, attempts - 1), 10000));\n }\n \n // NEVER return early — always try the next provider/key\n continue;\n }\n\n return response;\n\n } catch (error: any) {\n lastError = error;\n router.reportFailure(ep.endpointId, false);\n }\n }\n\n if (lastResponse) {\n return lastResponse;\n }\n \n if (lastError && lastError.name === 'AbortError') {\n throw new Error(\"timeout\");\n }\n \n throw new Error(`fetchWithFailover exhausted all retries. Last error: ${lastError?.message}`);\n}\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\nexport interface DailyUsage {\n date: string; // YYYY-MM-DD\n inputTokens: number;\n outputTokens: number;\n cacheTokens: number;\n requests: number;\n providerUsage?: Record<string, ProviderUsage>;\n}\n\nexport interface ProviderUsage {\n requests: number;\n tokens: number;\n}\n\nexport interface UsageData {\n totalRequests: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalCacheTokens: number;\n providerUsage: Record<string, number | ProviderUsage>; // provider -> usage\n daily: Record<string, DailyUsage>;\n sessions: number; // Count of proxy starts\n firstUsed: number; // timestamp\n}\n\nexport class UsageTracker {\n private data: UsageData;\n private filePath: string;\n private saveTimeout: NodeJS.Timeout | null = null;\n private sessionProviderUsage: Record<string, ProviderUsage> = {};\n\n private initialized = false;\n\n constructor() {\n const dir = path.join(os.homedir(), '.keymux');\n this.filePath = path.join(dir, 'usage.json');\n this.data = {\n totalRequests: 0,\n totalInputTokens: 0,\n totalOutputTokens: 0,\n totalCacheTokens: 0,\n providerUsage: {},\n daily: {},\n sessions: 0,\n firstUsed: Date.now(),\n };\n }\n\n private ensureInitialized() {\n if (this.initialized) return;\n this.initialized = true;\n\n const dir = path.dirname(this.filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n this.data = this.loadData();\n this.data.sessions += 1;\n this.saveData();\n }\n\n private loadData(): UsageData {\n const defaultData: UsageData = {\n totalRequests: 0,\n totalInputTokens: 0,\n totalOutputTokens: 0,\n totalCacheTokens: 0,\n providerUsage: {},\n daily: {},\n sessions: 0,\n firstUsed: Date.now(),\n };\n if (fs.existsSync(this.filePath)) {\n try {\n const content = fs.readFileSync(this.filePath, 'utf-8');\n const parsed = JSON.parse(content);\n\n if (parsed && typeof parsed === 'object') {\n const providerUsage: Record<string, ProviderUsage> = {};\n if (parsed.providerUsage) {\n for (const [k, v] of Object.entries(parsed.providerUsage)) {\n if (typeof v === 'number') {\n providerUsage[k] = { requests: v, tokens: 0 };\n } else {\n providerUsage[k] = v as ProviderUsage;\n }\n }\n }\n\n return { ...defaultData, ...parsed, providerUsage, daily: parsed.daily || {} };\n }\n } catch (e) {\n // ignore\n }\n }\n return defaultData;\n }\n\n private saveData() {\n try {\n // Cross-process merge strategy: re-read disk state before writing\n if (fs.existsSync(this.filePath)) {\n try {\n const diskContent = fs.readFileSync(this.filePath, 'utf-8');\n const diskData = JSON.parse(diskContent);\n if (diskData.totalRequests > this.data.totalRequests) {\n this.data.totalRequests = diskData.totalRequests;\n // We could deep merge here, but for now just sync the totals to prevent losing concurrent CLI writes\n }\n } catch (e) {}\n }\n\n const tempPath = this.filePath + '.tmp';\n fs.writeFileSync(tempPath, JSON.stringify(this.data, null, 2));\n fs.renameSync(tempPath, this.filePath);\n } catch (e) {\n // ignore\n }\n }\n\n private scheduleSave() {\n if (!this.saveTimeout) {\n this.saveTimeout = setTimeout(() => {\n this.saveData();\n this.saveTimeout = null;\n }, 5000); // Save every 5s if active\n }\n }\n\n public recordRequest(provider: string, inputTokens: number, outputTokens: number, cacheTokens: number = 0) {\n this.ensureInitialized();\n const dateStr = new Date().toISOString().split('T')[0] as string;\n\n this.data.totalRequests += 1;\n this.data.totalInputTokens += inputTokens;\n this.data.totalOutputTokens += outputTokens;\n this.data.totalCacheTokens += cacheTokens;\n\n if (!this.data.providerUsage[provider]) {\n this.data.providerUsage[provider] = { requests: 0, tokens: 0 };\n } else if (typeof this.data.providerUsage[provider] === 'number') {\n this.data.providerUsage[provider] = { requests: this.data.providerUsage[provider] as number, tokens: 0 };\n }\n const provUsage = this.data.providerUsage[provider] as ProviderUsage;\n provUsage.requests += 1;\n provUsage.tokens += (inputTokens + outputTokens);\n\n if (!this.data.daily[dateStr]) {\n this.data.daily[dateStr] = {\n date: dateStr,\n inputTokens: 0,\n outputTokens: 0,\n cacheTokens: 0,\n requests: 0,\n };\n }\n\n this.data.daily[dateStr].inputTokens += inputTokens;\n this.data.daily[dateStr].outputTokens += outputTokens;\n this.data.daily[dateStr].cacheTokens += cacheTokens;\n this.data.daily[dateStr].requests += 1;\n\n // Update sessionProviderUsage\n if (!this.sessionProviderUsage[provider]) {\n this.sessionProviderUsage[provider] = { requests: 0, tokens: 0 };\n }\n this.sessionProviderUsage[provider].requests += 1;\n this.sessionProviderUsage[provider].tokens += (inputTokens + outputTokens);\n\n // Update daily providerUsage\n if (!this.data.daily[dateStr].providerUsage) {\n this.data.daily[dateStr].providerUsage = {};\n }\n if (!this.data.daily[dateStr].providerUsage![provider]) {\n this.data.daily[dateStr].providerUsage![provider] = { requests: 0, tokens: 0 };\n }\n this.data.daily[dateStr].providerUsage![provider].requests += 1;\n this.data.daily[dateStr].providerUsage![provider].tokens += (inputTokens + outputTokens);\n\n this.scheduleSave();\n }\n\n public getSessionUsage(): Record<string, ProviderUsage> {\n this.ensureInitialized();\n return this.sessionProviderUsage;\n }\n\n public getTodayUsage(): Record<string, ProviderUsage> {\n this.ensureInitialized();\n const todayDateStr = new Date().toISOString().split('T')[0] as string;\n return this.data.daily[todayDateStr]?.providerUsage || {};\n }\n\n public getData(): UsageData {\n this.ensureInitialized();\n return this.data;\n }\n}\n\nlet _globalTracker: UsageTracker | null = null;\nexport const globalUsageTracker = new Proxy({} as UsageTracker, {\n get: (target, prop) => {\n if (!_globalTracker) _globalTracker = new UsageTracker();\n return (_globalTracker as any)[prop];\n }\n});\n","export function translateMessages(anthropicMessages: any[], systemPrompt: any): any[] {\n const openaiMessages: any[] = [];\n if (systemPrompt) {\n let sysContent = systemPrompt;\n if (Array.isArray(systemPrompt)) {\n sysContent = systemPrompt.map((b: any) => b.text || \"\").join(\"\\n\");\n }\n openaiMessages.push({ role: \"system\", content: sysContent });\n }\n\n for (const msg of anthropicMessages || []) {\n const role = msg.role;\n\n if (typeof msg.content === \"string\") {\n openaiMessages.push({ role, content: msg.content });\n } else if (Array.isArray(msg.content)) {\n const contentParts: any[] = [];\n const calls: any[] = [];\n for (const block of msg.content) {\n if (block.type === \"text\") {\n contentParts.push({ type: \"text\", text: block.text });\n } else if (block.type === \"thinking\") {\n contentParts.push({ type: \"text\", text: `<thinking>${block.thinking}</thinking>` });\n } else if (block.type === \"image\") {\n contentParts.push({\n type: \"image_url\",\n image_url: { url: `data:${block.source.media_type};base64,${block.source.data}` }\n });\n } else if (block.type === \"tool_use\") {\n const inputCopy = typeof block.input === 'object' && block.input !== null ? { ...block.input } : {};\n calls.push({\n id: block.id,\n type: \"function\",\n function: {\n name: block.name,\n arguments: JSON.stringify(inputCopy),\n },\n });\n } else if (block.type === \"document\") {\n let title = block.title || 'document';\n if (typeof title === 'string' && (title.includes('../') || title.includes('..\\\\') || title.includes('/etc/') || title.startsWith('/'))) {\n title = \"sanitized_document\";\n }\n if (block.source && block.source.type === \"base64\" && block.source.data) {\n let docText = `[Attached File: ${title}]\\n`;\n if (block.source.media_type === \"application/pdf\") {\n docText += \"[PDF extraction via proxy is limited. Try pasting text if it fails]\";\n } else if (block.source.media_type && !block.source.media_type.startsWith(\"text/\")) {\n docText += \"[Binary content unsupported by translation layer]\";\n } else {\n try {\n docText += Buffer.from(block.source.data, 'base64').toString('utf8');\n } catch(e) {\n docText += \"[Binary file cannot be read]\";\n }\n }\n contentParts.push({ type: \"text\", text: docText });\n } else if (block.source && block.source.type === \"text\") {\n contentParts.push({ type: \"text\", text: `[Attached File: ${title}]\\n${block.source.data}` });\n }\n } else if (block.type === \"tool_result\") {\n let toolText = \"\";\n if (typeof block.content === \"string\") {\n toolText = block.content;\n } else if (Array.isArray(block.content)) {\n toolText = block.content.map((c: any) => {\n if (c.type === \"text\") return c.text;\n if (c.type === \"image\") return \"[Tool output included an image]\";\n return typeof c === \"string\" ? c : JSON.stringify(c);\n }).join(\"\\n\");\n }\n if (block.is_error) {\n toolText = `[Error executing tool]\\n${toolText}`;\n }\n openaiMessages.push({\n role: \"tool\",\n tool_call_id: block.tool_use_id,\n content: toolText || \"Executed successfully\"\n });\n }\n }\n\n if (contentParts.length > 0 || calls.length > 0) {\n const messageObj: any = { role };\n if (contentParts.length > 0) {\n messageObj.content = contentParts;\n }\n if (calls.length > 0) {\n messageObj.tool_calls = calls;\n }\n openaiMessages.push(messageObj);\n }\n }\n }\n return openaiMessages;\n}\n\nexport function translateTools(anthropicTools: any[]): any[] | undefined {\n if (!anthropicTools) return undefined;\n return anthropicTools.map((t: any) => {\n // Deep clone the input schema so we don't mutate the original request\n const parameters = JSON.parse(JSON.stringify(t.input_schema || {}));\n if (parameters && parameters.properties && parameters.properties.thought_signature) {\n delete parameters.properties.thought_signature;\n if (Array.isArray(parameters.required)) {\n parameters.required = parameters.required.filter((r: string) => r !== 'thought_signature');\n }\n }\n \n return {\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: parameters,\n },\n };\n });\n}\n\nexport function translateAnthropicToOpenAI(anthropicReq: any): any {\n if (anthropicReq.model) {\n if (anthropicReq.model === 'claude-3-5-sonnet-minimax-m3') {\n anthropicReq.model = 'minimax/minimax-m3:free';\n } else if (anthropicReq.model === 'claude-3-5-sonnet-minimax-m2.7') {\n anthropicReq.model = 'minimax/minimax-m2.7:free';\n } else if (anthropicReq.model === 'claude-3-5-sonnet-glm-5.2') {\n anthropicReq.model = 'z-ai/glm-5.2:free';\n } else if (anthropicReq.model === 'claude-3-5-sonnet-nemotron-3-super-120b-a12b') {\n anthropicReq.model = 'nvidia/nemotron-3-super-120b-a12b';\n } else if (anthropicReq.model === 'claude-3-5-sonnet-nemotron-3-ultra-550b-a55b') {\n anthropicReq.model = 'nvidia/nemotron-3-ultra-550b-a55b';\n }\n }\n\n const openaiReq: any = {\n messages: translateMessages(anthropicReq.messages, anthropicReq.system),\n stream: anthropicReq.stream !== undefined ? anthropicReq.stream : false,\n };\n \n if (openaiReq.stream) {\n openaiReq.stream_options = { include_usage: true };\n }\n \n const tools = translateTools(anthropicReq.tools);\n if (tools) openaiReq.tools = tools;\n\n if (anthropicReq.temperature !== undefined) {\n openaiReq.temperature = anthropicReq.temperature;\n }\n if (anthropicReq.top_k !== undefined) {\n openaiReq.top_k = anthropicReq.top_k;\n }\n if (anthropicReq.top_p !== undefined) {\n openaiReq.top_p = anthropicReq.top_p;\n }\n if (anthropicReq.max_tokens !== undefined) {\n openaiReq.max_tokens = anthropicReq.max_tokens;\n }\n \n if (anthropicReq.stop_sequences) {\n openaiReq.stop = anthropicReq.stop_sequences;\n }\n\n if (anthropicReq.tool_choice) {\n if (anthropicReq.tool_choice.type === 'tool') {\n openaiReq.tool_choice = { type: 'function', function: { name: anthropicReq.tool_choice.name } };\n } else if (anthropicReq.tool_choice.type === 'auto') {\n openaiReq.tool_choice = 'auto';\n }\n }\n\n return openaiReq;\n}\n","import * as http from 'http';\n\nexport class OpenRouterStreamTranslator {\n res: http.ServerResponse;\n requestedModel: string;\n currentBlockType: string | null;\n currentBlockIndex: number;\n toolIndexMap: Record<number, number>;\n state: 'NORMAL' | 'POTENTIAL_START' | 'IN_THINKING' | 'POTENTIAL_END';\n buffer: string;\n _thinkTag: string;\n hasSentMessageStart: boolean;\n\n constructor(res: http.ServerResponse, requestedModel: string) {\n this.res = res;\n this.requestedModel = requestedModel;\n \n this.currentBlockType = null;\n this.currentBlockIndex = 0;\n this.toolIndexMap = {};\n this.state = 'NORMAL';\n this.buffer = '';\n this._thinkTag = '<thinking>';\n this.hasSentMessageStart = false;\n }\n \n writeEvent(type: string, dataObj: any) {\n this.res.write(`event: ${type}\\ndata: ${JSON.stringify(dataObj)}\\n\\n`);\n }\n\n startMessage() {\n if (this.hasSentMessageStart) return;\n this.writeEvent(\"message_start\", {\n type: \"message_start\",\n message: {\n id: \"msg_\" + Math.random().toString(36).slice(2, 11),\n type: \"message\",\n role: \"assistant\",\n content: [],\n model: this.requestedModel,\n stop_reason: null,\n stop_sequence: null,\n usage: { input_tokens: 0, output_tokens: 0 },\n },\n });\n this.hasSentMessageStart = true;\n }\n\n stopCurrentBlock() {\n if (this.currentBlockType !== null) {\n this.writeEvent(\"content_block_stop\", {\n type: \"content_block_stop\",\n index: this.currentBlockIndex\n });\n this.currentBlockIndex++;\n this.currentBlockType = null;\n }\n }\n\n startBlock(type: string, extra: any = {}) {\n this.stopCurrentBlock();\n const content_block: any = { type, ...extra };\n if (type === 'thinking') {\n content_block.thinking = \"\";\n content_block.signature = \"dummy_sig\";\n } else if (type === 'text') {\n content_block.text = \"\";\n }\n \n this.writeEvent(\"content_block_start\", {\n type: \"content_block_start\",\n index: this.currentBlockIndex,\n content_block\n });\n this.currentBlockType = type;\n }\n \n handleChunk(chunkObj: any) {\n this.startMessage();\n \n const choice = chunkObj.choices && chunkObj.choices[0];\n if (!choice) return;\n \n const delta = choice.delta;\n if (!delta) return;\n\n const reasoning = delta.reasoning || delta.reasoning_content;\n if (reasoning) {\n if (this.currentBlockType !== \"thinking\") {\n this.startBlock(\"thinking\");\n }\n this.writeEvent(\"content_block_delta\", {\n type: \"content_block_delta\",\n index: this.currentBlockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: reasoning\n }\n });\n }\n\n if (typeof delta.content === 'string' && delta.content.length > 0) {\n let pendingText = \"\";\n let pendingThinking = \"\";\n\n const flushText = () => {\n if (pendingText.length > 0) {\n if (this.currentBlockType !== \"text\") this.startBlock(\"text\");\n this.writeEvent(\"content_block_delta\", {\n type: \"content_block_delta\",\n index: this.currentBlockIndex,\n delta: { type: \"text_delta\", text: pendingText }\n });\n pendingText = \"\";\n }\n };\n\n const flushThinking = () => {\n if (pendingThinking.length > 0) {\n if (this.currentBlockType !== \"thinking\") this.startBlock(\"thinking\");\n this.writeEvent(\"content_block_delta\", {\n type: \"content_block_delta\",\n index: this.currentBlockIndex,\n delta: { type: \"thinking_delta\", thinking: pendingThinking }\n });\n pendingThinking = \"\";\n }\n };\n\n for (const char of delta.content) {\n if (this.state === 'NORMAL') {\n if (char === '<') {\n this.state = 'POTENTIAL_START';\n this.buffer = char;\n } else {\n pendingText += char;\n }\n } else if (this.state === 'POTENTIAL_START') {\n this.buffer += char;\n const targets = [\"<thinking>\", \"<think>\"];\n const matchedTarget = targets.find(t => t === this.buffer);\n const partialMatch = targets.some(t => t.startsWith(this.buffer));\n \n if (matchedTarget) {\n flushText(); // Flush any accumulated text before switching to thinking\n this.state = 'IN_THINKING';\n this._thinkTag = matchedTarget;\n this.buffer = '';\n this.startBlock(\"thinking\");\n } else if (!partialMatch || this.buffer.length > 20) {\n // False alarm: not a thinking tag. Add the buffered characters to text.\n pendingText += this.buffer;\n this.state = 'NORMAL';\n this.buffer = '';\n }\n } else if (this.state === 'IN_THINKING') {\n if (char === '<') {\n this.state = 'POTENTIAL_END';\n this.buffer = char;\n } else {\n pendingThinking += char;\n }\n } else if (this.state === 'POTENTIAL_END') {\n this.buffer += char;\n const closeTag = this._thinkTag === \"<think>\" ? \"</think>\" : \"</thinking>\";\n if (this.buffer === closeTag) {\n flushThinking(); // Flush any accumulated thinking text before ending\n this.state = 'NORMAL';\n this.buffer = '';\n this.startBlock(\"text\");\n } else if (!closeTag.startsWith(this.buffer) || this.buffer.length > 20) {\n // False alarm: not a closing tag. Add the buffered characters to thinking text.\n pendingThinking += this.buffer;\n this.state = 'IN_THINKING';\n this.buffer = '';\n }\n }\n }\n \n // Flush any remaining accumulated text at the end of the chunk\n flushText();\n flushThinking();\n }\n \n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id) {\n let rawName = tc.function.name || \"\";\n let safeName = rawName.split(\"<\")[0].replace(/[^a-zA-Z0-9_-]/g, \"\");\n this.startBlock(\"tool_use\", { id: tc.id, name: safeName, input: {} });\n this.toolIndexMap[tc.index] = this.currentBlockIndex;\n }\n if (tc.function && tc.function.arguments) {\n const targetIndex = this.toolIndexMap[tc.index] !== undefined ? this.toolIndexMap[tc.index] : this.currentBlockIndex;\n this.writeEvent(\"content_block_delta\", {\n type: \"content_block_delta\",\n index: targetIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: tc.function.arguments\n }\n });\n }\n }\n }\n }\n\n finish(streamUsage: any, finishReason: any) {\n this.startMessage(); \n \n // Flush any lingering buffer from the state machine if stream ends abruptly\n if (this.buffer && this.buffer.length > 0) {\n if (this.state === 'POTENTIAL_START') {\n if (this.currentBlockType !== \"text\") this.startBlock(\"text\");\n this.writeEvent(\"content_block_delta\", {\n type: \"content_block_delta\",\n index: this.currentBlockIndex,\n delta: { type: \"text_delta\", text: this.buffer }\n });\n } else if (this.state === 'POTENTIAL_END') {\n if (this.currentBlockType !== \"thinking\") this.startBlock(\"thinking\");\n this.writeEvent(\"content_block_delta\", {\n type: \"content_block_delta\",\n index: this.currentBlockIndex,\n delta: { type: \"thinking_delta\", thinking: this.buffer }\n });\n }\n this.buffer = '';\n }\n\n this.stopCurrentBlock();\n \n const stop_reason = finishReason === \"stop\" || finishReason === null ? \"end_turn\" \n : (finishReason === \"tool_calls\" || finishReason === \"function_call\") ? \"tool_use\"\n : finishReason === \"length\" ? \"max_tokens\"\n : finishReason === \"content_filter\" ? \"end_turn\"\n : finishReason || \"end_turn\";\n \n const inputTokens = streamUsage?.prompt_tokens || 0;\n const outputTokens = streamUsage?.completion_tokens || 0;\n \n this.writeEvent(\"message_delta\", {\n type: \"message_delta\",\n delta: { stop_reason, stop_sequence: null },\n usage: { input_tokens: inputTokens, output_tokens: outputTokens }\n });\n \n this.writeEvent(\"message_stop\", { type: \"message_stop\" });\n }\n}\n\nexport class NvidiaStreamTranslator extends OpenRouterStreamTranslator {}\n","export function translateOpenAIToAnthropic(openaiRes: any, requestedModel: string): any {\n const choice = openaiRes.choices && openaiRes.choices[0];\n const message = choice && choice.message;\n \n let stop_reason = choice?.finish_reason || \"end_turn\";\n if (stop_reason === \"stop\") stop_reason = \"end_turn\";\n if (stop_reason === \"tool_calls\" || stop_reason === \"function_call\") stop_reason = \"tool_use\";\n if (stop_reason === \"length\") stop_reason = \"max_tokens\";\n if (stop_reason === \"content_filter\") stop_reason = \"end_turn\";\n \n const anthropicRes: any = {\n id: \"msg_\" + Math.random().toString(36).slice(2, 11),\n type: \"message\",\n role: \"assistant\",\n content: [],\n model: requestedModel,\n stop_reason,\n stop_sequence: null,\n usage: {\n input_tokens: openaiRes.usage?.prompt_tokens || 0,\n output_tokens: openaiRes.usage?.completion_tokens || 0,\n }\n };\n\n if (message) {\n if (message.content) {\n anthropicRes.content.push({\n type: \"text\",\n text: message.content,\n });\n }\n if (message.tool_calls) {\n for (const tc of message.tool_calls) {\n let parsedInput;\n if (typeof tc.function.arguments === 'string') {\n try {\n parsedInput = JSON.parse(tc.function.arguments);\n } catch (e) {\n parsedInput = { _error: \"Malformed JSON from model\", _raw: tc.function.arguments };\n }\n } else {\n parsedInput = tc.function.arguments;\n }\n anthropicRes.content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: parsedInput,\n });\n }\n }\n }\n\n return anthropicRes;\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport http from \"http\";\nimport os from \"os\";\n\nimport { MultiProviderRouter } from \"../core/multiProviderRouter\";\nimport { fetchWithFailover } from \"../core/fetcher\";\nimport { UsageTracker } from \"../core/usageTracker\";\nimport {\n translateAnthropicToOpenAI,\n translateOpenAIToAnthropic,\n OpenRouterStreamTranslator,\n NvidiaStreamTranslator\n} from \"./translators\";\nimport { maskKey } from \"../utils/helpers\";\n\nexport interface ProxyServerOptions {\n port?: number;\n configPath?: string;\n}\n\nconst DEFAULT_PORT = 3002;\nconst MODEL_NAME = process.env['ANTHROPIC_MODEL'] || \"nvidia/nemotron-3-ultra-550b-a55b\";\nlet serverInstance: http.Server | null = null;\nlet router: MultiProviderRouter;\nlet config: any;\nlet globalUsageTracker = new UsageTracker();\n\nfunction parseKeyList(raw: string | undefined): string[] {\n return String(raw || \"\")\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction loadConfig(configPath: string) {\n try {\n if (fs.existsSync(configPath)) {\n return JSON.parse(fs.readFileSync(configPath, 'utf8'));\n }\n } catch(e) {\n console.error(\"Failed to read config:\", e);\n }\n return { defaultProvider: null, defaultModel: \"\", keys: { openrouter: [], nvidia: [] } };\n}\n\nfunction createRouterInstance(config: any) {\n const keysObj = config?.keys || {};\n let nvidiaKeys = Array.isArray(keysObj.nvidia) ? keysObj.nvidia : [];\n let openRouterKeys = Array.isArray(keysObj.openrouter) ? keysObj.openrouter : [];\n let mistralKeys = Array.isArray(keysObj.mistral) ? keysObj.mistral : [];\n let geminiKeys = Array.isArray(keysObj.gemini) ? keysObj.gemini : [];\n let groqKeys = Array.isArray(keysObj.groq) ? keysObj.groq : [];\n\n if (nvidiaKeys.length === 0) {\n nvidiaKeys = parseKeyList(process.env['NVIDIA_KEYS']);\n }\n if (openRouterKeys.length === 0) {\n openRouterKeys = parseKeyList(process.env['OPENROUTER_KEYS']);\n }\n if (mistralKeys.length === 0) {\n mistralKeys = parseKeyList(process.env['MISTRAL_KEYS']);\n }\n if (geminiKeys.length === 0) {\n geminiKeys = parseKeyList(process.env['GEMINI_KEYS']);\n }\n if (groqKeys.length === 0) {\n groqKeys = parseKeyList(process.env['GROQ_KEYS']);\n }\n\n return new MultiProviderRouter([\n {\n provider: 'openrouter',\n keys: openRouterKeys,\n models: config.openrouterModels || ['minimax/minimax-m3:free', 'minimax/minimax-m2.7:free', 'z-ai/glm-5.2:free'],\n },\n {\n provider: 'nvidia',\n keys: nvidiaKeys,\n },\n {\n provider: 'mistral',\n keys: mistralKeys,\n },\n {\n provider: 'gemini',\n keys: geminiKeys,\n },\n {\n provider: 'groq',\n keys: groqKeys,\n models: config.groqModels || ['qwen/qwen3.8-27b'],\n }\n ], {\n strategy: config.strategy || 'smart',\n trackLatency: config.trackLatency !== undefined ? config.trackLatency : true,\n failureThreshold: config.failureThreshold || 2,\n cooldownMs: config.cooldownMs || 60000,\n windowMs: config.windowMs || 60000,\n onDebug: (event: any) => {\n if (event.type === \"all_exhausted\" || event.type === \"circuit_opened\" || event.type === \"key_recovered\") {\n console.log(`[keymux] ${event.type}`, event.details || {});\n }\n }\n });\n}\n\nfunction logUsage(provider: string, model: string, key: string | undefined, attempts: number, failoverReason: string, anthropicReq: any) {\n if (process.env['KEYMUX_ENABLE_LOGGING'] !== 'true') return;\n\n try {\n const maskedKeyStr = key ? maskKey(key) : 'none';\n let statusStr = attempts > 1 ? `[FAILOVER #${attempts} | Prev Reason: ${failoverReason}]` : `[PRIMARY TRY #1]`;\n\n // Privacy: Do not log the user's prompt text\n const logLine = `[${new Date().toISOString()}] ${statusStr.padEnd(50)} | Provider: ${provider.padEnd(10)} | Key: ${maskedKeyStr.padEnd(15)} | Model: ${model.padEnd(30)} | Query: <redacted for privacy>\\n`;\n\n const logDir = path.join(os.homedir(), '.claude');\n if (!fs.existsSync(logDir)) fs.mkdirSync(logDir, { recursive: true });\n\n const logPath = path.join(logDir, 'queries.log');\n if (fs.existsSync(logPath) && fs.statSync(logPath).size > 5 * 1024 * 1024) {\n fs.renameSync(logPath, logPath.replace('queries.log', 'queries.old.log'));\n }\n fs.appendFileSync(logPath, logLine);\n } catch(e) {\n console.error(\"Failed to log usage\", e);\n }\n}\n\nfunction sendJson(res: http.ServerResponse, statusCode: number, payload: any) {\n res.writeHead(statusCode, {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET, POST, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"*\",\n });\n res.end(JSON.stringify(payload));\n}\n\nexport function startProxyServer(options?: ProxyServerOptions): http.Server {\n const port = options?.port || Number(process.env['NVIDIA_PROXY_PORT']) || DEFAULT_PORT;\n const configPath = options?.configPath || path.join(os.homedir(), '.keymux', 'config.json');\n\n config = loadConfig(configPath);\n router = createRouterInstance(config);\n console.log(\"[keymux] Multi-Provider proxy initialized\");\n\n (global as any).isConfigReloading = false;\n\n serverInstance = http.createServer(async (req, res) => {\n if ((global as any).isConfigReloading) {\n await new Promise(r => setTimeout(r, 100));\n }\n\n if (!req.url?.startsWith(\"/v1/keymux/\")) {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"*\");\n }\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (req.url === \"/api/hello\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\", \"Access-Control-Allow-Origin\": \"*\" });\n res.end(JSON.stringify({ message: \"hello\" }));\n return;\n }\n\n // Health / Reachability check\n if (req.method === \"GET\" && (req.url === \"/\" || req.url === \"/api\" || req.url === \"/api/\")) {\n return sendJson(res, 200, { status: \"ok\", service: \"keymux-proxy\" });\n }\n\n // Admin routes\n if (req.url?.startsWith(\"/v1/keymux/\")) {\n const adminToken = process.env['KEYMUX_ADMIN_TOKEN'];\n if (adminToken) {\n const authHeader = req.headers.authorization || '';\n if (authHeader !== `Bearer ${adminToken}`) {\n return sendJson(res, 401, { error: \"Unauthorized\" });\n }\n }\n\n if (req.method === \"POST\" && req.url === \"/v1/keymux/reload\") {\n try {\n const newConfig = loadConfig(configPath);\n const newRouter = createRouterInstance(newConfig);\n\n (global as any).isConfigReloading = true;\n config = newConfig;\n router = newRouter;\n console.log(\"[keymux] Proxy settings reloaded\");\n return sendJson(res, 200, { status: \"reloaded\" });\n } catch (err: any) {\n console.error(\"[keymux] Proxy reload failed:\", err);\n return sendJson(res, 500, { error: \"reload failed\", details: err.message });\n } finally {\n (global as any).isConfigReloading = false;\n }\n }\n\n if (req.method === \"GET\" && req.url === \"/v1/keymux/lastRoute\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n const lastRoute = typeof router.getLastRoute === 'function' ? router.getLastRoute() : null;\n if (lastRoute && (global as any).lastActualTargetModel) {\n lastRoute.model = (global as any).lastActualTargetModel;\n }\n res.end(JSON.stringify(lastRoute || {}));\n return;\n }\n\n if (req.method === \"GET\" && req.url === \"/v1/keymux/activeModel\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n mode: config.strictMode ? 'STRICT' : 'AUTO',\n model: config.defaultModel || 'auto',\n provider: config.defaultProvider || 'auto',\n }));\n return;\n }\n\n if (req.method === \"GET\" && req.url === \"/v1/keymux/stats\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(router.getStats()));\n return;\n }\n\n if (req.method === \"GET\" && req.url === \"/v1/keymux/usage\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n session: globalUsageTracker.getSessionUsage(),\n today: globalUsageTracker.getTodayUsage()\n }));\n return;\n }\n }\n\n // Model discovery for Claude Desktop / Gateway\n if (req.method === \"GET\" && (req.url?.includes(\"/v1/models\") || req.url?.includes(\"/models\"))) {\n return sendJson(res, 200, {\n data: [\n {\n id: \"claude-3-5-sonnet-minimax/minimax-m3\",\n type: \"model\",\n created: 1715000000,\n display_name: \"MiniMax M3\",\n anthropic_family_tier: \"sonnet\"\n },\n {\n id: \"claude-3-5-sonnet-minimax/minimax-m2.7\",\n type: \"model\",\n created: 1715000000,\n display_name: \"MiniMax M2.7\",\n anthropic_family_tier: \"sonnet\"\n },\n {\n id: \"claude-3-5-sonnet-nvidia/nemotron-3-super-120b-a12b\",\n type: \"model\",\n created: 1715000000,\n display_name: \"Nemotron Super\",\n anthropic_family_tier: \"sonnet\"\n },\n {\n id: \"claude-3-5-sonnet-nvidia/nemotron-3-ultra-550b-a55b\",\n type: \"model\",\n created: 1715000000,\n display_name: \"Nemotron Ultra\",\n anthropic_family_tier: \"sonnet\"\n },\n {\n id: \"claude-3-5-sonnet-codestral-2508\",\n type: \"model\",\n created: 1715000000,\n display_name: \"Codestral\",\n anthropic_family_tier: \"sonnet\"\n },\n {\n id: \"claude-3-5-sonnet-gemini-1.5-flash\",\n type: \"model\",\n created: 1715000000,\n display_name: \"Gemini 1.5 Flash\",\n anthropic_family_tier: \"sonnet\"\n }\n ],\n });\n }\n\n // Token count probe for Claude Desktop\n if (req.method === \"POST\" && req.url?.includes(\"/count_tokens\")) {\n return sendJson(res, 200, { input_tokens: 10 });\n }\n\n if (req.method === \"POST\" && req.url?.includes(\"/v1/messages\")) {\n let bodyStr = \"\";\n const MAX_BODY_SIZE = 25 * 1024 * 1024; // 25MB limit for image attachments\n req.on(\"data\", (chunk) => {\n bodyStr += chunk;\n if (bodyStr.length > MAX_BODY_SIZE) {\n req.destroy();\n res.writeHead(413, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Payload Too Large\" }));\n }\n });\n\n req.on(\"end\", async () => {\n try {\n const anthropicReq = JSON.parse(bodyStr);\n\n // Instant response for Claude Desktop health probe test (which sends \".\")\n const isProbe =\n anthropicReq.messages &&\n anthropicReq.messages.length === 1 &&\n (anthropicReq.messages[0].content === \".\" ||\n anthropicReq.messages[0].content === \"ping\" ||\n anthropicReq.max_tokens <= 1);\n\n if (isProbe) {\n return sendJson(res, 200, {\n id: \"msg_probe_\" + Math.random().toString(36).slice(2, 9),\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"OK\" }],\n model: anthropicReq.model || MODEL_NAME,\n stop_reason: \"end_turn\",\n stop_sequence: null,\n usage: { input_tokens: 1, output_tokens: 1 },\n });\n }\n\n const openaiReq = translateAnthropicToOpenAI(anthropicReq);\n openaiReq.model = anthropicReq.model || MODEL_NAME;\n if (openaiReq.stream) {\n openaiReq.stream_options = { include_usage: true };\n }\n\n const REQUEST_TIMEOUT_MS = Number(process.env['NVIDIA_PROXY_TIMEOUT']) || 60000;\n let attempts = 0;\n let lastErrorReason = \"\";\n let finalEp: any = null;\n let startedAt = 0;\n\n // Detect Vision / Computer Use requirements\n const reqString = JSON.stringify(openaiReq);\n const needsVision = reqString.includes('\"type\":\"image_url\"');\n const needsComputerUse = reqString.includes('\"name\":\"computer_20241022\"');\n const isComplexRequest = needsVision || needsComputerUse;\n\n let preferProviders = config.defaultProvider ? [config.defaultProvider] : undefined;\n let excludeProviders = (config.strictMode && config.defaultProvider) ? router.getProviderNames().filter((p: string) => p !== config.defaultProvider) : [];\n\n if (isComplexRequest && !config.strictMode) {\n console.log(`[PROXY] Detected ${needsVision ? 'Vision' : 'Computer Use'} request. Activating Smart Router...`);\n preferProviders = ['openrouter', 'gemini'];\n \n // Blind/incompatible providers are skipped immediately\n const blindProviders = ['groq', 'mistral', 'nvidia'];\n for (const p of blindProviders) {\n if (!excludeProviders.includes(p)) excludeProviders.push(p);\n }\n }\n\n try {\n const fetchRes = await fetchWithFailover(\n (ep) => {\n const url = new URL(ep.baseURL + \"/chat/completions\");\n return url.toString();\n },\n (ep) => {\n attempts++;\n startedAt = Date.now();\n console.log(`[PROXY] Attempt ${attempts}: Routing to ${ep.provider} (${ep.model})`);\n logUsage(ep.provider, ep.model, ep.key, attempts, lastErrorReason, anthropicReq);\n\n let targetModel = config.defaultModel || anthropicReq.model || ep.model || MODEL_NAME;\n\n if (targetModel.startsWith('claude-3-5-sonnet-') && targetModel !== 'claude-3-5-sonnet-20240620') {\n targetModel = targetModel.replace('claude-3-5-sonnet-', '');\n }\n\n // AUTO MODE: Smart Provider-Model Translation\n if (!config.strictMode) {\n if (isComplexRequest && ep.provider === 'openrouter') {\n targetModel = 'inclusionai/ling-3.0-flash-vl:free';\n } else if (isComplexRequest && ep.provider === 'gemini') {\n targetModel = 'gemini-1.5-flash';\n } else if (ep.provider === 'nvidia' && !targetModel.startsWith('nvidia/') && !targetModel.startsWith('deepseek')) {\n targetModel = 'nvidia/nemotron-3-super-120b-a12b';\n } else if (ep.provider === 'mistral' && !targetModel.startsWith('mistral') && !targetModel.startsWith('codestral') && !targetModel.startsWith('devstral')) {\n targetModel = 'codestral-2508';\n } else if (ep.provider === 'gemini' && !targetModel.startsWith('gemini')) {\n targetModel = 'gemini-3.5-flash-lite';\n } else if (ep.provider === 'groq' && !targetModel.startsWith('qwen/') && !targetModel.startsWith('groq/') && !targetModel.startsWith('openai/')) {\n targetModel = 'qwen/qwen3.8-27b';\n } else if (ep.provider === 'openrouter') {\n if (targetModel.startsWith('nvidia/')) {\n targetModel = 'qwen/qwen3.8-27b';\n } else if (targetModel === 'codestral-2508') {\n targetModel = 'mistralai/codestral-2501';\n } else if (!targetModel.includes('/')) {\n // If the model name doesn't have a slash, it's likely a native provider model name. Let's use a safe fallback.\n targetModel = 'qwen/qwen3.8-27b';\n }\n }\n }\n\n openaiReq.model = targetModel;\n (global as any).lastActualTargetModel = targetModel;\n\n // Only enable reasoning for providers/models that support it\n if (ep.provider === 'openrouter' || targetModel.includes('deepseek')) {\n openaiReq.include_reasoning = true;\n } else {\n delete openaiReq.include_reasoning;\n }\n\n const postData = JSON.stringify(openaiReq);\n finalEp = ep;\n return {\n method: \"POST\",\n headers: {\n \"Authorization\": `Bearer ${ep.key}`,\n \"Content-Type\": \"application/json\"\n },\n body: postData,\n signal: AbortSignal.timeout ? AbortSignal.timeout(REQUEST_TIMEOUT_MS) : undefined\n };\n },\n {\n router,\n maxRetries: 10,\n preferProviders: preferProviders,\n excludeProviders: excludeProviders\n }\n );\n\n const ep = finalEp;\n\n if (!fetchRes.ok) {\n const errorData = await fetchRes.text();\n if (globalUsageTracker) {\n globalUsageTracker.recordRequest(ep.provider, 0, 0, 0);\n }\n lastErrorReason = `${ep.provider} HTTP ${fetchRes.status}`;\n console.error(`[PROXY] Provider ${ep.provider} failed with ${fetchRes.status}: ${errorData}`);\n\n let customMessage = `[Keymux Gateway] Provider error (${fetchRes.status}): ${errorData.substring(0, 150)}`;\n const lowerErr = errorData.toLowerCase();\n\n if (lowerErr.includes(\"tokens limit\") || lowerErr.includes(\"context\") || lowerErr.includes(\"too large\")) {\n customMessage = `[Keymux Gateway] Context window exceeded! Your prompt is too large for the current model. Please clear some history or switch to a larger model via 'keymux -d'. (Details: ${errorData.substring(0, 150)})`;\n } else if (fetchRes.status === 402 || fetchRes.status === 429) {\n customMessage = `[Keymux Gateway] All available APIs for this model are currently exhausted (rate-limited or out of credits). Please try again in a few minutes, or change your Provider/Model via 'keymux -d'.`;\n }\n\n res.writeHead(fetchRes.status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n type: \"error\",\n error: {\n type: \"api_error\",\n message: customMessage\n }\n }));\n return;\n }\n\n if (!openaiReq.stream) {\n const responseData = await fetchRes.text();\n try {\n const openaiRes = JSON.parse(responseData);\n const inputTokens = openaiRes.usage?.prompt_tokens || 0;\n const outputTokens = openaiRes.usage?.completion_tokens || 0;\n if (globalUsageTracker && openaiRes.usage) globalUsageTracker.recordRequest(ep.provider, inputTokens, outputTokens, 0);\n\n const anthropicRes = translateOpenAIToAnthropic(openaiRes, anthropicReq.model || MODEL_NAME);\n\n router.reportSuccess(ep.endpointId, Date.now() - startedAt);\n sendJson(res, 200, anthropicRes);\n } catch (e: any) {\n router.reportFailure(ep.endpointId, false);\n sendJson(res, 500, { error: e.message });\n }\n return;\n }\n\n // Handle Streaming Response\n res.writeHead(fetchRes.status, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n const TranslatorClass = ep.provider === 'nvidia' ? NvidiaStreamTranslator : OpenRouterStreamTranslator;\n const translator = new TranslatorClass(res as any, anthropicReq.model || MODEL_NAME);\n\n let buffer = \"\";\n let streamUsage: any = null;\n let generatedText = \"\";\n\n if (!fetchRes.body) {\n res.end();\n return;\n }\n\n const reader = (fetchRes.body as any).getReader();\n const decoder = new TextDecoder();\n\n let ttftRecorded = false;\n let ttftMs = Date.now() - startedAt;\n\n let streamFailed = false;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (!ttftRecorded) {\n ttftRecorded = true;\n ttftMs = Date.now() - startedAt;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // keep last incomplete line in buffer\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n if (trimmed === \"data: [DONE]\") continue;\n\n if (trimmed.startsWith(\"data: \")) {\n const jsonStr = trimmed.slice(6);\n try {\n const chunkObj = JSON.parse(jsonStr);\n if (chunkObj.usage) streamUsage = chunkObj.usage;\n if (chunkObj.choices?.[0]?.delta?.content) {\n generatedText += chunkObj.choices[0].delta.content;\n }\n translator.handleChunk(chunkObj);\n } catch (e) {\n // ignore parse error\n }\n }\n }\n }\n } catch(e) {\n console.error(\"[PROXY] Stream read error:\", e);\n router.reportFailure(ep.endpointId, false);\n streamFailed = true;\n }\n\n if (!streamFailed) {\n router.reportSuccess(ep.endpointId, ttftMs);\n\n let inputTokens = streamUsage?.prompt_tokens || 0;\n let outputTokens = streamUsage?.completion_tokens || 0;\n\n if (inputTokens === 0 && outputTokens === 0) {\n inputTokens = Math.ceil(JSON.stringify(anthropicReq.messages || []).length / 4);\n outputTokens = Math.ceil(generatedText.length / 4);\n }\n\n if (globalUsageTracker) {\n globalUsageTracker.recordRequest(ep.provider, inputTokens, outputTokens, 0);\n }\n translator.finish(streamUsage, streamUsage ? \"stop\" : null);\n }\n res.end();\n\n } catch (error: any) {\n console.error(\"[PROXY] fetchWithFailover Error:\", error);\n\n let customMessage = \"[Keymux Gateway] API Error occurred.\";\n \n const targetProvider = config.defaultProvider;\n const hasKeysForTarget = targetProvider && config.keys && (config.keys as any)[targetProvider] && (config.keys as any)[targetProvider].length > 0;\n\n if (config.strictMode && !hasKeysForTarget) {\n customMessage = `[Keymux Gateway] 🚨 No API keys found for '${targetProvider}'. Please open another terminal, run 'keymux -d', go to Settings and add your API key.`;\n } else if (error.message?.includes(\"timeout\") || error.name === 'AbortError') {\n customMessage = \"[Keymux Gateway] The model provider is not responding (Timeout > 60s). The server might be down or overloaded. Please try changing your Default Model or Provider via 'keymux -d'.\";\n } else if (error.message?.includes(\"exhausted\") || error.name === 'RateLimitError') {\n customMessage = \"[Keymux Gateway] All available APIs for this model are currently exhausted (rate-limited or down). Please try again in a few minutes, or change your Provider/Model via 'keymux -d'.\";\n } else {\n customMessage = `[Keymux Gateway] ${error.message}`;\n }\n\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n type: \"error\",\n error: {\n type: \"api_error\",\n message: customMessage\n }\n }));\n }\n\n } catch (err) {\n sendJson(res, 400, { error: \"Invalid JSON\" });\n }\n });\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not Found\");\n }\n });\n\n serverInstance.listen(port, '127.0.0.1', () => {\n console.log(`[keymux] HTTP Proxy Server listening on 127.0.0.1:${port}`);\n });\n\n return serverInstance;\n}\n\nexport function stopProxyServer() {\n if (serverInstance) {\n serverInstance.close();\n serverInstance = null;\n console.log(\"[keymux] HTTP Proxy Server stopped\");\n }\n}\n","/**\n * keymux - Smart API Key Multiplexer for LLM Providers\n * \n * This library smartly manages your API keys providing:\n * - Weighted least-utilization selection (fair distribution)\n * - Circuit breaker pattern (fault tolerance)\n * - Sliding window RPM tracking (rate limiting)\n * - Automatic failover support (retry mechanism)\n * - OpenAI SDK / LangChain / Vercel AI SDK compatible\n * \n * @packageDocumentation\n */\n\n// Types (re-export)\n// Re-exporting all types so consumers can directly import them\nexport type {\n KeyConfig,\n KeyRouterConfig,\n KeySelectionResult,\n KeyStats,\n RouterStats,\n SelectionOptions,\n ProviderPreset,\n DebugEvent,\n KeyState,\n ProviderPoolEntry,\n EndpointResult,\n EndpointOptions,\n MultiProviderConfig\n} from './types';\n\nexport { CircuitState, KeyRouterError, RateLimitError } from './types';\nimport { KeyRouterError as _KeyRouterError } from './types';\n\nexport type { SelectionStrategy } from './strategies/selectionStrategies';\n\n// Provider presets export - For NVIDIA, Mistral, OpenAI, etc.\nimport { PROVIDER_PRESETS } from './types';\nexport { PROVIDER_PRESETS };\n\n// Core classes export\nimport { KeyRouter } from './core/keyRouter';\nexport { KeyRouter };\n\n// Tracking classes export\nimport { KeyTracker } from './tracking/keyTracker';\nexport { KeyTracker };\n\n// Strategies export - all selection strategies are available from here\nimport {\n WeightedLeastUtilizationStrategy,\n LeastRequestsStrategy,\n SmartRoutingStrategy,\n LeastLatencyStrategy,\n PreferredKeysStrategy,\n RandomStrategy,\n createStrategy,\n defaultStrategy\n} from './strategies/selectionStrategies';\nexport {\n WeightedLeastUtilizationStrategy,\n LeastRequestsStrategy,\n SmartRoutingStrategy,\n LeastLatencyStrategy,\n PreferredKeysStrategy,\n RandomStrategy,\n createStrategy,\n defaultStrategy\n};\n\n// Utilities export - useful helper functions\nimport {\n isRateLimitError,\n isServerError,\n isRetryableError,\n calculateBackoff,\n maskKey,\n parseKeys,\n createKeyGetter,\n createFailoverKeyGetter,\n sleep,\n formatStats,\n createStatsLogger\n} from './utils/helpers';\nexport {\n isRateLimitError,\n isServerError,\n isRetryableError,\n calculateBackoff,\n maskKey,\n parseKeys,\n createKeyGetter,\n createFailoverKeyGetter,\n sleep,\n formatStats,\n createStatsLogger\n};\n\n/**\n * Create a KeyRouter for NVIDIA keys - the most common use case\n * NVIDIA preset settings will be automatically applied\n * \n * @example\n * ```typescript\n * import { createNvidiaRouter } from 'keymux';\n *\n * const router = createNvidiaRouter([\n * 'nvapi-key-1',\n * 'nvapi-key-2',\n * 'nvapi-key-3'\n * ]);\n *\n * // Use with OpenAI SDK\n * import OpenAI from 'openai';\n * const client = new OpenAI({\n * apiKey: async () => await router.getKey(),\n * baseURL: 'https://integrate.api.nvidia.com/v1'\n * });\n * ```\n */\nexport function createNvidiaRouter(\n keys: string[],\n options?: Partial<import('./types').KeyRouterConfig>\n): KeyRouter {\n return KeyRouter.forNvidia(keys, options);\n}\n\n/**\n * Create a KeyRouter from a provider preset\n * Examples: mistral, openai, nvidia, etc.\n * \n * @example\n * ```typescript\n * import { createRouter } from 'keymux';\n *\n * const router = createRouter('mistral', [\n * 'mistral-key-1',\n * 'mistral-key-2'\n * ]);\n * ```\n */\nexport function createRouter(\n provider: keyof typeof import('./types').PROVIDER_PRESETS,\n keys: string[],\n options?: Partial<import('./types').KeyRouterConfig>\n): KeyRouter {\n return KeyRouter.fromProvider(provider, keys, options);\n}\n\n/**\n * Create a KeyRouter from an environment variable\n * Read keys from .env file or system env - comma separated\n * \n * @example\n * ```typescript\n * import { createRouterFromEnv } from 'keymux';\n *\n * // Set NVIDIA_KEYS=\"key1,key2,key3\" in .env\n * const router = createRouterFromEnv('NVIDIA_KEYS');\n * ```\n */\nexport function createRouterFromEnv(\n envVar: string,\n options?: Partial<import('./types').KeyRouterConfig>\n): KeyRouter {\n return KeyRouter.fromEnv(envVar, options);\n}\n\n// ====================================================================\n// Multi-Provider exports\n// ====================================================================\n\nimport { MultiProviderRouter } from './core/multiProviderRouter';\nexport { MultiProviderRouter };\nexport type { ProviderStats } from './core/multiProviderRouter';\n\n/**\n * Create a MultiProviderRouter from provider configs\n * Routes requests across multiple AI providers with automatic failover\n *\n * @example\n * ```typescript\n * import { createMultiProviderRouter } from 'keymux';\n *\n * const router = createMultiProviderRouter([\n * { provider: 'gemini', keys: ['AIza-key1'] },\n * { provider: 'nvidia', keys: ['nvapi-key1', 'nvapi-key2'] },\n * { provider: 'openrouter', keys: ['sk-or-key1'] }\n * ]);\n *\n * const ep = await router.getEndpoint();\n * // ep = { key, baseURL, model, provider, endpointId, utilization }\n * ```\n */\nexport function createMultiProviderRouter(\n providers: import('./types').ProviderPoolEntry[],\n config?: import('./types').MultiProviderConfig\n): MultiProviderRouter {\n return new MultiProviderRouter(providers, config);\n}\n\n/**\n * Create a MultiProviderRouter from environment variables\n * Each provider's keys are read from a comma-separated env var\n *\n * @example\n * ```typescript\n * import { createMultiProviderRouterFromEnv } from 'keymux';\n *\n * // process.env.NVIDIA_KEYS = \"nvapi-key1,nvapi-key2\"\n * // process.env.GEMINI_KEYS = \"AIza-key1\"\n * const router = createMultiProviderRouterFromEnv({\n * nvidia: 'NVIDIA_KEYS',\n * gemini: 'GEMINI_KEYS',\n * });\n * ```\n */\nexport function createMultiProviderRouterFromEnv(\n envMap: Record<string, string>,\n overrides?: Record<string, Partial<import('./types').ProviderPoolEntry>>,\n config?: import('./types').MultiProviderConfig\n): MultiProviderRouter {\n const providers: import('./types').ProviderPoolEntry[] = [];\n\n for (const [provider, envVar] of Object.entries(envMap)) {\n const keys = process.env[envVar]\n ?.split(',')\n .map((k) => k.trim())\n .filter(Boolean) ?? [];\n\n if (keys.length === 0) {\n continue; // Skip providers with no keys in env\n }\n\n providers.push({\n provider,\n keys,\n ...overrides?.[provider],\n });\n }\n\n if (providers.length === 0) {\n throw new _KeyRouterError(\n 'No provider keys found in environment variables.',\n 'NO_KEYS_CONFIGURED'\n );\n }\n\n return new MultiProviderRouter(providers, config);\n}\n\nimport { fetchWithFailover } from './core/fetcher';\nexport { fetchWithFailover };\n\nexport * from './core/usageTracker';\n\n// Proxy server exports\nexport { startProxyServer, stopProxyServer } from './proxy/server';\nexport { translateAnthropicToOpenAI } from './proxy/translators/requestTranslator';\nexport { translateOpenAIToAnthropic } from './proxy/translators/responseTranslator';\nexport { OpenRouterStreamTranslator, NvidiaStreamTranslator } from './proxy/translators/streamTranslator';\n"]}