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,181 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.systemReview = exports.systemReviewPrompt = void 0;
4
- const execute_1 = require("../execute");
5
- const utils_1 = require("../utils");
6
- const promptMarkdown = `# RÔLE:
7
- - Tu es un expert en développement de test unitaires avec nodejs et jtest.
8
- - Tu as développé un RAG avec openai et "hnswlib-node" qui contient toutes les Procédures de l'entreprise Pilet-Renaud SA.
9
- - 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.
10
- - Produire des questions à un coût important, tu dois être efficace, tu dois capturer un maximum de détails (sujet, relation, objet) avec un minimum de questions (maximum 4).
11
- - Toutes les questions que tu vas créer concernent précisément le INPUT fournit ci-dessous.
12
- - Pour orienter la formulation des questions, je te fournis quelques exemples de questions réelles.
13
- - Chaque question doit satisfaire ces critères: clairement identifier le problème à résoudre ou l'action souhaitée dans un domaine précis, doit être spécifique et ne peut pas être ambiguë.
14
- - 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.
15
- - La réponse contient la liste de mots très spécifiques à la procédure séparés par des virgules.
16
- - Si la réponse concerne un schéma, une procédure ou l'utilisation d'un logiciel, tu dois décrire la procédure précisément.
17
-
18
-
19
- # EXEMPLES de formulation utilisées par les collaborateurs l'entreprise (attention à ne pas utiliser ces exemples si le sujet du INPUT´est différent).
20
- - Écoulement bouché, que faire ?
21
- - J’ai une fuite depuis le plafond de ma chambre, j’aimerais un sanitaire
22
- - Mon frigo ne fonctionne pas, pouvez-vous mandater quelqu’un ?
23
- - Mon store est resté bloqué, pouvez-vous faire quelque chose ?
24
- - J’aimerais faire reproduire des clés, comment faire ? combien ça coûte ?
25
- - Je suis fournisseur, ma facture n’est toujours pas payée par Pilet et Renaud.
26
- - J’ai payé mon loyer, mais j’ai reçu un rappel, pourquoi ?
27
- - Je paie toujours bien mon loyer, pouvez-vous supprimer les frais de rappel c’est la première fois que j’ai du retard.
28
- - Est-ce que cet appartement est toujours disponible ? Comment déposer un dossier?
29
- - Est-ce que mon dossier de candidature est retenu ? j’aimerais des infos.
30
- - Inscription de korkmaz?
31
- - J’ai reçu un appel manqué de la régie mais je ne sais pas qui a tenté de me joindre.
32
- - Un fournisseur me dit que sa facture n’est toujours pas payée par Pilet et Renaud. Comment je vérifie ça?
33
- - Comment créer un bon ?
34
- - Quelles sont les tâches à faire après avoir conclu un contrat d’entretien ?
35
- - Une entreprise souhaite travailler avec nous, que dois-je faire ?
36
-
37
- # 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).
38
- - Ce document contient-il des liens externes ?
39
- - Cette absence de liens affecte-t-elle la validité du document ?
40
- - Qui doit valider les changements dans la procédure ?
41
- - Comment valider une modification de procédure ?
42
-
43
- # DICTIONNAIRE (jargon de l'entreprise):
44
- - Logiciels Spécifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.
45
- - SGC: Service de Gestion de la Clientèle
46
- - 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
47
- - MED: Mise en demeure.
48
- - WC: Toilettes.
49
- - M-Files: logiciel de gestion de documents
50
- - PR ou PRSA: Pilet-Renaud SA
51
- - PPE: Service qui gère les copropriétés.
52
- - GP: Garantie Bancaire
53
- - BAL: Boite à Lettre
54
- - DD: Arrangement de paiement pour facture due mais qui n’est pas du loyer.
55
- - copro: copropriétaire (attention à ne pas confondre avec gopros)
56
- - un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, création de bons, bons, etc).
57
- - La Date à jour Locataire: le dernier mois qui a été payé par le locataire.
58
-
59
-
60
- # OUTPUT INSTRUCTIONS
61
- - Tu dois produire un JSON strict avec les champs suivants:
62
- \`\`\`JSON
63
- source: "string",
64
- file: "_file_",
65
- queries:[{ "question": "string","answer": "string"}, ...]
66
- \`\`\`
67
-
68
-
69
- INPUT:
70
- `;
71
- //
72
- // 1. role & identity
73
- // 2. scope
74
- // 3. logic (toute directive doit correspondre à une logique conditionnelle claire)
75
- // 4. ambiguity (La directive doit déboucher sur une action ou une absence d’action, sans zone grise)
76
- // 5. Interdiction
77
- // 6. output (L’agent sait-il comment formuler sa réponse)
78
- // 😩 Il lit la demande de haïku, voit qu’il doit "appeler un agent spécialisé" et pense que ce n’est pas lui.
79
- exports.systemReviewPrompt = `
80
- # PROMPT D’ANALYSE — Audit de directives LLM d'un prompt système
81
-
82
- ## RÔLE :
83
- Assume le rôle d’un expert spécialisé dans l’analyse, la formalisation et l’évaluation des directives d’un prompt système d’un Agent LLM.
84
- On te donnera des problèmes difficiles à résoudre, qui nécessiteront plusieurs techniques principales pour les résoudre, comme l'analyse statistique, la logique, ainsi que certaines techniques métacognitives que tu pourras employer.
85
-
86
- ## MISSION :
87
- L'utilisateur a créé un prompt système qui contient une liste de directives (instructions) pour un Agent LLM spécialisé.
88
- Tu dois en avoir une connaissance exhaustive et approfondie, les lire ligne par ligne et les garder en mémoire.
89
-
90
- Ta mission est de les évaluer individuellement selon les 9 critères mentionnés ci-dessous.
91
- Tu dois juger leur pertinence, leur clarté, leur alignement avec le rôle de l’agent, et leur contribution à l’objectif global.
92
-
93
- ## TÂCHES :
94
- Tu dois avoir une connaissance exhaustive et approfondie de toutes les directives :
95
- - Une directive est décrite avec des phrases sur une ligne.
96
- - Tu dois suivre la structure qui organise les directives par sections pour résoudre un objectif précis de l'agent.
97
- - Dans Tu dois évaluer chaque directive individuellement selon les 9 critères ci-dessous.
98
- - Tu dois comparer la directive au rôle global de l’agent et de la section pour détecter sa complémentarité et son écart.
99
- - Tu dois extraire le chevauchement ou les incohérences par rapport aux autres directives.
100
- - Tu dois identifier les cas de redondance et d'indécisions que cela peut créer.
101
- - Tu dois produire et conserver en mémoire un schéma du "graph" complet de chaque directive et des critères d'évaluation dont le score est inférieur à 0.9.
102
-
103
- ## CHAÎNE DE RAISONNEMENT (CoT) :
104
-
105
- Tu dois appliquer une démarche par raisonnement étape par étape :
106
- - Encadre ton raisonnement dans une balise \`<thinking>...</thinking>\`.
107
- - Utilise des balises \`<step>\` pour chaque étape de réflexion.
108
- - Reste succinct dans les étapes.
109
- - Ajuste ton raisonnement si tu détectes une incohérence ou un doute.
110
-
111
-
112
- ## CRITÈRES D’ANALYSE
113
-
114
- 1. **Identité** : La directive reflète-t-elle le rôle de la section actuelle ?
115
- 2. **Périmètre** : Complète-t-elle clairement le domaine de la section actuelle, est-elle utile ?
116
- 3. **Décision** : Y a-t-il une condition explicite du type “SI… ALORS…”, si oui est-elle correctement formulée ?
117
- 4. **Exécution** : L’agent peut-il agir sans hésitation (une autre directive peut-elle contredire la directive en cours) ?
118
- 5. **Interdiction** : Empêche-t-elle les comportements vagues, hors sujet ou parasites ?
119
- 7. **Robustesse** : Faut-il prévoir des cas limites ?
120
- 8. **Redondance (ou contradiction)** : Y a-t-il une redondance ou une contradiction avec une autre directive qui pourrait créer un biais d'interprétation ?
121
- 9. **Simplification** : Pourrait-elle être reformulée sans perte ?
122
-
123
-
124
- ## OUTPUT ATTENDU
125
- - Tu dois produire un **Rapport exhaustif de toutes les directives avec leurs critères**, les scores et les commentaires
126
- - ATTENTION seuls les critères avec un scores <= 0.9 intéressent l'utilisateur et doivent être affichées.
127
-
128
- `;
129
- const systemReviewStructurePrompt = `
130
- ## 🔍 ANALYSE STRUCTURELLE (multi-directive)
131
-
132
- Après l’analyse individuelle, tu dois effectuer une lecture croisée pour détecter :
133
-
134
- 1. **Branches Décisionnelles implicites ou explicites**
135
- - Existe-t-il des directives contenant des conditions ?
136
- - Sont-elles formulées de manière claire et non ambiguë ?
137
- - Manque-t-il des transitions, cas d’erreur, ou cas particuliers ?
138
-
139
- 2. **Unknown Decision Branches**
140
- - Génère des branches hypothétiques en cas de flou (par ex. : "Que se passe-t-il si l’utilisateur demande X alors que ce n’est pas prévu ?").
141
-
142
- 3. **Pruning des Chemins Invalides**
143
- - Supprime les branches logiques incohérentes ou contradictoires.
144
- - Signale les directives qui se contredisent ou génèrent des conflits de rôle ou de style.
145
-
146
- 4. **Cartographie des Risques**
147
- - Identifie les zones de vulnérabilité : extrapolation, sur-interprétation, sortie non contrôlée.
148
- - Classe-les par niveau de risque (Faible / Moyen / Élevé).
149
-
150
- ---
151
- ## OUTPUT ATTENDU
152
- 1. **Rapport de l’analyse globale** avec l'estimation du taux de couverture des directives par rapport à la mission.
153
- 2. **Rapport exhaustif par directive et par critère**, au format expliqué ci-dessous (ATTENTION seuls les scores <= 0.9 intéressent l'utilisateur et sont affichés avec un commentaire).
154
- 3. **Synthèse de l’analyse structurelle**, sous forme de carte des décisions, branches floues, recommandations, la liste chemins avec leur probabilité d'entrer en jeu, et le mermaid flowchart.
155
-
156
-
157
- ## EXEMPLE DE RAPPORT
158
- ### Directive N : *“[titre de la directive]”*
159
-
160
- - **[critère 1]** : [score] *[commentaire]*
161
- - ...
162
-
163
- ## Analyse structurelle
164
- ...
165
-
166
- `;
167
- exports.systemReview = {
168
- name: "systemReview",
169
- human: true,
170
- model: (0, execute_1.modelConfig)("MEDIUM"),
171
- publicDescription: "Agent chargé d'analyser le contenu d'un prompt système et de présenter ses remarques",
172
- instructions: exports.systemReviewPrompt,
173
- tools: [],
174
- downstreamAgents: [],
175
- };
176
- //instructions: [systemReviewPrompt, systemReviewStructurePrompt],
177
- //
178
- // go back to systemReview once the task is done
179
- // add the transfer tool to point to downstreamAgents
180
- const agents = (0, utils_1.injectTransferTools)([exports.systemReview]);
181
- exports.default = agents;
@@ -1,4 +0,0 @@
1
- import { AgentConfig } from "../types";
2
- export declare const systemReview: AgentConfig;
3
- declare const agents: AgentConfig[];
4
- export default agents;
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.systemReview = void 0;
4
- const execute_1 = require("../execute");
5
- const utils_1 = require("../utils");
6
- const prompts_1 = require("./prompts");
7
- exports.systemReview = {
8
- name: "systemReview",
9
- human: true,
10
- model: (0, execute_1.modelConfig)("MEDIUM"),
11
- publicDescription: "Agent chargé d'analyser le contenu d'un prompt système et de présenter ses remarques",
12
- instructions: prompts_1.systemReviewPrompt,
13
- maxSteps: 3,
14
- tools: [],
15
- downstreamAgents: [],
16
- };
17
- //instructions: [systemReviewPrompt, systemReviewStructurePrompt],
18
- //
19
- // go back to systemReview once the task is done
20
- // add the transfer tool to point to downstreamAgents
21
- const agents = (0, utils_1.injectTransferTools)([exports.systemReview]);
22
- exports.default = agents;
@@ -1,54 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.modelPricing = void 0;
4
- exports.calculateCost = calculateCost;
5
- exports.accumulateCost = accumulateCost;
6
- //
7
- // get/update pricing from openai
8
- // - https://platform.openai.com/docs/pricing#latest-models
9
- exports.modelPricing = {
10
- "gpt-4.5-preview": { input: 0.000075, cachedInput: 0.0000325, output: 0.000125 },
11
- "gpt-4.1": { input: 0.000002, cachedInput: 0.0000005, output: 0.000008 },
12
- "gpt-4.1-mini": { input: 0.0000004, cachedInput: 0.0000001, output: 0.0000016 },
13
- "gpt-4.1-nano": { input: 0.0000001, cachedInput: 0.000000025, output: 0.0000004 },
14
- "gpt-4o": { input: 0.0000025, cachedInput: 0.00000125, output: 0.00001 },
15
- "gpt-4o-audio-preview": { input: 0.0000025, output: 0.00001 },
16
- "gpt-4o-realtime-preview": { input: 0.000005, cachedInput: 0.0000025, output: 0.00002 },
17
- "gpt-4o-search-preview": { input: 0.000005, cachedInput: 0.0000025, output: 0.00002 },
18
- "gpt-4o-mini": { input: 0.00000015, cachedInput: 0.000000075, output: 0.0000006 },
19
- "gpt-4o-mini-audio-preview": { input: 0.00000015, output: 0.0000006 },
20
- "gpt-4o-mini-realtime-preview": { input: 0.0000006, cachedInput: 0.0000003, output: 0.0000024 },
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 },
26
- "o1": { input: 0.000015, cachedInput: 0.0000075, output: 0.00006 },
27
- "o4-mini": { input: 0.0000011, cachedInput: 0.00000055, output: 0.0000044 },
28
- "o3-mini": { input: 0.0000011, cachedInput: 0.00000055, output: 0.0000044 },
29
- "o1-mini": { input: 0.0000011, cachedInput: 0.00000055, output: 0.0000044 },
30
- };
31
- function calculateCost(model, usage) {
32
- if (!usage) {
33
- return 0;
34
- }
35
- if (!exports.modelPricing[model]) {
36
- throw new Error("Unknown model");
37
- }
38
- const pricing = exports.modelPricing[model];
39
- const cost = usage.prompt_tokens * pricing.input +
40
- // usage.completion_tokens * (pricing.cachedInput || 0) +
41
- usage.completion_tokens * pricing.output;
42
- return cost;
43
- }
44
- function accumulateCost(currentUsage, model, usage) {
45
- if (!usage) {
46
- return 0;
47
- }
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;
54
- }
@@ -1,76 +0,0 @@
1
- import OpenAI from 'openai';
2
- import { RAGConfig } from './types';
3
- /**
4
- * Crée les outils RAG pour un agent
5
- */
6
- declare const createTools: (openai: OpenAI, config: RAGConfig) => {
7
- toolsReferencesContent: {
8
- type: "function";
9
- function: {
10
- name: string;
11
- description: string;
12
- parameters: {
13
- type: string;
14
- properties: {
15
- service: {
16
- type: string;
17
- description: string;
18
- };
19
- source: {
20
- type: string;
21
- description: string;
22
- };
23
- };
24
- required: never[];
25
- additionalProperties: boolean;
26
- };
27
- };
28
- };
29
- toolsKnowledge: {
30
- type: "function";
31
- function: {
32
- name: string;
33
- description: string;
34
- parameters: {
35
- type: string;
36
- properties: {
37
- question: {
38
- type: string;
39
- description: string;
40
- };
41
- justification: {
42
- type: string;
43
- description: string;
44
- };
45
- action_suivante: {
46
- type: string;
47
- description: string;
48
- };
49
- };
50
- required: string[];
51
- additionalProperties: boolean;
52
- };
53
- };
54
- };
55
- lookupReferencesContent: ({ service, source }: {
56
- service?: string;
57
- source?: string;
58
- }) => Promise<{
59
- content: string;
60
- }>;
61
- lookupKnowledge: (args: any, debug?: boolean) => Promise<{
62
- content: string;
63
- documents?: undefined;
64
- scores?: undefined;
65
- } | {
66
- documents: {
67
- id: number;
68
- ref: string;
69
- score: number;
70
- content: string;
71
- }[];
72
- scores: number[];
73
- content?: undefined;
74
- }>;
75
- };
76
- export { createTools };
@@ -1,196 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createTools = void 0;
7
- const fs_1 = require("fs");
8
- const path_1 = __importDefault(require("path"));
9
- const parser_1 = require("./parser");
10
- const embeddings_1 = require("./embeddings");
11
- /**
12
- * Prompts de suivi pour les outils
13
- */
14
- const lookupReferencesContentFollowUpPrompt = "📋 RÉFÉRENCES DISPONIBLES\n\n";
15
- const lookupKnowledgeFollowUpPrompt = "🔍 RECHERCHE DANS LA BASE DE CONNAISSANCES\n\n";
16
- /**
17
- * Définitions des outils pour l'agent
18
- */
19
- const toolsReferencesContent = {
20
- type: "function",
21
- function: {
22
- name: "lookupReferencesContent",
23
- description: "Récupère le contenu d'un document spécifique ou liste tous les documents disponibles, optionnellement filtrés par service.",
24
- parameters: {
25
- type: "object",
26
- properties: {
27
- service: {
28
- type: "string",
29
- description: "Nom du service optionnel (ex: 'Gérance', 'PPE', 'Comptabilité') pour filtrer les documents (insensible à la casse)."
30
- },
31
- source: {
32
- type: "string",
33
- description: "Identifiant source optionnel (généralement un nom de fichier sans extension) pour récupérer le contenu d'un document spécifique."
34
- }
35
- },
36
- required: [],
37
- additionalProperties: false
38
- }
39
- }
40
- };
41
- const toolsKnowledge = {
42
- type: "function",
43
- function: {
44
- name: "lookupKnowledge",
45
- description: "Effectue une recherche de connaissances en utilisant la recherche vectorielle basée sur la question de l'utilisateur.",
46
- parameters: {
47
- type: "object",
48
- properties: {
49
- question: {
50
- type: "string",
51
- description: "La question de l'utilisateur à rechercher."
52
- },
53
- justification: {
54
- type: "string",
55
- description: "Justification optionnelle pour la recherche (actuellement loggée mais non utilisée dans la logique principale)."
56
- },
57
- action_suivante: {
58
- type: "string",
59
- description: "Action suivante optionnelle pour instruire le LLM après traitement des résultats."
60
- }
61
- },
62
- required: ["question"],
63
- additionalProperties: false
64
- }
65
- }
66
- };
67
- /**
68
- * Extrait le header d'un fichier
69
- */
70
- function getMatterHeaderFromFile(filePath) {
71
- try {
72
- const content = (0, fs_1.readFileSync)(filePath, 'utf8');
73
- const { sections } = (0, parser_1.getSections)(content, path_1.default.basename(filePath));
74
- // Essayer d'extraire le titre de la première section
75
- const firstSection = sections[0];
76
- if (firstSection?.title) {
77
- return { title: firstSection.title };
78
- }
79
- // Fallback sur le nom du fichier
80
- const filename = path_1.default.basename(filePath, path_1.default.extname(filePath));
81
- return { title: filename.replace(/-/g, ' ') };
82
- }
83
- catch (error) {
84
- const filename = path_1.default.basename(filePath, path_1.default.extname(filePath));
85
- return { title: filename.replace(/-/g, ' ') };
86
- }
87
- }
88
- // getDocumentFromId supprimée - utilisation directe de semanticSearch
89
- /**
90
- * Crée les outils RAG pour un agent
91
- */
92
- const createTools = (openai, config) => {
93
- // Utiliser l'API Embeddings existante
94
- const embeddings = new embeddings_1.Embeddings(config);
95
- if (!embeddings.isReady()) {
96
- throw new Error(`Index RAG non disponible à ${config.baseDir}. Exécutez buildrag d'abord.`);
97
- }
98
- // Charger le mapping des IDs
99
- const mappingFile = path_1.default.join(config.baseDir, 'rag-mapping.json');
100
- let ids = {};
101
- try {
102
- const mappingData = (0, fs_1.readFileSync)(mappingFile, 'utf8');
103
- const mapping = JSON.parse(mappingData);
104
- ids = mapping.mapping;
105
- }
106
- catch (error) {
107
- console.error('Erreur lors du chargement du mapping:', error);
108
- throw new Error('Mapping RAG non disponible');
109
- }
110
- /**
111
- * Récupère le contenu d'un document spécifique ou liste tous les documents disponibles,
112
- * optionnellement filtrés par service.
113
- */
114
- const lookupReferencesContent = async ({ service, source }) => {
115
- const documentPath = config.baseDir;
116
- const ftService = service?.toLowerCase();
117
- // Liste tous les fichiers markdown dans le répertoire spécifié
118
- const mdfiles = (0, fs_1.readdirSync)(documentPath)
119
- .filter((file) => file.endsWith('.md') &&
120
- (!ftService || file.toLowerCase().includes(ftService)))
121
- .map((file) => path_1.default.join(documentPath, file));
122
- // Si un source spécifique a été demandé
123
- if (source) {
124
- source = source.replace(/\.md.*/, '');
125
- const file = mdfiles.find((file) => file.includes(source));
126
- if (!file) {
127
- return { content: `Désolé, je n'ai pas trouvé le document "${source}".` };
128
- }
129
- const filename = path_1.default.basename(file);
130
- const content = (0, fs_1.readFileSync)(file, 'utf8');
131
- const { sections } = (0, parser_1.getSections)(content, filename);
132
- if (sections.length > 0) {
133
- const title = sections[0].title || filename;
134
- const allContent = sections.map(s => s.content).join('\n\n');
135
- const response = `${title}\n\n${allContent}\n\n[»](${filename})`;
136
- return { content: response };
137
- }
138
- else {
139
- return { content: `Le document "${source}" est vide ou mal formaté.` };
140
- }
141
- }
142
- // Si aucun source spécifié, lister les documents (filtrés par service si applicable)
143
- const serviceTitle = ftService ? ` pour le service "${service}"` : '';
144
- if (!mdfiles.length) {
145
- return { content: `Désolé, aucun document trouvé${serviceTitle}.` };
146
- }
147
- const title = `${lookupReferencesContentFollowUpPrompt}Voici la liste exhaustive des documents disponibles${serviceTitle} :\n`;
148
- const content = title + mdfiles.reduce((acc, file) => {
149
- const header = getMatterHeaderFromFile(file);
150
- const filename = path_1.default.basename(file);
151
- return acc + `- ${header.title} [»](/${filename})\n`;
152
- }, '');
153
- return { content };
154
- };
155
- /**
156
- * Effectue une recherche de connaissances en utilisant la recherche vectorielle
157
- */
158
- const lookupKnowledge = async (args, debug = false) => {
159
- console.log("lookupKnowledge", args.question);
160
- try {
161
- // Utiliser l'API de recherche sémantique existante
162
- const result = await embeddings.semanticSearch(args.question, {
163
- neighbors: 5,
164
- debug
165
- });
166
- if (!result.results || !result.results.length) {
167
- return {
168
- content: `Aucun document relatif à cette question.(⚠️ Tu dois continuer ton plan sans cette information)`
169
- };
170
- }
171
- console.log(`--- DBG rag search: ${result.results.length} documents trouvés`);
172
- if (debug) {
173
- return {
174
- documents: result.results,
175
- scores: result.results.map(r => r.score)
176
- };
177
- }
178
- const action_suivante = args.action_suivante || "";
179
- const withNextAction = action_suivante ?
180
- `(⚠️ A la fin de cette tâche, tu dois exécuter l'action suivante: "${action_suivante}")` : "";
181
- const prefix = `${lookupKnowledgeFollowUpPrompt}Voici les sections des documents (avec les références) à analyser de manière exhaustive.${withNextAction}:\n`;
182
- const response = prefix + result.results.reduce((doc, curr) => {
183
- return doc + `\n---\n[${curr.content}](/${curr.ref})`;
184
- }, '');
185
- return { content: response };
186
- }
187
- catch (error) {
188
- console.error('Erreur lors de la recherche:', error);
189
- return {
190
- content: `Erreur lors de la recherche dans la base de connaissances. (⚠️ Tu dois continuer ton plan sans cette information)`
191
- };
192
- }
193
- };
194
- return { toolsReferencesContent, toolsKnowledge, lookupReferencesContent, lookupKnowledge };
195
- };
196
- exports.createTools = createTools;
@@ -1,61 +0,0 @@
1
- import { UserMSAL } from '../microsoft/profile';
2
- import { RuleUser } from './types';
3
- /**
4
- * Rôles disponibles pour les règles
5
- */
6
- export declare enum RuleRole {
7
- READER = "reader",
8
- EDITOR = "editor",
9
- VALIDATOR = "validator",
10
- PUBLISHER = "publisher"
11
- }
12
- /**
13
- * Configuration des permissions par rôle
14
- */
15
- export interface RolePermissions {
16
- canRead: boolean;
17
- canDelete: boolean;
18
- canEdit: boolean;
19
- canValidate: boolean;
20
- canPublish: boolean;
21
- }
22
- /**
23
- * Permissions par rôle
24
- */
25
- export declare const ROLE_PERMISSIONS: Record<RuleRole, RolePermissions>;
26
- /**
27
- * Mapper pour convertir UserMSAL en RuleUser
28
- */
29
- export declare class UserRoleMapper {
30
- /**
31
- * Convertit un UserMSAL en RuleUser
32
- * @param userMSAL L'utilisateur MSAL
33
- * @param overrideRole Rôle à forcer (optionnel)
34
- */
35
- static toRuleUser(userMSAL: UserMSAL, overrideRole?: RuleRole): RuleUser;
36
- /**
37
- * Détermine le rôle d'un utilisateur basé sur ses propriétés MSAL
38
- * @param userMSAL L'utilisateur MSAL
39
- */
40
- private static determineRoleFromMSAL;
41
- /**
42
- * Vérifie si un utilisateur a une permission spécifique
43
- * @param userMSAL L'utilisateur MSAL
44
- * @param permission La permission à vérifier
45
- * @param overrideRole Rôle à forcer (optionnel)
46
- */
47
- static hasPermission(userMSAL: UserMSAL, permission: keyof RolePermissions, overrideRole?: RuleRole): boolean;
48
- /**
49
- * Obtient toutes les permissions d'un utilisateur
50
- * @param userMSAL L'utilisateur MSAL
51
- * @param overrideRole Rôle à forcer (optionnel)
52
- */
53
- static getPermissions(userMSAL: UserMSAL, overrideRole?: RuleRole): RolePermissions;
54
- /**
55
- * Vérifie si un utilisateur peut effectuer une action sur une branche donnée
56
- * @param userMSAL L'utilisateur MSAL
57
- * @param action L'action à effectuer
58
- * @param branch La branche concernée
59
- */
60
- static canPerformAction(userMSAL: UserMSAL, action: 'read' | 'edit' | 'validate' | 'publish' | 'delete', branch: string): boolean;
61
- }