Changes
Build and Push Docker Images / build (push) Successful in 20s

This commit is contained in:
2026-05-04 17:49:04 +03:00
parent 597a3f8d34
commit ab31d41d88
12 changed files with 54 additions and 37 deletions
+1
View File
@@ -1,3 +1,4 @@
using api.Services.Contracts.Rag;
using Api.Models.Rag; using Api.Models.Rag;
using Api.Services.Rag; using Api.Services.Rag;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
+9 -6
View File
@@ -1,5 +1,8 @@
using api.Services.Contracts.Rag;
using Api.Services; using Api.Services;
using Api.Services.Contracts; using Api.Services.Contracts;
using Api.Services.Contracts.Rag;
using Api.Services.Rag;
using Api.Settings; using Api.Settings;
using Azure.Identity; using Azure.Identity;
using Microsoft.AspNetCore.HttpOverrides; using Microsoft.AspNetCore.HttpOverrides;
@@ -82,12 +85,12 @@ try
builder.Services.AddHttpClient<ICaptchaVerifier, RecaptchaVerifier>(); builder.Services.AddHttpClient<ICaptchaVerifier, RecaptchaVerifier>();
builder.Services.AddSingleton<IEmailSender, SmtpEmailSender>(); builder.Services.AddSingleton<IEmailSender, SmtpEmailSender>();
builder.Services.AddSingleton<Microsoft.AspNetCore.StaticFiles.IContentTypeProvider, Microsoft.AspNetCore.StaticFiles.FileExtensionContentTypeProvider>(); 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<IPdfTextExtractor, PdfTextExtractor>();
builder.Services.AddSingleton<Api.Services.Rag.ITextChunker, Api.Services.Rag.TextChunker>(); builder.Services.AddSingleton<ITextChunker, TextChunker>();
builder.Services.AddSingleton<Api.Services.Rag.ICvVectorStore, Api.Services.Rag.InMemoryCvVectorStore>(); builder.Services.AddSingleton<ICvVectorStore, InMemoryCvVectorStore>();
builder.Services.AddScoped<Api.Services.Rag.ICvRagService, Api.Services.Rag.CvRagService>(); builder.Services.AddScoped<ICvRagService, CvRagService>();
builder.Services.AddHttpClient<Api.Services.Rag.IOpenAiRagClient, Api.Services.Rag.OpenAiRagClient>(); builder.Services.AddHttpClient<IAiRagClient, OpenAiRagClient>();
builder.Services.AddHttpClient<Api.Services.Rag.IJobTextExtractor, Api.Services.Rag.JobTextExtractor>(); builder.Services.AddHttpClient<IJobTextExtractor, JobTextExtractor>();
// Swagger // Swagger
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
@@ -0,0 +1,7 @@
namespace Api.Services.Contracts.Rag;
public interface IAiRagClient
{
Task<float[]> CreateEmbeddingAsync(string input, CancellationToken ct);
Task<string> CreateChatCompletionAsync(string systemPrompt, string userPrompt, CancellationToken ct);
}
@@ -0,0 +1,9 @@
using Api.Models.Rag;
namespace api.Services.Contracts.Rag;
public interface ICvRagService
{
Task<CvIngestResponse> IngestCvAsync(IFormFile file, bool gdprConsent, CancellationToken ct);
Task<JobMatchResponse> MatchJobAsync(JobMatchRequest request, CancellationToken ct);
}
@@ -0,0 +1,6 @@
namespace Api.Services.Contracts.Rag;
public interface IJobTextExtractor
{
Task<string> ExtractAsync(string? jobUrl, string? jobDescription, CancellationToken ct);
}
@@ -0,0 +1,6 @@
namespace Api.Services.Contracts.Rag;
public interface IPdfTextExtractor
{
string ExtractText(Stream pdfStream);
}
@@ -0,0 +1,6 @@
namespace Api.Services.Contracts.Rag;
public interface ITextChunker
{
IReadOnlyList<string> Chunk(string text, int chunkSize, int overlap);
}
+4 -8
View File
@@ -1,21 +1,17 @@
using api.Services.Contracts.Rag;
using Api.Models.Rag; using Api.Models.Rag;
using Api.Services.Contracts.Rag;
using Api.Settings; using Api.Settings;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using System.Text.Json; using System.Text.Json;
namespace Api.Services.Rag; namespace Api.Services.Rag;
public interface ICvRagService
{
Task<CvIngestResponse> IngestCvAsync(IFormFile file, bool gdprConsent, CancellationToken ct);
Task<JobMatchResponse> MatchJobAsync(JobMatchRequest request, CancellationToken ct);
}
public sealed class CvRagService : ICvRagService public sealed class CvRagService : ICvRagService
{ {
private readonly IPdfTextExtractor _pdfTextExtractor; private readonly IPdfTextExtractor _pdfTextExtractor;
private readonly ITextChunker _textChunker; private readonly ITextChunker _textChunker;
private readonly IOpenAiRagClient _openAi; private readonly IAiRagClient _openAi;
private readonly ICvVectorStore _store; private readonly ICvVectorStore _store;
private readonly IJobTextExtractor _jobTextExtractor; private readonly IJobTextExtractor _jobTextExtractor;
private readonly RagSettings _settings; private readonly RagSettings _settings;
@@ -24,7 +20,7 @@ public sealed class CvRagService : ICvRagService
public CvRagService( public CvRagService(
IPdfTextExtractor pdfTextExtractor, IPdfTextExtractor pdfTextExtractor,
ITextChunker textChunker, ITextChunker textChunker,
IOpenAiRagClient openAi, IAiRagClient openAi,
ICvVectorStore store, ICvVectorStore store,
IJobTextExtractor jobTextExtractor, IJobTextExtractor jobTextExtractor,
IOptions<RagSettings> options, IOptions<RagSettings> options,
+1 -6
View File
@@ -1,15 +1,10 @@
using System.Net; using System.Net;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Api.Services.Contracts.Rag;
using Api.Settings; using Api.Settings;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
namespace Api.Services.Rag; namespace Api.Services.Rag;
public interface IJobTextExtractor
{
Task<string> ExtractAsync(string? jobUrl, string? jobDescription, CancellationToken ct);
}
public sealed class JobTextExtractor : IJobTextExtractor public sealed class JobTextExtractor : IJobTextExtractor
{ {
private readonly HttpClient _httpClient; private readonly HttpClient _httpClient;
+2 -7
View File
@@ -2,18 +2,13 @@ using System.Net.Http.Headers;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Api.Services.Contracts.Rag;
using Api.Settings; using Api.Settings;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
namespace Api.Services.Rag; namespace Api.Services.Rag;
public interface IOpenAiRagClient public sealed class OpenAiRagClient : IAiRagClient
{
Task<float[]> CreateEmbeddingAsync(string input, CancellationToken ct);
Task<string> CreateChatCompletionAsync(string systemPrompt, string userPrompt, CancellationToken ct);
}
public sealed class OpenAiRagClient : IOpenAiRagClient
{ {
private readonly HttpClient _httpClient; private readonly HttpClient _httpClient;
private readonly OpenAiSettings _settings; private readonly OpenAiSettings _settings;
+1 -5
View File
@@ -1,13 +1,9 @@
using Api.Services.Contracts.Rag;
using System.Text; using System.Text;
using UglyToad.PdfPig; using UglyToad.PdfPig;
namespace Api.Services.Rag; namespace Api.Services.Rag;
public interface IPdfTextExtractor
{
string ExtractText(Stream pdfStream);
}
public sealed class PdfTextExtractor : IPdfTextExtractor public sealed class PdfTextExtractor : IPdfTextExtractor
{ {
public string ExtractText(Stream pdfStream) public string ExtractText(Stream pdfStream)
+2 -5
View File
@@ -1,9 +1,6 @@
namespace Api.Services.Rag; using Api.Services.Contracts.Rag;
public interface ITextChunker namespace Api.Services.Rag;
{
IReadOnlyList<string> Chunk(string text, int chunkSize, int overlap);
}
public sealed class TextChunker : ITextChunker public sealed class TextChunker : ITextChunker
{ {