agentic-api 2.0.31 → 2.0.314

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 (89) hide show
  1. package/dist/src/agents/agents.example.js +21 -22
  2. package/dist/src/agents/authentication.js +1 -2
  3. package/dist/src/agents/prompts.d.ts +5 -4
  4. package/dist/src/agents/prompts.js +42 -87
  5. package/dist/src/agents/reducer.core.d.ts +24 -2
  6. package/dist/src/agents/reducer.core.js +125 -35
  7. package/dist/src/agents/reducer.loaders.d.ts +55 -1
  8. package/dist/src/agents/reducer.loaders.js +114 -1
  9. package/dist/src/agents/reducer.types.d.ts +45 -2
  10. package/dist/src/agents/semantic.js +1 -2
  11. package/dist/src/agents/simulator.d.ts +4 -0
  12. package/dist/src/agents/simulator.executor.d.ts +5 -1
  13. package/dist/src/agents/simulator.executor.js +41 -9
  14. package/dist/src/agents/simulator.js +86 -28
  15. package/dist/src/agents/simulator.prompts.d.ts +3 -2
  16. package/dist/src/agents/simulator.prompts.js +52 -78
  17. package/dist/src/agents/simulator.types.d.ts +20 -5
  18. package/dist/src/agents/simulator.utils.d.ts +7 -2
  19. package/dist/src/agents/simulator.utils.js +33 -11
  20. package/dist/src/agents/system.js +1 -2
  21. package/dist/src/execute.d.ts +17 -3
  22. package/dist/src/execute.js +156 -158
  23. package/dist/src/index.d.ts +1 -1
  24. package/dist/src/index.js +1 -1
  25. package/dist/src/{princing.openai.d.ts → pricing.llm.d.ts} +6 -0
  26. package/dist/src/pricing.llm.js +234 -0
  27. package/dist/src/prompts.d.ts +13 -4
  28. package/dist/src/prompts.js +221 -114
  29. package/dist/src/rag/embeddings.d.ts +36 -18
  30. package/dist/src/rag/embeddings.js +125 -128
  31. package/dist/src/rag/index.d.ts +5 -5
  32. package/dist/src/rag/index.js +14 -17
  33. package/dist/src/rag/parser.d.ts +2 -1
  34. package/dist/src/rag/parser.js +11 -14
  35. package/dist/src/rag/rag.examples.d.ts +27 -0
  36. package/dist/src/rag/rag.examples.js +151 -0
  37. package/dist/src/rag/rag.manager.d.ts +383 -0
  38. package/dist/src/rag/rag.manager.js +1378 -0
  39. package/dist/src/rag/types.d.ts +128 -12
  40. package/dist/src/rag/types.js +100 -1
  41. package/dist/src/rag/usecase.d.ts +37 -0
  42. package/dist/src/rag/usecase.js +96 -7
  43. package/dist/src/rules/git/git.e2e.helper.js +1 -0
  44. package/dist/src/rules/git/git.health.d.ts +57 -0
  45. package/dist/src/rules/git/git.health.js +281 -1
  46. package/dist/src/rules/git/index.d.ts +2 -2
  47. package/dist/src/rules/git/index.js +12 -1
  48. package/dist/src/rules/git/repo.d.ts +117 -0
  49. package/dist/src/rules/git/repo.js +536 -0
  50. package/dist/src/rules/git/repo.tools.d.ts +22 -1
  51. package/dist/src/rules/git/repo.tools.js +50 -1
  52. package/dist/src/rules/types.d.ts +16 -14
  53. package/dist/src/rules/utils.matter.d.ts +0 -4
  54. package/dist/src/rules/utils.matter.js +26 -7
  55. package/dist/src/scrapper.d.ts +15 -22
  56. package/dist/src/scrapper.js +57 -110
  57. package/dist/src/stategraph/index.d.ts +1 -1
  58. package/dist/src/stategraph/stategraph.d.ts +31 -2
  59. package/dist/src/stategraph/stategraph.js +93 -6
  60. package/dist/src/stategraph/stategraph.storage.js +4 -0
  61. package/dist/src/stategraph/types.d.ts +22 -0
  62. package/dist/src/types.d.ts +4 -2
  63. package/dist/src/types.js +1 -1
  64. package/dist/src/usecase.d.ts +11 -2
  65. package/dist/src/usecase.js +27 -35
  66. package/dist/src/utils.d.ts +32 -18
  67. package/dist/src/utils.js +60 -126
  68. package/package.json +7 -2
  69. package/dist/src/agents/digestor.test.d.ts +0 -1
  70. package/dist/src/agents/digestor.test.js +0 -45
  71. package/dist/src/agents/reducer.example.d.ts +0 -28
  72. package/dist/src/agents/reducer.example.js +0 -118
  73. package/dist/src/agents/reducer.process.d.ts +0 -16
  74. package/dist/src/agents/reducer.process.js +0 -143
  75. package/dist/src/agents/reducer.tools.d.ts +0 -29
  76. package/dist/src/agents/reducer.tools.js +0 -157
  77. package/dist/src/agents/simpleExample.d.ts +0 -3
  78. package/dist/src/agents/simpleExample.js +0 -38
  79. package/dist/src/agents/system-review.d.ts +0 -5
  80. package/dist/src/agents/system-review.js +0 -181
  81. package/dist/src/agents/systemReview.d.ts +0 -4
  82. package/dist/src/agents/systemReview.js +0 -22
  83. package/dist/src/princing.openai.js +0 -54
  84. package/dist/src/rag/tools.d.ts +0 -76
  85. package/dist/src/rag/tools.js +0 -196
  86. package/dist/src/rules/user.mapper.d.ts +0 -61
  87. package/dist/src/rules/user.mapper.js +0 -160
  88. package/dist/src/rules/utils/slug.d.ts +0 -22
  89. package/dist/src/rules/utils/slug.js +0 -35
