From ab31d41d88fd0acf38893fd37fc3f74f1c208ac3 Mon Sep 17 00:00:00 2001 From: Gelu Mihes Date: Mon, 4 May 2026 17:49:04 +0300 Subject: [PATCH] Changes --- api/Controllers/RagController.cs | 1 + api/Program.cs | 15 +++++++++------ api/Services/Contracts/Rag/IAiRagClient.cs | 7 +++++++ api/Services/Contracts/Rag/ICvRagService.cs | 9 +++++++++ api/Services/Contracts/Rag/IJobTextExtractor.cs | 6 ++++++ api/Services/Contracts/Rag/IPdfTextExtractor.cs | 6 ++++++ api/Services/Contracts/Rag/ITextChunker.cs | 6 ++++++ api/Services/Rag/CvRagService.cs | 12 ++++-------- api/Services/Rag/JobTextExtractor.cs | 7 +------ api/Services/Rag/OpenAiRagClient.cs | 9 ++------- api/Services/Rag/PdfTextExtractor.cs | 6 +----- api/Services/Rag/TextChunker.cs | 7 ++----- 12 files changed, 54 insertions(+), 37 deletions(-) create mode 100644 api/Services/Contracts/Rag/IAiRagClient.cs create mode 100644 api/Services/Contracts/Rag/ICvRagService.cs create mode 100644 api/Services/Contracts/Rag/IJobTextExtractor.cs create mode 100644 api/Services/Contracts/Rag/IPdfTextExtractor.cs create mode 100644 api/Services/Contracts/Rag/ITextChunker.cs diff --git a/api/Controllers/RagController.cs b/api/Controllers/RagController.cs index 04ca80c..d9d8554 100644 --- a/api/Controllers/RagController.cs +++ b/api/Controllers/RagController.cs @@ -1,3 +1,4 @@ +using api.Services.Contracts.Rag; using Api.Models.Rag; using Api.Services.Rag; using Microsoft.AspNetCore.Mvc; diff --git a/api/Program.cs b/api/Program.cs index 63885e0..f902e32 100644 --- a/api/Program.cs +++ b/api/Program.cs @@ -1,5 +1,8 @@ +using api.Services.Contracts.Rag; using Api.Services; using Api.Services.Contracts; +using Api.Services.Contracts.Rag; +using Api.Services.Rag; using Api.Settings; using Azure.Identity; using Microsoft.AspNetCore.HttpOverrides; @@ -82,12 +85,12 @@ try builder.Services.AddHttpClient(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddScoped(); - builder.Services.AddHttpClient(); - builder.Services.AddHttpClient(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddScoped(); + builder.Services.AddHttpClient(); + builder.Services.AddHttpClient(); // Swagger builder.Services.AddEndpointsApiExplorer(); diff --git a/api/Services/Contracts/Rag/IAiRagClient.cs b/api/Services/Contracts/Rag/IAiRagClient.cs new file mode 100644 index 0000000..8f58ac1 --- /dev/null +++ b/api/Services/Contracts/Rag/IAiRagClient.cs @@ -0,0 +1,7 @@ +namespace Api.Services.Contracts.Rag; + +public interface IAiRagClient +{ + Task CreateEmbeddingAsync(string input, CancellationToken ct); + Task CreateChatCompletionAsync(string systemPrompt, string userPrompt, CancellationToken ct); +} diff --git a/api/Services/Contracts/Rag/ICvRagService.cs b/api/Services/Contracts/Rag/ICvRagService.cs new file mode 100644 index 0000000..11ae11d --- /dev/null +++ b/api/Services/Contracts/Rag/ICvRagService.cs @@ -0,0 +1,9 @@ +using Api.Models.Rag; + +namespace api.Services.Contracts.Rag; + +public interface ICvRagService +{ + Task IngestCvAsync(IFormFile file, bool gdprConsent, CancellationToken ct); + Task MatchJobAsync(JobMatchRequest request, CancellationToken ct); +} diff --git a/api/Services/Contracts/Rag/IJobTextExtractor.cs b/api/Services/Contracts/Rag/IJobTextExtractor.cs new file mode 100644 index 0000000..1c70ddc --- /dev/null +++ b/api/Services/Contracts/Rag/IJobTextExtractor.cs @@ -0,0 +1,6 @@ +namespace Api.Services.Contracts.Rag; + +public interface IJobTextExtractor +{ + Task ExtractAsync(string? jobUrl, string? jobDescription, CancellationToken ct); +} diff --git a/api/Services/Contracts/Rag/IPdfTextExtractor.cs b/api/Services/Contracts/Rag/IPdfTextExtractor.cs new file mode 100644 index 0000000..d1435fd --- /dev/null +++ b/api/Services/Contracts/Rag/IPdfTextExtractor.cs @@ -0,0 +1,6 @@ +namespace Api.Services.Contracts.Rag; + +public interface IPdfTextExtractor +{ + string ExtractText(Stream pdfStream); +} diff --git a/api/Services/Contracts/Rag/ITextChunker.cs b/api/Services/Contracts/Rag/ITextChunker.cs new file mode 100644 index 0000000..cd158d4 --- /dev/null +++ b/api/Services/Contracts/Rag/ITextChunker.cs @@ -0,0 +1,6 @@ +namespace Api.Services.Contracts.Rag; + +public interface ITextChunker +{ + IReadOnlyList Chunk(string text, int chunkSize, int overlap); +} diff --git a/api/Services/Rag/CvRagService.cs b/api/Services/Rag/CvRagService.cs index 906cca7..952a20b 100644 --- a/api/Services/Rag/CvRagService.cs +++ b/api/Services/Rag/CvRagService.cs @@ -1,21 +1,17 @@ +using api.Services.Contracts.Rag; using Api.Models.Rag; +using Api.Services.Contracts.Rag; using Api.Settings; using Microsoft.Extensions.Options; using System.Text.Json; namespace Api.Services.Rag; -public interface ICvRagService -{ - Task IngestCvAsync(IFormFile file, bool gdprConsent, CancellationToken ct); - Task MatchJobAsync(JobMatchRequest request, CancellationToken ct); -} - public sealed class CvRagService : ICvRagService { private readonly IPdfTextExtractor _pdfTextExtractor; private readonly ITextChunker _textChunker; - private readonly IOpenAiRagClient _openAi; + private readonly IAiRagClient _openAi; private readonly ICvVectorStore _store; private readonly IJobTextExtractor _jobTextExtractor; private readonly RagSettings _settings; @@ -24,7 +20,7 @@ public sealed class CvRagService : ICvRagService public CvRagService( IPdfTextExtractor pdfTextExtractor, ITextChunker textChunker, - IOpenAiRagClient openAi, + IAiRagClient openAi, ICvVectorStore store, IJobTextExtractor jobTextExtractor, IOptions options, diff --git a/api/Services/Rag/JobTextExtractor.cs b/api/Services/Rag/JobTextExtractor.cs index 2454502..719c06d 100644 --- a/api/Services/Rag/JobTextExtractor.cs +++ b/api/Services/Rag/JobTextExtractor.cs @@ -1,15 +1,10 @@ using System.Net; using System.Text.RegularExpressions; +using Api.Services.Contracts.Rag; using Api.Settings; using Microsoft.Extensions.Options; namespace Api.Services.Rag; - -public interface IJobTextExtractor -{ - Task ExtractAsync(string? jobUrl, string? jobDescription, CancellationToken ct); -} - public sealed class JobTextExtractor : IJobTextExtractor { private readonly HttpClient _httpClient; diff --git a/api/Services/Rag/OpenAiRagClient.cs b/api/Services/Rag/OpenAiRagClient.cs index a90015f..d914a40 100644 --- a/api/Services/Rag/OpenAiRagClient.cs +++ b/api/Services/Rag/OpenAiRagClient.cs @@ -2,18 +2,13 @@ using System.Net.Http.Headers; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; +using Api.Services.Contracts.Rag; using Api.Settings; using Microsoft.Extensions.Options; namespace Api.Services.Rag; -public interface IOpenAiRagClient -{ - Task CreateEmbeddingAsync(string input, CancellationToken ct); - Task CreateChatCompletionAsync(string systemPrompt, string userPrompt, CancellationToken ct); -} - -public sealed class OpenAiRagClient : IOpenAiRagClient +public sealed class OpenAiRagClient : IAiRagClient { private readonly HttpClient _httpClient; private readonly OpenAiSettings _settings; diff --git a/api/Services/Rag/PdfTextExtractor.cs b/api/Services/Rag/PdfTextExtractor.cs index 68dd058..dbf8133 100644 --- a/api/Services/Rag/PdfTextExtractor.cs +++ b/api/Services/Rag/PdfTextExtractor.cs @@ -1,13 +1,9 @@ +using Api.Services.Contracts.Rag; using System.Text; using UglyToad.PdfPig; namespace Api.Services.Rag; -public interface IPdfTextExtractor -{ - string ExtractText(Stream pdfStream); -} - public sealed class PdfTextExtractor : IPdfTextExtractor { public string ExtractText(Stream pdfStream) diff --git a/api/Services/Rag/TextChunker.cs b/api/Services/Rag/TextChunker.cs index caf4dc4..4e5daf2 100644 --- a/api/Services/Rag/TextChunker.cs +++ b/api/Services/Rag/TextChunker.cs @@ -1,9 +1,6 @@ -namespace Api.Services.Rag; +using Api.Services.Contracts.Rag; -public interface ITextChunker -{ - IReadOnlyList Chunk(string text, int chunkSize, int overlap); -} +namespace Api.Services.Rag; public sealed class TextChunker : ITextChunker {