feat(ai): DB-only config + runtime provider selection via factory

This commit is contained in:
Chris Chen
2026-06-25 13:23:13 -07:00
parent ece9938bfb
commit 120240ad0c
8 changed files with 132 additions and 57 deletions
+7 -16
View File
@@ -180,24 +180,15 @@ builder.Services.AddHttpClient<ROLAC.API.Services.Notifications.IMessageChannel,
ROLAC.API.Services.Notifications.LineMessageChannel>();
// ── AI assist (expense translation + category suggestion) ──────────────────
// Backend proxy so the API key stays server-side. Two interchangeable providers (Claude / Gemini)
// implement IExpenseAiService; "Ai:Provider" selects which one is bound (default Claude).
builder.Services.Configure<ROLAC.API.Services.Ai.GeminiOptions>(config.GetSection("Gemini"));
builder.Services.Configure<ROLAC.API.Services.Ai.ClaudeOptions>(config.GetSection("Claude"));
// Backend proxy so the API key stays server-side. Provider + model + key come from the
// ChurchProfile DB record (editable via Church Profile → AI 設定); the factory picks Claude
// or Gemini per request based on ChurchProfile.AiProvider.
builder.Services.AddHttpClient<ROLAC.API.Services.Ai.GeminiExpenseAiService>();
builder.Services.AddHttpClient<ROLAC.API.Services.Ai.ClaudeExpenseAiService>();
var aiProvider = config["Ai:Provider"] ?? "Claude";
if (aiProvider.Equals("Gemini", StringComparison.OrdinalIgnoreCase))
{
builder.Services.AddScoped<ROLAC.API.Services.Ai.IExpenseAiService>(
sp => sp.GetRequiredService<ROLAC.API.Services.Ai.GeminiExpenseAiService>());
}
else
{
builder.Services.AddScoped<ROLAC.API.Services.Ai.IExpenseAiService>(
sp => sp.GetRequiredService<ROLAC.API.Services.Ai.ClaudeExpenseAiService>());
}
builder.Services.AddScoped<ROLAC.API.Services.Ai.IChurchAiConfigProvider,
ROLAC.API.Services.Ai.ChurchAiConfigProvider>();
builder.Services.AddScoped<ROLAC.API.Services.Ai.IExpenseAiServiceFactory,
ROLAC.API.Services.Ai.ExpenseAiServiceFactory>();
// ---------------------------------------------------------------------------
// Configurable role-based permissions (RBAC matrix)