@@ -1,22 +1,59 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.usecaseExtractionPrompt = exports.htmlToMarkdownPrompt = exports.textToMarkdownPrompt = exports.defaultOutputPrompt = exports.transferAgentPrompt = exports.transferAgentPrompt_ = void 0;
3
+ exports.usecaseExtractionPrompt = exports.usecaseExtractionPrompt_OLD = exports.htmlToMarkdownPrompt = exports.textToMarkdownPrompt = exports.defaultOutputPrompt = exports.transferAgentPromptHandoff = exports.transferAgentPromptStructured = exports.transferAgentPrompt = 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.
7
7
 
8
8
  Let the user know you're about to transfer them before doing so.
9
-
10
- Available Agents:`;
11
- exports.transferAgentPrompt = `
9
+
10
+ Available Agents:`;
11
+ exports.transferAgentPrompt__ = `
12
12
  Triggers a transfer of the user to a specialized agent, for one task.
13
- Only 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__".
13
+ Only call this function if one of the available agents is more appropriate (as destination_agent).
14
14
 
15
15
  ⚠️ Rules:
16
- - NEVER call this function for requests that match your own specialization.
16
+ - NEVER call this function for requests that match your own specialization ("__AGENT_NAME__").
17
+
18
+
19
+ Available Agents:`;
20
+ exports.transferAgentPrompt = `Transfer control to the agent "__AGENT_NAME__".
21
+ This agent is described as: "__AGENT_DESCRIPTION__".
22
+ Use this tool (handoff) when that agent is better suited to handle the user's request.
17
23
 
18
24
 
