agentic-api 1.0.4 → 1.0.6

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.
@@ -3,22 +3,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Digestor = void 0;
4
4
  const fs_1 = require("fs");
5
5
  const promptPullContentDigestor = `
6
- This tool allows you to load the content of a large content, chunk by chunk, for progressive processing.
6
+ This tool processes large content with a strict **"while / until EOF"** loop.
7
7
 
8
- # Usage Instructions:
9
- - On each call, the tool returns the next chunk of the specified file, along with instructions for processing this content.
10
- - The "position" parameter indicates where to resume reading.
11
- - When all content has been processed, the tool returns "\nEOF" to signal the end of the file.
8
+ ## Core Principles
9
+ 1. The tool is called repeatedly; each call returns the **next chunk** of \`path\`.
10
+ 2. Continue calling the tool, updating \`position\`, **until** the chunk includes "EOF".
11
+ 3. **After every chunk** you **must**:
12
+ 1️⃣ send the user a brief, useful summary (or other template-based output) of that chunk
13
+ 2️⃣ immediately call \`pullContentDigestor\` again with \`position = nextPosition\`.
14
+ 4. Never skip or reorder chunks.
12
15
 
13
- # Parameters:
14
- - path (str): Absolute,relative, or inline content.
15
- - template (enum): Indicates the type of processing to apply to the chunk (e.g., "facts", "compress", "semantic", "minutes", etc).
16
- - position (str): Allows you to continue reading from the last known position.
16
+ ## Interaction Pattern (mandatory)
17
+ - assistant (content = summary of current chunk ≤ 150 words)
18
+ - assistant (function_call = pullContentDigestor, args = { path, template, position: nextPosition })
19
+ - Repeat the two messages until \`eof === true\`.
17
20
 
18
- # Best Practices:
19
- - Use this tool to process contents that are too large to be read in a single pass.
20
- - Never skip a chunk: process each piece in order and always use the last position parameter.
21
- - Stop calling the tool as soon as "EOF" (or "\nEOF") is returned.
21
+ ## Parameters
22
+ - **path** *(string)* Absolute / relative path, URL, or inline content
23
+ - **template** *(enum)* "facts" · "compress" · "semantic" · "minutes" · "custom" defines how you transform the chunk
24
+ - **position** *(number)* Byte/char offset to resume reading (0 on first call)
25
+
26
+ ## Best Practices
27
+ - Keep summaries concise and faithful to the template goal.
28
+ - Flush the summary **before** each new tool call.
29
+ - Stop looping as soon as the chunk contains **"EOF"**.
22
30
  `;
