From 91cdb536b17f7fade6f809f7a70d2264c98387b7 Mon Sep 17 00:00:00 2001 From: Gelu Mihes Date: Wed, 6 May 2026 12:48:44 +0300 Subject: [PATCH] Changes --- api/Controllers/ContactController.cs | 4 +- api/Controllers/CvMatcherController.cs | 2 +- api/Controllers/FileDownloadController.cs | 2 +- api/Controllers/GoogleController.cs | 2 +- api/{ => Models}/Requests/ContactRequest.cs | 2 +- api/{ => Models}/Requests/JobMatchRequest.cs | 2 +- api/{ => Models}/Requests/SubscribeRequest.cs | 2 +- api/{ => Models}/Settings/CaptchaSettings.cs | 2 +- api/{ => Models}/Settings/ContactSettings.cs | 2 +- .../Settings/FileStorageSettings.cs | 2 +- api/{ => Models}/Settings/GoogleSettings.cs | 2 +- api/{ => Models}/Settings/KeyVaultSettings.cs | 2 +- api/{ => Models}/Settings/SmtpSettings.cs | 2 +- .../Settings/SubscribeSettings.cs | 2 +- api/Program.cs | 2 +- api/Services/Contracts/IEmailSender.cs | 2 +- api/Services/RecaptchaVerifier.cs | 2 +- api/Services/SmtpEmailSender.cs | 4 +- cv-matcher-api/Models/Settings/AiSettings.cs | 8 +++ .../Models}/Settings/InternalApiSettings.cs | 2 +- .../Models/Settings/MatcherSettings.cs | 8 +++ .../Models/Settings/OllamaSettings.cs | 8 +++ .../Models/Settings/OpenAiSettings.cs | 8 +++ .../Models/Settings/RagApiSettings.cs | 7 +++ cv-matcher-api/Models/Settings/Settings.cs | 52 ------------------- .../Models/Settings/SmtpSettings.cs | 12 +++++ .../Ai}/CachedAiClient.cs | 7 +-- .../Ai}/Contracts/IAiClient.cs | 2 +- .../{Services => Clients/Ai}/HashHelper.cs | 2 +- .../{Services => Clients/Ai}/RawAiClient.cs | 6 +-- rag-api/Controllers/RagController.cs | 4 +- .../Repositories}/Contracts/IRagRepository.cs | 4 +- .../Repositories}/EfRagRepository.cs | 8 +-- .../Repositories}/VectorSerializer.cs | 2 +- .../Models/DocumentClassification.cs | 4 +- .../Contracts => }/Models/RagChunkRecord.cs | 2 +- .../Models/RagDocumentDetails.cs | 2 +- .../Models/RagDocumentRecord.cs | 2 +- .../Requests/IndexDocumentRequest.cs | 2 +- .../{ => Models}/Requests/SearchRequest.cs | 2 +- .../Responses/IndexDocumentResponse.cs | 2 +- .../{ => Models}/Responses/SearchResponse.cs | 6 +-- .../Models/SearchCandidateChunk.cs | 2 +- rag-api/Models/Settings/AiSettings.cs | 8 +++ .../Models/Settings/InternalApiSettings.cs | 7 +++ .../Models/Settings/OllamaProviderSettings.cs | 9 ++++ .../Models/Settings/OpenAiProviderSettings.cs | 9 ++++ rag-api/{ => Models}/Settings/RagSettings.cs | 2 +- rag-api/Program.cs | 6 ++- .../Services/Contracts/IDocumentClassifier.cs | 2 +- rag-api/Services/Contracts/IRagService.cs | 6 +-- rag-api/Services/DocumentClassifier.cs | 2 +- rag-api/Services/RagService.cs | 11 ++-- rag-api/Settings/AiSettings.cs | 24 --------- 54 files changed, 153 insertions(+), 137 deletions(-) rename api/{ => Models}/Requests/ContactRequest.cs (95%) rename api/{ => Models}/Requests/JobMatchRequest.cs (87%) rename api/{ => Models}/Requests/SubscribeRequest.cs (91%) rename api/{ => Models}/Settings/CaptchaSettings.cs (94%) rename api/{ => Models}/Settings/ContactSettings.cs (83%) rename api/{ => Models}/Settings/FileStorageSettings.cs (90%) rename api/{ => Models}/Settings/GoogleSettings.cs (82%) rename api/{ => Models}/Settings/KeyVaultSettings.cs (84%) rename api/{ => Models}/Settings/SmtpSettings.cs (89%) rename api/{ => Models}/Settings/SubscribeSettings.cs (84%) create mode 100644 cv-matcher-api/Models/Settings/AiSettings.cs rename {rag-api => cv-matcher-api/Models}/Settings/InternalApiSettings.cs (83%) create mode 100644 cv-matcher-api/Models/Settings/MatcherSettings.cs create mode 100644 cv-matcher-api/Models/Settings/OllamaSettings.cs create mode 100644 cv-matcher-api/Models/Settings/OpenAiSettings.cs create mode 100644 cv-matcher-api/Models/Settings/RagApiSettings.cs delete mode 100644 cv-matcher-api/Models/Settings/Settings.cs create mode 100644 cv-matcher-api/Models/Settings/SmtpSettings.cs rename rag-api/{Services => Clients/Ai}/CachedAiClient.cs (94%) rename rag-api/{Services => Clients/Ai}/Contracts/IAiClient.cs (86%) rename rag-api/{Services => Clients/Ai}/HashHelper.cs (92%) rename rag-api/{Services => Clients/Ai}/RawAiClient.cs (98%) rename rag-api/{Services => Data/Repositories}/Contracts/IRagRepository.cs (93%) rename rag-api/{Services => Data/Repositories}/EfRagRepository.cs (97%) rename rag-api/{Services => Data/Repositories}/VectorSerializer.cs (96%) rename rag-api/{Services/Contracts => }/Models/DocumentClassification.cs (82%) rename rag-api/{Services/Contracts => }/Models/RagChunkRecord.cs (87%) rename rag-api/{Services/Contracts => }/Models/RagDocumentDetails.cs (90%) rename rag-api/{Services/Contracts => }/Models/RagDocumentRecord.cs (92%) rename rag-api/{ => Models}/Requests/IndexDocumentRequest.cs (91%) rename rag-api/{ => Models}/Requests/SearchRequest.cs (88%) rename rag-api/{ => Models}/Responses/IndexDocumentResponse.cs (93%) rename rag-api/{ => Models}/Responses/SearchResponse.cs (83%) rename rag-api/{Services/Contracts => }/Models/SearchCandidateChunk.cs (84%) create mode 100644 rag-api/Models/Settings/AiSettings.cs create mode 100644 rag-api/Models/Settings/InternalApiSettings.cs create mode 100644 rag-api/Models/Settings/OllamaProviderSettings.cs create mode 100644 rag-api/Models/Settings/OpenAiProviderSettings.cs rename rag-api/{ => Models}/Settings/RagSettings.cs (92%) delete mode 100644 rag-api/Settings/AiSettings.cs diff --git a/api/Controllers/ContactController.cs b/api/Controllers/ContactController.cs index d00017d..a3ff245 100644 --- a/api/Controllers/ContactController.cs +++ b/api/Controllers/ContactController.cs @@ -1,11 +1,11 @@ using Api.Services.Contracts.Models; -using Api.Requests; using Api.Services.Contracts; -using Api.Settings; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.RateLimiting; using Microsoft.Extensions.Options; +using Api.Models.Settings; +using Api.Models.Requests; namespace Api.Controllers { diff --git a/api/Controllers/CvMatcherController.cs b/api/Controllers/CvMatcherController.cs index ca464c9..f8127ea 100644 --- a/api/Controllers/CvMatcherController.cs +++ b/api/Controllers/CvMatcherController.cs @@ -1,4 +1,4 @@ -using Api.Requests; +using Api.Models.Requests; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.RateLimiting; using System.Net.Http.Headers; diff --git a/api/Controllers/FileDownloadController.cs b/api/Controllers/FileDownloadController.cs index ae843c2..3989a3b 100644 --- a/api/Controllers/FileDownloadController.cs +++ b/api/Controllers/FileDownloadController.cs @@ -1,5 +1,5 @@ +using Api.Models.Settings; using Api.Services.Contracts; -using Api.Settings; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.StaticFiles; diff --git a/api/Controllers/GoogleController.cs b/api/Controllers/GoogleController.cs index a97bab0..dacc712 100644 --- a/api/Controllers/GoogleController.cs +++ b/api/Controllers/GoogleController.cs @@ -1,4 +1,4 @@ -using Api.Settings; +using Api.Models.Settings; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; diff --git a/api/Requests/ContactRequest.cs b/api/Models/Requests/ContactRequest.cs similarity index 95% rename from api/Requests/ContactRequest.cs rename to api/Models/Requests/ContactRequest.cs index ab58d53..4837706 100644 --- a/api/Requests/ContactRequest.cs +++ b/api/Models/Requests/ContactRequest.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Api.Requests +namespace Api.Models.Requests { public sealed class ContactRequest { diff --git a/api/Requests/JobMatchRequest.cs b/api/Models/Requests/JobMatchRequest.cs similarity index 87% rename from api/Requests/JobMatchRequest.cs rename to api/Models/Requests/JobMatchRequest.cs index f45040a..04b4a77 100644 --- a/api/Requests/JobMatchRequest.cs +++ b/api/Models/Requests/JobMatchRequest.cs @@ -1,4 +1,4 @@ -namespace Api.Requests; +namespace Api.Models.Requests; public sealed class JobMatchRequest { diff --git a/api/Requests/SubscribeRequest.cs b/api/Models/Requests/SubscribeRequest.cs similarity index 91% rename from api/Requests/SubscribeRequest.cs rename to api/Models/Requests/SubscribeRequest.cs index 09070a3..4967011 100644 --- a/api/Requests/SubscribeRequest.cs +++ b/api/Models/Requests/SubscribeRequest.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Api.Requests +namespace Api.Models.Requests { public sealed class SubscribeRequest { diff --git a/api/Settings/CaptchaSettings.cs b/api/Models/Settings/CaptchaSettings.cs similarity index 94% rename from api/Settings/CaptchaSettings.cs rename to api/Models/Settings/CaptchaSettings.cs index 0b8942b..e9ca5cc 100644 --- a/api/Settings/CaptchaSettings.cs +++ b/api/Models/Settings/CaptchaSettings.cs @@ -1,4 +1,4 @@ -namespace Api.Settings +namespace Api.Models.Settings { public sealed class CaptchaSettings { diff --git a/api/Settings/ContactSettings.cs b/api/Models/Settings/ContactSettings.cs similarity index 83% rename from api/Settings/ContactSettings.cs rename to api/Models/Settings/ContactSettings.cs index 706c9a9..14d9080 100644 --- a/api/Settings/ContactSettings.cs +++ b/api/Models/Settings/ContactSettings.cs @@ -1,4 +1,4 @@ -namespace Api.Settings +namespace Api.Models.Settings { public sealed class ContactSettings { diff --git a/api/Settings/FileStorageSettings.cs b/api/Models/Settings/FileStorageSettings.cs similarity index 90% rename from api/Settings/FileStorageSettings.cs rename to api/Models/Settings/FileStorageSettings.cs index 192838c..0820b3c 100644 --- a/api/Settings/FileStorageSettings.cs +++ b/api/Models/Settings/FileStorageSettings.cs @@ -1,4 +1,4 @@ -namespace Api.Settings +namespace Api.Models.Settings { public sealed class FileStorageSettings { diff --git a/api/Settings/GoogleSettings.cs b/api/Models/Settings/GoogleSettings.cs similarity index 82% rename from api/Settings/GoogleSettings.cs rename to api/Models/Settings/GoogleSettings.cs index 7e023b0..cdcfc70 100644 --- a/api/Settings/GoogleSettings.cs +++ b/api/Models/Settings/GoogleSettings.cs @@ -1,4 +1,4 @@ -namespace Api.Settings +namespace Api.Models.Settings { public sealed class GoogleSettings { diff --git a/api/Settings/KeyVaultSettings.cs b/api/Models/Settings/KeyVaultSettings.cs similarity index 84% rename from api/Settings/KeyVaultSettings.cs rename to api/Models/Settings/KeyVaultSettings.cs index 2328e63..0c2b54f 100644 --- a/api/Settings/KeyVaultSettings.cs +++ b/api/Models/Settings/KeyVaultSettings.cs @@ -1,4 +1,4 @@ -namespace Api.Settings +namespace Api.Models.Settings { public sealed class KeyVaultSettings { diff --git a/api/Settings/SmtpSettings.cs b/api/Models/Settings/SmtpSettings.cs similarity index 89% rename from api/Settings/SmtpSettings.cs rename to api/Models/Settings/SmtpSettings.cs index 15d506f..0f87be3 100644 --- a/api/Settings/SmtpSettings.cs +++ b/api/Models/Settings/SmtpSettings.cs @@ -1,4 +1,4 @@ -namespace Api.Settings +namespace Api.Models.Settings { public class SmtpSettings { diff --git a/api/Settings/SubscribeSettings.cs b/api/Models/Settings/SubscribeSettings.cs similarity index 84% rename from api/Settings/SubscribeSettings.cs rename to api/Models/Settings/SubscribeSettings.cs index bda34d6..c33361e 100644 --- a/api/Settings/SubscribeSettings.cs +++ b/api/Models/Settings/SubscribeSettings.cs @@ -1,4 +1,4 @@ -namespace Api.Settings +namespace Api.Models.Settings { public sealed class SubscribeSettings { diff --git a/api/Program.cs b/api/Program.cs index 88d1707..32c3678 100644 --- a/api/Program.cs +++ b/api/Program.cs @@ -1,6 +1,6 @@ +using Api.Models.Settings; using Api.Services; using Api.Services.Contracts; -using Api.Settings; using Azure.Identity; using Microsoft.AspNetCore.HttpOverrides; using Serilog; diff --git a/api/Services/Contracts/IEmailSender.cs b/api/Services/Contracts/IEmailSender.cs index 3f774fc..0f11430 100644 --- a/api/Services/Contracts/IEmailSender.cs +++ b/api/Services/Contracts/IEmailSender.cs @@ -1,4 +1,4 @@ -using Api.Requests; +using Api.Models.Requests; namespace Api.Services.Contracts { diff --git a/api/Services/RecaptchaVerifier.cs b/api/Services/RecaptchaVerifier.cs index 7a2f417..2109a55 100644 --- a/api/Services/RecaptchaVerifier.cs +++ b/api/Services/RecaptchaVerifier.cs @@ -1,7 +1,7 @@ using Api.Services.Contracts.Models; using Api.Services.Contracts; -using Api.Settings; using Microsoft.Extensions.Options; +using Api.Models.Settings; namespace Api.Services { diff --git a/api/Services/SmtpEmailSender.cs b/api/Services/SmtpEmailSender.cs index 7bbfc5f..deccfcf 100644 --- a/api/Services/SmtpEmailSender.cs +++ b/api/Services/SmtpEmailSender.cs @@ -1,10 +1,10 @@ using Api.Services.Contracts; -using Api.Requests; using Microsoft.Extensions.Options; using MailKit.Net.Smtp; using MailKit.Security; using MimeKit; -using Api.Settings; +using Api.Models.Settings; +using Api.Models.Requests; namespace Api.Services { diff --git a/cv-matcher-api/Models/Settings/AiSettings.cs b/cv-matcher-api/Models/Settings/AiSettings.cs new file mode 100644 index 0000000..4f12563 --- /dev/null +++ b/cv-matcher-api/Models/Settings/AiSettings.cs @@ -0,0 +1,8 @@ +namespace Api.Models.Settings; + +public sealed class AiSettings +{ + public string Provider { get; set; } = "OpenAI"; + public OpenAiSettings OpenAI { get; set; } = new(); + public OllamaSettings Ollama { get; set; } = new(); +} diff --git a/rag-api/Settings/InternalApiSettings.cs b/cv-matcher-api/Models/Settings/InternalApiSettings.cs similarity index 83% rename from rag-api/Settings/InternalApiSettings.cs rename to cv-matcher-api/Models/Settings/InternalApiSettings.cs index a2662cd..7d05ef8 100644 --- a/rag-api/Settings/InternalApiSettings.cs +++ b/cv-matcher-api/Models/Settings/InternalApiSettings.cs @@ -1,4 +1,4 @@ -namespace Api.Settings; +namespace Api.Models.Settings; public sealed class InternalApiSettings { diff --git a/cv-matcher-api/Models/Settings/MatcherSettings.cs b/cv-matcher-api/Models/Settings/MatcherSettings.cs new file mode 100644 index 0000000..75c7fab --- /dev/null +++ b/cv-matcher-api/Models/Settings/MatcherSettings.cs @@ -0,0 +1,8 @@ +namespace Api.Models.Settings; + +public sealed class MatcherSettings +{ + public int TopK { get; set; } = 10; + public int DeepScoreTopN { get; set; } = 5; + public int MaxJobTextChars { get; set; } = 60000; +} diff --git a/cv-matcher-api/Models/Settings/OllamaSettings.cs b/cv-matcher-api/Models/Settings/OllamaSettings.cs new file mode 100644 index 0000000..421d4ab --- /dev/null +++ b/cv-matcher-api/Models/Settings/OllamaSettings.cs @@ -0,0 +1,8 @@ +namespace Api.Models.Settings; + +public sealed class OllamaSettings +{ + public string BaseUrl { get; set; } = "http://localhost:11434"; + public string ChatModel { get; set; } = "llama3.1:8b"; + public int TimeoutSeconds { get; set; } = 180; +} diff --git a/cv-matcher-api/Models/Settings/OpenAiSettings.cs b/cv-matcher-api/Models/Settings/OpenAiSettings.cs new file mode 100644 index 0000000..b90e6d1 --- /dev/null +++ b/cv-matcher-api/Models/Settings/OpenAiSettings.cs @@ -0,0 +1,8 @@ +namespace Api.Models.Settings; + +public sealed class OpenAiSettings +{ + public string ApiKey { get; set; } = string.Empty; + public string ChatModel { get; set; } = "gpt-4o-mini"; + public int TimeoutSeconds { get; set; } = 90; +} diff --git a/cv-matcher-api/Models/Settings/RagApiSettings.cs b/cv-matcher-api/Models/Settings/RagApiSettings.cs new file mode 100644 index 0000000..8f2251a --- /dev/null +++ b/cv-matcher-api/Models/Settings/RagApiSettings.cs @@ -0,0 +1,7 @@ +namespace Api.Models.Settings; + +public sealed class RagApiSettings +{ + public string BaseUrl { get; set; } = "http://localhost:8081"; + public string InternalApiKey { get; set; } = string.Empty; +} diff --git a/cv-matcher-api/Models/Settings/Settings.cs b/cv-matcher-api/Models/Settings/Settings.cs deleted file mode 100644 index d5e414d..0000000 --- a/cv-matcher-api/Models/Settings/Settings.cs +++ /dev/null @@ -1,52 +0,0 @@ -namespace Api.Models.Settings; - -public sealed class RagApiSettings -{ - public string BaseUrl { get; set; } = "http://localhost:8081"; - public string InternalApiKey { get; set; } = string.Empty; -} - -public sealed class InternalApiSettings -{ - public string ApiKey { get; set; } = string.Empty; - public bool RequireApiKey { get; set; } = false; -} - -public sealed class AiSettings -{ - public string Provider { get; set; } = "OpenAI"; - public OpenAiSettings OpenAI { get; set; } = new(); - public OllamaSettings Ollama { get; set; } = new(); -} - -public sealed class OpenAiSettings -{ - public string ApiKey { get; set; } = string.Empty; - public string ChatModel { get; set; } = "gpt-4o-mini"; - public int TimeoutSeconds { get; set; } = 90; -} - -public sealed class OllamaSettings -{ - public string BaseUrl { get; set; } = "http://localhost:11434"; - public string ChatModel { get; set; } = "llama3.1:8b"; - public int TimeoutSeconds { get; set; } = 180; -} - -public sealed class MatcherSettings -{ - public int TopK { get; set; } = 10; - public int DeepScoreTopN { get; set; } = 5; - public int MaxJobTextChars { get; set; } = 60000; -} - -public sealed class SmtpSettings -{ - public string Host { get; set; } = string.Empty; - public int Port { get; set; } = 587; - public string Username { get; set; } = string.Empty; - public string Password { get; set; } = string.Empty; - public bool UseStartTls { get; set; } = true; - public string FromEmail { get; set; } = "noreply@myai.ro"; - public string ToEmail { get; set; } = string.Empty; -} diff --git a/cv-matcher-api/Models/Settings/SmtpSettings.cs b/cv-matcher-api/Models/Settings/SmtpSettings.cs new file mode 100644 index 0000000..3d76c8b --- /dev/null +++ b/cv-matcher-api/Models/Settings/SmtpSettings.cs @@ -0,0 +1,12 @@ +namespace Api.Models.Settings; + +public sealed class SmtpSettings +{ + public string Host { get; set; } = string.Empty; + public int Port { get; set; } = 587; + public string Username { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + public bool UseStartTls { get; set; } = true; + public string FromEmail { get; set; } = "noreply@myai.ro"; + public string ToEmail { get; set; } = string.Empty; +} diff --git a/rag-api/Services/CachedAiClient.cs b/rag-api/Clients/Ai/CachedAiClient.cs similarity index 94% rename from rag-api/Services/CachedAiClient.cs rename to rag-api/Clients/Ai/CachedAiClient.cs index 08f33b5..b30e28d 100644 --- a/rag-api/Services/CachedAiClient.cs +++ b/rag-api/Clients/Ai/CachedAiClient.cs @@ -1,8 +1,9 @@ using Microsoft.Extensions.Options; -using Api.Services.Contracts; -using Api.Settings; +using Api.Models.Settings; +using Api.Data.Repositories.Contracts; +using Api.Clients.Ai.Contracts; -namespace Api.Services; +namespace Api.Clients.Ai; public sealed class CachedAiClient : IAiClient { diff --git a/rag-api/Services/Contracts/IAiClient.cs b/rag-api/Clients/Ai/Contracts/IAiClient.cs similarity index 86% rename from rag-api/Services/Contracts/IAiClient.cs rename to rag-api/Clients/Ai/Contracts/IAiClient.cs index 3e5400b..c517c85 100644 --- a/rag-api/Services/Contracts/IAiClient.cs +++ b/rag-api/Clients/Ai/Contracts/IAiClient.cs @@ -1,4 +1,4 @@ -namespace Api.Services.Contracts; +namespace Api.Clients.Ai.Contracts; public interface IAiClient { diff --git a/rag-api/Services/HashHelper.cs b/rag-api/Clients/Ai/HashHelper.cs similarity index 92% rename from rag-api/Services/HashHelper.cs rename to rag-api/Clients/Ai/HashHelper.cs index 8d55cfb..e1a67a8 100644 --- a/rag-api/Services/HashHelper.cs +++ b/rag-api/Clients/Ai/HashHelper.cs @@ -1,7 +1,7 @@ using System.Security.Cryptography; using System.Text; -namespace Api.Services; +namespace Api.Clients.Ai; public static class HashHelper { diff --git a/rag-api/Services/RawAiClient.cs b/rag-api/Clients/Ai/RawAiClient.cs similarity index 98% rename from rag-api/Services/RawAiClient.cs rename to rag-api/Clients/Ai/RawAiClient.cs index 634df62..360fe05 100644 --- a/rag-api/Services/RawAiClient.cs +++ b/rag-api/Clients/Ai/RawAiClient.cs @@ -3,10 +3,10 @@ using System.Text; using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.Extensions.Options; -using Api.Services.Contracts; -using Api.Settings; +using Api.Models.Settings; +using Api.Clients.Ai.Contracts; -namespace Api.Services; +namespace Api.Clients.Ai; public sealed class RawAiClient : IAiClient { diff --git a/rag-api/Controllers/RagController.cs b/rag-api/Controllers/RagController.cs index 9d6796d..dea2671 100644 --- a/rag-api/Controllers/RagController.cs +++ b/rag-api/Controllers/RagController.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc; using Api.Services.Contracts; -using Api.Requests; +using Api.Models.Requests; namespace Api.Controllers; @@ -83,7 +83,7 @@ public sealed class RagController : ControllerBase try { _logger.LogInformation("Semantic search request received. TargetTypes={TargetTypes}, TopK={TopK}", - string.Join(',', request.TargetDocumentTypes ?? []), request.TopK); + string.Join(',', request.TargetDocumentTypes ?? System.Array.Empty()), request.TopK); var result = await _ragService.SearchAsync(request, ct); _logger.LogInformation("Semantic search completed. ResultCount={ResultCount}", result.Results.Count); return Ok(result); diff --git a/rag-api/Services/Contracts/IRagRepository.cs b/rag-api/Data/Repositories/Contracts/IRagRepository.cs similarity index 93% rename from rag-api/Services/Contracts/IRagRepository.cs rename to rag-api/Data/Repositories/Contracts/IRagRepository.cs index dd2560e..16e3847 100644 --- a/rag-api/Services/Contracts/IRagRepository.cs +++ b/rag-api/Data/Repositories/Contracts/IRagRepository.cs @@ -1,6 +1,6 @@ -using Api.Services.Contracts.Models; +using Api.Models; -namespace Api.Services.Contracts; +namespace Api.Data.Repositories.Contracts; public interface IRagRepository { diff --git a/rag-api/Services/EfRagRepository.cs b/rag-api/Data/Repositories/EfRagRepository.cs similarity index 97% rename from rag-api/Services/EfRagRepository.cs rename to rag-api/Data/Repositories/EfRagRepository.cs index 96365c2..17cbce3 100644 --- a/rag-api/Services/EfRagRepository.cs +++ b/rag-api/Data/Repositories/EfRagRepository.cs @@ -1,10 +1,10 @@ using Api.Data; using Api.Data.Entities; -using Api.Services.Contracts; -using Api.Services.Contracts.Models; using Microsoft.EntityFrameworkCore; +using Api.Data.Repositories.Contracts; +using Api.Models; -namespace Api.Services; +namespace Api.Data.Repositories; public sealed class EfRagRepository : IRagRepository { @@ -94,7 +94,7 @@ public sealed class EfRagRepository : IRagRepository .Where(x => !string.IsNullOrWhiteSpace(x)) .Select(x => x.Trim().ToLowerInvariant()) .Distinct() - .ToArray() ?? []; + .ToArray() ?? System.Array.Empty(); var query = _db.RagChunks .AsNoTracking() diff --git a/rag-api/Services/VectorSerializer.cs b/rag-api/Data/Repositories/VectorSerializer.cs similarity index 96% rename from rag-api/Services/VectorSerializer.cs rename to rag-api/Data/Repositories/VectorSerializer.cs index 9427b63..2ed02c6 100644 --- a/rag-api/Services/VectorSerializer.cs +++ b/rag-api/Data/Repositories/VectorSerializer.cs @@ -1,4 +1,4 @@ -namespace Api.Services; +namespace Api.Data.Repositories; public static class VectorSerializer { diff --git a/rag-api/Services/Contracts/Models/DocumentClassification.cs b/rag-api/Models/DocumentClassification.cs similarity index 82% rename from rag-api/Services/Contracts/Models/DocumentClassification.cs rename to rag-api/Models/DocumentClassification.cs index 9586c0d..c2fa5dc 100644 --- a/rag-api/Services/Contracts/Models/DocumentClassification.cs +++ b/rag-api/Models/DocumentClassification.cs @@ -1,10 +1,10 @@ -namespace Api.Services.Contracts.Models +namespace Api.Models { public sealed class DocumentClassification { public required string DocumentType { get; init; } public double Confidence { get; init; } public required string Title { get; init; } - public Dictionary Metadata { get; init; } = []; + public Dictionary Metadata { get; init; } = new Dictionary(); } } diff --git a/rag-api/Services/Contracts/Models/RagChunkRecord.cs b/rag-api/Models/RagChunkRecord.cs similarity index 87% rename from rag-api/Services/Contracts/Models/RagChunkRecord.cs rename to rag-api/Models/RagChunkRecord.cs index 6aef944..945c811 100644 --- a/rag-api/Services/Contracts/Models/RagChunkRecord.cs +++ b/rag-api/Models/RagChunkRecord.cs @@ -1,4 +1,4 @@ -namespace Api.Services.Contracts.Models +namespace Api.Models { public sealed class RagChunkRecord { diff --git a/rag-api/Services/Contracts/Models/RagDocumentDetails.cs b/rag-api/Models/RagDocumentDetails.cs similarity index 90% rename from rag-api/Services/Contracts/Models/RagDocumentDetails.cs rename to rag-api/Models/RagDocumentDetails.cs index 13aa6fc..1f90dcf 100644 --- a/rag-api/Services/Contracts/Models/RagDocumentDetails.cs +++ b/rag-api/Models/RagDocumentDetails.cs @@ -1,4 +1,4 @@ -namespace Api.Services.Contracts.Models +namespace Api.Models { public sealed class RagDocumentDetails { diff --git a/rag-api/Services/Contracts/Models/RagDocumentRecord.cs b/rag-api/Models/RagDocumentRecord.cs similarity index 92% rename from rag-api/Services/Contracts/Models/RagDocumentRecord.cs rename to rag-api/Models/RagDocumentRecord.cs index 6198ceb..f32fa57 100644 --- a/rag-api/Services/Contracts/Models/RagDocumentRecord.cs +++ b/rag-api/Models/RagDocumentRecord.cs @@ -1,4 +1,4 @@ -namespace Api.Services.Contracts.Models +namespace Api.Models { public sealed class RagDocumentRecord { diff --git a/rag-api/Requests/IndexDocumentRequest.cs b/rag-api/Models/Requests/IndexDocumentRequest.cs similarity index 91% rename from rag-api/Requests/IndexDocumentRequest.cs rename to rag-api/Models/Requests/IndexDocumentRequest.cs index 833b683..43ec61c 100644 --- a/rag-api/Requests/IndexDocumentRequest.cs +++ b/rag-api/Models/Requests/IndexDocumentRequest.cs @@ -1,4 +1,4 @@ -namespace Api.Requests +namespace Api.Models.Requests { public sealed class IndexDocumentRequest { diff --git a/rag-api/Requests/SearchRequest.cs b/rag-api/Models/Requests/SearchRequest.cs similarity index 88% rename from rag-api/Requests/SearchRequest.cs rename to rag-api/Models/Requests/SearchRequest.cs index f198a1d..80480a3 100644 --- a/rag-api/Requests/SearchRequest.cs +++ b/rag-api/Models/Requests/SearchRequest.cs @@ -1,4 +1,4 @@ -namespace Api.Requests +namespace Api.Models.Requests { public sealed class SearchRequest { diff --git a/rag-api/Responses/IndexDocumentResponse.cs b/rag-api/Models/Responses/IndexDocumentResponse.cs similarity index 93% rename from rag-api/Responses/IndexDocumentResponse.cs rename to rag-api/Models/Responses/IndexDocumentResponse.cs index fb918bf..18a90f9 100644 --- a/rag-api/Responses/IndexDocumentResponse.cs +++ b/rag-api/Models/Responses/IndexDocumentResponse.cs @@ -1,4 +1,4 @@ -namespace Api.Responses +namespace Api.Models.Responses { public sealed class IndexDocumentResponse { diff --git a/rag-api/Responses/SearchResponse.cs b/rag-api/Models/Responses/SearchResponse.cs similarity index 83% rename from rag-api/Responses/SearchResponse.cs rename to rag-api/Models/Responses/SearchResponse.cs index bf04979..3a359eb 100644 --- a/rag-api/Responses/SearchResponse.cs +++ b/rag-api/Models/Responses/SearchResponse.cs @@ -1,8 +1,8 @@ -namespace Api.Responses +namespace Api.Models.Responses { public sealed class SearchResponse { - public IReadOnlyList Results { get; init; } = []; + public IReadOnlyList Results { get; init; } = System.Array.Empty(); } public sealed class SearchDocumentResult @@ -12,7 +12,7 @@ public required string Title { get; init; } public string? SourceUrl { get; init; } public double Score { get; init; } - public IReadOnlyList MatchedChunks { get; init; } = []; + public IReadOnlyList MatchedChunks { get; init; } = System.Array.Empty(); } public sealed class SearchChunkResult diff --git a/rag-api/Services/Contracts/Models/SearchCandidateChunk.cs b/rag-api/Models/SearchCandidateChunk.cs similarity index 84% rename from rag-api/Services/Contracts/Models/SearchCandidateChunk.cs rename to rag-api/Models/SearchCandidateChunk.cs index 9e4167e..89b6238 100644 --- a/rag-api/Services/Contracts/Models/SearchCandidateChunk.cs +++ b/rag-api/Models/SearchCandidateChunk.cs @@ -1,4 +1,4 @@ -namespace Api.Services.Contracts.Models +namespace Api.Models { public sealed class SearchCandidateChunk { diff --git a/rag-api/Models/Settings/AiSettings.cs b/rag-api/Models/Settings/AiSettings.cs new file mode 100644 index 0000000..9c3d2ee --- /dev/null +++ b/rag-api/Models/Settings/AiSettings.cs @@ -0,0 +1,8 @@ +namespace Api.Models.Settings; + +public sealed class AiSettings +{ + public string Provider { get; set; } = "OpenAI"; + public OpenAiProviderSettings OpenAI { get; set; } = new(); + public OllamaProviderSettings Ollama { get; set; } = new(); +} diff --git a/rag-api/Models/Settings/InternalApiSettings.cs b/rag-api/Models/Settings/InternalApiSettings.cs new file mode 100644 index 0000000..7d05ef8 --- /dev/null +++ b/rag-api/Models/Settings/InternalApiSettings.cs @@ -0,0 +1,7 @@ +namespace Api.Models.Settings; + +public sealed class InternalApiSettings +{ + public string ApiKey { get; set; } = string.Empty; + public bool RequireApiKey { get; set; } = false; +} diff --git a/rag-api/Models/Settings/OllamaProviderSettings.cs b/rag-api/Models/Settings/OllamaProviderSettings.cs new file mode 100644 index 0000000..0bc1b90 --- /dev/null +++ b/rag-api/Models/Settings/OllamaProviderSettings.cs @@ -0,0 +1,9 @@ +namespace Api.Models.Settings; + +public sealed class OllamaProviderSettings +{ + public string BaseUrl { get; set; } = "http://localhost:11434"; + public string ChatModel { get; set; } = "llama3.1:8b"; + public string EmbeddingModel { get; set; } = "nomic-embed-text"; + public int TimeoutSeconds { get; set; } = 180; +} diff --git a/rag-api/Models/Settings/OpenAiProviderSettings.cs b/rag-api/Models/Settings/OpenAiProviderSettings.cs new file mode 100644 index 0000000..a865043 --- /dev/null +++ b/rag-api/Models/Settings/OpenAiProviderSettings.cs @@ -0,0 +1,9 @@ +namespace Api.Models.Settings; + +public sealed class OpenAiProviderSettings +{ + public string ApiKey { get; set; } = string.Empty; + public string ChatModel { get; set; } = "gpt-4o-mini"; + public string EmbeddingModel { get; set; } = "text-embedding-3-small"; + public int TimeoutSeconds { get; set; } = 90; +} diff --git a/rag-api/Settings/RagSettings.cs b/rag-api/Models/Settings/RagSettings.cs similarity index 92% rename from rag-api/Settings/RagSettings.cs rename to rag-api/Models/Settings/RagSettings.cs index fdad4cc..795665b 100644 --- a/rag-api/Settings/RagSettings.cs +++ b/rag-api/Models/Settings/RagSettings.cs @@ -1,4 +1,4 @@ -namespace Api.Settings; +namespace Api.Models.Settings; public sealed class RagSettings { diff --git a/rag-api/Program.cs b/rag-api/Program.cs index 7340a28..33ba0a9 100644 --- a/rag-api/Program.cs +++ b/rag-api/Program.cs @@ -3,10 +3,14 @@ using Microsoft.AspNetCore.Diagnostics; using Api.Data; using Api.Services; using Api.Services.Contracts; -using Api.Settings; using Serilog; using System.Reflection; using Microsoft.EntityFrameworkCore; +using Api.Models.Settings; +using Api.Data.Repositories.Contracts; +using Api.Data.Repositories; +using Api.Clients.Ai.Contracts; +using Api.Clients.Ai; DotNetEnv.Env.Load(); diff --git a/rag-api/Services/Contracts/IDocumentClassifier.cs b/rag-api/Services/Contracts/IDocumentClassifier.cs index 13014ed..5822909 100644 --- a/rag-api/Services/Contracts/IDocumentClassifier.cs +++ b/rag-api/Services/Contracts/IDocumentClassifier.cs @@ -1,4 +1,4 @@ -using Api.Services.Contracts.Models; +using Api.Models; namespace Api.Services.Contracts; diff --git a/rag-api/Services/Contracts/IRagService.cs b/rag-api/Services/Contracts/IRagService.cs index b49b910..1ab183d 100644 --- a/rag-api/Services/Contracts/IRagService.cs +++ b/rag-api/Services/Contracts/IRagService.cs @@ -1,6 +1,6 @@ -using Api.Requests; -using Api.Responses; -using Api.Services.Contracts.Models; +using Api.Models; +using Api.Models.Requests; +using Api.Models.Responses; namespace Api.Services.Contracts; diff --git a/rag-api/Services/DocumentClassifier.cs b/rag-api/Services/DocumentClassifier.cs index 6d7dab7..4d07422 100644 --- a/rag-api/Services/DocumentClassifier.cs +++ b/rag-api/Services/DocumentClassifier.cs @@ -1,6 +1,6 @@ using System.Text.RegularExpressions; using Api.Services.Contracts; -using Api.Services.Contracts.Models; +using Api.Models; namespace Api.Services; diff --git a/rag-api/Services/RagService.cs b/rag-api/Services/RagService.cs index d86b55c..cf92f57 100644 --- a/rag-api/Services/RagService.cs +++ b/rag-api/Services/RagService.cs @@ -1,10 +1,13 @@ using System.Text.Json; using Microsoft.Extensions.Options; using Api.Services.Contracts; -using Api.Settings; -using Api.Responses; -using Api.Requests; -using Api.Services.Contracts.Models; +using Api.Models.Requests; +using Api.Models.Responses; +using Api.Models.Settings; +using Api.Data.Repositories.Contracts; +using Api.Clients.Ai.Contracts; +using Api.Clients.Ai; +using Api.Models; namespace Api.Services; diff --git a/rag-api/Settings/AiSettings.cs b/rag-api/Settings/AiSettings.cs deleted file mode 100644 index 41dd522..0000000 --- a/rag-api/Settings/AiSettings.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace Api.Settings; - -public sealed class AiSettings -{ - public string Provider { get; set; } = "OpenAI"; - public OpenAiProviderSettings OpenAI { get; set; } = new(); - public OllamaProviderSettings Ollama { get; set; } = new(); -} - -public sealed class OpenAiProviderSettings -{ - public string ApiKey { get; set; } = string.Empty; - public string ChatModel { get; set; } = "gpt-4o-mini"; - public string EmbeddingModel { get; set; } = "text-embedding-3-small"; - public int TimeoutSeconds { get; set; } = 90; -} - -public sealed class OllamaProviderSettings -{ - public string BaseUrl { get; set; } = "http://localhost:11434"; - public string ChatModel { get; set; } = "llama3.1:8b"; - public string EmbeddingModel { get; set; } = "nomic-embed-text"; - public int TimeoutSeconds { get; set; } = 180; -}