19
25
  Available Agents:`;
26
+ exports.transferAgentPromptStructured = `
27
+ Cet outil permet de transférer le contrôle vers un agent spécialisé lorsque la demande de l'utilisateur dépasse le périmètre de "__AGENT_NAME__".
28
+
29
+ **QUAND UTILISER :**
30
+ - Si l'Agent détermine que le transfert est nécessaire (confidence >= 0.7) il doit appeler cet outil.
31
+ - L'utilisateur demande explicitement un service hors de votre spécialisation
32
+ - La requête nécessite des outils ou connaissances spécifiques à un autre agent
33
+ - Vous identifiez qu'un agent spécialisé (disponible ci-dessous) est mieux adapté pour répondre
34
+
35
+ **QUAND NE PAS UTILISER :**
36
+ - Votre niveau de confiance (confidence) est inférieur à 0.7
37
+
38
+ Il prend les arguments suivants :
39
+ - rationale_for_transfer (string) : La justification précise expliquant en moins de 10 mots pourquoi ce transfert est nécessaire
40
+ - conversation_context (string) : Le contexte pertinent de la conversation qui aidera l'agent destinataire à effectuer l'action correcte
41
+ - destination_agent (string) : Le nom de l'agent spécialisé qui doit traiter la demande (valeurs possibles listées ci-dessous)
42
+ - confidence (number) : Votre niveau de confiance (0.0 à 1.0) que le transfert vers un agent plus approprié est nécessaire. Minimum requis : 0.7
43
+
44
+ Available Agents:`;
45
+ exports.transferAgentPromptHandoff = `# Contexte général
46
+ Tu fais partie d'un système multi-agents conçu pour faciliter la coordination et l'exécution entre plusieurs agents. Tu utilises deux abstractions principales : **Agents** et **Transferts**.
47
+ Un agent possède des instructions et des outils, et peut, quand c'est approprié, transmettre une conversation à un autre agent avec une autre spécialisation. Les transferts se font en appelant un outil nommée \`transferAgents\`.
48
+ Les transferts entre agents sont gérés automatiquement en arrière-plan ; tu ne dois jamais mentionner ou attirer l'attention sur ces transferts dans ta conversation avec l'utilisateur.
49
+
50
+ ## PROTOCOLE CONTEXT TRAIL \`<context-trail>\`
51
+ TU DOIS consulter le trail avant de prendre une décision pour éviter les répétitions et te coordonner avec les autres agents. Le trail est visible pour toi dans tes instructions système pour:
52
+ - Détecter les boucles et ne pas les reproduire (action déjà faite → surtout ne pas répéter)
53
+ - Comprendre les étapes et ce qui reste
54
+ - Prévention du drift (maintenir l'alignement à l'objectif)
55
+
56
+ `;
20
57
  exports.defaultOutputPrompt = `
21
58
  # OUTPUT INSTRUCTIONS
22
59
  - Only output CoT and Markdown.
