Fluxo de Execução
A camada Infra.AiModels fornece apenas strategies, abstrações e models, encapsulando a lógica de cada provedor de IA (OpenAI, Gemini, Groq, DeepSeek, etc.).
A responsabilidade de decidir qual strategy será utilizada pertence à camada de aplicação, que centraliza essa escolha em um context.
🔄 Fluxo de Execução
-
Camada de Aplicação (Context)
- Recebe o cenário de uso (ex.: endereçamento).
- Avalia critérios (configuração em banco,
appsettings, limites de consumo). - Define qual provider/strategy deve ser utilizado.
-
Strategy (Infra.AiModels)
- Implementa a lógica específica do provedor de IA.
- Todas as strategies seguem a abstração
IAiModelStrategy.
-
Execução
- A aplicação invoca a strategy escolhida.
- O resultado retorna para a aplicação, que continua o fluxo de negócio.
🧩 Exemplo – EnderecoAiContext
public class EnderecoAiContext : IEnderecoAiContext
{
private readonly IDictionary<AiProvider, IAiModelStrategy> _strategies;
public EnderecoAiContext(IEnumerable<IAiModelStrategy> strategies)
{
_strategies = strategies?.ToDictionary(
strategy => strategy switch
{
OpenAiStrategy => AiProvider.OpenAi,
GeminiStrategy => AiProvider.Gemini,
GroqStrategy => AiProvider.Groq,
DeepSeekStrategy => AiProvider.DeepSeek,
_ => throw new NotSupportedException("Estratégia desconhecida.")
})
?? throw new ArgumentNullException(nameof(strategies));
}
public IAiModelStrategy GetProvider()
{
/*
* Podemos selecionar o modelo por:
* 1. Alguma parâmetro no banco (qual modelo é usado para essa operação: ModeloIAEndereco)
* 2. Definição no appSettings.json ou ENV
* 3. Algum registro de consumo no banco: Alternar modelo quando o consumo do modelo atual chegar a X tokens
*/
}
public IAiModelStrategy GetProvider(AiProvider provider)
{
if (_strategies.TryGetValue(provider, out var strategy))
{
return strategy;
}
throw new KeyNotFoundException($"Estratégia '{provider}' não registrada.");
}
}
🧾 Enum de Providers
A escolha de qual strategy executar é feita a partir do enum AiProvider.
Cada valor corresponde a um provedor de IA suportado pelo sistema:
public enum AiProvider
{
OpenAi,
DeepSeek,
Gemini,
Groq,
}
Esse enum serve como chave de decisão no context da aplicação, garantindo que o código seja expressivo e evitando o uso de strings mágicas.
Exemplo de uso dentro do EnderecoAiContext:
var strategy = _enderecoAiContext.GetProvider(AiProvider.OpenAi);
var result = await strategy.ExecuteAsync(context);
📌 Resumo
-
Infra.AiModels fornece apenas strategies e abstrações.
-
Aplicação utiliza o
AiProvidercomo chave para decidir qual strategy acionar. -
Esse design garante extensibilidade — novos provedores podem ser adicionados facilmente apenas criando:
- Um novo valor no
enum AiProvider. - Uma implementação de
IAiModelStrategy. - O registro no context.
- Um novo valor no
📌 Pontos Importantes
-
Camada de aplicação controla o contexto (
EnderecoAiContext), escolhendo a strategy com base em:- Configuração em banco de dados (ex.:
ModeloIAEndereco). - Definição no
appsettings.jsonou variáveis de ambiente. - Regras de consumo (ex.: troca automática ao atingir limite de tokens).
- Configuração em banco de dados (ex.:
-
Infra.AiModels não contém lógica de seleção, apenas as implementações (
OpenAiStrategy,GeminiStrategy, etc.). -
Essa separação garante:
- Flexibilidade para adicionar novos providers.
- Baixo acoplamento entre negócio e implementação de IA.
- Reuso do mesmo core de abstrações em diferentes contextos de aplicação.