@@ -75,11 +75,19 @@ try
|
||||
builder.Services.Configure<SmtpSettings>(builder.Configuration.GetSection("Smtp"));
|
||||
builder.Services.Configure<CaptchaSettings>(builder.Configuration.GetSection("Captcha"));
|
||||
builder.Services.Configure<FileStorageSettings>(builder.Configuration.GetSection("FileStorage"));
|
||||
builder.Services.Configure<RagSettings>(builder.Configuration.GetSection("Rag"));
|
||||
builder.Services.Configure<OpenAiSettings>(builder.Configuration.GetSection("OpenAI"));
|
||||
|
||||
// Services
|
||||
builder.Services.AddHttpClient<ICaptchaVerifier, RecaptchaVerifier>();
|
||||
builder.Services.AddSingleton<IEmailSender, SmtpEmailSender>();
|
||||
builder.Services.AddSingleton<Microsoft.AspNetCore.StaticFiles.IContentTypeProvider, Microsoft.AspNetCore.StaticFiles.FileExtensionContentTypeProvider>();
|
||||
builder.Services.AddSingleton<Api.Services.Rag.IPdfTextExtractor, Api.Services.Rag.PdfTextExtractor>();
|
||||
builder.Services.AddSingleton<Api.Services.Rag.ITextChunker, Api.Services.Rag.TextChunker>();
|
||||
builder.Services.AddSingleton<Api.Services.Rag.ICvVectorStore, Api.Services.Rag.InMemoryCvVectorStore>();
|
||||
builder.Services.AddScoped<Api.Services.Rag.ICvRagService, Api.Services.Rag.CvRagService>();
|
||||
builder.Services.AddHttpClient<Api.Services.Rag.IOpenAiRagClient, Api.Services.Rag.OpenAiRagClient>();
|
||||
builder.Services.AddHttpClient<Api.Services.Rag.IJobTextExtractor, Api.Services.Rag.JobTextExtractor>();
|
||||
|
||||
// Swagger
|
||||
builder.Services.AddEndpointsApiExplorer();
|
||||
@@ -162,6 +170,22 @@ try
|
||||
);
|
||||
});
|
||||
|
||||
// Policy: CV matcher, expensive because it calls AI APIs.
|
||||
options.AddPolicy("rag", httpContext =>
|
||||
{
|
||||
var ip = httpContext.Connection.RemoteIpAddress?.ToString() ?? "unknown";
|
||||
return RateLimitPartition.GetFixedWindowLimiter(
|
||||
partitionKey: ip,
|
||||
factory: _ => new FixedWindowRateLimiterOptions
|
||||
{
|
||||
PermitLimit = 10,
|
||||
Window = TimeSpan.FromMinutes(10),
|
||||
QueueLimit = 0,
|
||||
AutoReplenishment = true
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
options.RejectionStatusCode = StatusCodes.Status429TooManyRequests;
|
||||
|
||||
options.OnRejected = async (context, ct) =>
|
||||
|
||||
Reference in New Issue
Block a user