@@ -116,7 +153,6 @@ exports.htmlToMarkdownPrompt = `
116
153
  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
154
  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.
118
155
 
119
-
120
156
  **But :**
121
157
  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).
122
158
 
@@ -129,140 +165,211 @@ Structurer le contenu pour qu’il soit immédiatement lisible dans n’importe
129
165
  * blocs de citation \`>\` si nécessaire
130
166
  * tableaux au format pipe \`| Col 1 | Col 2 |\`
131
167
  * emphase \`*italique*\` et \`**gras**\`
132
- * Frontmatter YAML \`---\n ...\n---\n\` pour les métadonnées.
168
+ * Front-matter YAML \`---\n ...\n---\n\` pour les métadonnées.
133
169
  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.
170
+ 5. Si le service n’est pas déduit du texte, laisser \`service: unknown\`.
171
+ 6. **Les tableaux doivent être détectés et normalisés selon les “Règles de TABLE Markdown” ci-dessous (pas de copie brute ligne par ligne).**
136
172
 
173
+ Remplir automatiquement le champ \`title\` sous la forme \`{service} - {action} {object} {bénéficiaire}\` en minuscules **uniquement si ces éléments sont clairement inférés** ; sinon, utiliser le premier \`# Titre\` du document. Ne jamais écrire “unknown” dans \`title\`.
137
174
 
138
- Remplir automatiquement le champ title sous la forme "{service} - {action} {object} {bénéficiaire}" en minuscules.
175
+ ---
139
176
 
140
- **Heuristique de structuration :**
177
+ ### Heuristique de structuration
141
178
  1. **Détection des titres**
142
- * Ligne en MAJUSCULES → \`## Titre 2\`
143
- * Ligne qui finit par « : » → \`### Titre 3\`
179
+ * Ligne en MAJUSCULES → \`##\`
180
+ * Ligne qui finit par « : » → \`###\`
144
181
  * Saut de ligne double + mot initial capitalisé → \`##\` si > 3 mots sinon \`###\`.
145
-
146
182
  2. **Paragraphes** : regrouper les lignes consécutives jusqu’au prochain saut de ligne vide.
147
-
148
183
  3. **Listes**
149
- * Trouver les puces d’origine (\`•\`, \`-\`, \`*\`, chiffres suivis de \`)\` ou \`.\`) et convertir.
184
+ * Convertir les puces d’origine (\`•\`, \`-\`, \`*\`, chiffres suivis de \`)\` ou \`.\`).
150
185
  * Conserver l’imbrication (quatre espaces par niveau).
151
186
 
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"
187
+ ---
188
+
189
+ ### Règles de TABLE Markdown (génériques, robustes)
190
+ 1. **Détection d’un bloc tableau** : séquence de ≥3 lignes présentant un alignement régulier (espaces/tabs), des séparateurs récurrents, OU une première colonne contenant des *identifiants plausibles* (ex. codes, IDs, sigles).
191
+ 2. **Colonnes** : inférer le nombre de colonnes en analysant la majorité des lignes. Normaliser toutes les lignes à ce nombre (remplir les cellules manquantes par vide).
192
+ 3. **En-tête** :
193
+ - Si une première ligne contient des libellés de colonnes utiliser comme \`header\`.
194
+ - Sinon, générer un en-tête minimal et neutre (\`Col 1\`, \`Col 2\`, …) ou, si identifié, des noms génériques (\`Identifiant\`, \`Libellé\`, \`Commentaire\`).
195
+ 4. **Fusion de lignes cassées** : joindre aux cellules la/les lignes qui suivent quand elles sont des continuations (indentation, absence de séparateur, hyphénation en fin de ligne) pour éviter de créer de fausses lignes.
196
+ 5. **En-têtes visuels (catégories)** : lignes isolées sans séparateurs ni motif tabulaire, servant d’intertitre (ex. catégories, sections) → les rendre en \`###\` au-dessus du tableau ou entre deux tableaux, **pas** comme des lignes de données.
197
+ 6. **Identifiants / codes** : détecter les *tokens* de type ID (lettres/chiffres/points/traits). Si présents en première colonne, **ne pas trier** ; **préserver l’ordre d’origine du PDF**.
198
+ 7. **Séparation multi-tableaux** : démarrer un nouveau tableau lorsque le schéma de colonnes change, lorsqu’un intertitre visuel survient, ou après un blanc significatif.
199
+ 8. **Nettoyage des cellules** : trim, consolidation des espaces multiples, échapper \`|\` par \`\|\`, conserver les signes et abréviations.
200
+ 9. **Références croisées non listées** : si des identifiants sont mentionnés dans une cellule (ex. “utiliser le 123456”) mais n’apparaissent pas comme ligne dédiée, **ne pas les inventer** dans le tableau ; à la place, ajouter après le tableau une section \`#### Références croisées non listées\` avec une liste \`- 123456 : contexte (extrait bref)\` si utile.
201
+ 10. **Validation post-génération** :
202
+ - Chaque tableau doit avoir ≥2 colonnes et ≥2 lignes de données.
203
+ - Vérifier la cohérence (pas de décalage de colonnes, pas de titre de catégorie dans les lignes).
204
+ - Si la structure reste ambigüe, préférer une **liste structurée** plutôt qu’un tableau incorrect.
181
205
 
182
206
  ---
183
207
 
184
- ### Format d’entrée attendu
208
+ ### Spécifique à l'entreprise
209
+ - Les informations véritablement critiques peuvent être signalées avec \`⚠️\` et \`**gras**\`, sans réécrire le fond.
210
+ - Mentionner par inférence le \`service\` **uniquement dans le front-matter** ; le corps doit rester fidèle à la source.
211
+ - Ne pas promouvoir des intertitres visuels en alertes \`⚠️\`.
185
212
 
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.
213
+ ---
190
214
 
191
- *(Prends le temps nécessaire et vérifie ta sortie avant de répondre.)*
215
+ ### Éléments hors-texte
216
+ - **Images** : \`![Img page-X-Y](IMAGE_PLACEHOLDER_X_Y)\` (une ligne par image, à l’emplacement d’origine).
217
+ - **Notes de bas de page** : convertir en liens \`[^n]\` et regrouper à la fin sous \`## Notes\`.
192
218
 
193
- MATTER : format du matter à ajouter dans l'entête du markdown.
194
- \`
195
219
  ---
196
- title: {service} - {action} {object} {bénéficiaire}
197
- service: {service}
198
- role: rule,
220
+
221
+ ### Nettoyage final
222
+ - Supprimer en-têtes/pieds de page répétés (même séquence sur ≥ 3 pages).
223
+ - Réduire les blancs multiples à un seul.
224
+ - Conserver un seul saut de ligne vide entre blocs.
225
+ - Supprimer les sections de revue automatique (ex. “rapport de révision…”) quand détectables.
226
+
227
+ ---
228
+
229
+ ### Format d’entrée attendu
230
+ **Procédure :**
231
+ 1. Lire attentivement le bloc \`<<PDF_TEXT>>\`.
232
+ 2. Appliquer les heuristiques ci-dessus, étape par étape (raisonnement interne, ne pas afficher).
233
+ 3. Produire un **front-matter** puis le **Markdown final brut**, sans délimiteurs et sans commentaires.
234
+
235
+ **Front-matter (YAML) à produire :**
236
+ ---
237
+ title: {service} - {action} {object} {bénéficiaire} # en minuscules si inférés, sinon premier H1
238
+ service: {service} # "unknown" si non déduit
239
+ role: rule
199
240
  owner: {owner}
200
- ---\`
241
+ ---
242
+
201
243
 
202
244
  `;
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.
245
+ const usecaseExtractionPrompt_OLD = (file) => `# RÔLE:
246
+ - Tu es un expert en développement de test unitaires avec nodejs et jtest.
247
+ - Tu as développé un RAG avec openai et "hnswlib-node" qui contient toutes les Procédures de l'entreprise Pilet & Renaud SA.
248
+ - 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.
249
+ - 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):
250
+ Une question peut concerner l'utilisation précise d'un logiciel ou un article précis de réglementation.
251
+ 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ë.
252
+ Tu DOIS supprimer du résultat les questions génériques qui non spécifiques au contexte métier du document.
253
+ Toutes les questions que tu vas créer concernent précisément le document fourni en INPUT ci-dessous.
254
+ - Pour orienter la formulation des questions, je te fournis quelques exemples de questions réelles.
255
+ - 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.
256
+ - 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.
257
+ - 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.
258
+
259
+
260
+ # EXEMPLES de formulation utilisées par les collaborateurs l'entreprise (attention à ne pas utiliser ces exemples si le sujet du INPUT´est différent).
261
+ - Écoulement bouché, que faire ?
262
+ - J’ai une fuite depuis le plafond de ma chambre, j’aimerais un sanitaire
263
+ - Mon frigo ne fonctionne pas, pouvez-vous mandater quelqu’un ?
264
+ - Mon store est resté bloqué, pouvez-vous faire quelque chose ?
265
+ - J’aimerais faire reproduire des clés, comment faire ? combien ça coûte ?
266
+ - Je suis fournisseur, ma facture n’est toujours pas payée par Pilet & Renaud.
267
+ - J’ai payé mon loyer, mais j’ai reçu un rappel, pourquoi ?
268
+ - Je paie toujours bien mon loyer, pouvez-vous supprimer les frais de rappel c’est la première fois que j’ai du retard.
269
+ - Est-ce que cet appartement est toujours disponible ? Comment déposer un dossier?
270
+ - Est-ce que mon dossier de candidature est retenu ? j’aimerais des infos.
271
+ - Inscription de korkmaz?
272
+ - J’ai reçu un appel manqué de la régie mais je ne sais pas qui a tenté de me joindre.
273
+ - Un fournisseur me dit que sa facture n’est toujours pas payée par Pilet & Renaud. Comment je vérifie ça?
274
+ - Comment créer un bon ?
275
+ - Quelles sont les tâches à faire après avoir conclu un contrat d’entretien ?
276
+ - Une entreprise souhaite travailler avec nous, que dois-je faire ?
277
+
278
+ # 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).
279
+ - Ce document contient-il des liens externes ?
280
+ - Cette absence de liens affecte-t-elle la validité du document ?
281
+ - Qui doit valider les changements dans la procédure ?
282
+ - Comment valider une modification de procédure ?
283
+
284
+ # DICTIONNAIRE (jargon de l'entreprise):
285
+ - Logiciels Spécifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.
286
+ - SGC: Service de Gestion de la Clientèle
287
+ - 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
288
+ - MED: Mise en demeure.
289
+ - WC: Toilettes.
290
+ - M-Files: logiciel de gestion de documents
291
+ - PR ou PRSA: Pilet & Renaud SA
292
+ - PPE: Service qui gère les copropriétés.
293
+ - GP: Garantie Bancaire
294
+ - BAL: Boite à Lettre
295
+ - DD: Arrangement de paiement pour facture due mais qui n’est pas du loyer.
296
+ - copro: copropriétaire (attention à ne pas confondre avec gopros)
297
+ - un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, création de bons, bons, etc).
298
+ - La Date à jour Locataire: le dernier mois qui a été payé par le locataire.
299
+
300
+
301
+ # OUTPUT INSTRUCTIONS
302
+ - Tu dois produire un JSON strict avec les champs suivants:
303
+ \`\`\`JSON
304
+ {
305
+ "source": "string",
306
+ "file": "${file}",
307
+ "queries": [{ "question": "string" }, ...]
308
+ }
309
+ \`\`\`
310
+
311
+ INPUT:
312
+ `;
313
+ exports.usecaseExtractionPrompt_OLD = usecaseExtractionPrompt_OLD;
314
+ const usecaseExtractionPrompt = (file, options = {}) => `# RÔLE:
315
+ - Tu es un expert en tests unitaires.
316
+ - Le corpus de procédures est indexé (RAG).
317
+ - Tu adoptes le point de vue de l'utilisateur (un collègue interne qui pose une question métier précise à son voisin).
318
+ - Tu génères des **questions discriminantes** testant la **couverture RAG** d’une procédure ou marche à suivre.
319
+
320
+ # Structure du document en INPUT pour l'extraction des use cases
321
+ - **Titre principal** → unique dans le corpus (très important).
322
+ - **Intervenants** → Acteur(s) et Bénéficiaire(s) (distincts) de la procédure.
323
+ - **Sections** → Titre unique dans la procédure (très important).
324
+ - **ÉTAPES / ACTIONS** → action/règle/décision importante
325
+ - **RÉSULTAT** → finalité/effet attendu
326
+ - **UI/PATH** → chemin/interface (Système > Module > Action)
327
+
328
+
329
+ # MISSION
330
+ - Créer des **questions ultra-spécifiques** au document **INPUT** pour vérifier la couverture des **objectifs métiers**.
331
+ - Chaque question = **un use-case précis**, **une seule section** (objectif, contexte, bénéficiaire, résultat).
332
+ - Questions **courtes, concrètes, vérifiables** (≈12–18 mots; déroger si nécessaire pour l’exactitude).
333
+ - Efficience : **min. 1** question par section, **max. 6** au total.
334
+ - Une section = **un cas d’usage** spécifique (sans ambiguïté).
335
+ - Une question peut viser un logiciel, un **raccourci** clavier, un acronyme, une étiquette, un montant, ou une règle juridique.
336
+ - Critères : problème/action précis, contexte métier clair, non ambigu.
337
+ - **Ne produis pas** de questions hors objectif du document.
338
+ - Tout porte **strictement** sur le document fourni en INPUT.
339
+
340
+ # FORMAT DES QUESTIONS (obligatoire)
341
+ - Gabarit (au choix), rédigé **depuis l'utilisateur** :
342
+ - « En tant que [rôle dans la procédure], comment [action] dans [Système > Chemin] pour [résultat] ? »
343
+ - « Je dois [action] dans [Système > Chemin] : quel [champ/étiquette] renseigner pour [cas] ? »
344
+ - « Pour [objectif], où [créer/valider/envoyer] dans [Système > Chemin] et avec quel libellé ? »
345
+ - « Mon lavabo de salle de bain est bouché: l'eau s'évacue très lentement et remonte»
346
+
347
+ ## STYLE (strict)
348
+ - Formuler en langage naturel, **sans aucun préfixe/label** au début.
349
+ - Démarrer par « En tant que… », « Je dois… » ou « Pour… » (puis la question).
350
+
351
+
352
+ # ❌ Interdictions Absolues
353
+ - Préfixes/labels **méta** dans la question : « Section », « ÉTAPE(S) », « RÉSULTAT », « UI/PATH », « Tag », « Validation: ».
354
+ - Questions vagues/génériques/méta (ex. “Quel système reçoit la demande ?”, “Dans quel contexte s’applique-t-elle ?”).
355
+ - Questions n’identifiant pas clairement le **use-case** ou le **bénéficiaire**.
356
+
357
+ # EXEMPLES À ÉVITER
358
+ - « Dans quel contexte la procédure s’applique-t-elle ? »
359
+ - « Ce document contient-il des liens externes ? »
360
+ - « Combien de sections contient la procédure ? »
361
+ - « À quelle adresse e-mail est envoyée la notification ? » *(si le contexte métier n’est pas défini)*
362
+ - « Que faire si la demande est incomplète ? » *(sans préciser procédure, système, rôle, champ)*
363
+
364
+ ${options.extended}
257
365
 
258
366
 
259
367
  # OUTPUT INSTRUCTIONS
260
368
  - Tu dois produire un JSON strict avec les champs suivants:
261
369
  \`\`\`JSON
262
370
  {
263
- "source": "string",
264
371
  "file": "${file}",
265
- "queries": [{ "question": "string", "answer": "string" }, ...]
372
+ "queries": [{ "question": "string" }, ...]
266
373
  }
267
374
  \`\`\`
268
375
 
@@ -1,4 +1,4 @@
1
- import { RAGConfig, RAGMetadata, RAGSearchResult, RAGMapping, ParsedDocument, DocumentQueries } from './types';
1
+ import { RAGConfig, RAGMetadata, RAGSearchResult, RAGMapping, ParsedDocument, DocumentQueries, IndexBuildResult } from './types';
2
2
  export interface EmbeddingsSearchOptions {
3
3
  /** Nombre de voisins à retourner */
4
4
  neighbors?: number;
@@ -19,15 +19,13 @@ export declare class Embeddings {
19
19
  private mapping;
20
20
  constructor(config: RAGConfig);
21
21
  /**
22
- * Retourne le prochain ID documentaire stable et met à jour metadata.docLastID.
23
- * Pré-conditions: this.mapping et this.metadata sont chargés.
22
+ * Extrait et sauvegarde les use cases d'un document
23
+ * Utilise la fonction standalone pour la compatibilité
24
+ *
25
+ * @param document Document parsé
26
+ * @returns Les queries extraites avec leur coût
27
+ * @deprecated Utiliser extractAndSaveDocumentUseCases de usecase.ts directement
24
28
  */
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
29
  extractAndSaveDocumentUseCases(document: ParsedDocument): Promise<DocumentQueries>;
32
30
  /**
33
31
  * Charge les documents du RAG
@@ -60,6 +58,28 @@ export declare class Embeddings {
60
58
  * Vérifie si l'index est prêt
61
59
  */
62
60
  isReady(): boolean;
61
+ /**
62
+ * Met à jour l'embedding avec une nouvelle configuration
63
+ * Recharge l'index, les métadonnées et le mapping depuis les nouveaux fichiers
64
+ *
65
+ * Cette méthode est appelée par RAGManager.notifyUpdate() quand un RAG est modifié
66
+ *
67
+ * FIXME: Gérer le cas où l'embedding est en cours d'exécution (recherche/indexation)
68
+ * Actuellement, l'update est appliqué immédiatement sans vérifier si l'embedding est busy.
69
+ * Solutions possibles:
70
+ * - Ajouter un flag `isBusy` pour bloquer les updates pendant une recherche
71
+ * - Implémenter une queue d'updates avec retry
72
+ * - Utiliser un système de locks/mutex
73
+ *
74
+ * @param newConfig Nouvelle configuration RAG
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * // Appelé automatiquement par RAGManager après un build ou rename
79
+ * embedding.update(newConfig);
80
+ * ```
81
+ */
82
+ update(newConfig: RAGConfig): void;
63
83
  /**
64
84
  * Réinitialise l'index
65
85
  */
