using Services.ReActAgent; using System.Text; using ToolsServices; namespace Services { public class TF_From_DSFService { private static readonly string NomFichierParametres = FichiersInternesService.ParamsTF_From_DSF; public static async Task<(bool, string)> Traitement(string inputPath, string outputPath, bool isApiExterne) { StringBuilder sb = new(); LoggerService.LogInfo($"TF_From_DSFService.Traitement"); if (!Directory.Exists(inputPath)) { LoggerService.LogWarning($"Le dossier {inputPath} n'existe pas."); return (false, $"Le dossier {inputPath} n'existe pas."); } if (!Directory.Exists(outputPath)) { LoggerService.LogWarning($"Le dossier {outputPath} n'existe pas."); return (false, $"Le dossier {outputPath} n'existe pas."); } var fichiers = Directory .EnumerateFiles(inputPath, "*.*", SearchOption.AllDirectories) .Where(f => f.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) || f.EndsWith(".docx", StringComparison.OrdinalIgnoreCase)) .ToArray(); if (fichiers.Length == 0) { LoggerService.LogWarning($"Aucun fichier trouvé dans le dossier spécifié : {inputPath}"); return (false, $"Aucun fichier trouvé dans le dossier spécifié : {inputPath}"); } var reActRagAgent = new ReActAgent.ReActAgent(); var model = ReActAgent.ReActAgent.GetModeleIA(ModelsUseCases.TypeUseCase.TF_From_DSF); foreach (var fichier in fichiers) { try { #region Analyse du DSF var allCsv = new StringBuilder(); var docDSF = FilesService.ExtractText(fichier); var chunks = RAGService.ChunkText(docDSF, 2000);// Chunker.ChunkText(docDSF, 2000); //SplitText(docDSF, 3000); var nbChuncks = chunks.Length; int numChuck = 0; foreach (var chunk in chunks) { numChuck++; var prompt = PromptService.GetPrompt(PromptService.ePrompt.TF_From_DSFService_GenereTF, chunk); LoggerService.LogDebug($"Traitement TF From DSF {numChuck}/{nbChuncks} : {fichier}"); var (reponse,m) = await reActRagAgent.AppelerLLMAsync(ModelsUseCases.TypeUseCase.TF_From_DSF, true, prompt, "Traitement de TF From DSF", model, isApiExterne); allCsv.AppendLine(reponse); } #region Sauvegarde du résultat /* string horodate = DateTime.Now.ToString("hhmmss"); string fileNameCSV = Path.Combine(outputPath, Path.GetFileNameWithoutExtension(fichier) + $"_{model.Replace(":","-")}_{horodate}.csv"); */ string fileNameCSV = Path.Combine(outputPath, Path.GetFileNameWithoutExtension(fichier) + $".csv"); TxtService.CreateTextFile(fileNameCSV, allCsv.ToString()); #endregion #endregion } catch (Exception ex) { var msg = $"Erreur lors de l'extraction du texte de {fichier} : {ex.Message}"; LoggerService.LogError(msg); return (false, msg); } } //} LoggerService.LogInfo($"Traitement TF From DSF terminée"); return (true, sb.ToString()); } private static List SplitText(string text, int chunkSize = 3000) { var chunks = new List(); for (int i = 0; i < text.Length; i += chunkSize) { int length = Math.Min(chunkSize, text.Length - i); chunks.Add(text.Substring(i, length)); } return chunks; } public static (string, string) LoadParametres() { LoggerService.LogInfo("TF_From_DSFService.LoadParametres"); //ParametresOllamaService SelectedItem = new(); try { string FicheMission = ""; string PathCV = ""; if (File.Exists(NomFichierParametres)) { string[] lignes = File.ReadAllLines(NomFichierParametres); if (lignes.Length > 0) FicheMission = lignes[0]; if (lignes.Length > 1) PathCV = lignes[1]; } return (FicheMission, PathCV); } catch { LoggerService.LogError($"Erreur lors du chargement des paramètres depuis {NomFichierParametres}"); return ("", ""); } } public static bool SaveParametres(string inputPath, string outputPath) { LoggerService.LogInfo("TF_From_DSFService.SaveParametres"); try { StringBuilder sb = new(); sb.AppendLine(inputPath); sb.AppendLine(outputPath); File.WriteAllText(NomFichierParametres, sb.ToString()); return true; } catch { LoggerService.LogError($"Erreur lors de la sauvegarde des paramètres dans {NomFichierParametres}"); return false; } } } }