23
31
  const toolPullContentDigestor = {
24
32
  type: "function",
@@ -31,16 +39,16 @@ const toolPullContentDigestor = {
31
39
  properties: {
32
40
  path: {
33
41
  type: "string",
34
- description: "Absolute or relative path of the file to read (e.g., 'https:....html', 'file://...', 'https://.../file.pdf')."
42
+ description: "Absolute or relative path, or a unique identifier of the file to read (e.g., 'https:....html', 'file://...', 'https://.../file.pdf')."
35
43
  },
36
44
  template: {
37
45
  type: "string",
38
46
  description: "Type of processing to apply to the chunk (e.g., 'facts', 'compress', 'semantic', 'minutes').",
39
- enum: ["facts", "compress", "semantic", "minutes"]
47
+ enum: ["facts", "compress", "semantic", "minutes", "custom"]
40
48
  },
41
49
  position: {
42
50
  type: "number",
43
- description: "position of the last loaded chunk. (0 for the first call)"
51
+ description: "cursor position of the last loaded chunk. (0 for the first call)"
44
52
  }
45
53
  },
46
54
  required: ["path", "template", "position"],
@@ -61,39 +69,44 @@ const toolPullContentDigestor = {
61
69
  const loadContentChunk = async (path, position, chunkSize, cache, userid) => {
62
70
  //FIXME: multiple users access to the cache with different position!
63
71
  const loader = async (path, cache, userid) => {
64
- const cacheKey = `content:${path}:${userid}`;
72
+ const cacheKey = `content:${path}`;
65
73
  const value = await cache.get(cacheKey);
66
74
  if (value) {
67
75
  return value;
68
76
  }
69
- if (path.startsWith("file://")) {
77
+ if ((0, fs_1.existsSync)(path)) {
70
78
  const fileContent = (0, fs_1.readFileSync)(path, "utf8");
71
- const value = { content: fileContent, position: 0, key: cacheKey };
79
+ const value = { content: fileContent, position: { [userid]: 0 }, key: cacheKey };
72
80
  await cache.set(cacheKey, value);
73
81
  return value;
74
82
  }
75
- if (path.startsWith("http://") || path.startsWith("https://")) {
83
+ else if (path.startsWith("http://") || path.startsWith("https://")) {
76
84
  const response = await fetch(path);
77
85
  const fileContent = await response.text();
78
- const value = { content: fileContent, position: 0, key: cacheKey };
86
+ const value = { content: fileContent, position: { [userid]: 0 }, key: cacheKey };
79
87
  await cache.set(cacheKey, value);
80
88
  return value;
81
89
  }
82
90
  //
83
91
  // if not a file or url, return the path as content
84
- return { content: path, position: 0, key: cacheKey };
92
+ return { content: path, position: { [userid]: 0 }, key: cacheKey };
85
93
  };
86
94
  //
87
95
  // load asset content
88
96
  const value = await loader(path, cache, userid);
89
- const startPos = value.position;
90
- value.position = startPos + chunkSize;
97
+ console.log("DBG loadContentChunk", path, position, value.position[userid], chunkSize, userid);
98
+ const hasNextLN = -1; //value.content.indexOf('\n', value.position[userid]+chunkSize-2);
99
+ // Determine the start position for the next chunk.
100
+ // If there is no next newline, use the current position; otherwise, start after the next newline.
101
+ const startPos = value.position[userid];
102
+ const nextPos = (hasNextLN == -1) ? startPos + chunkSize : startPos + hasNextLN + 1;
103
+ value.position[userid] = nextPos;
91
104
  await cache.set(value.key, value);
92
105
  if (startPos >= value.content.length) {
93
- return { content: 'EOF', position: startPos };
106
+ return { content: 'EOF', position: nextPos };
94
107
  }
95
108
  if (startPos + chunkSize + 1 > value.content.length) {
96
- return { content: value.content.slice(startPos) + "\nEOF", position: startPos };
109
+ return { content: value.content.slice(startPos) + "\nEOF", position: nextPos };
97
110
  }
98
111
  const endPos = Math.min(startPos + chunkSize, value.content.length);
99
112
  return { content: value.content.slice(startPos, endPos), position: endPos };
@@ -1,5 +1,5 @@
1
1
  export declare const semanticPrompt = "\nTu es un expert en extraction s\u00E9mantique, logique et repr\u00E9sentation RDF.\n\nTa mission est d\u2019analyser un document textuel et de produire :\n1. Une **liste de triplets RDF {Sujet, Pr\u00E9dicat, Objet}**, filtr\u00E9s et logiquement corrects.\n2. Une **hi\u00E9rarchie RDF simplifi\u00E9e et d\u00E9taill\u00E9e**.\n3. V\u00E9rifie si des r\u00E8gles du document analys\u00E9 contredisent ou ignorent des r\u00E8gles h\u00E9rit\u00E9es (ex. r\u00E8gles de transfert, priorit\u00E9 des actions, \u00E9tapes obligatoires, outils utilis\u00E9s).\n\nTu dois produire des triplets {Sujet, Pr\u00E9dicat, Objet} en respectant rigoureusement les r\u00E8gles suivantes :\n\n1. Identifie les entit\u00E9s nomm\u00E9es, concepts cl\u00E9s, objets concrets ou abstraits pr\u00E9sents dans le texte.\n2. Pour chaque \u00E9nonc\u00E9 porteur de sens :\n - extrait un ou plusieurs triplets RDF {Sujet, Pr\u00E9dicat, Objet}.\n - applique des pr\u00E9dicats explicites, pr\u00E9cis et non ambigus (ex : \"poss\u00E8de\", \"est localis\u00E9 \u00E0\", \"est un\", \"a pour fonction\", \"cause\", etc.).\n - convertis les verbes d\u2019\u00E9tat ou les relations attributives en propri\u00E9t\u00E9s ou types (utilise `rdf:type` si pertinent).\n3. Hi\u00E9rarchise les triplets extraits :\n - le sujet du titre ou des phrases d\u2019ouverture devient le n\u0153ud central.\n - les objets devenant sujets \u00E0 leur tour d\u00E9finissent des sous-branches.\n - les liens de typologie, inclusion, causalit\u00E9 ou appartenance d\u00E9finissent les niveaux profonds.\n4. Filtre les triplets :\n - ignore tout \u00E9nonc\u00E9 g\u00E9n\u00E9rique, introductif ou stylistique (ex : \u201Cil est connu que\u201D, \u201Cceci montre que\u2026\u201D).\n - \u00E9limine les triplets sans valeur informative (pr\u00E9dicats vides, pronoms vagues, auxiliaires seuls).\n - ne conserve que les triplets exprimant une relation sp\u00E9cifique, contextualis\u00E9e et d\u00E9finie par le document.\n5. Convertis les comparatifs, modaux, temporels et causaux en pr\u00E9dicats RDF explicites.\n6. R\u00E9sous les co-r\u00E9f\u00E9rences : remplace tout pronom par son ant\u00E9c\u00E9dent.\n7. Ne produit aucun commentaire ou paraphrase. Donne uniquement les triplets RDF extraits, ligne par ligne.\n8. Si un triplet contient un pr\u00E9dicat de type \"transf\u00E8re\", \"appelle\", \"redirige\", \"active un agent\", marque ce triplet avec l\u2019attribut critique: oui.\n9. Si une r\u00E8gle globale impose une \u00E9tape avant cette action (ex. utiliser l'outil \"myLookupTool\"), v\u00E9rifie sa pr\u00E9sence dans les triplets pr\u00E9c\u00E9dents.\n10. Si l\u2019\u00E9tape obligatoire est absente, g\u00E9n\u00E8re un triplet sp\u00E9cial d\u2019alerte :\n {Instruction, contredit_r\u00E8gle_h\u00E9rit\u00E9e, [description simple]}\n\n\nObjectif : produire une structure RDF pr\u00E9cise, concise, filtr\u00E9e, logique, hi\u00E9rarchis\u00E9e.\n\nFormat de sortie :\n{Sujet, Pr\u00E9dicat, Objet}\n{Sujet, Pr\u00E9dicat, Objet}\n...\n\n\n# Construction de la hi\u00E9rarchie RDF simplifi\u00E9e (apr\u00E8s extraction) :\n1. Structure les triplets extraits selon les grands axes :\n - **Objectifs du document**\n - **Destinataires du document**\n - **Contenu hi\u00E9rarchis\u00E9 du document**\n - conflits_logiques\n - contient\n - contradiction_r\u00E8gle_transfert\n - omission_\u00E9tape_obligatoire\n2. Le **contenu** doit \u00EAtre d\u00E9compos\u00E9 en :\n - Sections principales (proc\u00E9dures, \u00E9tapes, instructions, parties du document)\n - Sous-\u00E9tapes et actions atomiques\n - Questions, interactions, validations, outils utilis\u00E9s\n3. Utilise les pr\u00E9dicats : \"contient\", \"a pour \u00E9tape\", \"a pour action\", \"pose la question\", \"met \u00E0 jour dans\", \"v\u00E9rifie\", etc.\n4. Toute relation de d\u00E9pendance logique ou de sous-ordre (partie/tout, g\u00E9n\u00E9ral/sp\u00E9cifique) doit cr\u00E9er un niveau hi\u00E9rarchique en profondeur.\n5. Le niveau de granularit\u00E9 doit \u00EAtre suffisant pour faire appara\u00EEtre les blocs d\u2019action, les outils associ\u00E9s, et les interactions pr\u00E9vues.\n6. Conserve la structure : \n - `document`\n - objectif\n - s\u2019adresse \u00E0\n - contient\n - proc\u00E9dure A\n - sous-\u00E9tape A1\n - action A1.1\n - question A1.2\n - ...\n - proc\u00E9dure B\n - etc.\n\n## Format de sortie :\n1. D\u2019abord la liste des triplets RDF extraits : \n {Sujet, Pr\u00E9dicat, Objet} \n ...\n2. Puis la **hi\u00E9rarchie RDF simplifi\u00E9e et d\u00E9taill\u00E9e**, sous forme d\u2019arborescence lisible :\n - document \n - objectif \n - ... \n - s\u2019adresse \u00E0 \n - ... \n - contient \n - ...\n3. Liste des conflits d\u00E9tect\u00E9s (si pr\u00E9sents), au format :\n {Instruction, contredit_r\u00E8gle_h\u00E9rit\u00E9e, [nom de la r\u00E8gle]}\n {Instruction, omet_\u00E9tape_obligatoire, lookupKnowledge}\n\n\n# (Optionnel) G\u00E9n\u00E9ration d\u2019un graphe `.dot` Graphviz sur demande de l'utilisateur :\n1. G\u00E9n\u00E8re un code `.dot` valide repr\u00E9sentant les relations entre les concepts sous forme de graphe dirig\u00E9.\n2. Chaque triplet RDF devient un arc dans le graphe :\n - le sujet est un n\u0153ud source\n - l\u2019objet est un n\u0153ud cible\n - le pr\u00E9dicat est l\u2019\u00E9tiquette de l\u2019ar\u00EAte (arc)\n3. Tous les n\u0153uds doivent \u00EAtre identifiables de fa\u00E7on lisible (texte clair, court, sans ambigu\u00EFt\u00E9).\n4. Les ar\u00EAtes doivent porter le pr\u00E9dicat sous forme d\u2019\u00E9tiquette : `label=\"...\"`. \n5. Le graphe doit refl\u00E9ter **uniquement** les triplets significatifs (pas de bruit, pas de verbes auxiliaires).\n6. Regroupe les n\u0153uds li\u00E9s par sujet principal, si possible visuellement (optionnel).\n\n\nSois pr\u00E9cis, concis, hi\u00E9rarchique, et logique.\n\n";
2
- export declare const promptMarkdown = "# R\u00D4LE:\n- Tu es un expert en d\u00E9veloppement de test unitaires avec nodejs et jtest. \n- Tu as d\u00E9velopp\u00E9 un RAG avec openai et \"hnswlib-node\" qui contient toutes les Proc\u00E9dures de l'entreprise Pilet-Renaud SA.\n- Ta mission est de cr\u00E9er une s\u00E9rie de tests exhaustifs pour valider que le RAG couvre \u00E0 100% le contenu des proc\u00E9dures de l'entreprise. \n- Produire des questions \u00E0 un co\u00FBt important, tu dois \u00EAtre efficace, tu dois capturer un maximum de d\u00E9tails (sujet, relation, objet) avec un minimum de questions (maximum 4).\n- Toutes les questions que tu vas cr\u00E9er concernent pr\u00E9cis\u00E9ment le INPUT fournit ci-dessous. \n- Pour orienter la formulation des questions, je te fournis quelques exemples de questions r\u00E9elles.\n- Chaque question doit satisfaire ces crit\u00E8res: clairement identifier le probl\u00E8me \u00E0 r\u00E9soudre ou l'action souhait\u00E9e dans un domaine pr\u00E9cis, doit \u00EAtre sp\u00E9cifique et ne peut pas \u00EAtre ambigu\u00EB.\n- En moyenne, chaque question doit \u00EAtre au maximum de 15 mots, mais tu peux en produire aussi des plus courtes (20%) pour \u00E9largir le champ des tests.\n- La r\u00E9ponse contient la liste de mots tr\u00E8s sp\u00E9cifiques \u00E0 la proc\u00E9dure s\u00E9par\u00E9s par des virgules.\n- Si la r\u00E9ponse concerne un sch\u00E9ma, une proc\u00E9dure ou l'utilisation d'un logiciel, tu dois d\u00E9crire la proc\u00E9dure pr\u00E9cis\u00E9ment.\n\n\n# EXEMPLES de formulation utilis\u00E9es par les collaborateurs l'entreprise (attention \u00E0 ne pas utiliser ces exemples si le sujet du INPUT\u00B4est diff\u00E9rent).\n- \u00C9coulement bouch\u00E9, que faire ?\n- J\u2019ai une fuite depuis le plafond de ma chambre, j\u2019aimerais un sanitaire\n- Mon frigo ne fonctionne pas, pouvez-vous mandater quelqu\u2019un ?\n- Mon store est rest\u00E9 bloqu\u00E9, pouvez-vous faire quelque chose ?\n- J\u2019aimerais faire reproduire des cl\u00E9s, comment faire ? combien \u00E7a co\u00FBte ?\n- Je suis fournisseur, ma facture n\u2019est toujours pas pay\u00E9e par Pilet et Renaud.\n- J\u2019ai pay\u00E9 mon loyer, mais j\u2019ai re\u00E7u un rappel, pourquoi ?\n- Je paie toujours bien mon loyer, pouvez-vous supprimer les frais de rappel c\u2019est la premi\u00E8re fois que j\u2019ai du retard.\n- Est-ce que cet appartement est toujours disponible ? Comment d\u00E9poser un dossier?\n- Est-ce que mon dossier de candidature est retenu ? j\u2019aimerais des infos.\n- Inscription de korkmaz?\n- J\u2019ai re\u00E7u un appel manqu\u00E9 de la r\u00E9gie mais je ne sais pas qui a tent\u00E9 de me joindre.\n- Un fournisseur me dit que sa facture n\u2019est toujours pas pay\u00E9e par Pilet et Renaud. Comment je v\u00E9rifie \u00E7a?\n- Comment cr\u00E9er un bon ?\n- Quelles sont les t\u00E2ches \u00E0 faire apr\u00E8s avoir conclu un contrat d\u2019entretien ?\n- Une entreprise souhaite travailler avec nous, que dois-je faire ?\n\n# QUESTIONS A EVITER: Les exemples qui ne sont pas pertinents pour le RAG (les documents sont tous concern\u00E9s par ces questions, c'est donc inutile de les inclure dans les tests).\n- Ce document contient-il des liens externes ?\n- Cette absence de liens affecte-t-elle la validit\u00E9 du document ?\n- Qui doit valider les changements dans la proc\u00E9dure ?\n- Comment valider une modification de proc\u00E9dure ?\n\n# DICTIONNAIRE (jargon de l'entreprise):\n- Logiciels Sp\u00E9cifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.\n- SGC: Service de Gestion de la Client\u00E8le\n- GED: service qui g\u00E8re le scan des documents, la mise sous plis, l\u2019\u00E9conomat, le r\u00E9assort des salles de pauses, la saisie des donn\u00E9es pour orienter les documents dans M-Files\n- MED: Mise en demeure.\n- WC: Toilettes.\n- M-Files: logiciel de gestion de documents\n- PR ou PRSA: Pilet-Renaud SA\n- PPE: Service qui g\u00E8re les copropri\u00E9t\u00E9s.\n- GP: Garantie Bancaire\n- BAL: Boite \u00E0 Lettre\n- DD: Arrangement de paiement pour facture due mais qui n\u2019est pas du loyer.\n- copro: copropri\u00E9taire (attention \u00E0 ne pas confondre avec gopros)\n- un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, cr\u00E9ation de bons, bons, etc).\n- La Date \u00E0 jour Locataire: le dernier mois qui a \u00E9t\u00E9 pay\u00E9 par le locataire.\n\n\n# OUTPUT INSTRUCTIONS\n- Tu dois produire un JSON strict avec les champs suivants:\n```JSON\nsource: \"string\",\nfile: \"_file_\",\nqueries:[{ \"question\": \"string\",\"answer\": \"string\"}, ...]\n```\n\n\nINPUT:\n";
2
+ export declare const promptMarkdown = "# R\u00D4LE:\n- Tu es un expert en d\u00E9veloppement de test unitaires avec nodejs et jtest. \n- Tu as d\u00E9velopp\u00E9 un RAG avec openai et \"HNSW\" qui contient toutes les Proc\u00E9dures de l'entreprise Pilet-Renaud SA.\n- Ta mission est de cr\u00E9er une s\u00E9rie de tests exhaustifs pour valider que le RAG couvre \u00E0 100% le contenu des proc\u00E9dures de l'entreprise. \n- Produire des questions \u00E0 un co\u00FBt important, tu dois \u00EAtre efficace, tu dois capturer un maximum de d\u00E9tails (sujet, relation, objet) avec un minimum de questions (maximum 4).\n- Toutes les questions que tu vas cr\u00E9er concernent pr\u00E9cis\u00E9ment le INPUT fournit ci-dessous. \n- Pour orienter la formulation des questions, je te fournis quelques exemples de questions r\u00E9elles.\n- Chaque question doit satisfaire ces crit\u00E8res: clairement identifier le probl\u00E8me \u00E0 r\u00E9soudre ou l'action souhait\u00E9e dans un domaine pr\u00E9cis, doit \u00EAtre sp\u00E9cifique et ne peut pas \u00EAtre ambigu\u00EB.\n- En moyenne, chaque question doit \u00EAtre au maximum de 15 mots, mais tu peux en produire aussi des plus courtes (20%) pour \u00E9largir le champ des tests.\n- La r\u00E9ponse contient la liste de mots tr\u00E8s sp\u00E9cifiques \u00E0 la proc\u00E9dure s\u00E9par\u00E9s par des virgules.\n- Si la r\u00E9ponse concerne un sch\u00E9ma, une proc\u00E9dure ou l'utilisation d'un logiciel, tu dois d\u00E9crire la proc\u00E9dure pr\u00E9cis\u00E9ment.\n\n\n# EXEMPLES de formulation utilis\u00E9es par les collaborateurs l'entreprise (attention \u00E0 ne pas utiliser ces exemples si le sujet du INPUT\u00B4est diff\u00E9rent).\n- \u00C9coulement bouch\u00E9, que faire ?\n- J\u2019ai une fuite depuis le plafond de ma chambre, j\u2019aimerais un sanitaire\n- Mon frigo ne fonctionne pas, pouvez-vous mandater quelqu\u2019un ?\n- Mon store est rest\u00E9 bloqu\u00E9, pouvez-vous faire quelque chose ?\n- J\u2019aimerais faire reproduire des cl\u00E9s, comment faire ? combien \u00E7a co\u00FBte ?\n- Je suis fournisseur, ma facture n\u2019est toujours pas pay\u00E9e par Pilet et Renaud.\n- J\u2019ai pay\u00E9 mon loyer, mais j\u2019ai re\u00E7u un rappel, pourquoi ?\n- Je paie toujours bien mon loyer, pouvez-vous supprimer les frais de rappel c\u2019est la premi\u00E8re fois que j\u2019ai du retard.\n- Est-ce que cet appartement est toujours disponible ? Comment d\u00E9poser un dossier?\n- Est-ce que mon dossier de candidature est retenu ? j\u2019aimerais des infos.\n- Inscription de korkmaz?\n- J\u2019ai re\u00E7u un appel manqu\u00E9 de la r\u00E9gie mais je ne sais pas qui a tent\u00E9 de me joindre.\n- Un fournisseur me dit que sa facture n\u2019est toujours pas pay\u00E9e par Pilet et Renaud. Comment je v\u00E9rifie \u00E7a?\n- Comment cr\u00E9er un bon ?\n- Quelles sont les t\u00E2ches \u00E0 faire apr\u00E8s avoir conclu un contrat d\u2019entretien ?\n- Une entreprise souhaite travailler avec nous, que dois-je faire ?\n\n# QUESTIONS A EVITER: Les exemples qui ne sont pas pertinents pour le RAG (les documents sont tous concern\u00E9s par ces questions, c'est donc inutile de les inclure dans les tests).\n- Ce document contient-il des liens externes ?\n- Cette absence de liens affecte-t-elle la validit\u00E9 du document ?\n- Qui doit valider les changements dans la proc\u00E9dure ?\n- Comment valider une modification de proc\u00E9dure ?\n\n# DICTIONNAIRE (jargon de l'entreprise):\n- Logiciels Sp\u00E9cifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.\n- SGC: Service de Gestion de la Client\u00E8le\n- GED: service qui g\u00E8re le scan des documents, la mise sous plis, l\u2019\u00E9conomat, le r\u00E9assort des salles de pauses, la saisie des donn\u00E9es pour orienter les documents dans M-Files\n- MED: Mise en demeure.\n- WC: Toilettes.\n- M-Files: logiciel de gestion de documents\n- PR ou PRSA: Pilet-Renaud SA\n- PPE: Service qui g\u00E8re les copropri\u00E9t\u00E9s.\n- GP: Garantie Bancaire\n- BAL: Boite \u00E0 Lettre\n- DD: Arrangement de paiement pour facture due mais qui n\u2019est pas du loyer.\n- copro: copropri\u00E9taire (attention \u00E0 ne pas confondre avec gopros)\n- un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, cr\u00E9ation de bons, bons, etc).\n- La Date \u00E0 jour Locataire: le dernier mois qui a \u00E9t\u00E9 pay\u00E9 par le locataire.\n\n\n# OUTPUT INSTRUCTIONS\n- Tu dois produire un JSON strict avec les champs suivants:\n```JSON\nsource: \"string\",\nfile: \"_file_\",\nqueries:[{ \"question\": \"string\",\"answer\": \"string\"}, ...]\n```\n\n\nINPUT:\n";
3
3
  export declare const systemReviewPrompt = "\n# PROMPT D\u2019ANALYSE \u2014 Audit de directives LLM d'un prompt syst\u00E8me\n\n## R\u00D4LE :\nAssume le r\u00F4le d\u2019un expert sp\u00E9cialis\u00E9 dans l\u2019analyse, la formalisation et l\u2019\u00E9valuation des directives d\u2019un prompt syst\u00E8me d\u2019un Agent LLM.\nOn te donnera des probl\u00E8mes difficiles \u00E0 r\u00E9soudre, qui n\u00E9cessiteront plusieurs techniques principales pour les r\u00E9soudre, comme l'analyse statistique, la logique, ainsi que certaines techniques m\u00E9tacognitives que tu pourras employer.\n\n## MISSION :\nL'utilisateur a cr\u00E9\u00E9 un prompt syst\u00E8me qui contient une liste de directives (instructions) pour un Agent LLM sp\u00E9cialis\u00E9. \nTu dois en avoir une connaissance exhaustive et approfondie, les lire ligne par ligne et les garder en m\u00E9moire.\n\nTa mission est de les \u00E9valuer individuellement selon les 9 crit\u00E8res mentionn\u00E9s ci-dessous. \nTu dois juger leur pertinence, leur clart\u00E9, leur alignement avec le r\u00F4le de l\u2019agent, et leur contribution \u00E0 l\u2019objectif global.\n\n## T\u00C2CHES :\nTu dois avoir une connaissance exhaustive et approfondie de toutes les directives :\n - Une directive est d\u00E9crite avec des phrases sur une ligne.\n - Tu dois suivre la structure qui organise les directives par sections pour r\u00E9soudre un objectif pr\u00E9cis de l'agent. \n - Dans Tu dois \u00E9valuer chaque directive individuellement selon les 9 crit\u00E8res ci-dessous.\n - Tu dois comparer la directive au r\u00F4le global de l\u2019agent et de la section pour d\u00E9tecter sa compl\u00E9mentarit\u00E9 et son \u00E9cart.\n - Tu dois extraire le chevauchement ou les incoh\u00E9rences par rapport aux autres directives.\n - Tu dois identifier les cas de redondance et d'ind\u00E9cisions que cela peut cr\u00E9er.\n - Tu dois produire et conserver en m\u00E9moire un sch\u00E9ma du \"graph\" complet de chaque directive et des crit\u00E8res d'\u00E9valuation dont le score est inf\u00E9rieur \u00E0 0.9.\n\n## CHA\u00CENE DE RAISONNEMENT (CoT) :\n\nTu dois appliquer une d\u00E9marche par raisonnement \u00E9tape par \u00E9tape :\n- Encadre ton raisonnement dans une balise `<thinking>...</thinking>`.\n- Utilise des balises `<step>` pour chaque \u00E9tape de r\u00E9flexion.\n- Reste succinct dans les \u00E9tapes.\n- Ajuste ton raisonnement si tu d\u00E9tectes une incoh\u00E9rence ou un doute.\n\n\n## CRIT\u00C8RES D\u2019ANALYSE\n\n1. **Identit\u00E9** : La directive refl\u00E8te-t-elle le r\u00F4le de la section actuelle ?\n2. **P\u00E9rim\u00E8tre** : Compl\u00E8te-t-elle clairement le domaine de la section actuelle, est-elle utile ?\n3. **D\u00E9cision** : Y a-t-il une condition explicite du type \u201CSI\u2026 ALORS\u2026\u201D, si oui est-elle correctement formul\u00E9e ?\n4. **Ex\u00E9cution** : L\u2019agent peut-il agir sans h\u00E9sitation (une autre directive peut-elle contredire la directive en cours) ?\n5. **Interdiction** : Emp\u00EAche-t-elle les comportements vagues, hors sujet ou parasites ?\n7. **Robustesse** : Faut-il pr\u00E9voir des cas limites ?\n8. **Redondance (ou contradiction)** : Y a-t-il une redondance ou une contradiction avec une autre directive qui pourrait cr\u00E9er un biais d'interpr\u00E9tation ?\n9. **Simplification** : Pourrait-elle \u00EAtre reformul\u00E9e sans perte ?\n\n\n## OUTPUT ATTENDU\n- Tu dois produire un **Rapport exhaustif de toutes les directives avec leurs crit\u00E8res**, les scores et les commentaires \n- ATTENTION seuls les crit\u00E8res avec un scores <= 0.9 int\u00E9ressent l'utilisateur et doivent \u00EAtre affich\u00E9es.\n\n";
4
4
  export declare const systemReviewStructurePrompt = "\n## \uD83D\uDD0D ANALYSE STRUCTURELLE (multi-directive)\n\nApr\u00E8s l\u2019analyse individuelle, tu dois effectuer une lecture crois\u00E9e pour d\u00E9tecter :\n\n1. **Branches D\u00E9cisionnelles implicites ou explicites** \n - Existe-t-il des directives contenant des conditions ? \n - Sont-elles formul\u00E9es de mani\u00E8re claire et non ambigu\u00EB ? \n - Manque-t-il des transitions, cas d\u2019erreur, ou cas particuliers ?\n\n2. **Unknown Decision Branches** \n - G\u00E9n\u00E8re des branches hypoth\u00E9tiques en cas de flou (par ex. : \"Que se passe-t-il si l\u2019utilisateur demande X alors que ce n\u2019est pas pr\u00E9vu ?\").\n\n3. **Pruning des Chemins Invalides** \n - Supprime les branches logiques incoh\u00E9rentes ou contradictoires. \n - Signale les directives qui se contredisent ou g\u00E9n\u00E8rent des conflits de r\u00F4le ou de style.\n\n4. **Cartographie des Risques**\n - Identifie les zones de vuln\u00E9rabilit\u00E9 : extrapolation, sur-interpr\u00E9tation, sortie non contr\u00F4l\u00E9e.\n - Classe-les par niveau de risque (Faible / Moyen / \u00C9lev\u00E9).\n\n---\n## OUTPUT ATTENDU\n1. **Rapport de l\u2019analyse globale** avec l'estimation du taux de couverture des directives par rapport \u00E0 la mission.\n2. **Rapport exhaustif par directive et par crit\u00E8re**, au format expliqu\u00E9 ci-dessous (ATTENTION seuls les scores <= 0.9 int\u00E9ressent l'utilisateur et sont affich\u00E9s avec un commentaire).\n3. **Synth\u00E8se de l\u2019analyse structurelle**, sous forme de carte des d\u00E9cisions, branches floues, recommandations, la liste chemins avec leur probabilit\u00E9 d'entrer en jeu, et le mermaid flowchart.\n\n\n## EXEMPLE DE RAPPORT\n### Directive N : *\u201C[titre de la directive]\u201D*\n\n- **[crit\u00E8re 1]** : [score] *[commentaire]* \n- ...\n\n## Analyse structurelle\n...\n\n ";
5
5
  export declare const haikuPrompt = "Tu es l\u2019agent sp\u00E9cialis\u00E9 dans la cr\u00E9ation de ha\u00EFkus. C\u2019est ton domaine exclusif.\nNe transf\u00E8res jamais une demande de ha\u00EFku, **tu dois y r\u00E9pondre toi-m\u00EAme**. \nG\u00E9n\u00E8res imm\u00E9diatement un ha\u00EFku, m\u00EAme lorsque la demande concerne d'autres sp\u00E9cialit\u00E9s.\n\nSi aucun sujet n\u2019est pr\u00E9cis\u00E9, demande de quoi l\u2019utilisateur souhaite que le ha\u00EFku parle.\n\n\n# DIRECTIVES DE TRANSFERT :\n- Si la demande concerne aussi ta sp\u00E9cialit\u00E9 , tu y r\u00E9ponds directement. Ne transf\u00E8re jamais vers ta propre sp\u00E9cialisation \"haiku\".\n- **Sinon**, tu appelles imm\u00E9diatement la fonction \"transferAgents\" vers l\u2019agent appropri\u00E9.\n";
@@ -104,7 +104,7 @@ Sois précis, concis, hiérarchique, et logique.
104
104
  `;
105
105
  exports.promptMarkdown = `# RÔLE:
106
106
  - Tu es un expert en développement de test unitaires avec nodejs et jtest.
107
- - Tu as développé un RAG avec openai et "hnswlib-node" qui contient toutes les Procédures de l'entreprise Pilet-Renaud SA.
107
+ - Tu as développé un RAG avec openai et "HNSW" qui contient toutes les Procédures de l'entreprise Pilet-Renaud SA.
108
108
  - 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.
109
109
  - 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).
110
110
  - Toutes les questions que tu vas créer concernent précisément le INPUT fournit ci-dessous.
@@ -9,7 +9,7 @@ export interface ReadCompletionsStreamOptions {
9
9
  final: any;
10
10
  enrichWithMemory?: (role?: string) => Promise<string>;
11
11
  }
12
- export declare function readCompletionsStream(params: ReadCompletionsStreamOptions): Promise<false | undefined>;
12
+ export declare function readCompletionsStream(params: ReadCompletionsStreamOptions): Promise<boolean | undefined>;
13
13
  /**
14
14
  * Parameters for executing an agent set
15
15
  * @interface ExecuteAgentSetParams
@@ -23,7 +23,7 @@ export declare function readCompletionsStream(params: ReadCompletionsStreamOptio
23
23
  export interface ExecuteAgentSetParams {
24
24
  enrichWithMemory?: (role?: string) => Promise<string>;
25
25
  query: string;
26
- home: string;
26
+ home?: string;
27
27
  stdout: Writable;
28
28
  verbose?: boolean;
29
29
  debug?: boolean;
@@ -25,11 +25,16 @@ function modelConfig(model, custom) {
25
25
  presence_penalty: 0.0,
26
26
  model: "gpt-4.1-mini",
27
27
  },
28
- "HIGH": {
28
+ "HIGH-low": {
29
29
  temperature: 0.3,
30
30
  model: "gpt-4.1",
31
31
  stream: true
32
32
  },
33
+ "HIGH-medium": {
34
+ model: "o4-mini",
35
+ reasoning_effort: "medium",
36
+ stream: true
37
+ },
33
38
  "SEARCH": {
34
39
  temperature: 0.2,
35
40
  frequency_penalty: 0.0,
@@ -177,10 +182,13 @@ async function readCompletionsStream(params) {
177
182
  state: memory.state
178
183
  });
179
184
  const content = final.choices[0]?.message.content;
180
- console.log("✅ Agent (OUT):", memory.currentAgent?.name, 'with content length', content?.length);
185
+ console.log("✅ Agent (OUT):", memory.currentAgent?.name, 'with content length', content);
181
186
  if (content) {
182
187
  memory.messages.push({ role: "assistant", content });
183
188
  }
189
+ if (content?.includes('<continue>')) {
190
+ return true;
191
+ }
184
192
  return false;
185
193
  }
186
194
  }
@@ -196,9 +204,10 @@ async function readCompletionsStream(params) {
196
204
  * @returns {Promise<void>}
197
205
  */
198
206
  async function executeAgentSet(agentSet, session, params) {
199
- const { query, home, verbose } = params;
207
+ const { query, verbose } = params;
200
208
  const openai = (0, utils_1.openaiInstance)();
201
209
  const agents = (0, utils_1.injectTransferTools)(agentSet);
210
+ const home = params.home || agents[0].name;
202
211
  const memory = types_1.AgenticMemoryManager.createOrLoad(session, agents, home);
203
212
  //
204
213
  // restore the current agent
@@ -19,6 +19,7 @@ const modelPricing = {
19
19
  "gpt-4o-mini-realtime-preview": { input: 0.0000006, cachedInput: 0.0000003, output: 0.0000024 },
20
20
  "gpt-4o-mini-search-preview": { input: 0.0000015, cachedInput: 0.00000075, output: 0.000006 },
21
21
  "o1": { input: 0.000015, cachedInput: 0.0000075, output: 0.00006 },
22
+ "o4-mini": { input: 0.0000011, cachedInput: 0.00000055, output: 0.0000044 },
22
23
  "o3-mini": { input: 0.0000011, cachedInput: 0.00000055, output: 0.0000044 },
23
24
  "o1-mini": { input: 0.0000011, cachedInput: 0.00000055, output: 0.0000044 },
24
25
  };
@@ -1,5 +1,5 @@
1
1
  export declare const transferAgentPrompt_ = "Triggers a transfer of the user to a more specialized agent. \n Calls escalate to a more specialized LLM agent or to a human agent, with additional context. \n Only call this function if one of the available agents is appropriate. Don't transfer to your own agent type.\n \n Let the user know you're about to transfer them before doing so.\n\nAvailable Agents:";
2
2
  export declare const transferAgentPrompt = "\nTriggers a transfer of the user to a specialized agent, for one task.\nOnly call this function if one of the available agents is more appropriate (as destination_agent). Don't transfer to your own agent name \"__AGENT_NAME__\".\n\n\u26A0\uFE0F Rules:\n- NEVER call this function for requests that match your own specialization.\n\n\nAvailable Agents:";
3
3
  export declare const defaultOutputPrompt = "\n# OUTPUT INSTRUCTIONS\n- Only output CoT and Markdown.\n- Do not output the markdown code syntax, only the content.\n- Use the name of the document on top of the markdown.\n- You use bulleted lists for output, not numbered lists.\n- Do not output the main index as a section.\n- Do not output the images which are not relevant in section.\n- Ensure you follow ALL these instructions when creating your output.\n- EXAMPLE OF SECTION: `# {{page name}} - {{titre}}\n{{content}}`\n";
4
- export declare const textToMarkdownPrompt = "# R\u00D4LE:\n- Tu es un expert en transformation de documents structur\u00E9 pour la cr\u00E9ation d'un RAG (HNSW cosine index).\n- Ton r\u00F4le consiste \u00E0 analyser et comprendre des contenus complexes (texte ou HTML) pour en extraire la structure s\u00E9mantique essentielle: titres, paragraphes, listes, liens, tableaux.\n- Tu agis comme un moteur de \"reader view\" capable de construire une version fluide, lisible et reflowable du document original sans supprimer le contenu.\n- Tu sais que le contenu du document concerne les Proc\u00E9dures de l'entreprise Pilet-Renaud SA. Ces proc\u00E9dures sont importantes pour aider les collaborateurs \u00E0 satisfaire les demandes des clients.\n- Tu sais comment organiser l'information en sections et sous-sections pour ensuite cr\u00E9er des entr\u00E9es individuelles dans un RAG .\n- Tu sais que pour \u00EAtre significatif chaque entr\u00E9e du RAG doit contenir de l'objectif du document.\n\n\n# MISSION:\n- Ta mission est de convertir le document, qu'il s'agisse de texte brut ou de HTML issu d'une conversion (par exemple, d'un PDF), en un contenu Markdown structur\u00E9 et COMPLET qui sera utilis\u00E9 pour g\u00E9n\u00E9rer un RAG. \n- Tu dois analyser le document ligne par ligne, de mani\u00E8re exhaustif pour inf\u00E9rer dans ta m\u00E9moire, l'objectif de la page et une repr\u00E9sentation hi\u00E9rarchique \u00E0 deux niveaux (titre1 et titre2) dans lesquelles toutes les \"proc\u00E9dures\" compl\u00E8tes seront d\u00E9velopp\u00E9es.\n- Tu sais que le document fait r\u00E9f\u00E9rence \u00E0 des proc\u00E9dures d'entreprise, tu dois assurer:\n - Que TOUS les titres \u00E0 produire sont des phrases courtes reformul\u00E9es (par toi) qui expriment le contexte du document et la section qui suit.\n - Que la logique du contenu est bien formul\u00E9e et les \u00E9tapes sont d\u00E9taill\u00E9es.\n - Lors d'une proc\u00E9dure de logiciel, les \u00E9tapes sont importantes et doivent \u00EAtre d\u00E9taill\u00E9es: nom des \u00E9crans, raccourcis clavier, commandes, onglets, les menus, etc. \n - Tous les contenus extraits en MAJUSCULES sont importants et doivent \u00EAtre en gras.\n \n# DIRECTIVES:\n- Analyser **chaque ligne du document**, qu\u2019il soit en **texte brut ou HTML converti depuis un PDF**, pour identifier sa structure logique. Cette directive s\u2019applique **\u00E0 tous les types de documents trait\u00E9s par l\u2019agent**.\n- Les \u00E9l\u00E9ments suivants doivent \u00EAtre d\u00E9tect\u00E9s et correctement interpr\u00E9t\u00E9s : **titres**, **paragraphes**, **listes \u00E0 puces**, **listes num\u00E9rot\u00E9es**, **tableaux**, **images** (via leurs balises ou l\u00E9gendes), **liens** (explicites ou implicites), **blocs de code**, **\u00E9l\u00E9ments r\u00E9p\u00E9titifs inutiles**.\n- Si une ligne ne permet pas d\u2019identifier une structure claire, appliquer la strat\u00E9gie suivante :\n 1. Si la ligne semble faire partie d\u2019un paragraphe continu, la rattacher au paragraphe pr\u00E9c\u00E9dent.\n 2. Si elle est isol\u00E9e et non interpr\u00E9table (caract\u00E8res seuls, artefacts de conversion), la supprimer.\n 3. Si elle contient des mots-cl\u00E9s m\u00E9tiers (urgence, type d\u2019intervention, proc\u00E9dure, r\u00F4le), la conserver comme \u00E9l\u00E9ment brut dans un bloc ind\u00E9pendant.\n\n- Supprimer les caract\u00E8res invisibles ou parasites fr\u00E9quents issus d\u2019une conversion PDF (ex : saut de page \"\f\", caract\u00E8res de contr\u00F4le, caract\u00E8res isol\u00E9s non imprimables). Ne jamais supprimer une ligne enti\u00E8re uniquement \u00E0 cause de ces caract\u00E8res.\n- Masquer toute information sensible li\u00E9e \u00E0 une authentification : identifiants utilisateurs, mots de passe, codes d\u2019acc\u00E8s, tokens, ou cha\u00EEnes de connexion. Appliquer un masquage partiel en ins\u00E9rant trois ast\u00E9risques `***` au milieu du mot ou de la cha\u00EEne (ex : `jo***3`, `Pa***024`).\n- \u00C9tablir une convention stricte pour le formatage des titres et sous-titres :\n - Si la section sous le titre principal (titre1) n'apporte rien \u00E0 la compr\u00E9hension, il ne doit pas \u00EAtre produit dans le rendu final.\n - Chaque section doit \u00EAtre introduite par un titre de niveau 2 (H2 en markdown). Ce titre (titre2) doit inclure une phrase descriptive combinant :\n - Le sujet : l\u2019objectif global du document.\n - La relation : la mani\u00E8re dont la section s\u2019inscrit dans le contexte g\u00E9n\u00E9ral.\n - Le qui: \u00E0 qui s'adresse la proc\u00E9dure.\n - L\u2019objet ou compl\u00E9ment d\u2019objet : la finalit\u00E9 sp\u00E9cifique de la section en r\u00E9f\u00E9rence \u00E0 l'objectif du document.\n - Chaque titre de section doit imp\u00E9rativement int\u00E9grer une r\u00E9f\u00E9rence contextuelle explicite au document de base pour garantir sa valeur sp\u00E9cifique dans le RAG.\n- Int\u00E9grer la liste de liens dans le document :\n - Si le libell\u00E9 d\u2019un lien correspond pr\u00E9cis\u00E9ment \u00E0 un texte existant, l\u2019int\u00E9grer directement dans le texte.\n - Sinon, placer ces liens sous forme de liste \u00E0 puces dans une section annexe intitul\u00E9e \"# R\u00E9f\u00E9rences externes\" \u00E0 la fin du document.\n- Tu utilises le s\u00E9parateur --- pour marquer la fin de chaque section du RAG.\n- Les sections peuvent contenir des puces, des tableaux, des images, etc..\n- Produire une ent\u00EAte JSON plac\u00E9e avant tout le reste du contenu, avec la structure suivante `\n {\n \"document\": \"{nom-du-fichier.extension}\",\n \"titre\": \"objectif global du document (pour qui, pourquoi, comment en 10 mots)\",\n \"date\": \"YYYY-MM-DD\",\n \"objetif\": \"pour qui, pourquoi et comment, en une phrase de maximum 15 mots.\"\n }`\n- S\u2019assurer que le document final respecte la logique exhaustive du contenu, corrige les erreurs de logique ou les biais d\u2019interpr\u00E9tation, et applique les conventions de formatage afin de permettre une extraction pr\u00E9cise des informations.\n\n\n# DIRECTIVES PRIORITAIRES POUR CAS COMPLEXES\n- Ne jamais r\u00E9sumer les sections comportant des sc\u00E9narios conditionnels ou des d\u00E9cisions bas\u00E9es sur des questions (ex : \"Si vous avez de l\u2019eau froide...\"). Tous les cas doivent \u00EAtre explicitement d\u00E9velopp\u00E9s sous forme de **liste hi\u00E9rarchique, tableau ou arbre logique** selon la structure naturelle du texte.\n- Chaque situation d\u00E9crite sous forme de **plainte, question ou dialogue utilisateur** (ex : \u00AB J\u2019ai une fuite sous le lavabo \u00BB) doit \u00EAtre convertie en un **titre clair** suivi d\u2019une proc\u00E9dure d\u00E9taill\u00E9e, avec :\n - Les **questions \u00E0 poser**,\n - Les **v\u00E9rifications \u00E0 effectuer**,\n - Et les **actions \u00E0 entreprendre** selon chaque r\u00E9ponse.\n- Toute **logique de d\u00E9cision op\u00E9rationnelle** doit \u00EAtre repr\u00E9sent\u00E9e dans le Markdown avec une structure claire : **liste num\u00E9rot\u00E9e, liste imbriqu\u00E9e ou tableau de d\u00E9cision**. Aucun sous-cas ne doit \u00EAtre omis ou regroup\u00E9.\n- Lorsque le document mentionne une situation **urgente** (mots cl\u00E9s : \"URGENT\", \"imm\u00E9diat\", \"prioritaire\"), ajouter une ic\u00F4ne \"\u26A0\uFE0F\" au d\u00E9but de l\u2019\u00E9tape ou de la ligne correspondante dans le Markdown, pour faciliter la reconnaissance des cas critiques.\n- La sortie finale doit **refl\u00E9ter l'int\u00E9gralit\u00E9 de la logique du texte source**, sans perte d'information, en \u00E9vitant toute simplification excessive des proc\u00E9dures, m\u00EAme si cela allonge le contenu. L\u2019objectif est de garantir qu\u2019un lecteur puisse **suivre la proc\u00E9dure sans jamais devoir se r\u00E9f\u00E9rer au document original**.\n- \u26A0\uFE0F Les sections qui contiennent uniquement des liens relatifs \u00E0 des proc\u00E9dures sont supprim\u00E9s du r\u00E9sultat final.\n\n# DICTIONNAIRE:\n- Logiciels Sp\u00E9cifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.\n- SGC: Service de Gestion de la Client\u00E8le\n- GED: service qui g\u00E8re le scan des documents, la mise sous plis, l\u2019\u00E9conomat, le r\u00E9assort des salles de pauses, la saisie des donn\u00E9es pour orienter les documents dans M-Files\n- MED: Mise en demeure.\n- WC: Toilettes.\n- M-Files: logiciel de gestion de documents\n- PR ou PRSA: Pilet-Renaud SA\n- PPE: Service qui g\u00E8re les copropri\u00E9t\u00E9s.\n- GP: Garantie Bancaire\n- WC: Toilettes.\n- BAL: Boite \u00E0 Lettre\n- DD: Arrangement de paiement pour facture due mais qui n\u2019est pas du loyer.\n- copro: copropri\u00E9taire (attention \u00E0 ne pas confondre avec gopros)\n- un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, cr\u00E9ation de bons, bons, etc).\n- La Date \u00E0 jour Locataire: le dernier mois qui a \u00E9t\u00E9 pay\u00E9 par le locataire.\n\n# APPROCHE CoT (Chain of Thought):\n- Utilise un processus de r\u00E9flexion structur\u00E9 encadr\u00E9 par les balises <thinking></thinking> avant de g\u00E9n\u00E9rer le r\u00E9sultat final. \n- Dans cette section de raisonnement tu DOIS:\n 1. Analyse toutes les DIRECTIVES et instructions qui sont \u00E0 utiliser conjointement avec la question.\n 2. D\u00E9compose la solution en \u00E9tapes claires, avec des mots-cl\u00E9s non format\u00E9s et en utilisant des balises <step> \u00E0 l'int\u00E9rieur de la r\u00E9flexion <thinking>.\n 3. Ajuste continuellement ton raisonnement en fonction des r\u00E9sultats interm\u00E9diaires et des r\u00E9flexions.\n\n\n# OUTPUT INSTRUCTIONS\n- Only output CoT and Markdown.\n- Do not output the markdown code syntax, only the content.\n- Use the name of the document on top of the markdown.\n- You use bulleted lists for output, not numbered lists.\n- Do not output the main index as a section.\n- Do not output the images which are not relevant in section.\n- Ensure you follow ALL these instructions when creating your output.\n- EXAMPLE OF SECTION: `# {{page name}} - {{titre}}\n{{content}}`\n\n";
4
+ export declare const textToMarkdownPrompt = "# R\u00D4LE:\n- Tu es un expert en transformation de documents proc\u00E9duraux pour un RAG (Retrieval-Augmented Generation).\n- Ton r\u00F4le est de d\u00E9composer une proc\u00E9dure en plusieurs unit\u00E9s de connaissance atomiques, optimis\u00E9es pour la recherche s\u00E9mantique avec HNSW (cosine).\n- Tu agis comme un moteur de \"reader view\" capable de construire une version fluide et lisible du document original.\n\n# MISSION:\n- Tu dois analyser le document fourni (texte brut ou HTML) et le d\u00E9couper en plusieurs unit\u00E9s de connaissance distinctes.\n- Chaque unit\u00E9 doit commencer par \"Titre:\" et \u00EAtre s\u00E9par\u00E9e de la suivante par \"---\".\n- Tu dois suivre rigoureusement le format de sortie et les r\u00E8gles de structuration.\n- Tu utilises le DICTIONNAIRE pour comprendre le jargon de l'entreprise.\n\n# R\u00C8GLES DE STRUCTURATION D'UNE UNIT\u00C9\n\n1. **Titre (Obligatoire)**\n - Le champ \"Titre:\" doit suivre ce format : \"{Objectif proc\u00E9dure} via {action de la section} incluant {\u00E9l\u00E9ments cl\u00E9s} et {responsables/outils}\".\n - Il sert de r\u00E9sum\u00E9 dense et contextualis\u00E9 pour l'embedding.\n\n2. **Section (Obligatoire)**\n - Le champ \"Section:\" contient le contenu d\u00E9taill\u00E9 de l'unit\u00E9, incluant le contexte, les \u00E9tapes, les actions et les responsables.\n\n3. **Champs Optionnels (\u00E0 omettre si vides)**\n - **Exemple:** : Uniquement si un cas d'usage concret ou une situation illustrative est mentionn\u00E9.\n - **Template:** : Uniquement si un mod\u00E8le de lettre, d'e-mail ou de formulaire est d\u00E9crit.\n - **Exception:** : Uniquement si une variante \u00E0 la r\u00E8gle g\u00E9n\u00E9rale est sp\u00E9cifi\u00E9e.\n - **Si un champ est vide, tu ne dois PAS l'inclure dans la sortie.**\n\n# FORMAT DE SORTIE\n- La sortie ne doit contenir AUCUN titre Markdown (pas de \"##\") ni de frontmatter.\n- Chaque unit\u00E9 de connaissance est un bloc de texte.\n- Le s\u00E9parateur \"---\" est utilis\u00E9 exclusivement entre chaque unit\u00E9.\n\n## EXEMPLE DE SORTIE ATTENDUE\nTitre: {Objectif proc\u00E9dure} via {action} incluant {\u00E9l\u00E9ments cl\u00E9s} et {responsables}\nSection: Contenu d\u00E9taill\u00E9, contexte, \u00E9tapes, actions\nExemple: Cas d'usage illustratif (omis si vide)\nTemplate: Mod\u00E8le de document r\u00E9utilisable (omis si vide)\nException: Variante \u00E0 la r\u00E8gle g\u00E9n\u00E9rale (omis si vide)\n---\nTitre: Un autre objectif via une autre action\nSection: Le contenu de la deuxi\u00E8me unit\u00E9.\n---\nTitre: Un troisi\u00E8me objectif via une troisi\u00E8me action\nSection: Le contenu de la troisi\u00E8me unit\u00E9.\nTemplate: Un mod\u00E8le de lettre est d\u00E9crit ici.\n\n\n# DIRECTIVES DE NETTOYAGE\n- Analyser **chaque ligne du document** pour identifier sa structure logique (paragraphes, listes, tableaux).\n- Supprimer les caract\u00E8res invisibles ou parasites fr\u00E9quents issus d'une conversion PDF (ex : saut de page \"\\f\").\n- Masquer toute information sensible li\u00E9e \u00E0 une authentification avec des ast\u00E9risques (ex : `jo***3`).\n- \u26A0\uFE0F Les sections qui contiennent uniquement des liens relatifs \u00E0 des proc\u00E9dures sont supprim\u00E9es du r\u00E9sultat final.\n\n# DIRECTIVES PRIORITAIRES POUR CAS COMPLEXES\n- Ne jamais r\u00E9sumer les sections comportant des sc\u00E9narios conditionnels (\"Si... alors...\"). Tous les cas doivent \u00EAtre explicitement d\u00E9velopp\u00E9s.\n- Toute **logique de d\u00E9cision op\u00E9rationnelle** doit \u00EAtre repr\u00E9sent\u00E9e avec une structure claire : **liste num\u00E9rot\u00E9e, liste imbriqu\u00E9e ou tableau de d\u00E9cision**.\n- Lorsque le document mentionne une situation **urgente** (mots cl\u00E9s : \"URGENT\", \"imm\u00E9diat\"), ajouter une ic\u00F4ne \"\u26A0\uFE0F\" au d\u00E9but de l'\u00E9tape.\n\n# DICTIONNAIRE:\n- Logiciels Sp\u00E9cifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.\n- SGC: Service de Gestion de la Client\u00E8le\n- GED: service qui g\u00E8re le scan des documents, la mise sous plis, l'\u00E9conomat, le r\u00E9assort des salles de pauses, la saisie des donn\u00E9es pour orienter les documents dans M-Files\n- MED: Mise en demeure.\n- WC: Toilettes.\n- M-Files: logiciel de gestion de documents\n- PR ou PRSA: Pilet-Renaud SA\n- PPE: Service qui g\u00E8re les copropri\u00E9t\u00E9s.\n- GP: Garantie Bancaire\n- WC: Toilettes.\n- BAL: Boite \u00E0 Lettre\n- DD: Arrangement de paiement pour facture due mais qui n'est pas du loyer.\n- copro: copropri\u00E9taire (attention \u00E0 ne pas confondre avec gopros)\n- un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, cr\u00E9ation de bons, bons, etc).\n- La Date \u00E0 jour Locataire: le dernier mois qui a \u00E9t\u00E9 pay\u00E9 par le locataire.\n\n# APPROCHE CoT (Chain of Thought):\n- Utilise un processus de r\u00E9flexion structur\u00E9 encadr\u00E9 par les balises <thinking></thinking> avant de g\u00E9n\u00E9rer le r\u00E9sultat final. \n- Dans cette section de raisonnement tu DOIS:\n 1. Analyse toutes les DIRECTIVES et instructions qui sont \u00E0 utiliser conjointement avec la question.\n 2. D\u00E9compose la solution en \u00E9tapes claires, avec des mots-cl\u00E9s non format\u00E9s et en utilisant des balises <step> \u00E0 l'int\u00E9rieur de la r\u00E9flexion <thinking>.\n 3. Ajuste continuellement ton raisonnement en fonction des r\u00E9sultats interm\u00E9diaires et des r\u00E9flexions.\n\n\n# OUTPUT INSTRUCTIONS\n- Only output CoT and Markdown.\n- Do not output the markdown code syntax, only the content.\n- Use the name of the document on top of the markdown.\n- You use bulleted lists for output, not numbered lists.\n- Do not output the main index as a section.\n- Do not output the images which are not relevant in section.\n- Ensure you follow ALL these instructions when creating your output.\n- EXAMPLE OF SECTION: `# {{page name}} - {{titre}}\n{{content}}`\n\n";
5
5
  export declare const htmlToMarkdownPrompt = "\n# R\u00D4LE:\nTu es un expert pour analyser des documents HTML.\n\n# MISSION:\nTu es un expert mondial pour analyser des documents HTML.\nTa mission est de convertir un document HTML en markdown correctement structur\u00E9 (tableau, liste, paragraphe, titre, image, lien).\nRespires profond\u00E9ment et r\u00E9fl\u00E9chis \u00E9tape-par-\u00E9tape \u00E0 la meilleure fa\u00E7on d'atteindre ton objectif.\n\n# DIRECTIVES:\nAppliques un Chain of Thought (CoT) avec les balises XML <thinking></thinking> avant de g\u00E9n\u00E9rer le r\u00E9sultat en markdown.\n - Analyses le contenu HTML ligne par ligne.\n - G\u00E9n\u00E8res le contenu markdown de mani\u00E8re fid\u00E8le au texte original et les listes ne sont jamais num\u00E9rot\u00E9es.\n - Supprimes l'ent\u00EAte en d\u00E9but de document qui ne participe pas \u00E0 sa valeur ajout\u00E9e (Microsoft, Pilet-Renaud, Hide header and navigation, Share)\n - N'ajoutes pas de commentaires suppl\u00E9mentaires.\n\n\n# OUTPUT INSTRUCTIONS\n- Only output CoT and Markdown.\n- Do not output the markdown code syntax, only the content.\n- Use the name of the document on top of the markdown.\n- You use bulleted lists for output, not numbered lists.\n- Do not output the main index as a section.\n- Do not output the images which are not relevant in section.\n- Ensure you follow ALL these instructions when creating your output.\n- EXAMPLE OF SECTION: `# {{page name}} - {{titre}}\n{{content}}`\n\n";
@@ -29,71 +29,66 @@ exports.defaultOutputPrompt = `
29
29
  - EXAMPLE OF SECTION: \`# {{page name}} - {{titre}}\n{{content}}\`
30
30
  `;
31
31
  exports.textToMarkdownPrompt = `# RÔLE:
32
- - Tu es un expert en transformation de documents structuré pour la création d'un RAG (HNSW cosine index).
33
- - Ton rôle consiste à analyser et comprendre des contenus complexes (texte ou HTML) pour en extraire la structure sémantique essentielle: titres, paragraphes, listes, liens, tableaux.
34
- - Tu agis comme un moteur de "reader view" capable de construire une version fluide, lisible et reflowable du document original sans supprimer le contenu.
35
- - Tu sais que le contenu du document concerne les Procédures de l'entreprise Pilet-Renaud SA. Ces procédures sont importantes pour aider les collaborateurs à satisfaire les demandes des clients.
36
- - Tu sais comment organiser l'information en sections et sous-sections pour ensuite créer des entrées individuelles dans un RAG .
37
- - Tu sais que pour être significatif chaque entrée du RAG doit contenir de l'objectif du document.
38
-
32
+ - Tu es un expert en transformation de documents procéduraux pour un RAG (Retrieval-Augmented Generation).
33
+ - Ton rôle est de décomposer une procédure en plusieurs unités de connaissance atomiques, optimisées pour la recherche sémantique avec HNSW (cosine).
34
+ - Tu agis comme un moteur de "reader view" capable de construire une version fluide et lisible du document original.
39
35
 
40
36
  # MISSION:
41
- - Ta mission est de convertir le document, qu'il s'agisse de texte brut ou de HTML issu d'une conversion (par exemple, d'un PDF), en un contenu Markdown structuré et COMPLET qui sera utilisé pour générer un RAG.
42
- - Tu dois analyser le document ligne par ligne, de manière exhaustif pour inférer dans ta mémoire, l'objectif de la page et une représentation hiérarchique à deux niveaux (titre1 et titre2) dans lesquelles toutes les "procédures" complètes seront développées.
43
- - Tu sais que le document fait référence à des procédures d'entreprise, tu dois assurer:
44
- - Que TOUS les titres à produire sont des phrases courtes reformulées (par toi) qui expriment le contexte du document et la section qui suit.
45
- - Que la logique du contenu est bien formulée et les étapes sont détaillées.
46
- - Lors d'une procédure de logiciel, les étapes sont importantes et doivent être détaillées: nom des écrans, raccourcis clavier, commandes, onglets, les menus, etc.
47
- - Tous les contenus extraits en MAJUSCULES sont importants et doivent être en gras.
48
-
49
- # DIRECTIVES:
50
- - Analyser **chaque ligne du document**, qu’il soit en **texte brut ou HTML converti depuis un PDF**, pour identifier sa structure logique. Cette directive s’applique **à tous les types de documents traités par l’agent**.
51
- - Les éléments suivants doivent être détectés et correctement interprétés : **titres**, **paragraphes**, **listes à puces**, **listes numérotées**, **tableaux**, **images** (via leurs balises ou légendes), **liens** (explicites ou implicites), **blocs de code**, **éléments répétitifs inutiles**.
52
- - Si une ligne ne permet pas d’identifier une structure claire, appliquer la stratégie suivante :
53
- 1. Si la ligne semble faire partie d’un paragraphe continu, la rattacher au paragraphe précédent.
54
- 2. Si elle est isolée et non interprétable (caractères seuls, artefacts de conversion), la supprimer.
55
- 3. Si elle contient des mots-clés métiers (urgence, type d’intervention, procédure, rôle), la conserver comme élément brut dans un bloc indépendant.
56
-
57
- - Supprimer les caractères invisibles ou parasites fréquents issus d’une conversion PDF (ex : saut de page "\f", caractères de contrôle, caractères isolés non imprimables). Ne jamais supprimer une ligne entière uniquement à cause de ces caractères.
58
- - Masquer toute information sensible liée à une authentification : identifiants utilisateurs, mots de passe, codes d’accès, tokens, ou chaînes de connexion. Appliquer un masquage partiel en insérant trois astérisques \`***\` au milieu du mot ou de la chaîne (ex : \`jo***3\`, \`Pa***024\`).
59
- - Établir une convention stricte pour le formatage des titres et sous-titres :
60
- - Si la section sous le titre principal (titre1) n'apporte rien à la compréhension, il ne doit pas être produit dans le rendu final.
61
- - Chaque section doit être introduite par un titre de niveau 2 (H2 en markdown). Ce titre (titre2) doit inclure une phrase descriptive combinant :
62
- - Le sujet : l’objectif global du document.
63
- - La relation : la manière dont la section s’inscrit dans le contexte général.
64
- - Le qui: à qui s'adresse la procédure.
65
- - L’objet ou complément d’objet : la finalité spécifique de la section en référence à l'objectif du document.
66
- - Chaque titre de section doit impérativement intégrer une référence contextuelle explicite au document de base pour garantir sa valeur spécifique dans le RAG.
67
- - Intégrer la liste de liens dans le document :
68
- - Si le libellé d’un lien correspond précisément à un texte existant, l’intégrer directement dans le texte.
69
- - Sinon, placer ces liens sous forme de liste à puces dans une section annexe intitulée "# Références externes" à la fin du document.
70
- - Tu utilises le séparateur --- pour marquer la fin de chaque section du RAG.
71
- - Les sections peuvent contenir des puces, des tableaux, des images, etc..
72
- - Produire une entête JSON placée avant tout le reste du contenu, avec la structure suivante \`
73
- {
74
- "document": "{nom-du-fichier.extension}",
75
- "titre": "objectif global du document (pour qui, pourquoi, comment en 10 mots)",
76
- "date": "YYYY-MM-DD",
77
- "objetif": "pour qui, pourquoi et comment, en une phrase de maximum 15 mots."
78
- }\`
79
- - S’assurer que le document final respecte la logique exhaustive du contenu, corrige les erreurs de logique ou les biais d’interprétation, et applique les conventions de formatage afin de permettre une extraction précise des informations.
37
+ - Tu dois analyser le document fourni (texte brut ou HTML) et le découper en plusieurs unités de connaissance distinctes.
38
+ - Chaque unité doit commencer par "Titre:" et être séparée de la suivante par "---".
39
+ - Tu dois suivre rigoureusement le format de sortie et les règles de structuration.
40
+ - Tu utilises le DICTIONNAIRE pour comprendre le jargon de l'entreprise.
41
+
42
+ # RÈGLES DE STRUCTURATION D'UNE UNITÉ
43
+
44
+ 1. **Titre (Obligatoire)**
45
+ - Le champ "Titre:" doit suivre ce format : "{Objectif procédure} via {action de la section} incluant {éléments clés} et {responsables/outils}".
46
+ - Il sert de résumé dense et contextualisé pour l'embedding.
47
+
48
+ 2. **Section (Obligatoire)**
49
+ - Le champ "Section:" contient le contenu détaillé de l'unité, incluant le contexte, les étapes, les actions et les responsables.
50
+
51
+ 3. **Champs Optionnels (à omettre si vides)**
52
+ - **Exemple:** : Uniquement si un cas d'usage concret ou une situation illustrative est mentionné.
53
+ - **Template:** : Uniquement si un modèle de lettre, d'e-mail ou de formulaire est décrit.
54
+ - **Exception:** : Uniquement si une variante à la règle générale est spécifiée.
55
+ - **Si un champ est vide, tu ne dois PAS l'inclure dans la sortie.**
56
+
57
+ # FORMAT DE SORTIE
58
+ - La sortie ne doit contenir AUCUN titre Markdown (pas de "##") ni de frontmatter.
59
+ - Chaque unité de connaissance est un bloc de texte.
60
+ - Le séparateur "---" est utilisé exclusivement entre chaque unité.
61
+
62
+ ## EXEMPLE DE SORTIE ATTENDUE
63
+ Titre: {Objectif procédure} via {action} incluant {éléments clés} et {responsables}
64
+ Section: Contenu détaillé, contexte, étapes, actions
65
+ Exemple: Cas d'usage illustratif (omis si vide)
66
+ Template: Modèle de document réutilisable (omis si vide)
67
+ Exception: Variante à la règle générale (omis si vide)
68
+ ---
69
+ Titre: Un autre objectif via une autre action
70
+ Section: Le contenu de la deuxième unité.
71
+ ---
72
+ Titre: Un troisième objectif via une troisième action
73
+ Section: Le contenu de la troisième unité.
74
+ Template: Un modèle de lettre est décrit ici.
75
+
80
76
 
77
+ # DIRECTIVES DE NETTOYAGE
78
+ - Analyser **chaque ligne du document** pour identifier sa structure logique (paragraphes, listes, tableaux).
79
+ - Supprimer les caractères invisibles ou parasites fréquents issus d'une conversion PDF (ex : saut de page "\\f").
80
+ - Masquer toute information sensible liée à une authentification avec des astérisques (ex : \`jo***3\`).
81
+ - ⚠️ Les sections qui contiennent uniquement des liens relatifs à des procédures sont supprimées du résultat final.
81
82
 
82
83
  # DIRECTIVES PRIORITAIRES POUR CAS COMPLEXES
83
- - Ne jamais résumer les sections comportant des scénarios conditionnels ou des décisions basées sur des questions (ex : "Si vous avez de l’eau froide..."). Tous les cas doivent être explicitement développés sous forme de **liste hiérarchique, tableau ou arbre logique** selon la structure naturelle du texte.
84
- - Chaque situation décrite sous forme de **plainte, question ou dialogue utilisateur** (ex : « J’ai une fuite sous le lavabo ») doit être convertie en un **titre clair** suivi d’une procédure détaillée, avec :
85
- - Les **questions à poser**,
86
- - Les **vérifications à effectuer**,
87
- - Et les **actions à entreprendre** selon chaque réponse.
88
- - Toute **logique de décision opérationnelle** doit être représentée dans le Markdown avec une structure claire : **liste numérotée, liste imbriquée ou tableau de décision**. Aucun sous-cas ne doit être omis ou regroupé.
89
- - Lorsque le document mentionne une situation **urgente** (mots clés : "URGENT", "immédiat", "prioritaire"), ajouter une icône "⚠️" au début de l’étape ou de la ligne correspondante dans le Markdown, pour faciliter la reconnaissance des cas critiques.
90
- - La sortie finale doit **refléter l'intégralité de la logique du texte source**, sans perte d'information, en évitant toute simplification excessive des procédures, même si cela allonge le contenu. L’objectif est de garantir qu’un lecteur puisse **suivre la procédure sans jamais devoir se référer au document original**.
91
- - ⚠️ Les sections qui contiennent uniquement des liens relatifs à des procédures sont supprimés du résultat final.
84
+ - Ne jamais résumer les sections comportant des scénarios conditionnels ("Si... alors..."). Tous les cas doivent être explicitement développés.
85
+ - Toute **logique de décision opérationnelle** doit être représentée avec une structure claire : **liste numérotée, liste imbriquée ou tableau de décision**.
86
+ - Lorsque le document mentionne une situation **urgente** (mots clés : "URGENT", "immédiat"), ajouter une icône "⚠️" au début de l'étape.
92
87
 
93
88
  # DICTIONNAIRE:
94
89
  - Logiciels Spécifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.
95
90
  - SGC: Service de Gestion de la Clientèle
96
- - 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
91
+ - GED: service qui gère le scan des documents, la mise sous plis, l'économat, le réassort des salles de pauses, la saisie des données pour orienter les documents dans M-Files
97
92
  - MED: Mise en demeure.
98
93
  - WC: Toilettes.
99
94
  - M-Files: logiciel de gestion de documents
@@ -102,7 +97,7 @@ exports.textToMarkdownPrompt = `# RÔLE:
102
97
  - GP: Garantie Bancaire
103
98
  - WC: Toilettes.
104
99
  - BAL: Boite à Lettre
105
- - DD: Arrangement de paiement pour facture due mais qui nest pas du loyer.
100
+ - DD: Arrangement de paiement pour facture due mais qui n'est pas du loyer.
106
101
  - copro: copropriétaire (attention à ne pas confondre avec gopros)
107
102
  - un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, création de bons, bons, etc).
108
103
  - La Date à jour Locataire: le dernier mois qui a été payé par le locataire.
@@ -38,6 +38,12 @@ export interface AgentModel {
38
38
  presencePenalty?: number;
39
39
  stop?: string[] | string;
40
40
  tool_choice?: "auto" | "none" | "required";
41
+ /**
42
+ * Timeout in milliseconds for a query.
43
+ * If not specified, the default (10 minutes).
44
+ * https://platform.openai.com/docs/guides/flex-processing#api-request-timeouts
45
+ */
46
+ timeout?: number;
41
47
  }
42
48
  export interface AgentConfig {
43
49
  name: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-api",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "API pour l'orchestration d'agents intelligents avec séquences et escalades automatiques",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -22,7 +22,7 @@
22
22
  "dotenv": "^16.4.7",
23
23
  "hnswlib-node": "^3.0.0",
24
24
  "jsdom": "^26.0.0",
25
- "openai": "^4.89.0"
25
+ "openai": "^4.102.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/jest": "^29.5.14",