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
|
@@ -33,55 +33,15 @@ class Embeddings {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
36
|
+
* Extrait et sauvegarde les use cases d'un document
|
|
37
|
+
* Utilise la fonction standalone pour la compatibilité
|
|
38
|
+
*
|
|
39
|
+
* @param document Document parsé
|
|
40
|
+
* @returns Les queries extraites avec leur coût
|
|
41
|
+
* @deprecated Utiliser extractAndSaveDocumentUseCases de usecase.ts directement
|
|
38
42
|
*/
|
|
39
|
-
getNextID() {
|
|
40
|
-
// Si non initialisé, partir du plus grand ID du mapping
|
|
41
|
-
if (this.metadata.docLastID == null || this.metadata.docLastID <= 0) {
|
|
42
|
-
const maxFromMapping = Object.keys(this.mapping.mapping || {})
|
|
43
|
-
.map(k => parseInt(k, 10))
|
|
44
|
-
.filter(n => !isNaN(n))
|
|
45
|
-
.reduce((a, b) => Math.max(a, b), 999);
|
|
46
|
-
this.metadata.docLastID = maxFromMapping + 1;
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
this.metadata.docLastID = this.metadata.docLastID + 1;
|
|
50
|
-
}
|
|
51
|
-
const next = this.metadata.docLastID;
|
|
52
|
-
this.saveMetadata(this.metadata);
|
|
53
|
-
return next;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Retourne l'ID documentaire pour un fichier. Si non trouvé, attribue un nouvel ID.
|
|
57
|
-
* Stratégie: utiliser le mapping id -> "filename#section-0".
|
|
58
|
-
*/
|
|
59
|
-
getOrAssignDocumentID(file) {
|
|
60
|
-
const base = path_1.default.basename(file, path_1.default.extname(file));
|
|
61
|
-
// Chercher un ID existant dans le mapping (section-0 comme ancrage documentaire)
|
|
62
|
-
const found = Object.entries(this.mapping.mapping || {}).find(([id, ref]) => {
|
|
63
|
-
return typeof ref === 'string' && ref.startsWith(`${base}#section-0`);
|
|
64
|
-
});
|
|
65
|
-
if (found) {
|
|
66
|
-
return parseInt(found[0], 10);
|
|
67
|
-
}
|
|
68
|
-
// Sinon, générer un nouvel ID documentaire
|
|
69
|
-
return this.getNextID();
|
|
70
|
-
}
|
|
71
43
|
async extractAndSaveDocumentUseCases(document) {
|
|
72
|
-
|
|
73
|
-
const filename = path_1.default.basename(document.filename, path_1.default.extname(document.filename));
|
|
74
|
-
const docQueries = {
|
|
75
|
-
type: 'use-cases',
|
|
76
|
-
version: this.config.version,
|
|
77
|
-
tag: this.config.tag,
|
|
78
|
-
source: document.filename,
|
|
79
|
-
file: (0, utils_1.toSlug)(filename) + '.json',
|
|
80
|
-
cost,
|
|
81
|
-
queries
|
|
82
|
-
};
|
|
83
|
-
(0, usecase_1.saveUseCases)(docQueries, this.config);
|
|
84
|
-
return docQueries;
|
|
44
|
+
return (0, usecase_1.extractAndSaveDocumentUseCases)(document, this.config.baseDir, this.config.version, this.config.tag);
|
|
85
45
|
}
|
|
86
46
|
/**
|
|
87
47
|
* Charge les documents du RAG
|
|
@@ -102,6 +62,7 @@ class Embeddings {
|
|
|
102
62
|
// throw error;
|
|
103
63
|
// }
|
|
104
64
|
const content = (0, fs_1.readFileSync)(filePath, 'utf8');
|
|
65
|
+
// getSections() validera que l'ID est présent dans le matter
|
|
105
66
|
const parsedDocument = (0, parser_1.getSections)(content, file);
|
|
106
67
|
return parsedDocument;
|
|
107
68
|
}
|
|
@@ -117,7 +78,7 @@ class Embeddings {
|
|
|
117
78
|
*/
|
|
118
79
|
async loadDocumentUseCases(document) {
|
|
119
80
|
const filename = path_1.default.basename(document.filename, path_1.default.extname(document.filename));
|
|
120
|
-
return (0, usecase_1.loadUseCases)((0, utils_1.toSlug)(filename) + '.json', this.config);
|
|
81
|
+
return (0, usecase_1.loadUseCases)((0, utils_1.toSlug)(filename) + '.query.json', this.config);
|
|
121
82
|
}
|
|
122
83
|
async listDocumentsOnRAG() {
|
|
123
84
|
const filesWithSection = Object.values(this.mapping?.mapping || {});
|
|
@@ -204,6 +165,75 @@ class Embeddings {
|
|
|
204
165
|
}
|
|
205
166
|
return this.vectorsIndex !== null && this.metadata !== null && this.mapping !== null;
|
|
206
167
|
}
|
|
168
|
+
/**
|
|
169
|
+
* Met à jour l'embedding avec une nouvelle configuration
|
|
170
|
+
* Recharge l'index, les métadonnées et le mapping depuis les nouveaux fichiers
|
|
171
|
+
*
|
|
172
|
+
* Cette méthode est appelée par RAGManager.notifyUpdate() quand un RAG est modifié
|
|
173
|
+
*
|
|
174
|
+
* FIXME: Gérer le cas où l'embedding est en cours d'exécution (recherche/indexation)
|
|
175
|
+
* Actuellement, l'update est appliqué immédiatement sans vérifier si l'embedding est busy.
|
|
176
|
+
* Solutions possibles:
|
|
177
|
+
* - Ajouter un flag `isBusy` pour bloquer les updates pendant une recherche
|
|
178
|
+
* - Implémenter une queue d'updates avec retry
|
|
179
|
+
* - Utiliser un système de locks/mutex
|
|
180
|
+
*
|
|
181
|
+
* @param newConfig Nouvelle configuration RAG
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```typescript
|
|
185
|
+
* // Appelé automatiquement par RAGManager après un build ou rename
|
|
186
|
+
* embedding.update(newConfig);
|
|
187
|
+
* ```
|
|
188
|
+
*/
|
|
189
|
+
update(newConfig) {
|
|
190
|
+
// Sauvegarder l'ancienne config pour rollback en cas d'erreur
|
|
191
|
+
const oldConfig = this.config;
|
|
192
|
+
const oldVectorsFile = this.vectorsFile;
|
|
193
|
+
try {
|
|
194
|
+
// Mettre à jour la configuration
|
|
195
|
+
this.config = newConfig;
|
|
196
|
+
this.vectorsFile = path_1.default.join(newConfig.baseDir, types_1.RAG_FILES.VECTORS);
|
|
197
|
+
this.space = newConfig.dimensions || 1536;
|
|
198
|
+
this.distance = newConfig.distance || 'cosine';
|
|
199
|
+
// Recharger l'index si ce n'est pas en mode inmemory
|
|
200
|
+
if (!this.inmemory) {
|
|
201
|
+
// Vérifier que les fichiers existent
|
|
202
|
+
if (!(0, fs_1.existsSync)(this.vectorsFile)) {
|
|
203
|
+
throw new Error(`Fichier d'index manquant: ${this.vectorsFile}`);
|
|
204
|
+
}
|
|
205
|
+
// Recharger l'index
|
|
206
|
+
this.loadIndex();
|
|
207
|
+
// Recharger les métadonnées et le mapping
|
|
208
|
+
this.loadMetadata();
|
|
209
|
+
this.loadMapping();
|
|
210
|
+
if (this.debug)
|
|
211
|
+
console.log(`✅ Embedding mis à jour avec nouvelle config: ${newConfig.baseDir}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
// Rollback en cas d'erreur
|
|
216
|
+
console.error('❌ Erreur lors de la mise à jour de l\'embedding, rollback:', error);
|
|
217
|
+
this.config = oldConfig;
|
|
218
|
+
this.vectorsFile = oldVectorsFile;
|
|
219
|
+
this.space = oldConfig.dimensions || 1536;
|
|
220
|
+
this.distance = oldConfig.distance || 'cosine';
|
|
221
|
+
// Essayer de recharger l'ancienne config
|
|
222
|
+
try {
|
|
223
|
+
if (!this.inmemory && (0, fs_1.existsSync)(this.vectorsFile)) {
|
|
224
|
+
this.loadIndex();
|
|
225
|
+
this.loadMetadata();
|
|
226
|
+
this.loadMapping();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (rollbackError) {
|
|
230
|
+
console.error('❌ Erreur critique lors du rollback:', rollbackError);
|
|
231
|
+
// Réinitialiser complètement en dernier recours
|
|
232
|
+
this.resetKnn();
|
|
233
|
+
}
|
|
234
|
+
throw new Error(`Impossible de mettre à jour l'embedding: ${error}`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
207
237
|
/**
|
|
208
238
|
* Réinitialise l'index
|
|
209
239
|
*/
|
|
@@ -215,13 +245,18 @@ class Embeddings {
|
|
|
215
245
|
/**
|
|
216
246
|
* Crée un nouvel index HierarchicalNSW avec documents parsés
|
|
217
247
|
* ou met à jour l'index existant avec de nouveaux documents
|
|
248
|
+
*
|
|
249
|
+
* @returns IndexBuildResult contenant les données nécessaires pour créer les métadonnées RAG
|
|
250
|
+
*
|
|
251
|
+
* Note: Cette méthode ne sauvegarde plus les métadonnées directement.
|
|
252
|
+
* RAGManager est responsable de créer et sauvegarder les métadonnées
|
|
253
|
+
* à partir du résultat retourné.
|
|
218
254
|
*/
|
|
219
255
|
async indexFromDocuments(documents, options) {
|
|
220
256
|
const ef = options?.ef || this.config.hnswConfig?.ef || 200;
|
|
221
257
|
const m = options?.m || this.config.hnswConfig?.m || 32;
|
|
222
258
|
const isUpdate = options?.update || false;
|
|
223
259
|
const prepare = options?.prepare || ((input) => input);
|
|
224
|
-
let startId = this.config.startId || 1000;
|
|
225
260
|
const openai = (0, utils_1.openaiInstance)();
|
|
226
261
|
const vectors = {};
|
|
227
262
|
const documentRefs = {};
|
|
@@ -230,19 +265,19 @@ class Embeddings {
|
|
|
230
265
|
if (isUpdate && this.mapping && this.metadata) {
|
|
231
266
|
Object.assign(documentRefs, this.mapping.mapping);
|
|
232
267
|
Object.assign(documentReferences, this.metadata.documents);
|
|
233
|
-
// Trouver le prochain ID disponible
|
|
234
|
-
const existingIds = Object.keys(documentRefs).map(id => parseInt(id));
|
|
235
|
-
startId = existingIds.length ? Math.max(...existingIds) + 1 : startId;
|
|
236
268
|
}
|
|
237
|
-
|
|
269
|
+
if (this.debug)
|
|
270
|
+
console.log(`Traitement de ${documents.length} documents...`);
|
|
238
271
|
for (const doc of documents) {
|
|
239
272
|
const filename = path_1.default.basename(doc.filename, path_1.default.extname(doc.filename));
|
|
240
273
|
process.stdout.write(`Traitement: ${filename}`);
|
|
241
|
-
const { sections } = doc;
|
|
274
|
+
const { sections, matter } = doc;
|
|
242
275
|
if (!sections.length) {
|
|
243
276
|
console.log(`❌ Aucune section trouvée dans ${filename}`);
|
|
244
277
|
continue;
|
|
245
278
|
}
|
|
279
|
+
// ID de base du document
|
|
280
|
+
const baseId = matter.id;
|
|
246
281
|
// Traiter chaque section
|
|
247
282
|
for (let index = 0; index < sections.length; index++) {
|
|
248
283
|
const section = sections[index];
|
|
@@ -250,10 +285,14 @@ class Embeddings {
|
|
|
250
285
|
if (!hasEnoughContent) {
|
|
251
286
|
continue;
|
|
252
287
|
}
|
|
288
|
+
// ✅ NOUVEAU: ID calculé = matter.id * 100 + sectionIndex
|
|
289
|
+
// Permet de supprimer facilement toutes les sections d'un document
|
|
290
|
+
// en recherchant les IDs entre (matter.id * 100) et (matter.id * 100 + 99)
|
|
291
|
+
// Limite: 100 sections par document (0-99)
|
|
292
|
+
const vectorId = baseId * 100 + index;
|
|
253
293
|
// Vérifier si cette section existe déjà (pour les mises à jour)
|
|
254
294
|
const ref = `${filename}#section-${index}`;
|
|
255
|
-
|
|
256
|
-
if (isUpdate && existingId) {
|
|
295
|
+
if (isUpdate && documentRefs[vectorId]) {
|
|
257
296
|
console.log(`Section ${ref} déjà indexée, ignorée`);
|
|
258
297
|
continue;
|
|
259
298
|
}
|
|
@@ -266,24 +305,19 @@ class Embeddings {
|
|
|
266
305
|
});
|
|
267
306
|
const normalizedVectors = (0, parser_1.l2Normalize)(embedding.data[0].embedding);
|
|
268
307
|
// Stocker avec le nouveau format d'ID
|
|
269
|
-
vectors[
|
|
270
|
-
documentRefs[
|
|
308
|
+
vectors[vectorId] = normalizedVectors;
|
|
309
|
+
documentRefs[vectorId] = ref;
|
|
271
310
|
// Créer la référence de document
|
|
272
|
-
documentReferences[
|
|
311
|
+
documentReferences[vectorId] = {
|
|
273
312
|
filename: filename + '.md',
|
|
274
313
|
sectionIndex: index,
|
|
275
314
|
ref,
|
|
276
315
|
title: section.title || `Section ${index}`,
|
|
277
316
|
content: section.content,
|
|
278
|
-
metadata:
|
|
317
|
+
metadata: matter
|
|
279
318
|
};
|
|
280
|
-
startId++;
|
|
281
319
|
process.stdout.write(hasEnoughContent ? ':' : '.');
|
|
282
320
|
}
|
|
283
|
-
//
|
|
284
|
-
// let enough room for new sections on future updates
|
|
285
|
-
const pad = 20 - sections.length;
|
|
286
|
-
startId += pad;
|
|
287
321
|
console.log(' done');
|
|
288
322
|
}
|
|
289
323
|
// Créer ou mettre à jour l'index HierarchicalNSW
|
|
@@ -308,16 +342,13 @@ class Embeddings {
|
|
|
308
342
|
}
|
|
309
343
|
}
|
|
310
344
|
else {
|
|
311
|
-
//
|
|
312
|
-
// FIXME this is not working, ids must be restored from de RAGMapping ids <=> documentRefs
|
|
313
|
-
// Mettre à jour l'index existant
|
|
345
|
+
// Mettre à jour l'index existant avec de nouveaux vecteurs
|
|
314
346
|
console.log(`Mise à jour de l'index avec ${newVectors.length} nouveaux vecteurs`);
|
|
315
|
-
const replaceDeleted = true;
|
|
316
347
|
for (const item of newVectors) {
|
|
317
348
|
const id = parseInt(item);
|
|
318
|
-
//
|
|
319
|
-
|
|
320
|
-
this.vectorsIndex.addPoint(vectors[item], id
|
|
349
|
+
// Pour les nouveaux vecteurs, on les ajoute simplement sans markDelete
|
|
350
|
+
// car ils n'existaient pas auparavant dans l'index
|
|
351
|
+
this.vectorsIndex.addPoint(vectors[item], id);
|
|
321
352
|
}
|
|
322
353
|
}
|
|
323
354
|
// Sauvegarder l'index
|
|
@@ -328,26 +359,14 @@ class Embeddings {
|
|
|
328
359
|
// Créer le tag de version
|
|
329
360
|
const tag = this.config.tag || (0, types_1.generateVersionTag)();
|
|
330
361
|
const version = this.config.version || '1.0';
|
|
331
|
-
//
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
version,
|
|
335
|
-
tag,
|
|
336
|
-
mapping: documentRefs,
|
|
337
|
-
createdAt: new Date().toISOString()
|
|
338
|
-
};
|
|
339
|
-
this.saveMapping(mapping);
|
|
340
|
-
// Créer et sauvegarder les métadonnées
|
|
341
|
-
const metadata = {
|
|
362
|
+
// ✅ Assigner les métadonnées en mémoire pour que les méthodes comme listDocumentsOnRAG() fonctionnent
|
|
363
|
+
// Même si on ne sauvegarde plus sur disque, les données doivent être en mémoire
|
|
364
|
+
this.metadata = {
|
|
342
365
|
version,
|
|
343
366
|
tag,
|
|
344
367
|
createdAt: new Date().toISOString(),
|
|
345
368
|
config: this.config,
|
|
346
369
|
documents: documentReferences,
|
|
347
|
-
checkpoint: {
|
|
348
|
-
branch: options?.branch || '',
|
|
349
|
-
hash: options?.lastCommit || ''
|
|
350
|
-
},
|
|
351
370
|
stats: {
|
|
352
371
|
totalDocuments: documents.length,
|
|
353
372
|
totalSections: totalVectors,
|
|
@@ -360,7 +379,22 @@ class Embeddings {
|
|
|
360
379
|
queriesFile: types_1.RAG_FILES.QUERIES
|
|
361
380
|
}
|
|
362
381
|
};
|
|
363
|
-
this.
|
|
382
|
+
this.mapping = {
|
|
383
|
+
type: 'mapping',
|
|
384
|
+
version,
|
|
385
|
+
tag,
|
|
386
|
+
mapping: documentRefs,
|
|
387
|
+
createdAt: new Date().toISOString()
|
|
388
|
+
};
|
|
389
|
+
// ✅ Retourner les données pour que RAGManager gère les métadonnées sur disque
|
|
390
|
+
return {
|
|
391
|
+
totalVectors,
|
|
392
|
+
vectorDimensions: this.space,
|
|
393
|
+
documents: documentReferences,
|
|
394
|
+
mapping: documentRefs,
|
|
395
|
+
tag,
|
|
396
|
+
version
|
|
397
|
+
};
|
|
364
398
|
}
|
|
365
399
|
/**
|
|
366
400
|
* Charge l'index HierarchicalNSW existant
|
|
@@ -414,46 +448,9 @@ class Embeddings {
|
|
|
414
448
|
}
|
|
415
449
|
}
|
|
416
450
|
}
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
saveMetadata(metadata) {
|
|
421
|
-
// Toujours assigner les métadonnées en mémoire
|
|
422
|
-
this.metadata = metadata;
|
|
423
|
-
// En mode inmemory, on ne sauvegarde pas sur disque
|
|
424
|
-
if (this.inmemory)
|
|
425
|
-
return;
|
|
426
|
-
const metadataFile = path_1.default.join(this.config.baseDir, types_1.RAG_FILES.METADATA);
|
|
427
|
-
try {
|
|
428
|
-
(0, fs_1.writeFileSync)(metadataFile, JSON.stringify(metadata, null, 2), 'utf8');
|
|
429
|
-
if (this.debug) {
|
|
430
|
-
console.log('Métadonnées sauvegardées:', metadataFile);
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
catch (error) {
|
|
434
|
-
console.error('Erreur lors de la sauvegarde des métadonnées:', error);
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
/**
|
|
438
|
-
* Sauvegarde le mapping des IDs
|
|
439
|
-
*/
|
|
440
|
-
saveMapping(mapping) {
|
|
441
|
-
// Toujours assigner le mapping en mémoire
|
|
442
|
-
this.mapping = mapping;
|
|
443
|
-
// En mode inmemory, on ne sauvegarde pas sur disque
|
|
444
|
-
if (this.inmemory)
|
|
445
|
-
return;
|
|
446
|
-
const mappingFile = path_1.default.join(this.config.baseDir, types_1.RAG_FILES.MAPPING);
|
|
447
|
-
try {
|
|
448
|
-
(0, fs_1.writeFileSync)(mappingFile, JSON.stringify(mapping, null, 2), 'utf8');
|
|
449
|
-
if (this.debug) {
|
|
450
|
-
console.log('Mapping sauvegardé:', mappingFile);
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
catch (error) {
|
|
454
|
-
console.error('Erreur lors de la sauvegarde du mapping:', error);
|
|
455
|
-
}
|
|
456
|
-
}
|
|
451
|
+
// ❌ SUPPRIMÉ : saveMetadata() et saveMapping()
|
|
452
|
+
// Ces méthodes ont été déplacées vers RAGManager pour une meilleure séparation des responsabilités
|
|
453
|
+
// RAGManager est maintenant responsable de la gestion complète du cycle de vie des métadonnées
|
|
457
454
|
/**
|
|
458
455
|
* Récupère un vecteur depuis l'index existant (pour les mises à jour)
|
|
459
456
|
*/
|
package/dist/src/rag/index.d.ts
CHANGED
|
@@ -2,11 +2,11 @@ export * from './types';
|
|
|
2
2
|
export * from './parser';
|
|
3
3
|
export * from './embeddings';
|
|
4
4
|
export * from './usecase';
|
|
5
|
+
export * from './rag.manager';
|
|
6
|
+
export * from './rag.examples';
|
|
7
|
+
import { RAGConfig } from './types';
|
|
5
8
|
/**
|
|
6
9
|
* Configuration par défaut pour le RAG
|
|
7
10
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*/
|
|
11
|
-
export declare class RAGManager {
|
|
12
|
-
}
|
|
11
|
+
declare const DEFAULT_RAG_CONFIG: Partial<RAGConfig>;
|
|
12
|
+
export { DEFAULT_RAG_CONFIG };
|
package/dist/src/rag/index.js
CHANGED
|
@@ -14,27 +14,24 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.
|
|
17
|
+
exports.DEFAULT_RAG_CONFIG = void 0;
|
|
18
18
|
__exportStar(require("./types"), exports);
|
|
19
19
|
__exportStar(require("./parser"), exports);
|
|
20
20
|
__exportStar(require("./embeddings"), exports);
|
|
21
21
|
__exportStar(require("./usecase"), exports);
|
|
22
|
+
__exportStar(require("./rag.manager"), exports);
|
|
23
|
+
__exportStar(require("./rag.examples"), exports);
|
|
22
24
|
/**
|
|
23
25
|
* Configuration par défaut pour le RAG
|
|
24
26
|
*/
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
* Gestionnaire RAG principal
|
|
37
|
-
*/
|
|
38
|
-
class RAGManager {
|
|
39
|
-
}
|
|
40
|
-
exports.RAGManager = RAGManager;
|
|
27
|
+
const DEFAULT_RAG_CONFIG = {
|
|
28
|
+
dimensions: 1536,
|
|
29
|
+
distance: 'cosine',
|
|
30
|
+
version: '1.0',
|
|
31
|
+
startId: 1000,
|
|
32
|
+
hnswConfig: {
|
|
33
|
+
ef: 200,
|
|
34
|
+
m: 32
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
exports.DEFAULT_RAG_CONFIG = DEFAULT_RAG_CONFIG;
|
package/dist/src/rag/parser.d.ts
CHANGED
|
@@ -4,7 +4,8 @@ import { ParsedDocument, DocumentSection } from './types';
|
|
|
4
4
|
*
|
|
5
5
|
* @param content Contenu du document
|
|
6
6
|
* @param filename Nom du fichier (pour le titre par défaut)
|
|
7
|
-
* @returns Sections et header du document
|
|
7
|
+
* @returns Sections et header du document avec matter validé
|
|
8
|
+
* @throws Error si le matter est invalide après traitement
|
|
8
9
|
*/
|
|
9
10
|
export declare function getSections(content: string, filename: string): ParsedDocument;
|
|
10
11
|
/**
|
package/dist/src/rag/parser.js
CHANGED
|
@@ -12,6 +12,7 @@ exports.sectionParseValues = sectionParseValues;
|
|
|
12
12
|
exports.sectionParseKey = sectionParseKey;
|
|
13
13
|
exports.removeThinkingBlocks = removeThinkingBlocks;
|
|
14
14
|
const fs_1 = require("fs");
|
|
15
|
+
const types_1 = require("./types");
|
|
15
16
|
const path_1 = __importDefault(require("path"));
|
|
16
17
|
const rules_1 = require("../rules");
|
|
17
18
|
/**
|
|
@@ -19,7 +20,8 @@ const rules_1 = require("../rules");
|
|
|
19
20
|
*
|
|
20
21
|
* @param content Contenu du document
|
|
21
22
|
* @param filename Nom du fichier (pour le titre par défaut)
|
|
22
|
-
* @returns Sections et header du document
|
|
23
|
+
* @returns Sections et header du document avec matter validé
|
|
24
|
+
* @throws Error si le matter est invalide après traitement
|
|
23
25
|
*/
|
|
24
26
|
function getSections(content, filename) {
|
|
25
27
|
// IMPORTANT: Cette fonction traite les fichiers transformés par RAGGenerator
|
|
@@ -27,16 +29,8 @@ function getSections(content, filename) {
|
|
|
27
29
|
// Vérifier si le contenu contient un front-matter,
|
|
28
30
|
// celui-ci contient le nom du fichier d'origine et le nom du service!
|
|
29
31
|
let { matter, content: contentWithoutMatter } = (0, rules_1.matterParse)(content);
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
console.log('🔔 No standard matter found in file:', matter);
|
|
33
|
-
}
|
|
34
|
-
// S'assurer que matter contient au minimum filename et title
|
|
35
|
-
matter = {
|
|
36
|
-
...matter,
|
|
37
|
-
filename,
|
|
38
|
-
title: matter.title || filename // Utiliser le filename comme titre par défaut
|
|
39
|
-
};
|
|
32
|
+
// Valider le matter (throw si invalide)
|
|
33
|
+
(0, types_1.isValidRAGMatter)(matter);
|
|
40
34
|
content = contentWithoutMatter || content;
|
|
41
35
|
//
|
|
42
36
|
// le contenu est toujours sans le front-matter!
|
|
@@ -58,8 +52,7 @@ function getSections(content, filename) {
|
|
|
58
52
|
title: sectionParseKey('titre', content) || undefined
|
|
59
53
|
}))
|
|
60
54
|
.filter(section => section.lines > 2); // Filtrer les sections trop courtes
|
|
61
|
-
//
|
|
62
|
-
// le matter contient les informations du fichier d'origine! (service, responssable, fichier, etc.)
|
|
55
|
+
// Retourner le document parsé avec matter validé
|
|
63
56
|
return {
|
|
64
57
|
filename,
|
|
65
58
|
sections,
|
|
@@ -84,7 +77,11 @@ const getDocumentBySection = (id, ids, prefix) => {
|
|
|
84
77
|
throw new Error('Invalid document id :' + fullname);
|
|
85
78
|
}
|
|
86
79
|
const content = (0, fs_1.readFileSync)(path_1.default.join(prefix, filename), 'utf8');
|
|
87
|
-
const { sections } = getSections(content, filename);
|
|
80
|
+
const { sections, matter } = getSections(content, filename);
|
|
81
|
+
// Vérifier que l'ID du matter correspond à l'ID demandé
|
|
82
|
+
if (matter.id !== id) {
|
|
83
|
+
console.warn(`❌ Document ID mismatch: ${matter.title} - expected ${id}, got ${matter.id}`);
|
|
84
|
+
}
|
|
88
85
|
if (!sections.length) {
|
|
89
86
|
return {
|
|
90
87
|
source: fullname,
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ParsedDocument, RAGConfig } from './types';
|
|
2
|
+
import { RAGManager } from './rag.manager';
|
|
3
|
+
/**
|
|
4
|
+
* Exemples d'utilisation du gestionnaire multi-RAG
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Construit un RAG spécifique avec des documents
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildSpecificRAG(ragManager: RAGManager, ragName: string, documents: ParsedDocument[], ragConfig?: Partial<RAGConfig>): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Recherche dans un RAG spécifique
|
|
12
|
+
*/
|
|
13
|
+
export declare function searchInRAG(ragManager: RAGManager, ragName: string, query: string, options?: {
|
|
14
|
+
neighbors?: number;
|
|
15
|
+
debug?: boolean;
|
|
16
|
+
}): Promise<any>;
|
|
17
|
+
/**
|
|
18
|
+
* Recherche dans le RAG par défaut
|
|
19
|
+
*/
|
|
20
|
+
export declare function searchInDefaultRAG(ragManager: RAGManager, query: string, options?: {
|
|
21
|
+
neighbors?: number;
|
|
22
|
+
debug?: boolean;
|
|
23
|
+
}): Promise<any>;
|
|
24
|
+
/**
|
|
25
|
+
* Exemple d'utilisation complète
|
|
26
|
+
*/
|
|
27
|
+
export declare function exampleUsage(baseDir: string): Promise<void>;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildSpecificRAG = buildSpecificRAG;
|
|
4
|
+
exports.searchInRAG = searchInRAG;
|
|
5
|
+
exports.searchInDefaultRAG = searchInDefaultRAG;
|
|
6
|
+
exports.exampleUsage = exampleUsage;
|
|
7
|
+
const rag_manager_1 = require("./rag.manager");
|
|
8
|
+
/**
|
|
9
|
+
* Exemples d'utilisation du gestionnaire multi-RAG
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Construit un RAG spécifique avec des documents
|
|
13
|
+
*/
|
|
14
|
+
async function buildSpecificRAG(ragManager, ragName, documents, ragConfig) {
|
|
15
|
+
console.log(`🔄 Construction du RAG: ${ragName}`);
|
|
16
|
+
try {
|
|
17
|
+
await ragManager.build(ragName, documents, ragConfig);
|
|
18
|
+
console.log(`✅ RAG '${ragName}' construit avec succès`);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
console.error(`❌ Erreur lors de la construction de '${ragName}':`, error);
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Recherche dans un RAG spécifique
|
|
27
|
+
*/
|
|
28
|
+
async function searchInRAG(ragManager, ragName, query, options = {}) {
|
|
29
|
+
try {
|
|
30
|
+
const embeddings = ragManager.load(ragName);
|
|
31
|
+
const results = await embeddings.semanticSearch(query, {
|
|
32
|
+
neighbors: options.neighbors || 5,
|
|
33
|
+
debug: options.debug || false
|
|
34
|
+
});
|
|
35
|
+
if (options.debug) {
|
|
36
|
+
console.log(`🔍 Recherche dans '${ragName}': ${results.results.length} résultats`);
|
|
37
|
+
}
|
|
38
|
+
return results;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error(`❌ Erreur lors de la recherche dans '${ragName}':`, error);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Recherche dans le RAG par défaut
|
|
47
|
+
*/
|
|
48
|
+
async function searchInDefaultRAG(ragManager, query, options = {}) {
|
|
49
|
+
const defaultRAG = ragManager.getDefault();
|
|
50
|
+
if (!defaultRAG) {
|
|
51
|
+
throw new Error('Aucun RAG par défaut défini');
|
|
52
|
+
}
|
|
53
|
+
return searchInRAG(ragManager, defaultRAG, query, options);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Exemple d'utilisation complète
|
|
57
|
+
*/
|
|
58
|
+
async function exampleUsage(baseDir) {
|
|
59
|
+
console.log('🚀 Exemple d\'utilisation du gestionnaire multi-RAG');
|
|
60
|
+
console.log(`📁 Répertoire de base: ${baseDir}`);
|
|
61
|
+
// Initialiser le gestionnaire
|
|
62
|
+
const ragManagerConfig = {
|
|
63
|
+
baseDir,
|
|
64
|
+
maxArchives: 5
|
|
65
|
+
};
|
|
66
|
+
const ragManager = rag_manager_1.RAGManager.get(ragManagerConfig);
|
|
67
|
+
// Créer quelques RAG par défaut
|
|
68
|
+
const defaultRAGs = [
|
|
69
|
+
{
|
|
70
|
+
name: 'procedures-stable',
|
|
71
|
+
config: {
|
|
72
|
+
baseDir: '',
|
|
73
|
+
dimensions: 1536,
|
|
74
|
+
distance: 'cosine',
|
|
75
|
+
version: '1.0',
|
|
76
|
+
hnswConfig: { ef: 200, m: 64 }
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'procedures-draft',
|
|
81
|
+
config: {
|
|
82
|
+
baseDir: '',
|
|
83
|
+
dimensions: 1536,
|
|
84
|
+
distance: 'cosine',
|
|
85
|
+
version: '1.0',
|
|
86
|
+
hnswConfig: { ef: 200, m: 32 }
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
];
|
|
90
|
+
for (const rag of defaultRAGs) {
|
|
91
|
+
try {
|
|
92
|
+
ragManager.getStatus(rag.name);
|
|
93
|
+
console.log(`✅ RAG déjà existant: ${rag.name}`);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
// RAG n'existe pas, le créer
|
|
97
|
+
const tempPath = await ragManager.create(rag.name);
|
|
98
|
+
console.log(`✅ RAG créé: ${rag.name} (temp: ${tempPath})`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Définir 'procedures-stable' comme RAG par défaut
|
|
102
|
+
await ragManager.setDefault('procedures-stable');
|
|
103
|
+
// Lister les RAG disponibles
|
|
104
|
+
const rags = ragManager.list();
|
|
105
|
+
console.log(`📋 RAG disponibles: ${rags.map((r) => r.name).join(', ')}`);
|
|
106
|
+
// Obtenir les statistiques
|
|
107
|
+
const stats = ragManager.getStats();
|
|
108
|
+
console.log('📊 Statistiques des RAG:');
|
|
109
|
+
stats.forEach(stat => {
|
|
110
|
+
console.log(` • ${stat.name}: ${stat.status} (${stat.isValid ? 'valide' : 'invalide'})`);
|
|
111
|
+
if (stat.metadata) {
|
|
112
|
+
console.log(` - Sections: ${stat.metadata.totalSections}`);
|
|
113
|
+
console.log(` - Dimensions: ${stat.metadata.vectorDimensions}`);
|
|
114
|
+
console.log(` - Taille: ${stat.metadata.indexSize}`);
|
|
115
|
+
}
|
|
116
|
+
if (stat.error) {
|
|
117
|
+
console.log(` - Erreur: ${stat.error}`);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
// Exemple de recherche (nécessite des RAG construits)
|
|
121
|
+
try {
|
|
122
|
+
const results = await searchInDefaultRAG(ragManager, 'procédure de réparation', {
|
|
123
|
+
neighbors: 3,
|
|
124
|
+
debug: true
|
|
125
|
+
});
|
|
126
|
+
console.log(`🔍 Résultats de recherche: ${results.results.length} trouvés`);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
console.log('⚠️ Recherche impossible (RAG non construit):', error instanceof Error ? error.message : error);
|
|
130
|
+
}
|
|
131
|
+
// Exemple de recherche dans un RAG spécifique
|
|
132
|
+
const availableRAGs = rags.filter((r) => r.status === 'active');
|
|
133
|
+
if (availableRAGs.length > 0) {
|
|
134
|
+
const targetRAG = availableRAGs[0].name;
|
|
135
|
+
console.log(`🎯 Recherche dans '${targetRAG}': "maintenance"`);
|
|
136
|
+
try {
|
|
137
|
+
const results = await searchInRAG(ragManager, targetRAG, 'maintenance', {
|
|
138
|
+
neighbors: 2,
|
|
139
|
+
debug: true
|
|
140
|
+
});
|
|
141
|
+
console.log(`✅ ${results.results.length} résultats dans '${targetRAG}'`);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
console.log(`⚠️ Erreur: ${error instanceof Error ? error.message : error}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
console.log('⚠️ Aucun RAG actif disponible pour la recherche');
|
|
149
|
+
}
|
|
150
|
+
console.log('\n🎉 Exemple terminé !');
|
|
151
|
+
}
|