You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

953 lines
40KB

  1. namespace ToolsServices
  2. {
  3. public static class PromptService
  4. {
  5. #region Enum
  6. public enum ePrompt
  7. {
  8. ReActAgent_PromptSystem_LLM_Coder,
  9. ReActAgent_GenerateImage,
  10. ReActAgent_GenerateImageV2,
  11. ReActAgent_RechercheRAG,
  12. ReActAgent_SummarizeDoc,
  13. ReActAgent_SummarizeIntegralLongDoc,
  14. ReActAgent_SummarizeIntegralLongDoc_Final,
  15. GenererCVService_GenerateOneCV_Extract,
  16. GenererCVService_GenerateOneCV_Format,
  17. RechercheCVService_RechercheCV_Analyse,
  18. RechercheCVService_RechercheCV_Generate,
  19. EmailService_Generer_Mail,
  20. EmailService_AnalyserMail_Resume,
  21. EmailService_AnalyserMail_Resume_PJ,
  22. EmailService_AnalyserMail_Categorie,
  23. EmailService_AnalyserMail_Strategie,
  24. EmailService_AnalyserMail_Reponse,
  25. EmailService_AnalyserMail_Reponse_PJ,
  26. EmailSendService_AnalyserMail_BesoinReponse,
  27. EmailSendService_AnalyserMail_AllPointsChecked,
  28. EmailSendService_AnalyserMail_Relance,
  29. FactureService_AnalyserFacture_Extract,
  30. TF_From_DSFService_GenereTF,
  31. OllamaService_PromptSystem,
  32. TranscriptionAndResumeService_Resume
  33. }
  34. #endregion
  35. #region Propriétés
  36. public static string PromptNoQuery { get; }="No @QUERY";
  37. #endregion
  38. //
  39. #region Méthodes publiques
  40. public static string GetPromptBrut(ePrompt type)
  41. {
  42. string file = GetFileFromType(type);
  43. var txt = "";
  44. if (!File.Exists(file))
  45. {
  46. CreatePromptFile(type, file);
  47. }
  48. txt = TxtService.ExtractTextFromTxt(file);
  49. if ((txt.Trim().Length == 0))
  50. {
  51. LoggerService.LogWarning($"Contenu vide. Fichier prompt : {file} ");
  52. txt = CreatePromptFile(type, file);
  53. }
  54. return txt;
  55. }
  56. public static string GetPrompt(ePrompt type, string query="", string context1 = "", string context2 = "", string context3 = "", string context4 = "", string context5 = "", string context6 = "", string context7 = "")
  57. {
  58. try
  59. {
  60. var txt = GetPromptBrut(type);
  61. txt = txt.Replace("@QUERY", query);
  62. txt = txt.Replace("@CONTEXT1", context1);
  63. txt = txt.Replace("@CONTEXT2", context2);
  64. txt = txt.Replace("@CONTEXT3", context3);
  65. txt = txt.Replace("@CONTEXT4", context4);
  66. txt = txt.Replace("@CONTEXT5", context5);
  67. txt = txt.Replace("@CONTEXT6", context6);
  68. txt = txt.Replace("@CONTEXT7", context7);
  69. return txt;
  70. }
  71. catch (Exception ex)
  72. {
  73. LoggerService.LogError($"PromptService.GetPrompt : {ex.Message}");
  74. return string.Empty;
  75. }
  76. }
  77. public static (bool, string) SavePrompt(ePrompt type, string prompt, bool isConfirm=false)
  78. {
  79. try
  80. {
  81. if(prompt.Contains("@QUERY", StringComparison.CurrentCulture)
  82. || (!prompt.Contains("@QUERY", StringComparison.CurrentCulture) && isConfirm))
  83. {
  84. TxtService.CreateTextFile(GetFileFromType(type), prompt);
  85. }
  86. else
  87. {
  88. LoggerService.LogWarning($"PromptService.SavePrompt : Pas de @QUERY dans le prompt. Sauvegarde annulée.");
  89. return (false, PromptNoQuery);
  90. }
  91. }
  92. catch (Exception ex)
  93. {
  94. LoggerService.LogError($"PromptService.SavePrompt : {ex.Message}");
  95. return (false, ex.Message);
  96. }
  97. return (true, "");
  98. }
  99. public static List<ePrompt> GetAllPrompts()
  100. {
  101. return Enum.GetValues(typeof(ePrompt)).Cast<ePrompt>().ToList();
  102. }
  103. #endregion
  104. #region Méthodes privées
  105. private static string GetFileFromType(ePrompt type)
  106. {
  107. string file = string.Empty;
  108. switch (type)
  109. {
  110. case ePrompt.ReActAgent_PromptSystem_LLM_Coder:
  111. file = FichiersInternesService.PromptFiles.ReActAgent_PromptSystem_LLM_Coder;
  112. break;
  113. case ePrompt.ReActAgent_GenerateImage:
  114. file = FichiersInternesService.PromptFiles.ReActAgent_GenerateImage;
  115. break;
  116. case ePrompt.ReActAgent_GenerateImageV2:
  117. file = FichiersInternesService.PromptFiles.ReActAgent_GenerateImageV2;
  118. break;
  119. case ePrompt.ReActAgent_RechercheRAG:
  120. file = FichiersInternesService.PromptFiles.ReActAgent_RechercheRAG;
  121. break;
  122. case ePrompt.ReActAgent_SummarizeDoc:
  123. file = FichiersInternesService.PromptFiles.ReActAgent_SummarizeDoc;
  124. break;
  125. case ePrompt.ReActAgent_SummarizeIntegralLongDoc:
  126. file = FichiersInternesService.PromptFiles.ReActAgent_SummarizeIntegralLongDoc;
  127. break;
  128. case ePrompt.ReActAgent_SummarizeIntegralLongDoc_Final:
  129. file = FichiersInternesService.PromptFiles.ReActAgent_SummarizeIntegralLongDoc_Final;
  130. break;
  131. case ePrompt.GenererCVService_GenerateOneCV_Extract:
  132. file = FichiersInternesService.PromptFiles.GenererCVService_GenerateOneCV_Extract;
  133. break;
  134. case ePrompt.GenererCVService_GenerateOneCV_Format:
  135. file = FichiersInternesService.PromptFiles.GenererCVService_GenerateOneCV_Format;
  136. break;
  137. case ePrompt.RechercheCVService_RechercheCV_Analyse:
  138. file = FichiersInternesService.PromptFiles.RechercheCVService_RechercheCV_Analyse;
  139. break;
  140. case ePrompt.RechercheCVService_RechercheCV_Generate:
  141. file = FichiersInternesService.PromptFiles.RechercheCVService_RechercheCV_Generate;
  142. break;
  143. case ePrompt.EmailService_Generer_Mail:
  144. file = FichiersInternesService.PromptFiles.EmailService_Generer_Mail;
  145. break;
  146. case ePrompt.EmailService_AnalyserMail_Resume:
  147. file = FichiersInternesService.PromptFiles.EmailService_AnalyserMail_Resume;
  148. break;
  149. case ePrompt.EmailService_AnalyserMail_Resume_PJ:
  150. file = FichiersInternesService.PromptFiles.EmailService_AnalyserMail_Resume_PJ;
  151. break;
  152. case ePrompt.EmailService_AnalyserMail_Categorie:
  153. file = FichiersInternesService.PromptFiles.EmailService_AnalyserMail_Categorie;
  154. break;
  155. case ePrompt.EmailService_AnalyserMail_Strategie:
  156. file = FichiersInternesService.PromptFiles.EmailService_AnalyserMail_Strategie;
  157. break;
  158. case ePrompt.EmailService_AnalyserMail_Reponse:
  159. file = FichiersInternesService.PromptFiles.EmailService_AnalyserMail_Reponse;
  160. break;
  161. case ePrompt.EmailService_AnalyserMail_Reponse_PJ:
  162. file = FichiersInternesService.PromptFiles.EmailService_AnalyserMail_Reponse_PJ;
  163. break;
  164. case ePrompt.EmailSendService_AnalyserMail_BesoinReponse:
  165. file = FichiersInternesService.PromptFiles.EmailSendService_AnalyserMail_BesoinReponse;
  166. break;
  167. case ePrompt.EmailSendService_AnalyserMail_AllPointsChecked:
  168. file = FichiersInternesService.PromptFiles.EmailSendService_AnalyserMail_AllPointsChecked;
  169. break;
  170. case ePrompt.EmailSendService_AnalyserMail_Relance:
  171. file = FichiersInternesService.PromptFiles.EmailSendService_AnalyserMail_Relance;
  172. break;
  173. case ePrompt.FactureService_AnalyserFacture_Extract:
  174. file = FichiersInternesService.PromptFiles.FactureService_AnalyserFacture_Extract;
  175. break;
  176. case ePrompt.TF_From_DSFService_GenereTF:
  177. file = FichiersInternesService.PromptFiles.TF_From_DSFService_GenereTF;
  178. break;
  179. case ePrompt.OllamaService_PromptSystem:
  180. file = FichiersInternesService.PromptFiles.OllamaService_PromptSystem;
  181. break;
  182. case ePrompt.TranscriptionAndResumeService_Resume:
  183. file = FichiersInternesService.PromptFiles.TranscriptionAndResumeService_Resume;
  184. break;
  185. default:
  186. LoggerService.LogError($"PromptService.GetFileFromType : Type de prompt inconnu : {type}");
  187. throw new ArgumentException($"Type de prompt inconnu : {type}");
  188. }
  189. return file;
  190. }
  191. private static string CreatePromptFile(ePrompt type, string file)
  192. {
  193. try
  194. {
  195. string txt = string.Empty;
  196. switch (type)
  197. {
  198. case ePrompt.ReActAgent_PromptSystem_LLM_Coder:
  199. txt = CreatePromptFile_ReActAgent_PromptSystem_LLM_Coder();
  200. break;
  201. case ePrompt.ReActAgent_GenerateImage:
  202. txt = CreatePromptFile_ReActAgent_GenerateImage();
  203. break;
  204. case ePrompt.ReActAgent_GenerateImageV2:
  205. txt = CreatePromptFile_ReActAgent_GenerateImageV2();
  206. break;
  207. case ePrompt.ReActAgent_RechercheRAG:
  208. txt = CreatePromptFile_ReActAgent_RechercheRAG();
  209. break;
  210. case ePrompt.ReActAgent_SummarizeDoc:
  211. txt = CreatePromptFile_ReActAgent_SummarizeDoc();
  212. break;
  213. case ePrompt.ReActAgent_SummarizeIntegralLongDoc:
  214. txt = CreatePromptFile_ReActAgent_SummarizeIntegralLongDoc();
  215. break;
  216. case ePrompt.ReActAgent_SummarizeIntegralLongDoc_Final:
  217. txt = CreatePromptFile_ReActAgent_SummarizeIntegralLongDoc_Final();
  218. break;
  219. case ePrompt.GenererCVService_GenerateOneCV_Extract:
  220. txt = CreatePromptFile_GenererCVService_GenerateOneCV_Extract();
  221. break;
  222. case ePrompt.GenererCVService_GenerateOneCV_Format:
  223. txt = CreatePromptFile_GenererCVService_GenerateOneCV_Format();
  224. break;
  225. case ePrompt.RechercheCVService_RechercheCV_Analyse:
  226. txt = CreatePromptFile_RechercheCVService_RechercheCV_Analyse();
  227. break;
  228. case ePrompt.RechercheCVService_RechercheCV_Generate:
  229. txt = CreatePromptFile_RechercheCVService_RechercheCV_Generate();
  230. break;
  231. case ePrompt.EmailService_Generer_Mail:
  232. txt = CreatePromptFile_EmailService_Generer_Mail();
  233. break;
  234. case ePrompt.EmailService_AnalyserMail_Resume:
  235. txt = CreatePromptFile_EmailService_AnalyserMail_Resume();
  236. break;
  237. case ePrompt.EmailService_AnalyserMail_Resume_PJ:
  238. txt = CreatePromptFile_EmailService_AnalyserMail_Resume_PJ();
  239. break;
  240. case ePrompt.EmailService_AnalyserMail_Categorie:
  241. txt = CreatePromptFile_EmailService_AnalyserMail_Categorie();
  242. break;
  243. case ePrompt.EmailService_AnalyserMail_Strategie:
  244. txt = CreatePromptFile_EmailService_AnalyserMail_Strategie();
  245. break;
  246. case ePrompt.EmailService_AnalyserMail_Reponse:
  247. txt = CreatePromptFile_EmailService_AnalyserMail_Reponse();
  248. break;
  249. case ePrompt.EmailService_AnalyserMail_Reponse_PJ:
  250. txt = CreatePromptFile_EmailService_AnalyserMail_Reponse_PJ();
  251. break;
  252. case ePrompt.EmailSendService_AnalyserMail_BesoinReponse:
  253. txt = CreatePromptFile_EmailSendService_AnalyserMail_BesoinReponse();
  254. break;
  255. case ePrompt.EmailSendService_AnalyserMail_AllPointsChecked:
  256. txt = CreatePromptFile_EmailSendService_AnalyserMail_AllPointsChecked();
  257. break;
  258. case ePrompt.EmailSendService_AnalyserMail_Relance:
  259. txt = CreatePromptFile_EmailSendService_AnalyserMail_Relance();
  260. break;
  261. case ePrompt.FactureService_AnalyserFacture_Extract:
  262. txt = CreatePromptFile_FactureService_AnalyserFacture_Extract();
  263. break;
  264. case ePrompt.TranscriptionAndResumeService_Resume:
  265. txt = CreatePromptFile_TranscriptionAndResumeService_Resume();
  266. break;
  267. case ePrompt.TF_From_DSFService_GenereTF:
  268. txt = CreatePromptFile_TF_From_DSFService_GenereTF();
  269. break;
  270. case ePrompt.OllamaService_PromptSystem:
  271. txt = CreatePromptFile_OllamaService_PromptSystem();
  272. break;
  273. default:
  274. LoggerService.LogError($"PromptService.CreatePromptFile : Type de prompt inconnu : {type}");
  275. throw new ArgumentException($"Type de prompt inconnu : {type}");
  276. }
  277. TxtService.CreateTextFile(file, txt);
  278. LoggerService.LogInfo($"PromptService.CreatePromptFile : Fichier créé : {file}");
  279. return txt;
  280. }
  281. catch (Exception ex)
  282. {
  283. LoggerService.LogError($"PromptService.CreatePromptFile : {ex.Message}");
  284. return string.Empty;
  285. }
  286. }
  287. private static string CreatePromptFile_OllamaService_PromptSystem()
  288. {
  289. var txt = """
  290. Donne toujours tes réponses dans la langue Française
  291. Réponds uniquement avec des faits vérifiables. Si tu n'es pas sûr, réponds 'je ne sais pas'.
  292. """;
  293. return txt;
  294. }
  295. private static string CreatePromptFile_TranscriptionAndResumeService_Resume()
  296. {
  297. var txt = """
  298. Tu es un expert en résumé de texte.
  299. Résume le texte suivant de manière claire et concise, en utilisant des phrases complètes.
  300. Le contexte de ce texte est le suivant : @CONTEXT1
  301. Texte à résumer :
  302. @QUERY
  303. """;
  304. return txt;
  305. }
  306. private static string CreatePromptFile_TF_From_DSFService_GenereTF()
  307. {
  308. var txt = """
  309. Tu es un expert analyste de tests logiciels.
  310. Tu vas lire un document technique (spécifications fonctionnelles internes) et en déduire des cas de tests.
  311. Ne prends en compte que les chapitres "règles de gestion" pour générer les cas de tests.
  312. Pour chaque cas de test créé, tu indiques la référence de la règle de gestion (ID du tableau Regles de gestion)
  313. Important : Il ne s’agit PAS d’une œuvre protégée par copyright, mais bien d’un document technique interne.
  314. Produit le résultat directement au format CSV avec les colonnes :
  315. ID;Référence règle de gestion;Titre;Préconditions;Étapes;Résultat attendu
  316. Spécification :
  317. ---
  318. @QUERY
  319. ---
  320. """;
  321. return txt;
  322. }
  323. private static string CreatePromptFile_FactureService_AnalyserFacture_Extract()
  324. {
  325. var txt = """
  326. Tu es un assistant spécialisé dans l'extraction d'informations depuis des factures.
  327. Je vais te fournir le contenu brut d’une facture (texte brut sans mise en forme).
  328. À partir de ce contenu, génère un document structuré au format XML en respectant la structure suivante :
  329. <?xml version="1.0" encoding="UTF-8"?>
  330. <FACTURE>
  331. <Numero_facture></Numero_facture>
  332. <Date_facture></Date_facture>
  333. <Client>
  334. <code_client></code_client>
  335. <Nom></Nom>
  336. <Email></Email>
  337. <Telephone></Telephone>
  338. <Adresse></Adresse>
  339. <SIRET></SIRET>
  340. </Client>
  341. <Fournisseur>
  342. <Nom></Nom>
  343. <Email></Email>
  344. <Telephone></Telephone>
  345. <Adresse></Adresse>
  346. <SIRET></SIRET>
  347. </Fournisseur>
  348. <Totaux>
  349. <Total_HT></Total_HT>
  350. <Total_TVA></Total_TVA>
  351. <Total_TTC></Total_TTC>
  352. </Totaux>
  353. <Articles>
  354. <Article>
  355. <Reference></Reference>
  356. <Designation></Designation>
  357. <Prix_unitaire_HT></Prix_unitaire_HT>
  358. <Quantité_achetée></Quantité_achetée>
  359. <Montant_total_HT></Montant_total_HT
  360. </Article>
  361. </Articles>
  362. </FACTURE>
  363. Si une information est absente, laisse le champ vide. Ne fais aucun commentaire, retourne uniquement le XML.
  364. N'oublie aucun article
  365. Formate le tout proprement au format XML.
  366. Les nombres décimaux doivent être au format universel :
  367. - pour le séparateur décimal, utilise un point et non une virgule)
  368. - ne met pas de séparateur de milliers
  369. Les dates doivent être au format universel (ex : 2025-12-31)
  370. N'ajoute pas de texte explicatif.
  371. Voici un exemple :
  372. Texte brut : Page : 1/1Total HT1 919,02Net HT1 919,02Total TVA383,80Total TTC2 302,82NET A PAYER2 302,82RéférenceDésignationQtéUnitéPrix Uni. HTMt Tot HTTVAMt Tot TTCV/COMMANDE N°CD240457SYLVAINART855850,400m²19,991 007,5020,00...1 209,00ECOGRIS...48,000Sacs18,99911,5220,00...1 093,82Chantier: CCA 10 Sanitaires CA24039REFIN FEEL Warm Struct. 30x60 R réf.OQ79 Bte de 1.26m²WEBER Col Flex Eco Grise 25KgPrix donnés en enlèvement sur notre dépôt de Monthléry38,981 919,022 302,82Facture N°FA7672Date29/03/2024Echéance31/05/2024Mode de paiementVirement 45 jours fi...AEG Construction10 Rue Du Bois Guillaume91000 Evry CourcouronnesTél.: E-mail:a.dimascio@aeg-constructio...Portable:06 70 65 67 70N.I.I.:Date de paiementLR CONCEPTION SARL au capital de 5.000€ -25 Rue des Bourguignons -91310 MontlhéryTVA Intracommunautaire : FR55 491 155 214 -SIREN : 491 155 214 00035 -CODE NAF : 4752ATél : 01 64 49 19 70 -Fax : 01 64 49 73 65 -Email : lrconception@orange.fr
  373. XML:
  374. <?xml version="1.0" encoding="UTF-8"?>
  375. <FACTURE>
  376. <Numero_facture>FA7672</Numero_facture>
  377. <Date_facture>2024-03-29</Date_facture>
  378. <Client>
  379. <code_client></code_client>
  380. <Nom>AEG Construction</Nom>
  381. <Email>a.dimascio@aeg-construction.fr</Email>
  382. <Telephone>06 70 65 67 70</Telephone>
  383. <Adresse>10 Rue Du Bois Guillaume, 91000 Evry Courcouronnes</Adresse>
  384. <SIRET></SIRET>
  385. </Client>
  386. <Fournisseur>
  387. <Nom>LR CONCEPTION SARL</Nom>
  388. <Email>lrconception@orange.fr</Email>
  389. <Telephone>01 64 49 19 70</Telephone>
  390. <Adresse>25 Rue des Bourguignons, 91310 Montlhéry</Adresse>
  391. <SIRET>FR55 491 155 214 - SIREN : 491 155 214 00035</SIRET>
  392. </Fournisseur>
  393. <Totaux>
  394. <Total_HT>1919.02</Total_HT>
  395. <Total_TVA>383.8</Total_TVA>
  396. <Total_TTC>2302.82</Total_TTC>
  397. </Totaux>
  398. <Articles>
  399. <Article>
  400. <Reference>ART8558</Reference>
  401. <Designation>REFIN FEEL Warm Struct. 30x60 R réf.OQ79 Bte de 1.26m²</Designation>
  402. <Prix_unitaire_HT>19.99</Prix_unitaire_HT>
  403. <Quantité_achetée>50.400</Quantité_achetée>
  404. <Montant_total_HT>1007.50</Montant_total_HT>
  405. </Article>
  406. <Article>
  407. <Reference>ECOGRIS</Reference>
  408. <Designation>WEBER Col Flex Eco Grise 25Kg</Designation>
  409. <Prix_unitaire_HT>18.99</Prix_unitaire_HT>
  410. <Quantité_achetée>48</Quantité_achetée>
  411. <Montant_total_HT>911.952</Montant_total_HT>
  412. </Article>
  413. </Articles>
  414. </FACTURE>
  415. Fin de l'exemple
  416. A TRAITER
  417. Voici le contenu de la facture extrait :
  418. @QUERY
  419. """;
  420. return txt;
  421. }
  422. private static string CreatePromptFile_EmailSendService_AnalyserMail_Relance()
  423. {
  424. var txt = """
  425. Génère un brouillon de mail en langue française de relance poli basé sur cette conversation :
  426. Objet : @QUERY
  427. Contenu : @CONTEXT1
  428. Voici la signature à insérer en fin de mail :
  429. Cordialement,
  430. @CONTEXT2
  431. @CONTEXT3
  432. @CONTEXT4
  433. """;
  434. return txt;
  435. }
  436. private static string CreatePromptFile_EmailSendService_AnalyserMail_AllPointsChecked()
  437. {
  438. var txt = """
  439. Réponds uniquement par oui ou non. Tous les points de ce mail ont-ils été traités ?
  440. Début du mail:
  441. @QUERY
  442. - fin du mail
  443. """;
  444. return txt;
  445. }
  446. private static string CreatePromptFile_EmailSendService_AnalyserMail_BesoinReponse()
  447. {
  448. var txt = """
  449. Réponds uniquement par oui ou non. Une réponse est-elle nécessaire à ce mail ?
  450. Début du mail:
  451. @QUERY
  452. - fin du mail
  453. """;
  454. return txt;
  455. }
  456. private static string CreatePromptFile_EmailService_AnalyserMail_Reponse_PJ()
  457. {
  458. var txt = """
  459. Inclus dans la réponse proposée l'analyse des pièces jointes dont voici le résumé : @QUERY
  460. """;
  461. return txt;
  462. }
  463. private static string CreatePromptFile_EmailService_AnalyserMail_Reponse()
  464. {
  465. var txt = """
  466. Rédige une réponse professionnelle à cet email en suivant la stratégie définie.
  467. Fais bien attention à qui a écrit le mail initial, que tu lui répondes à lui et non à celui qui a écrit un vieux mail et dont tu as la réponse.
  468. Objet : @QUERY
  469. Contenu : @CONTEXT1
  470. Résumé : @CONTEXT2
  471. Catégorie : @CONTEXT3
  472. Stratégie : @CONTEXT4
  473. La réponse doit être claire, polie, adaptée au contexte et suffisamment concise.
  474. Voici la signature à insérer en fin de mail :
  475. Cordialement,
  476. @CONTEXT5
  477. @CONTEXT6
  478. @CONTEXT7
  479. Ne rajoute rien d'autre à la signature
  480. """;
  481. return txt;
  482. }
  483. private static string CreatePromptFile_EmailService_AnalyserMail_Strategie()
  484. {
  485. var txt = """
  486. Tu dois choisir une stratégie de réponse à un email.
  487. Catégorie : @QUERY
  488. Important : @CONTEXT1
  489. Urgent : @CONTEXT2
  490. Voici les options possibles :
  491. - Répondre avec une explication simple
  492. - Demander plus d'informations
  493. - Présenter des excuses et proposer une solution
  494. - Accuser réception et informer d'un délai
  495. Choisis la stratégie la plus adaptée en tenant compte de la **catégorie**, de l'**importance** et de l'**urgence**.
  496. """;
  497. return txt;
  498. }
  499. private static string CreatePromptFile_EmailService_AnalyserMail_Categorie()
  500. {
  501. var txt = """
  502. Tu dois catégoriser un email en fonction de son contenu.
  503. Voici le résumé de l'email :
  504. @QUERY
  505. Catégorise ce message parmi les choix suivants :
  506. - Demande d'information
  507. - Réclamation
  508. - Demande de devis
  509. - Problème technique (bug, panne, incident)
  510. - Demande de fonctionnalité / évolution
  511. - Planning / organisation (délais, réunions, livraisons)
  512. - Validation / approbation (recette, maquette, cahier des charges)
  513. - Support utilisateur (aide à l’utilisation, questions non techniques)
  514. - Partage d’information interne (compte rendu, note, documentation)
  515. - Commercial / administratif (contrats, factures, commandes)
  516. - Formation
  517. - Emploi
  518. - Demande de réunion
  519. - Compte-rendu de réunion
  520. - Autre
  521. Réponds uniquement par une des catégories listées.
  522. """;
  523. return txt;
  524. }
  525. private static string CreatePromptFile_EmailService_AnalyserMail_Resume_PJ()
  526. {
  527. var txt = """
  528. Inclus dans le résumé l'analyse des pièces jointes dont voici le résumé : @QUERY
  529. """;
  530. return txt;
  531. }
  532. private static string CreatePromptFile_EmailService_AnalyserMail_Resume()
  533. {
  534. var txt = """
  535. Tu es un assistant professionnel chargé d'analyser un e-mail.
  536. Lis le contenu suivant et fais un résumé clair et concis.
  537. Ensuite, indique explicitement :
  538. - Une note d'importance entre 0 et 5 (5 étant la plus haute importance) avec justification si possible
  539. - Une note d'urgence entre 0 et 5 (5 étant la plus haute importance) avec justification si possible
  540. - Un mot pour définir l'analyse qui sera soit "Positif", soit "Négatif", soit "Neutre"
  541. Format de réponse attendu :
  542. Résumé : ...
  543. Importance (0-5) : ...
  544. Urgence (0-5) : ...
  545. Analyse : ...
  546. Objet : @QUERY
  547. Contenu : @CONTEXT1
  548. """;
  549. return txt;
  550. }
  551. private static string CreatePromptFile_EmailService_Generer_Mail()
  552. {
  553. var txt = """
  554. Redige un email selon la demande que voici @QUERY.
  555. Tiens compte du contexte que voici @CONTEXT1.
  556. Voici la signature à insérer en fin de mail :
  557. Cordialement,
  558. @CONTEXT2
  559. @CONTEXT3
  560. @CONTEXT4
  561. """;
  562. return txt;
  563. }
  564. private static string CreatePromptFile_RechercheCVService_RechercheCV_Generate()
  565. {
  566. var txt = """
  567. Tu es un assistant spécialisé dans l'extraction d'informations depuis des CV.
  568. Je vais te fournir le contenu brut d’un CV (texte brut sans mise en forme).
  569. À partir de ce contenu, génère un document structuré au format XML en respectant la structure suivante :
  570. <CV>
  571. <Identite>
  572. <Nom></Nom>
  573. <Prenom></Prenom>
  574. <Email></Email>
  575. <Telephone></Telephone>
  576. <Adresse></Adresse>
  577. <DateDeNaissance></DateDeNaissance>
  578. <Nationalite></Nationalite>
  579. </Identite>
  580. <Profil></Profil>
  581. <Competences>
  582. <Competence nom=""..."" niveau=""..."" />
  583. ...
  584. </Competences>
  585. <Langues>
  586. <Langue nom=""..."" niveau=""..."" />
  587. ...
  588. </Langues>
  589. <Experiences>
  590. <Experience>
  591. <Poste></Poste>
  592. <Entreprise></Entreprise>
  593. <Lieu></Lieu>
  594. <DateDebut></DateDebut>
  595. <DateFin></DateFin>
  596. <Description></Description>
  597. </Experience>
  598. ...
  599. </Experiences>
  600. <Formations>
  601. <Formation>
  602. <Diplome></Diplome>
  603. <Etablissement></Etablissement>
  604. <DateDebut></DateDebut>
  605. <DateFin></DateFin>
  606. </Formation>
  607. ...
  608. </Formations>
  609. <Certifications>
  610. <Certification>
  611. <Nom></Nom>
  612. <Organisme></Organisme>
  613. <Date></Date>
  614. </Certification>
  615. ...
  616. </Certifications>
  617. </CV>
  618. Si une information est absente, laisse le champ vide. Ne fais aucun commentaire, retourne uniquement le XML.
  619. N'oublie aucune expérience, aucune formation, aucune langue, ni aucune certification.
  620. Formate le tout proprement au format XML. N'ajoute pas de texte explicatif. Commence directement par <document>.
  621. Voici un contenu PDF extrait :
  622. @QUERY
  623. """;
  624. return txt;
  625. }
  626. private static string CreatePromptFile_RechercheCVService_RechercheCV_Analyse()
  627. {
  628. var txt = """
  629. Tu es un expert en recrutement. Ton rôle est d'évaluer la compatibilité entre une offre d'emploi et un CV.
  630. Analyse comparative :
  631. 1. **Points forts** : liste les éléments du CV qui correspondent bien aux exigences de l'offre (compétences, expériences, formations, etc.).
  632. 2. **Points manquants ou faibles** : identifie les éléments de l'offre qui sont absents ou peu développés dans le CV.
  633. 3. **Note de compatibilité** : donne une note globale de correspondance entre le CV et l'offre, sur 10, avec une explication.
  634. Voici les documents à comparer :
  635. ---
  636. **Offre d’emploi** :
  637. @QUERY
  638. ---
  639. **CV du candidat** :
  640. @CONTEXT1
  641. ---
  642. Réponds en suivant la structure suivante :
  643. **Points forts :**
  644. - …
  645. **Points manquants ou faibles :**
  646. - …
  647. **Note de compatibilité (sur 10) :**
  648. X/10 – Explication : …
  649. """;
  650. return txt;
  651. }
  652. private static string CreatePromptFile_GenererCVService_GenerateOneCV_Format()
  653. {
  654. var txt = """
  655. Voici un CV rédigé en texte. Reformate-le en XML structuré selon ce modèle :
  656. <CV>
  657. <Identite>
  658. <Nom></Nom>
  659. <Prenom></Prenom>
  660. <Email></Email>
  661. <Telephone></Telephone>
  662. <Adresse></Adresse>
  663. <DateDeNaissance></DateDeNaissance>
  664. <Nationalite></Nationalite>
  665. </Identite>
  666. <Profil></Profil>
  667. <Competences>
  668. <Competence nom="" niveau="" />
  669. ...
  670. </Competences>
  671. <Langues>
  672. <Langue nom="" niveau="" />
  673. ...
  674. </Langues>
  675. <Experiences>
  676. <Experience>
  677. <Poste></Poste>
  678. <Entreprise></Entreprise>
  679. <Lieu></Lieu>
  680. <DateDebut></DateDebut>
  681. <DateFin></DateFin>
  682. <Description></Description>
  683. </Experience>
  684. ...
  685. </Experiences>
  686. <Formations>
  687. <Formation>
  688. <Diplome></Diplome>
  689. <Etablissement></Etablissement>
  690. <DateDebut></DateDebut>
  691. <DateFin></DateFin>
  692. </Formation>
  693. ...
  694. </Formations>
  695. <Certifications>
  696. <Certification>
  697. <Nom></Nom>
  698. <Organisme></Organisme>
  699. <Date></Date>
  700. </Certification>
  701. ...
  702. </Certifications>
  703. </CV>
  704. Si une information est absente, laisse le champ vide. Ne commente pas.
  705. CV :
  706. <<<
  707. @QUERY
  708. >>>
  709. """;
  710. return txt;
  711. }
  712. private static string CreatePromptFile_GenererCVService_GenerateOneCV_Extract()
  713. {
  714. var txt = """
  715. Tu es un assistant RH.
  716. Voici un CV brut :
  717. <<<
  718. @QUERY
  719. >>>
  720. Ta mission :
  721. - Réécris le CV de façon à ce qu’il soit mis en valeur
  722. - Mets en avant les compétences pertinentes
  723. - Réorganise les expériences importantes
  724. - Reformule le résumé professionnel avec les bons mots-clés
  725. - Supprime les parties non utiles pour ce poste
  726. Rends un CV **entièrement réécrit** au format texte brut. Ne commente pas.
  727. """;
  728. return txt;
  729. }
  730. private static string CreatePromptFile_ReActAgent_SummarizeIntegralLongDoc_Final()
  731. {
  732. var txt = """
  733. Voici une série de résumés partiels :
  734. @QUERY
  735. Fais un résumé global cohérent en moins de 500 mots.
  736. """;
  737. return txt;
  738. }
  739. private static string CreatePromptFile_ReActAgent_SummarizeIntegralLongDoc()
  740. {
  741. var txt = """
  742. Tu es un assistant intelligent.
  743. Ta mission est de lire les extraits suivants d’un document, et d’en produire un résumé synthétique, structuré, et professionnel en moins de 100 mots.
  744. Ignore les mentions légales ou répétitions
  745. Extraits :
  746. @QUERY
  747. Résumé :
  748. """;
  749. return txt;
  750. }
  751. private static string CreatePromptFile_ReActAgent_SummarizeDoc()
  752. {
  753. var txt = """
  754. Tu es un assistant intelligent.
  755. Ta mission est de lire les extraits suivants d’un document, et d’en produire un résumé synthétique, structuré, et professionnel en moins de 100 mots.
  756. Ignore les mentions légales ou répétitions
  757. Extraits :
  758. @QUERY
  759. Résumé :
  760. """;
  761. return txt;
  762. }
  763. private static string CreatePromptFile_ReActAgent_RechercheRAG()
  764. {
  765. var txt = """
  766. Tu es un assistant spécialisé dans la lecture de documents d'entreprises.
  767. Le domaine professionnel concerné est le suivant : @CONTEXT2
  768. Question : @QUERY
  769. Context :
  770. @CONTEXT1
  771. Réponds uniquement à partir du contexte.
  772. Pour chaque information donnée, indique le document dont elle provient.
  773. Si tu n'as pas la réponse, dis que tu ne sais pas.
  774. """;
  775. return txt;
  776. }
  777. private static string CreatePromptFile_ReActAgent_PromptSystem_LLM_Coder()
  778. {
  779. var txt = """
  780. Tu es un expert en développement informatique
  781. """;
  782. return txt;
  783. }
  784. private static string CreatePromptFile_ReActAgent_GenerateImage()
  785. {
  786. var txt = """
  787. Transforme cette idée en prompt détaillé pour générer une image avec Fooocus : @QUERY
  788. """;
  789. return txt;
  790. }
  791. private static string CreatePromptFile_ReActAgent_GenerateImageV2()
  792. {
  793. string txt = $$$"""
  794. Tu es un assistant qui prépare une requête JSON pour Fooocus (text-to-image).
  795. À partir de cette description : "@QUERY", remplis toutes les propriétés suivantes de façon cohérente.
  796. Dans la partie "style_selections", ne prends que des styles existants dans Fooocus dont voici la liste :
  797. @CONTEXT1
  798. Réponds uniquement en JSON valide correspondant à la classe suivante :
  799. {
  800. "prompt": "...",
  801. "negative_prompt": "blurry, low quality, distorted, watermark, text, extra limbs, cropped",
  802. "style_selections": ["..."],
  803. "performance_selection": "Speed | Quality | Extreme Speed",
  804. "aspect_ratios_selection": "896*1152 | 1152*896 | 1024*1024 | etc.",
  805. "image_number": 1,
  806. "image_seed": -1,
  807. "sharpness": 2.0,
  808. "guidance_scale": 4.0,
  809. "base_model_name": "juggernautXL_v8Rundiffusion.safetensors",
  810. "refiner_model_name": "None",
  811. "refiner_switch": 0.5,
  812. "require_base64": false,
  813. "async_process": false,
  814. "loras": []
  815. }
  816. Exemple pour une image "un chat en armure médiévale" :
  817. {
  818. "prompt": "A highly detailed illustration of a cat in medieval knight armor, cinematic lighting",
  819. "negative_prompt": "blurry, low quality, distorted, watermark, text, cropped",
  820. "style_selections": ["Fantasy", "Cinematic"],
  821. "performance_selection": "Quality",
  822. "aspect_ratios_selection": "1024*1024",
  823. "image_number": 1,
  824. "image_seed": -1,
  825. "sharpness": 2.5,
  826. "guidance_scale": 6.0,
  827. "base_model_name": "juggernautXL_v8Rundiffusion.safetensors",
  828. "refiner_model_name": "None",
  829. "refiner_switch": 0.5,
  830. "require_base64": false,
  831. "async_process": false,
  832. "loras": []
  833. }
  834. """;
  835. return txt;
  836. }
  837. #endregion
  838. }
  839. }