agentic-api 2.0.314 → 2.0.585
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -34
- package/dist/src/agents/prompts.d.ts +1 -1
- package/dist/src/agents/prompts.js +9 -7
- package/dist/src/agents/reducer.core.js +2 -2
- package/dist/src/agents/simulator.d.ts +33 -4
- package/dist/src/agents/simulator.dashboard.d.ts +140 -0
- package/dist/src/agents/simulator.dashboard.js +344 -0
- package/dist/src/agents/simulator.executor.d.ts +9 -3
- package/dist/src/agents/simulator.executor.js +43 -17
- package/dist/src/agents/simulator.js +103 -19
- package/dist/src/agents/simulator.prompts.d.ts +9 -8
- package/dist/src/agents/simulator.prompts.js +68 -62
- package/dist/src/agents/simulator.types.d.ts +39 -4
- package/dist/src/agents/simulator.utils.d.ts +22 -1
- package/dist/src/agents/simulator.utils.js +27 -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.js → execute/legacy.js} +130 -232
- package/dist/src/execute/modelconfig.d.ts +29 -0
- package/dist/src/execute/modelconfig.js +72 -0
- package/dist/src/execute/responses.d.ts +55 -0
- package/dist/src/execute/responses.js +595 -0
- package/dist/src/execute/shared.d.ts +83 -0
- package/dist/src/execute/shared.js +188 -0
- package/dist/src/index.d.ts +5 -1
- package/dist/src/index.js +21 -2
- package/dist/src/llm/config.d.ts +25 -0
- package/dist/src/llm/config.js +38 -0
- package/dist/src/llm/index.d.ts +48 -0
- package/dist/src/llm/index.js +115 -0
- package/dist/src/llm/openai.d.ts +6 -0
- package/dist/src/llm/openai.js +154 -0
- package/dist/src/llm/pricing.d.ts +26 -0
- package/dist/src/llm/pricing.js +129 -0
- package/dist/src/llm/xai.d.ts +17 -0
- package/dist/src/llm/xai.js +90 -0
- package/dist/src/pricing.llm.d.ts +3 -15
- package/dist/src/pricing.llm.js +10 -230
- package/dist/src/prompts.d.ts +0 -1
- package/dist/src/prompts.js +51 -118
- package/dist/src/rag/embeddings.d.ts +5 -1
- package/dist/src/rag/embeddings.js +23 -7
- package/dist/src/rag/parser.js +1 -1
- package/dist/src/rag/rag.manager.d.ts +33 -2
- package/dist/src/rag/rag.manager.js +159 -61
- package/dist/src/rag/types.d.ts +2 -0
- package/dist/src/rag/usecase.js +8 -11
- package/dist/src/rules/git/git.e2e.helper.js +21 -2
- package/dist/src/rules/git/git.health.d.ts +4 -2
- package/dist/src/rules/git/git.health.js +113 -16
- package/dist/src/rules/git/index.d.ts +1 -1
- package/dist/src/rules/git/index.js +3 -2
- package/dist/src/rules/git/repo.d.ts +57 -7
- package/dist/src/rules/git/repo.js +326 -39
- package/dist/src/rules/git/repo.pr.d.ts +8 -0
- package/dist/src/rules/git/repo.pr.js +161 -13
- package/dist/src/rules/git/repo.tools.d.ts +5 -1
- package/dist/src/rules/git/repo.tools.js +54 -7
- package/dist/src/rules/types.d.ts +25 -0
- package/dist/src/rules/utils.matter.d.ts +0 -20
- package/dist/src/rules/utils.matter.js +58 -81
- package/dist/src/scrapper.js +3 -2
- package/dist/src/stategraph/stategraph.d.ts +26 -1
- package/dist/src/stategraph/stategraph.js +43 -2
- package/dist/src/stategraph/stategraph.storage.js +4 -0
- package/dist/src/stategraph/types.d.ts +5 -0
- package/dist/src/types.d.ts +42 -7
- package/dist/src/types.js +8 -7
- package/dist/src/usecase.js +1 -1
- package/dist/src/utils.d.ts +0 -8
- package/dist/src/utils.js +26 -29
- package/package.json +9 -7
- package/dist/src/execute.d.ts +0 -63
package/dist/src/prompts.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.usecaseExtractionPrompt = exports.
|
|
3
|
+
exports.usecaseExtractionPrompt = exports.htmlToMarkdownPrompt = exports.textToMarkdownPrompt = exports.defaultOutputPrompt = exports.transferAgentPromptHandoff = exports.transferAgentPromptStructured = exports.transferAgentPrompt = exports.transferAgentPrompt__ = exports.transferAgentPrompt_ = void 0;
|
|
4
4
|
exports.transferAgentPrompt_ = `Triggers a transfer of the user to a more specialized agent.
|
|
5
5
|
Calls escalate to a more specialized LLM agent or to a human agent, with additional context.
|
|
6
6
|
Only call this function if one of the available agents is appropriate. Don't transfer to your own agent type.
|
|
@@ -242,130 +242,63 @@ owner: {owner}
|
|
|
242
242
|
|
|
243
243
|
|
|
244
244
|
`;
|
|
245
|
-
const
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
- Ta mission est de créer une série de tests exhaustifs pour valider que le RAG couvre à 100% le contenu des procédures de l'entreprise.
|
|
249
|
-
- Produire des questions à un coût important, tu dois être efficace, tu dois capturer un maximum de détails ( action, objet, bénéficiaire, contexte) avec un minimum de questions (maximum 4):
|
|
250
|
-
Une question peut concerner l'utilisation précise d'un logiciel ou un article précis de réglementation.
|
|
251
|
-
Chaque question doit satisfaire ces critères: clairement identifier le problème à résoudre ou l'action souhaitée dans le domaine précis du document fourni, doit être spécifique et ne peut pas être ambiguë.
|
|
252
|
-
Tu DOIS supprimer du résultat les questions génériques qui non spécifiques au contexte métier du document.
|
|
253
|
-
Toutes les questions que tu vas créer concernent précisément le document fourni en INPUT ci-dessous.
|
|
254
|
-
- Pour orienter la formulation des questions, je te fournis quelques exemples de questions réelles.
|
|
255
|
-
- En moyenne, chaque question doit être au maximum de 15 mots, mais tu peux en produire aussi des plus courtes (20%) pour élargir le champ des tests.
|
|
256
|
-
- La réponse contient la liste de mots très spécifiques pour chaque section de la procédure séparés par des virgules.
|
|
257
|
-
- Si la réponse concerne un schéma, une procédure ou l'utilisation d'un logiciel, tu dois décrire le besoin spécifique.
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
# EXEMPLES de formulation utilisées par les collaborateurs l'entreprise (attention à ne pas utiliser ces exemples si le sujet du INPUT´est différent).
|
|
261
|
-
- Écoulement bouché, que faire ?
|
|
262
|
-
- J’ai une fuite depuis le plafond de ma chambre, j’aimerais un sanitaire
|
|
263
|
-
- Mon frigo ne fonctionne pas, pouvez-vous mandater quelqu’un ?
|
|
264
|
-
- Mon store est resté bloqué, pouvez-vous faire quelque chose ?
|
|
265
|
-
- J’aimerais faire reproduire des clés, comment faire ? combien ça coûte ?
|
|
266
|
-
- Je suis fournisseur, ma facture n’est toujours pas payée par Pilet & Renaud.
|
|
267
|
-
- J’ai payé mon loyer, mais j’ai reçu un rappel, pourquoi ?
|
|
268
|
-
- Je paie toujours bien mon loyer, pouvez-vous supprimer les frais de rappel c’est la première fois que j’ai du retard.
|
|
269
|
-
- Est-ce que cet appartement est toujours disponible ? Comment déposer un dossier?
|
|
270
|
-
- Est-ce que mon dossier de candidature est retenu ? j’aimerais des infos.
|
|
271
|
-
- Inscription de korkmaz?
|
|
272
|
-
- J’ai reçu un appel manqué de la régie mais je ne sais pas qui a tenté de me joindre.
|
|
273
|
-
- Un fournisseur me dit que sa facture n’est toujours pas payée par Pilet & Renaud. Comment je vérifie ça?
|
|
274
|
-
- Comment créer un bon ?
|
|
275
|
-
- Quelles sont les tâches à faire après avoir conclu un contrat d’entretien ?
|
|
276
|
-
- Une entreprise souhaite travailler avec nous, que dois-je faire ?
|
|
277
|
-
|
|
278
|
-
# QUESTIONS A EVITER: Les exemples qui ne sont pas pertinents pour le RAG (les documents sont tous concernés par ces questions, c'est donc inutile de les inclure dans les tests).
|
|
279
|
-
- Ce document contient-il des liens externes ?
|
|
280
|
-
- Cette absence de liens affecte-t-elle la validité du document ?
|
|
281
|
-
- Qui doit valider les changements dans la procédure ?
|
|
282
|
-
- Comment valider une modification de procédure ?
|
|
283
|
-
|
|
284
|
-
# DICTIONNAIRE (jargon de l'entreprise):
|
|
285
|
-
- Logiciels Spécifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.
|
|
286
|
-
- SGC: Service de Gestion de la Clientèle
|
|
287
|
-
- GED: service qui gère le scan des documents, la mise sous plis, l’économat, le réassort des salles de pauses, la saisie des données pour orienter les documents dans M-Files
|
|
288
|
-
- MED: Mise en demeure.
|
|
289
|
-
- WC: Toilettes.
|
|
290
|
-
- M-Files: logiciel de gestion de documents
|
|
291
|
-
- PR ou PRSA: Pilet & Renaud SA
|
|
292
|
-
- PPE: Service qui gère les copropriétés.
|
|
293
|
-
- GP: Garantie Bancaire
|
|
294
|
-
- BAL: Boite à Lettre
|
|
295
|
-
- DD: Arrangement de paiement pour facture due mais qui n’est pas du loyer.
|
|
296
|
-
- copro: copropriétaire (attention à ne pas confondre avec gopros)
|
|
297
|
-
- un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, création de bons, bons, etc).
|
|
298
|
-
- La Date à jour Locataire: le dernier mois qui a été payé par le locataire.
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
# OUTPUT INSTRUCTIONS
|
|
302
|
-
- Tu dois produire un JSON strict avec les champs suivants:
|
|
303
|
-
\`\`\`JSON
|
|
304
|
-
{
|
|
305
|
-
"source": "string",
|
|
306
|
-
"file": "${file}",
|
|
307
|
-
"queries": [{ "question": "string" }, ...]
|
|
308
|
-
}
|
|
309
|
-
\`\`\`
|
|
310
|
-
|
|
311
|
-
INPUT:
|
|
312
|
-
`;
|
|
313
|
-
exports.usecaseExtractionPrompt_OLD = usecaseExtractionPrompt_OLD;
|
|
314
|
-
const usecaseExtractionPrompt = (file, options = {}) => `# RÔLE:
|
|
315
|
-
- Tu es un expert en tests unitaires.
|
|
245
|
+
const usecaseExtractionPrompt = (file, options = {}) => `# RÔLE
|
|
246
|
+
- Tu es un collaborateur expérimenté qui aide ses collègues à formuler des questions métier courtes, naturelles et très concrètes.
|
|
247
|
+
- Tu adoptes le point de vue d’un collègue interne qui pose une question précise sur une procédure donnée (INPUT).
|
|
316
248
|
- Le corpus de procédures est indexé (RAG).
|
|
317
|
-
- Tu adoptes le point de vue de l'utilisateur (un collègue interne qui pose une question métier précise à son voisin).
|
|
318
|
-
- Tu génères des **questions discriminantes** testant la **couverture RAG** d’une procédure ou marche à suivre.
|
|
319
|
-
|
|
320
|
-
# Structure du document en INPUT pour l'extraction des use cases
|
|
321
|
-
- **Titre principal** → unique dans le corpus (très important).
|
|
322
|
-
- **Intervenants** → Acteur(s) et Bénéficiaire(s) (distincts) de la procédure.
|
|
323
|
-
- **Sections** → Titre unique dans la procédure (très important).
|
|
324
|
-
- **ÉTAPES / ACTIONS** → action/règle/décision importante
|
|
325
|
-
- **RÉSULTAT** → finalité/effet attendu
|
|
326
|
-
- **UI/PATH** → chemin/interface (Système > Module > Action)
|
|
327
249
|
|
|
250
|
+
# Structure du document en INPUT
|
|
251
|
+
- **Titre principal** → unique dans le corpus décrit l'object métier (le “concept central” de la section).
|
|
252
|
+
- **Intervenants** → acteur(s) et bénéficiaire(s).
|
|
253
|
+
- **Sections** → titre unique dans la procédure.
|
|
254
|
+
- **ÉTAPES / ACTIONS / TABLEAUX**
|
|
255
|
+
- **RÉSULTAT**
|
|
256
|
+
- **LOGICIEL**
|
|
328
257
|
|
|
329
258
|
# MISSION
|
|
330
|
-
-
|
|
331
|
-
- Chaque question = **un use-case
|
|
332
|
-
-
|
|
333
|
-
|
|
334
|
-
-
|
|
335
|
-
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
-
|
|
359
|
-
-
|
|
360
|
-
-
|
|
361
|
-
|
|
362
|
-
|
|
259
|
+
- Générer des **questions ultra-spécifiques**, strictement liées au document INPUT.
|
|
260
|
+
- Chaque question = **un use-case métier concret**, issu d’**une seule section**
|
|
261
|
+
- **L’objet métier mentionné dans le \`Titre:\` de la section doit apparaître explicitement dans chaque question**.
|
|
262
|
+
Titre : l’ACTION, l’OBJET métier et le BÉNÉFICIAIRE (seul 2/3 éléments sont obligatoires).
|
|
263
|
+
- Pour les logiciels, toujours partir de la fonction recherchée et du nom du logiciel pour trouver la marche à suivre. "Comment faire avec X pour Y..."
|
|
264
|
+
- La question peut faire référence à des **valeurs concrètes** recherchées (montant, échéance, TVA, etc.) pour renforcer la spécificité.
|
|
265
|
+
|
|
266
|
+
# DIRECTIVES SUPPLÉMENTAIRES POUR LES TABLES MARKDOWN
|
|
267
|
+
- Pour une section contenant un tableau, chaque question doit viser à extraire **uniquement la valeur d’une cellule précise** : montant, condition ou date. (ces valeurs ne sont jamais mentionnées dans la question)
|
|
268
|
+
- La question doit intégrer explicitement l’objet métier du \`Titre:\` de la section (le "concept central").
|
|
269
|
+
- Interdiction de mentionner le tableau, ses colonnes, ou ses cellules.
|
|
270
|
+
|
|
271
|
+
# LIMITES pour éviter la surcharge de questions.
|
|
272
|
+
- Limite Maximum de 5 questions par section de 20 lignes
|
|
273
|
+
- Questions **courtes, naturelles, humaines**, acronymes autorisés (contraindre la formulation à ≈ 10-16 mots maximum - hard limit).
|
|
274
|
+
- Chaque question concerne un seul objet métier et une seule réponse attendue sans exception.
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
# STYLE (strict)
|
|
278
|
+
- La question doit ressembler à ce qu’un collègue dirait oralement : simple, directe.
|
|
279
|
+
- Démarrer par **« Je dois… »**, **« Comment… »** ou **« Pour… »** (forme interrogative).
|
|
280
|
+
- Interdiction des formulations vagues ou a objectifs multiples : toujours nommer l'objet métier.
|
|
281
|
+
- Priorité : **spécificité** → **clarté** → **brièveté** (dans cet ordre).
|
|
282
|
+
|
|
283
|
+
# ❌ Interdictions absolues
|
|
284
|
+
- Jamais utiliser les labels ou préfixes suivants : «Pour ce use-case», «En tant que», «Section», «Étapes», «Résultat», «UI/PATH», «Tag», «Validation».
|
|
285
|
+
- Questions génériques (“Que faire si… ?” sans objet métier).
|
|
286
|
+
- Questions parlant d’un autre système ou d’un cas hors procédure.
|
|
287
|
+
- Formulations abstraites : “la phrase correspondante”, “le texte”, “le document” sans préciser.
|
|
288
|
+
- Ne jamais mentionner "En tant que Collaborateurs..." dans la question, c'est le rôle par défaut de l'utilisateur.
|
|
289
|
+
- Pas d’exemples hors métier (suppression du gabarit lavabo).
|
|
290
|
+
|
|
291
|
+
# Gabarits simplifiés (optionnels)
|
|
292
|
+
- « La comptabilité doit [action métier] pour [fonction métier]. »
|
|
293
|
+
- « Je dois [action métier] pour [fonction métier]. »
|
|
294
|
+
- « Comment [action courte] sur [document/objet métier] ? »
|
|
295
|
+
- « Pour [objectif précis], où saisir [champ] dans [logiciel] ? »
|
|
296
|
+
- « un client veut [objectif métier précis]. »
|
|
363
297
|
|
|
364
298
|
${options.extended}
|
|
365
299
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
- Tu dois produire un JSON strict avec les champs suivants:
|
|
300
|
+
# OUTPUT
|
|
301
|
+
- Retourner un JSON strict sans mofifier le nom du fichier :
|
|
369
302
|
\`\`\`JSON
|
|
370
303
|
{
|
|
371
304
|
"file": "${file}",
|
|
@@ -17,6 +17,7 @@ export declare class Embeddings {
|
|
|
17
17
|
private debug;
|
|
18
18
|
private metadata;
|
|
19
19
|
private mapping;
|
|
20
|
+
private provider;
|
|
20
21
|
constructor(config: RAGConfig);
|
|
21
22
|
/**
|
|
22
23
|
* Extrait et sauvegarde les use cases d'un document
|
|
@@ -45,7 +46,10 @@ export declare class Embeddings {
|
|
|
45
46
|
*/
|
|
46
47
|
searchKnn(vectors: number[], options?: EmbeddingsSearchOptions): RAGSearchResult;
|
|
47
48
|
/**
|
|
48
|
-
* Recherche sémantique avec
|
|
49
|
+
* Recherche sémantique avec le provider de l'embedding
|
|
50
|
+
* @param question La question à rechercher
|
|
51
|
+
* @param options Options de recherche
|
|
52
|
+
* @returns Les résultats de la recherche
|
|
49
53
|
*/
|
|
50
54
|
semanticSearch(question: string, options?: EmbeddingsSearchOptions): Promise<RAGSearchResult>;
|
|
51
55
|
/**
|
|
@@ -10,6 +10,8 @@ const path_1 = __importDefault(require("path"));
|
|
|
10
10
|
const types_1 = require("./types");
|
|
11
11
|
const parser_1 = require("./parser");
|
|
12
12
|
const utils_1 = require("../utils");
|
|
13
|
+
const llm_1 = require("../llm");
|
|
14
|
+
const modelconfig_1 = require("../execute/modelconfig");
|
|
13
15
|
const usecase_1 = require("./usecase");
|
|
14
16
|
class Embeddings {
|
|
15
17
|
constructor(config) {
|
|
@@ -22,6 +24,7 @@ class Embeddings {
|
|
|
22
24
|
this.distance = config.distance || 'cosine';
|
|
23
25
|
this.inmemory = config.inmemory || false;
|
|
24
26
|
this.debug = false;
|
|
27
|
+
this.provider = config.provider || 'openai';
|
|
25
28
|
// Charger l'index existant si disponible et pas en mode inmemory
|
|
26
29
|
if (!this.inmemory && (0, fs_1.existsSync)(this.vectorsFile)) {
|
|
27
30
|
this.loadIndex();
|
|
@@ -127,14 +130,19 @@ class Embeddings {
|
|
|
127
130
|
};
|
|
128
131
|
}
|
|
129
132
|
/**
|
|
130
|
-
* Recherche sémantique avec
|
|
133
|
+
* Recherche sémantique avec le provider de l'embedding
|
|
134
|
+
* @param question La question à rechercher
|
|
135
|
+
* @param options Options de recherche
|
|
136
|
+
* @returns Les résultats de la recherche
|
|
131
137
|
*/
|
|
132
138
|
async semanticSearch(question, options = {}) {
|
|
133
139
|
const startTime = Date.now();
|
|
134
|
-
const
|
|
140
|
+
const provider = this.provider;
|
|
141
|
+
const openai = (0, llm_1.llmInstance)({ provider });
|
|
142
|
+
const embeddingConfig = (0, modelconfig_1.modelConfig)("EMBEDDING-small", { provider });
|
|
135
143
|
// Créer l'embedding de la question
|
|
136
144
|
const embedding = await openai.embeddings.create({
|
|
137
|
-
model:
|
|
145
|
+
model: embeddingConfig.model,
|
|
138
146
|
input: question,
|
|
139
147
|
dimensions: this.space,
|
|
140
148
|
encoding_format: 'float',
|
|
@@ -190,25 +198,31 @@ class Embeddings {
|
|
|
190
198
|
// Sauvegarder l'ancienne config pour rollback en cas d'erreur
|
|
191
199
|
const oldConfig = this.config;
|
|
192
200
|
const oldVectorsFile = this.vectorsFile;
|
|
201
|
+
console.log(`\n 🔧 Embeddings.update() appelé`);
|
|
202
|
+
console.log(` Ancien baseDir: ${oldConfig.baseDir}`);
|
|
203
|
+
console.log(` Nouveau baseDir: ${newConfig.baseDir}`);
|
|
193
204
|
try {
|
|
194
205
|
// Mettre à jour la configuration
|
|
195
206
|
this.config = newConfig;
|
|
196
207
|
this.vectorsFile = path_1.default.join(newConfig.baseDir, types_1.RAG_FILES.VECTORS);
|
|
197
208
|
this.space = newConfig.dimensions || 1536;
|
|
198
209
|
this.distance = newConfig.distance || 'cosine';
|
|
210
|
+
console.log(` Nouveau vectorsFile: ${this.vectorsFile}`);
|
|
211
|
+
console.log(` Fichier existe: ${(0, fs_1.existsSync)(this.vectorsFile)}`);
|
|
199
212
|
// Recharger l'index si ce n'est pas en mode inmemory
|
|
200
213
|
if (!this.inmemory) {
|
|
201
214
|
// Vérifier que les fichiers existent
|
|
202
215
|
if (!(0, fs_1.existsSync)(this.vectorsFile)) {
|
|
203
216
|
throw new Error(`Fichier d'index manquant: ${this.vectorsFile}`);
|
|
204
217
|
}
|
|
218
|
+
console.log(` 📥 Rechargement de l'index...`);
|
|
205
219
|
// Recharger l'index
|
|
206
220
|
this.loadIndex();
|
|
221
|
+
console.log(` 📥 Rechargement des métadonnées et mapping...`);
|
|
207
222
|
// Recharger les métadonnées et le mapping
|
|
208
223
|
this.loadMetadata();
|
|
209
224
|
this.loadMapping();
|
|
210
|
-
|
|
211
|
-
console.log(`✅ Embedding mis à jour avec nouvelle config: ${newConfig.baseDir}`);
|
|
225
|
+
console.log(` ✅ Embedding mis à jour avec nouvelle config: ${newConfig.baseDir}`);
|
|
212
226
|
}
|
|
213
227
|
}
|
|
214
228
|
catch (error) {
|
|
@@ -257,7 +271,9 @@ class Embeddings {
|
|
|
257
271
|
const m = options?.m || this.config.hnswConfig?.m || 32;
|
|
258
272
|
const isUpdate = options?.update || false;
|
|
259
273
|
const prepare = options?.prepare || ((input) => input);
|
|
260
|
-
const
|
|
274
|
+
const provider = this.provider;
|
|
275
|
+
const openai = (0, llm_1.llmInstance)({ provider });
|
|
276
|
+
const embeddingConfig = (0, modelconfig_1.modelConfig)("EMBEDDING-small", { provider });
|
|
261
277
|
const vectors = {};
|
|
262
278
|
const documentRefs = {};
|
|
263
279
|
const documentReferences = {};
|
|
@@ -298,7 +314,7 @@ class Embeddings {
|
|
|
298
314
|
}
|
|
299
315
|
// Créer l'embedding de la section
|
|
300
316
|
const embedding = await openai.embeddings.create({
|
|
301
|
-
model:
|
|
317
|
+
model: embeddingConfig.model,
|
|
302
318
|
input: prepare(section.content),
|
|
303
319
|
dimensions: this.space,
|
|
304
320
|
encoding_format: "float",
|
package/dist/src/rag/parser.js
CHANGED
|
@@ -34,7 +34,7 @@ function getSections(content, filename) {
|
|
|
34
34
|
content = contentWithoutMatter || content;
|
|
35
35
|
//
|
|
36
36
|
// le contenu est toujours sans le front-matter!
|
|
37
|
-
const rawSections = content.split('
|
|
37
|
+
const rawSections = content.split('\n---\n').map(section => section.trim());
|
|
38
38
|
if (!rawSections.length) {
|
|
39
39
|
return {
|
|
40
40
|
filename,
|
|
@@ -161,6 +161,15 @@ export declare class RAGManager {
|
|
|
161
161
|
* ```
|
|
162
162
|
*/
|
|
163
163
|
addDocument(name: string, filename: string, content: string): void;
|
|
164
|
+
/**
|
|
165
|
+
* Marque un document comme entièrement traité (enhanced + query.json générés)
|
|
166
|
+
* Le .sha est écrit APRÈS le traitement complet pour garantir la cohérence
|
|
167
|
+
*
|
|
168
|
+
* @param name Nom du RAG
|
|
169
|
+
* @param filename Nom du fichier (ex: 'procedure.md')
|
|
170
|
+
* @param content Contenu du document traité
|
|
171
|
+
*/
|
|
172
|
+
markDocumentProcessed(name: string, filename: string, content: string): void;
|
|
164
173
|
/**
|
|
165
174
|
* Prépare un RAG enfant en copiant les documents d'un RAG parent
|
|
166
175
|
*
|
|
@@ -242,6 +251,26 @@ export declare class RAGManager {
|
|
|
242
251
|
* ```
|
|
243
252
|
*/
|
|
244
253
|
loadUseCases(name: string, filename: string): DocumentQueries;
|
|
254
|
+
/**
|
|
255
|
+
* Charge tous les use cases de tous les documents d'un RAG
|
|
256
|
+
*
|
|
257
|
+
* Utilise le fichier rag-metadata.json pour obtenir la liste des documents valides
|
|
258
|
+
* puis charge chaque fichier .query.json correspondant
|
|
259
|
+
*
|
|
260
|
+
* @param name Nom du RAG
|
|
261
|
+
* @returns Objet contenant tous les use cases par document
|
|
262
|
+
*
|
|
263
|
+
* @example
|
|
264
|
+
* ```typescript
|
|
265
|
+
* const allQueries = ragManager.loadAllUseCases('my-rag');
|
|
266
|
+
* console.log(`${Object.keys(allQueries.documents).length} documents avec use cases`);
|
|
267
|
+
* console.log(`${allQueries.totalQueries} questions au total`);
|
|
268
|
+
* ```
|
|
269
|
+
*/
|
|
270
|
+
loadAllUseCases(name: string): {
|
|
271
|
+
documents: Record<string, DocumentQueries>;
|
|
272
|
+
totalQueries: number;
|
|
273
|
+
};
|
|
245
274
|
/**
|
|
246
275
|
* Construit un RAG de manière atomique
|
|
247
276
|
*
|
|
@@ -274,7 +303,7 @@ export declare class RAGManager {
|
|
|
274
303
|
/**
|
|
275
304
|
* Supprime un RAG du registre
|
|
276
305
|
*/
|
|
277
|
-
delete(name: string, archiveFlag?: boolean): Promise<void>;
|
|
306
|
+
delete(name: string, archiveFlag?: boolean): Promise<void | Error>;
|
|
278
307
|
/**
|
|
279
308
|
* Renomme un document dans un RAG existant
|
|
280
309
|
*
|
|
@@ -306,7 +335,8 @@ export declare class RAGManager {
|
|
|
306
335
|
*/
|
|
307
336
|
private updateJSONReferences;
|
|
308
337
|
/**
|
|
309
|
-
* Renomme un RAG existant
|
|
338
|
+
* Renomme un RAG existant (nom dans le registre uniquement)
|
|
339
|
+
* Le dossier physique n'est PAS modifié, seul le nom dans la config change.
|
|
310
340
|
*
|
|
311
341
|
* @param from Nom actuel du RAG
|
|
312
342
|
* @param to Nouveau nom du RAG
|
|
@@ -316,6 +346,7 @@ export declare class RAGManager {
|
|
|
316
346
|
* @example
|
|
317
347
|
* ```typescript
|
|
318
348
|
* await ragManager.rename('old-name', 'new-name', 'Description mise à jour');
|
|
349
|
+
* // Le dossier reste /path/to/old-name mais le RAG s'appelle 'new-name'
|
|
319
350
|
* ```
|
|
320
351
|
*/
|
|
321
352
|
rename(from: string, to: string, description?: string): Promise<void>;
|