feat(backend): add LLM provider abstraction, contextual ranking and explanations

Add a pluggable LLM provider with an offline template fallback, prompt builder, contextual match scoring (area/location boosts, availability), per-solution explanations and in-memory request limiting for cost control.
This commit is contained in:
Rafał Tyński
2026-10-04 02:52:45 +02:00
parent 182c26d9f8
commit 03e2d66ca4
11 changed files with 385 additions and 23 deletions
@@ -5,6 +5,7 @@ using TarninaHub.Application.Abstractions;
using TarninaHub.Application.Matchmaking;
using TarninaHub.Infrastructure.Auth;
using TarninaHub.Infrastructure.Events;
using TarninaHub.Infrastructure.Llm;
using TarninaHub.Infrastructure.Persistence;
using TarninaHub.Infrastructure.Settings;
@@ -19,6 +20,23 @@ public static class DependencyInjection
services.Configure<SurrealDbSettings>(configuration.GetSection("SurrealDb"));
services.Configure<AuthSettings>(configuration.GetSection("Auth"));
var llmSettings = configuration.GetSection("Llm").Get<LlmSettings>() ?? new LlmSettings();
services.Configure<LlmSettings>(configuration.GetSection("Llm"));
services.AddSingleton<ILlmRequestLimiter>(
new InMemoryLlmRequestLimiter(llmSettings.MaxRequestsPerMinute));
if (llmSettings.IsConfigured)
{
services.AddHttpClient<OpenAiCompatibleLlmProvider>(
client => client.Timeout = TimeSpan.FromSeconds(llmSettings.TimeoutSeconds));
services.AddSingleton<ILlmProvider>(
provider => provider.GetRequiredService<OpenAiCompatibleLlmProvider>());
}
else
{
services.AddSingleton<ILlmProvider, NullLlmProvider>();
}
var settings = configuration.GetSection("SurrealDb").Get<SurrealDbSettings>()
?? new SurrealDbSettings();