Saltar al contenido principal

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.).

info

A responsabilidade de decidir qual strategy será utilizada pertence à camada de aplicação, que centraliza essa escolha em um context.


🔄 Fluxo de Execução

  1. 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.
  2. Strategy (Infra.AiModels)

    • Implementa a lógica específica do provedor de IA.
    • Todas as strategies seguem a abstração IAiModelStrategy.
  3. 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:

AiProvider.cs
public enum AiProvider
{
OpenAi,
DeepSeek,
Gemini,
Groq,
}
nota

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 AiProvider como chave para decidir qual strategy acionar.

  • Esse design garante extensibilidade — novos provedores podem ser adicionados facilmente apenas criando:

    1. Um novo valor no enum AiProvider.
    2. Uma implementação de IAiModelStrategy.
    3. O registro no context.

📌 Pontos Importantes

  • Camada de aplicação controla o contexto (EnderecoAiContext), escolhendo a strategy com base em:

    1. Configuração em banco de dados (ex.: ModeloIAEndereco).
    2. Definição no appsettings.json ou variáveis de ambiente.
    3. Regras de consumo (ex.: troca automática ao atingir limite de tokens).
  • 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.