@@ -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
@@ -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);
|
||||||
|
}
|
||||||
@@ -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,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,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,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)
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user