agentic-api 2.0.31 → 2.0.491
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 +44 -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 +11 -3
- package/dist/src/agents/simulator.executor.d.ts +14 -4
- package/dist/src/agents/simulator.executor.js +81 -23
- package/dist/src/agents/simulator.js +128 -42
- package/dist/src/agents/simulator.prompts.d.ts +9 -7
- package/dist/src/agents/simulator.prompts.js +66 -86
- package/dist/src/agents/simulator.types.d.ts +23 -5
- package/dist/src/agents/simulator.utils.d.ts +7 -2
- package/dist/src/agents/simulator.utils.js +31 -11
- package/dist/src/agents/system.js +1 -2
- package/dist/src/execute/helpers.d.ts +75 -0
- package/dist/src/execute/helpers.js +139 -0
- package/dist/src/execute/index.d.ts +11 -0
- package/dist/src/execute/index.js +44 -0
- package/dist/src/execute/legacy.d.ts +46 -0
- package/dist/src/execute/legacy.js +460 -0
- package/dist/src/execute/modelconfig.d.ts +19 -0
- package/dist/src/execute/modelconfig.js +56 -0
- package/dist/src/execute/responses.d.ts +55 -0
- package/dist/src/execute/responses.js +594 -0
- package/dist/src/execute/shared.d.ts +83 -0
- package/dist/src/execute/shared.js +188 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/{princing.openai.d.ts → pricing.llm.d.ts} +6 -0
- package/dist/src/pricing.llm.js +255 -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 +131 -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 +1390 -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 +22 -2
- package/dist/src/rules/git/git.health.d.ts +61 -2
- package/dist/src/rules/git/git.health.js +333 -11
- package/dist/src/rules/git/index.d.ts +2 -2
- package/dist/src/rules/git/index.js +13 -1
- package/dist/src/rules/git/repo.d.ts +160 -0
- package/dist/src/rules/git/repo.js +777 -0
- package/dist/src/rules/git/repo.pr.js +117 -13
- 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 +27 -14
- package/dist/src/rules/utils.matter.d.ts +0 -4
- package/dist/src/rules/utils.matter.js +35 -7
- package/dist/src/scrapper.d.ts +15 -22
- package/dist/src/scrapper.js +58 -110
- package/dist/src/stategraph/index.d.ts +1 -1
- package/dist/src/stategraph/stategraph.d.ts +56 -2
- package/dist/src/stategraph/stategraph.js +134 -6
- package/dist/src/stategraph/stategraph.storage.js +8 -0
- package/dist/src/stategraph/types.d.ts +27 -0
- package/dist/src/types.d.ts +46 -9
- package/dist/src/types.js +8 -7
- 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 +87 -129
- package/package.json +10 -3
- 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/execute.d.ts +0 -49
- package/dist/src/execute.js +0 -564
- 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,81 @@ 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
|
+
console.log(`\n 🔧 Embeddings.update() appelé`);
|
|
194
|
+
console.log(` Ancien baseDir: ${oldConfig.baseDir}`);
|
|
195
|
+
console.log(` Nouveau baseDir: ${newConfig.baseDir}`);
|
|
196
|
+
try {
|
|
197
|
+
// Mettre à jour la configuration
|
|
198
|
+
this.config = newConfig;
|
|
199
|
+
this.vectorsFile = path_1.default.join(newConfig.baseDir, types_1.RAG_FILES.VECTORS);
|
|
200
|
+
this.space = newConfig.dimensions || 1536;
|
|
201
|
+
this.distance = newConfig.distance || 'cosine';
|
|
202
|
+
console.log(` Nouveau vectorsFile: ${this.vectorsFile}`);
|
|
203
|
+
console.log(` Fichier existe: ${(0, fs_1.existsSync)(this.vectorsFile)}`);
|
|
204
|
+
// Recharger l'index si ce n'est pas en mode inmemory
|
|
205
|
+
if (!this.inmemory) {
|
|
206
|
+
// Vérifier que les fichiers existent
|
|
207
|
+
if (!(0, fs_1.existsSync)(this.vectorsFile)) {
|
|
208
|
+
throw new Error(`Fichier d'index manquant: ${this.vectorsFile}`);
|
|
209
|
+
}
|
|
210
|
+
console.log(` 📥 Rechargement de l'index...`);
|
|
211
|
+
// Recharger l'index
|
|
212
|
+
this.loadIndex();
|
|
213
|
+
console.log(` 📥 Rechargement des métadonnées et mapping...`);
|
|
214
|
+
// Recharger les métadonnées et le mapping
|
|
215
|
+
this.loadMetadata();
|
|
216
|
+
this.loadMapping();
|
|
217
|
+
console.log(` ✅ Embedding mis à jour avec nouvelle config: ${newConfig.baseDir}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
// Rollback en cas d'erreur
|
|
222
|
+
console.error('❌ Erreur lors de la mise à jour de l\'embedding, rollback:', error);
|
|
223
|
+
this.config = oldConfig;
|
|
224
|
+
this.vectorsFile = oldVectorsFile;
|
|
225
|
+
this.space = oldConfig.dimensions || 1536;
|
|
226
|
+
this.distance = oldConfig.distance || 'cosine';
|
|
227
|
+
// Essayer de recharger l'ancienne config
|
|
228
|
+
try {
|
|
229
|
+
if (!this.inmemory && (0, fs_1.existsSync)(this.vectorsFile)) {
|
|
230
|
+
this.loadIndex();
|
|
231
|
+
this.loadMetadata();
|
|
232
|
+
this.loadMapping();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (rollbackError) {
|
|
236
|
+
console.error('❌ Erreur critique lors du rollback:', rollbackError);
|
|
237
|
+
// Réinitialiser complètement en dernier recours
|
|
238
|
+
this.resetKnn();
|
|
239
|
+
}
|
|
240
|
+
throw new Error(`Impossible de mettre à jour l'embedding: ${error}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
207
243
|
/**
|
|
208
244
|
* Réinitialise l'index
|
|
209
245
|
*/
|
|
@@ -215,13 +251,18 @@ class Embeddings {
|
|
|
215
251
|
/**
|
|
216
252
|
* Crée un nouvel index HierarchicalNSW avec documents parsés
|
|
217
253
|
* ou met à jour l'index existant avec de nouveaux documents
|
|
254
|
+
*
|
|
255
|
+
* @returns IndexBuildResult contenant les données nécessaires pour créer les métadonnées RAG
|
|
256
|
+
*
|
|
257
|
+
* Note: Cette méthode ne sauvegarde plus les métadonnées directement.
|
|
258
|
+
* RAGManager est responsable de créer et sauvegarder les métadonnées
|
|
259
|
+
* à partir du résultat retourné.
|
|
218
260
|
*/
|
|
219
261
|
async indexFromDocuments(documents, options) {
|
|
220
262
|
const ef = options?.ef || this.config.hnswConfig?.ef || 200;
|
|
221
263
|
const m = options?.m || this.config.hnswConfig?.m || 32;
|
|
222
264
|
const isUpdate = options?.update || false;
|
|
223
265
|
const prepare = options?.prepare || ((input) => input);
|
|
224
|
-
let startId = this.config.startId || 1000;
|
|
225
266
|
const openai = (0, utils_1.openaiInstance)();
|
|
226
267
|
const vectors = {};
|
|
227
268
|
const documentRefs = {};
|
|
@@ -230,19 +271,19 @@ class Embeddings {
|
|
|
230
271
|
if (isUpdate && this.mapping && this.metadata) {
|
|
231
272
|
Object.assign(documentRefs, this.mapping.mapping);
|
|
232
273
|
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
274
|
}
|
|
237
|
-
|
|
275
|
+
if (this.debug)
|
|
276
|
+
console.log(`Traitement de ${documents.length} documents...`);
|
|
238
277
|
for (const doc of documents) {
|
|
239
278
|
const filename = path_1.default.basename(doc.filename, path_1.default.extname(doc.filename));
|
|
240
279
|
process.stdout.write(`Traitement: ${filename}`);
|
|
241
|
-
const { sections } = doc;
|
|
280
|
+
const { sections, matter } = doc;
|
|
242
281
|
if (!sections.length) {
|
|
243
282
|
console.log(`❌ Aucune section trouvée dans ${filename}`);
|
|
244
283
|
continue;
|
|
245
284
|
}
|
|
285
|
+
// ID de base du document
|
|
286
|
+
const baseId = matter.id;
|
|
246
287
|
// Traiter chaque section
|
|
247
288
|
for (let index = 0; index < sections.length; index++) {
|
|
248
289
|
const section = sections[index];
|
|
@@ -250,10 +291,14 @@ class Embeddings {
|
|
|
250
291
|
if (!hasEnoughContent) {
|
|
251
292
|
continue;
|
|
252
293
|
}
|
|
294
|
+
// ✅ NOUVEAU: ID calculé = matter.id * 100 + sectionIndex
|
|
295
|
+
// Permet de supprimer facilement toutes les sections d'un document
|
|
296
|
+
// en recherchant les IDs entre (matter.id * 100) et (matter.id * 100 + 99)
|
|
297
|
+
// Limite: 100 sections par document (0-99)
|
|
298
|
+
const vectorId = baseId * 100 + index;
|
|
253
299
|
// Vérifier si cette section existe déjà (pour les mises à jour)
|
|
254
300
|
const ref = `${filename}#section-${index}`;
|
|
255
|
-
|
|
256
|
-
if (isUpdate && existingId) {
|
|
301
|
+
if (isUpdate && documentRefs[vectorId]) {
|
|
257
302
|
console.log(`Section ${ref} déjà indexée, ignorée`);
|
|
258
303
|
continue;
|
|
259
304
|
}
|
|
@@ -266,24 +311,19 @@ class Embeddings {
|
|
|
266
311
|
});
|
|
267
312
|
const normalizedVectors = (0, parser_1.l2Normalize)(embedding.data[0].embedding);
|
|
268
313
|
// Stocker avec le nouveau format d'ID
|
|
269
|
-
vectors[
|
|
270
|
-
documentRefs[
|
|
314
|
+
vectors[vectorId] = normalizedVectors;
|
|
315
|
+
documentRefs[vectorId] = ref;
|
|
271
316
|
// Créer la référence de document
|
|
272
|
-
documentReferences[
|
|
317
|
+
documentReferences[vectorId] = {
|
|
273
318
|
filename: filename + '.md',
|
|
274
319
|
sectionIndex: index,
|
|
275
320
|
ref,
|
|
276
321
|
title: section.title || `Section ${index}`,
|
|
277
322
|
content: section.content,
|
|
278
|
-
metadata:
|
|
323
|
+
metadata: matter
|
|
279
324
|
};
|
|
280
|
-
startId++;
|
|
281
325
|
process.stdout.write(hasEnoughContent ? ':' : '.');
|
|
282
326
|
}
|
|
283
|
-
//
|
|
284
|
-
// let enough room for new sections on future updates
|
|
285
|
-
const pad = 20 - sections.length;
|
|
286
|
-
startId += pad;
|
|
287
327
|
console.log(' done');
|
|
288
328
|
}
|
|
289
329
|
// Créer ou mettre à jour l'index HierarchicalNSW
|
|
@@ -308,16 +348,13 @@ class Embeddings {
|
|
|
308
348
|
}
|
|
309
349
|
}
|
|
310
350
|
else {
|
|
311
|
-
//
|
|
312
|
-
// FIXME this is not working, ids must be restored from de RAGMapping ids <=> documentRefs
|
|
313
|
-
// Mettre à jour l'index existant
|
|
351
|
+
// Mettre à jour l'index existant avec de nouveaux vecteurs
|
|
314
352
|
console.log(`Mise à jour de l'index avec ${newVectors.length} nouveaux vecteurs`);
|
|
315
|
-
const replaceDeleted = true;
|
|
316
353
|
for (const item of newVectors) {
|
|
317
354
|
const id = parseInt(item);
|
|
318
|
-
//
|
|
319
|
-
|
|
320
|
-
this.vectorsIndex.addPoint(vectors[item], id
|
|
355
|
+
// Pour les nouveaux vecteurs, on les ajoute simplement sans markDelete
|
|
356
|
+
// car ils n'existaient pas auparavant dans l'index
|
|
357
|
+
this.vectorsIndex.addPoint(vectors[item], id);
|
|
321
358
|
}
|
|
322
359
|
}
|
|
323
360
|
// Sauvegarder l'index
|
|
@@ -328,26 +365,14 @@ class Embeddings {
|
|
|
328
365
|
// Créer le tag de version
|
|
329
366
|
const tag = this.config.tag || (0, types_1.generateVersionTag)();
|
|
330
367
|
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 = {
|
|
368
|
+
// ✅ Assigner les métadonnées en mémoire pour que les méthodes comme listDocumentsOnRAG() fonctionnent
|
|
369
|
+
// Même si on ne sauvegarde plus sur disque, les données doivent être en mémoire
|
|
370
|
+
this.metadata = {
|
|
342
371
|
version,
|
|
343
372
|
tag,
|
|
344
373
|
createdAt: new Date().toISOString(),
|
|
345
374
|
config: this.config,
|
|
346
375
|
documents: documentReferences,
|
|
347
|
-
checkpoint: {
|
|
348
|
-
branch: options?.branch || '',
|
|
349
|
-
hash: options?.lastCommit || ''
|
|
350
|
-
},
|
|
351
376
|
stats: {
|
|
352
377
|
totalDocuments: documents.length,
|
|
353
378
|
totalSections: totalVectors,
|
|
@@ -360,7 +385,22 @@ class Embeddings {
|
|
|
360
385
|
queriesFile: types_1.RAG_FILES.QUERIES
|
|
361
386
|
}
|
|
362
387
|
};
|
|
363
|
-
this.
|
|
388
|
+
this.mapping = {
|
|
389
|
+
type: 'mapping',
|
|
390
|
+
version,
|
|
391
|
+
tag,
|
|
392
|
+
mapping: documentRefs,
|
|
393
|
+
createdAt: new Date().toISOString()
|
|
394
|
+
};
|
|
395
|
+
// ✅ Retourner les données pour que RAGManager gère les métadonnées sur disque
|
|
396
|
+
return {
|
|
397
|
+
totalVectors,
|
|
398
|
+
vectorDimensions: this.space,
|
|
399
|
+
documents: documentReferences,
|
|
400
|
+
mapping: documentRefs,
|
|
401
|
+
tag,
|
|
402
|
+
version
|
|
403
|
+
};
|
|
364
404
|
}
|
|
365
405
|
/**
|
|
366
406
|
* Charge l'index HierarchicalNSW existant
|
|
@@ -414,46 +454,9 @@ class Embeddings {
|
|
|
414
454
|
}
|
|
415
455
|
}
|
|
416
456
|
}
|
|
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
|
-
}
|
|
457
|
+
// ❌ SUPPRIMÉ : saveMetadata() et saveMapping()
|
|
458
|
+
// Ces méthodes ont été déplacées vers RAGManager pour une meilleure séparation des responsabilités
|
|
459
|
+
// RAGManager est maintenant responsable de la gestion complète du cycle de vie des métadonnées
|
|
457
460
|
/**
|
|
458
461
|
* Récupère un vecteur depuis l'index existant (pour les mises à jour)
|
|
459
462
|
*/
|
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>;
|