agentic-api 1.0.5 → 2.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +118 -22
  2. package/dist/src/agents/agents.example.d.ts +3 -0
  3. package/dist/src/agents/agents.example.js +38 -0
  4. package/dist/src/agents/authentication.js +2 -0
  5. package/dist/src/agents/digestor.js +25 -16
  6. package/dist/src/agents/prompts.d.ts +2 -2
  7. package/dist/src/agents/prompts.js +112 -49
  8. package/dist/src/agents/reducer.core.d.ts +12 -0
  9. package/dist/src/agents/reducer.core.js +207 -0
  10. package/dist/src/agents/reducer.d.ts +3 -0
  11. package/dist/src/agents/reducer.example.d.ts +28 -0
  12. package/dist/src/agents/reducer.example.js +118 -0
  13. package/dist/src/agents/reducer.js +19 -0
  14. package/dist/src/agents/reducer.loaders.d.ts +34 -0
  15. package/dist/src/agents/reducer.loaders.js +122 -0
  16. package/dist/src/agents/reducer.process.d.ts +16 -0
  17. package/dist/src/agents/reducer.process.js +143 -0
  18. package/dist/src/agents/reducer.tools.d.ts +29 -0
  19. package/dist/src/agents/reducer.tools.js +157 -0
  20. package/dist/src/agents/reducer.types.d.ts +50 -0
  21. package/dist/src/agents/reducer.types.js +5 -0
  22. package/dist/src/agents/simulator.d.ts +47 -0
  23. package/dist/src/agents/simulator.executor.d.ts +26 -0
  24. package/dist/src/agents/simulator.executor.js +132 -0
  25. package/dist/src/agents/simulator.js +205 -0
  26. package/dist/src/agents/simulator.prompts.d.ts +16 -0
  27. package/dist/src/agents/simulator.prompts.js +108 -0
  28. package/dist/src/agents/simulator.types.d.ts +42 -0
  29. package/dist/src/agents/simulator.types.js +2 -0
  30. package/dist/src/agents/simulator.utils.d.ts +20 -0
  31. package/dist/src/agents/simulator.utils.js +87 -0
  32. package/dist/src/execute.d.ts +14 -7
  33. package/dist/src/execute.js +359 -84
  34. package/dist/src/index.d.ts +9 -0
  35. package/dist/src/index.js +14 -0
  36. package/dist/src/princing.openai.d.ts +9 -2
  37. package/dist/src/princing.openai.js +16 -11
  38. package/dist/src/prompts.d.ts +3 -2
  39. package/dist/src/prompts.js +207 -72
  40. package/dist/src/rag/embeddings.d.ts +103 -0
  41. package/dist/src/rag/embeddings.js +466 -0
  42. package/dist/src/rag/index.d.ts +12 -0
  43. package/dist/src/rag/index.js +40 -0
  44. package/dist/src/rag/lucene.d.ts +45 -0
  45. package/dist/src/rag/lucene.js +227 -0
  46. package/dist/src/rag/parser.d.ts +68 -0
  47. package/dist/src/rag/parser.js +192 -0
  48. package/dist/src/rag/tools.d.ts +76 -0
  49. package/dist/src/rag/tools.js +196 -0
  50. package/dist/src/rag/types.d.ts +178 -0
  51. package/dist/src/rag/types.js +21 -0
  52. package/dist/src/rag/usecase.d.ts +16 -0
  53. package/dist/src/rag/usecase.js +79 -0
  54. package/dist/src/rules/errors.d.ts +60 -0
  55. package/dist/src/rules/errors.js +97 -0
  56. package/dist/src/rules/git/git.e2e.helper.d.ts +104 -0
  57. package/dist/src/rules/git/git.e2e.helper.js +488 -0
  58. package/dist/src/rules/git/git.health.d.ts +66 -0
  59. package/dist/src/rules/git/git.health.js +354 -0
  60. package/dist/src/rules/git/git.helper.d.ts +129 -0
  61. package/dist/src/rules/git/git.helper.js +53 -0
  62. package/dist/src/rules/git/index.d.ts +6 -0
  63. package/dist/src/rules/git/index.js +76 -0
  64. package/dist/src/rules/git/repo.d.ts +128 -0
  65. package/dist/src/rules/git/repo.js +900 -0
  66. package/dist/src/rules/git/repo.pr.d.ts +137 -0
  67. package/dist/src/rules/git/repo.pr.js +589 -0
  68. package/dist/src/rules/git/repo.tools.d.ts +134 -0
  69. package/dist/src/rules/git/repo.tools.js +730 -0
  70. package/dist/src/rules/index.d.ts +8 -0
  71. package/dist/src/rules/index.js +25 -0
  72. package/dist/src/rules/messages.d.ts +17 -0
  73. package/dist/src/rules/messages.js +21 -0
  74. package/dist/src/rules/types.ctrl.d.ts +28 -0
  75. package/dist/src/rules/types.ctrl.js +2 -0
  76. package/dist/src/rules/types.d.ts +510 -0
  77. package/dist/src/rules/types.helpers.d.ts +132 -0
  78. package/dist/src/rules/types.helpers.js +2 -0
  79. package/dist/src/rules/types.js +33 -0
  80. package/dist/src/rules/user.mapper.d.ts +61 -0
  81. package/dist/src/rules/user.mapper.js +160 -0
  82. package/dist/src/rules/utils/slug.d.ts +22 -0
  83. package/dist/src/rules/utils/slug.js +35 -0
  84. package/dist/src/rules/utils.matter.d.ts +66 -0
  85. package/dist/src/rules/utils.matter.js +208 -0
  86. package/dist/src/rules/utils.slug.d.ts +22 -0
  87. package/dist/src/rules/utils.slug.js +35 -0
  88. package/dist/src/scrapper.d.ts +3 -2
  89. package/dist/src/scrapper.js +33 -37
  90. package/dist/src/stategraph/index.d.ts +8 -0
  91. package/dist/src/stategraph/index.js +21 -0
  92. package/dist/src/stategraph/stategraph.d.ts +91 -0
  93. package/dist/src/stategraph/stategraph.js +241 -0
  94. package/dist/src/stategraph/stategraph.storage.d.ts +41 -0
  95. package/dist/src/stategraph/stategraph.storage.js +166 -0
  96. package/dist/src/stategraph/types.d.ts +139 -0
  97. package/dist/src/stategraph/types.js +19 -0
  98. package/dist/src/types.d.ts +68 -39
  99. package/dist/src/types.js +53 -89
  100. package/dist/src/usecase.d.ts +4 -0
  101. package/dist/src/usecase.js +44 -0
  102. package/dist/src/utils.d.ts +12 -5
  103. package/dist/src/utils.js +30 -13
  104. package/package.json +9 -3
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.modelPricing = void 0;
3
4
  exports.calculateCost = calculateCost;
4
5
  exports.accumulateCost = accumulateCost;
5
6
  //
6
7
  // get/update pricing from openai
7
8
  // - https://platform.openai.com/docs/pricing#latest-models
