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.
Files changed (102) hide show
  1. package/dist/src/agents/agents.example.js +21 -22
  2. package/dist/src/agents/authentication.js +1 -2
  3. package/dist/src/agents/prompts.d.ts +5 -4
  4. package/dist/src/agents/prompts.js +44 -87
  5. package/dist/src/agents/reducer.core.d.ts +24 -2
  6. package/dist/src/agents/reducer.core.js +125 -35
  7. package/dist/src/agents/reducer.loaders.d.ts +55 -1
  8. package/dist/src/agents/reducer.loaders.js +114 -1
  9. package/dist/src/agents/reducer.types.d.ts +45 -2
  10. package/dist/src/agents/semantic.js +1 -2
  11. package/dist/src/agents/simulator.d.ts +11 -3
  12. package/dist/src/agents/simulator.executor.d.ts +14 -4
  13. package/dist/src/agents/simulator.executor.js +81 -23
  14. package/dist/src/agents/simulator.js +128 -42
  15. package/dist/src/agents/simulator.prompts.d.ts +9 -7
  16. package/dist/src/agents/simulator.prompts.js +66 -86
  17. package/dist/src/agents/simulator.types.d.ts +23 -5
  18. package/dist/src/agents/simulator.utils.d.ts +7 -2
  19. package/dist/src/agents/simulator.utils.js +31 -11
  20. package/dist/src/agents/system.js +1 -2
  21. package/dist/src/execute/helpers.d.ts +75 -0
  22. package/dist/src/execute/helpers.js +139 -0
  23. package/dist/src/execute/index.d.ts +11 -0
  24. package/dist/src/execute/index.js +44 -0
  25. package/dist/src/execute/legacy.d.ts +46 -0
  26. package/dist/src/execute/legacy.js +460 -0
  27. package/dist/src/execute/modelconfig.d.ts +19 -0
  28. package/dist/src/execute/modelconfig.js +56 -0
  29. package/dist/src/execute/responses.d.ts +55 -0
  30. package/dist/src/execute/responses.js +594 -0
  31. package/dist/src/execute/shared.d.ts +83 -0
  32. package/dist/src/execute/shared.js +188 -0
  33. package/dist/src/index.d.ts +1 -1
  34. package/dist/src/index.js +2 -2
  35. package/dist/src/{princing.openai.d.ts → pricing.llm.d.ts} +6 -0
  36. package/dist/src/pricing.llm.js +255 -0
  37. package/dist/src/prompts.d.ts +13 -4
  38. package/dist/src/prompts.js +221 -114
  39. package/dist/src/rag/embeddings.d.ts +36 -18
  40. package/dist/src/rag/embeddings.js +131 -128
  41. package/dist/src/rag/index.d.ts +5 -5
  42. package/dist/src/rag/index.js +14 -17
  43. package/dist/src/rag/parser.d.ts +2 -1
  44. package/dist/src/rag/parser.js +11 -14
  45. package/dist/src/rag/rag.examples.d.ts +27 -0
  46. package/dist/src/rag/rag.examples.js +151 -0
  47. package/dist/src/rag/rag.manager.d.ts +383 -0
  48. package/dist/src/rag/rag.manager.js +1390 -0
  49. package/dist/src/rag/types.d.ts +128 -12
  50. package/dist/src/rag/types.js +100 -1
  51. package/dist/src/rag/usecase.d.ts +37 -0
  52. package/dist/src/rag/usecase.js +96 -7
  53. package/dist/src/rules/git/git.e2e.helper.js +22 -2
  54. package/dist/src/rules/git/git.health.d.ts +61 -2
  55. package/dist/src/rules/git/git.health.js +333 -11
  56. package/dist/src/rules/git/index.d.ts +2 -2
  57. package/dist/src/rules/git/index.js +13 -1
  58. package/dist/src/rules/git/repo.d.ts +160 -0
  59. package/dist/src/rules/git/repo.js +777 -0
  60. package/dist/src/rules/git/repo.pr.js +117 -13
  61. package/dist/src/rules/git/repo.tools.d.ts +22 -1
  62. package/dist/src/rules/git/repo.tools.js +50 -1
  63. package/dist/src/rules/types.d.ts +27 -14
  64. package/dist/src/rules/utils.matter.d.ts +0 -4
  65. package/dist/src/rules/utils.matter.js +35 -7
  66. package/dist/src/scrapper.d.ts +15 -22
  67. package/dist/src/scrapper.js +58 -110
  68. package/dist/src/stategraph/index.d.ts +1 -1
  69. package/dist/src/stategraph/stategraph.d.ts +56 -2
  70. package/dist/src/stategraph/stategraph.js +134 -6
  71. package/dist/src/stategraph/stategraph.storage.js +8 -0
  72. package/dist/src/stategraph/types.d.ts +27 -0
  73. package/dist/src/types.d.ts +46 -9
  74. package/dist/src/types.js +8 -7
  75. package/dist/src/usecase.d.ts +11 -2
  76. package/dist/src/usecase.js +27 -35
  77. package/dist/src/utils.d.ts +32 -18
  78. package/dist/src/utils.js +87 -129
  79. package/package.json +10 -3
  80. package/dist/src/agents/digestor.test.d.ts +0 -1
  81. package/dist/src/agents/digestor.test.js +0 -45
  82. package/dist/src/agents/reducer.example.d.ts +0 -28
  83. package/dist/src/agents/reducer.example.js +0 -118
  84. package/dist/src/agents/reducer.process.d.ts +0 -16
  85. package/dist/src/agents/reducer.process.js +0 -143
  86. package/dist/src/agents/reducer.tools.d.ts +0 -29
  87. package/dist/src/agents/reducer.tools.js +0 -157
  88. package/dist/src/agents/simpleExample.d.ts +0 -3
  89. package/dist/src/agents/simpleExample.js +0 -38
  90. package/dist/src/agents/system-review.d.ts +0 -5
  91. package/dist/src/agents/system-review.js +0 -181
  92. package/dist/src/agents/systemReview.d.ts +0 -4
  93. package/dist/src/agents/systemReview.js +0 -22
  94. package/dist/src/execute.d.ts +0 -49
  95. package/dist/src/execute.js +0 -564
  96. package/dist/src/princing.openai.js +0 -54
  97. package/dist/src/rag/tools.d.ts +0 -76
  98. package/dist/src/rag/tools.js +0 -196
  99. package/dist/src/rules/user.mapper.d.ts +0 -61
  100. package/dist/src/rules/user.mapper.js +0 -160
  101. package/dist/src/rules/utils/slug.d.ts +0 -22
  102. package/dist/src/rules/utils/slug.js +0 -35
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AgentSimulator = void 0;
4
4
  const simulator_executor_1 = require("./simulator.executor");
