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.
- package/README.md +118 -22
- package/dist/src/agents/agents.example.d.ts +3 -0
- package/dist/src/agents/agents.example.js +38 -0
- package/dist/src/agents/authentication.js +2 -0
- package/dist/src/agents/digestor.js +25 -16
- package/dist/src/agents/prompts.d.ts +2 -2
- package/dist/src/agents/prompts.js +112 -49
- package/dist/src/agents/reducer.core.d.ts +12 -0
- package/dist/src/agents/reducer.core.js +207 -0
- package/dist/src/agents/reducer.d.ts +3 -0
- package/dist/src/agents/reducer.example.d.ts +28 -0
- package/dist/src/agents/reducer.example.js +118 -0
- package/dist/src/agents/reducer.js +19 -0
- package/dist/src/agents/reducer.loaders.d.ts +34 -0
- package/dist/src/agents/reducer.loaders.js +122 -0
- package/dist/src/agents/reducer.process.d.ts +16 -0
- package/dist/src/agents/reducer.process.js +143 -0
- package/dist/src/agents/reducer.tools.d.ts +29 -0
- package/dist/src/agents/reducer.tools.js +157 -0
- package/dist/src/agents/reducer.types.d.ts +50 -0
- package/dist/src/agents/reducer.types.js +5 -0
- package/dist/src/agents/simulator.d.ts +47 -0
- package/dist/src/agents/simulator.executor.d.ts +26 -0
- package/dist/src/agents/simulator.executor.js +132 -0
- package/dist/src/agents/simulator.js +205 -0
- package/dist/src/agents/simulator.prompts.d.ts +16 -0
- package/dist/src/agents/simulator.prompts.js +108 -0
- package/dist/src/agents/simulator.types.d.ts +42 -0
- package/dist/src/agents/simulator.types.js +2 -0
- package/dist/src/agents/simulator.utils.d.ts +20 -0
- package/dist/src/agents/simulator.utils.js +87 -0
- package/dist/src/execute.d.ts +14 -7
- package/dist/src/execute.js +359 -84
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.js +14 -0
- package/dist/src/princing.openai.d.ts +9 -2
- package/dist/src/princing.openai.js +16 -11
- package/dist/src/prompts.d.ts +3 -2
- package/dist/src/prompts.js +207 -72
- package/dist/src/rag/embeddings.d.ts +103 -0
- package/dist/src/rag/embeddings.js +466 -0
- package/dist/src/rag/index.d.ts +12 -0
- package/dist/src/rag/index.js +40 -0
- package/dist/src/rag/lucene.d.ts +45 -0
- package/dist/src/rag/lucene.js +227 -0
- package/dist/src/rag/parser.d.ts +68 -0
- package/dist/src/rag/parser.js +192 -0
- package/dist/src/rag/tools.d.ts +76 -0
- package/dist/src/rag/tools.js +196 -0
- package/dist/src/rag/types.d.ts +178 -0
- package/dist/src/rag/types.js +21 -0
- package/dist/src/rag/usecase.d.ts +16 -0
- package/dist/src/rag/usecase.js +79 -0
- package/dist/src/rules/errors.d.ts +60 -0
- package/dist/src/rules/errors.js +97 -0
- package/dist/src/rules/git/git.e2e.helper.d.ts +104 -0
- package/dist/src/rules/git/git.e2e.helper.js +488 -0
- package/dist/src/rules/git/git.health.d.ts +66 -0
- package/dist/src/rules/git/git.health.js +354 -0
- package/dist/src/rules/git/git.helper.d.ts +129 -0
- package/dist/src/rules/git/git.helper.js +53 -0
- package/dist/src/rules/git/index.d.ts +6 -0
- package/dist/src/rules/git/index.js +76 -0
- package/dist/src/rules/git/repo.d.ts +128 -0
- package/dist/src/rules/git/repo.js +900 -0
- package/dist/src/rules/git/repo.pr.d.ts +137 -0
- package/dist/src/rules/git/repo.pr.js +589 -0
- package/dist/src/rules/git/repo.tools.d.ts +134 -0
- package/dist/src/rules/git/repo.tools.js +730 -0
- package/dist/src/rules/index.d.ts +8 -0
- package/dist/src/rules/index.js +25 -0
- package/dist/src/rules/messages.d.ts +17 -0
- package/dist/src/rules/messages.js +21 -0
- package/dist/src/rules/types.ctrl.d.ts +28 -0
- package/dist/src/rules/types.ctrl.js +2 -0
- package/dist/src/rules/types.d.ts +510 -0
- package/dist/src/rules/types.helpers.d.ts +132 -0
- package/dist/src/rules/types.helpers.js +2 -0
- package/dist/src/rules/types.js +33 -0
- package/dist/src/rules/user.mapper.d.ts +61 -0
- package/dist/src/rules/user.mapper.js +160 -0
- package/dist/src/rules/utils/slug.d.ts +22 -0
- package/dist/src/rules/utils/slug.js +35 -0
- package/dist/src/rules/utils.matter.d.ts +66 -0
- package/dist/src/rules/utils.matter.js +208 -0
- package/dist/src/rules/utils.slug.d.ts +22 -0
- package/dist/src/rules/utils.slug.js +35 -0
- package/dist/src/scrapper.d.ts +3 -2
- package/dist/src/scrapper.js +33 -37
- package/dist/src/stategraph/index.d.ts +8 -0
- package/dist/src/stategraph/index.js +21 -0
- package/dist/src/stategraph/stategraph.d.ts +91 -0
- package/dist/src/stategraph/stategraph.js +241 -0
- package/dist/src/stategraph/stategraph.storage.d.ts +41 -0
- package/dist/src/stategraph/stategraph.storage.js +166 -0
- package/dist/src/stategraph/types.d.ts +139 -0
- package/dist/src/stategraph/types.js +19 -0
- package/dist/src/types.d.ts +68 -39
- package/dist/src/types.js +53 -89
- package/dist/src/usecase.d.ts +4 -0
- package/dist/src/usecase.js +44 -0
- package/dist/src/utils.d.ts +12 -5
- package/dist/src/utils.js +30 -13
- 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
|
-
|
|
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(
|
|
44
|
+
function accumulateCost(currentUsage, model, usage) {
|
|
39
45
|
if (!usage) {
|
|
40
46
|
return 0;
|
|
41
47
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
}
|
package/dist/src/prompts.d.ts
CHANGED
|
@@ -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 = "\
|
|
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 `` \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;
|
package/dist/src/prompts.js
CHANGED
|
@@ -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
|
|
33
|
-
- Ton rôle
|
|
34
|
-
- Tu agis comme un moteur de "reader view" capable de construire une version fluide
|
|
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
|
-
-
|
|
42
|
-
-
|
|
43
|
-
- Tu
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
|
84
|
-
-
|
|
85
|
-
|
|
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
|
|
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
|
|
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 n
|
|
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
|
-
|
|
121
|
-
Tu
|
|
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
|
-
|
|
129
|
-
|
|
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
|
-
|
|
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 \`\` à 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
|
+
}
|