8
- const modelPricing = {
9
+ exports.modelPricing = {
9
10
  "gpt-4.5-preview": { input: 0.000075, cachedInput: 0.0000325, output: 0.000125 },
10
11
  "gpt-4.1": { input: 0.000002, cachedInput: 0.0000005, output: 0.000008 },
11
12
  "gpt-4.1-mini": { input: 0.0000004, cachedInput: 0.0000001, output: 0.0000016 },
@@ -18,7 +19,12 @@ const modelPricing = {
18
19
  "gpt-4o-mini-audio-preview": { input: 0.00000015, output: 0.0000006 },
19
20
  "gpt-4o-mini-realtime-preview": { input: 0.0000006, cachedInput: 0.0000003, output: 0.0000024 },
20
21
  "gpt-4o-mini-search-preview": { input: 0.0000015, cachedInput: 0.00000075, output: 0.000006 },
22
+ // GPT-5 family
23
+ "gpt-5": { input: 0.00000125, output: 0.00001 },
24
+ "gpt-5-mini": { input: 0.00000025, output: 0.000002 },
25
+ "gpt-5-nano": { input: 0.00000005, output: 0.0000004 },
21
26
  "o1": { input: 0.000015, cachedInput: 0.0000075, output: 0.00006 },
27
+ "o4-mini": { input: 0.0000011, cachedInput: 0.00000055, output: 0.0000044 },
22
28
  "o3-mini": { input: 0.0000011, cachedInput: 0.00000055, output: 0.0000044 },
23
29
  "o1-mini": { input: 0.0000011, cachedInput: 0.00000055, output: 0.0000044 },
24
30
  };
@@ -26,24 +32,23 @@ function calculateCost(model, usage) {
26
32
  if (!usage) {
27
33
  return 0;
28
34
  }
29
- if (!modelPricing[model]) {
35
+ if (!exports.modelPricing[model]) {
30
36
  throw new Error("Unknown model");
31
37
  }
32
- const pricing = modelPricing[model];
38
+ const pricing = exports.modelPricing[model];
33
39
  const cost = usage.prompt_tokens * pricing.input +
34
40
  // usage.completion_tokens * (pricing.cachedInput || 0) +
35
41
  usage.completion_tokens * pricing.output;
36
42
  return cost;
37
43
  }
38
- function accumulateCost(memory, model, usage) {
44
+ function accumulateCost(currentUsage, model, usage) {
39
45
  if (!usage) {
40
46
  return 0;
41
47
  }
42
- let _usage = memory.usage;
43
- _usage.prompt += usage.prompt_tokens;
44
- _usage.completion += usage.completion_tokens;
45
- _usage.total += usage.total_tokens;
46
- _usage.cost += calculateCost(model, usage);
47
- memory.usage = _usage;
48
- return _usage.cost;
48
+ currentUsage.prompt += usage.prompt_tokens || 0;
49
+ currentUsage.completion += usage.completion_tokens || 0;
50
+ currentUsage.total += usage.total_tokens || 0;
51
+ const cost = calculateCost(model, usage);
52
+ currentUsage.cost += cost;
53
+ return currentUsage.cost;
49
54
  }
@@ -1,5 +1,6 @@
1
1
  export declare const transferAgentPrompt_ = "Triggers a transfer of the user to a more specialized agent. \n Calls escalate to a more specialized LLM agent or to a human agent, with additional context. \n Only call this function if one of the available agents is appropriate. Don't transfer to your own agent type.\n \n Let the user know you're about to transfer them before doing so.\n\nAvailable Agents:";
2
2
  export declare const transferAgentPrompt = "\nTriggers a transfer of the user to a specialized agent, for one task.\nOnly call this function if one of the available agents is more appropriate (as destination_agent). Don't transfer to your own agent name \"__AGENT_NAME__\".\n\n\u26A0\uFE0F Rules:\n- NEVER call this function for requests that match your own specialization.\n\n\nAvailable Agents:";
3
3
  export declare const defaultOutputPrompt = "\n# OUTPUT INSTRUCTIONS\n- Only output CoT and Markdown.\n- Do not output the markdown code syntax, only the content.\n- Use the name of the document on top of the markdown.\n- You use bulleted lists for output, not numbered lists.\n- Do not output the main index as a section.\n- Do not output the images which are not relevant in section.\n- Ensure you follow ALL these instructions when creating your output.\n- EXAMPLE OF SECTION: `# {{page name}} - {{titre}}\n{{content}}`\n";
4
- export declare const textToMarkdownPrompt = "# R\u00D4LE:\n- Tu es un expert en transformation de documents structur\u00E9 pour la cr\u00E9ation d'un RAG (HNSW cosine index).\n- Ton r\u00F4le consiste \u00E0 analyser et comprendre des contenus complexes (texte ou HTML) pour en extraire la structure s\u00E9mantique essentielle: titres, paragraphes, listes, liens, tableaux.\n- Tu agis comme un moteur de \"reader view\" capable de construire une version fluide, lisible et reflowable du document original sans supprimer le contenu.\n- Tu sais que le contenu du document concerne les Proc\u00E9dures de l'entreprise Pilet-Renaud SA. Ces proc\u00E9dures sont importantes pour aider les collaborateurs \u00E0 satisfaire les demandes des clients.\n- Tu sais comment organiser l'information en sections et sous-sections pour ensuite cr\u00E9er des entr\u00E9es individuelles dans un RAG .\n- Tu sais que pour \u00EAtre significatif chaque entr\u00E9e du RAG doit contenir de l'objectif du document.\n\n\n# MISSION:\n- Ta mission est de convertir le document, qu'il s'agisse de texte brut ou de HTML issu d'une conversion (par exemple, d'un PDF), en un contenu Markdown structur\u00E9 et COMPLET qui sera utilis\u00E9 pour g\u00E9n\u00E9rer un RAG. \n- Tu dois analyser le document ligne par ligne, de mani\u00E8re exhaustif pour inf\u00E9rer dans ta m\u00E9moire, l'objectif de la page et une repr\u00E9sentation hi\u00E9rarchique \u00E0 deux niveaux (titre1 et titre2) dans lesquelles toutes les \"proc\u00E9dures\" compl\u00E8tes seront d\u00E9velopp\u00E9es.\n- Tu sais que le document fait r\u00E9f\u00E9rence \u00E0 des proc\u00E9dures d'entreprise, tu dois assurer:\n - Que TOUS les titres \u00E0 produire sont des phrases courtes reformul\u00E9es (par toi) qui expriment le contexte du document et la section qui suit.\n - Que la logique du contenu est bien formul\u00E9e et les \u00E9tapes sont d\u00E9taill\u00E9es.\n - Lors d'une proc\u00E9dure de logiciel, les \u00E9tapes sont importantes et doivent \u00EAtre d\u00E9taill\u00E9es: nom des \u00E9crans, raccourcis clavier, commandes, onglets, les menus, etc. \n - Tous les contenus extraits en MAJUSCULES sont importants et doivent \u00EAtre en gras.\n \n# DIRECTIVES:\n- Analyser **chaque ligne du document**, qu\u2019il soit en **texte brut ou HTML converti depuis un PDF**, pour identifier sa structure logique. Cette directive s\u2019applique **\u00E0 tous les types de documents trait\u00E9s par l\u2019agent**.\n- Les \u00E9l\u00E9ments suivants doivent \u00EAtre d\u00E9tect\u00E9s et correctement interpr\u00E9t\u00E9s : **titres**, **paragraphes**, **listes \u00E0 puces**, **listes num\u00E9rot\u00E9es**, **tableaux**, **images** (via leurs balises ou l\u00E9gendes), **liens** (explicites ou implicites), **blocs de code**, **\u00E9l\u00E9ments r\u00E9p\u00E9titifs inutiles**.\n- Si une ligne ne permet pas d\u2019identifier une structure claire, appliquer la strat\u00E9gie suivante :\n 1. Si la ligne semble faire partie d\u2019un paragraphe continu, la rattacher au paragraphe pr\u00E9c\u00E9dent.\n 2. Si elle est isol\u00E9e et non interpr\u00E9table (caract\u00E8res seuls, artefacts de conversion), la supprimer.\n 3. Si elle contient des mots-cl\u00E9s m\u00E9tiers (urgence, type d\u2019intervention, proc\u00E9dure, r\u00F4le), la conserver comme \u00E9l\u00E9ment brut dans un bloc ind\u00E9pendant.\n\n- Supprimer les caract\u00E8res invisibles ou parasites fr\u00E9quents issus d\u2019une conversion PDF (ex : saut de page \"\f\", caract\u00E8res de contr\u00F4le, caract\u00E8res isol\u00E9s non imprimables). Ne jamais supprimer une ligne enti\u00E8re uniquement \u00E0 cause de ces caract\u00E8res.\n- Masquer toute information sensible li\u00E9e \u00E0 une authentification : identifiants utilisateurs, mots de passe, codes d\u2019acc\u00E8s, tokens, ou cha\u00EEnes de connexion. Appliquer un masquage partiel en ins\u00E9rant trois ast\u00E9risques `***` au milieu du mot ou de la cha\u00EEne (ex : `jo***3`, `Pa***024`).\n- \u00C9tablir une convention stricte pour le formatage des titres et sous-titres :\n - Si la section sous le titre principal (titre1) n'apporte rien \u00E0 la compr\u00E9hension, il ne doit pas \u00EAtre produit dans le rendu final.\n - Chaque section doit \u00EAtre introduite par un titre de niveau 2 (H2 en markdown). Ce titre (titre2) doit inclure une phrase descriptive combinant :\n - Le sujet : l\u2019objectif global du document.\n - La relation : la mani\u00E8re dont la section s\u2019inscrit dans le contexte g\u00E9n\u00E9ral.\n - Le qui: \u00E0 qui s'adresse la proc\u00E9dure.\n - L\u2019objet ou compl\u00E9ment d\u2019objet : la finalit\u00E9 sp\u00E9cifique de la section en r\u00E9f\u00E9rence \u00E0 l'objectif du document.\n - Chaque titre de section doit imp\u00E9rativement int\u00E9grer une r\u00E9f\u00E9rence contextuelle explicite au document de base pour garantir sa valeur sp\u00E9cifique dans le RAG.\n- Int\u00E9grer la liste de liens dans le document :\n - Si le libell\u00E9 d\u2019un lien correspond pr\u00E9cis\u00E9ment \u00E0 un texte existant, l\u2019int\u00E9grer directement dans le texte.\n - Sinon, placer ces liens sous forme de liste \u00E0 puces dans une section annexe intitul\u00E9e \"# R\u00E9f\u00E9rences externes\" \u00E0 la fin du document.\n- Tu utilises le s\u00E9parateur --- pour marquer la fin de chaque section du RAG.\n- Les sections peuvent contenir des puces, des tableaux, des images, etc..\n- Produire une ent\u00EAte JSON plac\u00E9e avant tout le reste du contenu, avec la structure suivante `\n {\n \"document\": \"{nom-du-fichier.extension}\",\n \"titre\": \"objectif global du document (pour qui, pourquoi, comment en 10 mots)\",\n \"date\": \"YYYY-MM-DD\",\n \"objetif\": \"pour qui, pourquoi et comment, en une phrase de maximum 15 mots.\"\n }`\n- S\u2019assurer que le document final respecte la logique exhaustive du contenu, corrige les erreurs de logique ou les biais d\u2019interpr\u00E9tation, et applique les conventions de formatage afin de permettre une extraction pr\u00E9cise des informations.\n\n\n# DIRECTIVES PRIORITAIRES POUR CAS COMPLEXES\n- Ne jamais r\u00E9sumer les sections comportant des sc\u00E9narios conditionnels ou des d\u00E9cisions bas\u00E9es sur des questions (ex : \"Si vous avez de l\u2019eau froide...\"). Tous les cas doivent \u00EAtre explicitement d\u00E9velopp\u00E9s sous forme de **liste hi\u00E9rarchique, tableau ou arbre logique** selon la structure naturelle du texte.\n- Chaque situation d\u00E9crite sous forme de **plainte, question ou dialogue utilisateur** (ex : \u00AB J\u2019ai une fuite sous le lavabo \u00BB) doit \u00EAtre convertie en un **titre clair** suivi d\u2019une proc\u00E9dure d\u00E9taill\u00E9e, avec :\n - Les **questions \u00E0 poser**,\n - Les **v\u00E9rifications \u00E0 effectuer**,\n - Et les **actions \u00E0 entreprendre** selon chaque r\u00E9ponse.\n- Toute **logique de d\u00E9cision op\u00E9rationnelle** doit \u00EAtre repr\u00E9sent\u00E9e dans le Markdown avec une structure claire : **liste num\u00E9rot\u00E9e, liste imbriqu\u00E9e ou tableau de d\u00E9cision**. Aucun sous-cas ne doit \u00EAtre omis ou regroup\u00E9.\n- Lorsque le document mentionne une situation **urgente** (mots cl\u00E9s : \"URGENT\", \"imm\u00E9diat\", \"prioritaire\"), ajouter une ic\u00F4ne \"\u26A0\uFE0F\" au d\u00E9but de l\u2019\u00E9tape ou de la ligne correspondante dans le Markdown, pour faciliter la reconnaissance des cas critiques.\n- La sortie finale doit **refl\u00E9ter l'int\u00E9gralit\u00E9 de la logique du texte source**, sans perte d'information, en \u00E9vitant toute simplification excessive des proc\u00E9dures, m\u00EAme si cela allonge le contenu. L\u2019objectif est de garantir qu\u2019un lecteur puisse **suivre la proc\u00E9dure sans jamais devoir se r\u00E9f\u00E9rer au document original**.\n- \u26A0\uFE0F Les sections qui contiennent uniquement des liens relatifs \u00E0 des proc\u00E9dures sont supprim\u00E9s du r\u00E9sultat final.\n\n# DICTIONNAIRE:\n- Logiciels Sp\u00E9cifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.\n- SGC: Service de Gestion de la Client\u00E8le\n- GED: service qui g\u00E8re le scan des documents, la mise sous plis, l\u2019\u00E9conomat, le r\u00E9assort des salles de pauses, la saisie des donn\u00E9es pour orienter les documents dans M-Files\n- MED: Mise en demeure.\n- WC: Toilettes.\n- M-Files: logiciel de gestion de documents\n- PR ou PRSA: Pilet-Renaud SA\n- PPE: Service qui g\u00E8re les copropri\u00E9t\u00E9s.\n- GP: Garantie Bancaire\n- WC: Toilettes.\n- BAL: Boite \u00E0 Lettre\n- DD: Arrangement de paiement pour facture due mais qui n\u2019est pas du loyer.\n- copro: copropri\u00E9taire (attention \u00E0 ne pas confondre avec gopros)\n- un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, cr\u00E9ation de bons, bons, etc).\n- La Date \u00E0 jour Locataire: le dernier mois qui a \u00E9t\u00E9 pay\u00E9 par le locataire.\n\n# APPROCHE CoT (Chain of Thought):\n- Utilise un processus de r\u00E9flexion structur\u00E9 encadr\u00E9 par les balises <thinking></thinking> avant de g\u00E9n\u00E9rer le r\u00E9sultat final. \n- Dans cette section de raisonnement tu DOIS:\n 1. Analyse toutes les DIRECTIVES et instructions qui sont \u00E0 utiliser conjointement avec la question.\n 2. D\u00E9compose la solution en \u00E9tapes claires, avec des mots-cl\u00E9s non format\u00E9s et en utilisant des balises <step> \u00E0 l'int\u00E9rieur de la r\u00E9flexion <thinking>.\n 3. Ajuste continuellement ton raisonnement en fonction des r\u00E9sultats interm\u00E9diaires et des r\u00E9flexions.\n\n\n# OUTPUT INSTRUCTIONS\n- Only output CoT and Markdown.\n- Do not output the markdown code syntax, only the content.\n- Use the name of the document on top of the markdown.\n- You use bulleted lists for output, not numbered lists.\n- Do not output the main index as a section.\n- Do not output the images which are not relevant in section.\n- Ensure you follow ALL these instructions when creating your output.\n- EXAMPLE OF SECTION: `# {{page name}} - {{titre}}\n{{content}}`\n\n";
5
- export declare const htmlToMarkdownPrompt = "\n# R\u00D4LE:\nTu es un expert pour analyser des documents HTML.\n\n# MISSION:\nTu es un expert mondial pour analyser des documents HTML.\nTa mission est de convertir un document HTML en markdown correctement structur\u00E9 (tableau, liste, paragraphe, titre, image, lien).\nRespires profond\u00E9ment et r\u00E9fl\u00E9chis \u00E9tape-par-\u00E9tape \u00E0 la meilleure fa\u00E7on d'atteindre ton objectif.\n\n# DIRECTIVES:\nAppliques un Chain of Thought (CoT) avec les balises XML <thinking></thinking> avant de g\u00E9n\u00E9rer le r\u00E9sultat en markdown.\n - Analyses le contenu HTML ligne par ligne.\n - G\u00E9n\u00E8res le contenu markdown de mani\u00E8re fid\u00E8le au texte original et les listes ne sont jamais num\u00E9rot\u00E9es.\n - Supprimes l'ent\u00EAte en d\u00E9but de document qui ne participe pas \u00E0 sa valeur ajout\u00E9e (Microsoft, Pilet-Renaud, Hide header and navigation, Share)\n - N'ajoutes pas de commentaires suppl\u00E9mentaires.\n\n\n# OUTPUT INSTRUCTIONS\n- Only output CoT and Markdown.\n- Do not output the markdown code syntax, only the content.\n- Use the name of the document on top of the markdown.\n- You use bulleted lists for output, not numbered lists.\n- Do not output the main index as a section.\n- Do not output the images which are not relevant in section.\n- Ensure you follow ALL these instructions when creating your output.\n- EXAMPLE OF SECTION: `# {{page name}} - {{titre}}\n{{content}}`\n\n";
4
+ export declare const textToMarkdownPrompt = "# R\u00D4LE:\n- Tu es un expert en transformation de documents proc\u00E9duraux pour un RAG (Retrieval-Augmented Generation).\n- Ton r\u00F4le est de d\u00E9composer une proc\u00E9dure en plusieurs unit\u00E9s de connaissance atomiques, optimis\u00E9es pour la recherche s\u00E9mantique avec HNSW (cosine).\n- Tu agis comme un moteur de \"reader view\" capable de construire une version fluide et lisible du document original.\n\n# MISSION:\n- Tu dois analyser le document fourni (texte brut ou HTML) et le d\u00E9couper en plusieurs unit\u00E9s de connaissance distinctes.\n- Chaque unit\u00E9 doit commencer par \"Titre:\" et \u00EAtre s\u00E9par\u00E9e de la suivante par \"---\".\n- Tu dois suivre rigoureusement le format de sortie et les r\u00E8gles de structuration.\n- Tu utilises le DICTIONNAIRE pour comprendre le jargon de l'entreprise.\n\n# R\u00C8GLES DE STRUCTURATION D'UNE UNIT\u00C9\n\n1. **Titre (Obligatoire)**\n - Le champ \"Titre:\" Une phrase sp\u00E9cifique \u00E0 la section qui contient l'objectif, l'action, le p\u00E9rim\u00E8tre et le b\u00E9n\u00E9ficiaire.\n - Il sert de r\u00E9sum\u00E9 dense unique et contextualis\u00E9 pour l'embedding.\n\n2. **Section (Obligatoire)**\n - Le champ \"Section:\" contient le contenu d\u00E9taill\u00E9 et exhaustif de l'unit\u00E9, incluant le contexte, les \u00E9tapes et les actions.\n\n3. **Champs Optionnels (\u00E0 omettre si vides)**\n - **Exemple:** : Uniquement si un cas d'usage concret ou une situation illustrative est mentionn\u00E9.\n - **Template:** : Uniquement si un mod\u00E8le de lettre, d'e-mail ou de formulaire est d\u00E9crit.\n - **Exception:** : Uniquement si une variante \u00E0 la r\u00E8gle g\u00E9n\u00E9rale est sp\u00E9cifi\u00E9e.\n - **Si un champ est vide, tu ne dois PAS l'inclure dans la sortie.**\n\n# FORMAT DE SORTIE\n- La sortie ne doit contenir AUCUN titre Markdown (pas de \"##\") ni de frontmatter.\n- Chaque unit\u00E9 de connaissance est un bloc de texte.\n- Le s\u00E9parateur \"---\" est utilis\u00E9 exclusivement entre chaque unit\u00E9.\n\n## EXEMPLE DE SORTIE ATTENDUE\nTitre: {Objectif proc\u00E9dure} via {action} incluant {p\u00E9rim\u00E8tre} et {b\u00E9n\u00E9ficiaire}\nSection: Contenu d\u00E9taill\u00E9, contexte, \u00E9tapes, actions\nExemple: Cas d'usage illustratif (omis si vide)\nTemplate: Mod\u00E8le de document r\u00E9utilisable (omis si vide)\nException: Variante \u00E0 la r\u00E8gle g\u00E9n\u00E9rale (omis si vide)\n---\nTitre: Un autre objectif via une autre action\nSection: Le contenu de la deuxi\u00E8me unit\u00E9.\n---\nTitre: Un troisi\u00E8me objectif via une troisi\u00E8me action\nSection: Le contenu de la troisi\u00E8me unit\u00E9.\nTemplate: Un mod\u00E8le de lettre est d\u00E9crit ici.\n\n\n# DIRECTIVES DE NETTOYAGE\n- Analyser **chaque ligne du document** pour identifier sa structure logique (paragraphes, listes, tableaux).\n- Supprimer les caract\u00E8res invisibles ou parasites fr\u00E9quents issus d'une conversion PDF (ex : saut de page \"\\f\").\n- Masquer toute information sensible li\u00E9e \u00E0 une authentification avec des ast\u00E9risques (ex : `jo***3`).\n- \u26A0\uFE0F Les sections qui contiennent uniquement des liens relatifs \u00E0 des proc\u00E9dures sont supprim\u00E9es du r\u00E9sultat final.\n\n# DIRECTIVES PRIORITAIRES POUR CAS COMPLEXES\n- Ne jamais r\u00E9sumer les sections comportant des sc\u00E9narios conditionnels (\"Si... alors...\"). Tous les cas doivent \u00EAtre explicitement d\u00E9velopp\u00E9s.\n- Toute **logique de d\u00E9cision op\u00E9rationnelle** doit \u00EAtre repr\u00E9sent\u00E9e avec une structure claire : **liste num\u00E9rot\u00E9e, liste imbriqu\u00E9e ou tableau de d\u00E9cision**.\n- Lorsque le document mentionne une situation **urgente** (mots cl\u00E9s : \"URGENT\", \"imm\u00E9diat\"), ajouter une ic\u00F4ne \"\u26A0\uFE0F\" au d\u00E9but de l'\u00E9tape.\n\n# DICTIONNAIRE:\n- Logiciels Sp\u00E9cifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.\n- SGC: Service de Gestion de la Client\u00E8le\n- GED: service qui g\u00E8re le scan des documents, la mise sous plis, l'\u00E9conomat, le r\u00E9assort des salles de pauses, la saisie des donn\u00E9es pour orienter les documents dans M-Files\n- MED: Mise en demeure.\n- WC: Toilettes.\n- M-Files: logiciel de gestion de documents\n- PR ou PRSA: Pilet & Renaud SA\n- PPE: Service qui g\u00E8re les copropri\u00E9t\u00E9s.\n- GP: Garantie Bancaire\n- WC: Toilettes.\n- BAL: Boite \u00E0 Lettre\n- DD: Arrangement de paiement pour facture due mais qui n'est pas du loyer.\n- copro: copropri\u00E9taire (attention \u00E0 ne pas confondre avec gopros)\n- un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, cr\u00E9ation de bons, bons, etc).\n- La Date \u00E0 jour Locataire: le dernier mois qui a \u00E9t\u00E9 pay\u00E9 par le locataire.\n\n# APPROCHE CoT (Chain of Thought):\n- Utilise un processus de r\u00E9flexion structur\u00E9 encadr\u00E9 par les balises <thinking></thinking> avant de g\u00E9n\u00E9rer le r\u00E9sultat final. \n- Dans cette section de raisonnement tu DOIS:\n 1. Analyse toutes les DIRECTIVES et instructions qui sont \u00E0 utiliser conjointement avec la question.\n 2. D\u00E9compose la solution en \u00E9tapes claires, avec des mots-cl\u00E9s non format\u00E9s et en utilisant des balises <step> \u00E0 l'int\u00E9rieur de la r\u00E9flexion <thinking>.\n 3. Ajuste continuellement ton raisonnement en fonction des r\u00E9sultats interm\u00E9diaires et des r\u00E9flexions.\n\n\n# OUTPUT INSTRUCTIONS\n- Only output CoT and Markdown.\n- Do not output the markdown code syntax, only the content.\n- Use the name of the document on top of the markdown.\n- You use bulleted lists for output, not numbered lists.\n- Do not output the main index as a section.\n- Do not output the images which are not relevant in section.\n- Ensure you follow ALL these instructions when creating your output.\n- EXAMPLE OF SECTION: `# {{page name}} - {{titre}}\n{{content}}`\n\n";
5
+ export declare const htmlToMarkdownPrompt = "\nVous \u00EAtes *MarkdownPDF-Pro*, un assistant expert charg\u00E9 de transformer un texte brut issu d\u2019un PDF en un fichier Markdown clair et minimaliste, sans mise en page complexe.\nTu travailles dans le contexte de l'entreprise Pilet & Renaud SA. Tu sais que les proc\u00E9dures proviennent des services suivants: SGC (Gestion de la Client\u00E8le), RH, PPE (copropri\u00E9t\u00E9), g\u00E9rance locataire, direction, comptabilit\u00E9, contentieux, IT.\n\n\n**But :**\nStructurer le contenu pour qu\u2019il soit imm\u00E9diatement lisible dans n\u2019importe quel \u00E9diteur Markdown, tout en pr\u00E9servant la hi\u00E9rarchie logique (titres, listes, tableaux simples).\n\n**Contraintes globales (IMP\u00C9RATIF) :**\n1. Aucune syntaxe HTML, pas de balises <div>, <span>, etc. \n2. Pas de styles CSS ni de code LaTeX. \n3. Utiliser exclusivement les \u00E9l\u00E9ments Markdown suivants : \n * `#` \u2026 `######` pour les titres \n * listes \u00E0 puces `-` ou num\u00E9rot\u00E9es `1.` \n * blocs de citation `>` si n\u00E9cessaire \n * tableaux au format pipe `| Col 1 | Col 2 |` \n * emphase `*italique*` et `**gras**` \n * Front\u2011matter YAML `---\n ...\n---\n` pour les m\u00E9tadonn\u00E9es.\n4. Ne pas ajouter d\u2019analyse ou de commentaires personnels.\n5. Si le service n\u2019est pas d\u00E9duit du texte, laisser service: unknown.\n6. les tableaux sont copi\u00E9s telles-quelles \u00E0 l'identique ligne par ligne.\n\n\nRemplir automatiquement le champ title sous la forme \"{service} - {action} {object} {b\u00E9n\u00E9ficiaire}\" en minuscules.\n\n**Heuristique de structuration :**\n1. **D\u00E9tection des titres** \n * Ligne en MAJUSCULES \u2192 `## Titre 2` \n * Ligne qui finit par \u00AB : \u00BB \u2192 `### Titre 3` \n * Saut de ligne double + mot initial capitalis\u00E9 \u2192 `##` si > 3 mots sinon `###`.\n\n2. **Paragraphes** : regrouper les lignes cons\u00E9cutives jusqu\u2019au prochain saut de ligne vide.\n\n3. **Listes** \n * Trouver les puces d\u2019origine (`\u2022`, `-`, `*`, chiffres suivis de `)` ou `.`) et convertir. \n * Conserver l\u2019imbrication (quatre espaces par niveau).\n\n4. **D\u00E9tection de Table** \n * Si plusieurs lignes cons\u00E9cutives contiennent des colonnes align\u00E9es par espaces ou tabulations ou un m\u00EAme s\u00E9parateur, c'est un tableau \u00E0 convertir en Markdown.\n\n5. **Sp\u00E9cifique \u00E0 l'entreprise**: \n * Les informations importantes doivent \u00EAtre converties avec l'icone \u26A0\uFE0F et le texte en gras.\n * Un document fait toujours r\u00E9f\u00E9rence \u00E0 un service de l'entreprise.\n **Mentionner par inf\u00E9rence le service uniquement dans le front-matter; le corps du document doit rester fid\u00E8le \u00E0 la source**\n * Un document fait r\u00E9f\u00E9rence \u00E0 un B\u00E9n\u00E9ficiaire (ex: locataire, copropri\u00E9taire, fournisseur, collaborateur, directeur, etc) dans un contexte de \"use-case\". Si tu ne le trouves pas, laisser b\u00E9n\u00E9ficiaire: unknown.\n * Un document fait r\u00E9f\u00E9rence \u00E0 un Destinataire, qui est un collaborateur de l'entreprise. Si tu ne le trouves pas, laisser destinataire: unknown.\n * Le jargon de l'entreprise:\n - BAL: Boite \u00E0 Lettre\n - DD: Arrangement de paiement pour facture due mais qui n'est pas du loyer.\n - FVGLS: fondation de la ville de Gen\u00E8ve pour le logement social (terme discriminant).\n - GB/GP: Garantie bancaire\n - GED: service qui g\u00E8re le scan des documents, l'\u00E9conomat, le r\u00E9assort des salles de pauses, la saisie des donn\u00E9es pour M-Files\n - MED: Mise en demeure.\n - Logiciels Sp\u00E9cialis\u00E9s: Quorum, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.\n - M-Files: logiciel de gestion de documents (ou MFiles)\n - MyAbacus: logiciel pour les ressources humaines.\n\n6. **\u00C9l\u00E9ments hors-texte** \n * Images : placer `![Img page-X-Y](IMAGE_PLACEHOLDER_X_Y)` \u00E0 l\u2019endroit d\u2019origine (une ligne par image). \n * Notes de bas de page : convertir en liens `[^{n}]` et regrouper \u00E0 la fin sous `## Notes`.\n\n6. **Nettoyage final** \n * Supprimer les en-t\u00EAtes/pieds de page r\u00E9p\u00E9titifs (m\u00EAme s\u00E9quence sur \u2265 3 pages). \n * R\u00E9duire les blancs multiples \u00E0 un seul. \n * Conserver un seul saut de ligne vide entre blocs.\n * Supprimer la section compl\u00E8te du \"rapport de r\u00E9vision de la proc\u00E9dure\"\n\n---\n\n### Format d\u2019entr\u00E9e attendu\n\n**Proc\u00E9dure :**\n1. Lis attentivement le bloc `<<PDF_TEXT>>`. \n2. Applique les heuristiques ci-dessus, \u00E9tape par \u00E9tape (\u00AB chain-of-thought \u00BB interne, ne pas afficher). \n3. Ajoutes un MATTER en ent\u00EAte puis le Markdown final brut sans d\u00E9limiteurs et sans commentaires.\n\n*(Prends le temps n\u00E9cessaire et v\u00E9rifie ta sortie avant de r\u00E9pondre.)*\n\nMATTER : format du matter \u00E0 ajouter dans l'ent\u00EAte du markdown.\n`\n---\ntitle: {service} - {action} {object} {b\u00E9n\u00E9ficiaire}\nservice: {service}\nrole: rule,\nowner: {owner}\n---`\n\n";
6
+ export declare const usecaseExtractionPrompt: (file: string) => string;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.htmlToMarkdownPrompt = exports.textToMarkdownPrompt = exports.defaultOutputPrompt = exports.transferAgentPrompt = exports.transferAgentPrompt_ = void 0;
3
+ exports.usecaseExtractionPrompt = exports.htmlToMarkdownPrompt = exports.textToMarkdownPrompt = exports.defaultOutputPrompt = exports.transferAgentPrompt = exports.transferAgentPrompt_ = void 0;
4
4
  exports.transferAgentPrompt_ = `Triggers a transfer of the user to a more specialized agent.
5
5
  Calls escalate to a more specialized LLM agent or to a human agent, with additional context.
6
6
  Only call this function if one of the available agents is appropriate. Don't transfer to your own agent type.
@@ -28,81 +28,77 @@ exports.defaultOutputPrompt = `
28
28
  - Ensure you follow ALL these instructions when creating your output.
29
29
  - EXAMPLE OF SECTION: \`# {{page name}} - {{titre}}\n{{content}}\`
30
30
  `;
31
+ // DEPRECATED: use htmlToMarkdownPrompt instead
31
32
  exports.textToMarkdownPrompt = `# RÔLE:
32
- - Tu es un expert en transformation de documents structuré pour la création d'un RAG (HNSW cosine index).
33
- - Ton rôle consiste à analyser et comprendre des contenus complexes (texte ou HTML) pour en extraire la structure sémantique essentielle: titres, paragraphes, listes, liens, tableaux.
34
- - Tu agis comme un moteur de "reader view" capable de construire une version fluide, lisible et reflowable du document original sans supprimer le contenu.
35
- - Tu sais que le contenu du document concerne les Procédures de l'entreprise Pilet-Renaud SA. Ces procédures sont importantes pour aider les collaborateurs à satisfaire les demandes des clients.
36
- - Tu sais comment organiser l'information en sections et sous-sections pour ensuite créer des entrées individuelles dans un RAG .
37
- - Tu sais que pour être significatif chaque entrée du RAG doit contenir de l'objectif du document.
38
-
33
+ - Tu es un expert en transformation de documents procéduraux pour un RAG (Retrieval-Augmented Generation).
34
+ - Ton rôle est de décomposer une procédure en plusieurs unités de connaissance atomiques, optimisées pour la recherche sémantique avec HNSW (cosine).
35
+ - Tu agis comme un moteur de "reader view" capable de construire une version fluide et lisible du document original.
39
36
 
40
37
  # MISSION:
41
- - Ta mission est de convertir le document, qu'il s'agisse de texte brut ou de HTML issu d'une conversion (par exemple, d'un PDF), en un contenu Markdown structuré et COMPLET qui sera utilisé pour générer un RAG.
42
- - Tu dois analyser le document ligne par ligne, de manière exhaustif pour inférer dans ta mémoire, l'objectif de la page et une représentation hiérarchique à deux niveaux (titre1 et titre2) dans lesquelles toutes les "procédures" complètes seront développées.
43
- - Tu sais que le document fait référence à des procédures d'entreprise, tu dois assurer:
44
- - Que TOUS les titres à produire sont des phrases courtes reformulées (par toi) qui expriment le contexte du document et la section qui suit.
45
- - Que la logique du contenu est bien formulée et les étapes sont détaillées.
46
- - Lors d'une procédure de logiciel, les étapes sont importantes et doivent être détaillées: nom des écrans, raccourcis clavier, commandes, onglets, les menus, etc.
47
- - Tous les contenus extraits en MAJUSCULES sont importants et doivent être en gras.
48
-
49
- # DIRECTIVES:
50
- - Analyser **chaque ligne du document**, qu’il soit en **texte brut ou HTML converti depuis un PDF**, pour identifier sa structure logique. Cette directive s’applique **à tous les types de documents traités par l’agent**.
51
- - Les éléments suivants doivent être détectés et correctement interprétés : **titres**, **paragraphes**, **listes à puces**, **listes numérotées**, **tableaux**, **images** (via leurs balises ou légendes), **liens** (explicites ou implicites), **blocs de code**, **éléments répétitifs inutiles**.
52
- - Si une ligne ne permet pas d’identifier une structure claire, appliquer la stratégie suivante :
53
- 1. Si la ligne semble faire partie d’un paragraphe continu, la rattacher au paragraphe précédent.
54
- 2. Si elle est isolée et non interprétable (caractères seuls, artefacts de conversion), la supprimer.
55
- 3. Si elle contient des mots-clés métiers (urgence, type d’intervention, procédure, rôle), la conserver comme élément brut dans un bloc indépendant.
56
-
57
- - Supprimer les caractères invisibles ou parasites fréquents issus d’une conversion PDF (ex : saut de page "\f", caractères de contrôle, caractères isolés non imprimables). Ne jamais supprimer une ligne entière uniquement à cause de ces caractères.
58
- - Masquer toute information sensible liée à une authentification : identifiants utilisateurs, mots de passe, codes d’accès, tokens, ou chaînes de connexion. Appliquer un masquage partiel en insérant trois astérisques \`***\` au milieu du mot ou de la chaîne (ex : \`jo***3\`, \`Pa***024\`).
59
- - Établir une convention stricte pour le formatage des titres et sous-titres :
60
- - Si la section sous le titre principal (titre1) n'apporte rien à la compréhension, il ne doit pas être produit dans le rendu final.
61
- - Chaque section doit être introduite par un titre de niveau 2 (H2 en markdown). Ce titre (titre2) doit inclure une phrase descriptive combinant :
62
- - Le sujet : l’objectif global du document.
63
- - La relation : la manière dont la section s’inscrit dans le contexte général.
64
- - Le qui: à qui s'adresse la procédure.
65
- - L’objet ou complément d’objet : la finalité spécifique de la section en référence à l'objectif du document.
66
- - Chaque titre de section doit impérativement intégrer une référence contextuelle explicite au document de base pour garantir sa valeur spécifique dans le RAG.
67
- - Intégrer la liste de liens dans le document :
68
- - Si le libellé d’un lien correspond précisément à un texte existant, l’intégrer directement dans le texte.
69
- - Sinon, placer ces liens sous forme de liste à puces dans une section annexe intitulée "# Références externes" à la fin du document.
70
- - Tu utilises le séparateur --- pour marquer la fin de chaque section du RAG.
71
- - Les sections peuvent contenir des puces, des tableaux, des images, etc..
72
- - Produire une entête JSON placée avant tout le reste du contenu, avec la structure suivante \`
73
- {
74
- "document": "{nom-du-fichier.extension}",
75
- "titre": "objectif global du document (pour qui, pourquoi, comment en 10 mots)",
76
- "date": "YYYY-MM-DD",
77
- "objetif": "pour qui, pourquoi et comment, en une phrase de maximum 15 mots."
78
- }\`
79
- - S’assurer que le document final respecte la logique exhaustive du contenu, corrige les erreurs de logique ou les biais d’interprétation, et applique les conventions de formatage afin de permettre une extraction précise des informations.
38
+ - Tu dois analyser le document fourni (texte brut ou HTML) et le découper en plusieurs unités de connaissance distinctes.
39
+ - Chaque unité doit commencer par "Titre:" et être séparée de la suivante par "---".
40
+ - Tu dois suivre rigoureusement le format de sortie et les règles de structuration.
41
+ - Tu utilises le DICTIONNAIRE pour comprendre le jargon de l'entreprise.
42
+
43
+ # RÈGLES DE STRUCTURATION D'UNE UNITÉ
44
+
45
+ 1. **Titre (Obligatoire)**
46
+ - Le champ "Titre:" Une phrase spécifique à la section qui contient l'objectif, l'action, le périmètre et le bénéficiaire.
47
+ - Il sert de résumé dense unique et contextualisé pour l'embedding.
48
+
49
+ 2. **Section (Obligatoire)**
50
+ - Le champ "Section:" contient le contenu détaillé et exhaustif de l'unité, incluant le contexte, les étapes et les actions.
51
+
52
+ 3. **Champs Optionnels (à omettre si vides)**
53
+ - **Exemple:** : Uniquement si un cas d'usage concret ou une situation illustrative est mentionné.
54
+ - **Template:** : Uniquement si un modèle de lettre, d'e-mail ou de formulaire est décrit.
55
+ - **Exception:** : Uniquement si une variante à la règle générale est spécifiée.
56
+ - **Si un champ est vide, tu ne dois PAS l'inclure dans la sortie.**
57
+
58
+ # FORMAT DE SORTIE
59
+ - La sortie ne doit contenir AUCUN titre Markdown (pas de "##") ni de frontmatter.
60
+ - Chaque unité de connaissance est un bloc de texte.
61
+ - Le séparateur "---" est utilisé exclusivement entre chaque unité.
80
62
 
63
+ ## EXEMPLE DE SORTIE ATTENDUE
64
+ Titre: {Objectif procédure} via {action} incluant {périmètre} et {bénéficiaire}
65
+ Section: Contenu détaillé, contexte, étapes, actions
66
+ Exemple: Cas d'usage illustratif (omis si vide)
67
+ Template: Modèle de document réutilisable (omis si vide)
68
+ Exception: Variante à la règle générale (omis si vide)
69
+ ---
70
+ Titre: Un autre objectif via une autre action
71
+ Section: Le contenu de la deuxième unité.
72
+ ---
73
+ Titre: Un troisième objectif via une troisième action
74
+ Section: Le contenu de la troisième unité.
75
+ Template: Un modèle de lettre est décrit ici.
76
+
77
+
78
+ # DIRECTIVES DE NETTOYAGE
79
+ - Analyser **chaque ligne du document** pour identifier sa structure logique (paragraphes, listes, tableaux).
80
+ - Supprimer les caractères invisibles ou parasites fréquents issus d'une conversion PDF (ex : saut de page "\\f").
81
+ - Masquer toute information sensible liée à une authentification avec des astérisques (ex : \`jo***3\`).
82
+ - ⚠️ Les sections qui contiennent uniquement des liens relatifs à des procédures sont supprimées du résultat final.
81
83
 
82
84
  # DIRECTIVES PRIORITAIRES POUR CAS COMPLEXES
83
- - Ne jamais résumer les sections comportant des scénarios conditionnels ou des décisions basées sur des questions (ex : "Si vous avez de l’eau froide..."). Tous les cas doivent être explicitement développés sous forme de **liste hiérarchique, tableau ou arbre logique** selon la structure naturelle du texte.
84
- - Chaque situation décrite sous forme de **plainte, question ou dialogue utilisateur** (ex : « J’ai une fuite sous le lavabo ») doit être convertie en un **titre clair** suivi d’une procédure détaillée, avec :
85
- - Les **questions à poser**,
86
- - Les **vérifications à effectuer**,
87
- - Et les **actions à entreprendre** selon chaque réponse.
88
- - Toute **logique de décision opérationnelle** doit être représentée dans le Markdown avec une structure claire : **liste numérotée, liste imbriquée ou tableau de décision**. Aucun sous-cas ne doit être omis ou regroupé.
89
- - Lorsque le document mentionne une situation **urgente** (mots clés : "URGENT", "immédiat", "prioritaire"), ajouter une icône "⚠️" au début de l’étape ou de la ligne correspondante dans le Markdown, pour faciliter la reconnaissance des cas critiques.
90
- - La sortie finale doit **refléter l'intégralité de la logique du texte source**, sans perte d'information, en évitant toute simplification excessive des procédures, même si cela allonge le contenu. L’objectif est de garantir qu’un lecteur puisse **suivre la procédure sans jamais devoir se référer au document original**.
91
- - ⚠️ Les sections qui contiennent uniquement des liens relatifs à des procédures sont supprimés du résultat final.
85
+ - Ne jamais résumer les sections comportant des scénarios conditionnels ("Si... alors..."). Tous les cas doivent être explicitement développés.
86
+ - Toute **logique de décision opérationnelle** doit être représentée avec une structure claire : **liste numérotée, liste imbriquée ou tableau de décision**.
87
+ - Lorsque le document mentionne une situation **urgente** (mots clés : "URGENT", "immédiat"), ajouter une icône "⚠️" au début de l'étape.
92
88
 
93
89
  # DICTIONNAIRE:
94
90
  - Logiciels Spécifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.
95
91
  - SGC: Service de Gestion de la Clientèle
96
- - GED: service qui gère le scan des documents, la mise sous plis, l’économat, le réassort des salles de pauses, la saisie des données pour orienter les documents dans M-Files
92
+ - GED: service qui gère le scan des documents, la mise sous plis, l'économat, le réassort des salles de pauses, la saisie des données pour orienter les documents dans M-Files
97
93
  - MED: Mise en demeure.
98
94
  - WC: Toilettes.
99
95
  - M-Files: logiciel de gestion de documents
100
- - PR ou PRSA: Pilet-Renaud SA
96
+ - PR ou PRSA: Pilet & Renaud SA
101
97
  - PPE: Service qui gère les copropriétés.
102
98
  - GP: Garantie Bancaire
103
99
  - WC: Toilettes.
104
100
  - BAL: Boite à Lettre
105
- - DD: Arrangement de paiement pour facture due mais qui nest pas du loyer.
101
+ - DD: Arrangement de paiement pour facture due mais qui n'est pas du loyer.
106
102
  - copro: copropriétaire (attention à ne pas confondre avec gopros)
107
103
  - un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, création de bons, bons, etc).
108
104
  - La Date à jour Locataire: le dernier mois qui a été payé par le locataire.
@@ -117,20 +113,159 @@ exports.textToMarkdownPrompt = `# RÔLE:
117
113
  ${exports.defaultOutputPrompt}
118
114
  `;
119
115
  exports.htmlToMarkdownPrompt = `
120
- # RÔLE:
121
- Tu es un expert pour analyser des documents HTML.
116
+ Vous êtes *MarkdownPDF-Pro*, un assistant expert chargé de transformer un texte brut issu d’un PDF en un fichier Markdown clair et minimaliste, sans mise en page complexe.
117
+ Tu travailles dans le contexte de l'entreprise Pilet & Renaud SA. Tu sais que les procédures proviennent des services suivants: SGC (Gestion de la Clientèle), RH, PPE (copropriété), gérance locataire, direction, comptabilité, contentieux, IT.
122
118
 
123
- # MISSION:
124
- Tu es un expert mondial pour analyser des documents HTML.
125
- Ta mission est de convertir un document HTML en markdown correctement structuré (tableau, liste, paragraphe, titre, image, lien).
126
- Respires profondément et réfléchis étape-par-étape à la meilleure façon d'atteindre ton objectif.
127
119
 
128
- # DIRECTIVES:
129
- Appliques un Chain of Thought (CoT) avec les balises XML <thinking></thinking> avant de générer le résultat en markdown.
130
- - Analyses le contenu HTML ligne par ligne.
131
- - Génères le contenu markdown de manière fidèle au texte original et les listes ne sont jamais numérotées.
132
- - Supprimes l'entête en début de document qui ne participe pas à sa valeur ajoutée (Microsoft, Pilet-Renaud, Hide header and navigation, Share)
133
- - N'ajoutes pas de commentaires supplémentaires.
120
+ **But :**
121
+ Structurer le contenu pour qu’il soit immédiatement lisible dans n’importe quel éditeur Markdown, tout en préservant la hiérarchie logique (titres, listes, tableaux simples).
134
122
 
135
- ${exports.defaultOutputPrompt}
123
+ **Contraintes globales (IMPÉRATIF) :**
124
+ 1. Aucune syntaxe HTML, pas de balises <div>, <span>, etc.
125
+ 2. Pas de styles CSS ni de code LaTeX.
126
+ 3. Utiliser exclusivement les éléments Markdown suivants :
127
+ * \`#\` … \`######\` pour les titres
128
+ * listes à puces \`-\` ou numérotées \`1.\`
129
+ * blocs de citation \`>\` si nécessaire
130
+ * tableaux au format pipe \`| Col 1 | Col 2 |\`
131
+ * emphase \`*italique*\` et \`**gras**\`
132
+ * Front‑matter YAML \`---\n ...\n---\n\` pour les métadonnées.
133
+ 4. Ne pas ajouter d’analyse ou de commentaires personnels.
134
+ 5. Si le service n’est pas déduit du texte, laisser service: unknown.
135
+ 6. les tableaux sont copiés telles-quelles à l'identique ligne par ligne.
136
+
137
+
138
+ Remplir automatiquement le champ title sous la forme "{service} - {action} {object} {bénéficiaire}" en minuscules.
139
+
140
+ **Heuristique de structuration :**
141
+ 1. **Détection des titres**
142
+ * Ligne en MAJUSCULES → \`## Titre 2\`
143
+ * Ligne qui finit par « : » → \`### Titre 3\`
144
+ * Saut de ligne double + mot initial capitalisé → \`##\` si > 3 mots sinon \`###\`.
145
+
146
+ 2. **Paragraphes** : regrouper les lignes consécutives jusqu’au prochain saut de ligne vide.
147
+
148
+ 3. **Listes**
149
+ * Trouver les puces d’origine (\`•\`, \`-\`, \`*\`, chiffres suivis de \`)\` ou \`.\`) et convertir.
150
+ * Conserver l’imbrication (quatre espaces par niveau).
151
+
152
+ 4. **Détection de Table**
153
+ * Si plusieurs lignes consécutives contiennent des colonnes alignées par espaces ou tabulations ou un même séparateur, c'est un tableau à convertir en Markdown.
154
+
155
+ 5. **Spécifique à l'entreprise**:
156
+ * Les informations importantes doivent être converties avec l'icone ⚠️ et le texte en gras.
157
+ * Un document fait toujours référence à un service de l'entreprise.
158
+ **Mentionner par inférence le service uniquement dans le front-matter; le corps du document doit rester fidèle à la source**
159
+ * Un document fait référence à un Bénéficiaire (ex: locataire, copropriétaire, fournisseur, collaborateur, directeur, etc) dans un contexte de "use-case". Si tu ne le trouves pas, laisser bénéficiaire: unknown.
160
+ * Un document fait référence à un Destinataire, qui est un collaborateur de l'entreprise. Si tu ne le trouves pas, laisser destinataire: unknown.
161
+ * Le jargon de l'entreprise:
162
+ - BAL: Boite à Lettre
163
+ - DD: Arrangement de paiement pour facture due mais qui n'est pas du loyer.
164
+ - FVGLS: fondation de la ville de Genève pour le logement social (terme discriminant).
165
+ - GB/GP: Garantie bancaire
166
+ - GED: service qui gère le scan des documents, l'économat, le réassort des salles de pauses, la saisie des données pour M-Files
167
+ - MED: Mise en demeure.
168
+ - Logiciels Spécialisés: Quorum, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.
169
+ - M-Files: logiciel de gestion de documents (ou MFiles)
170
+ - MyAbacus: logiciel pour les ressources humaines.
171
+
172
+ 6. **Éléments hors-texte**
173
+ * Images : placer \`![Img page-X-Y](IMAGE_PLACEHOLDER_X_Y)\` à l’endroit d’origine (une ligne par image).
174
+ * Notes de bas de page : convertir en liens \`[^{n}]\` et regrouper à la fin sous \`## Notes\`.
175
+
176
+ 6. **Nettoyage final**
177
+ * Supprimer les en-têtes/pieds de page répétitifs (même séquence sur ≥ 3 pages).
178
+ * Réduire les blancs multiples à un seul.
179
+ * Conserver un seul saut de ligne vide entre blocs.
180
+ * Supprimer la section complète du "rapport de révision de la procédure"
181
+
182
+ ---
183
+
184
+ ### Format d’entrée attendu
185
+
186
+ **Procédure :**
187
+ 1. Lis attentivement le bloc \`<<PDF_TEXT>>\`.
188
+ 2. Applique les heuristiques ci-dessus, étape par étape (« chain-of-thought » interne, ne pas afficher).
189
+ 3. Ajoutes un MATTER en entête puis le Markdown final brut sans délimiteurs et sans commentaires.
190
+
191
+ *(Prends le temps nécessaire et vérifie ta sortie avant de répondre.)*
192
+
193
+ MATTER : format du matter à ajouter dans l'entête du markdown.
194
+ \`
195
+ ---
196
+ title: {service} - {action} {object} {bénéficiaire}
197
+ service: {service}
198
+ role: rule,
199
+ owner: {owner}
200
+ ---\`
201
+
202
+ `;
203
+ const usecaseExtractionPrompt = (file) => `# RÔLE:
204
+ - Tu es un expert en développement de test unitaires avec nodejs et jtest.
205
+ - Tu as développé un RAG avec openai et "hnswlib-node" qui contient toutes les Procédures de l'entreprise Pilet et Renaud SA.
206
+ - Ta mission est de créer une série de tests exhaustifs pour valider que le RAG couvre à 100% le contenu des procédures de l'entreprise.
207
+ - Produire des questions à un coût important, tu dois être efficace, tu dois capturer un maximum de détails ( action, objet, bénéficiaire, contexte) avec un minimum de questions (maximum 4):
208
+ Une question peut concerner l'utilisation précise d'un logiciel ou un article précis de réglementation.
209
+ Chaque question doit satisfaire ces critères: clairement identifier le problème à résoudre ou l'action souhaitée dans le domaine précis du document fourni, doit être spécifique et ne peut pas être ambiguë.
210
+ Tu DOIS supprimer du résultat les questions génériques qui non spécifiques au contexte métier du document.
211
+ Toutes les questions que tu vas créer concernent précisément le document fourni en INPUT ci-dessous.
212
+ - Pour orienter la formulation des questions, je te fournis quelques exemples de questions réelles.
213
+ - En moyenne, chaque question doit être au maximum de 15 mots, mais tu peux en produire aussi des plus courtes (20%) pour élargir le champ des tests.
214
+ - La réponse contient la liste de mots très spécifiques pour chaque section de la procédure séparés par des virgules.
215
+ - Si la réponse concerne un schéma, une procédure ou l'utilisation d'un logiciel, tu dois décrire le besoin spécifique.
216
+
217
+
218
+ # EXEMPLES de formulation utilisées par les collaborateurs l'entreprise (attention à ne pas utiliser ces exemples si le sujet du INPUT´est différent).
219
+ - Écoulement bouché, que faire ?
220
+ - J’ai une fuite depuis le plafond de ma chambre, j’aimerais un sanitaire
221
+ - Mon frigo ne fonctionne pas, pouvez-vous mandater quelqu’un ?
222
+ - Mon store est resté bloqué, pouvez-vous faire quelque chose ?
223
+ - J’aimerais faire reproduire des clés, comment faire ? combien ça coûte ?
224
+ - Je suis fournisseur, ma facture n’est toujours pas payée par Pilet et Renaud.
225
+ - J’ai payé mon loyer, mais j’ai reçu un rappel, pourquoi ?
226
+ - Je paie toujours bien mon loyer, pouvez-vous supprimer les frais de rappel c’est la première fois que j’ai du retard.
227
+ - Est-ce que cet appartement est toujours disponible ? Comment déposer un dossier?
228
+ - Est-ce que mon dossier de candidature est retenu ? j’aimerais des infos.
229
+ - Inscription de korkmaz?
230
+ - J’ai reçu un appel manqué de la régie mais je ne sais pas qui a tenté de me joindre.
231
+ - Un fournisseur me dit que sa facture n’est toujours pas payée par Pilet et Renaud. Comment je vérifie ça?
232
+ - Comment créer un bon ?
233
+ - Quelles sont les tâches à faire après avoir conclu un contrat d’entretien ?
234
+ - Une entreprise souhaite travailler avec nous, que dois-je faire ?
235
+
236
+ # QUESTIONS A EVITER: Les exemples qui ne sont pas pertinents pour le RAG (les documents sont tous concernés par ces questions, c'est donc inutile de les inclure dans les tests).
237
+ - Ce document contient-il des liens externes ?
238
+ - Cette absence de liens affecte-t-elle la validité du document ?
239
+ - Qui doit valider les changements dans la procédure ?
240
+ - Comment valider une modification de procédure ?
241
+
242
+ # DICTIONNAIRE (jargon de l'entreprise):
243
+ - Logiciels Spécifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.
244
+ - SGC: Service de Gestion de la Clientèle
245
+ - GED: service qui gère le scan des documents, la mise sous plis, l’économat, le réassort des salles de pauses, la saisie des données pour orienter les documents dans M-Files
246
+ - MED: Mise en demeure.
247
+ - WC: Toilettes.
248
+ - M-Files: logiciel de gestion de documents
249
+ - PR ou PRSA: Pilet & Renaud SA
250
+ - PPE: Service qui gère les copropriétés.
251
+ - GP: Garantie Bancaire
252
+ - BAL: Boite à Lettre
253
+ - DD: Arrangement de paiement pour facture due mais qui n’est pas du loyer.
254
+ - copro: copropriétaire (attention à ne pas confondre avec gopros)
255
+ - un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, création de bons, bons, etc).
256
+ - La Date à jour Locataire: le dernier mois qui a été payé par le locataire.
257
+
258
+
259
+ # OUTPUT INSTRUCTIONS
260
+ - Tu dois produire un JSON strict avec les champs suivants:
261
+ \`\`\`JSON
262
+ {
263
+ "source": "string",
264
+ "file": "${file}",
265
+ "queries": [{ "question": "string", "answer": "string" }, ...]
266
+ }
267
+ \`\`\`
268
+
269
+ INPUT:
136
270
  `;
271
+ exports.usecaseExtractionPrompt = usecaseExtractionPrompt;
@@ -0,0 +1,103 @@
1
+ import { RAGConfig, RAGMetadata, RAGSearchResult, RAGMapping, ParsedDocument, DocumentQueries } from './types';
2
+ export interface EmbeddingsSearchOptions {
3
+ /** Nombre de voisins à retourner */
4
+ neighbors?: number;
5
+ /** Paramètre ef pour la recherche */
6
+ ef?: number;
7
+ /** Retourner les informations de debug */
8
+ debug?: boolean;
9
+ }
10
+ export declare class Embeddings {
11
+ private config;
12
+ private vectorsFile;
13
+ private space;
14
+ private distance;
15
+ private vectorsIndex;
16
+ private inmemory;
17
+ private debug;
18
+ private metadata;
19
+ private mapping;
20
+ constructor(config: RAGConfig);
21
+ /**
22
+ * Retourne le prochain ID documentaire stable et met à jour metadata.docLastID.
23
+ * Pré-conditions: this.mapping et this.metadata sont chargés.
24
+ */
25
+ getNextID(): number;
26
+ /**
27
+ * Retourne l'ID documentaire pour un fichier. Si non trouvé, attribue un nouvel ID.
28
+ * Stratégie: utiliser le mapping id -> "filename#section-0".
29
+ */
30
+ getOrAssignDocumentID(file: string): number;
31
+ extractAndSaveDocumentUseCases(document: ParsedDocument): Promise<DocumentQueries>;
32
+ /**
33
+ * Charge les documents du RAG
34
+ * IMPORTANT: C'est le document produit pour le RAG, ce n'est pas le document source!
35
+ * @param file Le fichier à charger depuis git
36
+ */
37
+ loadDocumentOnRAG(file: string): Promise<ParsedDocument>;
38
+ /**
39
+ * Charge les use cases d'un document
40
+ * @param document Le document de référence pour le RAG `loadDocumentOnRAG(file)`
41
+ * @returns Les use cases du document
42
+ */
43
+ loadDocumentUseCases(document: ParsedDocument): Promise<DocumentQueries>;
44
+ listDocumentsOnRAG(): Promise<string[]>;
45
+ /**
46
+ * Recherche par similarité dans l'index
47
+ */
48
+ searchKnn(vectors: number[], options?: EmbeddingsSearchOptions): RAGSearchResult;
49
+ /**
50
+ * Recherche sémantique avec OpenAI
51
+ */
52
+ semanticSearch(question: string, options?: EmbeddingsSearchOptions): Promise<RAGSearchResult>;
53
+ /**
54
+ * Obtient les métadonnées du RAG
55
+ * @returns Les métadonnées du RAG
56
+ */
57
+ getMetadata(): RAGMetadata;
58
+ getMapping(): RAGMapping;
59
+ /**
60
+ * Vérifie si l'index est prêt
61
+ */
62
+ isReady(): boolean;
63
+ /**
64
+ * Réinitialise l'index
65
+ */
66
+ resetKnn(): void;
67
+ /**
68
+ * Crée un nouvel index HierarchicalNSW avec documents parsés
69
+ * ou met à jour l'index existant avec de nouveaux documents
70
+ */
71
+ indexFromDocuments(documents: ParsedDocument[], options?: {
72
+ ef?: number;
73
+ m?: number;
74
+ lastCommit?: string;
75
+ branch?: string;
76
+ update?: boolean;
77
+ prepare?: (input: string) => string;
78
+ }): Promise<void>;
79
+ /**
80
+ * Charge l'index HierarchicalNSW existant
81
+ */
82
+ private loadIndex;
83
+ /**
84
+ * Charge les métadonnées du fichier rag-metadata.json
85
+ */
86
+ private loadMetadata;
87
+ /**
88
+ * Charge le mapping des IDs
89
+ */
90
+ private loadMapping;
91
+ /**
92
+ * Sauvegarde les métadonnées dans rag-metadata.json
93
+ */
94
+ private saveMetadata;
95
+ /**
96
+ * Sauvegarde le mapping des IDs
97
+ */
98
+ private saveMapping;
99
+ /**
100
+ * Récupère un vecteur depuis l'index existant (pour les mises à jour)
101
+ */
102
+ private getVectorFromExistingIndex;
103
+ }