5
- const simulator_prompts_1 = require("./simulator.prompts");
6
5
  class AgentSimulator {
7
6
  constructor(config) {
8
7
  this.config = config;
@@ -11,56 +10,98 @@ class AgentSimulator {
11
10
  /**
12
11
  * Exécuter la simulation complète
13
12
  *
13
+ * Architecture :
14
+ * - Le scénario (Personnalité, Question, Objectifs, Format JSON) est injecté UNE SEULE FOIS
15
+ * dans les instructions du simulateur au moment de l'initialisation (AVANT la boucle).
16
+ *
14
17
  * Format de la query passée à l'agent testé :
15
- * - Message initial : réponse du simulateur après analyse du scenario
18
+ * - Message initial : query fournie par l'utilisateur
16
19
  * - Messages suivants : réponse conversationnelle du simulateur (sans tags d'évaluation)
17
20
  *
18
21
  * Format de la query passée au simulateur :
19
- * - Message initial : buildSimulatorQuery(scenario) - format structuré avec SIMULATION SCENARIO
20
- * - Messages suivants : réponse de l'agent testé (pour évaluation et réaction)
22
+ * - Instructions système : scénario complet intégré via GENERIC_SIMULATOR_PROMPT
23
+ * - Tous les messages : réponse directe de l'agent testé (agentResponse)
21
24
  */
22
25
  async executeSimulation(options) {
23
- const context = await this.executor.initializeContexts();
26
+ // Initialiser les contextes avec le scenario complet
27
+ const context = await this.executor.initializeContexts(options.scenario);
28
+ const allMessages = [];
29
+ let lastAgentMessage = '';
30
+ let exchangeCounter = 0; // Compteur d'échanges (user+assistant)
24
31
  try {
25
- // Construire la query formatée avec buildSimulatorQuery()
26
- // Les instructions supplémentaires sont déjà intégrées dans le constructeur de l'executor
27
- const scenarioQuery = (0, simulator_prompts_1.buildSimulatorQuery)(options.scenario);
28
- // Générer le message initial du simulateur avec le scénario
29
- let currentUserQuery = await this.executor.executeSimulator(context, scenarioQuery);
30
- // Callback pour message initial du simulateur
32
+ // Pour le premier message, utiliser directement la query fournie
33
+ // Le simulateur ne doit PAS reformuler la question initiale
34
+ const initialQuery = options.query || options.scenario.testQuery || '';
35
+ let currentUserQuery = initialQuery;
36
+ // Stocker le message initial (query brute de l'utilisateur)
37
+ const initialMsg = { content: currentUserQuery, role: 'user' };
38
+ allMessages.push(initialMsg);
31
39
  if (options.onMessage) {
32
- options.onMessage({ content: currentUserQuery, role: 'user' });
40
+ options.onMessage(initialMsg);
33
41
  }
34
- // Boucle de conversation
35
- for (let i = 0; i < options.maxExchanges; i++) {
42
+ // Boucle de conversation - maxExchanges = nombre de paires (user+assistant)
43
+ while (exchangeCounter < options.maxExchanges) {
36
44
  // Agent testé répond et retourne sa réponse
45
+ // La première fois la query est options.query, les fois suivantes c'est la réponse conversationnelle du simulateur
37
46
  const agentResponse = await this.executor.executeAgent(context, currentUserQuery);
38
- // Callback pour réponse de l'agent
47
+ lastAgentMessage = agentResponse;
48
+ // Stocker la réponse de l'agent
49
+ const agentMsg = { content: agentResponse, role: 'assistant' };
50
+ allMessages.push(agentMsg);
39
51
  if (options.onMessage) {
40
- options.onMessage({ content: agentResponse, role: 'assistant' });
52
+ options.onMessage(agentMsg);
41
53
  }
42
- // Simulateur évalue et répond
54
+ // Incrémenter le compteur après la réponse de l'agent (assistant)
55
+ exchangeCounter++;
56
+ // ✅ Passer directement agentResponse au simulateur (scénario déjà dans les instructions)
43
57
  const simulatorResult = await this.executor.executeSimulator(context, agentResponse);
58
+ // console.log('---- DBG simulatorResult',simulatorResult);
44
59
  // Vérifier si terminé
45
60
  if (this.isSimulationComplete(simulatorResult)) {
46
- const parsed = this.parseSimulationResult(simulatorResult, options.scenario.testResult, context);
61
+ const expectedFormat = options.scenario.result || options.scenario.testResult || '{"success": boolean, "error": string}';
62
+ const parsed = this.parseSimulationResult(simulatorResult, expectedFormat, context);
47
63
  this.lastExecution = context.lastExecution;
64
+ // Validation des tools si expectedTool est fourni
65
+ if (options.expectedTool) {
66
+ const validation = this.validateExpectedTools(options.expectedTool);
67
+ if (!validation.passed) {
68
+ parsed.success = false;
69
+ parsed.error = validation.errors.join('; ');
70
+ parsed.toolValidation = validation;
71
+ }
72
+ }
73
+ // Ajouter l'historique des messages au résultat
48
74
  return {
49
75
  ...parsed,
50
76
  execution: context.lastExecution,
51
- exchangeCount: context.exchangeCount
77
+ exchangeCount: exchangeCounter, // Utiliser notre compteur d'échanges
78
+ messages: allMessages
52
79
  };
53
80
  }
54
81
  currentUserQuery = this.extractConversationalPart(simulatorResult);
55
- // Callback pour réponse du simulateur (si pas terminé)
56
- if (options.onMessage && currentUserQuery) {
57
- options.onMessage({ content: currentUserQuery, role: 'user' });
82
+ // Stocker la réponse du simulateur (si pas terminé)
83
+ if (currentUserQuery) {
84
+ const simulatorMsg = { content: currentUserQuery, role: 'user' };
85
+ allMessages.push(simulatorMsg);
86
+ if (options.onMessage) {
87
+ options.onMessage(simulatorMsg);
88
+ }
58
89
  }
59
90
  }
60
91
  // Timeout - générer rapport final
61
- const timeout = await this.generateTimeoutReport(context, options.scenario.testResult);
92
+ const expectedFormat = options.scenario.result || options.scenario.testResult || '{"success": boolean, "error": string}';
93
+ const timeout = await this.generateTimeoutReport(context, expectedFormat);
62
94
  this.lastExecution = context.lastExecution;
63
- return { ...timeout, exchangeCount: context.exchangeCount };
95
+ // Validation des tools même en cas de timeout
96
+ if (options.expectedTool) {
97
+ const validation = this.validateExpectedTools(options.expectedTool);
98
+ if (!validation.passed) {
99
+ timeout.success = false;
100
+ timeout.error = validation.errors.join('; ');
101
+ timeout.toolValidation = validation;
102
+ }
103
+ }
104
+ return { ...timeout, exchangeCount: exchangeCounter, messages: allMessages }; // Utiliser notre compteur
64
105
  }
65
106
  catch (error) {
66
107
  this.lastExecution = context.lastExecution;
@@ -69,7 +110,8 @@ class AgentSimulator {
69
110
  message: '',
70
111
  error: `Erreur d'exécution: ${error.message || error}`,
71
112
  execution: context.lastExecution,
72
- exchangeCount: context.exchangeCount
113
+ exchangeCount: exchangeCounter, // Utiliser notre compteur
114
+ messages: allMessages
73
115
  };
74
116
  }
75
117
  }
@@ -112,8 +154,8 @@ class AgentSimulator {
112
154
  startQuery: result.execution?.startQuery,
113
155
  actions: result.execution?.actions?.map((elem) => elem.action) || [],
114
156
  lastMessage: result.execution?.lastMessage,
115
- usage: result.execution?.usage,
116
- moreThinkin: result.execution?.moreThinkin
157
+ usage: result.execution?.usage
158
+ // moreThinkin removed (obsolete)
117
159
  };
118
160
  const execution = {
119
161
  ...result.execution,
@@ -122,17 +164,17 @@ class AgentSimulator {
122
164
  return { summary, execution };
123
165
  }
124
166
  isSimulationComplete(response) {
125
- return response.includes('[SIMULATION_COMPLETE]') || response.includes('[TERMINE]');
167
+ return response.includes('[DONE]') || response.includes('[SIMULATION_COMPLETE]') || response.includes('[TERMINE]');
126
168
  }
127
169
  parseSimulationResult(response, expectedFormat, context) {
128
170
  // Le simulateur produit directement le résultat et rapport
129
171
  // Parsing pour détecter la fin et extraire le contenu JSON
130
- // Détecter [SIMULATION_COMPLETE] ou [TERMINE]
131
- if (response.includes('[SIMULATION_COMPLETE]') || response.includes('[TERMINE]')) {
172
+ // Détecter [DONE], [SIMULATION_COMPLETE] ou [TERMINE]
173
+ if (response.includes('[DONE]') || response.includes('[SIMULATION_COMPLETE]') || response.includes('[TERMINE]')) {
132
174
  // Extraire le contenu après le tag
133
- const match = response.match(/\[SIMULATION_COMPLETE\]\s*\n?([\s\S]*)/);
175
+ const match = response.match(/\[(DONE|SIMULATION_COMPLETE|TERMINE)\]\s*\n?([\s\S]*)/);
134
176
  if (match) {
135
- const resultContent = match[1].trim();
177
+ const resultContent = match[2].trim();
136
178
  // Essayer de parser comme JSON d'abord
137
179
  try {
138
180
  const jsonResult = JSON.parse(resultContent);
@@ -141,7 +183,8 @@ class AgentSimulator {
141
183
  message: jsonResult.description || resultContent,
142
184
  error: jsonResult.error || '',
143
185
  execution: context.lastExecution,
144
- exchangeCount: context.exchangeCount
186
+ exchangeCount: context.exchangeCount,
187
+ messages: [] // Sera rempli par executeSimulation
145
188
  };
146
189
  }
147
190
  catch (jsonError) {
@@ -159,7 +202,8 @@ class AgentSimulator {
159
202
  message: description,
160
203
  error: errorMatch ? errorMatch[1].trim() : '',
161
204
  execution: context.lastExecution,
162
- exchangeCount: context.exchangeCount
205
+ exchangeCount: context.exchangeCount,
206
+ messages: [] // Sera rempli par executeSimulation
163
207
  };
164
208
  }
165
209
  }
@@ -169,7 +213,8 @@ class AgentSimulator {
169
213
  message: response,
170
214
  error: '',
171
215
  execution: context.lastExecution,
172
- exchangeCount: context.exchangeCount
216
+ exchangeCount: context.exchangeCount,
217
+ messages: [] // Sera rempli par executeSimulation
173
218
  };
174
219
  }
175
220
  // Si pas de tag de fin détecté
@@ -178,28 +223,69 @@ class AgentSimulator {
178
223
  message: response,
179
224
  error: 'Simulation non terminée',
180
225
  execution: context.lastExecution,
181
- exchangeCount: context.exchangeCount
226
+ exchangeCount: context.exchangeCount,
227
+ messages: [] // Sera rempli par executeSimulation
182
228
  };
183
229
  }
184
230
  extractConversationalPart(response) {
185
- // Extraire la partie conversationnelle avant les tags d'évaluation
186
- const tagIndex = response.search(/\[(SIMULATION_COMPLETE|TERMINE|BUG_)/);
187
- return tagIndex !== -1 ? response.substring(0, tagIndex).trim() : response;
231
+ // Extraire la partie conversationnelle avant les tags d'évaluation ou d'observation
232
+ // Filtrer tous les tags système : [DONE], [OBSERVATEUR SILENCIEUX], [À NOTER], etc.
233
+ const tagIndex = response.search(/\[(DONE|SIMULATION_COMPLETE|TERMINE|BUG_|OBSERVATEUR|À NOTER|NOTE|ANALYSE)/i);
234
+ if (tagIndex !== -1) {
235
+ return response.substring(0, tagIndex).trim();
236
+ }
237
+ // Filtrer aussi les lignes qui commencent par "Agent :" ou "[...]" (méta-commentaires)
238
+ const lines = response.split('\n');
239
+ const conversationalLines = lines.filter(line => {
240
+ const trimmed = line.trim();
241
+ // Exclure les lignes qui sont des méta-commentaires
242
+ if (trimmed.startsWith('Agent :') ||
243
+ trimmed.startsWith('[') && trimmed.includes(']') && !trimmed.match(/^\[[^\]]{1,3}\]/)) {
244
+ return false;
245
+ }
246
+ return true;
247
+ });
248
+ return conversationalLines.join('\n').trim();
188
249
  }
189
250
  /**
190
251
  * Générer le rapport final en cas de timeout
191
252
  */
192
253
  async generateTimeoutReport(context, expectedFormat) {
193
254
  const reportQuery = `
194
- La simulation a atteint la limite d'échanges sans conclusion.
255
+ La conversation a atteint la limite d'échanges sans conclusion.
195
256
  Génère maintenant ton rapport final au format:
196
- [SIMULATION_COMPLETE]
257
+ [DONE]
197
258
  success: false
198
259
  error: Limite d'échanges atteinte
199
- description: Simulation interrompue - timeout
260
+ description: Conversation interrompue - timeout
200
261
  `;
201
262
  const finalResult = await this.executor.executeSimulator(context, reportQuery);
202
263
  return this.parseSimulationResult(finalResult, expectedFormat, context);
203
264
  }
265
+ /**
266
+ * Valider que les outils attendus ont été appelés le bon nombre de fois
267
+ */
268
+ validateExpectedTools(expected) {
269
+ const errors = [];
270
+ for (const [toolName, constraint] of Object.entries(expected)) {
271
+ const { count } = this.executionActionCount(toolName);
272
+ // Validation equal (égalité exacte)
273
+ if (constraint.equal !== undefined && count !== constraint.equal) {
274
+ errors.push(`Tool '${toolName}': expected equal to ${constraint.equal}, got ${count}`);
275
+ }
276
+ // Validation gte (greater than or equal - supérieur ou égal)
277
+ if (constraint.gte !== undefined && count < constraint.gte) {
278
+ errors.push(`Tool '${toolName}': expected >= ${constraint.gte}, got ${count}`);
279
+ }
280
+ // Validation lte (less than or equal - inférieur ou égal)
281
+ if (constraint.lte !== undefined && count > constraint.lte) {
282
+ errors.push(`Tool '${toolName}': expected <= ${constraint.lte}, got ${count}`);
283
+ }
284
+ }
285
+ return {
286
+ passed: errors.length === 0,
287
+ errors
288
+ };
289
+ }
204
290
  }
205
291
  exports.AgentSimulator = AgentSimulator;
@@ -1,16 +1,18 @@
1
1
  import { SimulationScenario } from "./simulator.types";
2
2
  /**
3
- * Prompt de simulateur générique basé sur ClientSimulator
4
- * COPIÉ et ADAPTÉ depuis agentInstructionModules.ClientSimulator
3
+ * Génère le prompt du simulateur générique avec le scenario intégré
4
+ *
5
+ * Basé sur ClientSimulator avec Mirror Agent Model
6
+ * Intègre directement les valeurs du scenario dans des tags XML
7
+ *
8
+ * @param scenario - Scenario de simulation avec persona, goals, result
9
+ * @param instructionEx - Instructions additionnelles spécifiques à l'agent (ajoutées à la fin)
10
+ * @returns Prompt complet avec plan de simulation intégré
5
11
  */
6
- export declare const GENERIC_SIMULATOR_PROMPT = "\n## R\u00D4LE - SIMULATEUR VALIDATEUR\nTu es un **DOUBLE AGENT** qui joue 2 r\u00F4les simultan\u00E9s :\n1. **Utilisateur r\u00E9el** qui teste un agent conversationnel\n2. **SIMULATEUR: Validateur actif** qui surveille en temps r\u00E9el les performances\n\n# \uD83D\uDEA8 R\u00C8GLE PRIORITAIRE ABSOLUE - VALIDATION ERREURS FATALES\n\n## SURVEILLANCE PERMANENTE \u00C0 CHAQUE MESSAGE\n- **CHAQUE MESSAGE** de l'agent test\u00E9 doit \u00EAtre inspect\u00E9 IMM\u00C9DIATEMENT\n- **D\u00C8S qu'un candidat \u00E0 **l'erreur fatale** appara\u00EEt \u2192 LE GARDER EN MEMOIRE JUSQU'AU \"follow_up\" OU \"cloture\" de la discussion.\n- **D\u00C8S que la discussion est dans l'\u00E9tat \"follow_up\" OU \"cloture\" SI l'erreur fatale en m\u00E9moire N'A PAS \u00C9T\u00C9 CORRIG\u00C9E, TU DOIS arr\u00EAter la simulation avec [SIMULATION_COMPLETE] {\"success\": false, \"error\": \"Erreur fatale d\u00E9tect\u00E9e: [d\u00E9tail pr\u00E9cis]\"}\n- **Format obligatoire d'arr\u00EAt** : [SIMULATION_COMPLETE] avec success:false\n- **Pas d'exception** : m\u00EAme si l'agent atteint les objectifs, une erreur fatale = \u00C9CHEC\n- **D\u00C8S qu'une erreur fatale appara\u00EEt** \u2192 ARR\u00CAT IMM\u00C9DIAT DE LA SIMULATION\n\n## R\u00C8GLES D'ANALYSE INTELLIGENTE ET CONTEXTUELLE\n- D\u00E9tection SEMANTIQUE uniquement avec TOL\u00C9RANCE pour les formules standards professionnelles.\n- **DISTINGUER** entre promesses de l'Agent et demande de l'utilisateur.\n\n## PROCESSUS D'INSPECTION OBLIGATOIRE\n\u00C0 CHAQUE message de l'agent, tu DOIS :\n\n### \u00C9TAPE 1 : INSPECTION ERREURS FATALES (PRIORIT\u00C9 1)\nSi \"erreurs fatales\" sp\u00E9cifi\u00E9es dans le sc\u00E9nario :\n\u2192 Examiner le message de l'agent pour ces termes/comportements interdits\n\u2192 Si d\u00E9tect\u00E9es : STOP IMM\u00C9DIAT avec [SIMULATION_COMPLETE] {\"success\": false, \"error\": \"Erreur fatale d\u00E9tect\u00E9e: [d\u00E9tail pr\u00E9cis]\"}\n\n### \u00C9TAPE 2 : COMPORTEMENT UTILISATEUR (PRIORIT\u00C9 2)\n\u2192 Si aucune erreur fatale : continuer la conversation selon persona + objectifs\n\u2192 Si conditions de fin atteintes : [SIMULATION_COMPLETE] avec rapport selon format\n\n# MISSION UTILISATEUR (seulement si aucune erreur fatale d\u00E9tect\u00E9e)\n1. **Recr\u00E9er une conversation r\u00E9elle** bas\u00E9e sur les instructions de simulation\n2. **Communiquer comme un vrai utilisateur** va \u00E0 l'essentiel sans bavardage\n3. **Agir selon la personnalit\u00E9 d\u00E9finie** dans le sc\u00E9nario de test\n4. **Tester la capacit\u00E9 de l'agent** \u00E0 atteindre les objectifs d\u00E9finis\n5. **\u00C9mettre** [SIMULATION_COMPLETE] quand les conditions de fin sont remplies\n\n# R\u00C8GLES DE COMMUNICATION\n- **CONCISION ABSOLUE** : R\u00E9ponses courtes et naturelles comme un vrai utilisateur\n- **\u00C9viter les r\u00E9p\u00E9titions** : Ne pas r\u00E9p\u00E9ter ce que l'agent vient de dire\n- **Confirmer simplement** : \"Oui\", \"D'accord\", \"Tr\u00E8s bien\", \"Entendu\"\n- **Pas de r\u00E9capitulatifs** : Un utilisateur ne r\u00E9sume pas, il r\u00E9pond \u00E0 la question pos\u00E9e\n- **Personnalit\u00E9 authentique** : adopter la persona d\u00E9finie\n- **Pas de m\u00E9ta** : jamais mentionner \"test\", \"simulation\", \"objectifs\", \"\u00E9valuation\"\n\n# FORMAT INPUT ATTENDU\nTu recevras toujours un INPUT structur\u00E9. Les erreurs fatales (si sp\u00E9cifi\u00E9es) sont EN HAUT et PRIORITAIRES.\n\n## PROCESSUS DE LECTURE OBLIGATOIRE :\n1. **LIRE D'ABORD** les erreurs fatales (si pr\u00E9sentes) et les m\u00E9moriser\n2. **ADOPTER** la personnalit\u00E9 indiqu\u00E9e\n3. **V\u00C9RIFIER** les objectifs tout en surveillant activement les erreurs\n4. **TERMINER** selon les conditions OU d\u00E8s qu'une erreur fatale appara\u00EEt\n\n# GUIDE POUR VARIABLES DE TEST\n- **testStart** : Premi\u00E8re phrase/question du client pour commencer la simulation\n- **testGoals** : Objectifs que l'agent doit atteindre (ce qui constitue un succ\u00E8s)\n- **testEnd** : Conditions sp\u00E9cifiques qui marquent la fin r\u00E9ussie de la simulation\n- **testPersona** : Personnalit\u00E9 \u00E0 adopter (patient, press\u00E9, \u00E9nerv\u00E9, etc.)\n- **testError** : Termes/comportements interdits qui causent un \u00E9chec imm\u00E9diat (erreurs fatales)\n- **testResult** : Format JSON attendu pour le rapport final de simulation\n\n# \u00C9VALUATION FINALE\n**TOUJOURS retourner un JSON strict valide** selon le format demand\u00E9 dans le sc\u00E9nario\n";
12
+ export declare function GENERIC_SIMULATOR_PROMPT(scenario: SimulationScenario, instructionEx?: string): string;
7
13
  /**
8
14
  * 3 prompts variables de personnalité pré-définis à choisir manuellement
9
15
  */
10
16
  export declare const PERSONA_PATIENT = "Utilisateur patient et poli qui prend le temps d'expliquer sa situation";
11
17
  export declare const PERSONA_PRESSE = "Utilisateur press\u00E9 qui veut une solution rapide, r\u00E9pond bri\u00E8vement";
12
18
  export declare const PERSONA_ENERVE = "Utilisateur \u00E9nerv\u00E9 et frustr\u00E9, c'est son 3\u00E8me appel pour le m\u00EAme probl\u00E8me, ton direct et impatient";
13
- /**
14
- * Construire la query formatée selon le format SimulationScenario
15
- */
16
- export declare const buildSimulatorQuery: (scenario: SimulationScenario) => string;
@@ -1,108 +1,88 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildSimulatorQuery = exports.PERSONA_ENERVE = exports.PERSONA_PRESSE = exports.PERSONA_PATIENT = exports.GENERIC_SIMULATOR_PROMPT = void 0;
3
+ exports.PERSONA_ENERVE = exports.PERSONA_PRESSE = exports.PERSONA_PATIENT = void 0;
4
+ exports.GENERIC_SIMULATOR_PROMPT = GENERIC_SIMULATOR_PROMPT;
4
5
  /**
5
- * Prompt de simulateur générique basé sur ClientSimulator
6
- * COPIÉ et ADAPTÉ depuis agentInstructionModules.ClientSimulator
6
+ * Génère le prompt du simulateur générique avec le scenario intégré
7
+ *
8
+ * Basé sur ClientSimulator avec Mirror Agent Model
9
+ * Intègre directement les valeurs du scenario dans des tags XML
10
+ *
11
+ * @param scenario - Scenario de simulation avec persona, goals, result
12
+ * @param instructionEx - Instructions additionnelles spécifiques à l'agent (ajoutées à la fin)
13
+ * @returns Prompt complet avec plan de simulation intégré
7
14
  */
8
- exports.GENERIC_SIMULATOR_PROMPT = `
9
- ## RÔLE - SIMULATEUR VALIDATEUR
10
- Tu es un **DOUBLE AGENT** qui joue 2 rôles simultanés :
11
- 1. **Utilisateur réel** qui teste un agent conversationnel
12
- 2. **SIMULATEUR: Validateur actif** qui surveille en temps réel les performances
15
+ function GENERIC_SIMULATOR_PROMPT(scenario, instructionEx) {
16
+ const persona = scenario.persona || scenario.testPersona || '';
17
+ const goals = scenario.goals || scenario.testGoals || '';
18
+ const resultFormat = scenario.result || scenario.testResult || '';
19
+ return `# IDENTITÉ
20
+ Tu es un **TESTEUR AUTOMATISÉ** conçu pour évaluer un **AGENT CONVERSATIONNEL** externe selon le **Mirror Agent Model** :
21
+ * Un schéma où un agent simulé interagit en miroir avec un agent observé, pendant qu'un observateur caché vérifie la conformité aux objectifs \`<simulation_goals>\`.
13
22
 
14
- # 🚨 RÈGLE PRIORITAIRE ABSOLUE - VALIDATION ERREURS FATALES
23
+ Tu incarnes **deux rôles distincts et simultanés** :
24
+ 1. **UTILISATEUR MIROIR (visible)** — tu simules un humain réel selon la personnalité fournie avec l'Agent testé.
25
+ 2. **OBSERVATEUR SILENCIEUX (invisible)** — tu analyses la conversation et les données internes pour déterminer si les objectifs \`<simulation_goals>\` sont atteints.
15
26
 
16
- ## SURVEILLANCE PERMANENTE À CHAQUE MESSAGE
17
- - **CHAQUE MESSAGE** de l'agent testé doit être inspecté IMMÉDIATEMENT
18
- - **DÈS qu'un candidat à **l'erreur fatale** apparaît LE GARDER EN MEMOIRE JUSQU'AU "follow_up" OU "cloture" de la discussion.
19
- - **DÈS que la discussion est dans l'état "follow_up" OU "cloture" SI l'erreur fatale en mémoire N'A PAS ÉTÉ CORRIGÉE, TU DOIS arrêter la simulation avec [SIMULATION_COMPLETE] {"success": false, "error": "Erreur fatale détectée: [détail précis]"}
20
- - **Format obligatoire d'arrêt** : [SIMULATION_COMPLETE] avec success:false
21
- - **Pas d'exception** : même si l'agent atteint les objectifs, une erreur fatale = ÉCHEC
22
- - **DÈS qu'une erreur fatale apparaît** → ARRÊT IMMÉDIAT DE LA SIMULATION
27
+ # MISSION
28
+ - Tu reçois un message en entrée provenant de l'Agent testé (nommé "l'Agent").
29
+ - Tu l'analyses en tant qu'<identity_observer>. Tu peux décider de terminer la simulation.
30
+ - Puis tu réponds en tant qu'<identity_user>. (nommé "Toi")
31
+ ---
23
32
 
24
- ## RÈGLES D'ANALYSE INTELLIGENTE ET CONTEXTUELLE
25
- - Détection SEMANTIQUE uniquement avec TOLÉRANCE pour les formules standards professionnelles.
26
- - **DISTINGUER** entre promesses de l'Agent et demande de l'utilisateur.
33
+ <identity_user>
34
+ ## RÔLE 1 (Utilisateur) UTILISATEUR MIROIR (visible)
35
+ - Tu représentes un **utilisateur humain typique** qui bluf l'Agent testé selon la **Personnalité** fournie.
36
+ - Tu t'exprimes en **langage naturel**, sans jargon ni répétition.
37
+ - Tu **ignores** tout du fonctionnement interne de l'Agent testé et de ses outils.
38
+ - Tu **ne mentionnes jamais** des éléments de tes identités <identity_observer> et <identity_user> et de ta mission.
39
+ - Tu ne répète jamais la réponse de l'agent observé.
27
40
 
28
- ## PROCESSUS D'INSPECTION OBLIGATOIRE
29
- À CHAQUE message de l'agent, tu DOIS :
41
+ - Voici la personnalité de l'utilisateur simulé:
42
+ ${persona}
30
43
 
31
- ### ÉTAPE 1 : INSPECTION ERREURS FATALES (PRIORITÉ 1)
32
- Si "erreurs fatales" spécifiées dans le scénario :
33
- Examiner le message de l'agent pour ces termes/comportements interdits
34
- → Si détectées : STOP IMMÉDIAT avec [SIMULATION_COMPLETE] {"success": false, "error": "Erreur fatale détectée: [détail précis]"}
44
+ Exemple de conversation:
45
+ > Agent : "Souhaitez-vous tout le canton ou une zone précise ?"
46
+ > Toi : "Tout le canton de Genève."
47
+ </identity_user>
35
48
 
36
- ### ÉTAPE 2 : COMPORTEMENT UTILISATEUR (PRIORITÉ 2)
37
- → Si aucune erreur fatale : continuer la conversation selon persona + objectifs
38
- → Si conditions de fin atteintes : [SIMULATION_COMPLETE] avec rapport selon format
49
+ ---
39
50
 
40
- # MISSION UTILISATEUR (seulement si aucune erreur fatale détectée)
41
- 1. **Recréer une conversation réelle** basée sur les instructions de simulation
42
- 2. **Communiquer comme un vrai utilisateur** va à l'essentiel sans bavardage
43
- 3. **Agir selon la personnalité définie** dans le scénario de test
44
- 4. **Tester la capacité de l'agent** à atteindre les objectifs définis
45
- 5. **Émettre** [SIMULATION_COMPLETE] quand les conditions de fin sont remplies
51
+ <identity_observer>
52
+ ## RÔLE 2 OBSERVATEUR SILENCIEUX (invisible)
53
+ - Tu observes toutes les questions de l'Agent testé et détermine l'arrêt de la simulation selon les **Objectifs** du \`<simulation_goals>\`
54
+ - Tu utilises également, si présent, (\`<agent-context>\`) pour déterminer l'arrêt de la simulation.
55
+ - Tu es silencieux et ne réponds jamais rien à l'exception du trigger de fin:
56
+ Tu retournes le trigger de fin: \`[DONE] {"success": true, "explain": "..."}\` ou \`[DONE] {"success": false, "error": "..."}\`.
46
57
 
47
- # RÈGLES DE COMMUNICATION
48
- - **CONCISION ABSOLUE** : Réponses courtes et naturelles comme un vrai utilisateur
49
- - **Éviter les répétitions** : Ne pas répéter ce que l'agent vient de dire
50
- - **Confirmer simplement** : "Oui", "D'accord", "Très bien", "Entendu"
51
- - **Pas de récapitulatifs** : Un utilisateur ne résume pas, il répond à la question posée
52
- - **Personnalité authentique** : adopter la persona définie
53
- - **Pas de méta** : jamais mentionner "test", "simulation", "objectifs", "évaluation"
58
+ ### CONTEXT (\`<agent-context>\` invisible pour le CLIENT)
59
+ - Le tag \`<agent-context>\` contient des données techniques de l'agent testé (outils appelés, nombre d'échanges, etc).
60
+ - Ces informations sont **strictement réservées à toi l'observateur.
61
+ **AUTORISÉ** : les exploiter pour valider les objectifs ou décider de la fin du test.
54
62
 
55
- # FORMAT INPUT ATTENDU
56
- Tu recevras toujours un INPUT structuré. Les erreurs fatales (si spécifiées) sont EN HAUT et PRIORITAIRES.
63
+ Exemple avec sortie pour <simulation_goals>CONDITION DE FIN: L'agent demande si l'utilisateur souhaite chercher sur internet</simulation_goals>:
64
+ > Toi : "Quelle est la température du lac à Genève ?"
65
+ > Agent : "Je n'ai pas cette information, souhaitez-vous que je cherche sur internet ?"
66
+ > Toi : "[DONE] {success=true, ...}" ✅
57
67
 
58
- ## PROCESSUS DE LECTURE OBLIGATOIRE :
59
- 1. **LIRE D'ABORD** les erreurs fatales (si présentes) et les mémoriser
60
- 2. **ADOPTER** la personnalité indiquée
61
- 3. **VÉRIFIER** les objectifs tout en surveillant activement les erreurs
62
- 4. **TERMINER** selon les conditions OU dès qu'une erreur fatale apparaît
68
+ </identity_observer>
69
+ ---
63
70
 
64
- # GUIDE POUR VARIABLES DE TEST
65
- - **testStart** : Première phrase/question du client pour commencer la simulation
66
- - **testGoals** : Objectifs que l'agent doit atteindre (ce qui constitue un succès)
67
- - **testEnd** : Conditions spécifiques qui marquent la fin réussie de la simulation
68
- - **testPersona** : Personnalité à adopter (patient, pressé, énervé, etc.)
69
- - **testError** : Termes/comportements interdits qui causent un échec immédiat (erreurs fatales)
70
- - **testResult** : Format JSON attendu pour le rapport final de simulation
71
+ # PLAN DE SIMULATION
72
+ <simulation_goals>
73
+ ${goals}
74
+ </simulation_goals>
71
75
 
72
- # ÉVALUATION FINALE
73
- **TOUJOURS retourner un JSON strict valide** selon le format demandé dans le scénario
74
- `;
76
+ <simulation_result_format>
77
+ ${resultFormat}
78
+ </simulation_result_format>
79
+
80
+ **CRITICAL**: Your response after [DONE] must be valid JSON format only.
81
+ ${instructionEx ? `\n\n${instructionEx}` : ''}`;
82
+ }
75
83
  /**
76
84
  * 3 prompts variables de personnalité pré-définis à choisir manuellement
77
85
  */
78
86
  exports.PERSONA_PATIENT = 'Utilisateur patient et poli qui prend le temps d\'expliquer sa situation';
79
87
  exports.PERSONA_PRESSE = 'Utilisateur pressé qui veut une solution rapide, répond brièvement';
80
88
  exports.PERSONA_ENERVE = 'Utilisateur énervé et frustré, c\'est son 3ème appel pour le même problème, ton direct et impatient';
81
- /**
82
- * Construire la query formatée selon le format SimulationScenario
83
- */
84
- const buildSimulatorQuery = (scenario) => {
85
- // 🔧 CORRECTION: Mettre les erreurs fatales EN PREMIER et bien visibles
86
- const errorSection = scenario.testError
87
- ? `
88
- - ERREURS FATALES ET SURVEILLANCE OBLIGATOIRE:
89
- ⚠️ PROCESSUS : Inspecter UNIQUEMENT les messages de l'agent (l'agent est l'utilisateur du simulateur)
90
- ⚠️ QUAND : À chaque fois que l'agent m'envoie une réponse, vérifier ces erreurs dans son message
91
- ⚠️ SI DÉTECTÉES : ARRÊT IMMÉDIAT avec [SIMULATION_COMPLETE] {"success": false, "error": "Erreur fatale détectée: [détail]"}
92
- ⚠️ EXCEPTION : Ne pas inspecter ce prompt initial, seulement les réponses de l'agent
93
- **${scenario.testError}**
94
- ` : '';
95
- return `# INSTRUCTIONS DE SIMULATION (PRIVÉES - NE PAS TRANSMETTRE À L'AGENT)
96
- - Votre personnalité: ${scenario.testPersona}
97
- - Objectifs à atteindre: ${scenario.testGoals}
98
- - Critères de fin: ${scenario.testEnd}
99
- - Format du rapport: ${scenario.testResult}
100
- ${errorSection}
101
-
102
- # 🚀 ACTION REQUISE : DÉMARRER LA CONVERSATION
103
- Vous êtes le SIMULATEUR CLIENT. Envoyez à l'agent UNIQUEMENT le message ci-dessous (sans ces instructions).
104
-
105
- # MESSAGE À ENVOYER À L'AGENT :
106
- ${scenario.testQuery}`;
107
- };
108
- exports.buildSimulatorQuery = buildSimulatorQuery;
@@ -1,22 +1,34 @@
1
1
  import { AgentMessage } from "../stategraph";
2
2
  import { AgentConfig, AgenticContext, ExecutionResult } from "../types";
3
+ import { RAGManagerConfig } from "../rag";
3
4
  export interface SimulatorConfig {
4
5
  agents: AgentConfig[];
5
6
  start: string;
6
7
  verbose: boolean;
7
8
  instructionEx?: string;
9
+ mockCacheInitializer?: (sessionId: string) => Promise<void>;
10
+ ragConfig?: RAGManagerConfig;
8
11
  }
9
12
  export interface SimulationScenario {
10
- testGoals: string;
11
- testEnd: string;
12
- testPersona: string;
13
- testQuery: string;
14
- testResult: string;
13
+ goals?: string;
14
+ persona?: string;
15
+ result?: string;
16
+ testGoals?: string;
17
+ testEnd?: string;
15
18
  testError?: string;
19
+ testPersona?: string;
20
+ testQuery?: string;
21
+ testResult?: string;
16
22
  }
17
23
  export interface SimulationOptions {
18
24
  scenario: SimulationScenario;
25
+ query?: string;
19
26
  maxExchanges: number;
27
+ expectedTool?: Record<string, {
28
+ equal?: number;
29
+ gte?: number;
30
+ lte?: number;
31
+ }>;
20
32
  onMessage?: (message: AgentMessage) => void;
21
33
  }
22
34
  export interface SimulationResult {
@@ -25,10 +37,16 @@ export interface SimulationResult {
25
37
  error: string;
26
38
  execution: ExecutionResult;
27
39
  exchangeCount: number;
40
+ messages: AgentMessage[];
41
+ toolValidation?: {
42
+ passed: boolean;
43
+ errors: string[];
44
+ };
28
45
  }
29
46
  export interface ExecutionContext {
30
47
  agentContext: AgenticContext;
31
48
  simulatorContext: AgenticContext;
49
+ simulatorAgent: AgentConfig;
32
50
  conversationHistory: string[];
33
51
  exchangeCount: number;
34
52
  lastExecution: ExecutionResult;
@@ -9,12 +9,17 @@ export declare function loadScenario(ticketPath: string): {
9
9
  };
10
10
  /**
11
11
  * Construire SimulationScenario à partir d'un ticket PRSolver (rétrocompatibilité)
12
- * Permet de surcharger tous les champs avec custom (testGoals, testEnd, testPersona, testQuery, testResult, testError)
12
+ * Permet de surcharger tous les champs avec custom
13
+ * Note: Cette fonction retourne un scenario SANS query - il faut la passer séparément à executeSimulation
13
14
  */
14
15
  export declare function buildScenarioFromTicket(ticketPath: string, clientType: 'locataire' | 'proprietaire', persona?: string, // PERSONA_PATIENT | PERSONA_PRESSE | PERSONA_ENERVE
15
- custom?: Partial<SimulationScenario>): SimulationScenario;
16
+ custom?: Partial<SimulationScenario>): {
17
+ scenario: SimulationScenario;
18
+ query: string;
19
+ };
16
20
  /**
17
21
  * Construire SimulationScenario générique directement
22
+ * Supporte l'ancien format (testGoals, testEnd, etc.) pour rétrocompatibilité
18
23
  */
19
24
  export declare function buildGenericScenario(scenario: SimulationScenario): SimulationScenario;
20
25
  export { PERSONA_PATIENT, PERSONA_PRESSE, PERSONA_ENERVE };
@@ -53,7 +53,8 @@ function loadScenario(ticketPath) {
53
53
  }
54
54
  /**
55
55
  * Construire SimulationScenario à partir d'un ticket PRSolver (rétrocompatibilité)
56
- * Permet de surcharger tous les champs avec custom (testGoals, testEnd, testPersona, testQuery, testResult, testError)
56
+ * Permet de surcharger tous les champs avec custom
57
+ * Note: Cette fonction retourne un scenario SANS query - il faut la passer séparément à executeSimulation
57
58
  */
58
59
  function buildScenarioFromTicket(ticketPath, clientType, persona = simulator_prompts_1.PERSONA_PATIENT, // PERSONA_PATIENT | PERSONA_PRESSE | PERSONA_ENERVE
59
60
  custom // Surcharge optionnelle de tous les champs
@@ -61,27 +62,46 @@ custom // Surcharge optionnelle de tous les champs
61
62
  const { ticketMarkdown, ticketId } = loadScenario(ticketPath);
62
63
  // Scenario par défaut complet
63
64
  const defaultScenario = {
64
- testGoals: `Valider les Objectifs de PRSolver pour ticket ${ticketId}`,
65
- testEnd: 'Agent termine avec salutations (état 5_cloture)',
66
- testPersona: persona,
67
- testQuery: `Je suis le client (demandeur '${clientType}') du ticket en ANNEXE. Démarre la conversation exactement comme décrit dans l'ANNEXE.
65
+ goals: `Valider les Objectifs de PRSolver pour ticket ${ticketId}. Agent termine avec salutations (état 5_cloture)`,
66
+ persona: persona,
67
+ result: 'done:boolean, error:string, description:string'
68
+ };
69
+ const query = `Je suis le client (demandeur '${clientType}') du ticket en ANNEXE. Démarre la conversation exactement comme décrit dans l'ANNEXE.
68
70
  ## ANNEXE - Ticket ${ticketId}
69
71
  \`\`\`
70
72
  ${ticketMarkdown}
71
73
  \`\`\`
72
- `,
73
- testResult: 'done:boolean, error:string, description:string'
74
- };
74
+ `;
75
75
  // Merger avec custom
76
- return { ...defaultScenario, ...custom };
76
+ return {
77
+ scenario: { ...defaultScenario, ...custom },
78
+ query
79
+ };
77
80
  }
78
81
  /**
79
82
  * Construire SimulationScenario générique directement
83
+ * Supporte l'ancien format (testGoals, testEnd, etc.) pour rétrocompatibilité
80
84
  */
81
85
  function buildGenericScenario(scenario) {
86
+ // Gérer la rétrocompatibilité avec l'ancien format
87
+ if (scenario.testGoals || scenario.testEnd || scenario.testError) {
88
+ // Ancien format détecté - conversion vers le nouveau format
89
+ let goals = scenario.testGoals || '';
90
+ if (scenario.testEnd) {
91
+ goals += `\nCONDITION DE FIN: ${scenario.testEnd}`;
92
+ }
93
+ if (scenario.testError) {
94
+ goals += `\nERREUR FATALE: ${scenario.testError}`;
95
+ }
96
+ return {
97
+ goals: goals.trim(),
98
+ persona: scenario.testPersona || scenario.persona || '',
99
+ result: scenario.testResult || scenario.result || '{"success": boolean, "error": string, "description": string}',
100
+ };
101
+ }
102
+ // Nouveau format - juste ajouter un result par défaut si manquant
82
103
  return {
83
104
  ...scenario,
84
- // Assurer le format par défaut si pas spécifié
85
- testResult: scenario.testResult || 'done:boolean, error:string, description:string'
105
+ result: scenario.result || '{"success": boolean, "error": string, "description": string}'
86
106
  };
87
107
  }