This commit is contained in:
Chris Chen
2026-06-25 12:38:13 -07:00
parent a89e936f4d
commit bdccb79029
11 changed files with 416 additions and 103 deletions
+18 -4
View File
@@ -179,11 +179,25 @@ builder.Services.AddScoped<ROLAC.API.Services.Notifications.ILineNotificationSer
builder.Services.AddHttpClient<ROLAC.API.Services.Notifications.IMessageChannel,
ROLAC.API.Services.Notifications.LineMessageChannel>();
// ── AI assist (Google Gemini) ──────────────────────────────────────────────
// Backend proxy for expense translation + category suggestion; the API key stays server-side.
// ── 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.AddHttpClient<ROLAC.API.Services.Ai.IExpenseAiService,
ROLAC.API.Services.Ai.GeminiExpenseAiService>();
builder.Services.Configure<ROLAC.API.Services.Ai.ClaudeOptions>(config.GetSection("Claude"));
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>());
}
// ---------------------------------------------------------------------------
// Configurable role-based permissions (RBAC matrix)