@@ -67,6 +87,12 @@ export declare class Embeddings {
67
87
  /**
68
88
  * Crée un nouvel index HierarchicalNSW avec documents parsés
69
89
  * ou met à jour l'index existant avec de nouveaux documents
90
+ *
91
+ * @returns IndexBuildResult contenant les données nécessaires pour créer les métadonnées RAG
92
+ *
93
+ * Note: Cette méthode ne sauvegarde plus les métadonnées directement.
94
+ * RAGManager est responsable de créer et sauvegarder les métadonnées
95
+ * à partir du résultat retourné.
70
96
  */
71
97
  indexFromDocuments(documents: ParsedDocument[], options?: {
72
98
  ef?: number;
@@ -75,7 +101,7 @@ export declare class Embeddings {
75
101
  branch?: string;
76
102
  update?: boolean;
77
103
  prepare?: (input: string) => string;
78
- }): Promise<void>;
104
+ }): Promise<IndexBuildResult>;
79
105
  /**
80
106
  * Charge l'index HierarchicalNSW existant
81
107
  */
@@ -88,14 +114,6 @@ export declare class Embeddings {
88
114
  * Charge le mapping des IDs
89
115
  */
90
116
  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
117
  /**
100
118
  * Récupère un vecteur depuis l'index existant (pour les mises à jour)
101
119
  */