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.
- package/dist/src/agents/agents.example.js +21 -22
- package/dist/src/agents/authentication.js +1 -2
- package/dist/src/agents/prompts.d.ts +5 -4
- package/dist/src/agents/prompts.js +42 -87
- package/dist/src/agents/reducer.core.d.ts +24 -2
- package/dist/src/agents/reducer.core.js +125 -35
- package/dist/src/agents/reducer.loaders.d.ts +55 -1
- package/dist/src/agents/reducer.loaders.js +114 -1
- package/dist/src/agents/reducer.types.d.ts +45 -2
- package/dist/src/agents/semantic.js +1 -2
- package/dist/src/agents/simulator.d.ts +4 -0
- package/dist/src/agents/simulator.executor.d.ts +5 -1
- package/dist/src/agents/simulator.executor.js +41 -9
- package/dist/src/agents/simulator.js +86 -28
- package/dist/src/agents/simulator.prompts.d.ts +3 -2
- package/dist/src/agents/simulator.prompts.js +52 -78
- package/dist/src/agents/simulator.types.d.ts +20 -5
- package/dist/src/agents/simulator.utils.d.ts +7 -2
- package/dist/src/agents/simulator.utils.js +33 -11
- package/dist/src/agents/system.js +1 -2
- package/dist/src/execute.d.ts +17 -3
- package/dist/src/execute.js +156 -158
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/{princing.openai.d.ts → pricing.llm.d.ts} +6 -0
- package/dist/src/pricing.llm.js +234 -0
- package/dist/src/prompts.d.ts +13 -4
- package/dist/src/prompts.js +221 -114
- package/dist/src/rag/embeddings.d.ts +36 -18
- package/dist/src/rag/embeddings.js +125 -128
- package/dist/src/rag/index.d.ts +5 -5
- package/dist/src/rag/index.js +14 -17
- package/dist/src/rag/parser.d.ts +2 -1
- package/dist/src/rag/parser.js +11 -14
- package/dist/src/rag/rag.examples.d.ts +27 -0
- package/dist/src/rag/rag.examples.js +151 -0
- package/dist/src/rag/rag.manager.d.ts +383 -0
- package/dist/src/rag/rag.manager.js +1378 -0
- package/dist/src/rag/types.d.ts +128 -12
- package/dist/src/rag/types.js +100 -1
- package/dist/src/rag/usecase.d.ts +37 -0
- package/dist/src/rag/usecase.js +96 -7
- package/dist/src/rules/git/git.e2e.helper.js +1 -0
- package/dist/src/rules/git/git.health.d.ts +57 -0
- package/dist/src/rules/git/git.health.js +281 -1
- package/dist/src/rules/git/index.d.ts +2 -2
- package/dist/src/rules/git/index.js +12 -1
- package/dist/src/rules/git/repo.d.ts +117 -0
- package/dist/src/rules/git/repo.js +536 -0
- package/dist/src/rules/git/repo.tools.d.ts +22 -1
- package/dist/src/rules/git/repo.tools.js +50 -1
- package/dist/src/rules/types.d.ts +16 -14
- package/dist/src/rules/utils.matter.d.ts +0 -4
- package/dist/src/rules/utils.matter.js +26 -7
- package/dist/src/scrapper.d.ts +15 -22
- package/dist/src/scrapper.js +57 -110
- package/dist/src/stategraph/index.d.ts +1 -1
- package/dist/src/stategraph/stategraph.d.ts +31 -2
- package/dist/src/stategraph/stategraph.js +93 -6
- package/dist/src/stategraph/stategraph.storage.js +4 -0
- package/dist/src/stategraph/types.d.ts +22 -0
- package/dist/src/types.d.ts +4 -2
- package/dist/src/types.js +1 -1
- package/dist/src/usecase.d.ts +11 -2
- package/dist/src/usecase.js +27 -35
- package/dist/src/utils.d.ts +32 -18
- package/dist/src/utils.js +60 -126
- package/package.json +7 -2
- package/dist/src/agents/digestor.test.d.ts +0 -1
- package/dist/src/agents/digestor.test.js +0 -45
- package/dist/src/agents/reducer.example.d.ts +0 -28
- package/dist/src/agents/reducer.example.js +0 -118
- package/dist/src/agents/reducer.process.d.ts +0 -16
- package/dist/src/agents/reducer.process.js +0 -143
- package/dist/src/agents/reducer.tools.d.ts +0 -29
- package/dist/src/agents/reducer.tools.js +0 -157
- package/dist/src/agents/simpleExample.d.ts +0 -3
- package/dist/src/agents/simpleExample.js +0 -38
- package/dist/src/agents/system-review.d.ts +0 -5
- package/dist/src/agents/system-review.js +0 -181
- package/dist/src/agents/systemReview.d.ts +0 -4
- package/dist/src/agents/systemReview.js +0 -22
- package/dist/src/princing.openai.js +0 -54
- package/dist/src/rag/tools.d.ts +0 -76
- package/dist/src/rag/tools.js +0 -196
- package/dist/src/rules/user.mapper.d.ts +0 -61
- package/dist/src/rules/user.mapper.js +0 -160
- package/dist/src/rules/utils/slug.d.ts +0 -22
- package/dist/src/rules/utils/slug.js +0 -35
package/dist/src/prompts.js
CHANGED
|
@@ -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.
|
|
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).
|
|
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
|
-
* Front
|
|
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.
|
|
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
|
-
|
|
175
|
+
---
|
|
139
176
|
|
|
140
|
-
|
|
177
|
+
### Heuristique de structuration
|
|
141
178
|
1. **Détection des titres**
|
|
142
|
-
* Ligne en MAJUSCULES →
|
|
143
|
-
* Ligne qui finit par « : » →
|
|
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
|
-
*
|
|
184
|
+
* Convertir les puces d’origine (\`•\`, \`-\`, \`*\`, chiffres suivis de \`)\` ou \`.\`).
|
|
150
185
|
* Conserver l’imbrication (quatre espaces par niveau).
|
|
151
186
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
-
|
|
168
|
-
-
|
|
169
|
-
-
|
|
170
|
-
- MyAbacus: logiciel pour les ressources humaines.
|
|
171
|
-
|
|
172
|
-
6. **Éléments hors-texte**
|
|
173
|
-
* Images : placer \`\` à 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
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
215
|
+
### Éléments hors-texte
|
|
216
|
+
- **Images** : \`\` (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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
|
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
|
|
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"
|
|
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
|
-
*
|
|
23
|
-
*
|
|
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<
|
|
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
|
*/
|