@lov3kaizen/agentsea-gateway 1.0.0 → 1.1.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.
- package/README.md +6 -6
- package/dist/index.js +74 -63
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +74 -63
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/types.ts","../src/providers/ProviderRegistry.ts","../src/providers/ProviderHealth.ts","../src/routing/Router.ts","../src/routing/strategies/RoundRobin.ts","../src/routing/strategies/Failover.ts","../src/utils/tokenizer.ts","../src/routing/strategies/CostOptimized.ts","../src/routing/strategies/LatencyOptimized.ts","../src/utils/pricing.ts","../src/utils/hashing.ts","../src/providers/Provider.ts","../src/providers/registry/OpenAIProvider.ts","../src/providers/registry/AnthropicProvider.ts","../src/providers/registry/GoogleProvider.ts","../src/core/Gateway.ts","../src/server/HTTPServer.ts","../src/telemetry/Metrics.ts"],"names":["cheapest","fastest","model","selected","EventEmitter"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Core types for the AgentSea Gateway\n */\n\n// ============================================================================\n// Message Types (OpenAI-compatible)\n// ============================================================================\n\nexport interface ChatMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string | ContentPart[] | null;\n name?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n}\n\nexport interface ContentPart {\n type: 'text' | 'image_url';\n text?: string;\n image_url?: {\n url: string;\n detail?: 'auto' | 'low' | 'high';\n };\n}\n\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface Tool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n };\n}\n\n// ============================================================================\n// Request Types\n// ============================================================================\n\nexport interface ChatCompletionRequest {\n model: string;\n messages: ChatMessage[];\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n stop?: string | string[];\n stream?: boolean;\n tools?: Tool[];\n tool_choice?:\n | 'none'\n | 'auto'\n | 'required'\n | { type: 'function'; function: { name: string } };\n response_format?: { type: 'text' | 'json_object' };\n seed?: number;\n user?: string;\n // Gateway-specific metadata\n _gateway?: GatewayRequestMetadata;\n}\n\nexport interface GatewayRequestMetadata {\n tenantId?: string;\n requestId?: string;\n routingHint?: string; // Common values: 'cheapest', 'fastest', 'best'\n preferredProvider?: string;\n excludeProviders?: string[];\n maxCost?: number;\n maxLatency?: number;\n cachePolicy?: 'default' | 'no-cache' | 'force-cache';\n tags?: Record<string, string>;\n}\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\nexport interface ChatCompletionResponse {\n id: string;\n object: 'chat.completion';\n created: number;\n model: string;\n choices: ChatCompletionChoice[];\n usage: UsageInfo;\n system_fingerprint?: string;\n // Gateway-specific metadata\n _gateway?: GatewayResponseMetadata;\n}\n\nexport interface ChatCompletionChoice {\n index: number;\n message: ChatMessage;\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;\n logprobs?: unknown;\n}\n\nexport interface UsageInfo {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\nexport interface GatewayResponseMetadata {\n provider: string;\n originalModel: string;\n latencyMs: number;\n cost: number;\n cached: boolean;\n cacheKey?: string;\n retries: number;\n routingDecision?: RoutingDecision;\n}\n\n// ============================================================================\n// Streaming Types\n// ============================================================================\n\nexport interface ChatCompletionChunk {\n id: string;\n object: 'chat.completion.chunk';\n created: number;\n model: string;\n choices: ChatCompletionChunkChoice[];\n system_fingerprint?: string;\n usage?: UsageInfo;\n}\n\nexport interface ChatCompletionChunkChoice {\n index: number;\n delta: Partial<ChatMessage>;\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;\n logprobs?: unknown;\n}\n\n// ============================================================================\n// Provider Types\n// ============================================================================\n\nexport interface ProviderConfig {\n name: string;\n apiKey?: string;\n baseUrl?: string;\n models: string[];\n timeout?: number;\n maxRetries?: number;\n headers?: Record<string, string>;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ProviderHealth {\n status: 'healthy' | 'degraded' | 'unhealthy';\n latencyMs: number;\n lastCheck: Date;\n errorRate: number;\n consecutiveFailures: number;\n}\n\nexport interface ModelInfo {\n id: string;\n provider: string;\n contextWindow: number;\n maxOutputTokens: number;\n inputPricePerMillion: number;\n outputPricePerMillion: number;\n capabilities: ModelCapabilities;\n}\n\nexport interface ModelCapabilities {\n streaming: boolean;\n tools: boolean;\n vision: boolean;\n json_mode: boolean;\n system_prompts: boolean;\n}\n\n// ============================================================================\n// Routing Types\n// ============================================================================\n\nexport type RoutingStrategy =\n | 'round-robin'\n | 'failover'\n | 'cost-optimized'\n | 'latency-optimized'\n | 'load-balanced'\n | 'conditional';\n\nexport interface RoutingDecision {\n provider: string;\n model: string;\n reason: string;\n alternatives: Array<{ provider: string; model: string; score: number }>;\n timestamp: Date;\n}\n\nexport interface RouterConfig {\n strategy: RoutingStrategy;\n fallbackChain?: string[];\n weights?: Record<string, number>;\n rules?: RoutingRule[];\n}\n\nexport interface RoutingRule {\n condition: (request: ChatCompletionRequest) => boolean;\n route: string;\n reason: string;\n}\n\n// ============================================================================\n// Cache Types\n// ============================================================================\n\nexport interface CacheConfig {\n enabled: boolean;\n ttl: number;\n maxEntries: number;\n type: 'exact' | 'semantic';\n similarityThreshold?: number;\n}\n\nexport interface CacheEntry {\n key: string;\n response: ChatCompletionResponse;\n createdAt: Date;\n expiresAt: Date;\n hits: number;\n metadata: Record<string, unknown>;\n}\n\nexport interface CacheStats {\n hits: number;\n misses: number;\n hitRate: number;\n size: number;\n evictions: number;\n}\n\n// ============================================================================\n// Rate Limit Types\n// ============================================================================\n\nexport interface RateLimitConfig {\n requestsPerMinute?: number;\n requestsPerHour?: number;\n requestsPerDay?: number;\n tokensPerMinute?: number;\n tokensPerDay?: number;\n maxConcurrent?: number;\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n remaining: number;\n reset: Date;\n limit: number;\n retryAfter?: number;\n}\n\n// ============================================================================\n// Telemetry Types\n// ============================================================================\n\nexport interface TelemetryConfig {\n metrics?: boolean;\n tracing?: boolean;\n logging?: {\n level: 'debug' | 'info' | 'warn' | 'error';\n redact?: string[];\n };\n}\n\nexport interface GatewayMetrics {\n requests: {\n total: number;\n successful: number;\n failed: number;\n cached: number;\n };\n latency: {\n avg: number;\n p50: number;\n p95: number;\n p99: number;\n };\n tokens: {\n input: number;\n output: number;\n total: number;\n };\n cost: {\n total: number;\n byProvider: Record<string, number>;\n byModel: Record<string, number>;\n };\n cache: {\n hits: number;\n misses: number;\n hitRate: number;\n };\n providers: Record<string, ProviderHealth>;\n}\n\n// ============================================================================\n// Gateway Configuration\n// ============================================================================\n\nexport interface GatewayConfig {\n providers: ProviderConfig[];\n routing?: RouterConfig;\n cache?: CacheConfig;\n rateLimit?:\n | RateLimitConfig\n | { default: RateLimitConfig; perTenant?: boolean };\n telemetry?: TelemetryConfig;\n auth?: AuthConfig;\n server?: ServerConfig;\n}\n\nexport interface AuthConfig {\n type: 'api-key' | 'jwt' | 'none';\n keys?: string[];\n jwtSecret?: string;\n validateTenant?: (tenantId: string) => Promise<boolean>;\n}\n\nexport interface ServerConfig {\n port?: number;\n host?: string;\n cors?: {\n origin?: string | string[];\n methods?: string[];\n headers?: string[];\n };\n basePath?: string;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\nexport class GatewayError extends Error {\n constructor(\n message: string,\n public code: string,\n public statusCode: number = 500,\n public provider?: string,\n public retryable: boolean = false,\n ) {\n super(message);\n this.name = 'GatewayError';\n }\n}\n\nexport class ProviderError extends GatewayError {\n constructor(\n message: string,\n provider: string,\n public originalError?: Error,\n retryable: boolean = true,\n ) {\n super(message, 'PROVIDER_ERROR', 502, provider, retryable);\n this.name = 'ProviderError';\n }\n}\n\nexport class RateLimitError extends GatewayError {\n constructor(\n message: string,\n public retryAfter: number,\n provider?: string,\n ) {\n super(message, 'RATE_LIMIT_EXCEEDED', 429, provider, true);\n this.name = 'RateLimitError';\n }\n}\n\nexport class AuthenticationError extends GatewayError {\n constructor(message: string) {\n super(message, 'AUTHENTICATION_FAILED', 401, undefined, false);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class ValidationError extends GatewayError {\n constructor(message: string) {\n super(message, 'VALIDATION_ERROR', 400, undefined, false);\n this.name = 'ValidationError';\n }\n}\n","/**\n * Provider Registry - manages all LLM providers\n */\n\nimport type { ProviderHealth, ModelInfo } from '../core/types.js';\nimport type { Provider } from './Provider.js';\n\nexport interface ProviderWithModels {\n provider: Provider;\n models: string[];\n}\n\n/**\n * Registry for managing LLM providers\n */\nexport class ProviderRegistry {\n private providers: Map<string, Provider> = new Map();\n private modelToProvider: Map<string, string[]> = new Map();\n private healthCheckInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(providers: Provider[] = []) {\n for (const provider of providers) {\n this.register(provider);\n }\n }\n\n /**\n * Register a provider\n */\n register(provider: Provider): void {\n this.providers.set(provider.name, provider);\n\n // Map models to this provider\n for (const model of provider.getModels()) {\n const existing = this.modelToProvider.get(model) || [];\n if (!existing.includes(provider.name)) {\n existing.push(provider.name);\n this.modelToProvider.set(model, existing);\n }\n }\n }\n\n /**\n * Unregister a provider\n */\n unregister(name: string): boolean {\n const provider = this.providers.get(name);\n if (!provider) {\n return false;\n }\n\n // Remove model mappings\n for (const model of provider.getModels()) {\n const providers = this.modelToProvider.get(model);\n if (providers) {\n const filtered = providers.filter((p) => p !== name);\n if (filtered.length > 0) {\n this.modelToProvider.set(model, filtered);\n } else {\n this.modelToProvider.delete(model);\n }\n }\n }\n\n this.providers.delete(name);\n return true;\n }\n\n /**\n * Get a provider by name\n */\n get(name: string): Provider | undefined {\n return this.providers.get(name);\n }\n\n /**\n * Get all registered providers\n */\n getAll(): Provider[] {\n return Array.from(this.providers.values());\n }\n\n /**\n * Get all provider names\n */\n getNames(): string[] {\n return Array.from(this.providers.keys());\n }\n\n /**\n * Get providers that support a specific model\n */\n getProvidersForModel(model: string): Provider[] {\n const names = this.modelToProvider.get(model) || [];\n return names\n .map((name) => this.providers.get(name))\n .filter((p): p is Provider => p !== undefined);\n }\n\n /**\n * Get the first available provider for a model\n */\n getProviderForModel(model: string): Provider | undefined {\n const providers = this.getProvidersForModel(model);\n return providers.find((p) => p.isAvailable());\n }\n\n /**\n * Check if any provider supports a model\n */\n hasModel(model: string): boolean {\n return this.modelToProvider.has(model);\n }\n\n /**\n * Get all available models across all providers\n */\n getAllModels(): string[] {\n return Array.from(this.modelToProvider.keys());\n }\n\n /**\n * Get model info from the appropriate provider\n */\n getModelInfo(model: string): ModelInfo | null {\n const provider = this.getProviderForModel(model);\n return provider?.getModelInfo(model) ?? null;\n }\n\n /**\n * Get health status for all providers\n */\n getHealthStatus(): Record<string, ProviderHealth> {\n const status: Record<string, ProviderHealth> = {};\n for (const [name, provider] of this.providers) {\n status[name] = provider.getHealth();\n }\n return status;\n }\n\n /**\n * Get healthy providers\n */\n getHealthyProviders(): Provider[] {\n return this.getAll().filter((p) => p.isHealthy());\n }\n\n /**\n * Get available providers (healthy or degraded)\n */\n getAvailableProviders(): Provider[] {\n return this.getAll().filter((p) => p.isAvailable());\n }\n\n /**\n * Run health checks on all providers\n */\n async checkHealth(): Promise<Record<string, ProviderHealth>> {\n const results: Record<string, ProviderHealth> = {};\n\n await Promise.all(\n this.getAll().map(async (provider) => {\n results[provider.name] = await provider.healthCheck();\n }),\n );\n\n return results;\n }\n\n /**\n * Start periodic health checks\n */\n startHealthChecks(intervalMs: number = 60000): void {\n if (this.healthCheckInterval) {\n return;\n }\n\n this.healthCheckInterval = setInterval(() => {\n this.checkHealth().catch(console.error);\n }, intervalMs);\n }\n\n /**\n * Stop periodic health checks\n */\n stopHealthChecks(): void {\n if (this.healthCheckInterval) {\n clearInterval(this.healthCheckInterval);\n this.healthCheckInterval = null;\n }\n }\n\n /**\n * Get the number of registered providers\n */\n get size(): number {\n return this.providers.size;\n }\n}\n","/**\n * Provider Health monitoring and circuit breaker\n */\n\nimport type { ProviderHealth } from '../core/types.js';\nimport { EventEmitter } from 'events';\n\nexport type CircuitState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerConfig {\n failureThreshold: number;\n successThreshold: number;\n timeout: number;\n volumeThreshold?: number;\n}\n\nexport interface HealthMonitorConfig {\n checkInterval: number;\n unhealthyThreshold: number;\n degradedThreshold: number;\n circuitBreaker?: CircuitBreakerConfig;\n}\n\n/**\n * Circuit breaker for a single provider\n */\nexport class CircuitBreaker {\n private state: CircuitState = 'closed';\n private failures: number = 0;\n private successes: number = 0;\n private lastFailure: Date | null = null;\n private nextAttempt: Date | null = null;\n\n constructor(\n private readonly providerName: string,\n private readonly config: CircuitBreakerConfig,\n ) {}\n\n /**\n * Check if requests are allowed\n */\n isAllowed(): boolean {\n if (this.state === 'closed') {\n return true;\n }\n\n if (this.state === 'open') {\n // Check if timeout has passed\n if (this.nextAttempt && new Date() >= this.nextAttempt) {\n this.state = 'half-open';\n return true;\n }\n return false;\n }\n\n // half-open: allow limited requests\n return true;\n }\n\n /**\n * Record a successful request\n */\n recordSuccess(): void {\n if (this.state === 'half-open') {\n this.successes++;\n if (this.successes >= this.config.successThreshold) {\n this.reset();\n }\n } else if (this.state === 'closed') {\n // Reset failure count on success\n this.failures = Math.max(0, this.failures - 1);\n }\n }\n\n /**\n * Record a failed request\n */\n recordFailure(): void {\n this.failures++;\n this.lastFailure = new Date();\n\n if (this.state === 'half-open') {\n this.trip();\n } else if (\n this.state === 'closed' &&\n this.failures >= this.config.failureThreshold\n ) {\n this.trip();\n }\n }\n\n /**\n * Trip the circuit breaker (open it)\n */\n private trip(): void {\n this.state = 'open';\n this.nextAttempt = new Date(Date.now() + this.config.timeout);\n this.successes = 0;\n }\n\n /**\n * Reset the circuit breaker\n */\n reset(): void {\n this.state = 'closed';\n this.failures = 0;\n this.successes = 0;\n this.nextAttempt = null;\n }\n\n /**\n * Get the current state\n */\n getState(): CircuitState {\n return this.state;\n }\n\n /**\n * Get circuit status\n */\n getStatus(): {\n providerName: string;\n state: CircuitState;\n failures: number;\n nextAttempt: Date | null;\n lastFailure: Date | null;\n } {\n return {\n providerName: this.providerName,\n state: this.state,\n failures: this.failures,\n nextAttempt: this.nextAttempt,\n lastFailure: this.lastFailure,\n };\n }\n}\n\n/**\n * Health monitor for tracking provider health over time\n */\nexport class HealthMonitor extends EventEmitter {\n private healthHistory: Map<string, ProviderHealth[]> = new Map();\n private circuitBreakers: Map<string, CircuitBreaker> = new Map();\n private readonly maxHistorySize = 100;\n\n constructor(private readonly config: HealthMonitorConfig) {\n super();\n }\n\n /**\n * Record a health check result\n */\n recordHealth(providerName: string, health: ProviderHealth): void {\n const history = this.healthHistory.get(providerName) || [];\n history.push(health);\n\n // Keep only recent history\n if (history.length > this.maxHistorySize) {\n history.shift();\n }\n\n this.healthHistory.set(providerName, history);\n\n // Emit events based on health changes\n if (health.status === 'unhealthy') {\n this.emit('unhealthy', providerName, health);\n } else if (health.status === 'degraded') {\n this.emit('degraded', providerName, health);\n }\n }\n\n /**\n * Record a request result\n */\n recordRequest(\n providerName: string,\n success: boolean,\n _latencyMs: number,\n ): void {\n const breaker = this.getOrCreateCircuitBreaker(providerName);\n\n if (success) {\n breaker.recordSuccess();\n } else {\n breaker.recordFailure();\n\n // Check if circuit was just opened\n if (breaker.getState() === 'open') {\n this.emit('circuit-open', providerName);\n }\n }\n }\n\n /**\n * Check if requests are allowed for a provider\n */\n isRequestAllowed(providerName: string): boolean {\n const breaker = this.circuitBreakers.get(providerName);\n return breaker ? breaker.isAllowed() : true;\n }\n\n /**\n * Get or create a circuit breaker for a provider\n */\n private getOrCreateCircuitBreaker(providerName: string): CircuitBreaker {\n let breaker = this.circuitBreakers.get(providerName);\n if (!breaker && this.config.circuitBreaker) {\n breaker = new CircuitBreaker(providerName, this.config.circuitBreaker);\n this.circuitBreakers.set(providerName, breaker);\n }\n return (\n breaker ||\n new CircuitBreaker(providerName, {\n failureThreshold: 5,\n successThreshold: 3,\n timeout: 30000,\n })\n );\n }\n\n /**\n * Get health history for a provider\n */\n getHistory(providerName: string): ProviderHealth[] {\n return this.healthHistory.get(providerName) || [];\n }\n\n /**\n * Get average latency for a provider\n */\n getAverageLatency(providerName: string): number {\n const history = this.healthHistory.get(providerName) || [];\n if (history.length === 0) return 0;\n\n const sum = history.reduce((acc, h) => acc + h.latencyMs, 0);\n return sum / history.length;\n }\n\n /**\n * Get error rate for a provider\n */\n getErrorRate(providerName: string): number {\n const history = this.healthHistory.get(providerName) || [];\n if (history.length === 0) return 0;\n\n const lastHealth = history[history.length - 1];\n return lastHealth.errorRate;\n }\n\n /**\n * Get circuit breaker status for a provider\n */\n getCircuitStatus(\n providerName: string,\n ): ReturnType<CircuitBreaker['getStatus']> | null {\n const breaker = this.circuitBreakers.get(providerName);\n return breaker ? breaker.getStatus() : null;\n }\n\n /**\n * Get all circuit breaker statuses\n */\n getAllCircuitStatuses(): Record<\n string,\n ReturnType<CircuitBreaker['getStatus']>\n > {\n const statuses: Record<\n string,\n ReturnType<CircuitBreaker['getStatus']>\n > = {};\n for (const [name, breaker] of this.circuitBreakers) {\n statuses[name] = breaker.getStatus();\n }\n return statuses;\n }\n\n /**\n * Reset circuit breaker for a provider\n */\n resetCircuit(providerName: string): void {\n const breaker = this.circuitBreakers.get(providerName);\n if (breaker) {\n breaker.reset();\n this.emit('circuit-reset', providerName);\n }\n }\n\n /**\n * Clear all history\n */\n clear(): void {\n this.healthHistory.clear();\n this.circuitBreakers.clear();\n }\n}\n","/**\n * Router - orchestrates routing decisions\n */\n\nimport type {\n ChatCompletionRequest,\n RoutingDecision,\n RouterConfig,\n RoutingStrategy,\n} from '../core/types.js';\nimport type { ProviderRegistry } from '../providers/ProviderRegistry.js';\nimport type { Provider } from '../providers/Provider.js';\n\n/**\n * Base interface for routing strategies\n */\nexport interface RoutingStrategyInterface {\n /**\n * Name of the strategy\n */\n readonly name: RoutingStrategy;\n\n /**\n * Select a provider and model for a request\n */\n route(\n request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision;\n}\n\n/**\n * Context passed to routing strategies\n */\nexport interface RoutingContext {\n excludeProviders?: string[];\n preferredProvider?: string;\n maxCost?: number;\n maxLatency?: number;\n previousAttempts?: Array<{ provider: string; model: string; error?: string }>;\n}\n\n/**\n * Model mapping for cross-provider routing\n */\nexport interface ModelMapping {\n [model: string]: Array<{ provider: string; model: string }>;\n}\n\n// Default model mappings (equivalents across providers)\nexport const DEFAULT_MODEL_MAPPINGS: ModelMapping = {\n // GPT-4 class\n 'gpt-4o': [\n { provider: 'anthropic', model: 'claude-3-5-sonnet-20241022' },\n { provider: 'google', model: 'gemini-1.5-pro' },\n ],\n 'claude-3-5-sonnet-20241022': [\n { provider: 'openai', model: 'gpt-4o' },\n { provider: 'google', model: 'gemini-1.5-pro' },\n ],\n 'gemini-1.5-pro': [\n { provider: 'openai', model: 'gpt-4o' },\n { provider: 'anthropic', model: 'claude-3-5-sonnet-20241022' },\n ],\n // GPT-4 mini class\n 'gpt-4o-mini': [\n { provider: 'anthropic', model: 'claude-3-5-haiku-20241022' },\n { provider: 'google', model: 'gemini-1.5-flash' },\n ],\n 'claude-3-5-haiku-20241022': [\n { provider: 'openai', model: 'gpt-4o-mini' },\n { provider: 'google', model: 'gemini-1.5-flash' },\n ],\n 'gemini-1.5-flash': [\n { provider: 'openai', model: 'gpt-4o-mini' },\n { provider: 'anthropic', model: 'claude-3-5-haiku-20241022' },\n ],\n};\n\n/**\n * Virtual model names that get routed\n */\nexport const VIRTUAL_MODELS = ['best', 'cheapest', 'fastest'] as const;\nexport type VirtualModel = (typeof VIRTUAL_MODELS)[number];\n\n/**\n * Router class that manages routing strategies\n */\nexport class Router {\n private strategy: RoutingStrategyInterface;\n private modelMappings: ModelMapping;\n private fallbackChain: string[];\n\n constructor(\n strategy: RoutingStrategyInterface,\n config?: {\n modelMappings?: ModelMapping;\n fallbackChain?: string[];\n },\n ) {\n this.strategy = strategy;\n this.modelMappings = {\n ...DEFAULT_MODEL_MAPPINGS,\n ...config?.modelMappings,\n };\n this.fallbackChain = config?.fallbackChain || [\n 'openai',\n 'anthropic',\n 'google',\n ];\n }\n\n /**\n * Route a request to a provider\n */\n route(\n request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision {\n // Handle virtual models\n if (this.isVirtualModel(request.model)) {\n return this.routeVirtualModel(request.model, request, registry, context);\n }\n\n // Use strategy for routing\n return this.strategy.route(request, registry, context);\n }\n\n /**\n * Check if a model is a virtual model\n */\n isVirtualModel(model: string): model is VirtualModel {\n return VIRTUAL_MODELS.includes(model as VirtualModel);\n }\n\n /**\n * Route virtual model to actual provider/model\n */\n private routeVirtualModel(\n virtualModel: VirtualModel,\n _request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision {\n const availableProviders = registry\n .getAvailableProviders()\n .filter((p) => !context?.excludeProviders?.includes(p.name));\n\n if (availableProviders.length === 0) {\n throw new Error('No available providers');\n }\n\n switch (virtualModel) {\n case 'best':\n return this.routeBest(availableProviders, context);\n case 'cheapest':\n return this.routeCheapest(availableProviders, context);\n case 'fastest':\n return this.routeFastest(availableProviders, context);\n default:\n throw new Error(`Unknown virtual model: ${String(virtualModel)}`);\n }\n }\n\n /**\n * Route to best quality model\n */\n private routeBest(\n providers: Provider[],\n context?: RoutingContext,\n ): RoutingDecision {\n // Quality ranking (subjective based on typical usage)\n const qualityRanking: Record<string, number> = {\n 'claude-3-5-sonnet-20241022': 95,\n 'claude-sonnet-4-20250514': 96,\n 'gpt-4o': 94,\n 'gemini-1.5-pro': 92,\n 'claude-3-opus-20240229': 93,\n 'gpt-4-turbo': 91,\n o1: 97,\n 'o1-preview': 96,\n };\n\n const candidates: Array<{\n provider: string;\n model: string;\n score: number;\n }> = [];\n\n for (const provider of providers) {\n for (const model of provider.getModels()) {\n const score = qualityRanking[model] || 50;\n candidates.push({\n provider: provider.name,\n model,\n score,\n });\n }\n }\n\n // Sort by quality score (highest first)\n candidates.sort((a, b) => b.score - a.score);\n\n // Apply preferences\n if (context?.preferredProvider) {\n const preferred = candidates.find(\n (c) => c.provider === context.preferredProvider,\n );\n if (preferred) {\n return {\n provider: preferred.provider,\n model: preferred.model,\n reason: `Best quality model from preferred provider`,\n alternatives: candidates.slice(0, 3),\n timestamp: new Date(),\n };\n }\n }\n\n const best = candidates[0];\n return {\n provider: best.provider,\n model: best.model,\n reason: `Highest quality model available`,\n alternatives: candidates.slice(1, 4),\n timestamp: new Date(),\n };\n }\n\n /**\n * Route to cheapest model\n */\n private routeCheapest(\n providers: Provider[],\n context?: RoutingContext,\n ): RoutingDecision {\n const candidates: Array<{\n provider: string;\n model: string;\n score: number;\n }> = [];\n\n for (const provider of providers) {\n for (const model of provider.getModels()) {\n const modelInfo = provider.getModelInfo(model);\n const avgCost = modelInfo\n ? (modelInfo.inputPricePerMillion + modelInfo.outputPricePerMillion) /\n 2\n : Infinity;\n\n candidates.push({\n provider: provider.name,\n model,\n score: avgCost === 0 ? 0 : 1 / avgCost, // Higher score = cheaper\n });\n }\n }\n\n // Sort by score (highest = cheapest)\n candidates.sort((a, b) => b.score - a.score);\n\n // Check max cost constraint\n if (context?.maxCost !== undefined) {\n const filtered = candidates.filter((c) => {\n const provider = providers.find((p) => p.name === c.provider);\n const modelInfo = provider?.getModelInfo(c.model);\n if (!modelInfo) return true;\n // Rough cost estimate for 1000 input + 500 output tokens\n const estimatedCost =\n (1000 / 1_000_000) * modelInfo.inputPricePerMillion +\n (500 / 1_000_000) * modelInfo.outputPricePerMillion;\n return estimatedCost <= context.maxCost!;\n });\n\n if (filtered.length > 0) {\n const cheapest = filtered[0];\n return {\n provider: cheapest.provider,\n model: cheapest.model,\n reason: `Cheapest model within budget`,\n alternatives: filtered.slice(1, 4),\n timestamp: new Date(),\n };\n }\n }\n\n const cheapest = candidates[0];\n return {\n provider: cheapest.provider,\n model: cheapest.model,\n reason: `Cheapest available model`,\n alternatives: candidates.slice(1, 4),\n timestamp: new Date(),\n };\n }\n\n /**\n * Route to fastest model (based on latency)\n */\n private routeFastest(\n providers: Provider[],\n context?: RoutingContext,\n ): RoutingDecision {\n const candidates: Array<{\n provider: string;\n model: string;\n score: number;\n }> = [];\n\n for (const provider of providers) {\n const health = provider.getHealth();\n const latency = health.latencyMs || 1000; // Default 1s if unknown\n\n for (const model of provider.getModels()) {\n candidates.push({\n provider: provider.name,\n model,\n score: 1 / latency, // Higher score = lower latency\n });\n }\n }\n\n // Sort by score (highest = fastest)\n candidates.sort((a, b) => b.score - a.score);\n\n // Check max latency constraint\n if (context?.maxLatency !== undefined) {\n const filtered = candidates.filter((c) => {\n const provider = providers.find((p) => p.name === c.provider);\n const health = provider?.getHealth();\n return (health?.latencyMs || 1000) <= context.maxLatency!;\n });\n\n if (filtered.length > 0) {\n const fastest = filtered[0];\n return {\n provider: fastest.provider,\n model: fastest.model,\n reason: `Fastest model within latency limit`,\n alternatives: filtered.slice(1, 4),\n timestamp: new Date(),\n };\n }\n }\n\n const fastest = candidates[0];\n return {\n provider: fastest.provider,\n model: fastest.model,\n reason: `Fastest available provider`,\n alternatives: candidates.slice(1, 4),\n timestamp: new Date(),\n };\n }\n\n /**\n * Get equivalent models across providers\n */\n getEquivalentModels(\n model: string,\n ): Array<{ provider: string; model: string }> {\n return this.modelMappings[model] || [];\n }\n\n /**\n * Set the routing strategy\n */\n setStrategy(strategy: RoutingStrategyInterface): void {\n this.strategy = strategy;\n }\n\n /**\n * Get the current strategy name\n */\n getStrategyName(): RoutingStrategy {\n return this.strategy.name;\n }\n\n /**\n * Get the fallback chain\n */\n getFallbackChain(): string[] {\n return [...this.fallbackChain];\n }\n}\n\n/**\n * Create router configuration from options\n */\nexport function createRouterConfig(\n options: Partial<RouterConfig>,\n): RouterConfig {\n return {\n strategy: options.strategy || 'round-robin',\n fallbackChain: options.fallbackChain,\n weights: options.weights,\n rules: options.rules,\n };\n}\n","/**\n * Round-robin routing strategy\n */\n\nimport type {\n ChatCompletionRequest,\n RoutingDecision,\n} from '../../core/types.js';\nimport type { ProviderRegistry } from '../../providers/ProviderRegistry.js';\nimport type { RoutingStrategyInterface, RoutingContext } from '../Router.js';\n\nexport interface RoundRobinConfig {\n weights?: Record<string, number>;\n}\n\n/**\n * Round-robin routing strategy\n * Distributes requests evenly across providers\n */\nexport class RoundRobinStrategy implements RoutingStrategyInterface {\n readonly name = 'round-robin' as const;\n private currentIndex = 0;\n private weights: Record<string, number>;\n\n constructor(config: RoundRobinConfig = {}) {\n this.weights = config.weights || {};\n }\n\n route(\n request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision {\n // Get providers that support the requested model\n let providers = registry.getProvidersForModel(request.model);\n\n // If no providers support the model, get all available providers\n if (providers.length === 0) {\n providers = registry.getAvailableProviders();\n }\n\n // Filter out excluded providers\n if (context?.excludeProviders) {\n providers = providers.filter(\n (p) => !context.excludeProviders!.includes(p.name),\n );\n }\n\n // Filter to only available providers\n providers = providers.filter((p) => p.isAvailable());\n\n if (providers.length === 0) {\n throw new Error(`No available providers for model: ${request.model}`);\n }\n\n // Prefer the preferred provider if specified and available\n if (context?.preferredProvider) {\n const preferred = providers.find(\n (p) => p.name === context.preferredProvider,\n );\n if (preferred) {\n const model = preferred.supportsModel(request.model)\n ? request.model\n : preferred.getModels()[0];\n\n return {\n provider: preferred.name,\n model,\n reason: 'Preferred provider selected',\n alternatives: providers\n .filter((p) => p.name !== preferred.name)\n .slice(0, 3)\n .map((p) => ({\n provider: p.name,\n model: p.supportsModel(request.model)\n ? request.model\n : p.getModels()[0],\n score: 1,\n })),\n timestamp: new Date(),\n };\n }\n }\n\n // Build weighted list\n const weightedProviders: Array<{\n provider: (typeof providers)[0];\n weight: number;\n }> = [];\n for (const provider of providers) {\n const weight = this.weights[provider.name] || 1;\n for (let i = 0; i < weight; i++) {\n weightedProviders.push({ provider, weight });\n }\n }\n\n // Select next provider in rotation\n this.currentIndex = this.currentIndex % weightedProviders.length;\n const selected = weightedProviders[this.currentIndex];\n this.currentIndex++;\n\n const model = selected.provider.supportsModel(request.model)\n ? request.model\n : selected.provider.getModels()[0];\n\n return {\n provider: selected.provider.name,\n model,\n reason: `Round-robin selection (index: ${this.currentIndex - 1})`,\n alternatives: providers\n .filter((p) => p.name !== selected.provider.name)\n .slice(0, 3)\n .map((p) => ({\n provider: p.name,\n model: p.supportsModel(request.model)\n ? request.model\n : p.getModels()[0],\n score: 1,\n })),\n timestamp: new Date(),\n };\n }\n\n /**\n * Reset the rotation index\n */\n reset(): void {\n this.currentIndex = 0;\n }\n}\n","/**\n * Failover routing strategy\n */\n\nimport type {\n ChatCompletionRequest,\n RoutingDecision,\n} from '../../core/types.js';\nimport type { ProviderRegistry } from '../../providers/ProviderRegistry.js';\nimport type { RoutingStrategyInterface, RoutingContext } from '../Router.js';\n\nexport interface FailoverConfig {\n /**\n * Ordered list of providers to try\n */\n chain: string[];\n\n /**\n * Model mappings for fallback\n */\n modelMappings?: Record<string, Record<string, string>>;\n}\n\n/**\n * Failover routing strategy\n * Tries providers in order until one succeeds\n */\nexport class FailoverStrategy implements RoutingStrategyInterface {\n readonly name = 'failover' as const;\n private chain: string[];\n private modelMappings: Record<string, Record<string, string>>;\n\n constructor(config: FailoverConfig) {\n this.chain = config.chain;\n this.modelMappings = config.modelMappings || {};\n }\n\n route(\n request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision {\n // Get previous attempts to skip\n const previousProviders = new Set(\n context?.previousAttempts?.map((a) => a.provider) || [],\n );\n\n // Add excluded providers\n if (context?.excludeProviders) {\n for (const p of context.excludeProviders) {\n previousProviders.add(p);\n }\n }\n\n // Find first available provider in chain\n const alternatives: RoutingDecision['alternatives'] = [];\n\n for (const providerName of this.chain) {\n const provider = registry.get(providerName);\n if (!provider) continue;\n if (!provider.isAvailable()) continue;\n if (previousProviders.has(providerName)) continue;\n\n // Find the model to use\n let model = request.model;\n if (!provider.supportsModel(model)) {\n // Try to find a mapped model\n const mappedModel = this.modelMappings[model]?.[providerName];\n if (mappedModel && provider.supportsModel(mappedModel)) {\n model = mappedModel;\n } else {\n // Use first available model\n model = provider.getModels()[0];\n }\n }\n\n // Build alternatives from remaining chain\n for (const altName of this.chain) {\n if (altName === providerName) continue;\n if (previousProviders.has(altName)) continue;\n\n const altProvider = registry.get(altName);\n if (!altProvider?.isAvailable()) continue;\n\n let altModel = request.model;\n if (!altProvider.supportsModel(altModel)) {\n altModel =\n this.modelMappings[request.model]?.[altName] ||\n altProvider.getModels()[0];\n }\n\n alternatives.push({\n provider: altName,\n model: altModel,\n score: 1 - alternatives.length * 0.1,\n });\n\n if (alternatives.length >= 3) break;\n }\n\n return {\n provider: providerName,\n model,\n reason:\n previousProviders.size > 0\n ? `Failover to ${providerName} after ${previousProviders.size} failures`\n : `Primary provider in failover chain`,\n alternatives,\n timestamp: new Date(),\n };\n }\n\n // No providers available\n throw new Error(\n `All providers in failover chain exhausted: ${this.chain.join(', ')}`,\n );\n }\n\n /**\n * Get the next provider in chain after the given one\n */\n getNextProvider(currentProvider: string): string | null {\n const index = this.chain.indexOf(currentProvider);\n if (index === -1 || index >= this.chain.length - 1) {\n return null;\n }\n return this.chain[index + 1];\n }\n\n /**\n * Get the current failover chain\n */\n getChain(): string[] {\n return [...this.chain];\n }\n\n /**\n * Update the failover chain\n */\n setChain(chain: string[]): void {\n this.chain = [...chain];\n }\n}\n","/**\n * Token counting utilities using tiktoken\n */\n\nimport { get_encoding, type Tiktoken } from 'tiktoken';\n\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nlet encoder: Tiktoken | null = null;\n\n/**\n * Get or create the tiktoken encoder\n */\nfunction getEncoder(): Tiktoken {\n if (!encoder) {\n // Use cl100k_base encoding (used by GPT-4, GPT-3.5-turbo, and text-embedding models)\n encoder = get_encoding('cl100k_base');\n }\n return encoder;\n}\n\n/**\n * Count tokens in a string\n */\nexport function countTokens(text: string): number {\n try {\n const enc = getEncoder();\n return enc.encode(text).length;\n } catch {\n // Fallback: rough estimate (4 chars per token)\n return Math.ceil(text.length / 4);\n }\n}\n\n/**\n * Count tokens in messages array\n */\nexport function countMessageTokens(\n messages: Array<{ role: string; content: unknown }>,\n): number {\n let total = 0;\n\n for (const message of messages) {\n // Add tokens for role (approximately 4 tokens per message for formatting)\n total += 4;\n\n // Add content tokens\n if (message.content) {\n total += countTokens(\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content),\n );\n }\n }\n\n // Add 2 tokens for the assistant reply priming\n total += 2;\n\n return total;\n}\n\n/**\n * Estimate tokens for a request (messages + tools)\n */\nexport function estimateRequestTokens(\n messages: Array<{ role: string; content: unknown }>,\n tools?: Array<{\n function: { name: string; description?: string; parameters?: unknown };\n }>,\n): number {\n let total = countMessageTokens(messages);\n\n // Add tool definitions (rough estimate)\n if (tools && tools.length > 0) {\n for (const tool of tools) {\n total += countTokens(tool.function.name);\n if (tool.function.description) {\n total += countTokens(tool.function.description);\n }\n if (tool.function.parameters) {\n total += countTokens(JSON.stringify(tool.function.parameters));\n }\n // Add overhead per tool\n total += 10;\n }\n }\n\n return total;\n}\n\n/**\n * Truncate text to fit within token limit\n */\nexport function truncateToTokenLimit(text: string, maxTokens: number): string {\n const enc = getEncoder();\n const tokens = enc.encode(text);\n\n if (tokens.length <= maxTokens) {\n return text;\n }\n\n const truncatedTokens = tokens.slice(0, maxTokens);\n const decoded = enc.decode(truncatedTokens);\n return new TextDecoder().decode(decoded);\n}\n\n/**\n * Free the encoder resources (call on shutdown)\n */\nexport function freeEncoder(): void {\n if (encoder) {\n encoder.free();\n encoder = null;\n }\n}\n","/**\n * Cost-optimized routing strategy\n */\n\nimport type {\n ChatCompletionRequest,\n RoutingDecision,\n} from '../../core/types.js';\nimport type { ProviderRegistry } from '../../providers/ProviderRegistry.js';\nimport type { RoutingStrategyInterface, RoutingContext } from '../Router.js';\nimport { estimateRequestTokens } from '../../utils/tokenizer.js';\n\nexport interface CostOptimizedConfig {\n /**\n * Maximum cost per request (in dollars)\n */\n maxCostPerRequest?: number;\n\n /**\n * Prefer local models (e.g., Ollama) when available\n */\n preferLocal?: boolean;\n\n /**\n * Minimum quality threshold (0-1)\n */\n qualityThreshold?: number;\n\n /**\n * Fallback behavior when over budget\n */\n fallbackOnBudget?: 'cheapest' | 'error';\n}\n\n// Quality scores for models (subjective, 0-100)\nconst MODEL_QUALITY_SCORES: Record<string, number> = {\n // Top tier\n o1: 98,\n 'o1-preview': 96,\n 'claude-3-opus-20240229': 95,\n 'claude-3-5-sonnet-20241022': 94,\n 'claude-sonnet-4-20250514': 95,\n 'gpt-4o': 93,\n 'gemini-1.5-pro': 91,\n\n // Mid tier\n 'gpt-4-turbo': 88,\n 'gpt-4': 87,\n 'claude-3-sonnet-20240229': 85,\n 'o1-mini': 84,\n\n // Fast/cheap tier\n 'gpt-4o-mini': 80,\n 'claude-3-5-haiku-20241022': 79,\n 'claude-3-haiku-20240307': 75,\n 'gemini-1.5-flash': 78,\n 'gpt-3.5-turbo': 70,\n\n // Local models\n llama3: 65,\n 'llama3.1': 67,\n 'llama3.2': 68,\n mistral: 62,\n};\n\n/**\n * Cost-optimized routing strategy\n * Selects the cheapest provider that meets quality requirements\n */\nexport class CostOptimizedStrategy implements RoutingStrategyInterface {\n readonly name = 'cost-optimized' as const;\n private config: CostOptimizedConfig;\n\n constructor(config: CostOptimizedConfig = {}) {\n this.config = {\n preferLocal: false,\n qualityThreshold: 0.6,\n fallbackOnBudget: 'cheapest',\n ...config,\n };\n }\n\n route(\n request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision {\n // Get all available providers\n let providers = registry.getAvailableProviders();\n\n // Filter out excluded providers\n if (context?.excludeProviders) {\n providers = providers.filter(\n (p) => !context.excludeProviders!.includes(p.name),\n );\n }\n\n if (providers.length === 0) {\n throw new Error('No available providers');\n }\n\n // Estimate request tokens for cost calculation\n const estimatedInputTokens = estimateRequestTokens(\n request.messages,\n request.tools,\n );\n const estimatedOutputTokens = request.max_tokens || 1000;\n\n // Build candidates with cost and quality info\n const candidates: Array<{\n provider: string;\n model: string;\n cost: number;\n quality: number;\n isLocal: boolean;\n }> = [];\n\n for (const provider of providers) {\n const isLocal =\n provider.name === 'ollama' || provider.name === 'lmstudio';\n\n for (const model of provider.getModels()) {\n const modelInfo = provider.getModelInfo(model);\n if (!modelInfo) continue;\n\n // Calculate estimated cost\n const inputCost =\n (estimatedInputTokens / 1_000_000) * modelInfo.inputPricePerMillion;\n const outputCost =\n (estimatedOutputTokens / 1_000_000) * modelInfo.outputPricePerMillion;\n const totalCost = inputCost + outputCost;\n\n // Get quality score\n const quality = (MODEL_QUALITY_SCORES[model] || 50) / 100;\n\n candidates.push({\n provider: provider.name,\n model,\n cost: totalCost,\n quality,\n isLocal,\n });\n }\n }\n\n // Filter by quality threshold\n const minQuality = this.config.qualityThreshold || 0;\n let filtered = candidates.filter((c) => c.quality >= minQuality);\n\n // If no candidates meet quality threshold, use all\n if (filtered.length === 0) {\n filtered = candidates;\n }\n\n // Filter by max cost if specified\n const maxCost = context?.maxCost ?? this.config.maxCostPerRequest;\n if (maxCost !== undefined) {\n const withinBudget = filtered.filter((c) => c.cost <= maxCost);\n if (withinBudget.length > 0) {\n filtered = withinBudget;\n } else if (this.config.fallbackOnBudget === 'error') {\n throw new Error(`No models within budget of $${maxCost.toFixed(4)}`);\n }\n // Otherwise fall through to use cheapest available\n }\n\n // Sort by cost (cheapest first), then by local preference\n filtered.sort((a, b) => {\n if (this.config.preferLocal) {\n if (a.isLocal && !b.isLocal) return -1;\n if (!a.isLocal && b.isLocal) return 1;\n }\n return a.cost - b.cost;\n });\n\n const selected = filtered[0];\n\n return {\n provider: selected.provider,\n model: selected.model,\n reason: `Cheapest model meeting quality threshold (${(selected.quality * 100).toFixed(0)}% quality, $${selected.cost.toFixed(6)}/req)`,\n alternatives: filtered.slice(1, 4).map((c) => ({\n provider: c.provider,\n model: c.model,\n score: 1 / (c.cost + 0.0001), // Higher score = cheaper\n })),\n timestamp: new Date(),\n };\n }\n\n /**\n * Update configuration\n */\n setConfig(config: Partial<CostOptimizedConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): CostOptimizedConfig {\n return { ...this.config };\n }\n}\n","/**\n * Latency-optimized routing strategy\n */\n\nimport type {\n ChatCompletionRequest,\n RoutingDecision,\n} from '../../core/types.js';\nimport type { ProviderRegistry } from '../../providers/ProviderRegistry.js';\nimport type { RoutingStrategyInterface, RoutingContext } from '../Router.js';\n\nexport interface LatencyOptimizedConfig {\n /**\n * Maximum acceptable latency in milliseconds\n */\n maxLatencyMs?: number;\n\n /**\n * Number of requests to collect before adapting routing\n */\n warmupRequests?: number;\n\n /**\n * Enable adaptive routing based on observed latencies\n */\n adaptiveRouting?: boolean;\n}\n\ninterface LatencyStats {\n count: number;\n total: number;\n min: number;\n max: number;\n avg: number;\n p95: number;\n samples: number[];\n}\n\n/**\n * Latency-optimized routing strategy\n * Selects the fastest provider based on observed latencies\n */\nexport class LatencyOptimizedStrategy implements RoutingStrategyInterface {\n readonly name = 'latency-optimized' as const;\n private config: LatencyOptimizedConfig;\n private latencyStats: Map<string, LatencyStats> = new Map();\n private readonly maxSamples = 100;\n\n constructor(config: LatencyOptimizedConfig = {}) {\n this.config = {\n warmupRequests: 10,\n adaptiveRouting: true,\n ...config,\n };\n }\n\n route(\n request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision {\n // Get all available providers\n let providers = registry.getAvailableProviders();\n\n // Filter out excluded providers\n if (context?.excludeProviders) {\n providers = providers.filter(\n (p) => !context.excludeProviders!.includes(p.name),\n );\n }\n\n if (providers.length === 0) {\n throw new Error('No available providers');\n }\n\n // Check if we're still in warmup phase\n const totalRequests = Array.from(this.latencyStats.values()).reduce(\n (sum, stats) => sum + stats.count,\n 0,\n );\n const warmupThreshold = this.config.warmupRequests ?? 10;\n const isWarmup = warmupThreshold > 0 && totalRequests < warmupThreshold;\n\n // Build candidates with latency info\n const candidates: Array<{\n provider: string;\n model: string;\n latency: number;\n confidence: number;\n }> = [];\n\n for (const provider of providers) {\n // Get latency from stats or health check\n const stats = this.latencyStats.get(provider.name);\n const health = provider.getHealth();\n\n let latency: number;\n let confidence: number;\n\n if (stats && stats.count >= 5 && this.config.adaptiveRouting) {\n // Use observed latency with exponential moving average\n latency = stats.avg;\n confidence = Math.min(stats.count / 50, 1);\n } else {\n // Use health check latency or default\n latency = health.latencyMs || 1000;\n confidence = 0.3;\n }\n\n for (const model of provider.getModels()) {\n // Skip models that don't match the request if specific model requested\n if (\n request.model !== 'fastest' &&\n !provider.supportsModel(request.model) &&\n model !== request.model\n ) {\n continue;\n }\n\n candidates.push({\n provider: provider.name,\n model:\n request.model !== 'fastest' && provider.supportsModel(request.model)\n ? request.model\n : model,\n latency,\n confidence,\n });\n\n // Only add one entry per provider\n break;\n }\n }\n\n // Filter by max latency if specified\n const maxLatency = context?.maxLatency ?? this.config.maxLatencyMs;\n let filtered = candidates;\n if (maxLatency !== undefined) {\n const withinLimit = candidates.filter((c) => c.latency <= maxLatency);\n if (withinLimit.length > 0) {\n filtered = withinLimit;\n }\n }\n\n // Sort by latency (fastest first)\n filtered.sort((a, b) => a.latency - b.latency);\n\n // During warmup, occasionally try different providers (exploration)\n // When exploring, we randomly select from top 3 providers instead of always picking the fastest\n const shouldExplore =\n isWarmup && Math.random() < 0.3 && filtered.length > 1;\n\n if (shouldExplore) {\n const randomIndex = Math.floor(\n Math.random() * Math.min(3, filtered.length),\n );\n const selected = filtered[randomIndex];\n\n return {\n provider: selected.provider,\n model: selected.model,\n reason: `Warmup exploration (${totalRequests}/${warmupThreshold} requests)`,\n alternatives: filtered\n .filter((c) => c.provider !== selected.provider)\n .slice(0, 3)\n .map((c) => ({\n provider: c.provider,\n model: c.model,\n score: 1 / c.latency,\n })),\n timestamp: new Date(),\n };\n }\n\n const selected = filtered[0];\n\n return {\n provider: selected.provider,\n model: selected.model,\n reason: `Fastest provider (${selected.latency.toFixed(0)}ms avg, ${(selected.confidence * 100).toFixed(0)}% confidence)`,\n alternatives: filtered.slice(1, 4).map((c) => ({\n provider: c.provider,\n model: c.model,\n score: 1 / c.latency,\n })),\n timestamp: new Date(),\n };\n }\n\n /**\n * Record a latency observation\n */\n recordLatency(provider: string, latencyMs: number): void {\n let stats = this.latencyStats.get(provider);\n\n if (!stats) {\n stats = {\n count: 0,\n total: 0,\n min: Infinity,\n max: 0,\n avg: 0,\n p95: 0,\n samples: [],\n };\n this.latencyStats.set(provider, stats);\n }\n\n stats.count++;\n stats.total += latencyMs;\n stats.min = Math.min(stats.min, latencyMs);\n stats.max = Math.max(stats.max, latencyMs);\n\n // Keep samples for percentile calculation\n stats.samples.push(latencyMs);\n if (stats.samples.length > this.maxSamples) {\n stats.samples.shift();\n }\n\n // Calculate exponential moving average\n const alpha = 0.2; // Smoothing factor\n if (stats.count === 1) {\n stats.avg = latencyMs;\n } else {\n stats.avg = alpha * latencyMs + (1 - alpha) * stats.avg;\n }\n\n // Calculate p95\n if (stats.samples.length >= 20) {\n const sorted = [...stats.samples].sort((a, b) => a - b);\n const p95Index = Math.floor(sorted.length * 0.95);\n stats.p95 = sorted[p95Index];\n }\n }\n\n /**\n * Get latency statistics for a provider\n */\n getStats(provider: string): LatencyStats | undefined {\n return this.latencyStats.get(provider);\n }\n\n /**\n * Get all latency statistics\n */\n getAllStats(): Record<string, LatencyStats> {\n const result: Record<string, LatencyStats> = {};\n for (const [provider, stats] of this.latencyStats) {\n result[provider] = { ...stats, samples: [...stats.samples] };\n }\n return result;\n }\n\n /**\n * Clear latency statistics\n */\n clearStats(): void {\n this.latencyStats.clear();\n }\n\n /**\n * Update configuration\n */\n setConfig(config: Partial<LatencyOptimizedConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n","/**\n * Model pricing data and cost calculation utilities\n */\n\nimport type { ModelInfo, UsageInfo } from '../core/types.js';\n\n// Pricing per million tokens (as of December 2024)\nexport const MODEL_PRICING: Record<string, { input: number; output: number }> =\n {\n // OpenAI Models\n 'gpt-4o': { input: 2.5, output: 10.0 },\n 'gpt-4o-2024-11-20': { input: 2.5, output: 10.0 },\n 'gpt-4o-mini': { input: 0.15, output: 0.6 },\n 'gpt-4o-mini-2024-07-18': { input: 0.15, output: 0.6 },\n 'gpt-4-turbo': { input: 10.0, output: 30.0 },\n 'gpt-4-turbo-preview': { input: 10.0, output: 30.0 },\n 'gpt-4': { input: 30.0, output: 60.0 },\n 'gpt-4-32k': { input: 60.0, output: 120.0 },\n 'gpt-3.5-turbo': { input: 0.5, output: 1.5 },\n 'gpt-3.5-turbo-0125': { input: 0.5, output: 1.5 },\n o1: { input: 15.0, output: 60.0 },\n 'o1-preview': { input: 15.0, output: 60.0 },\n 'o1-mini': { input: 3.0, output: 12.0 },\n\n // Anthropic Models\n 'claude-3-5-sonnet-20241022': { input: 3.0, output: 15.0 },\n 'claude-3-5-sonnet-latest': { input: 3.0, output: 15.0 },\n 'claude-sonnet-4-20250514': { input: 3.0, output: 15.0 },\n 'claude-3-5-haiku-20241022': { input: 0.8, output: 4.0 },\n 'claude-3-haiku-20240307': { input: 0.25, output: 1.25 },\n 'claude-3-opus-20240229': { input: 15.0, output: 75.0 },\n 'claude-3-sonnet-20240229': { input: 3.0, output: 15.0 },\n\n // Google Gemini Models\n 'gemini-1.5-pro': { input: 1.25, output: 5.0 },\n 'gemini-1.5-pro-latest': { input: 1.25, output: 5.0 },\n 'gemini-1.5-flash': { input: 0.075, output: 0.3 },\n 'gemini-1.5-flash-latest': { input: 0.075, output: 0.3 },\n 'gemini-2.0-flash-exp': { input: 0.1, output: 0.4 },\n 'gemini-pro': { input: 0.5, output: 1.5 },\n\n // Mistral Models\n 'mistral-large-latest': { input: 2.0, output: 6.0 },\n 'mistral-medium-latest': { input: 2.7, output: 8.1 },\n 'mistral-small-latest': { input: 0.2, output: 0.6 },\n 'open-mistral-7b': { input: 0.25, output: 0.25 },\n 'open-mixtral-8x7b': { input: 0.7, output: 0.7 },\n 'open-mixtral-8x22b': { input: 2.0, output: 6.0 },\n\n // Cohere Models\n 'command-r-plus': { input: 2.5, output: 10.0 },\n 'command-r': { input: 0.5, output: 1.5 },\n command: { input: 1.0, output: 2.0 },\n\n // Groq Models (significantly cheaper)\n 'llama-3.3-70b-versatile': { input: 0.59, output: 0.79 },\n 'llama-3.1-70b-versatile': { input: 0.59, output: 0.79 },\n 'llama-3.1-8b-instant': { input: 0.05, output: 0.08 },\n 'mixtral-8x7b-32768': { input: 0.24, output: 0.24 },\n\n // Together AI Models\n 'meta-llama/Llama-3.3-70B-Instruct-Turbo': { input: 0.88, output: 0.88 },\n 'meta-llama/Llama-3.1-70B-Instruct-Turbo': { input: 0.88, output: 0.88 },\n 'meta-llama/Llama-3.1-8B-Instruct-Turbo': { input: 0.18, output: 0.18 },\n 'mistralai/Mixtral-8x7B-Instruct-v0.1': { input: 0.6, output: 0.6 },\n\n // Local models (free)\n llama3: { input: 0, output: 0 },\n 'llama3.1': { input: 0, output: 0 },\n 'llama3.2': { input: 0, output: 0 },\n mistral: { input: 0, output: 0 },\n codellama: { input: 0, output: 0 },\n phi3: { input: 0, output: 0 },\n 'qwen2.5': { input: 0, output: 0 },\n };\n\n// Model context windows\nexport const MODEL_CONTEXT_WINDOWS: Record<string, number> = {\n // OpenAI\n 'gpt-4o': 128000,\n 'gpt-4o-mini': 128000,\n 'gpt-4-turbo': 128000,\n 'gpt-4': 8192,\n 'gpt-4-32k': 32768,\n 'gpt-3.5-turbo': 16385,\n o1: 200000,\n 'o1-preview': 128000,\n 'o1-mini': 128000,\n\n // Anthropic\n 'claude-3-5-sonnet-20241022': 200000,\n 'claude-sonnet-4-20250514': 200000,\n 'claude-3-5-haiku-20241022': 200000,\n 'claude-3-opus-20240229': 200000,\n 'claude-3-sonnet-20240229': 200000,\n 'claude-3-haiku-20240307': 200000,\n\n // Google\n 'gemini-1.5-pro': 2000000,\n 'gemini-1.5-flash': 1000000,\n 'gemini-2.0-flash-exp': 1000000,\n 'gemini-pro': 32000,\n\n // Mistral\n 'mistral-large-latest': 128000,\n 'mistral-medium-latest': 32000,\n 'mistral-small-latest': 32000,\n\n // Groq\n 'llama-3.3-70b-versatile': 128000,\n 'llama-3.1-70b-versatile': 131072,\n 'llama-3.1-8b-instant': 131072,\n 'mixtral-8x7b-32768': 32768,\n};\n\n// Model max output tokens\nexport const MODEL_MAX_OUTPUT: Record<string, number> = {\n // OpenAI\n 'gpt-4o': 16384,\n 'gpt-4o-mini': 16384,\n 'gpt-4-turbo': 4096,\n 'gpt-4': 8192,\n 'gpt-3.5-turbo': 4096,\n o1: 100000,\n 'o1-preview': 32768,\n 'o1-mini': 65536,\n\n // Anthropic\n 'claude-3-5-sonnet-20241022': 8192,\n 'claude-sonnet-4-20250514': 16384,\n 'claude-3-opus-20240229': 4096,\n\n // Google\n 'gemini-1.5-pro': 8192,\n 'gemini-1.5-flash': 8192,\n};\n\n/**\n * Calculate the cost of a request based on token usage\n */\nexport function calculateCost(model: string, usage: UsageInfo): number {\n const pricing = MODEL_PRICING[model];\n if (!pricing) {\n // Unknown model, return 0\n return 0;\n }\n\n const inputCost = (usage.prompt_tokens / 1_000_000) * pricing.input;\n const outputCost = (usage.completion_tokens / 1_000_000) * pricing.output;\n\n return inputCost + outputCost;\n}\n\n/**\n * Estimate the cost of a request before execution\n */\nexport function estimateCost(\n model: string,\n estimatedInputTokens: number,\n estimatedOutputTokens: number,\n): number {\n const pricing = MODEL_PRICING[model];\n if (!pricing) {\n return 0;\n }\n\n const inputCost = (estimatedInputTokens / 1_000_000) * pricing.input;\n const outputCost = (estimatedOutputTokens / 1_000_000) * pricing.output;\n\n return inputCost + outputCost;\n}\n\n/**\n * Get pricing for a model\n */\nexport function getModelPricing(\n model: string,\n): { input: number; output: number } | null {\n return MODEL_PRICING[model] || null;\n}\n\n/**\n * Get model info including pricing and capabilities\n */\nexport function getModelInfo(model: string, provider: string): ModelInfo {\n const pricing = MODEL_PRICING[model] || { input: 0, output: 0 };\n const contextWindow = MODEL_CONTEXT_WINDOWS[model] || 4096;\n const maxOutput = MODEL_MAX_OUTPUT[model] || 4096;\n\n return {\n id: model,\n provider,\n contextWindow,\n maxOutputTokens: maxOutput,\n inputPricePerMillion: pricing.input,\n outputPricePerMillion: pricing.output,\n capabilities: getModelCapabilities(model, provider),\n };\n}\n\n/**\n * Get model capabilities based on model ID and provider\n */\nexport function getModelCapabilities(\n model: string,\n provider: string,\n): ModelInfo['capabilities'] {\n // Default capabilities\n const defaults = {\n streaming: true,\n tools: true,\n vision: false,\n json_mode: true,\n system_prompts: true,\n };\n\n // Model-specific overrides\n if (model.includes('gpt-4o') || model.includes('gpt-4-turbo')) {\n return { ...defaults, vision: true };\n }\n\n if (model.includes('o1')) {\n return {\n streaming: false, // o1 doesn't support streaming\n tools: false,\n vision: false,\n json_mode: false,\n system_prompts: false, // o1 uses developer messages\n };\n }\n\n if (model.includes('claude-3')) {\n return { ...defaults, vision: true };\n }\n\n if (model.includes('gemini')) {\n return { ...defaults, vision: true };\n }\n\n if (provider === 'ollama') {\n return {\n streaming: true,\n tools: false, // Most Ollama models don't support tools natively\n vision: model.includes('llava') || model.includes('bakllava'),\n json_mode: true,\n system_prompts: true,\n };\n }\n\n return defaults;\n}\n\n/**\n * Find the cheapest model for a given capability requirement\n */\nexport function findCheapestModel(\n models: string[],\n _requiredCapabilities?: Partial<ModelInfo['capabilities']>,\n): string | null {\n let cheapest: { model: string; cost: number } | null = null;\n\n for (const model of models) {\n const pricing = MODEL_PRICING[model];\n if (!pricing) continue;\n\n // Average cost (assuming roughly equal input/output)\n const avgCost = (pricing.input + pricing.output) / 2;\n\n if (!cheapest || avgCost < cheapest.cost) {\n cheapest = { model, cost: avgCost };\n }\n }\n\n return cheapest?.model || null;\n}\n\n/**\n * Sort models by cost (cheapest first)\n */\nexport function sortModelsByCost(\n models: string[],\n direction: 'asc' | 'desc' = 'asc',\n): string[] {\n return [...models].sort((a, b) => {\n const pricingA = MODEL_PRICING[a] || { input: 0, output: 0 };\n const pricingB = MODEL_PRICING[b] || { input: 0, output: 0 };\n\n const costA = (pricingA.input + pricingA.output) / 2;\n const costB = (pricingB.input + pricingB.output) / 2;\n\n return direction === 'asc' ? costA - costB : costB - costA;\n });\n}\n","/**\n * Hashing utilities for cache keys and request deduplication\n */\n\nimport murmurhash from 'murmurhash';\n\n/**\n * Generate a hash for a chat completion request\n * Used for exact cache matching\n */\nexport function hashRequest(request: {\n model: string;\n messages: Array<{ role: string; content: unknown }>;\n temperature?: number;\n max_tokens?: number;\n tools?: unknown[];\n tool_choice?: unknown;\n}): string {\n // Create a normalized representation of the request\n const normalized = {\n model: request.model,\n messages: request.messages.map((m) => ({\n role: m.role,\n content: normalizeContent(m.content),\n })),\n temperature: request.temperature ?? 1,\n max_tokens: request.max_tokens,\n tools: request.tools ? JSON.stringify(request.tools) : undefined,\n tool_choice: request.tool_choice\n ? JSON.stringify(request.tool_choice)\n : undefined,\n };\n\n const str = JSON.stringify(normalized);\n return murmurhash.v3(str).toString(16);\n}\n\n/**\n * Normalize content for hashing (handles string and array content)\n */\nfunction normalizeContent(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (content === null || content === undefined) {\n return '';\n }\n return JSON.stringify(content);\n}\n\n/**\n * Generate a short unique ID\n */\nexport function generateId(prefix: string = 'gw'): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${prefix}-${timestamp}${random}`;\n}\n\n/**\n * Generate a request ID in OpenAI format\n */\nexport function generateRequestId(): string {\n return `chatcmpl-${generateId('')}`;\n}\n\n/**\n * Generate a cache key for a request\n */\nexport function generateCacheKey(\n provider: string,\n model: string,\n requestHash: string,\n): string {\n return `gw:cache:${provider}:${model}:${requestHash}`;\n}\n\n/**\n * Hash a string using murmur3\n */\nexport function hash(str: string): string {\n return murmurhash.v3(str).toString(16);\n}\n\n/**\n * Create a fingerprint for system configuration\n * (used to invalidate cache when config changes)\n */\nexport function createSystemFingerprint(config: {\n version: string;\n providers: string[];\n}): string {\n const str = JSON.stringify(config);\n return `fp_${murmurhash.v3(str).toString(16)}`;\n}\n","/**\n * Base Provider interface for LLM providers\n */\n\nimport type {\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatCompletionChunk,\n ProviderConfig,\n ProviderHealth,\n ModelInfo,\n} from '../core/types.js';\n\n/**\n * Abstract base class for LLM providers\n */\nexport abstract class Provider {\n readonly name: string;\n readonly config: ProviderConfig;\n protected health: ProviderHealth;\n\n constructor(config: ProviderConfig) {\n this.name = config.name;\n this.config = config;\n this.health = {\n status: 'healthy',\n latencyMs: 0,\n lastCheck: new Date(),\n errorRate: 0,\n consecutiveFailures: 0,\n };\n }\n\n /**\n * Execute a chat completion request\n */\n abstract chat(\n request: ChatCompletionRequest,\n ): Promise<ChatCompletionResponse>;\n\n /**\n * Execute a streaming chat completion request\n */\n abstract chatStream(\n request: ChatCompletionRequest,\n ): AsyncGenerator<ChatCompletionChunk, void, unknown>;\n\n /**\n * Check if the provider supports a specific model\n */\n supportsModel(model: string): boolean {\n return this.config.models.includes(model);\n }\n\n /**\n * Get information about a specific model\n */\n abstract getModelInfo(model: string): ModelInfo | null;\n\n /**\n * Get all supported models\n */\n getModels(): string[] {\n return [...this.config.models];\n }\n\n /**\n * Get the current health status\n */\n getHealth(): ProviderHealth {\n return { ...this.health };\n }\n\n /**\n * Perform a health check\n */\n async healthCheck(): Promise<ProviderHealth> {\n const start = Date.now();\n\n try {\n // Simple health check - try to make a minimal request\n await this.chat({\n model: this.config.models[0],\n messages: [{ role: 'user', content: 'hi' }],\n max_tokens: 1,\n });\n\n const latencyMs = Date.now() - start;\n this.health = {\n status: 'healthy',\n latencyMs,\n lastCheck: new Date(),\n errorRate: Math.max(0, this.health.errorRate - 0.1),\n consecutiveFailures: 0,\n };\n } catch (error) {\n const latencyMs = Date.now() - start;\n this.health = {\n status: this.health.consecutiveFailures >= 2 ? 'unhealthy' : 'degraded',\n latencyMs,\n lastCheck: new Date(),\n errorRate: Math.min(1, this.health.errorRate + 0.2),\n consecutiveFailures: this.health.consecutiveFailures + 1,\n };\n }\n\n return this.health;\n }\n\n /**\n * Update health status after a request\n */\n protected updateHealth(success: boolean, latencyMs: number): void {\n if (success) {\n this.health = {\n status: 'healthy',\n latencyMs:\n this.health.latencyMs > 0\n ? (this.health.latencyMs + latencyMs) / 2\n : latencyMs,\n lastCheck: new Date(),\n errorRate: Math.max(0, this.health.errorRate - 0.05),\n consecutiveFailures: 0,\n };\n } else {\n this.health = {\n ...this.health,\n status: this.health.consecutiveFailures >= 2 ? 'unhealthy' : 'degraded',\n lastCheck: new Date(),\n errorRate: Math.min(1, this.health.errorRate + 0.1),\n consecutiveFailures: this.health.consecutiveFailures + 1,\n };\n }\n }\n\n /**\n * Check if the provider is currently healthy\n */\n isHealthy(): boolean {\n return this.health.status === 'healthy';\n }\n\n /**\n * Check if the provider is available (healthy or degraded)\n */\n isAvailable(): boolean {\n return this.health.status !== 'unhealthy';\n }\n}\n\n/**\n * Options for creating a provider\n */\nexport interface ProviderOptions {\n apiKey?: string;\n baseUrl?: string;\n models?: string[];\n timeout?: number;\n maxRetries?: number;\n headers?: Record<string, string>;\n}\n","/**\n * OpenAI Provider implementation\n */\n\nimport type {\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatCompletionChunk,\n ModelInfo,\n ProviderConfig,\n} from '../../core/types.js';\nimport { ProviderError } from '../../core/types.js';\nimport { Provider, type ProviderOptions } from '../Provider.js';\nimport { getModelInfo } from '../../utils/pricing.js';\nimport { generateRequestId } from '../../utils/hashing.js';\n\nconst DEFAULT_OPENAI_MODELS = [\n 'gpt-4o',\n 'gpt-4o-mini',\n 'gpt-4-turbo',\n 'gpt-4',\n 'gpt-3.5-turbo',\n 'o1',\n 'o1-mini',\n 'o1-preview',\n];\n\nexport interface OpenAIProviderOptions extends ProviderOptions {\n organization?: string;\n project?: string;\n}\n\n/**\n * OpenAI Provider for the gateway\n */\nexport class OpenAIProvider extends Provider {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly organization?: string;\n private readonly project?: string;\n private readonly timeout: number;\n\n constructor(options: OpenAIProviderOptions = {}) {\n const apiKey = options.apiKey || process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new Error('OpenAI API key is required');\n }\n\n const config: ProviderConfig = {\n name: 'openai',\n apiKey,\n baseUrl: options.baseUrl || 'https://api.openai.com/v1',\n models: options.models || DEFAULT_OPENAI_MODELS,\n timeout: options.timeout || 60000,\n maxRetries: options.maxRetries || 3,\n headers: options.headers,\n };\n\n super(config);\n\n this.apiKey = apiKey;\n this.baseUrl = config.baseUrl!;\n this.organization = options.organization;\n this.project = options.project;\n this.timeout = config.timeout!;\n }\n\n /**\n * Execute a chat completion request\n */\n async chat(request: ChatCompletionRequest): Promise<ChatCompletionResponse> {\n const start = Date.now();\n\n try {\n const response = await this.makeRequest('/chat/completions', {\n method: 'POST',\n body: JSON.stringify(this.transformRequest(request)),\n });\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw error;\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n const result = this.transformResponse(data, request.model);\n\n this.updateHealth(true, Date.now() - start);\n return result;\n } catch (error) {\n this.updateHealth(false, Date.now() - start);\n throw this.wrapError(error);\n }\n }\n\n /**\n * Execute a streaming chat completion request\n */\n async *chatStream(\n request: ChatCompletionRequest,\n ): AsyncGenerator<ChatCompletionChunk, void, unknown> {\n const start = Date.now();\n\n try {\n const response = await this.makeRequest('/chat/completions', {\n method: 'POST',\n body: JSON.stringify({\n ...this.transformRequest(request),\n stream: true,\n stream_options: { include_usage: true },\n }),\n });\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw error;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new ProviderError('No response body', 'openai');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === 'data: [DONE]') continue;\n if (!trimmed.startsWith('data: ')) continue;\n\n try {\n const json = JSON.parse(trimmed.slice(6));\n yield this.transformChunk(json, request.model);\n } catch {\n // Skip malformed JSON\n }\n }\n }\n\n this.updateHealth(true, Date.now() - start);\n } catch (error) {\n this.updateHealth(false, Date.now() - start);\n throw this.wrapError(error);\n }\n }\n\n /**\n * Get model information\n */\n getModelInfo(model: string): ModelInfo | null {\n if (!this.supportsModel(model)) {\n return null;\n }\n return getModelInfo(model, 'openai');\n }\n\n /**\n * Make an HTTP request to the OpenAI API\n */\n private async makeRequest(\n path: string,\n options: RequestInit,\n ): Promise<Response> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n ...this.config.headers,\n };\n\n if (this.organization) {\n headers['OpenAI-Organization'] = this.organization;\n }\n\n if (this.project) {\n headers['OpenAI-Project'] = this.project;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n return await fetch(`${this.baseUrl}${path}`, {\n ...options,\n headers,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Transform gateway request to OpenAI format\n */\n private transformRequest(\n request: ChatCompletionRequest,\n ): Record<string, unknown> {\n const transformed: Record<string, unknown> = {\n model: request.model,\n messages: request.messages,\n };\n\n if (request.temperature !== undefined) {\n transformed.temperature = request.temperature;\n }\n if (request.max_tokens !== undefined) {\n transformed.max_tokens = request.max_tokens;\n }\n if (request.top_p !== undefined) {\n transformed.top_p = request.top_p;\n }\n if (request.frequency_penalty !== undefined) {\n transformed.frequency_penalty = request.frequency_penalty;\n }\n if (request.presence_penalty !== undefined) {\n transformed.presence_penalty = request.presence_penalty;\n }\n if (request.stop !== undefined) {\n transformed.stop = request.stop;\n }\n if (request.tools !== undefined) {\n transformed.tools = request.tools;\n }\n if (request.tool_choice !== undefined) {\n transformed.tool_choice = request.tool_choice;\n }\n if (request.response_format !== undefined) {\n transformed.response_format = request.response_format;\n }\n if (request.seed !== undefined) {\n transformed.seed = request.seed;\n }\n if (request.user !== undefined) {\n transformed.user = request.user;\n }\n\n return transformed;\n }\n\n /**\n * Transform OpenAI response to gateway format\n */\n private transformResponse(\n data: Record<string, unknown>,\n model: string,\n ): ChatCompletionResponse {\n return {\n id: (data.id as string) || generateRequestId(),\n object: 'chat.completion',\n created: (data.created as number) || Math.floor(Date.now() / 1000),\n model: (data.model as string) || model,\n choices: data.choices as ChatCompletionResponse['choices'],\n usage: data.usage as ChatCompletionResponse['usage'],\n system_fingerprint: data.system_fingerprint as string | undefined,\n };\n }\n\n /**\n * Transform OpenAI stream chunk to gateway format\n */\n private transformChunk(\n data: Record<string, unknown>,\n model: string,\n ): ChatCompletionChunk {\n return {\n id: (data.id as string) || generateRequestId(),\n object: 'chat.completion.chunk',\n created: (data.created as number) || Math.floor(Date.now() / 1000),\n model: (data.model as string) || model,\n choices: data.choices as ChatCompletionChunk['choices'],\n system_fingerprint: data.system_fingerprint as string | undefined,\n usage: data.usage as ChatCompletionChunk['usage'],\n };\n }\n\n /**\n * Parse error response from OpenAI\n */\n private async parseError(response: Response): Promise<ProviderError> {\n let message = `OpenAI API error: ${response.status}`;\n const retryable = response.status >= 500 || response.status === 429;\n\n try {\n const data = (await response.json()) as { error?: { message?: string } };\n if (data.error?.message) {\n message = data.error.message;\n }\n } catch {\n // Use default message\n }\n\n return new ProviderError(message, 'openai', undefined, retryable);\n }\n\n /**\n * Wrap unknown errors\n */\n private wrapError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n if (error instanceof Error) {\n const isTimeout =\n error.name === 'AbortError' || error.message.includes('timeout');\n return new ProviderError(\n error.message,\n 'openai',\n error,\n isTimeout, // Timeouts are retryable\n );\n }\n\n return new ProviderError('Unknown error', 'openai', undefined, true);\n }\n}\n","/**\n * Anthropic Provider implementation\n * Converts between OpenAI-compatible format and Anthropic format\n */\n\nimport type {\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatCompletionChunk,\n ChatMessage,\n ModelInfo,\n ProviderConfig,\n} from '../../core/types.js';\nimport { ProviderError } from '../../core/types.js';\nimport { Provider, type ProviderOptions } from '../Provider.js';\nimport { getModelInfo } from '../../utils/pricing.js';\nimport { generateRequestId } from '../../utils/hashing.js';\n\nconst DEFAULT_ANTHROPIC_MODELS = [\n 'claude-3-5-sonnet-20241022',\n 'claude-3-5-sonnet-latest',\n 'claude-sonnet-4-20250514',\n 'claude-3-5-haiku-20241022',\n 'claude-3-opus-20240229',\n 'claude-3-sonnet-20240229',\n 'claude-3-haiku-20240307',\n];\n\nconst ANTHROPIC_API_VERSION = '2023-06-01';\n\nexport interface AnthropicProviderOptions extends ProviderOptions {\n anthropicBeta?: string[];\n}\n\n/**\n * Anthropic Provider for the gateway\n */\nexport class AnthropicProvider extends Provider {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly anthropicBeta?: string[];\n\n constructor(options: AnthropicProviderOptions = {}) {\n const apiKey = options.apiKey || process.env.ANTHROPIC_API_KEY;\n if (!apiKey) {\n throw new Error('Anthropic API key is required');\n }\n\n const config: ProviderConfig = {\n name: 'anthropic',\n apiKey,\n baseUrl: options.baseUrl || 'https://api.anthropic.com',\n models: options.models || DEFAULT_ANTHROPIC_MODELS,\n timeout: options.timeout || 60000,\n maxRetries: options.maxRetries || 3,\n headers: options.headers,\n };\n\n super(config);\n\n this.apiKey = apiKey;\n this.baseUrl = config.baseUrl!;\n this.timeout = config.timeout!;\n this.anthropicBeta = options.anthropicBeta;\n }\n\n /**\n * Execute a chat completion request\n */\n async chat(request: ChatCompletionRequest): Promise<ChatCompletionResponse> {\n const start = Date.now();\n\n try {\n const anthropicRequest = this.transformToAnthropic(request);\n\n const response = await this.makeRequest('/v1/messages', {\n method: 'POST',\n body: JSON.stringify(anthropicRequest),\n });\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw error;\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n const result = this.transformFromAnthropic(data, request.model);\n\n this.updateHealth(true, Date.now() - start);\n return result;\n } catch (error) {\n this.updateHealth(false, Date.now() - start);\n throw this.wrapError(error);\n }\n }\n\n /**\n * Execute a streaming chat completion request\n */\n async *chatStream(\n request: ChatCompletionRequest,\n ): AsyncGenerator<ChatCompletionChunk, void, unknown> {\n const start = Date.now();\n\n try {\n const anthropicRequest = this.transformToAnthropic(request);\n\n const response = await this.makeRequest('/v1/messages', {\n method: 'POST',\n body: JSON.stringify({\n ...anthropicRequest,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw error;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new ProviderError('No response body', 'anthropic');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n const requestId = generateRequestId();\n let inputTokens = 0;\n let outputTokens = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith('data: ')) continue;\n\n try {\n const event = JSON.parse(trimmed.slice(6));\n const chunk = this.transformStreamEvent(\n event,\n request.model,\n requestId,\n );\n\n // Track usage from message events\n if (event.type === 'message_start' && event.message?.usage) {\n inputTokens = event.message.usage.input_tokens || 0;\n }\n if (event.type === 'message_delta' && event.usage) {\n outputTokens = event.usage.output_tokens || 0;\n }\n\n if (chunk) {\n // Add usage to final chunk\n if (event.type === 'message_stop') {\n chunk.usage = {\n prompt_tokens: inputTokens,\n completion_tokens: outputTokens,\n total_tokens: inputTokens + outputTokens,\n };\n }\n yield chunk;\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n\n this.updateHealth(true, Date.now() - start);\n } catch (error) {\n this.updateHealth(false, Date.now() - start);\n throw this.wrapError(error);\n }\n }\n\n /**\n * Get model information\n */\n getModelInfo(model: string): ModelInfo | null {\n if (!this.supportsModel(model)) {\n return null;\n }\n return getModelInfo(model, 'anthropic');\n }\n\n /**\n * Make an HTTP request to the Anthropic API\n */\n private async makeRequest(\n path: string,\n options: RequestInit,\n ): Promise<Response> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': ANTHROPIC_API_VERSION,\n ...this.config.headers,\n };\n\n if (this.anthropicBeta && this.anthropicBeta.length > 0) {\n headers['anthropic-beta'] = this.anthropicBeta.join(',');\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n return await fetch(`${this.baseUrl}${path}`, {\n ...options,\n headers,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Transform OpenAI-compatible request to Anthropic format\n */\n private transformToAnthropic(\n request: ChatCompletionRequest,\n ): Record<string, unknown> {\n const { messages, systemPrompt } = this.extractSystemPrompt(\n request.messages,\n );\n\n const transformed: Record<string, unknown> = {\n model: request.model,\n messages: messages.map((m) => this.transformMessage(m)),\n max_tokens: request.max_tokens || 4096,\n };\n\n if (systemPrompt) {\n transformed.system = systemPrompt;\n }\n\n if (request.temperature !== undefined) {\n transformed.temperature = request.temperature;\n }\n if (request.top_p !== undefined) {\n transformed.top_p = request.top_p;\n }\n if (request.stop !== undefined) {\n transformed.stop_sequences = Array.isArray(request.stop)\n ? request.stop\n : [request.stop];\n }\n\n // Transform tools\n if (request.tools && request.tools.length > 0) {\n transformed.tools = request.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters || { type: 'object' },\n }));\n\n if (request.tool_choice) {\n if (request.tool_choice === 'auto') {\n transformed.tool_choice = { type: 'auto' };\n } else if (request.tool_choice === 'required') {\n transformed.tool_choice = { type: 'any' };\n } else if (request.tool_choice === 'none') {\n // Don't send tools if none is selected\n delete transformed.tools;\n } else if (\n typeof request.tool_choice === 'object' &&\n request.tool_choice.function\n ) {\n transformed.tool_choice = {\n type: 'tool',\n name: request.tool_choice.function.name,\n };\n }\n }\n }\n\n return transformed;\n }\n\n /**\n * Extract system prompt from messages\n */\n private extractSystemPrompt(messages: ChatMessage[]): {\n messages: ChatMessage[];\n systemPrompt: string | null;\n } {\n const systemMessages = messages.filter((m) => m.role === 'system');\n const otherMessages = messages.filter((m) => m.role !== 'system');\n\n const systemPrompt =\n systemMessages.length > 0\n ? systemMessages\n .map((m) =>\n typeof m.content === 'string'\n ? m.content\n : JSON.stringify(m.content),\n )\n .join('\\n')\n : null;\n\n return { messages: otherMessages, systemPrompt };\n }\n\n /**\n * Transform a single message to Anthropic format\n */\n private transformMessage(message: ChatMessage): Record<string, unknown> {\n // Handle tool results\n if (message.role === 'tool') {\n return {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: message.tool_call_id,\n content:\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content),\n },\n ],\n };\n }\n\n // Handle assistant messages with tool calls\n if (message.role === 'assistant' && message.tool_calls) {\n const content: unknown[] = [];\n\n if (message.content) {\n content.push({\n type: 'text',\n text:\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content),\n });\n }\n\n for (const toolCall of message.tool_calls) {\n content.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments),\n });\n }\n\n return { role: 'assistant', content };\n }\n\n // Handle regular messages\n return {\n role: message.role,\n content:\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content),\n };\n }\n\n /**\n * Transform Anthropic response to OpenAI-compatible format\n */\n private transformFromAnthropic(\n data: Record<string, unknown>,\n model: string,\n ): ChatCompletionResponse {\n const content = data.content as Array<Record<string, unknown>>;\n let textContent = '';\n const toolCalls: ChatCompletionResponse['choices'][0]['message']['tool_calls'] =\n [];\n\n for (const block of content) {\n if (block.type === 'text') {\n textContent += block.text as string;\n } else if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id as string,\n type: 'function',\n function: {\n name: block.name as string,\n arguments: JSON.stringify(block.input),\n },\n });\n }\n }\n\n const message: ChatMessage = {\n role: 'assistant',\n content: textContent || null,\n };\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n const stopReason = data.stop_reason as string;\n let finishReason: 'stop' | 'length' | 'tool_calls' | null = null;\n if (stopReason === 'end_turn') {\n finishReason = 'stop';\n } else if (stopReason === 'max_tokens') {\n finishReason = 'length';\n } else if (stopReason === 'tool_use') {\n finishReason = 'tool_calls';\n }\n\n const usage = data.usage as { input_tokens: number; output_tokens: number };\n\n return {\n id: (data.id as string) || generateRequestId(),\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: (data.model as string) || model,\n choices: [\n {\n index: 0,\n message,\n finish_reason: finishReason,\n },\n ],\n usage: {\n prompt_tokens: usage.input_tokens,\n completion_tokens: usage.output_tokens,\n total_tokens: usage.input_tokens + usage.output_tokens,\n },\n };\n }\n\n /**\n * Transform Anthropic stream event to OpenAI-compatible chunk\n */\n private transformStreamEvent(\n event: Record<string, unknown>,\n model: string,\n requestId: string,\n ): ChatCompletionChunk | null {\n const eventType = event.type as string;\n\n if (eventType === 'content_block_delta') {\n const delta = event.delta as Record<string, unknown>;\n\n if (delta.type === 'text_delta') {\n return {\n id: requestId,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n delta: {\n content: delta.text as string,\n },\n finish_reason: null,\n },\n ],\n };\n }\n\n if (delta.type === 'input_json_delta') {\n // Tool input streaming\n return {\n id: requestId,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n delta: {},\n finish_reason: null,\n },\n ],\n };\n }\n }\n\n if (eventType === 'content_block_start') {\n const contentBlock = event.content_block as Record<string, unknown>;\n\n if (contentBlock?.type === 'tool_use') {\n return {\n id: requestId,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n delta: {\n tool_calls: [\n {\n id: contentBlock.id as string,\n type: 'function',\n function: {\n name: contentBlock.name as string,\n arguments: '',\n },\n },\n ],\n },\n finish_reason: null,\n },\n ],\n };\n }\n }\n\n if (eventType === 'message_stop') {\n return {\n id: requestId,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n delta: {},\n finish_reason: 'stop',\n },\n ],\n };\n }\n\n return null;\n }\n\n /**\n * Parse error response from Anthropic\n */\n private async parseError(response: Response): Promise<ProviderError> {\n let message = `Anthropic API error: ${response.status}`;\n const retryable = response.status >= 500 || response.status === 429;\n\n try {\n const data = (await response.json()) as { error?: { message?: string } };\n if (data.error?.message) {\n message = data.error.message;\n }\n } catch {\n // Use default message\n }\n\n return new ProviderError(message, 'anthropic', undefined, retryable);\n }\n\n /**\n * Wrap unknown errors\n */\n private wrapError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n if (error instanceof Error) {\n const isTimeout =\n error.name === 'AbortError' || error.message.includes('timeout');\n return new ProviderError(error.message, 'anthropic', error, isTimeout);\n }\n\n return new ProviderError('Unknown error', 'anthropic', undefined, true);\n }\n}\n","/**\n * Google Gemini Provider implementation\n * Converts between OpenAI-compatible format and Google Gemini format\n */\n\nimport type {\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatCompletionChunk,\n ChatMessage,\n ModelInfo,\n ProviderConfig,\n} from '../../core/types.js';\nimport { ProviderError } from '../../core/types.js';\nimport { Provider, type ProviderOptions } from '../Provider.js';\nimport { getModelInfo } from '../../utils/pricing.js';\nimport { generateRequestId } from '../../utils/hashing.js';\n\nconst DEFAULT_GEMINI_MODELS = [\n 'gemini-1.5-pro',\n 'gemini-1.5-pro-latest',\n 'gemini-1.5-flash',\n 'gemini-1.5-flash-latest',\n 'gemini-2.0-flash-exp',\n 'gemini-pro',\n];\n\nexport interface GoogleProviderOptions extends ProviderOptions {\n projectId?: string;\n location?: string;\n}\n\n/**\n * Google Gemini Provider for the gateway\n */\nexport class GoogleProvider extends Provider {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(options: GoogleProviderOptions = {}) {\n const apiKey = options.apiKey || process.env.GOOGLE_API_KEY;\n if (!apiKey) {\n throw new Error('Google API key is required');\n }\n\n const config: ProviderConfig = {\n name: 'google',\n apiKey,\n baseUrl:\n options.baseUrl || 'https://generativelanguage.googleapis.com/v1beta',\n models: options.models || DEFAULT_GEMINI_MODELS,\n timeout: options.timeout || 60000,\n maxRetries: options.maxRetries || 3,\n headers: options.headers,\n };\n\n super(config);\n\n this.apiKey = apiKey;\n this.baseUrl = config.baseUrl!;\n this.timeout = config.timeout!;\n }\n\n /**\n * Execute a chat completion request\n */\n async chat(request: ChatCompletionRequest): Promise<ChatCompletionResponse> {\n const start = Date.now();\n\n try {\n const geminiRequest = this.transformToGemini(request);\n const endpoint = `/models/${request.model}:generateContent`;\n\n const response = await this.makeRequest(endpoint, {\n method: 'POST',\n body: JSON.stringify(geminiRequest),\n });\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw error;\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n const result = this.transformFromGemini(data, request.model);\n\n this.updateHealth(true, Date.now() - start);\n return result;\n } catch (error) {\n this.updateHealth(false, Date.now() - start);\n throw this.wrapError(error);\n }\n }\n\n /**\n * Execute a streaming chat completion request\n */\n async *chatStream(\n request: ChatCompletionRequest,\n ): AsyncGenerator<ChatCompletionChunk, void, unknown> {\n const start = Date.now();\n\n try {\n const geminiRequest = this.transformToGemini(request);\n const endpoint = `/models/${request.model}:streamGenerateContent`;\n\n const response = await this.makeRequest(endpoint, {\n method: 'POST',\n body: JSON.stringify(geminiRequest),\n });\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw error;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new ProviderError('No response body', 'google');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n const requestId = generateRequestId();\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Gemini streams as JSON array with line separators\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === '[' || trimmed === ']' || trimmed === ',')\n continue;\n\n // Handle JSON object potentially with leading/trailing comma\n let jsonStr = trimmed;\n if (jsonStr.startsWith(',')) jsonStr = jsonStr.slice(1);\n if (jsonStr.endsWith(',')) jsonStr = jsonStr.slice(0, -1);\n\n if (!jsonStr.startsWith('{')) continue;\n\n try {\n const data = JSON.parse(jsonStr);\n const chunk = this.transformStreamChunk(\n data,\n request.model,\n requestId,\n );\n\n // Track usage\n if (data.usageMetadata) {\n totalInputTokens = data.usageMetadata.promptTokenCount || 0;\n totalOutputTokens = data.usageMetadata.candidatesTokenCount || 0;\n }\n\n if (chunk) {\n yield chunk;\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n\n // Final chunk with usage\n yield {\n id: requestId,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model: request.model,\n choices: [\n {\n index: 0,\n delta: {},\n finish_reason: 'stop',\n },\n ],\n usage: {\n prompt_tokens: totalInputTokens,\n completion_tokens: totalOutputTokens,\n total_tokens: totalInputTokens + totalOutputTokens,\n },\n };\n\n this.updateHealth(true, Date.now() - start);\n } catch (error) {\n this.updateHealth(false, Date.now() - start);\n throw this.wrapError(error);\n }\n }\n\n /**\n * Get model information\n */\n getModelInfo(model: string): ModelInfo | null {\n if (!this.supportsModel(model)) {\n return null;\n }\n return getModelInfo(model, 'google');\n }\n\n /**\n * Make an HTTP request to the Google API\n */\n private async makeRequest(\n path: string,\n options: RequestInit,\n ): Promise<Response> {\n const url = `${this.baseUrl}${path}?key=${this.apiKey}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.config.headers,\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n return await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Transform OpenAI-compatible request to Gemini format\n */\n private transformToGemini(\n request: ChatCompletionRequest,\n ): Record<string, unknown> {\n const contents = this.transformMessages(request.messages);\n\n const transformed: Record<string, unknown> = {\n contents,\n };\n\n // Generation config\n const generationConfig: Record<string, unknown> = {};\n\n if (request.temperature !== undefined) {\n generationConfig.temperature = request.temperature;\n }\n if (request.max_tokens !== undefined) {\n generationConfig.maxOutputTokens = request.max_tokens;\n }\n if (request.top_p !== undefined) {\n generationConfig.topP = request.top_p;\n }\n if (request.stop !== undefined) {\n generationConfig.stopSequences = Array.isArray(request.stop)\n ? request.stop\n : [request.stop];\n }\n\n if (Object.keys(generationConfig).length > 0) {\n transformed.generationConfig = generationConfig;\n }\n\n // System instruction\n const systemMessages = request.messages.filter((m) => m.role === 'system');\n if (systemMessages.length > 0) {\n const systemText = systemMessages\n .map((m) =>\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n )\n .join('\\n');\n transformed.systemInstruction = { parts: [{ text: systemText }] };\n }\n\n // Tools\n if (request.tools && request.tools.length > 0) {\n transformed.tools = [\n {\n functionDeclarations: request.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters || { type: 'object' },\n })),\n },\n ];\n }\n\n return transformed;\n }\n\n /**\n * Transform messages to Gemini format\n */\n private transformMessages(\n messages: ChatMessage[],\n ): Array<Record<string, unknown>> {\n const contents: Array<Record<string, unknown>> = [];\n\n for (const message of messages) {\n // Skip system messages (handled separately)\n if (message.role === 'system') continue;\n\n const role = message.role === 'assistant' ? 'model' : 'user';\n const parts: Array<Record<string, unknown>> = [];\n\n // Handle text content\n if (message.content) {\n parts.push({\n text:\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content),\n });\n }\n\n // Handle tool calls from assistant\n if (message.tool_calls) {\n for (const toolCall of message.tool_calls) {\n parts.push({\n functionCall: {\n name: toolCall.function.name,\n args: JSON.parse(toolCall.function.arguments),\n },\n });\n }\n }\n\n // Handle tool results\n if (message.role === 'tool' && message.tool_call_id) {\n parts.push({\n functionResponse: {\n name: message.name || 'tool_result',\n response: {\n result:\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content),\n },\n },\n });\n }\n\n if (parts.length > 0) {\n contents.push({ role, parts });\n }\n }\n\n return contents;\n }\n\n /**\n * Transform Gemini response to OpenAI-compatible format\n */\n private transformFromGemini(\n data: Record<string, unknown>,\n model: string,\n ): ChatCompletionResponse {\n const candidates = data.candidates as Array<Record<string, unknown>>;\n const candidate = candidates?.[0];\n\n if (!candidate) {\n throw new ProviderError('No response candidates', 'google');\n }\n\n const content = candidate.content as Record<string, unknown>;\n const parts = (content?.parts as Array<Record<string, unknown>>) || [];\n\n let textContent = '';\n const toolCalls: ChatCompletionResponse['choices'][0]['message']['tool_calls'] =\n [];\n\n for (const part of parts) {\n if (part.text) {\n textContent += part.text as string;\n }\n if (part.functionCall) {\n const fc = part.functionCall as Record<string, unknown>;\n toolCalls.push({\n id: `call_${Math.random().toString(36).substring(2, 11)}`,\n type: 'function',\n function: {\n name: fc.name as string,\n arguments: JSON.stringify(fc.args),\n },\n });\n }\n }\n\n const message: ChatMessage = {\n role: 'assistant',\n content: textContent || null,\n };\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n // Map finish reason\n const finishReason = candidate.finishReason as string;\n let mappedReason: 'stop' | 'length' | 'tool_calls' | null = null;\n if (finishReason === 'STOP') {\n mappedReason = 'stop';\n } else if (finishReason === 'MAX_TOKENS') {\n mappedReason = 'length';\n } else if (toolCalls.length > 0) {\n mappedReason = 'tool_calls';\n }\n\n // Get usage\n const usageMetadata = data.usageMetadata as Record<string, number>;\n const usage = {\n prompt_tokens: usageMetadata?.promptTokenCount || 0,\n completion_tokens: usageMetadata?.candidatesTokenCount || 0,\n total_tokens: usageMetadata?.totalTokenCount || 0,\n };\n\n return {\n id: generateRequestId(),\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n message,\n finish_reason: mappedReason,\n },\n ],\n usage,\n };\n }\n\n /**\n * Transform Gemini stream chunk to OpenAI-compatible format\n */\n private transformStreamChunk(\n data: Record<string, unknown>,\n model: string,\n requestId: string,\n ): ChatCompletionChunk | null {\n const candidates = data.candidates as Array<Record<string, unknown>>;\n const candidate = candidates?.[0];\n\n if (!candidate) {\n return null;\n }\n\n const content = candidate.content as Record<string, unknown>;\n const parts = (content?.parts as Array<Record<string, unknown>>) || [];\n\n let textContent = '';\n for (const part of parts) {\n if (part.text) {\n textContent += part.text as string;\n }\n }\n\n if (!textContent) {\n return null;\n }\n\n return {\n id: requestId,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n delta: {\n content: textContent,\n },\n finish_reason: null,\n },\n ],\n };\n }\n\n /**\n * Parse error response from Google\n */\n private async parseError(response: Response): Promise<ProviderError> {\n let message = `Google API error: ${response.status}`;\n const retryable = response.status >= 500 || response.status === 429;\n\n try {\n const data = (await response.json()) as { error?: { message?: string } };\n if (data.error?.message) {\n message = data.error.message;\n }\n } catch {\n // Use default message\n }\n\n return new ProviderError(message, 'google', undefined, retryable);\n }\n\n /**\n * Wrap unknown errors\n */\n private wrapError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n if (error instanceof Error) {\n const isTimeout =\n error.name === 'AbortError' || error.message.includes('timeout');\n return new ProviderError(error.message, 'google', error, isTimeout);\n }\n\n return new ProviderError('Unknown error', 'google', undefined, true);\n }\n}\n","/**\n * Gateway - Main entry point for the LLM Gateway\n */\n\nimport { EventEmitter } from 'events';\nimport type {\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatCompletionChunk,\n GatewayConfig,\n GatewayMetrics,\n GatewayResponseMetadata,\n RoutingDecision,\n} from './types.js';\nimport { GatewayError, ProviderError, ValidationError } from './types.js';\nimport { ProviderRegistry } from '../providers/ProviderRegistry.js';\nimport { Provider } from '../providers/Provider.js';\nimport { HealthMonitor } from '../providers/ProviderHealth.js';\nimport {\n Router,\n RoundRobinStrategy,\n FailoverStrategy,\n CostOptimizedStrategy,\n LatencyOptimizedStrategy,\n type RoutingContext,\n} from '../routing/index.js';\nimport { calculateCost } from '../utils/pricing.js';\nimport { hashRequest, generateRequestId } from '../utils/hashing.js';\nimport { OpenAIProvider } from '../providers/registry/OpenAIProvider.js';\nimport { AnthropicProvider } from '../providers/registry/AnthropicProvider.js';\nimport { GoogleProvider } from '../providers/registry/GoogleProvider.js';\nimport { LRUCache } from 'lru-cache';\nimport pino from 'pino';\n\nexport interface GatewayEvents {\n 'request:start': (event: {\n requestId: string;\n model: string;\n provider?: string;\n }) => void;\n 'request:complete': (event: {\n requestId: string;\n provider: string;\n model: string;\n latencyMs: number;\n cost: number;\n cached: boolean;\n tokens: { input: number; output: number };\n }) => void;\n 'request:error': (event: {\n requestId: string;\n provider?: string;\n error: Error;\n }) => void;\n 'provider:unhealthy': (provider: string) => void;\n 'provider:healthy': (provider: string) => void;\n}\n\n/**\n * Main Gateway class\n */\nexport class Gateway extends EventEmitter {\n private readonly _config: GatewayConfig;\n private readonly registry: ProviderRegistry;\n private readonly router: Router;\n private readonly healthMonitor: HealthMonitor;\n private readonly cache: LRUCache<string, ChatCompletionResponse> | null;\n private readonly logger: pino.Logger;\n private metrics: GatewayMetrics;\n\n /**\n * Chat completions API interface (OpenAI-compatible)\n */\n public readonly chat = {\n completions: {\n create: this.createCompletion.bind(this),\n },\n };\n\n constructor(config: GatewayConfig) {\n super();\n this._config = config;\n\n // Initialize logger\n this.logger = pino({\n level: config.telemetry?.logging?.level || 'info',\n transport:\n process.env.NODE_ENV !== 'production'\n ? { target: 'pino-pretty' }\n : undefined,\n });\n\n // Initialize provider registry\n this.registry = new ProviderRegistry();\n\n // Register providers from config\n for (const providerConfig of config.providers) {\n const provider = this.createProvider(providerConfig);\n if (provider) {\n this.registry.register(provider);\n }\n }\n\n // Initialize router\n this.router = this.createRouter(config);\n\n // Initialize health monitor\n this.healthMonitor = new HealthMonitor({\n checkInterval: 60000,\n unhealthyThreshold: 3,\n degradedThreshold: 1,\n circuitBreaker: {\n failureThreshold: 5,\n successThreshold: 3,\n timeout: 30000,\n },\n });\n\n // Initialize cache\n if (config.cache?.enabled) {\n this.cache = new LRUCache({\n max: config.cache.maxEntries || 1000,\n ttl: (config.cache.ttl || 3600) * 1000,\n });\n } else {\n this.cache = null;\n }\n\n // Initialize metrics\n this.metrics = this.createInitialMetrics();\n\n // Set up health monitoring events\n this.healthMonitor.on('unhealthy', (provider: string) => {\n this.logger.warn({ provider }, 'Provider marked unhealthy');\n this.emit('provider:unhealthy', provider);\n });\n\n this.healthMonitor.on('circuit-open', (provider: string) => {\n this.logger.warn({ provider }, 'Circuit breaker opened');\n });\n }\n\n /**\n * Create a chat completion (main API)\n */\n async createCompletion(\n request: ChatCompletionRequest,\n ): Promise<ChatCompletionResponse | AsyncGenerator<ChatCompletionChunk>> {\n // Validate request\n this.validateRequest(request);\n\n // Handle streaming\n if (request.stream) {\n return this.createStreamingCompletion(request);\n }\n\n return this.createNonStreamingCompletion(request);\n }\n\n /**\n * Non-streaming completion\n */\n private async createNonStreamingCompletion(\n request: ChatCompletionRequest,\n ): Promise<ChatCompletionResponse> {\n const requestId = request._gateway?.requestId || generateRequestId();\n const start = Date.now();\n\n this.emit('request:start', {\n requestId,\n model: request.model,\n });\n\n try {\n // Check cache\n if (this.cache && request._gateway?.cachePolicy !== 'no-cache') {\n const cacheKey = hashRequest(request);\n const cached = this.cache.get(cacheKey);\n\n if (cached) {\n this.metrics.cache.hits++;\n this.updateCacheHitRate();\n this.logger.debug({ requestId, cacheKey }, 'Cache hit');\n\n const response = {\n ...cached,\n _gateway: {\n ...cached._gateway,\n cached: true,\n cacheKey,\n latencyMs: Date.now() - start,\n } as GatewayResponseMetadata,\n };\n\n this.emit('request:complete', {\n requestId,\n provider: cached._gateway?.provider || 'cache',\n model: cached.model,\n latencyMs: Date.now() - start,\n cost: 0,\n cached: true,\n tokens: { input: 0, output: 0 },\n });\n\n return response;\n }\n\n this.metrics.cache.misses++;\n }\n\n // Route request\n const routingContext: RoutingContext = {\n excludeProviders: request._gateway?.excludeProviders,\n preferredProvider: request._gateway?.preferredProvider,\n maxCost: request._gateway?.maxCost,\n maxLatency: request._gateway?.maxLatency,\n };\n\n let lastError: Error | null = null;\n let attempts = 0;\n const maxAttempts = 3;\n\n while (attempts < maxAttempts) {\n attempts++;\n\n const decision = this.router.route(request, this.registry, {\n ...routingContext,\n previousAttempts:\n attempts > 1\n ? [{ provider: '', model: '', error: lastError?.message }]\n : undefined,\n });\n\n const provider = this.registry.get(decision.provider);\n if (!provider) {\n lastError = new GatewayError(\n `Provider not found: ${decision.provider}`,\n 'PROVIDER_NOT_FOUND',\n 500,\n );\n continue;\n }\n\n // Check circuit breaker\n if (!this.healthMonitor.isRequestAllowed(decision.provider)) {\n this.logger.debug(\n { provider: decision.provider },\n 'Circuit breaker open, skipping',\n );\n routingContext.excludeProviders = [\n ...(routingContext.excludeProviders || []),\n decision.provider,\n ];\n continue;\n }\n\n try {\n // Make the actual request\n const providerRequest = {\n ...request,\n model: decision.model,\n };\n\n const providerStart = Date.now();\n const response = await provider.chat(providerRequest);\n const latencyMs = Date.now() - providerStart;\n\n // Record success\n this.healthMonitor.recordRequest(decision.provider, true, latencyMs);\n\n // Calculate cost\n const cost = calculateCost(decision.model, response.usage);\n\n // Update metrics\n this.updateMetrics(decision, response, latencyMs, cost);\n\n // Add gateway metadata\n const gatewayResponse: ChatCompletionResponse = {\n ...response,\n _gateway: {\n provider: decision.provider,\n originalModel: request.model,\n latencyMs,\n cost,\n cached: false,\n retries: attempts - 1,\n routingDecision: decision,\n },\n };\n\n // Cache the response\n if (this.cache && request._gateway?.cachePolicy !== 'no-cache') {\n const cacheKey = hashRequest(request);\n this.cache.set(cacheKey, gatewayResponse);\n }\n\n this.emit('request:complete', {\n requestId,\n provider: decision.provider,\n model: decision.model,\n latencyMs: Date.now() - start,\n cost,\n cached: false,\n tokens: {\n input: response.usage.prompt_tokens,\n output: response.usage.completion_tokens,\n },\n });\n\n return gatewayResponse;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Record failure\n this.healthMonitor.recordRequest(\n decision.provider,\n false,\n Date.now() - start,\n );\n\n // Check if retryable\n if (error instanceof ProviderError && !error.retryable) {\n throw error;\n }\n\n this.logger.warn(\n {\n provider: decision.provider,\n error: lastError.message,\n attempt: attempts,\n },\n 'Request failed, retrying',\n );\n\n // Add to exclude list for next attempt\n routingContext.excludeProviders = [\n ...(routingContext.excludeProviders || []),\n decision.provider,\n ];\n }\n }\n\n // All attempts failed\n this.metrics.requests.failed++;\n this.emit('request:error', { requestId, error: lastError! });\n throw (\n lastError ||\n new GatewayError('All attempts failed', 'ALL_ATTEMPTS_FAILED', 502)\n );\n } catch (error) {\n this.metrics.requests.failed++;\n this.emit('request:error', {\n requestId,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n throw error;\n }\n }\n\n /**\n * Streaming completion\n */\n private async *createStreamingCompletion(\n request: ChatCompletionRequest,\n ): AsyncGenerator<ChatCompletionChunk, void, unknown> {\n const requestId = request._gateway?.requestId || generateRequestId();\n const start = Date.now();\n\n this.emit('request:start', { requestId, model: request.model });\n\n // Route request\n const decision = this.router.route(request, this.registry, {\n excludeProviders: request._gateway?.excludeProviders,\n preferredProvider: request._gateway?.preferredProvider,\n });\n\n const provider = this.registry.get(decision.provider);\n if (!provider) {\n throw new GatewayError(\n `Provider not found: ${decision.provider}`,\n 'PROVIDER_NOT_FOUND',\n 500,\n );\n }\n\n const providerRequest = { ...request, model: decision.model };\n\n try {\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n for await (const chunk of provider.chatStream(providerRequest)) {\n // Track usage from final chunk\n if (chunk.usage) {\n totalInputTokens = chunk.usage.prompt_tokens;\n totalOutputTokens = chunk.usage.completion_tokens;\n }\n\n yield chunk;\n }\n\n const latencyMs = Date.now() - start;\n const cost = calculateCost(decision.model, {\n prompt_tokens: totalInputTokens,\n completion_tokens: totalOutputTokens,\n total_tokens: totalInputTokens + totalOutputTokens,\n });\n\n this.healthMonitor.recordRequest(decision.provider, true, latencyMs);\n\n this.emit('request:complete', {\n requestId,\n provider: decision.provider,\n model: decision.model,\n latencyMs,\n cost,\n cached: false,\n tokens: { input: totalInputTokens, output: totalOutputTokens },\n });\n } catch (error) {\n this.healthMonitor.recordRequest(\n decision.provider,\n false,\n Date.now() - start,\n );\n this.emit('request:error', {\n requestId,\n provider: decision.provider,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n throw error;\n }\n }\n\n /**\n * Validate a request\n */\n private validateRequest(request: ChatCompletionRequest): void {\n if (!request.model) {\n throw new ValidationError('Model is required');\n }\n\n if (!request.messages || request.messages.length === 0) {\n throw new ValidationError(\n 'Messages array is required and cannot be empty',\n );\n }\n\n for (const message of request.messages) {\n if (!message.role) {\n throw new ValidationError('Message role is required');\n }\n if (!['system', 'user', 'assistant', 'tool'].includes(message.role)) {\n throw new ValidationError(`Invalid message role: ${message.role}`);\n }\n }\n }\n\n /**\n * Create a provider instance from config\n */\n private createProvider(\n config: GatewayConfig['providers'][0],\n ): Provider | null {\n switch (config.name) {\n case 'openai':\n return new OpenAIProvider({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n models: config.models,\n timeout: config.timeout,\n });\n case 'anthropic':\n return new AnthropicProvider({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n models: config.models,\n timeout: config.timeout,\n });\n case 'google':\n return new GoogleProvider({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n models: config.models,\n timeout: config.timeout,\n });\n default:\n this.logger.warn({ provider: config.name }, 'Unknown provider type');\n return null;\n }\n }\n\n /**\n * Create router from config\n */\n private createRouter(config: GatewayConfig): Router {\n const strategyName = config.routing?.strategy || 'round-robin';\n\n let strategy;\n switch (strategyName) {\n case 'failover':\n strategy = new FailoverStrategy({\n chain: config.routing?.fallbackChain || [\n 'openai',\n 'anthropic',\n 'google',\n ],\n });\n break;\n case 'cost-optimized':\n strategy = new CostOptimizedStrategy();\n break;\n case 'latency-optimized':\n strategy = new LatencyOptimizedStrategy();\n break;\n case 'round-robin':\n default:\n strategy = new RoundRobinStrategy({\n weights: config.routing?.weights,\n });\n break;\n }\n\n return new Router(strategy, {\n fallbackChain: config.routing?.fallbackChain,\n });\n }\n\n /**\n * Create initial metrics object\n */\n private createInitialMetrics(): GatewayMetrics {\n return {\n requests: { total: 0, successful: 0, failed: 0, cached: 0 },\n latency: { avg: 0, p50: 0, p95: 0, p99: 0 },\n tokens: { input: 0, output: 0, total: 0 },\n cost: { total: 0, byProvider: {}, byModel: {} },\n cache: { hits: 0, misses: 0, hitRate: 0 },\n providers: {},\n };\n }\n\n /**\n * Update metrics after a request\n */\n private updateMetrics(\n decision: RoutingDecision,\n response: ChatCompletionResponse,\n latencyMs: number,\n cost: number,\n ): void {\n this.metrics.requests.total++;\n this.metrics.requests.successful++;\n\n // Update latency (simple moving average)\n this.metrics.latency.avg =\n (this.metrics.latency.avg * (this.metrics.requests.successful - 1) +\n latencyMs) /\n this.metrics.requests.successful;\n\n // Update tokens\n this.metrics.tokens.input += response.usage.prompt_tokens;\n this.metrics.tokens.output += response.usage.completion_tokens;\n this.metrics.tokens.total += response.usage.total_tokens;\n\n // Update cost\n this.metrics.cost.total += cost;\n this.metrics.cost.byProvider[decision.provider] =\n (this.metrics.cost.byProvider[decision.provider] || 0) + cost;\n this.metrics.cost.byModel[decision.model] =\n (this.metrics.cost.byModel[decision.model] || 0) + cost;\n\n // Update cache hit rate\n this.updateCacheHitRate();\n\n // Update provider health\n this.metrics.providers = this.registry.getHealthStatus();\n }\n\n /**\n * Update cache hit rate metric\n */\n private updateCacheHitRate(): void {\n const totalCacheOps = this.metrics.cache.hits + this.metrics.cache.misses;\n this.metrics.cache.hitRate =\n totalCacheOps > 0 ? this.metrics.cache.hits / totalCacheOps : 0;\n }\n\n /**\n * Get current metrics\n */\n getMetrics(): GatewayMetrics {\n return { ...this.metrics };\n }\n\n /**\n * Get gateway configuration\n */\n getConfig(): GatewayConfig {\n return { ...this._config };\n }\n\n /**\n * Get provider registry\n */\n getRegistry(): ProviderRegistry {\n return this.registry;\n }\n\n /**\n * Get router\n */\n getRouter(): Router {\n return this.router;\n }\n\n /**\n * Check health of all providers\n */\n async checkHealth(): Promise<Record<string, boolean>> {\n const healthStatus = await this.registry.checkHealth();\n const result: Record<string, boolean> = {};\n\n for (const [name, health] of Object.entries(healthStatus)) {\n result[name] = health.status === 'healthy';\n }\n\n return result;\n }\n\n /**\n * Shut down the gateway\n */\n shutdown(): void {\n this.registry.stopHealthChecks();\n this.cache?.clear();\n this.logger.info('Gateway shut down');\n }\n}\n","/**\n * HTTP Server - OpenAI-compatible REST API\n */\n\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { logger } from 'hono/logger';\nimport { streamSSE } from 'hono/streaming';\nimport { serve, type ServerType } from '@hono/node-server';\nimport type { Gateway } from '../core/Gateway.js';\nimport type {\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatCompletionChunk,\n ServerConfig,\n} from '../core/types.js';\nimport { GatewayError, ValidationError } from '../core/types.js';\n\nexport interface HTTPServerOptions extends ServerConfig {\n gateway: Gateway;\n}\n\n/**\n * Creates an OpenAI-compatible HTTP server\n */\nexport function createHTTPServer(options: HTTPServerOptions): Hono {\n const { gateway, basePath = '' } = options;\n\n const app = new Hono();\n\n // Middleware\n app.use('*', logger());\n\n if (options.cors) {\n app.use(\n '*',\n cors({\n origin: options.cors.origin || '*',\n allowMethods: options.cors.methods || ['GET', 'POST', 'OPTIONS'],\n allowHeaders: options.cors.headers || [\n 'Content-Type',\n 'Authorization',\n 'X-Request-Id',\n ],\n }),\n );\n }\n\n // Health check\n app.get(`${basePath}/health`, async (c) => {\n const health = await gateway.checkHealth();\n const allHealthy = Object.values(health).every((h) => h);\n\n return c.json(\n {\n status: allHealthy ? 'healthy' : 'degraded',\n providers: health,\n timestamp: new Date().toISOString(),\n },\n allHealthy ? 200 : 503,\n );\n });\n\n // Metrics endpoint\n app.get(`${basePath}/metrics`, (c) => {\n const metrics = gateway.getMetrics();\n return c.json(metrics);\n });\n\n // Models endpoint (OpenAI-compatible)\n app.get(`${basePath}/v1/models`, (c) => {\n const registry = gateway.getRegistry();\n const models = registry.getAllModels();\n\n const data = models.map((model) => {\n const modelInfo = registry.getModelInfo(model);\n return {\n id: model,\n object: 'model',\n created: Math.floor(Date.now() / 1000),\n owned_by: modelInfo?.provider || 'unknown',\n };\n });\n\n return c.json({\n object: 'list',\n data,\n });\n });\n\n // Chat completions endpoint (OpenAI-compatible)\n app.post(`${basePath}/v1/chat/completions`, async (c) => {\n try {\n const body = await c.req.json<ChatCompletionRequest>();\n\n // Extract request ID from headers if present\n const requestId = c.req.header('X-Request-Id');\n if (requestId) {\n body._gateway = { ...body._gateway, requestId };\n }\n\n // Handle streaming\n if (body.stream) {\n return streamSSE(c, async (stream) => {\n try {\n const generator = (await gateway.chat.completions.create(\n body,\n )) as AsyncGenerator<ChatCompletionChunk>;\n\n for await (const chunk of generator) {\n await stream.writeSSE({\n data: JSON.stringify(chunk),\n });\n }\n\n await stream.writeSSE({ data: '[DONE]' });\n } catch (error) {\n const errorResponse = formatError(error);\n await stream.writeSSE({\n data: JSON.stringify({ error: errorResponse }),\n });\n }\n });\n }\n\n // Non-streaming\n const response = (await gateway.chat.completions.create(\n body,\n )) as ChatCompletionResponse;\n\n return c.json(response);\n } catch (error) {\n const { status, body } = formatError(error);\n return c.json(body, status as 400 | 401 | 429 | 500 | 502 | 503);\n }\n });\n\n // Legacy completions endpoint (redirect to chat)\n app.post(`${basePath}/v1/completions`, (c) => {\n return c.json(\n {\n error: {\n message:\n 'The completions endpoint is deprecated. Please use /v1/chat/completions instead.',\n type: 'invalid_request_error',\n code: 'deprecated_endpoint',\n },\n },\n 400,\n );\n });\n\n // Catch-all for unknown routes\n app.all('*', (c) => {\n return c.json(\n {\n error: {\n message: `Unknown endpoint: ${c.req.method} ${c.req.path}`,\n type: 'invalid_request_error',\n code: 'unknown_endpoint',\n },\n },\n 404,\n );\n });\n\n return app;\n}\n\n/**\n * Start the HTTP server\n */\nexport function startServer(\n app: Hono,\n options: { port?: number; host?: string },\n): ServerType {\n const port = options.port || 3000;\n const host = options.host || '0.0.0.0';\n\n const server = serve({\n fetch: app.fetch,\n port,\n hostname: host,\n });\n\n console.log(`Gateway server running on http://${host}:${port}`);\n\n return server;\n}\n\n/**\n * Format error for API response\n */\nfunction formatError(error: unknown): {\n status: number;\n body: { error: { message: string; type: string; code: string } };\n} {\n // Check for ValidationError\n if (error instanceof ValidationError) {\n return {\n status: 400,\n body: {\n error: {\n message: error.message,\n type: 'invalid_request_error',\n code: error.code,\n },\n },\n };\n }\n\n // Check for GatewayError\n if (error instanceof GatewayError) {\n return {\n status: error.statusCode,\n body: {\n error: {\n message: error.message,\n type: 'gateway_error',\n code: error.code,\n },\n },\n };\n }\n\n // Check for error objects with name property (for duck typing)\n if (error instanceof Error) {\n // Check if it has ValidationError-like properties\n if (\n 'name' in error &&\n error.name === 'ValidationError' &&\n 'code' in error\n ) {\n return {\n status: 400,\n body: {\n error: {\n message: error.message,\n type: 'invalid_request_error',\n code: (error as Error & { code: string }).code,\n },\n },\n };\n }\n\n // Check if it has GatewayError-like properties\n if (\n 'name' in error &&\n error.name === 'GatewayError' &&\n 'statusCode' in error &&\n 'code' in error\n ) {\n return {\n status: (error as Error & { statusCode: number }).statusCode,\n body: {\n error: {\n message: error.message,\n type: 'gateway_error',\n code: (error as Error & { code: string }).code,\n },\n },\n };\n }\n\n // Generic error\n return {\n status: 500,\n body: {\n error: {\n message: error.message,\n type: 'internal_error',\n code: 'internal_error',\n },\n },\n };\n }\n\n return {\n status: 500,\n body: {\n error: {\n message: 'An unknown error occurred',\n type: 'internal_error',\n code: 'unknown_error',\n },\n },\n };\n}\n","/**\n * Metrics collection and reporting\n */\n\nimport type { GatewayMetrics } from '../core/types.js';\n\nexport interface MetricsConfig {\n prefix?: string;\n labels?: string[];\n histogramBuckets?: {\n latency?: number[];\n tokens?: number[];\n };\n}\n\nexport interface HistogramData {\n count: number;\n sum: number;\n buckets: Map<number, number>;\n}\n\n/**\n * Simple in-memory metrics collector\n */\nexport class MetricsCollector {\n private readonly prefix: string;\n private counters: Map<string, number> = new Map();\n private gauges: Map<string, number> = new Map();\n private histograms: Map<string, HistogramData> = new Map();\n private readonly latencyBuckets: number[];\n private readonly tokenBuckets: number[];\n\n constructor(config: MetricsConfig = {}) {\n this.prefix = config.prefix || 'agentsea_gateway';\n this.latencyBuckets = config.histogramBuckets?.latency || [\n 50, 100, 250, 500, 1000, 2500, 5000, 10000,\n ];\n this.tokenBuckets = config.histogramBuckets?.tokens || [\n 100, 500, 1000, 2000, 5000, 10000, 50000,\n ];\n }\n\n /**\n * Get token histogram buckets\n */\n getTokenBuckets(): number[] {\n return [...this.tokenBuckets];\n }\n\n /**\n * Increment a counter\n */\n incrementCounter(\n name: string,\n value: number = 1,\n labels?: Record<string, string>,\n ): void {\n const key = this.formatKey(name, labels);\n const current = this.counters.get(key) || 0;\n this.counters.set(key, current + value);\n }\n\n /**\n * Set a gauge value\n */\n setGauge(name: string, value: number, labels?: Record<string, string>): void {\n const key = this.formatKey(name, labels);\n this.gauges.set(key, value);\n }\n\n /**\n * Record a histogram observation\n */\n recordHistogram(\n name: string,\n value: number,\n labels?: Record<string, string>,\n buckets?: number[],\n ): void {\n const key = this.formatKey(name, labels);\n let histogram = this.histograms.get(key);\n\n if (!histogram) {\n histogram = {\n count: 0,\n sum: 0,\n buckets: new Map(),\n };\n // Initialize buckets\n const bucketsToUse = buckets || this.latencyBuckets;\n for (const bucket of bucketsToUse) {\n histogram.buckets.set(bucket, 0);\n }\n histogram.buckets.set(Infinity, 0);\n this.histograms.set(key, histogram);\n }\n\n histogram.count++;\n histogram.sum += value;\n\n // Update bucket counts\n for (const [bucket, count] of histogram.buckets) {\n if (value <= bucket) {\n histogram.buckets.set(bucket, count + 1);\n }\n }\n }\n\n /**\n * Record request metrics\n */\n recordRequest(data: {\n provider: string;\n model: string;\n status: 'success' | 'error';\n latencyMs: number;\n inputTokens: number;\n outputTokens: number;\n cost: number;\n cached: boolean;\n }): void {\n const labels = { provider: data.provider, model: data.model };\n\n // Request count\n this.incrementCounter('requests_total', 1, {\n ...labels,\n status: data.status,\n cached: String(data.cached),\n });\n\n // Latency histogram\n this.recordHistogram('request_latency_ms', data.latencyMs, labels);\n\n // Token counters\n this.incrementCounter('tokens_input_total', data.inputTokens, labels);\n this.incrementCounter('tokens_output_total', data.outputTokens, labels);\n\n // Cost counter (in microdollars for precision)\n this.incrementCounter(\n 'cost_microdollars_total',\n Math.round(data.cost * 1_000_000),\n labels,\n );\n\n // Cache metrics\n if (data.cached) {\n this.incrementCounter('cache_hits_total', 1);\n }\n }\n\n /**\n * Get counter value\n */\n getCounter(name: string, labels?: Record<string, string>): number {\n const key = this.formatKey(name, labels);\n return this.counters.get(key) || 0;\n }\n\n /**\n * Get gauge value\n */\n getGauge(name: string, labels?: Record<string, string>): number {\n const key = this.formatKey(name, labels);\n return this.gauges.get(key) || 0;\n }\n\n /**\n * Get histogram data\n */\n getHistogram(\n name: string,\n labels?: Record<string, string>,\n ): HistogramData | undefined {\n const key = this.formatKey(name, labels);\n return this.histograms.get(key);\n }\n\n /**\n * Get all metrics as a summary object\n */\n getSummary(): GatewayMetrics {\n const requestsTotal = this.sumAllCounters('requests_total');\n const requestsSuccess = this.sumCountersByLabel(\n 'requests_total',\n 'status',\n 'success',\n );\n const requestsError = this.sumCountersByLabel(\n 'requests_total',\n 'status',\n 'error',\n );\n const requestsCached = this.sumCountersByLabel(\n 'requests_total',\n 'cached',\n 'true',\n );\n\n const latencyHistogram = this.aggregateHistograms('request_latency_ms');\n const avgLatency =\n latencyHistogram.count > 0\n ? latencyHistogram.sum / latencyHistogram.count\n : 0;\n\n const inputTokens = this.sumAllCounters('tokens_input_total');\n const outputTokens = this.sumAllCounters('tokens_output_total');\n\n const totalCostMicro = this.sumAllCounters('cost_microdollars_total');\n\n const cacheHits = this.getCounter('cache_hits_total');\n const cacheMisses = requestsTotal - cacheHits;\n\n return {\n requests: {\n total: requestsTotal,\n successful: requestsSuccess,\n failed: requestsError,\n cached: requestsCached,\n },\n latency: {\n avg: avgLatency,\n p50: this.calculatePercentile('request_latency_ms', 0.5),\n p95: this.calculatePercentile('request_latency_ms', 0.95),\n p99: this.calculatePercentile('request_latency_ms', 0.99),\n },\n tokens: {\n input: inputTokens,\n output: outputTokens,\n total: inputTokens + outputTokens,\n },\n cost: {\n total: totalCostMicro / 1_000_000,\n byProvider: this.getCostByLabel('provider'),\n byModel: this.getCostByLabel('model'),\n },\n cache: {\n hits: cacheHits,\n misses: cacheMisses,\n hitRate: requestsTotal > 0 ? cacheHits / requestsTotal : 0,\n },\n providers: {},\n };\n }\n\n /**\n * Export metrics in Prometheus format\n */\n toPrometheusFormat(): string {\n const lines: string[] = [];\n\n // Counters\n for (const [key, value] of this.counters) {\n lines.push(`${this.prefix}_${key} ${value}`);\n }\n\n // Gauges\n for (const [key, value] of this.gauges) {\n lines.push(`${this.prefix}_${key} ${value}`);\n }\n\n // Histograms\n for (const [key, histogram] of this.histograms) {\n for (const [bucket, count] of histogram.buckets) {\n const le = bucket === Infinity ? '+Inf' : bucket;\n lines.push(`${this.prefix}_${key}_bucket{le=\"${le}\"} ${count}`);\n }\n lines.push(`${this.prefix}_${key}_sum ${histogram.sum}`);\n lines.push(`${this.prefix}_${key}_count ${histogram.count}`);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Reset all metrics\n */\n reset(): void {\n this.counters.clear();\n this.gauges.clear();\n this.histograms.clear();\n }\n\n /**\n * Format metric key with labels\n */\n private formatKey(name: string, labels?: Record<string, string>): string {\n if (!labels || Object.keys(labels).length === 0) {\n return name;\n }\n const labelStr = Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(',');\n return `${name}{${labelStr}}`;\n }\n\n /**\n * Sum counters by a specific label value\n */\n private sumCountersByLabel(\n name: string,\n labelKey: string,\n labelValue: string,\n ): number {\n let sum = 0;\n for (const [key, value] of this.counters) {\n if (key.startsWith(name) && key.includes(`${labelKey}=\"${labelValue}\"`)) {\n sum += value;\n }\n }\n return sum;\n }\n\n /**\n * Sum all counters with a given name prefix\n */\n private sumAllCounters(namePrefix: string): number {\n let sum = 0;\n for (const [key, value] of this.counters) {\n if (key.startsWith(namePrefix)) {\n sum += value;\n }\n }\n return sum;\n }\n\n /**\n * Get cost breakdown by label\n */\n private getCostByLabel(labelKey: string): Record<string, number> {\n const result: Record<string, number> = {};\n const prefix = 'cost_microdollars_total';\n\n for (const [key, value] of this.counters) {\n if (key.startsWith(prefix)) {\n const match = key.match(new RegExp(`${labelKey}=\"([^\"]+)\"`));\n if (match) {\n const labelValue = match[1];\n result[labelValue] = (result[labelValue] || 0) + value / 1_000_000;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Aggregate histograms for a metric name\n */\n private aggregateHistograms(name: string): HistogramData {\n const result: HistogramData = {\n count: 0,\n sum: 0,\n buckets: new Map(),\n };\n\n for (const [key, histogram] of this.histograms) {\n if (key.startsWith(name)) {\n result.count += histogram.count;\n result.sum += histogram.sum;\n for (const [bucket, count] of histogram.buckets) {\n const existing = result.buckets.get(bucket) || 0;\n result.buckets.set(bucket, existing + count);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Calculate percentile from histogram (approximate)\n */\n private calculatePercentile(name: string, percentile: number): number {\n const histogram = this.aggregateHistograms(name);\n\n if (histogram.count === 0) return 0;\n\n // Sort by bucket boundary\n const sortedBuckets = Array.from(histogram.buckets.entries()).sort(\n ([a], [b]) => a - b,\n );\n\n const targetCount = histogram.count * percentile;\n let prevBucket = 0;\n let prevCount = 0;\n\n for (const [bucket, count] of sortedBuckets) {\n if (count >= targetCount) {\n // Found the bucket containing our percentile\n // Linear interpolation within this bucket\n const bucketRange = bucket - prevBucket;\n const bucketCount = count - prevCount; // Values in this bucket\n\n if (bucketCount === 0) {\n return prevBucket;\n }\n\n const positionInBucket = targetCount - prevCount;\n const fraction = positionInBucket / bucketCount;\n return prevBucket + bucketRange * Math.max(0, Math.min(1, fraction));\n }\n prevBucket = bucket;\n prevCount = count;\n }\n\n return prevBucket;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/types.ts","../src/providers/ProviderRegistry.ts","../src/providers/ProviderHealth.ts","../src/routing/Router.ts","../src/routing/strategies/RoundRobin.ts","../src/routing/strategies/Failover.ts","../src/utils/tokenizer.ts","../src/routing/strategies/CostOptimized.ts","../src/routing/strategies/LatencyOptimized.ts","../src/utils/pricing.ts","../src/utils/hashing.ts","../src/providers/Provider.ts","../src/providers/registry/OpenAIProvider.ts","../src/providers/registry/AnthropicProvider.ts","../src/providers/registry/GoogleProvider.ts","../src/core/Gateway.ts","../src/server/HTTPServer.ts","../src/telemetry/Metrics.ts"],"names":["cheapest","fastest","model","selected","EventEmitter"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Core types for the AgentSea Gateway\n */\n\n// ============================================================================\n// Message Types (OpenAI-compatible)\n// ============================================================================\n\nexport interface ChatMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string | ContentPart[] | null;\n name?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n}\n\nexport interface ContentPart {\n type: 'text' | 'image_url';\n text?: string;\n image_url?: {\n url: string;\n detail?: 'auto' | 'low' | 'high';\n };\n}\n\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface Tool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n };\n}\n\n// ============================================================================\n// Request Types\n// ============================================================================\n\nexport interface ChatCompletionRequest {\n model: string;\n messages: ChatMessage[];\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n stop?: string | string[];\n stream?: boolean;\n tools?: Tool[];\n tool_choice?:\n | 'none'\n | 'auto'\n | 'required'\n | { type: 'function'; function: { name: string } };\n response_format?: { type: 'text' | 'json_object' };\n seed?: number;\n user?: string;\n // Gateway-specific metadata\n _gateway?: GatewayRequestMetadata;\n}\n\nexport interface GatewayRequestMetadata {\n tenantId?: string;\n requestId?: string;\n routingHint?: string; // Common values: 'cheapest', 'fastest', 'best'\n preferredProvider?: string;\n excludeProviders?: string[];\n maxCost?: number;\n maxLatency?: number;\n cachePolicy?: 'default' | 'no-cache' | 'force-cache';\n tags?: Record<string, string>;\n}\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\nexport interface ChatCompletionResponse {\n id: string;\n object: 'chat.completion';\n created: number;\n model: string;\n choices: ChatCompletionChoice[];\n usage: UsageInfo;\n system_fingerprint?: string;\n // Gateway-specific metadata\n _gateway?: GatewayResponseMetadata;\n}\n\nexport interface ChatCompletionChoice {\n index: number;\n message: ChatMessage;\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;\n logprobs?: unknown;\n}\n\nexport interface UsageInfo {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\nexport interface GatewayResponseMetadata {\n provider: string;\n originalModel: string;\n latencyMs: number;\n cost: number;\n cached: boolean;\n cacheKey?: string;\n retries: number;\n routingDecision?: RoutingDecision;\n}\n\n// ============================================================================\n// Streaming Types\n// ============================================================================\n\nexport interface ChatCompletionChunk {\n id: string;\n object: 'chat.completion.chunk';\n created: number;\n model: string;\n choices: ChatCompletionChunkChoice[];\n system_fingerprint?: string;\n usage?: UsageInfo;\n}\n\nexport interface ChatCompletionChunkChoice {\n index: number;\n delta: Partial<ChatMessage>;\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;\n logprobs?: unknown;\n}\n\n// ============================================================================\n// Provider Types\n// ============================================================================\n\nexport interface ProviderConfig {\n name: string;\n apiKey?: string;\n baseUrl?: string;\n models: string[];\n timeout?: number;\n maxRetries?: number;\n headers?: Record<string, string>;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ProviderHealth {\n status: 'healthy' | 'degraded' | 'unhealthy';\n latencyMs: number;\n lastCheck: Date;\n errorRate: number;\n consecutiveFailures: number;\n}\n\nexport interface ModelInfo {\n id: string;\n provider: string;\n contextWindow: number;\n maxOutputTokens: number;\n inputPricePerMillion: number;\n outputPricePerMillion: number;\n capabilities: ModelCapabilities;\n}\n\nexport interface ModelCapabilities {\n streaming: boolean;\n tools: boolean;\n vision: boolean;\n json_mode: boolean;\n system_prompts: boolean;\n}\n\n// ============================================================================\n// Routing Types\n// ============================================================================\n\nexport type RoutingStrategy =\n | 'round-robin'\n | 'failover'\n | 'cost-optimized'\n | 'latency-optimized'\n | 'load-balanced'\n | 'conditional';\n\nexport interface RoutingDecision {\n provider: string;\n model: string;\n reason: string;\n alternatives: Array<{ provider: string; model: string; score: number }>;\n timestamp: Date;\n}\n\nexport interface RouterConfig {\n strategy: RoutingStrategy;\n fallbackChain?: string[];\n weights?: Record<string, number>;\n rules?: RoutingRule[];\n}\n\nexport interface RoutingRule {\n condition: (request: ChatCompletionRequest) => boolean;\n route: string;\n reason: string;\n}\n\n// ============================================================================\n// Cache Types\n// ============================================================================\n\nexport interface CacheConfig {\n enabled: boolean;\n ttl: number;\n maxEntries: number;\n type: 'exact' | 'semantic';\n similarityThreshold?: number;\n}\n\nexport interface CacheEntry {\n key: string;\n response: ChatCompletionResponse;\n createdAt: Date;\n expiresAt: Date;\n hits: number;\n metadata: Record<string, unknown>;\n}\n\nexport interface CacheStats {\n hits: number;\n misses: number;\n hitRate: number;\n size: number;\n evictions: number;\n}\n\n// ============================================================================\n// Rate Limit Types\n// ============================================================================\n\nexport interface RateLimitConfig {\n requestsPerMinute?: number;\n requestsPerHour?: number;\n requestsPerDay?: number;\n tokensPerMinute?: number;\n tokensPerDay?: number;\n maxConcurrent?: number;\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n remaining: number;\n reset: Date;\n limit: number;\n retryAfter?: number;\n}\n\n// ============================================================================\n// Telemetry Types\n// ============================================================================\n\nexport interface TelemetryConfig {\n metrics?: boolean;\n tracing?: boolean;\n logging?: {\n level: 'debug' | 'info' | 'warn' | 'error';\n redact?: string[];\n };\n}\n\nexport interface GatewayMetrics {\n requests: {\n total: number;\n successful: number;\n failed: number;\n cached: number;\n };\n latency: {\n avg: number;\n p50: number;\n p95: number;\n p99: number;\n };\n tokens: {\n input: number;\n output: number;\n total: number;\n };\n cost: {\n total: number;\n byProvider: Record<string, number>;\n byModel: Record<string, number>;\n };\n cache: {\n hits: number;\n misses: number;\n hitRate: number;\n };\n providers: Record<string, ProviderHealth>;\n}\n\n// ============================================================================\n// Gateway Configuration\n// ============================================================================\n\nexport interface GatewayConfig {\n providers: ProviderConfig[];\n routing?: RouterConfig;\n cache?: CacheConfig;\n rateLimit?:\n | RateLimitConfig\n | { default: RateLimitConfig; perTenant?: boolean };\n telemetry?: TelemetryConfig;\n auth?: AuthConfig;\n server?: ServerConfig;\n}\n\nexport interface AuthConfig {\n type: 'api-key' | 'jwt' | 'none';\n keys?: string[];\n jwtSecret?: string;\n validateTenant?: (tenantId: string) => Promise<boolean>;\n}\n\nexport interface ServerConfig {\n port?: number;\n host?: string;\n cors?: {\n origin?: string | string[];\n methods?: string[];\n headers?: string[];\n };\n basePath?: string;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\nexport class GatewayError extends Error {\n constructor(\n message: string,\n public code: string,\n public statusCode: number = 500,\n public provider?: string,\n public retryable: boolean = false,\n ) {\n super(message);\n this.name = 'GatewayError';\n }\n}\n\nexport class ProviderError extends GatewayError {\n constructor(\n message: string,\n provider: string,\n public originalError?: Error,\n retryable: boolean = true,\n ) {\n super(message, 'PROVIDER_ERROR', 502, provider, retryable);\n this.name = 'ProviderError';\n }\n}\n\nexport class RateLimitError extends GatewayError {\n constructor(\n message: string,\n public retryAfter: number,\n provider?: string,\n ) {\n super(message, 'RATE_LIMIT_EXCEEDED', 429, provider, true);\n this.name = 'RateLimitError';\n }\n}\n\nexport class AuthenticationError extends GatewayError {\n constructor(message: string) {\n super(message, 'AUTHENTICATION_FAILED', 401, undefined, false);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class ValidationError extends GatewayError {\n constructor(message: string) {\n super(message, 'VALIDATION_ERROR', 400, undefined, false);\n this.name = 'ValidationError';\n }\n}\n","/**\n * Provider Registry - manages all LLM providers\n */\n\nimport type { ProviderHealth, ModelInfo } from '../core/types.js';\nimport type { Provider } from './Provider.js';\n\nexport interface ProviderWithModels {\n provider: Provider;\n models: string[];\n}\n\n/**\n * Registry for managing LLM providers\n */\nexport class ProviderRegistry {\n private providers: Map<string, Provider> = new Map();\n private modelToProvider: Map<string, string[]> = new Map();\n private healthCheckInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(providers: Provider[] = []) {\n for (const provider of providers) {\n this.register(provider);\n }\n }\n\n /**\n * Register a provider\n */\n register(provider: Provider): void {\n this.providers.set(provider.name, provider);\n\n // Map models to this provider\n for (const model of provider.getModels()) {\n const existing = this.modelToProvider.get(model) || [];\n if (!existing.includes(provider.name)) {\n existing.push(provider.name);\n this.modelToProvider.set(model, existing);\n }\n }\n }\n\n /**\n * Unregister a provider\n */\n unregister(name: string): boolean {\n const provider = this.providers.get(name);\n if (!provider) {\n return false;\n }\n\n // Remove model mappings\n for (const model of provider.getModels()) {\n const providers = this.modelToProvider.get(model);\n if (providers) {\n const filtered = providers.filter((p) => p !== name);\n if (filtered.length > 0) {\n this.modelToProvider.set(model, filtered);\n } else {\n this.modelToProvider.delete(model);\n }\n }\n }\n\n this.providers.delete(name);\n return true;\n }\n\n /**\n * Get a provider by name\n */\n get(name: string): Provider | undefined {\n return this.providers.get(name);\n }\n\n /**\n * Get all registered providers\n */\n getAll(): Provider[] {\n return Array.from(this.providers.values());\n }\n\n /**\n * Get all provider names\n */\n getNames(): string[] {\n return Array.from(this.providers.keys());\n }\n\n /**\n * Get providers that support a specific model\n */\n getProvidersForModel(model: string): Provider[] {\n const names = this.modelToProvider.get(model) || [];\n return names\n .map((name) => this.providers.get(name))\n .filter((p): p is Provider => p !== undefined);\n }\n\n /**\n * Get the first available provider for a model\n */\n getProviderForModel(model: string): Provider | undefined {\n const providers = this.getProvidersForModel(model);\n return providers.find((p) => p.isAvailable());\n }\n\n /**\n * Check if any provider supports a model\n */\n hasModel(model: string): boolean {\n return this.modelToProvider.has(model);\n }\n\n /**\n * Get all available models across all providers\n */\n getAllModels(): string[] {\n return Array.from(this.modelToProvider.keys());\n }\n\n /**\n * Get model info from the appropriate provider\n */\n getModelInfo(model: string): ModelInfo | null {\n const provider = this.getProviderForModel(model);\n return provider?.getModelInfo(model) ?? null;\n }\n\n /**\n * Get health status for all providers\n */\n getHealthStatus(): Record<string, ProviderHealth> {\n const status: Record<string, ProviderHealth> = {};\n for (const [name, provider] of this.providers) {\n status[name] = provider.getHealth();\n }\n return status;\n }\n\n /**\n * Get healthy providers\n */\n getHealthyProviders(): Provider[] {\n return this.getAll().filter((p) => p.isHealthy());\n }\n\n /**\n * Get available providers (healthy or degraded)\n */\n getAvailableProviders(): Provider[] {\n return this.getAll().filter((p) => p.isAvailable());\n }\n\n /**\n * Run health checks on all providers\n */\n async checkHealth(): Promise<Record<string, ProviderHealth>> {\n const results: Record<string, ProviderHealth> = {};\n\n await Promise.all(\n this.getAll().map(async (provider) => {\n results[provider.name] = await provider.healthCheck();\n }),\n );\n\n return results;\n }\n\n /**\n * Start periodic health checks\n */\n startHealthChecks(intervalMs: number = 60000): void {\n if (this.healthCheckInterval) {\n return;\n }\n\n this.healthCheckInterval = setInterval(() => {\n this.checkHealth().catch(console.error);\n }, intervalMs);\n }\n\n /**\n * Stop periodic health checks\n */\n stopHealthChecks(): void {\n if (this.healthCheckInterval) {\n clearInterval(this.healthCheckInterval);\n this.healthCheckInterval = null;\n }\n }\n\n /**\n * Get the number of registered providers\n */\n get size(): number {\n return this.providers.size;\n }\n}\n","/**\n * Provider Health monitoring and circuit breaker\n */\n\nimport type { ProviderHealth } from '../core/types.js';\nimport { EventEmitter } from 'events';\n\nexport type CircuitState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerConfig {\n failureThreshold: number;\n successThreshold: number;\n timeout: number;\n volumeThreshold?: number;\n}\n\nexport interface HealthMonitorConfig {\n checkInterval: number;\n unhealthyThreshold: number;\n degradedThreshold: number;\n circuitBreaker?: CircuitBreakerConfig;\n}\n\n/**\n * Circuit breaker for a single provider\n */\nexport class CircuitBreaker {\n private state: CircuitState = 'closed';\n private failures: number = 0;\n private successes: number = 0;\n private lastFailure: Date | null = null;\n private nextAttempt: Date | null = null;\n\n constructor(\n private readonly providerName: string,\n private readonly config: CircuitBreakerConfig,\n ) {}\n\n /**\n * Check if requests are allowed\n */\n isAllowed(): boolean {\n if (this.state === 'closed') {\n return true;\n }\n\n if (this.state === 'open') {\n // Check if timeout has passed\n if (this.nextAttempt && new Date() >= this.nextAttempt) {\n this.state = 'half-open';\n return true;\n }\n return false;\n }\n\n // half-open: allow limited requests\n return true;\n }\n\n /**\n * Record a successful request\n */\n recordSuccess(): void {\n if (this.state === 'half-open') {\n this.successes++;\n if (this.successes >= this.config.successThreshold) {\n this.reset();\n }\n } else if (this.state === 'closed') {\n // Reset failure count on success\n this.failures = Math.max(0, this.failures - 1);\n }\n }\n\n /**\n * Record a failed request\n */\n recordFailure(): void {\n this.failures++;\n this.lastFailure = new Date();\n\n if (this.state === 'half-open') {\n this.trip();\n } else if (\n this.state === 'closed' &&\n this.failures >= this.config.failureThreshold\n ) {\n this.trip();\n }\n }\n\n /**\n * Trip the circuit breaker (open it)\n */\n private trip(): void {\n this.state = 'open';\n this.nextAttempt = new Date(Date.now() + this.config.timeout);\n this.successes = 0;\n }\n\n /**\n * Reset the circuit breaker\n */\n reset(): void {\n this.state = 'closed';\n this.failures = 0;\n this.successes = 0;\n this.nextAttempt = null;\n }\n\n /**\n * Get the current state\n */\n getState(): CircuitState {\n return this.state;\n }\n\n /**\n * Get circuit status\n */\n getStatus(): {\n providerName: string;\n state: CircuitState;\n failures: number;\n nextAttempt: Date | null;\n lastFailure: Date | null;\n } {\n return {\n providerName: this.providerName,\n state: this.state,\n failures: this.failures,\n nextAttempt: this.nextAttempt,\n lastFailure: this.lastFailure,\n };\n }\n}\n\n/**\n * Health monitor for tracking provider health over time\n */\nexport class HealthMonitor extends EventEmitter {\n private healthHistory: Map<string, ProviderHealth[]> = new Map();\n private circuitBreakers: Map<string, CircuitBreaker> = new Map();\n private readonly maxHistorySize = 100;\n\n constructor(private readonly config: HealthMonitorConfig) {\n super();\n }\n\n /**\n * Record a health check result\n */\n recordHealth(providerName: string, health: ProviderHealth): void {\n const history = this.healthHistory.get(providerName) || [];\n history.push(health);\n\n // Keep only recent history\n if (history.length > this.maxHistorySize) {\n history.shift();\n }\n\n this.healthHistory.set(providerName, history);\n\n // Emit events based on health changes\n if (health.status === 'unhealthy') {\n this.emit('unhealthy', providerName, health);\n } else if (health.status === 'degraded') {\n this.emit('degraded', providerName, health);\n }\n }\n\n /**\n * Record a request result\n */\n recordRequest(\n providerName: string,\n success: boolean,\n _latencyMs: number,\n ): void {\n const breaker = this.getOrCreateCircuitBreaker(providerName);\n\n if (success) {\n breaker.recordSuccess();\n } else {\n breaker.recordFailure();\n\n // Check if circuit was just opened\n if (breaker.getState() === 'open') {\n this.emit('circuit-open', providerName);\n }\n }\n }\n\n /**\n * Check if requests are allowed for a provider\n */\n isRequestAllowed(providerName: string): boolean {\n const breaker = this.circuitBreakers.get(providerName);\n return breaker ? breaker.isAllowed() : true;\n }\n\n /**\n * Get or create a circuit breaker for a provider\n */\n private getOrCreateCircuitBreaker(providerName: string): CircuitBreaker {\n let breaker = this.circuitBreakers.get(providerName);\n if (!breaker && this.config.circuitBreaker) {\n breaker = new CircuitBreaker(providerName, this.config.circuitBreaker);\n this.circuitBreakers.set(providerName, breaker);\n }\n return (\n breaker ||\n new CircuitBreaker(providerName, {\n failureThreshold: 5,\n successThreshold: 3,\n timeout: 30000,\n })\n );\n }\n\n /**\n * Get health history for a provider\n */\n getHistory(providerName: string): ProviderHealth[] {\n return this.healthHistory.get(providerName) || [];\n }\n\n /**\n * Get average latency for a provider\n */\n getAverageLatency(providerName: string): number {\n const history = this.healthHistory.get(providerName) || [];\n if (history.length === 0) return 0;\n\n const sum = history.reduce((acc, h) => acc + h.latencyMs, 0);\n return sum / history.length;\n }\n\n /**\n * Get error rate for a provider\n */\n getErrorRate(providerName: string): number {\n const history = this.healthHistory.get(providerName) || [];\n if (history.length === 0) return 0;\n\n const lastHealth = history[history.length - 1];\n return lastHealth.errorRate;\n }\n\n /**\n * Get circuit breaker status for a provider\n */\n getCircuitStatus(\n providerName: string,\n ): ReturnType<CircuitBreaker['getStatus']> | null {\n const breaker = this.circuitBreakers.get(providerName);\n return breaker ? breaker.getStatus() : null;\n }\n\n /**\n * Get all circuit breaker statuses\n */\n getAllCircuitStatuses(): Record<\n string,\n ReturnType<CircuitBreaker['getStatus']>\n > {\n const statuses: Record<\n string,\n ReturnType<CircuitBreaker['getStatus']>\n > = {};\n for (const [name, breaker] of this.circuitBreakers) {\n statuses[name] = breaker.getStatus();\n }\n return statuses;\n }\n\n /**\n * Reset circuit breaker for a provider\n */\n resetCircuit(providerName: string): void {\n const breaker = this.circuitBreakers.get(providerName);\n if (breaker) {\n breaker.reset();\n this.emit('circuit-reset', providerName);\n }\n }\n\n /**\n * Clear all history\n */\n clear(): void {\n this.healthHistory.clear();\n this.circuitBreakers.clear();\n }\n}\n","/**\n * Router - orchestrates routing decisions\n */\n\nimport type {\n ChatCompletionRequest,\n RoutingDecision,\n RouterConfig,\n RoutingStrategy,\n} from '../core/types.js';\nimport type { ProviderRegistry } from '../providers/ProviderRegistry.js';\nimport type { Provider } from '../providers/Provider.js';\n\n/**\n * Base interface for routing strategies\n */\nexport interface RoutingStrategyInterface {\n /**\n * Name of the strategy\n */\n readonly name: RoutingStrategy;\n\n /**\n * Select a provider and model for a request\n */\n route(\n request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision;\n}\n\n/**\n * Context passed to routing strategies\n */\nexport interface RoutingContext {\n excludeProviders?: string[];\n preferredProvider?: string;\n maxCost?: number;\n maxLatency?: number;\n previousAttempts?: Array<{ provider: string; model: string; error?: string }>;\n}\n\n/**\n * Model mapping for cross-provider routing\n */\nexport interface ModelMapping {\n [model: string]: Array<{ provider: string; model: string }>;\n}\n\n// Default model mappings (equivalents across providers)\nexport const DEFAULT_MODEL_MAPPINGS: ModelMapping = {\n // Flagship class\n 'gpt-5.5': [\n { provider: 'anthropic', model: 'claude-sonnet-4-6' },\n { provider: 'google', model: 'gemini-3.1-pro-preview' },\n ],\n 'claude-sonnet-4-6': [\n { provider: 'openai', model: 'gpt-5.5' },\n { provider: 'google', model: 'gemini-3.1-pro-preview' },\n ],\n 'gemini-3.1-pro-preview': [\n { provider: 'openai', model: 'gpt-5.5' },\n { provider: 'anthropic', model: 'claude-sonnet-4-6' },\n ],\n // Mini / fast class\n 'gpt-5.4-mini': [\n { provider: 'anthropic', model: 'claude-haiku-4-5' },\n { provider: 'google', model: 'gemini-3.5-flash' },\n ],\n 'claude-haiku-4-5': [\n { provider: 'openai', model: 'gpt-5.4-mini' },\n { provider: 'google', model: 'gemini-3.5-flash' },\n ],\n 'gemini-3.5-flash': [\n { provider: 'openai', model: 'gpt-5.4-mini' },\n { provider: 'anthropic', model: 'claude-haiku-4-5' },\n ],\n};\n\n/**\n * Virtual model names that get routed\n */\nexport const VIRTUAL_MODELS = ['best', 'cheapest', 'fastest'] as const;\nexport type VirtualModel = (typeof VIRTUAL_MODELS)[number];\n\n/**\n * Router class that manages routing strategies\n */\nexport class Router {\n private strategy: RoutingStrategyInterface;\n private modelMappings: ModelMapping;\n private fallbackChain: string[];\n\n constructor(\n strategy: RoutingStrategyInterface,\n config?: {\n modelMappings?: ModelMapping;\n fallbackChain?: string[];\n },\n ) {\n this.strategy = strategy;\n this.modelMappings = {\n ...DEFAULT_MODEL_MAPPINGS,\n ...config?.modelMappings,\n };\n this.fallbackChain = config?.fallbackChain || [\n 'openai',\n 'anthropic',\n 'google',\n ];\n }\n\n /**\n * Route a request to a provider\n */\n route(\n request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision {\n // Handle virtual models\n if (this.isVirtualModel(request.model)) {\n return this.routeVirtualModel(request.model, request, registry, context);\n }\n\n // Use strategy for routing\n return this.strategy.route(request, registry, context);\n }\n\n /**\n * Check if a model is a virtual model\n */\n isVirtualModel(model: string): model is VirtualModel {\n return VIRTUAL_MODELS.includes(model as VirtualModel);\n }\n\n /**\n * Route virtual model to actual provider/model\n */\n private routeVirtualModel(\n virtualModel: VirtualModel,\n _request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision {\n const availableProviders = registry\n .getAvailableProviders()\n .filter((p) => !context?.excludeProviders?.includes(p.name));\n\n if (availableProviders.length === 0) {\n throw new Error('No available providers');\n }\n\n switch (virtualModel) {\n case 'best':\n return this.routeBest(availableProviders, context);\n case 'cheapest':\n return this.routeCheapest(availableProviders, context);\n case 'fastest':\n return this.routeFastest(availableProviders, context);\n default:\n throw new Error(`Unknown virtual model: ${String(virtualModel)}`);\n }\n }\n\n /**\n * Route to best quality model\n */\n private routeBest(\n providers: Provider[],\n context?: RoutingContext,\n ): RoutingDecision {\n // Quality ranking (subjective based on typical usage)\n const qualityRanking: Record<string, number> = {\n 'claude-opus-4-8': 97,\n 'claude-sonnet-4-6': 95,\n 'claude-haiku-4-5': 88,\n 'gpt-5.5': 94,\n 'gpt-5.4-mini': 87,\n 'gemini-3.1-pro-preview': 92,\n 'gemini-3.5-flash': 86,\n o1: 96,\n 'o1-preview': 95,\n };\n\n const candidates: Array<{\n provider: string;\n model: string;\n score: number;\n }> = [];\n\n for (const provider of providers) {\n for (const model of provider.getModels()) {\n const score = qualityRanking[model] || 50;\n candidates.push({\n provider: provider.name,\n model,\n score,\n });\n }\n }\n\n // Sort by quality score (highest first)\n candidates.sort((a, b) => b.score - a.score);\n\n // Apply preferences\n if (context?.preferredProvider) {\n const preferred = candidates.find(\n (c) => c.provider === context.preferredProvider,\n );\n if (preferred) {\n return {\n provider: preferred.provider,\n model: preferred.model,\n reason: `Best quality model from preferred provider`,\n alternatives: candidates.slice(0, 3),\n timestamp: new Date(),\n };\n }\n }\n\n const best = candidates[0];\n return {\n provider: best.provider,\n model: best.model,\n reason: `Highest quality model available`,\n alternatives: candidates.slice(1, 4),\n timestamp: new Date(),\n };\n }\n\n /**\n * Route to cheapest model\n */\n private routeCheapest(\n providers: Provider[],\n context?: RoutingContext,\n ): RoutingDecision {\n const candidates: Array<{\n provider: string;\n model: string;\n score: number;\n }> = [];\n\n for (const provider of providers) {\n for (const model of provider.getModels()) {\n const modelInfo = provider.getModelInfo(model);\n const avgCost = modelInfo\n ? (modelInfo.inputPricePerMillion + modelInfo.outputPricePerMillion) /\n 2\n : Infinity;\n\n candidates.push({\n provider: provider.name,\n model,\n score: avgCost === 0 ? 0 : 1 / avgCost, // Higher score = cheaper\n });\n }\n }\n\n // Sort by score (highest = cheapest)\n candidates.sort((a, b) => b.score - a.score);\n\n // Check max cost constraint\n if (context?.maxCost !== undefined) {\n const filtered = candidates.filter((c) => {\n const provider = providers.find((p) => p.name === c.provider);\n const modelInfo = provider?.getModelInfo(c.model);\n if (!modelInfo) return true;\n // Rough cost estimate for 1000 input + 500 output tokens\n const estimatedCost =\n (1000 / 1_000_000) * modelInfo.inputPricePerMillion +\n (500 / 1_000_000) * modelInfo.outputPricePerMillion;\n return estimatedCost <= context.maxCost!;\n });\n\n if (filtered.length > 0) {\n const cheapest = filtered[0];\n return {\n provider: cheapest.provider,\n model: cheapest.model,\n reason: `Cheapest model within budget`,\n alternatives: filtered.slice(1, 4),\n timestamp: new Date(),\n };\n }\n }\n\n const cheapest = candidates[0];\n return {\n provider: cheapest.provider,\n model: cheapest.model,\n reason: `Cheapest available model`,\n alternatives: candidates.slice(1, 4),\n timestamp: new Date(),\n };\n }\n\n /**\n * Route to fastest model (based on latency)\n */\n private routeFastest(\n providers: Provider[],\n context?: RoutingContext,\n ): RoutingDecision {\n const candidates: Array<{\n provider: string;\n model: string;\n score: number;\n }> = [];\n\n for (const provider of providers) {\n const health = provider.getHealth();\n const latency = health.latencyMs || 1000; // Default 1s if unknown\n\n for (const model of provider.getModels()) {\n candidates.push({\n provider: provider.name,\n model,\n score: 1 / latency, // Higher score = lower latency\n });\n }\n }\n\n // Sort by score (highest = fastest)\n candidates.sort((a, b) => b.score - a.score);\n\n // Check max latency constraint\n if (context?.maxLatency !== undefined) {\n const filtered = candidates.filter((c) => {\n const provider = providers.find((p) => p.name === c.provider);\n const health = provider?.getHealth();\n return (health?.latencyMs || 1000) <= context.maxLatency!;\n });\n\n if (filtered.length > 0) {\n const fastest = filtered[0];\n return {\n provider: fastest.provider,\n model: fastest.model,\n reason: `Fastest model within latency limit`,\n alternatives: filtered.slice(1, 4),\n timestamp: new Date(),\n };\n }\n }\n\n const fastest = candidates[0];\n return {\n provider: fastest.provider,\n model: fastest.model,\n reason: `Fastest available provider`,\n alternatives: candidates.slice(1, 4),\n timestamp: new Date(),\n };\n }\n\n /**\n * Get equivalent models across providers\n */\n getEquivalentModels(\n model: string,\n ): Array<{ provider: string; model: string }> {\n return this.modelMappings[model] || [];\n }\n\n /**\n * Set the routing strategy\n */\n setStrategy(strategy: RoutingStrategyInterface): void {\n this.strategy = strategy;\n }\n\n /**\n * Get the current strategy name\n */\n getStrategyName(): RoutingStrategy {\n return this.strategy.name;\n }\n\n /**\n * Get the fallback chain\n */\n getFallbackChain(): string[] {\n return [...this.fallbackChain];\n }\n}\n\n/**\n * Create router configuration from options\n */\nexport function createRouterConfig(\n options: Partial<RouterConfig>,\n): RouterConfig {\n return {\n strategy: options.strategy || 'round-robin',\n fallbackChain: options.fallbackChain,\n weights: options.weights,\n rules: options.rules,\n };\n}\n","/**\n * Round-robin routing strategy\n */\n\nimport type {\n ChatCompletionRequest,\n RoutingDecision,\n} from '../../core/types.js';\nimport type { ProviderRegistry } from '../../providers/ProviderRegistry.js';\nimport type { RoutingStrategyInterface, RoutingContext } from '../Router.js';\n\nexport interface RoundRobinConfig {\n weights?: Record<string, number>;\n}\n\n/**\n * Round-robin routing strategy\n * Distributes requests evenly across providers\n */\nexport class RoundRobinStrategy implements RoutingStrategyInterface {\n readonly name = 'round-robin' as const;\n private currentIndex = 0;\n private weights: Record<string, number>;\n\n constructor(config: RoundRobinConfig = {}) {\n this.weights = config.weights || {};\n }\n\n route(\n request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision {\n // Get providers that support the requested model\n let providers = registry.getProvidersForModel(request.model);\n\n // If no providers support the model, get all available providers\n if (providers.length === 0) {\n providers = registry.getAvailableProviders();\n }\n\n // Filter out excluded providers\n if (context?.excludeProviders) {\n providers = providers.filter(\n (p) => !context.excludeProviders!.includes(p.name),\n );\n }\n\n // Filter to only available providers\n providers = providers.filter((p) => p.isAvailable());\n\n if (providers.length === 0) {\n throw new Error(`No available providers for model: ${request.model}`);\n }\n\n // Prefer the preferred provider if specified and available\n if (context?.preferredProvider) {\n const preferred = providers.find(\n (p) => p.name === context.preferredProvider,\n );\n if (preferred) {\n const model = preferred.supportsModel(request.model)\n ? request.model\n : preferred.getModels()[0];\n\n return {\n provider: preferred.name,\n model,\n reason: 'Preferred provider selected',\n alternatives: providers\n .filter((p) => p.name !== preferred.name)\n .slice(0, 3)\n .map((p) => ({\n provider: p.name,\n model: p.supportsModel(request.model)\n ? request.model\n : p.getModels()[0],\n score: 1,\n })),\n timestamp: new Date(),\n };\n }\n }\n\n // Build weighted list\n const weightedProviders: Array<{\n provider: (typeof providers)[0];\n weight: number;\n }> = [];\n for (const provider of providers) {\n const weight = this.weights[provider.name] || 1;\n for (let i = 0; i < weight; i++) {\n weightedProviders.push({ provider, weight });\n }\n }\n\n // Select next provider in rotation\n this.currentIndex = this.currentIndex % weightedProviders.length;\n const selected = weightedProviders[this.currentIndex];\n this.currentIndex++;\n\n const model = selected.provider.supportsModel(request.model)\n ? request.model\n : selected.provider.getModels()[0];\n\n return {\n provider: selected.provider.name,\n model,\n reason: `Round-robin selection (index: ${this.currentIndex - 1})`,\n alternatives: providers\n .filter((p) => p.name !== selected.provider.name)\n .slice(0, 3)\n .map((p) => ({\n provider: p.name,\n model: p.supportsModel(request.model)\n ? request.model\n : p.getModels()[0],\n score: 1,\n })),\n timestamp: new Date(),\n };\n }\n\n /**\n * Reset the rotation index\n */\n reset(): void {\n this.currentIndex = 0;\n }\n}\n","/**\n * Failover routing strategy\n */\n\nimport type {\n ChatCompletionRequest,\n RoutingDecision,\n} from '../../core/types.js';\nimport type { ProviderRegistry } from '../../providers/ProviderRegistry.js';\nimport type { RoutingStrategyInterface, RoutingContext } from '../Router.js';\n\nexport interface FailoverConfig {\n /**\n * Ordered list of providers to try\n */\n chain: string[];\n\n /**\n * Model mappings for fallback\n */\n modelMappings?: Record<string, Record<string, string>>;\n}\n\n/**\n * Failover routing strategy\n * Tries providers in order until one succeeds\n */\nexport class FailoverStrategy implements RoutingStrategyInterface {\n readonly name = 'failover' as const;\n private chain: string[];\n private modelMappings: Record<string, Record<string, string>>;\n\n constructor(config: FailoverConfig) {\n this.chain = config.chain;\n this.modelMappings = config.modelMappings || {};\n }\n\n route(\n request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision {\n // Get previous attempts to skip\n const previousProviders = new Set(\n context?.previousAttempts?.map((a) => a.provider) || [],\n );\n\n // Add excluded providers\n if (context?.excludeProviders) {\n for (const p of context.excludeProviders) {\n previousProviders.add(p);\n }\n }\n\n // Find first available provider in chain\n const alternatives: RoutingDecision['alternatives'] = [];\n\n for (const providerName of this.chain) {\n const provider = registry.get(providerName);\n if (!provider) continue;\n if (!provider.isAvailable()) continue;\n if (previousProviders.has(providerName)) continue;\n\n // Find the model to use\n let model = request.model;\n if (!provider.supportsModel(model)) {\n // Try to find a mapped model\n const mappedModel = this.modelMappings[model]?.[providerName];\n if (mappedModel && provider.supportsModel(mappedModel)) {\n model = mappedModel;\n } else {\n // Use first available model\n model = provider.getModels()[0];\n }\n }\n\n // Build alternatives from remaining chain\n for (const altName of this.chain) {\n if (altName === providerName) continue;\n if (previousProviders.has(altName)) continue;\n\n const altProvider = registry.get(altName);\n if (!altProvider?.isAvailable()) continue;\n\n let altModel = request.model;\n if (!altProvider.supportsModel(altModel)) {\n altModel =\n this.modelMappings[request.model]?.[altName] ||\n altProvider.getModels()[0];\n }\n\n alternatives.push({\n provider: altName,\n model: altModel,\n score: 1 - alternatives.length * 0.1,\n });\n\n if (alternatives.length >= 3) break;\n }\n\n return {\n provider: providerName,\n model,\n reason:\n previousProviders.size > 0\n ? `Failover to ${providerName} after ${previousProviders.size} failures`\n : `Primary provider in failover chain`,\n alternatives,\n timestamp: new Date(),\n };\n }\n\n // No providers available\n throw new Error(\n `All providers in failover chain exhausted: ${this.chain.join(', ')}`,\n );\n }\n\n /**\n * Get the next provider in chain after the given one\n */\n getNextProvider(currentProvider: string): string | null {\n const index = this.chain.indexOf(currentProvider);\n if (index === -1 || index >= this.chain.length - 1) {\n return null;\n }\n return this.chain[index + 1];\n }\n\n /**\n * Get the current failover chain\n */\n getChain(): string[] {\n return [...this.chain];\n }\n\n /**\n * Update the failover chain\n */\n setChain(chain: string[]): void {\n this.chain = [...chain];\n }\n}\n","/**\n * Token counting utilities using tiktoken\n */\n\nimport { get_encoding, type Tiktoken } from 'tiktoken';\n\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nlet encoder: Tiktoken | null = null;\n\n/**\n * Get or create the tiktoken encoder\n */\nfunction getEncoder(): Tiktoken {\n if (!encoder) {\n // Use cl100k_base encoding (used by GPT-4, GPT-3.5-turbo, and text-embedding models)\n encoder = get_encoding('cl100k_base');\n }\n return encoder;\n}\n\n/**\n * Count tokens in a string\n */\nexport function countTokens(text: string): number {\n try {\n const enc = getEncoder();\n return enc.encode(text).length;\n } catch {\n // Fallback: rough estimate (4 chars per token)\n return Math.ceil(text.length / 4);\n }\n}\n\n/**\n * Count tokens in messages array\n */\nexport function countMessageTokens(\n messages: Array<{ role: string; content: unknown }>,\n): number {\n let total = 0;\n\n for (const message of messages) {\n // Add tokens for role (approximately 4 tokens per message for formatting)\n total += 4;\n\n // Add content tokens\n if (message.content) {\n total += countTokens(\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content),\n );\n }\n }\n\n // Add 2 tokens for the assistant reply priming\n total += 2;\n\n return total;\n}\n\n/**\n * Estimate tokens for a request (messages + tools)\n */\nexport function estimateRequestTokens(\n messages: Array<{ role: string; content: unknown }>,\n tools?: Array<{\n function: { name: string; description?: string; parameters?: unknown };\n }>,\n): number {\n let total = countMessageTokens(messages);\n\n // Add tool definitions (rough estimate)\n if (tools && tools.length > 0) {\n for (const tool of tools) {\n total += countTokens(tool.function.name);\n if (tool.function.description) {\n total += countTokens(tool.function.description);\n }\n if (tool.function.parameters) {\n total += countTokens(JSON.stringify(tool.function.parameters));\n }\n // Add overhead per tool\n total += 10;\n }\n }\n\n return total;\n}\n\n/**\n * Truncate text to fit within token limit\n */\nexport function truncateToTokenLimit(text: string, maxTokens: number): string {\n const enc = getEncoder();\n const tokens = enc.encode(text);\n\n if (tokens.length <= maxTokens) {\n return text;\n }\n\n const truncatedTokens = tokens.slice(0, maxTokens);\n const decoded = enc.decode(truncatedTokens);\n return new TextDecoder().decode(decoded);\n}\n\n/**\n * Free the encoder resources (call on shutdown)\n */\nexport function freeEncoder(): void {\n if (encoder) {\n encoder.free();\n encoder = null;\n }\n}\n","/**\n * Cost-optimized routing strategy\n */\n\nimport type {\n ChatCompletionRequest,\n RoutingDecision,\n} from '../../core/types.js';\nimport type { ProviderRegistry } from '../../providers/ProviderRegistry.js';\nimport type { RoutingStrategyInterface, RoutingContext } from '../Router.js';\nimport { estimateRequestTokens } from '../../utils/tokenizer.js';\n\nexport interface CostOptimizedConfig {\n /**\n * Maximum cost per request (in dollars)\n */\n maxCostPerRequest?: number;\n\n /**\n * Prefer local models (e.g., Ollama) when available\n */\n preferLocal?: boolean;\n\n /**\n * Minimum quality threshold (0-1)\n */\n qualityThreshold?: number;\n\n /**\n * Fallback behavior when over budget\n */\n fallbackOnBudget?: 'cheapest' | 'error';\n}\n\n// Quality scores for models (subjective, 0-100)\nconst MODEL_QUALITY_SCORES: Record<string, number> = {\n // Top tier\n o1: 96,\n 'o1-preview': 94,\n 'claude-opus-4-8': 98,\n 'claude-sonnet-4-6': 95,\n 'gpt-5.5': 95,\n 'gemini-3.1-pro-preview': 93,\n\n // Mid tier\n 'o1-mini': 84,\n\n // Fast/cheap tier\n 'gpt-5.4-mini': 82,\n 'claude-haiku-4-5': 81,\n 'gemini-3.5-flash': 80,\n 'gemini-3.1-flash-lite': 74,\n\n // Local models\n llama3: 65,\n 'llama3.1': 67,\n 'llama3.2': 68,\n mistral: 62,\n};\n\n/**\n * Cost-optimized routing strategy\n * Selects the cheapest provider that meets quality requirements\n */\nexport class CostOptimizedStrategy implements RoutingStrategyInterface {\n readonly name = 'cost-optimized' as const;\n private config: CostOptimizedConfig;\n\n constructor(config: CostOptimizedConfig = {}) {\n this.config = {\n preferLocal: false,\n qualityThreshold: 0.6,\n fallbackOnBudget: 'cheapest',\n ...config,\n };\n }\n\n route(\n request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision {\n // Get all available providers\n let providers = registry.getAvailableProviders();\n\n // Filter out excluded providers\n if (context?.excludeProviders) {\n providers = providers.filter(\n (p) => !context.excludeProviders!.includes(p.name),\n );\n }\n\n if (providers.length === 0) {\n throw new Error('No available providers');\n }\n\n // Estimate request tokens for cost calculation\n const estimatedInputTokens = estimateRequestTokens(\n request.messages,\n request.tools,\n );\n const estimatedOutputTokens = request.max_tokens || 1000;\n\n // Build candidates with cost and quality info\n const candidates: Array<{\n provider: string;\n model: string;\n cost: number;\n quality: number;\n isLocal: boolean;\n }> = [];\n\n for (const provider of providers) {\n const isLocal =\n provider.name === 'ollama' || provider.name === 'lmstudio';\n\n for (const model of provider.getModels()) {\n const modelInfo = provider.getModelInfo(model);\n if (!modelInfo) continue;\n\n // Calculate estimated cost\n const inputCost =\n (estimatedInputTokens / 1_000_000) * modelInfo.inputPricePerMillion;\n const outputCost =\n (estimatedOutputTokens / 1_000_000) * modelInfo.outputPricePerMillion;\n const totalCost = inputCost + outputCost;\n\n // Get quality score\n const quality = (MODEL_QUALITY_SCORES[model] || 50) / 100;\n\n candidates.push({\n provider: provider.name,\n model,\n cost: totalCost,\n quality,\n isLocal,\n });\n }\n }\n\n // Filter by quality threshold\n const minQuality = this.config.qualityThreshold || 0;\n let filtered = candidates.filter((c) => c.quality >= minQuality);\n\n // If no candidates meet quality threshold, use all\n if (filtered.length === 0) {\n filtered = candidates;\n }\n\n // Filter by max cost if specified\n const maxCost = context?.maxCost ?? this.config.maxCostPerRequest;\n if (maxCost !== undefined) {\n const withinBudget = filtered.filter((c) => c.cost <= maxCost);\n if (withinBudget.length > 0) {\n filtered = withinBudget;\n } else if (this.config.fallbackOnBudget === 'error') {\n throw new Error(`No models within budget of $${maxCost.toFixed(4)}`);\n }\n // Otherwise fall through to use cheapest available\n }\n\n // Sort by cost (cheapest first), then by local preference\n filtered.sort((a, b) => {\n if (this.config.preferLocal) {\n if (a.isLocal && !b.isLocal) return -1;\n if (!a.isLocal && b.isLocal) return 1;\n }\n return a.cost - b.cost;\n });\n\n const selected = filtered[0];\n\n return {\n provider: selected.provider,\n model: selected.model,\n reason: `Cheapest model meeting quality threshold (${(selected.quality * 100).toFixed(0)}% quality, $${selected.cost.toFixed(6)}/req)`,\n alternatives: filtered.slice(1, 4).map((c) => ({\n provider: c.provider,\n model: c.model,\n score: 1 / (c.cost + 0.0001), // Higher score = cheaper\n })),\n timestamp: new Date(),\n };\n }\n\n /**\n * Update configuration\n */\n setConfig(config: Partial<CostOptimizedConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): CostOptimizedConfig {\n return { ...this.config };\n }\n}\n","/**\n * Latency-optimized routing strategy\n */\n\nimport type {\n ChatCompletionRequest,\n RoutingDecision,\n} from '../../core/types.js';\nimport type { ProviderRegistry } from '../../providers/ProviderRegistry.js';\nimport type { RoutingStrategyInterface, RoutingContext } from '../Router.js';\n\nexport interface LatencyOptimizedConfig {\n /**\n * Maximum acceptable latency in milliseconds\n */\n maxLatencyMs?: number;\n\n /**\n * Number of requests to collect before adapting routing\n */\n warmupRequests?: number;\n\n /**\n * Enable adaptive routing based on observed latencies\n */\n adaptiveRouting?: boolean;\n}\n\ninterface LatencyStats {\n count: number;\n total: number;\n min: number;\n max: number;\n avg: number;\n p95: number;\n samples: number[];\n}\n\n/**\n * Latency-optimized routing strategy\n * Selects the fastest provider based on observed latencies\n */\nexport class LatencyOptimizedStrategy implements RoutingStrategyInterface {\n readonly name = 'latency-optimized' as const;\n private config: LatencyOptimizedConfig;\n private latencyStats: Map<string, LatencyStats> = new Map();\n private readonly maxSamples = 100;\n\n constructor(config: LatencyOptimizedConfig = {}) {\n this.config = {\n warmupRequests: 10,\n adaptiveRouting: true,\n ...config,\n };\n }\n\n route(\n request: ChatCompletionRequest,\n registry: ProviderRegistry,\n context?: RoutingContext,\n ): RoutingDecision {\n // Get all available providers\n let providers = registry.getAvailableProviders();\n\n // Filter out excluded providers\n if (context?.excludeProviders) {\n providers = providers.filter(\n (p) => !context.excludeProviders!.includes(p.name),\n );\n }\n\n if (providers.length === 0) {\n throw new Error('No available providers');\n }\n\n // Check if we're still in warmup phase\n const totalRequests = Array.from(this.latencyStats.values()).reduce(\n (sum, stats) => sum + stats.count,\n 0,\n );\n const warmupThreshold = this.config.warmupRequests ?? 10;\n const isWarmup = warmupThreshold > 0 && totalRequests < warmupThreshold;\n\n // Build candidates with latency info\n const candidates: Array<{\n provider: string;\n model: string;\n latency: number;\n confidence: number;\n }> = [];\n\n for (const provider of providers) {\n // Get latency from stats or health check\n const stats = this.latencyStats.get(provider.name);\n const health = provider.getHealth();\n\n let latency: number;\n let confidence: number;\n\n if (stats && stats.count >= 5 && this.config.adaptiveRouting) {\n // Use observed latency with exponential moving average\n latency = stats.avg;\n confidence = Math.min(stats.count / 50, 1);\n } else {\n // Use health check latency or default\n latency = health.latencyMs || 1000;\n confidence = 0.3;\n }\n\n for (const model of provider.getModels()) {\n // Skip models that don't match the request if specific model requested\n if (\n request.model !== 'fastest' &&\n !provider.supportsModel(request.model) &&\n model !== request.model\n ) {\n continue;\n }\n\n candidates.push({\n provider: provider.name,\n model:\n request.model !== 'fastest' && provider.supportsModel(request.model)\n ? request.model\n : model,\n latency,\n confidence,\n });\n\n // Only add one entry per provider\n break;\n }\n }\n\n // Filter by max latency if specified\n const maxLatency = context?.maxLatency ?? this.config.maxLatencyMs;\n let filtered = candidates;\n if (maxLatency !== undefined) {\n const withinLimit = candidates.filter((c) => c.latency <= maxLatency);\n if (withinLimit.length > 0) {\n filtered = withinLimit;\n }\n }\n\n // Sort by latency (fastest first)\n filtered.sort((a, b) => a.latency - b.latency);\n\n // During warmup, occasionally try different providers (exploration)\n // When exploring, we randomly select from top 3 providers instead of always picking the fastest\n const shouldExplore =\n isWarmup && Math.random() < 0.3 && filtered.length > 1;\n\n if (shouldExplore) {\n const randomIndex = Math.floor(\n Math.random() * Math.min(3, filtered.length),\n );\n const selected = filtered[randomIndex];\n\n return {\n provider: selected.provider,\n model: selected.model,\n reason: `Warmup exploration (${totalRequests}/${warmupThreshold} requests)`,\n alternatives: filtered\n .filter((c) => c.provider !== selected.provider)\n .slice(0, 3)\n .map((c) => ({\n provider: c.provider,\n model: c.model,\n score: 1 / c.latency,\n })),\n timestamp: new Date(),\n };\n }\n\n const selected = filtered[0];\n\n return {\n provider: selected.provider,\n model: selected.model,\n reason: `Fastest provider (${selected.latency.toFixed(0)}ms avg, ${(selected.confidence * 100).toFixed(0)}% confidence)`,\n alternatives: filtered.slice(1, 4).map((c) => ({\n provider: c.provider,\n model: c.model,\n score: 1 / c.latency,\n })),\n timestamp: new Date(),\n };\n }\n\n /**\n * Record a latency observation\n */\n recordLatency(provider: string, latencyMs: number): void {\n let stats = this.latencyStats.get(provider);\n\n if (!stats) {\n stats = {\n count: 0,\n total: 0,\n min: Infinity,\n max: 0,\n avg: 0,\n p95: 0,\n samples: [],\n };\n this.latencyStats.set(provider, stats);\n }\n\n stats.count++;\n stats.total += latencyMs;\n stats.min = Math.min(stats.min, latencyMs);\n stats.max = Math.max(stats.max, latencyMs);\n\n // Keep samples for percentile calculation\n stats.samples.push(latencyMs);\n if (stats.samples.length > this.maxSamples) {\n stats.samples.shift();\n }\n\n // Calculate exponential moving average\n const alpha = 0.2; // Smoothing factor\n if (stats.count === 1) {\n stats.avg = latencyMs;\n } else {\n stats.avg = alpha * latencyMs + (1 - alpha) * stats.avg;\n }\n\n // Calculate p95\n if (stats.samples.length >= 20) {\n const sorted = [...stats.samples].sort((a, b) => a - b);\n const p95Index = Math.floor(sorted.length * 0.95);\n stats.p95 = sorted[p95Index];\n }\n }\n\n /**\n * Get latency statistics for a provider\n */\n getStats(provider: string): LatencyStats | undefined {\n return this.latencyStats.get(provider);\n }\n\n /**\n * Get all latency statistics\n */\n getAllStats(): Record<string, LatencyStats> {\n const result: Record<string, LatencyStats> = {};\n for (const [provider, stats] of this.latencyStats) {\n result[provider] = { ...stats, samples: [...stats.samples] };\n }\n return result;\n }\n\n /**\n * Clear latency statistics\n */\n clearStats(): void {\n this.latencyStats.clear();\n }\n\n /**\n * Update configuration\n */\n setConfig(config: Partial<LatencyOptimizedConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n","/**\n * Model pricing data and cost calculation utilities\n */\n\nimport type { ModelInfo, UsageInfo } from '../core/types.js';\n\n// Pricing per million tokens (as of December 2024)\nexport const MODEL_PRICING: Record<string, { input: number; output: number }> =\n {\n // OpenAI Models\n 'gpt-5.5': { input: 5.0, output: 30.0 },\n 'gpt-5.4-mini': { input: 0.75, output: 4.5 },\n // OpenAI Models (legacy)\n 'gpt-4o': { input: 2.5, output: 10.0 },\n 'gpt-4o-2024-11-20': { input: 2.5, output: 10.0 },\n 'gpt-4o-mini': { input: 0.15, output: 0.6 },\n 'gpt-4o-mini-2024-07-18': { input: 0.15, output: 0.6 },\n 'gpt-4-turbo': { input: 10.0, output: 30.0 },\n 'gpt-4-turbo-preview': { input: 10.0, output: 30.0 },\n 'gpt-4': { input: 30.0, output: 60.0 },\n 'gpt-4-32k': { input: 60.0, output: 120.0 },\n 'gpt-3.5-turbo': { input: 0.5, output: 1.5 },\n 'gpt-3.5-turbo-0125': { input: 0.5, output: 1.5 },\n o1: { input: 15.0, output: 60.0 },\n 'o1-preview': { input: 15.0, output: 60.0 },\n 'o1-mini': { input: 3.0, output: 12.0 },\n\n // Anthropic Models\n 'claude-opus-4-8': { input: 5.0, output: 25.0 },\n 'claude-sonnet-4-6': { input: 3.0, output: 15.0 },\n 'claude-haiku-4-5': { input: 1.0, output: 5.0 },\n // Anthropic Models (retired — kept for historical cost lookups)\n 'claude-3-5-sonnet-20241022': { input: 3.0, output: 15.0 },\n 'claude-3-5-sonnet-latest': { input: 3.0, output: 15.0 },\n 'claude-sonnet-4-20250514': { input: 3.0, output: 15.0 },\n 'claude-3-5-haiku-20241022': { input: 0.8, output: 4.0 },\n 'claude-3-haiku-20240307': { input: 0.25, output: 1.25 },\n 'claude-3-opus-20240229': { input: 15.0, output: 75.0 },\n 'claude-3-sonnet-20240229': { input: 3.0, output: 15.0 },\n\n // Google Gemini Models\n 'gemini-3.1-pro-preview': { input: 2.0, output: 12.0 },\n 'gemini-3.5-flash': { input: 1.5, output: 9.0 },\n // Google Gemini Models (legacy)\n 'gemini-1.5-pro': { input: 1.25, output: 5.0 },\n 'gemini-1.5-pro-latest': { input: 1.25, output: 5.0 },\n 'gemini-1.5-flash': { input: 0.075, output: 0.3 },\n 'gemini-1.5-flash-latest': { input: 0.075, output: 0.3 },\n 'gemini-2.0-flash-exp': { input: 0.1, output: 0.4 },\n 'gemini-pro': { input: 0.5, output: 1.5 },\n\n // Mistral Models\n 'mistral-large-latest': { input: 2.0, output: 6.0 },\n 'mistral-medium-latest': { input: 2.7, output: 8.1 },\n 'mistral-small-latest': { input: 0.2, output: 0.6 },\n 'open-mistral-7b': { input: 0.25, output: 0.25 },\n 'open-mixtral-8x7b': { input: 0.7, output: 0.7 },\n 'open-mixtral-8x22b': { input: 2.0, output: 6.0 },\n\n // Cohere Models\n 'command-r-plus': { input: 2.5, output: 10.0 },\n 'command-r': { input: 0.5, output: 1.5 },\n command: { input: 1.0, output: 2.0 },\n\n // Groq Models (significantly cheaper)\n 'llama-3.3-70b-versatile': { input: 0.59, output: 0.79 },\n 'llama-3.1-70b-versatile': { input: 0.59, output: 0.79 },\n 'llama-3.1-8b-instant': { input: 0.05, output: 0.08 },\n 'mixtral-8x7b-32768': { input: 0.24, output: 0.24 },\n\n // Together AI Models\n 'meta-llama/Llama-3.3-70B-Instruct-Turbo': { input: 0.88, output: 0.88 },\n 'meta-llama/Llama-3.1-70B-Instruct-Turbo': { input: 0.88, output: 0.88 },\n 'meta-llama/Llama-3.1-8B-Instruct-Turbo': { input: 0.18, output: 0.18 },\n 'mistralai/Mixtral-8x7B-Instruct-v0.1': { input: 0.6, output: 0.6 },\n\n // Local models (free)\n llama3: { input: 0, output: 0 },\n 'llama3.1': { input: 0, output: 0 },\n 'llama3.2': { input: 0, output: 0 },\n mistral: { input: 0, output: 0 },\n codellama: { input: 0, output: 0 },\n phi3: { input: 0, output: 0 },\n 'qwen2.5': { input: 0, output: 0 },\n };\n\n// Model context windows\nexport const MODEL_CONTEXT_WINDOWS: Record<string, number> = {\n // OpenAI\n 'gpt-5.5': 1050000,\n 'gpt-5.4-mini': 400000,\n 'gpt-4o': 128000,\n 'gpt-4o-mini': 128000,\n 'gpt-4-turbo': 128000,\n 'gpt-4': 8192,\n 'gpt-4-32k': 32768,\n 'gpt-3.5-turbo': 16385,\n o1: 200000,\n 'o1-preview': 128000,\n 'o1-mini': 128000,\n\n // Anthropic\n 'claude-opus-4-8': 1000000,\n 'claude-sonnet-4-6': 1000000,\n 'claude-haiku-4-5': 200000,\n 'claude-3-5-sonnet-20241022': 200000,\n 'claude-sonnet-4-20250514': 200000,\n 'claude-3-5-haiku-20241022': 200000,\n 'claude-3-opus-20240229': 200000,\n 'claude-3-sonnet-20240229': 200000,\n 'claude-3-haiku-20240307': 200000,\n\n // Google\n 'gemini-3.1-pro-preview': 1048576,\n 'gemini-3.5-flash': 1048576,\n 'gemini-1.5-pro': 2000000,\n 'gemini-1.5-flash': 1000000,\n 'gemini-2.0-flash-exp': 1000000,\n 'gemini-pro': 32000,\n\n // Mistral\n 'mistral-large-latest': 128000,\n 'mistral-medium-latest': 32000,\n 'mistral-small-latest': 32000,\n\n // Groq\n 'llama-3.3-70b-versatile': 128000,\n 'llama-3.1-70b-versatile': 131072,\n 'llama-3.1-8b-instant': 131072,\n 'mixtral-8x7b-32768': 32768,\n};\n\n// Model max output tokens\nexport const MODEL_MAX_OUTPUT: Record<string, number> = {\n // OpenAI\n 'gpt-5.5': 128000,\n 'gpt-5.4-mini': 128000,\n 'gpt-4o': 16384,\n 'gpt-4o-mini': 16384,\n 'gpt-4-turbo': 4096,\n 'gpt-4': 8192,\n 'gpt-3.5-turbo': 4096,\n o1: 100000,\n 'o1-preview': 32768,\n 'o1-mini': 65536,\n\n // Anthropic\n 'claude-opus-4-8': 128000,\n 'claude-sonnet-4-6': 64000,\n 'claude-haiku-4-5': 64000,\n 'claude-3-5-sonnet-20241022': 8192,\n 'claude-sonnet-4-20250514': 16384,\n 'claude-3-opus-20240229': 4096,\n\n // Google\n 'gemini-3.1-pro-preview': 65536,\n 'gemini-3.5-flash': 65536,\n 'gemini-1.5-pro': 8192,\n 'gemini-1.5-flash': 8192,\n};\n\n/**\n * Calculate the cost of a request based on token usage\n */\nexport function calculateCost(model: string, usage: UsageInfo): number {\n const pricing = MODEL_PRICING[model];\n if (!pricing) {\n // Unknown model, return 0\n return 0;\n }\n\n const inputCost = (usage.prompt_tokens / 1_000_000) * pricing.input;\n const outputCost = (usage.completion_tokens / 1_000_000) * pricing.output;\n\n return inputCost + outputCost;\n}\n\n/**\n * Estimate the cost of a request before execution\n */\nexport function estimateCost(\n model: string,\n estimatedInputTokens: number,\n estimatedOutputTokens: number,\n): number {\n const pricing = MODEL_PRICING[model];\n if (!pricing) {\n return 0;\n }\n\n const inputCost = (estimatedInputTokens / 1_000_000) * pricing.input;\n const outputCost = (estimatedOutputTokens / 1_000_000) * pricing.output;\n\n return inputCost + outputCost;\n}\n\n/**\n * Get pricing for a model\n */\nexport function getModelPricing(\n model: string,\n): { input: number; output: number } | null {\n return MODEL_PRICING[model] || null;\n}\n\n/**\n * Get model info including pricing and capabilities\n */\nexport function getModelInfo(model: string, provider: string): ModelInfo {\n const pricing = MODEL_PRICING[model] || { input: 0, output: 0 };\n const contextWindow = MODEL_CONTEXT_WINDOWS[model] || 4096;\n const maxOutput = MODEL_MAX_OUTPUT[model] || 4096;\n\n return {\n id: model,\n provider,\n contextWindow,\n maxOutputTokens: maxOutput,\n inputPricePerMillion: pricing.input,\n outputPricePerMillion: pricing.output,\n capabilities: getModelCapabilities(model, provider),\n };\n}\n\n/**\n * Get model capabilities based on model ID and provider\n */\nexport function getModelCapabilities(\n model: string,\n provider: string,\n): ModelInfo['capabilities'] {\n // Default capabilities\n const defaults = {\n streaming: true,\n tools: true,\n vision: false,\n json_mode: true,\n system_prompts: true,\n };\n\n // Model-specific overrides\n if (\n model.includes('gpt-4o') ||\n model.includes('gpt-4-turbo') ||\n model.includes('gpt-5')\n ) {\n return { ...defaults, vision: true };\n }\n\n if (model.includes('o1')) {\n return {\n streaming: false, // o1 doesn't support streaming\n tools: false,\n vision: false,\n json_mode: false,\n system_prompts: false, // o1 uses developer messages\n };\n }\n\n if (model.includes('claude')) {\n // All Claude 3+ models (including claude-opus-4-8, claude-sonnet-4-6,\n // claude-haiku-4-5) support vision\n return { ...defaults, vision: true };\n }\n\n if (model.includes('gemini')) {\n return { ...defaults, vision: true };\n }\n\n if (provider === 'ollama') {\n return {\n streaming: true,\n tools: false, // Most Ollama models don't support tools natively\n vision: model.includes('llava') || model.includes('bakllava'),\n json_mode: true,\n system_prompts: true,\n };\n }\n\n return defaults;\n}\n\n/**\n * Find the cheapest model for a given capability requirement\n */\nexport function findCheapestModel(\n models: string[],\n _requiredCapabilities?: Partial<ModelInfo['capabilities']>,\n): string | null {\n let cheapest: { model: string; cost: number } | null = null;\n\n for (const model of models) {\n const pricing = MODEL_PRICING[model];\n if (!pricing) continue;\n\n // Average cost (assuming roughly equal input/output)\n const avgCost = (pricing.input + pricing.output) / 2;\n\n if (!cheapest || avgCost < cheapest.cost) {\n cheapest = { model, cost: avgCost };\n }\n }\n\n return cheapest?.model || null;\n}\n\n/**\n * Sort models by cost (cheapest first)\n */\nexport function sortModelsByCost(\n models: string[],\n direction: 'asc' | 'desc' = 'asc',\n): string[] {\n return [...models].sort((a, b) => {\n const pricingA = MODEL_PRICING[a] || { input: 0, output: 0 };\n const pricingB = MODEL_PRICING[b] || { input: 0, output: 0 };\n\n const costA = (pricingA.input + pricingA.output) / 2;\n const costB = (pricingB.input + pricingB.output) / 2;\n\n return direction === 'asc' ? costA - costB : costB - costA;\n });\n}\n","/**\n * Hashing utilities for cache keys and request deduplication\n */\n\nimport murmurhash from 'murmurhash';\n\n/**\n * Generate a hash for a chat completion request\n * Used for exact cache matching\n */\nexport function hashRequest(request: {\n model: string;\n messages: Array<{ role: string; content: unknown }>;\n temperature?: number;\n max_tokens?: number;\n tools?: unknown[];\n tool_choice?: unknown;\n}): string {\n // Create a normalized representation of the request\n const normalized = {\n model: request.model,\n messages: request.messages.map((m) => ({\n role: m.role,\n content: normalizeContent(m.content),\n })),\n temperature: request.temperature ?? 1,\n max_tokens: request.max_tokens,\n tools: request.tools ? JSON.stringify(request.tools) : undefined,\n tool_choice: request.tool_choice\n ? JSON.stringify(request.tool_choice)\n : undefined,\n };\n\n const str = JSON.stringify(normalized);\n return murmurhash.v3(str).toString(16);\n}\n\n/**\n * Normalize content for hashing (handles string and array content)\n */\nfunction normalizeContent(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (content === null || content === undefined) {\n return '';\n }\n return JSON.stringify(content);\n}\n\n/**\n * Generate a short unique ID\n */\nexport function generateId(prefix: string = 'gw'): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${prefix}-${timestamp}${random}`;\n}\n\n/**\n * Generate a request ID in OpenAI format\n */\nexport function generateRequestId(): string {\n return `chatcmpl-${generateId('')}`;\n}\n\n/**\n * Generate a cache key for a request\n */\nexport function generateCacheKey(\n provider: string,\n model: string,\n requestHash: string,\n): string {\n return `gw:cache:${provider}:${model}:${requestHash}`;\n}\n\n/**\n * Hash a string using murmur3\n */\nexport function hash(str: string): string {\n return murmurhash.v3(str).toString(16);\n}\n\n/**\n * Create a fingerprint for system configuration\n * (used to invalidate cache when config changes)\n */\nexport function createSystemFingerprint(config: {\n version: string;\n providers: string[];\n}): string {\n const str = JSON.stringify(config);\n return `fp_${murmurhash.v3(str).toString(16)}`;\n}\n","/**\n * Base Provider interface for LLM providers\n */\n\nimport type {\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatCompletionChunk,\n ProviderConfig,\n ProviderHealth,\n ModelInfo,\n} from '../core/types.js';\n\n/**\n * Abstract base class for LLM providers\n */\nexport abstract class Provider {\n readonly name: string;\n readonly config: ProviderConfig;\n protected health: ProviderHealth;\n\n constructor(config: ProviderConfig) {\n this.name = config.name;\n this.config = config;\n this.health = {\n status: 'healthy',\n latencyMs: 0,\n lastCheck: new Date(),\n errorRate: 0,\n consecutiveFailures: 0,\n };\n }\n\n /**\n * Execute a chat completion request\n */\n abstract chat(\n request: ChatCompletionRequest,\n ): Promise<ChatCompletionResponse>;\n\n /**\n * Execute a streaming chat completion request\n */\n abstract chatStream(\n request: ChatCompletionRequest,\n ): AsyncGenerator<ChatCompletionChunk, void, unknown>;\n\n /**\n * Check if the provider supports a specific model\n */\n supportsModel(model: string): boolean {\n return this.config.models.includes(model);\n }\n\n /**\n * Get information about a specific model\n */\n abstract getModelInfo(model: string): ModelInfo | null;\n\n /**\n * Get all supported models\n */\n getModels(): string[] {\n return [...this.config.models];\n }\n\n /**\n * Get the current health status\n */\n getHealth(): ProviderHealth {\n return { ...this.health };\n }\n\n /**\n * Perform a health check\n */\n async healthCheck(): Promise<ProviderHealth> {\n const start = Date.now();\n\n try {\n // Simple health check - try to make a minimal request\n await this.chat({\n model: this.config.models[0],\n messages: [{ role: 'user', content: 'hi' }],\n max_tokens: 1,\n });\n\n const latencyMs = Date.now() - start;\n this.health = {\n status: 'healthy',\n latencyMs,\n lastCheck: new Date(),\n errorRate: Math.max(0, this.health.errorRate - 0.1),\n consecutiveFailures: 0,\n };\n } catch (error) {\n const latencyMs = Date.now() - start;\n this.health = {\n status: this.health.consecutiveFailures >= 2 ? 'unhealthy' : 'degraded',\n latencyMs,\n lastCheck: new Date(),\n errorRate: Math.min(1, this.health.errorRate + 0.2),\n consecutiveFailures: this.health.consecutiveFailures + 1,\n };\n }\n\n return this.health;\n }\n\n /**\n * Update health status after a request\n */\n protected updateHealth(success: boolean, latencyMs: number): void {\n if (success) {\n this.health = {\n status: 'healthy',\n latencyMs:\n this.health.latencyMs > 0\n ? (this.health.latencyMs + latencyMs) / 2\n : latencyMs,\n lastCheck: new Date(),\n errorRate: Math.max(0, this.health.errorRate - 0.05),\n consecutiveFailures: 0,\n };\n } else {\n this.health = {\n ...this.health,\n status: this.health.consecutiveFailures >= 2 ? 'unhealthy' : 'degraded',\n lastCheck: new Date(),\n errorRate: Math.min(1, this.health.errorRate + 0.1),\n consecutiveFailures: this.health.consecutiveFailures + 1,\n };\n }\n }\n\n /**\n * Check if the provider is currently healthy\n */\n isHealthy(): boolean {\n return this.health.status === 'healthy';\n }\n\n /**\n * Check if the provider is available (healthy or degraded)\n */\n isAvailable(): boolean {\n return this.health.status !== 'unhealthy';\n }\n}\n\n/**\n * Options for creating a provider\n */\nexport interface ProviderOptions {\n apiKey?: string;\n baseUrl?: string;\n models?: string[];\n timeout?: number;\n maxRetries?: number;\n headers?: Record<string, string>;\n}\n","/**\n * OpenAI Provider implementation\n */\n\nimport type {\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatCompletionChunk,\n ModelInfo,\n ProviderConfig,\n} from '../../core/types.js';\nimport { ProviderError } from '../../core/types.js';\nimport { Provider, type ProviderOptions } from '../Provider.js';\nimport { getModelInfo } from '../../utils/pricing.js';\nimport { generateRequestId } from '../../utils/hashing.js';\n\nconst DEFAULT_OPENAI_MODELS = [\n 'gpt-5.5',\n 'gpt-5.4-mini',\n 'o1',\n 'o1-mini',\n 'o1-preview',\n];\n\nexport interface OpenAIProviderOptions extends ProviderOptions {\n organization?: string;\n project?: string;\n}\n\n/**\n * OpenAI Provider for the gateway\n */\nexport class OpenAIProvider extends Provider {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly organization?: string;\n private readonly project?: string;\n private readonly timeout: number;\n\n constructor(options: OpenAIProviderOptions = {}) {\n const apiKey = options.apiKey || process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new Error('OpenAI API key is required');\n }\n\n const config: ProviderConfig = {\n name: 'openai',\n apiKey,\n baseUrl: options.baseUrl || 'https://api.openai.com/v1',\n models: options.models || DEFAULT_OPENAI_MODELS,\n timeout: options.timeout || 60000,\n maxRetries: options.maxRetries || 3,\n headers: options.headers,\n };\n\n super(config);\n\n this.apiKey = apiKey;\n this.baseUrl = config.baseUrl!;\n this.organization = options.organization;\n this.project = options.project;\n this.timeout = config.timeout!;\n }\n\n /**\n * Execute a chat completion request\n */\n async chat(request: ChatCompletionRequest): Promise<ChatCompletionResponse> {\n const start = Date.now();\n\n try {\n const response = await this.makeRequest('/chat/completions', {\n method: 'POST',\n body: JSON.stringify(this.transformRequest(request)),\n });\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw error;\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n const result = this.transformResponse(data, request.model);\n\n this.updateHealth(true, Date.now() - start);\n return result;\n } catch (error) {\n this.updateHealth(false, Date.now() - start);\n throw this.wrapError(error);\n }\n }\n\n /**\n * Execute a streaming chat completion request\n */\n async *chatStream(\n request: ChatCompletionRequest,\n ): AsyncGenerator<ChatCompletionChunk, void, unknown> {\n const start = Date.now();\n\n try {\n const response = await this.makeRequest('/chat/completions', {\n method: 'POST',\n body: JSON.stringify({\n ...this.transformRequest(request),\n stream: true,\n stream_options: { include_usage: true },\n }),\n });\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw error;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new ProviderError('No response body', 'openai');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === 'data: [DONE]') continue;\n if (!trimmed.startsWith('data: ')) continue;\n\n try {\n const json = JSON.parse(trimmed.slice(6));\n yield this.transformChunk(json, request.model);\n } catch {\n // Skip malformed JSON\n }\n }\n }\n\n this.updateHealth(true, Date.now() - start);\n } catch (error) {\n this.updateHealth(false, Date.now() - start);\n throw this.wrapError(error);\n }\n }\n\n /**\n * Get model information\n */\n getModelInfo(model: string): ModelInfo | null {\n if (!this.supportsModel(model)) {\n return null;\n }\n return getModelInfo(model, 'openai');\n }\n\n /**\n * Make an HTTP request to the OpenAI API\n */\n private async makeRequest(\n path: string,\n options: RequestInit,\n ): Promise<Response> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n ...this.config.headers,\n };\n\n if (this.organization) {\n headers['OpenAI-Organization'] = this.organization;\n }\n\n if (this.project) {\n headers['OpenAI-Project'] = this.project;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n return await fetch(`${this.baseUrl}${path}`, {\n ...options,\n headers,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Transform gateway request to OpenAI format\n */\n private transformRequest(\n request: ChatCompletionRequest,\n ): Record<string, unknown> {\n const transformed: Record<string, unknown> = {\n model: request.model,\n messages: request.messages,\n };\n\n if (request.temperature !== undefined) {\n transformed.temperature = request.temperature;\n }\n if (request.max_tokens !== undefined) {\n transformed.max_tokens = request.max_tokens;\n }\n if (request.top_p !== undefined) {\n transformed.top_p = request.top_p;\n }\n if (request.frequency_penalty !== undefined) {\n transformed.frequency_penalty = request.frequency_penalty;\n }\n if (request.presence_penalty !== undefined) {\n transformed.presence_penalty = request.presence_penalty;\n }\n if (request.stop !== undefined) {\n transformed.stop = request.stop;\n }\n if (request.tools !== undefined) {\n transformed.tools = request.tools;\n }\n if (request.tool_choice !== undefined) {\n transformed.tool_choice = request.tool_choice;\n }\n if (request.response_format !== undefined) {\n transformed.response_format = request.response_format;\n }\n if (request.seed !== undefined) {\n transformed.seed = request.seed;\n }\n if (request.user !== undefined) {\n transformed.user = request.user;\n }\n\n return transformed;\n }\n\n /**\n * Transform OpenAI response to gateway format\n */\n private transformResponse(\n data: Record<string, unknown>,\n model: string,\n ): ChatCompletionResponse {\n return {\n id: (data.id as string) || generateRequestId(),\n object: 'chat.completion',\n created: (data.created as number) || Math.floor(Date.now() / 1000),\n model: (data.model as string) || model,\n choices: data.choices as ChatCompletionResponse['choices'],\n usage: data.usage as ChatCompletionResponse['usage'],\n system_fingerprint: data.system_fingerprint as string | undefined,\n };\n }\n\n /**\n * Transform OpenAI stream chunk to gateway format\n */\n private transformChunk(\n data: Record<string, unknown>,\n model: string,\n ): ChatCompletionChunk {\n return {\n id: (data.id as string) || generateRequestId(),\n object: 'chat.completion.chunk',\n created: (data.created as number) || Math.floor(Date.now() / 1000),\n model: (data.model as string) || model,\n choices: data.choices as ChatCompletionChunk['choices'],\n system_fingerprint: data.system_fingerprint as string | undefined,\n usage: data.usage as ChatCompletionChunk['usage'],\n };\n }\n\n /**\n * Parse error response from OpenAI\n */\n private async parseError(response: Response): Promise<ProviderError> {\n let message = `OpenAI API error: ${response.status}`;\n const retryable = response.status >= 500 || response.status === 429;\n\n try {\n const data = (await response.json()) as { error?: { message?: string } };\n if (data.error?.message) {\n message = data.error.message;\n }\n } catch {\n // Use default message\n }\n\n return new ProviderError(message, 'openai', undefined, retryable);\n }\n\n /**\n * Wrap unknown errors\n */\n private wrapError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n if (error instanceof Error) {\n const isTimeout =\n error.name === 'AbortError' || error.message.includes('timeout');\n return new ProviderError(\n error.message,\n 'openai',\n error,\n isTimeout, // Timeouts are retryable\n );\n }\n\n return new ProviderError('Unknown error', 'openai', undefined, true);\n }\n}\n","/**\n * Anthropic Provider implementation\n * Converts between OpenAI-compatible format and Anthropic format\n */\n\nimport type {\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatCompletionChunk,\n ChatMessage,\n ModelInfo,\n ProviderConfig,\n} from '../../core/types.js';\nimport { ProviderError } from '../../core/types.js';\nimport { Provider, type ProviderOptions } from '../Provider.js';\nimport { getModelInfo } from '../../utils/pricing.js';\nimport { generateRequestId } from '../../utils/hashing.js';\n\nconst DEFAULT_ANTHROPIC_MODELS = [\n 'claude-opus-4-8',\n 'claude-sonnet-4-6',\n 'claude-haiku-4-5',\n 'claude-sonnet-4-5',\n];\n\nconst ANTHROPIC_API_VERSION = '2023-06-01';\n\nexport interface AnthropicProviderOptions extends ProviderOptions {\n anthropicBeta?: string[];\n}\n\n/**\n * Anthropic Provider for the gateway\n */\nexport class AnthropicProvider extends Provider {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly anthropicBeta?: string[];\n\n constructor(options: AnthropicProviderOptions = {}) {\n const apiKey = options.apiKey || process.env.ANTHROPIC_API_KEY;\n if (!apiKey) {\n throw new Error('Anthropic API key is required');\n }\n\n const config: ProviderConfig = {\n name: 'anthropic',\n apiKey,\n baseUrl: options.baseUrl || 'https://api.anthropic.com',\n models: options.models || DEFAULT_ANTHROPIC_MODELS,\n timeout: options.timeout || 60000,\n maxRetries: options.maxRetries || 3,\n headers: options.headers,\n };\n\n super(config);\n\n this.apiKey = apiKey;\n this.baseUrl = config.baseUrl!;\n this.timeout = config.timeout!;\n this.anthropicBeta = options.anthropicBeta;\n }\n\n /**\n * Execute a chat completion request\n */\n async chat(request: ChatCompletionRequest): Promise<ChatCompletionResponse> {\n const start = Date.now();\n\n try {\n const anthropicRequest = this.transformToAnthropic(request);\n\n const response = await this.makeRequest('/v1/messages', {\n method: 'POST',\n body: JSON.stringify(anthropicRequest),\n });\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw error;\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n const result = this.transformFromAnthropic(data, request.model);\n\n this.updateHealth(true, Date.now() - start);\n return result;\n } catch (error) {\n this.updateHealth(false, Date.now() - start);\n throw this.wrapError(error);\n }\n }\n\n /**\n * Execute a streaming chat completion request\n */\n async *chatStream(\n request: ChatCompletionRequest,\n ): AsyncGenerator<ChatCompletionChunk, void, unknown> {\n const start = Date.now();\n\n try {\n const anthropicRequest = this.transformToAnthropic(request);\n\n const response = await this.makeRequest('/v1/messages', {\n method: 'POST',\n body: JSON.stringify({\n ...anthropicRequest,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw error;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new ProviderError('No response body', 'anthropic');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n const requestId = generateRequestId();\n let inputTokens = 0;\n let outputTokens = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith('data: ')) continue;\n\n try {\n const event = JSON.parse(trimmed.slice(6));\n const chunk = this.transformStreamEvent(\n event,\n request.model,\n requestId,\n );\n\n // Track usage from message events\n if (event.type === 'message_start' && event.message?.usage) {\n inputTokens = event.message.usage.input_tokens || 0;\n }\n if (event.type === 'message_delta' && event.usage) {\n outputTokens = event.usage.output_tokens || 0;\n }\n\n if (chunk) {\n // Add usage to final chunk\n if (event.type === 'message_stop') {\n chunk.usage = {\n prompt_tokens: inputTokens,\n completion_tokens: outputTokens,\n total_tokens: inputTokens + outputTokens,\n };\n }\n yield chunk;\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n\n this.updateHealth(true, Date.now() - start);\n } catch (error) {\n this.updateHealth(false, Date.now() - start);\n throw this.wrapError(error);\n }\n }\n\n /**\n * Get model information\n */\n getModelInfo(model: string): ModelInfo | null {\n if (!this.supportsModel(model)) {\n return null;\n }\n return getModelInfo(model, 'anthropic');\n }\n\n /**\n * Make an HTTP request to the Anthropic API\n */\n private async makeRequest(\n path: string,\n options: RequestInit,\n ): Promise<Response> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': ANTHROPIC_API_VERSION,\n ...this.config.headers,\n };\n\n if (this.anthropicBeta && this.anthropicBeta.length > 0) {\n headers['anthropic-beta'] = this.anthropicBeta.join(',');\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n return await fetch(`${this.baseUrl}${path}`, {\n ...options,\n headers,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Transform OpenAI-compatible request to Anthropic format\n */\n private transformToAnthropic(\n request: ChatCompletionRequest,\n ): Record<string, unknown> {\n const { messages, systemPrompt } = this.extractSystemPrompt(\n request.messages,\n );\n\n const transformed: Record<string, unknown> = {\n model: request.model,\n messages: messages.map((m) => this.transformMessage(m)),\n max_tokens: request.max_tokens || 4096,\n };\n\n if (systemPrompt) {\n transformed.system = systemPrompt;\n }\n\n if (request.temperature !== undefined) {\n transformed.temperature = request.temperature;\n }\n if (request.top_p !== undefined) {\n transformed.top_p = request.top_p;\n }\n if (request.stop !== undefined) {\n transformed.stop_sequences = Array.isArray(request.stop)\n ? request.stop\n : [request.stop];\n }\n\n // Transform tools\n if (request.tools && request.tools.length > 0) {\n transformed.tools = request.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters || { type: 'object' },\n }));\n\n if (request.tool_choice) {\n if (request.tool_choice === 'auto') {\n transformed.tool_choice = { type: 'auto' };\n } else if (request.tool_choice === 'required') {\n transformed.tool_choice = { type: 'any' };\n } else if (request.tool_choice === 'none') {\n // Don't send tools if none is selected\n delete transformed.tools;\n } else if (\n typeof request.tool_choice === 'object' &&\n request.tool_choice.function\n ) {\n transformed.tool_choice = {\n type: 'tool',\n name: request.tool_choice.function.name,\n };\n }\n }\n }\n\n return transformed;\n }\n\n /**\n * Extract system prompt from messages\n */\n private extractSystemPrompt(messages: ChatMessage[]): {\n messages: ChatMessage[];\n systemPrompt: string | null;\n } {\n const systemMessages = messages.filter((m) => m.role === 'system');\n const otherMessages = messages.filter((m) => m.role !== 'system');\n\n const systemPrompt =\n systemMessages.length > 0\n ? systemMessages\n .map((m) =>\n typeof m.content === 'string'\n ? m.content\n : JSON.stringify(m.content),\n )\n .join('\\n')\n : null;\n\n return { messages: otherMessages, systemPrompt };\n }\n\n /**\n * Transform a single message to Anthropic format\n */\n private transformMessage(message: ChatMessage): Record<string, unknown> {\n // Handle tool results\n if (message.role === 'tool') {\n return {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: message.tool_call_id,\n content:\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content),\n },\n ],\n };\n }\n\n // Handle assistant messages with tool calls\n if (message.role === 'assistant' && message.tool_calls) {\n const content: unknown[] = [];\n\n if (message.content) {\n content.push({\n type: 'text',\n text:\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content),\n });\n }\n\n for (const toolCall of message.tool_calls) {\n content.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments),\n });\n }\n\n return { role: 'assistant', content };\n }\n\n // Handle regular messages\n return {\n role: message.role,\n content:\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content),\n };\n }\n\n /**\n * Transform Anthropic response to OpenAI-compatible format\n */\n private transformFromAnthropic(\n data: Record<string, unknown>,\n model: string,\n ): ChatCompletionResponse {\n const content = data.content as Array<Record<string, unknown>>;\n let textContent = '';\n const toolCalls: ChatCompletionResponse['choices'][0]['message']['tool_calls'] =\n [];\n\n for (const block of content) {\n if (block.type === 'text') {\n textContent += block.text as string;\n } else if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id as string,\n type: 'function',\n function: {\n name: block.name as string,\n arguments: JSON.stringify(block.input),\n },\n });\n }\n }\n\n const message: ChatMessage = {\n role: 'assistant',\n content: textContent || null,\n };\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n const stopReason = data.stop_reason as string;\n let finishReason: 'stop' | 'length' | 'tool_calls' | null = null;\n if (stopReason === 'end_turn') {\n finishReason = 'stop';\n } else if (stopReason === 'max_tokens') {\n finishReason = 'length';\n } else if (stopReason === 'tool_use') {\n finishReason = 'tool_calls';\n }\n\n const usage = data.usage as { input_tokens: number; output_tokens: number };\n\n return {\n id: (data.id as string) || generateRequestId(),\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: (data.model as string) || model,\n choices: [\n {\n index: 0,\n message,\n finish_reason: finishReason,\n },\n ],\n usage: {\n prompt_tokens: usage.input_tokens,\n completion_tokens: usage.output_tokens,\n total_tokens: usage.input_tokens + usage.output_tokens,\n },\n };\n }\n\n /**\n * Transform Anthropic stream event to OpenAI-compatible chunk\n */\n private transformStreamEvent(\n event: Record<string, unknown>,\n model: string,\n requestId: string,\n ): ChatCompletionChunk | null {\n const eventType = event.type as string;\n\n if (eventType === 'content_block_delta') {\n const delta = event.delta as Record<string, unknown>;\n\n if (delta.type === 'text_delta') {\n return {\n id: requestId,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n delta: {\n content: delta.text as string,\n },\n finish_reason: null,\n },\n ],\n };\n }\n\n if (delta.type === 'input_json_delta') {\n // Tool input streaming\n return {\n id: requestId,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n delta: {},\n finish_reason: null,\n },\n ],\n };\n }\n }\n\n if (eventType === 'content_block_start') {\n const contentBlock = event.content_block as Record<string, unknown>;\n\n if (contentBlock?.type === 'tool_use') {\n return {\n id: requestId,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n delta: {\n tool_calls: [\n {\n id: contentBlock.id as string,\n type: 'function',\n function: {\n name: contentBlock.name as string,\n arguments: '',\n },\n },\n ],\n },\n finish_reason: null,\n },\n ],\n };\n }\n }\n\n if (eventType === 'message_stop') {\n return {\n id: requestId,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n delta: {},\n finish_reason: 'stop',\n },\n ],\n };\n }\n\n return null;\n }\n\n /**\n * Parse error response from Anthropic\n */\n private async parseError(response: Response): Promise<ProviderError> {\n let message = `Anthropic API error: ${response.status}`;\n const retryable = response.status >= 500 || response.status === 429;\n\n try {\n const data = (await response.json()) as { error?: { message?: string } };\n if (data.error?.message) {\n message = data.error.message;\n }\n } catch {\n // Use default message\n }\n\n return new ProviderError(message, 'anthropic', undefined, retryable);\n }\n\n /**\n * Wrap unknown errors\n */\n private wrapError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n if (error instanceof Error) {\n const isTimeout =\n error.name === 'AbortError' || error.message.includes('timeout');\n return new ProviderError(error.message, 'anthropic', error, isTimeout);\n }\n\n return new ProviderError('Unknown error', 'anthropic', undefined, true);\n }\n}\n","/**\n * Google Gemini Provider implementation\n * Converts between OpenAI-compatible format and Google Gemini format\n */\n\nimport type {\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatCompletionChunk,\n ChatMessage,\n ModelInfo,\n ProviderConfig,\n} from '../../core/types.js';\nimport { ProviderError } from '../../core/types.js';\nimport { Provider, type ProviderOptions } from '../Provider.js';\nimport { getModelInfo } from '../../utils/pricing.js';\nimport { generateRequestId } from '../../utils/hashing.js';\n\nconst DEFAULT_GEMINI_MODELS = [\n 'gemini-3.1-pro-preview',\n 'gemini-3.5-flash',\n 'gemini-3.1-flash-lite',\n];\n\nexport interface GoogleProviderOptions extends ProviderOptions {\n projectId?: string;\n location?: string;\n}\n\n/**\n * Google Gemini Provider for the gateway\n */\nexport class GoogleProvider extends Provider {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(options: GoogleProviderOptions = {}) {\n const apiKey = options.apiKey || process.env.GOOGLE_API_KEY;\n if (!apiKey) {\n throw new Error('Google API key is required');\n }\n\n const config: ProviderConfig = {\n name: 'google',\n apiKey,\n baseUrl:\n options.baseUrl || 'https://generativelanguage.googleapis.com/v1beta',\n models: options.models || DEFAULT_GEMINI_MODELS,\n timeout: options.timeout || 60000,\n maxRetries: options.maxRetries || 3,\n headers: options.headers,\n };\n\n super(config);\n\n this.apiKey = apiKey;\n this.baseUrl = config.baseUrl!;\n this.timeout = config.timeout!;\n }\n\n /**\n * Execute a chat completion request\n */\n async chat(request: ChatCompletionRequest): Promise<ChatCompletionResponse> {\n const start = Date.now();\n\n try {\n const geminiRequest = this.transformToGemini(request);\n const endpoint = `/models/${request.model}:generateContent`;\n\n const response = await this.makeRequest(endpoint, {\n method: 'POST',\n body: JSON.stringify(geminiRequest),\n });\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw error;\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n const result = this.transformFromGemini(data, request.model);\n\n this.updateHealth(true, Date.now() - start);\n return result;\n } catch (error) {\n this.updateHealth(false, Date.now() - start);\n throw this.wrapError(error);\n }\n }\n\n /**\n * Execute a streaming chat completion request\n */\n async *chatStream(\n request: ChatCompletionRequest,\n ): AsyncGenerator<ChatCompletionChunk, void, unknown> {\n const start = Date.now();\n\n try {\n const geminiRequest = this.transformToGemini(request);\n const endpoint = `/models/${request.model}:streamGenerateContent`;\n\n const response = await this.makeRequest(endpoint, {\n method: 'POST',\n body: JSON.stringify(geminiRequest),\n });\n\n if (!response.ok) {\n const error = await this.parseError(response);\n throw error;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new ProviderError('No response body', 'google');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n const requestId = generateRequestId();\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Gemini streams as JSON array with line separators\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === '[' || trimmed === ']' || trimmed === ',')\n continue;\n\n // Handle JSON object potentially with leading/trailing comma\n let jsonStr = trimmed;\n if (jsonStr.startsWith(',')) jsonStr = jsonStr.slice(1);\n if (jsonStr.endsWith(',')) jsonStr = jsonStr.slice(0, -1);\n\n if (!jsonStr.startsWith('{')) continue;\n\n try {\n const data = JSON.parse(jsonStr);\n const chunk = this.transformStreamChunk(\n data,\n request.model,\n requestId,\n );\n\n // Track usage\n if (data.usageMetadata) {\n totalInputTokens = data.usageMetadata.promptTokenCount || 0;\n totalOutputTokens = data.usageMetadata.candidatesTokenCount || 0;\n }\n\n if (chunk) {\n yield chunk;\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n\n // Final chunk with usage\n yield {\n id: requestId,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model: request.model,\n choices: [\n {\n index: 0,\n delta: {},\n finish_reason: 'stop',\n },\n ],\n usage: {\n prompt_tokens: totalInputTokens,\n completion_tokens: totalOutputTokens,\n total_tokens: totalInputTokens + totalOutputTokens,\n },\n };\n\n this.updateHealth(true, Date.now() - start);\n } catch (error) {\n this.updateHealth(false, Date.now() - start);\n throw this.wrapError(error);\n }\n }\n\n /**\n * Get model information\n */\n getModelInfo(model: string): ModelInfo | null {\n if (!this.supportsModel(model)) {\n return null;\n }\n return getModelInfo(model, 'google');\n }\n\n /**\n * Make an HTTP request to the Google API\n */\n private async makeRequest(\n path: string,\n options: RequestInit,\n ): Promise<Response> {\n const url = `${this.baseUrl}${path}?key=${this.apiKey}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.config.headers,\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n return await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Transform OpenAI-compatible request to Gemini format\n */\n private transformToGemini(\n request: ChatCompletionRequest,\n ): Record<string, unknown> {\n const contents = this.transformMessages(request.messages);\n\n const transformed: Record<string, unknown> = {\n contents,\n };\n\n // Generation config\n const generationConfig: Record<string, unknown> = {};\n\n if (request.temperature !== undefined) {\n generationConfig.temperature = request.temperature;\n }\n if (request.max_tokens !== undefined) {\n generationConfig.maxOutputTokens = request.max_tokens;\n }\n if (request.top_p !== undefined) {\n generationConfig.topP = request.top_p;\n }\n if (request.stop !== undefined) {\n generationConfig.stopSequences = Array.isArray(request.stop)\n ? request.stop\n : [request.stop];\n }\n\n if (Object.keys(generationConfig).length > 0) {\n transformed.generationConfig = generationConfig;\n }\n\n // System instruction\n const systemMessages = request.messages.filter((m) => m.role === 'system');\n if (systemMessages.length > 0) {\n const systemText = systemMessages\n .map((m) =>\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n )\n .join('\\n');\n transformed.systemInstruction = { parts: [{ text: systemText }] };\n }\n\n // Tools\n if (request.tools && request.tools.length > 0) {\n transformed.tools = [\n {\n functionDeclarations: request.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters || { type: 'object' },\n })),\n },\n ];\n }\n\n return transformed;\n }\n\n /**\n * Transform messages to Gemini format\n */\n private transformMessages(\n messages: ChatMessage[],\n ): Array<Record<string, unknown>> {\n const contents: Array<Record<string, unknown>> = [];\n\n for (const message of messages) {\n // Skip system messages (handled separately)\n if (message.role === 'system') continue;\n\n const role = message.role === 'assistant' ? 'model' : 'user';\n const parts: Array<Record<string, unknown>> = [];\n\n // Handle text content\n if (message.content) {\n parts.push({\n text:\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content),\n });\n }\n\n // Handle tool calls from assistant\n if (message.tool_calls) {\n for (const toolCall of message.tool_calls) {\n parts.push({\n functionCall: {\n name: toolCall.function.name,\n args: JSON.parse(toolCall.function.arguments),\n },\n });\n }\n }\n\n // Handle tool results\n if (message.role === 'tool' && message.tool_call_id) {\n parts.push({\n functionResponse: {\n name: message.name || 'tool_result',\n response: {\n result:\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content),\n },\n },\n });\n }\n\n if (parts.length > 0) {\n contents.push({ role, parts });\n }\n }\n\n return contents;\n }\n\n /**\n * Transform Gemini response to OpenAI-compatible format\n */\n private transformFromGemini(\n data: Record<string, unknown>,\n model: string,\n ): ChatCompletionResponse {\n const candidates = data.candidates as Array<Record<string, unknown>>;\n const candidate = candidates?.[0];\n\n if (!candidate) {\n throw new ProviderError('No response candidates', 'google');\n }\n\n const content = candidate.content as Record<string, unknown>;\n const parts = (content?.parts as Array<Record<string, unknown>>) || [];\n\n let textContent = '';\n const toolCalls: ChatCompletionResponse['choices'][0]['message']['tool_calls'] =\n [];\n\n for (const part of parts) {\n if (part.text) {\n textContent += part.text as string;\n }\n if (part.functionCall) {\n const fc = part.functionCall as Record<string, unknown>;\n toolCalls.push({\n id: `call_${Math.random().toString(36).substring(2, 11)}`,\n type: 'function',\n function: {\n name: fc.name as string,\n arguments: JSON.stringify(fc.args),\n },\n });\n }\n }\n\n const message: ChatMessage = {\n role: 'assistant',\n content: textContent || null,\n };\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n // Map finish reason\n const finishReason = candidate.finishReason as string;\n let mappedReason: 'stop' | 'length' | 'tool_calls' | null = null;\n if (finishReason === 'STOP') {\n mappedReason = 'stop';\n } else if (finishReason === 'MAX_TOKENS') {\n mappedReason = 'length';\n } else if (toolCalls.length > 0) {\n mappedReason = 'tool_calls';\n }\n\n // Get usage\n const usageMetadata = data.usageMetadata as Record<string, number>;\n const usage = {\n prompt_tokens: usageMetadata?.promptTokenCount || 0,\n completion_tokens: usageMetadata?.candidatesTokenCount || 0,\n total_tokens: usageMetadata?.totalTokenCount || 0,\n };\n\n return {\n id: generateRequestId(),\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n message,\n finish_reason: mappedReason,\n },\n ],\n usage,\n };\n }\n\n /**\n * Transform Gemini stream chunk to OpenAI-compatible format\n */\n private transformStreamChunk(\n data: Record<string, unknown>,\n model: string,\n requestId: string,\n ): ChatCompletionChunk | null {\n const candidates = data.candidates as Array<Record<string, unknown>>;\n const candidate = candidates?.[0];\n\n if (!candidate) {\n return null;\n }\n\n const content = candidate.content as Record<string, unknown>;\n const parts = (content?.parts as Array<Record<string, unknown>>) || [];\n\n let textContent = '';\n for (const part of parts) {\n if (part.text) {\n textContent += part.text as string;\n }\n }\n\n if (!textContent) {\n return null;\n }\n\n return {\n id: requestId,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n delta: {\n content: textContent,\n },\n finish_reason: null,\n },\n ],\n };\n }\n\n /**\n * Parse error response from Google\n */\n private async parseError(response: Response): Promise<ProviderError> {\n let message = `Google API error: ${response.status}`;\n const retryable = response.status >= 500 || response.status === 429;\n\n try {\n const data = (await response.json()) as { error?: { message?: string } };\n if (data.error?.message) {\n message = data.error.message;\n }\n } catch {\n // Use default message\n }\n\n return new ProviderError(message, 'google', undefined, retryable);\n }\n\n /**\n * Wrap unknown errors\n */\n private wrapError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n if (error instanceof Error) {\n const isTimeout =\n error.name === 'AbortError' || error.message.includes('timeout');\n return new ProviderError(error.message, 'google', error, isTimeout);\n }\n\n return new ProviderError('Unknown error', 'google', undefined, true);\n }\n}\n","/**\n * Gateway - Main entry point for the LLM Gateway\n */\n\nimport { EventEmitter } from 'events';\nimport type {\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatCompletionChunk,\n GatewayConfig,\n GatewayMetrics,\n GatewayResponseMetadata,\n RoutingDecision,\n} from './types.js';\nimport { GatewayError, ProviderError, ValidationError } from './types.js';\nimport { ProviderRegistry } from '../providers/ProviderRegistry.js';\nimport { Provider } from '../providers/Provider.js';\nimport { HealthMonitor } from '../providers/ProviderHealth.js';\nimport {\n Router,\n RoundRobinStrategy,\n FailoverStrategy,\n CostOptimizedStrategy,\n LatencyOptimizedStrategy,\n type RoutingContext,\n} from '../routing/index.js';\nimport { calculateCost } from '../utils/pricing.js';\nimport { hashRequest, generateRequestId } from '../utils/hashing.js';\nimport { OpenAIProvider } from '../providers/registry/OpenAIProvider.js';\nimport { AnthropicProvider } from '../providers/registry/AnthropicProvider.js';\nimport { GoogleProvider } from '../providers/registry/GoogleProvider.js';\nimport { LRUCache } from 'lru-cache';\nimport pino from 'pino';\n\nexport interface GatewayEvents {\n 'request:start': (event: {\n requestId: string;\n model: string;\n provider?: string;\n }) => void;\n 'request:complete': (event: {\n requestId: string;\n provider: string;\n model: string;\n latencyMs: number;\n cost: number;\n cached: boolean;\n tokens: { input: number; output: number };\n }) => void;\n 'request:error': (event: {\n requestId: string;\n provider?: string;\n error: Error;\n }) => void;\n 'provider:unhealthy': (provider: string) => void;\n 'provider:healthy': (provider: string) => void;\n}\n\n/**\n * Main Gateway class\n */\nexport class Gateway extends EventEmitter {\n private readonly _config: GatewayConfig;\n private readonly registry: ProviderRegistry;\n private readonly router: Router;\n private readonly healthMonitor: HealthMonitor;\n private readonly cache: LRUCache<string, ChatCompletionResponse> | null;\n private readonly logger: pino.Logger;\n private metrics: GatewayMetrics;\n\n /**\n * Chat completions API interface (OpenAI-compatible)\n */\n public readonly chat = {\n completions: {\n create: this.createCompletion.bind(this),\n },\n };\n\n constructor(config: GatewayConfig) {\n super();\n this._config = config;\n\n // Initialize logger\n this.logger = pino({\n level: config.telemetry?.logging?.level || 'info',\n transport:\n process.env.NODE_ENV !== 'production'\n ? { target: 'pino-pretty' }\n : undefined,\n });\n\n // Initialize provider registry\n this.registry = new ProviderRegistry();\n\n // Register providers from config\n for (const providerConfig of config.providers) {\n const provider = this.createProvider(providerConfig);\n if (provider) {\n this.registry.register(provider);\n }\n }\n\n // Initialize router\n this.router = this.createRouter(config);\n\n // Initialize health monitor\n this.healthMonitor = new HealthMonitor({\n checkInterval: 60000,\n unhealthyThreshold: 3,\n degradedThreshold: 1,\n circuitBreaker: {\n failureThreshold: 5,\n successThreshold: 3,\n timeout: 30000,\n },\n });\n\n // Initialize cache\n if (config.cache?.enabled) {\n this.cache = new LRUCache({\n max: config.cache.maxEntries || 1000,\n ttl: (config.cache.ttl || 3600) * 1000,\n });\n } else {\n this.cache = null;\n }\n\n // Initialize metrics\n this.metrics = this.createInitialMetrics();\n\n // Set up health monitoring events\n this.healthMonitor.on('unhealthy', (provider: string) => {\n this.logger.warn({ provider }, 'Provider marked unhealthy');\n this.emit('provider:unhealthy', provider);\n });\n\n this.healthMonitor.on('circuit-open', (provider: string) => {\n this.logger.warn({ provider }, 'Circuit breaker opened');\n });\n }\n\n /**\n * Create a chat completion (main API)\n */\n async createCompletion(\n request: ChatCompletionRequest,\n ): Promise<ChatCompletionResponse | AsyncGenerator<ChatCompletionChunk>> {\n // Validate request\n this.validateRequest(request);\n\n // Handle streaming\n if (request.stream) {\n return this.createStreamingCompletion(request);\n }\n\n return this.createNonStreamingCompletion(request);\n }\n\n /**\n * Non-streaming completion\n */\n private async createNonStreamingCompletion(\n request: ChatCompletionRequest,\n ): Promise<ChatCompletionResponse> {\n const requestId = request._gateway?.requestId || generateRequestId();\n const start = Date.now();\n\n this.emit('request:start', {\n requestId,\n model: request.model,\n });\n\n try {\n // Check cache\n if (this.cache && request._gateway?.cachePolicy !== 'no-cache') {\n const cacheKey = hashRequest(request);\n const cached = this.cache.get(cacheKey);\n\n if (cached) {\n this.metrics.cache.hits++;\n this.updateCacheHitRate();\n this.logger.debug({ requestId, cacheKey }, 'Cache hit');\n\n const response = {\n ...cached,\n _gateway: {\n ...cached._gateway,\n cached: true,\n cacheKey,\n latencyMs: Date.now() - start,\n } as GatewayResponseMetadata,\n };\n\n this.emit('request:complete', {\n requestId,\n provider: cached._gateway?.provider || 'cache',\n model: cached.model,\n latencyMs: Date.now() - start,\n cost: 0,\n cached: true,\n tokens: { input: 0, output: 0 },\n });\n\n return response;\n }\n\n this.metrics.cache.misses++;\n }\n\n // Route request\n const routingContext: RoutingContext = {\n excludeProviders: request._gateway?.excludeProviders,\n preferredProvider: request._gateway?.preferredProvider,\n maxCost: request._gateway?.maxCost,\n maxLatency: request._gateway?.maxLatency,\n };\n\n let lastError: Error | null = null;\n let attempts = 0;\n const maxAttempts = 3;\n\n while (attempts < maxAttempts) {\n attempts++;\n\n const decision = this.router.route(request, this.registry, {\n ...routingContext,\n previousAttempts:\n attempts > 1\n ? [{ provider: '', model: '', error: lastError?.message }]\n : undefined,\n });\n\n const provider = this.registry.get(decision.provider);\n if (!provider) {\n lastError = new GatewayError(\n `Provider not found: ${decision.provider}`,\n 'PROVIDER_NOT_FOUND',\n 500,\n );\n continue;\n }\n\n // Check circuit breaker\n if (!this.healthMonitor.isRequestAllowed(decision.provider)) {\n this.logger.debug(\n { provider: decision.provider },\n 'Circuit breaker open, skipping',\n );\n routingContext.excludeProviders = [\n ...(routingContext.excludeProviders || []),\n decision.provider,\n ];\n continue;\n }\n\n try {\n // Make the actual request\n const providerRequest = {\n ...request,\n model: decision.model,\n };\n\n const providerStart = Date.now();\n const response = await provider.chat(providerRequest);\n const latencyMs = Date.now() - providerStart;\n\n // Record success\n this.healthMonitor.recordRequest(decision.provider, true, latencyMs);\n\n // Calculate cost\n const cost = calculateCost(decision.model, response.usage);\n\n // Update metrics\n this.updateMetrics(decision, response, latencyMs, cost);\n\n // Add gateway metadata\n const gatewayResponse: ChatCompletionResponse = {\n ...response,\n _gateway: {\n provider: decision.provider,\n originalModel: request.model,\n latencyMs,\n cost,\n cached: false,\n retries: attempts - 1,\n routingDecision: decision,\n },\n };\n\n // Cache the response\n if (this.cache && request._gateway?.cachePolicy !== 'no-cache') {\n const cacheKey = hashRequest(request);\n this.cache.set(cacheKey, gatewayResponse);\n }\n\n this.emit('request:complete', {\n requestId,\n provider: decision.provider,\n model: decision.model,\n latencyMs: Date.now() - start,\n cost,\n cached: false,\n tokens: {\n input: response.usage.prompt_tokens,\n output: response.usage.completion_tokens,\n },\n });\n\n return gatewayResponse;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Record failure\n this.healthMonitor.recordRequest(\n decision.provider,\n false,\n Date.now() - start,\n );\n\n // Check if retryable\n if (error instanceof ProviderError && !error.retryable) {\n throw error;\n }\n\n this.logger.warn(\n {\n provider: decision.provider,\n error: lastError.message,\n attempt: attempts,\n },\n 'Request failed, retrying',\n );\n\n // Add to exclude list for next attempt\n routingContext.excludeProviders = [\n ...(routingContext.excludeProviders || []),\n decision.provider,\n ];\n }\n }\n\n // All attempts failed\n this.metrics.requests.failed++;\n this.emit('request:error', { requestId, error: lastError! });\n throw (\n lastError ||\n new GatewayError('All attempts failed', 'ALL_ATTEMPTS_FAILED', 502)\n );\n } catch (error) {\n this.metrics.requests.failed++;\n this.emit('request:error', {\n requestId,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n throw error;\n }\n }\n\n /**\n * Streaming completion\n */\n private async *createStreamingCompletion(\n request: ChatCompletionRequest,\n ): AsyncGenerator<ChatCompletionChunk, void, unknown> {\n const requestId = request._gateway?.requestId || generateRequestId();\n const start = Date.now();\n\n this.emit('request:start', { requestId, model: request.model });\n\n // Route request\n const decision = this.router.route(request, this.registry, {\n excludeProviders: request._gateway?.excludeProviders,\n preferredProvider: request._gateway?.preferredProvider,\n });\n\n const provider = this.registry.get(decision.provider);\n if (!provider) {\n throw new GatewayError(\n `Provider not found: ${decision.provider}`,\n 'PROVIDER_NOT_FOUND',\n 500,\n );\n }\n\n const providerRequest = { ...request, model: decision.model };\n\n try {\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n for await (const chunk of provider.chatStream(providerRequest)) {\n // Track usage from final chunk\n if (chunk.usage) {\n totalInputTokens = chunk.usage.prompt_tokens;\n totalOutputTokens = chunk.usage.completion_tokens;\n }\n\n yield chunk;\n }\n\n const latencyMs = Date.now() - start;\n const cost = calculateCost(decision.model, {\n prompt_tokens: totalInputTokens,\n completion_tokens: totalOutputTokens,\n total_tokens: totalInputTokens + totalOutputTokens,\n });\n\n this.healthMonitor.recordRequest(decision.provider, true, latencyMs);\n\n this.emit('request:complete', {\n requestId,\n provider: decision.provider,\n model: decision.model,\n latencyMs,\n cost,\n cached: false,\n tokens: { input: totalInputTokens, output: totalOutputTokens },\n });\n } catch (error) {\n this.healthMonitor.recordRequest(\n decision.provider,\n false,\n Date.now() - start,\n );\n this.emit('request:error', {\n requestId,\n provider: decision.provider,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n throw error;\n }\n }\n\n /**\n * Validate a request\n */\n private validateRequest(request: ChatCompletionRequest): void {\n if (!request.model) {\n throw new ValidationError('Model is required');\n }\n\n if (!request.messages || request.messages.length === 0) {\n throw new ValidationError(\n 'Messages array is required and cannot be empty',\n );\n }\n\n for (const message of request.messages) {\n if (!message.role) {\n throw new ValidationError('Message role is required');\n }\n if (!['system', 'user', 'assistant', 'tool'].includes(message.role)) {\n throw new ValidationError(`Invalid message role: ${message.role}`);\n }\n }\n }\n\n /**\n * Create a provider instance from config\n */\n private createProvider(\n config: GatewayConfig['providers'][0],\n ): Provider | null {\n switch (config.name) {\n case 'openai':\n return new OpenAIProvider({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n models: config.models,\n timeout: config.timeout,\n });\n case 'anthropic':\n return new AnthropicProvider({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n models: config.models,\n timeout: config.timeout,\n });\n case 'google':\n return new GoogleProvider({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n models: config.models,\n timeout: config.timeout,\n });\n default:\n this.logger.warn({ provider: config.name }, 'Unknown provider type');\n return null;\n }\n }\n\n /**\n * Create router from config\n */\n private createRouter(config: GatewayConfig): Router {\n const strategyName = config.routing?.strategy || 'round-robin';\n\n let strategy;\n switch (strategyName) {\n case 'failover':\n strategy = new FailoverStrategy({\n chain: config.routing?.fallbackChain || [\n 'openai',\n 'anthropic',\n 'google',\n ],\n });\n break;\n case 'cost-optimized':\n strategy = new CostOptimizedStrategy();\n break;\n case 'latency-optimized':\n strategy = new LatencyOptimizedStrategy();\n break;\n case 'round-robin':\n default:\n strategy = new RoundRobinStrategy({\n weights: config.routing?.weights,\n });\n break;\n }\n\n return new Router(strategy, {\n fallbackChain: config.routing?.fallbackChain,\n });\n }\n\n /**\n * Create initial metrics object\n */\n private createInitialMetrics(): GatewayMetrics {\n return {\n requests: { total: 0, successful: 0, failed: 0, cached: 0 },\n latency: { avg: 0, p50: 0, p95: 0, p99: 0 },\n tokens: { input: 0, output: 0, total: 0 },\n cost: { total: 0, byProvider: {}, byModel: {} },\n cache: { hits: 0, misses: 0, hitRate: 0 },\n providers: {},\n };\n }\n\n /**\n * Update metrics after a request\n */\n private updateMetrics(\n decision: RoutingDecision,\n response: ChatCompletionResponse,\n latencyMs: number,\n cost: number,\n ): void {\n this.metrics.requests.total++;\n this.metrics.requests.successful++;\n\n // Update latency (simple moving average)\n this.metrics.latency.avg =\n (this.metrics.latency.avg * (this.metrics.requests.successful - 1) +\n latencyMs) /\n this.metrics.requests.successful;\n\n // Update tokens\n this.metrics.tokens.input += response.usage.prompt_tokens;\n this.metrics.tokens.output += response.usage.completion_tokens;\n this.metrics.tokens.total += response.usage.total_tokens;\n\n // Update cost\n this.metrics.cost.total += cost;\n this.metrics.cost.byProvider[decision.provider] =\n (this.metrics.cost.byProvider[decision.provider] || 0) + cost;\n this.metrics.cost.byModel[decision.model] =\n (this.metrics.cost.byModel[decision.model] || 0) + cost;\n\n // Update cache hit rate\n this.updateCacheHitRate();\n\n // Update provider health\n this.metrics.providers = this.registry.getHealthStatus();\n }\n\n /**\n * Update cache hit rate metric\n */\n private updateCacheHitRate(): void {\n const totalCacheOps = this.metrics.cache.hits + this.metrics.cache.misses;\n this.metrics.cache.hitRate =\n totalCacheOps > 0 ? this.metrics.cache.hits / totalCacheOps : 0;\n }\n\n /**\n * Get current metrics\n */\n getMetrics(): GatewayMetrics {\n return { ...this.metrics };\n }\n\n /**\n * Get gateway configuration\n */\n getConfig(): GatewayConfig {\n return { ...this._config };\n }\n\n /**\n * Get provider registry\n */\n getRegistry(): ProviderRegistry {\n return this.registry;\n }\n\n /**\n * Get router\n */\n getRouter(): Router {\n return this.router;\n }\n\n /**\n * Check health of all providers\n */\n async checkHealth(): Promise<Record<string, boolean>> {\n const healthStatus = await this.registry.checkHealth();\n const result: Record<string, boolean> = {};\n\n for (const [name, health] of Object.entries(healthStatus)) {\n result[name] = health.status === 'healthy';\n }\n\n return result;\n }\n\n /**\n * Shut down the gateway\n */\n shutdown(): void {\n this.registry.stopHealthChecks();\n this.cache?.clear();\n this.logger.info('Gateway shut down');\n }\n}\n","/**\n * HTTP Server - OpenAI-compatible REST API\n */\n\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { logger } from 'hono/logger';\nimport { streamSSE } from 'hono/streaming';\nimport { serve, type ServerType } from '@hono/node-server';\nimport type { Gateway } from '../core/Gateway.js';\nimport type {\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatCompletionChunk,\n ServerConfig,\n} from '../core/types.js';\nimport { GatewayError, ValidationError } from '../core/types.js';\n\nexport interface HTTPServerOptions extends ServerConfig {\n gateway: Gateway;\n}\n\n/**\n * Creates an OpenAI-compatible HTTP server\n */\nexport function createHTTPServer(options: HTTPServerOptions): Hono {\n const { gateway, basePath = '' } = options;\n\n const app = new Hono();\n\n // Middleware\n app.use('*', logger());\n\n if (options.cors) {\n app.use(\n '*',\n cors({\n origin: options.cors.origin || '*',\n allowMethods: options.cors.methods || ['GET', 'POST', 'OPTIONS'],\n allowHeaders: options.cors.headers || [\n 'Content-Type',\n 'Authorization',\n 'X-Request-Id',\n ],\n }),\n );\n }\n\n // Health check\n app.get(`${basePath}/health`, async (c) => {\n const health = await gateway.checkHealth();\n const allHealthy = Object.values(health).every((h) => h);\n\n return c.json(\n {\n status: allHealthy ? 'healthy' : 'degraded',\n providers: health,\n timestamp: new Date().toISOString(),\n },\n allHealthy ? 200 : 503,\n );\n });\n\n // Metrics endpoint\n app.get(`${basePath}/metrics`, (c) => {\n const metrics = gateway.getMetrics();\n return c.json(metrics);\n });\n\n // Models endpoint (OpenAI-compatible)\n app.get(`${basePath}/v1/models`, (c) => {\n const registry = gateway.getRegistry();\n const models = registry.getAllModels();\n\n const data = models.map((model) => {\n const modelInfo = registry.getModelInfo(model);\n return {\n id: model,\n object: 'model',\n created: Math.floor(Date.now() / 1000),\n owned_by: modelInfo?.provider || 'unknown',\n };\n });\n\n return c.json({\n object: 'list',\n data,\n });\n });\n\n // Chat completions endpoint (OpenAI-compatible)\n app.post(`${basePath}/v1/chat/completions`, async (c) => {\n try {\n const body = await c.req.json<ChatCompletionRequest>();\n\n // Extract request ID from headers if present\n const requestId = c.req.header('X-Request-Id');\n if (requestId) {\n body._gateway = { ...body._gateway, requestId };\n }\n\n // Handle streaming\n if (body.stream) {\n return streamSSE(c, async (stream) => {\n try {\n const generator = (await gateway.chat.completions.create(\n body,\n )) as AsyncGenerator<ChatCompletionChunk>;\n\n for await (const chunk of generator) {\n await stream.writeSSE({\n data: JSON.stringify(chunk),\n });\n }\n\n await stream.writeSSE({ data: '[DONE]' });\n } catch (error) {\n const errorResponse = formatError(error);\n await stream.writeSSE({\n data: JSON.stringify({ error: errorResponse }),\n });\n }\n });\n }\n\n // Non-streaming\n const response = (await gateway.chat.completions.create(\n body,\n )) as ChatCompletionResponse;\n\n return c.json(response);\n } catch (error) {\n const { status, body } = formatError(error);\n return c.json(body, status as 400 | 401 | 429 | 500 | 502 | 503);\n }\n });\n\n // Legacy completions endpoint (redirect to chat)\n app.post(`${basePath}/v1/completions`, (c) => {\n return c.json(\n {\n error: {\n message:\n 'The completions endpoint is deprecated. Please use /v1/chat/completions instead.',\n type: 'invalid_request_error',\n code: 'deprecated_endpoint',\n },\n },\n 400,\n );\n });\n\n // Catch-all for unknown routes\n app.all('*', (c) => {\n return c.json(\n {\n error: {\n message: `Unknown endpoint: ${c.req.method} ${c.req.path}`,\n type: 'invalid_request_error',\n code: 'unknown_endpoint',\n },\n },\n 404,\n );\n });\n\n return app;\n}\n\n/**\n * Start the HTTP server\n */\nexport function startServer(\n app: Hono,\n options: { port?: number; host?: string },\n): ServerType {\n const port = options.port || 3000;\n const host = options.host || '0.0.0.0';\n\n const server = serve({\n fetch: app.fetch,\n port,\n hostname: host,\n });\n\n console.log(`Gateway server running on http://${host}:${port}`);\n\n return server;\n}\n\n/**\n * Format error for API response\n */\nfunction formatError(error: unknown): {\n status: number;\n body: { error: { message: string; type: string; code: string } };\n} {\n // Check for ValidationError\n if (error instanceof ValidationError) {\n return {\n status: 400,\n body: {\n error: {\n message: error.message,\n type: 'invalid_request_error',\n code: error.code,\n },\n },\n };\n }\n\n // Check for GatewayError\n if (error instanceof GatewayError) {\n return {\n status: error.statusCode,\n body: {\n error: {\n message: error.message,\n type: 'gateway_error',\n code: error.code,\n },\n },\n };\n }\n\n // Check for error objects with name property (for duck typing)\n if (error instanceof Error) {\n // Check if it has ValidationError-like properties\n if (\n 'name' in error &&\n error.name === 'ValidationError' &&\n 'code' in error\n ) {\n return {\n status: 400,\n body: {\n error: {\n message: error.message,\n type: 'invalid_request_error',\n code: (error as Error & { code: string }).code,\n },\n },\n };\n }\n\n // Check if it has GatewayError-like properties\n if (\n 'name' in error &&\n error.name === 'GatewayError' &&\n 'statusCode' in error &&\n 'code' in error\n ) {\n return {\n status: (error as Error & { statusCode: number }).statusCode,\n body: {\n error: {\n message: error.message,\n type: 'gateway_error',\n code: (error as Error & { code: string }).code,\n },\n },\n };\n }\n\n // Generic error\n return {\n status: 500,\n body: {\n error: {\n message: error.message,\n type: 'internal_error',\n code: 'internal_error',\n },\n },\n };\n }\n\n return {\n status: 500,\n body: {\n error: {\n message: 'An unknown error occurred',\n type: 'internal_error',\n code: 'unknown_error',\n },\n },\n };\n}\n","/**\n * Metrics collection and reporting\n */\n\nimport type { GatewayMetrics } from '../core/types.js';\n\nexport interface MetricsConfig {\n prefix?: string;\n labels?: string[];\n histogramBuckets?: {\n latency?: number[];\n tokens?: number[];\n };\n}\n\nexport interface HistogramData {\n count: number;\n sum: number;\n buckets: Map<number, number>;\n}\n\n/**\n * Simple in-memory metrics collector\n */\nexport class MetricsCollector {\n private readonly prefix: string;\n private counters: Map<string, number> = new Map();\n private gauges: Map<string, number> = new Map();\n private histograms: Map<string, HistogramData> = new Map();\n private readonly latencyBuckets: number[];\n private readonly tokenBuckets: number[];\n\n constructor(config: MetricsConfig = {}) {\n this.prefix = config.prefix || 'agentsea_gateway';\n this.latencyBuckets = config.histogramBuckets?.latency || [\n 50, 100, 250, 500, 1000, 2500, 5000, 10000,\n ];\n this.tokenBuckets = config.histogramBuckets?.tokens || [\n 100, 500, 1000, 2000, 5000, 10000, 50000,\n ];\n }\n\n /**\n * Get token histogram buckets\n */\n getTokenBuckets(): number[] {\n return [...this.tokenBuckets];\n }\n\n /**\n * Increment a counter\n */\n incrementCounter(\n name: string,\n value: number = 1,\n labels?: Record<string, string>,\n ): void {\n const key = this.formatKey(name, labels);\n const current = this.counters.get(key) || 0;\n this.counters.set(key, current + value);\n }\n\n /**\n * Set a gauge value\n */\n setGauge(name: string, value: number, labels?: Record<string, string>): void {\n const key = this.formatKey(name, labels);\n this.gauges.set(key, value);\n }\n\n /**\n * Record a histogram observation\n */\n recordHistogram(\n name: string,\n value: number,\n labels?: Record<string, string>,\n buckets?: number[],\n ): void {\n const key = this.formatKey(name, labels);\n let histogram = this.histograms.get(key);\n\n if (!histogram) {\n histogram = {\n count: 0,\n sum: 0,\n buckets: new Map(),\n };\n // Initialize buckets\n const bucketsToUse = buckets || this.latencyBuckets;\n for (const bucket of bucketsToUse) {\n histogram.buckets.set(bucket, 0);\n }\n histogram.buckets.set(Infinity, 0);\n this.histograms.set(key, histogram);\n }\n\n histogram.count++;\n histogram.sum += value;\n\n // Update bucket counts\n for (const [bucket, count] of histogram.buckets) {\n if (value <= bucket) {\n histogram.buckets.set(bucket, count + 1);\n }\n }\n }\n\n /**\n * Record request metrics\n */\n recordRequest(data: {\n provider: string;\n model: string;\n status: 'success' | 'error';\n latencyMs: number;\n inputTokens: number;\n outputTokens: number;\n cost: number;\n cached: boolean;\n }): void {\n const labels = { provider: data.provider, model: data.model };\n\n // Request count\n this.incrementCounter('requests_total', 1, {\n ...labels,\n status: data.status,\n cached: String(data.cached),\n });\n\n // Latency histogram\n this.recordHistogram('request_latency_ms', data.latencyMs, labels);\n\n // Token counters\n this.incrementCounter('tokens_input_total', data.inputTokens, labels);\n this.incrementCounter('tokens_output_total', data.outputTokens, labels);\n\n // Cost counter (in microdollars for precision)\n this.incrementCounter(\n 'cost_microdollars_total',\n Math.round(data.cost * 1_000_000),\n labels,\n );\n\n // Cache metrics\n if (data.cached) {\n this.incrementCounter('cache_hits_total', 1);\n }\n }\n\n /**\n * Get counter value\n */\n getCounter(name: string, labels?: Record<string, string>): number {\n const key = this.formatKey(name, labels);\n return this.counters.get(key) || 0;\n }\n\n /**\n * Get gauge value\n */\n getGauge(name: string, labels?: Record<string, string>): number {\n const key = this.formatKey(name, labels);\n return this.gauges.get(key) || 0;\n }\n\n /**\n * Get histogram data\n */\n getHistogram(\n name: string,\n labels?: Record<string, string>,\n ): HistogramData | undefined {\n const key = this.formatKey(name, labels);\n return this.histograms.get(key);\n }\n\n /**\n * Get all metrics as a summary object\n */\n getSummary(): GatewayMetrics {\n const requestsTotal = this.sumAllCounters('requests_total');\n const requestsSuccess = this.sumCountersByLabel(\n 'requests_total',\n 'status',\n 'success',\n );\n const requestsError = this.sumCountersByLabel(\n 'requests_total',\n 'status',\n 'error',\n );\n const requestsCached = this.sumCountersByLabel(\n 'requests_total',\n 'cached',\n 'true',\n );\n\n const latencyHistogram = this.aggregateHistograms('request_latency_ms');\n const avgLatency =\n latencyHistogram.count > 0\n ? latencyHistogram.sum / latencyHistogram.count\n : 0;\n\n const inputTokens = this.sumAllCounters('tokens_input_total');\n const outputTokens = this.sumAllCounters('tokens_output_total');\n\n const totalCostMicro = this.sumAllCounters('cost_microdollars_total');\n\n const cacheHits = this.getCounter('cache_hits_total');\n const cacheMisses = requestsTotal - cacheHits;\n\n return {\n requests: {\n total: requestsTotal,\n successful: requestsSuccess,\n failed: requestsError,\n cached: requestsCached,\n },\n latency: {\n avg: avgLatency,\n p50: this.calculatePercentile('request_latency_ms', 0.5),\n p95: this.calculatePercentile('request_latency_ms', 0.95),\n p99: this.calculatePercentile('request_latency_ms', 0.99),\n },\n tokens: {\n input: inputTokens,\n output: outputTokens,\n total: inputTokens + outputTokens,\n },\n cost: {\n total: totalCostMicro / 1_000_000,\n byProvider: this.getCostByLabel('provider'),\n byModel: this.getCostByLabel('model'),\n },\n cache: {\n hits: cacheHits,\n misses: cacheMisses,\n hitRate: requestsTotal > 0 ? cacheHits / requestsTotal : 0,\n },\n providers: {},\n };\n }\n\n /**\n * Export metrics in Prometheus format\n */\n toPrometheusFormat(): string {\n const lines: string[] = [];\n\n // Counters\n for (const [key, value] of this.counters) {\n lines.push(`${this.prefix}_${key} ${value}`);\n }\n\n // Gauges\n for (const [key, value] of this.gauges) {\n lines.push(`${this.prefix}_${key} ${value}`);\n }\n\n // Histograms\n for (const [key, histogram] of this.histograms) {\n for (const [bucket, count] of histogram.buckets) {\n const le = bucket === Infinity ? '+Inf' : bucket;\n lines.push(`${this.prefix}_${key}_bucket{le=\"${le}\"} ${count}`);\n }\n lines.push(`${this.prefix}_${key}_sum ${histogram.sum}`);\n lines.push(`${this.prefix}_${key}_count ${histogram.count}`);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Reset all metrics\n */\n reset(): void {\n this.counters.clear();\n this.gauges.clear();\n this.histograms.clear();\n }\n\n /**\n * Format metric key with labels\n */\n private formatKey(name: string, labels?: Record<string, string>): string {\n if (!labels || Object.keys(labels).length === 0) {\n return name;\n }\n const labelStr = Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(',');\n return `${name}{${labelStr}}`;\n }\n\n /**\n * Sum counters by a specific label value\n */\n private sumCountersByLabel(\n name: string,\n labelKey: string,\n labelValue: string,\n ): number {\n let sum = 0;\n for (const [key, value] of this.counters) {\n if (key.startsWith(name) && key.includes(`${labelKey}=\"${labelValue}\"`)) {\n sum += value;\n }\n }\n return sum;\n }\n\n /**\n * Sum all counters with a given name prefix\n */\n private sumAllCounters(namePrefix: string): number {\n let sum = 0;\n for (const [key, value] of this.counters) {\n if (key.startsWith(namePrefix)) {\n sum += value;\n }\n }\n return sum;\n }\n\n /**\n * Get cost breakdown by label\n */\n private getCostByLabel(labelKey: string): Record<string, number> {\n const result: Record<string, number> = {};\n const prefix = 'cost_microdollars_total';\n\n for (const [key, value] of this.counters) {\n if (key.startsWith(prefix)) {\n const match = key.match(new RegExp(`${labelKey}=\"([^\"]+)\"`));\n if (match) {\n const labelValue = match[1];\n result[labelValue] = (result[labelValue] || 0) + value / 1_000_000;\n }\n }\n }\n\n return result;\n }\n\n /**\n * Aggregate histograms for a metric name\n */\n private aggregateHistograms(name: string): HistogramData {\n const result: HistogramData = {\n count: 0,\n sum: 0,\n buckets: new Map(),\n };\n\n for (const [key, histogram] of this.histograms) {\n if (key.startsWith(name)) {\n result.count += histogram.count;\n result.sum += histogram.sum;\n for (const [bucket, count] of histogram.buckets) {\n const existing = result.buckets.get(bucket) || 0;\n result.buckets.set(bucket, existing + count);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Calculate percentile from histogram (approximate)\n */\n private calculatePercentile(name: string, percentile: number): number {\n const histogram = this.aggregateHistograms(name);\n\n if (histogram.count === 0) return 0;\n\n // Sort by bucket boundary\n const sortedBuckets = Array.from(histogram.buckets.entries()).sort(\n ([a], [b]) => a - b,\n );\n\n const targetCount = histogram.count * percentile;\n let prevBucket = 0;\n let prevCount = 0;\n\n for (const [bucket, count] of sortedBuckets) {\n if (count >= targetCount) {\n // Found the bucket containing our percentile\n // Linear interpolation within this bucket\n const bucketRange = bucket - prevBucket;\n const bucketCount = count - prevCount; // Values in this bucket\n\n if (bucketCount === 0) {\n return prevBucket;\n }\n\n const positionInBucket = targetCount - prevCount;\n const fraction = positionInBucket / bucketCount;\n return prevBucket + bucketRange * Math.max(0, Math.min(1, fraction));\n }\n prevBucket = bucket;\n prevCount = count;\n }\n\n return prevBucket;\n }\n}\n"]}
|