using ChatApi.Data; using ChatRAG.Contracts.VectorSearch; using ChatRAG.Data; using ChatRAG.Services.Contracts; using ChatRAG.Services.ResponseService; using ChatRAG.Services.TextServices; using ChatRAG.Settings.ChatRAG.Configuration; using Microsoft.Extensions.Options; namespace ChatRAG.Services.SearchVectors { public class VectorDatabaseFactory : IVectorDatabaseFactory { private readonly IServiceProvider _serviceProvider; private readonly VectorDatabaseSettings _settings; private readonly ILogger _logger; public VectorDatabaseFactory( IServiceProvider serviceProvider, IOptions settings, ILogger logger) { _serviceProvider = serviceProvider; _settings = settings.Value; _logger = logger; } public string GetActiveProvider() { return _settings.Provider; } public VectorDatabaseSettings GetSettings() { return _settings; } public IVectorSearchService CreateVectorSearchService() { _logger.LogInformation("Criando VectorSearchService para provider: {Provider}", _settings.Provider); return _settings.Provider.ToLower() switch { "qdrant" => GetService(), "mongodb" => GetService(), "chroma" => GetService(), _ => throw new ArgumentException($"Provider de VectorSearch não suportado: {_settings.Provider}") }; } public ITextDataService CreateTextDataService() { _logger.LogInformation("Criando TextDataService para provider: {Provider}", _settings.Provider); return _settings.Provider.ToLower() switch { "qdrant" => GetService(), "mongodb" => GetService(), "chroma" => GetService(), _ => throw new ArgumentException($"Provider de TextDataService não suportado: {_settings.Provider}") }; } public IResponseService CreateResponseService() { _logger.LogInformation("Criando ResponseService para provider: {Provider}", _settings.Provider); // Verificar se deve usar RAG Hierárquico var configuration = _serviceProvider.GetService(); var useHierarchical = configuration?.GetValue("Features:UseHierarchicalRAG") ?? false; var useConfidenceAware = configuration?.GetValue("Features:UseConfidenceAwareRAG") ?? false; if (useHierarchical && !useConfidenceAware) { _logger.LogInformation("Usando HierarchicalRAGService"); return GetService(); } if (useConfidenceAware) { _logger.LogInformation("Usando ConfidenceAwareRAGService"); return GetService(); } // Usar estratégia baseada no provider ou configuração var ragStrategy = configuration?.GetValue("Features:RAGStrategy"); return ragStrategy?.ToLower() switch { "hierarchical" => GetService(), "standard" => GetService(), _ => GetService() // Padrão }; } private T GetService() where T : class { var service = _serviceProvider.GetService(); if (service == null) { throw new InvalidOperationException($"Serviço {typeof(T).Name} não está registrado no DI container. " + $"Verifique se o serviço foi registrado para o provider '{_settings.Provider}'."); } return service; } } }