namespace AnchorCli.Providers; /// /// Factory for creating provider instances based on endpoint or provider name. /// internal static class ProviderFactory { /// /// Creates a token extractor based on the provider name. /// public static ITokenExtractor CreateTokenExtractor(string providerName) { return providerName.ToLowerInvariant() switch { "openrouter" => new OpenRouterTokenExtractor(), "groq" => new GroqTokenExtractor(), "ollama" => new OllamaTokenExtractor(), _ => new GenericTokenExtractor() }; } /// /// Creates a token extractor by auto-detecting from the endpoint URL. /// public static ITokenExtractor CreateTokenExtractorForEndpoint(string endpoint) { if (string.IsNullOrEmpty(endpoint)) { return new GenericTokenExtractor(); } var url = endpoint.ToLowerInvariant(); if (url.Contains("openrouter")) { return new OpenRouterTokenExtractor(); } if (url.Contains("groq")) { return new GroqTokenExtractor(); } if (url.Contains("ollama") || url.Contains("localhost") || url.Contains("127.0.0.1")) { return new OllamaTokenExtractor(); } return new GenericTokenExtractor(); } /// /// Creates a pricing provider based on the provider name. /// Only OpenRouter has a pricing API currently. /// public static IPricingProvider? CreatePricingProvider(string providerName) { return providerName.ToLowerInvariant() switch { "openrouter" => new OpenRouterProvider(), _ => null // Other providers don't have pricing APIs yet }; } /// /// Determines if an endpoint is OpenRouter. /// public static bool IsOpenRouter(string endpoint) => !string.IsNullOrEmpty(endpoint) && endpoint.Contains("openrouter", StringComparison.OrdinalIgnoreCase); }