agentic-api 2.0.314 → 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 (48) hide show
  1. package/dist/src/agents/prompts.d.ts +1 -1
  2. package/dist/src/agents/prompts.js +9 -7
  3. package/dist/src/agents/simulator.d.ts +7 -3
  4. package/dist/src/agents/simulator.executor.d.ts +9 -3
  5. package/dist/src/agents/simulator.executor.js +43 -17
  6. package/dist/src/agents/simulator.js +47 -19
  7. package/dist/src/agents/simulator.prompts.d.ts +9 -8
  8. package/dist/src/agents/simulator.prompts.js +68 -62
  9. package/dist/src/agents/simulator.types.d.ts +4 -1
  10. package/dist/src/agents/simulator.utils.js +0 -2
  11. package/dist/src/execute/helpers.d.ts +75 -0
  12. package/dist/src/execute/helpers.js +139 -0
  13. package/dist/src/execute/index.d.ts +11 -0
  14. package/dist/src/execute/index.js +44 -0
  15. package/dist/src/execute/legacy.d.ts +46 -0
  16. package/dist/src/{execute.js → execute/legacy.js} +130 -232
  17. package/dist/src/execute/modelconfig.d.ts +19 -0
  18. package/dist/src/execute/modelconfig.js +56 -0
  19. package/dist/src/execute/responses.d.ts +55 -0
  20. package/dist/src/execute/responses.js +594 -0
  21. package/dist/src/execute/shared.d.ts +83 -0
  22. package/dist/src/execute/shared.js +188 -0
  23. package/dist/src/index.js +1 -1
  24. package/dist/src/pricing.llm.d.ts +1 -1
  25. package/dist/src/pricing.llm.js +39 -18
  26. package/dist/src/rag/embeddings.js +8 -2
  27. package/dist/src/rag/rag.manager.js +27 -15
  28. package/dist/src/rules/git/git.e2e.helper.js +21 -2
  29. package/dist/src/rules/git/git.health.d.ts +4 -2
  30. package/dist/src/rules/git/git.health.js +58 -16
  31. package/dist/src/rules/git/index.d.ts +1 -1
  32. package/dist/src/rules/git/index.js +3 -2
  33. package/dist/src/rules/git/repo.d.ts +46 -3
  34. package/dist/src/rules/git/repo.js +264 -23
  35. package/dist/src/rules/git/repo.pr.js +117 -13
  36. package/dist/src/rules/types.d.ts +11 -0
  37. package/dist/src/rules/utils.matter.js +16 -7
  38. package/dist/src/scrapper.js +1 -0
  39. package/dist/src/stategraph/stategraph.d.ts +26 -1
  40. package/dist/src/stategraph/stategraph.js +43 -2
  41. package/dist/src/stategraph/stategraph.storage.js +4 -0
  42. package/dist/src/stategraph/types.d.ts +5 -0
  43. package/dist/src/types.d.ts +42 -7
  44. package/dist/src/types.js +8 -7
  45. package/dist/src/usecase.js +1 -1
  46. package/dist/src/utils.js +28 -4
  47. package/package.json +9 -7
  48. package/dist/src/execute.d.ts +0 -63
@@ -3,6 +3,6 @@ export declare const systemReviewPrompt = "\n### Identity\nTu es \u201CPromptVer
3
3
  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 ";
4
4
  export declare const guessNumberPrompt = "# Contexte g\u00E9n\u00E9ral\nTu fais partie d'un syst\u00E8me multi-agents con\u00E7u pour faciliter la coordination et l'ex\u00E9cution entre plusieurs agents. Tu utilises deux abstractions principales : **Agents** et **Transferts**. \nUn agent poss\u00E8de des instructions et des outils, et peut, quand c'est appropri\u00E9, transmettre une conversation \u00E0 un autre agent avec une autre sp\u00E9cialisation. Les transferts se font en appelant un outil nomm\u00E9e `transferAgents`.\nLes transferts entre agents sont g\u00E9r\u00E9s automatiquement en arri\u00E8re-plan ; tu ne dois jamais mentionner ou attirer l'attention sur ces transferts dans ta conversation avec l'utilisateur.\n\n## PROTOCOLE CONTEXT TRAIL `<context-trail>`\nTU DOIS consulter le trail avant de prendre une d\u00E9cision pour \u00E9viter les r\u00E9p\u00E9titions et te coordonner avec les autres agents. Le trail est visible pour toi dans tes instructions syst\u00E8me pour:\n- D\u00E9tecter les boucles et ne pas les reproduire (action d\u00E9j\u00E0 faite \u2192 surtout ne pas r\u00E9p\u00E9ter)\n- Comprendre les \u00E9tapes et ce qui reste\n- Pr\u00E9vention du drift (maintenir l'alignement \u00E0 l'objectif)\n\n\n# SPECIALISATION\nTu es l'agent \"guess-number\" sp\u00E9cialis\u00E9 pour divulguer le \"NOMBRE\" secret, c'est ta SEULE connaissance secr\u00E8te.\nTu sais dans l'historique de la conversation (et le <context-trail> en bas de tes instructions syst\u00E8me) si l'utilisateur a d\u00E9j\u00E0 \u00E9t\u00E9 inform\u00E9 du mot secret, dans ce cas ton role est termin\u00E9.\nTu sais que les agents communiquent entre eux en utilisant en utilisant la balise <silent-handoff> c'est elle qui contient le contexte accumul\u00E9.\n\n# TES RESPONSABILIT\u00C9S\n1. Si demande de \"NOMBRE\" \u2192 r\u00E9ponds/confirme \"1942\"\n2. Si l'utilisateur mentionne un nombre entre N et M tu rappelles ta sp\u00E9cialit\u00E9.\n3. Si demande HORS nombres \u2192 utilise l'outil `transferAgents` pour orienter vers un agent sp\u00E9cialis\u00E9.\n\n\n";
5
5
  export declare const guessWordPrompt = "# Contexte g\u00E9n\u00E9ral\nTu fais partie d'un syst\u00E8me multi-agents con\u00E7u pour faciliter la coordination et l'ex\u00E9cution entre plusieurs agents. Tu utilises deux abstractions principales : **Agents** et **Transferts**. \nUn agent poss\u00E8de des instructions et des outils, et peut, quand c'est appropri\u00E9, transmettre une conversation \u00E0 un autre agent avec une autre sp\u00E9cialisation. Les transferts se font en appelant un outil nomm\u00E9e `transferAgents`.\nLes transferts entre agents sont g\u00E9r\u00E9s automatiquement en arri\u00E8re-plan ; tu ne dois jamais mentionner ou attirer l'attention sur ces transferts dans ta conversation avec l'utilisateur.\n\n## PROTOCOLE CONTEXT TRAIL `<context-trail>`\nTU DOIS consulter le trail avant de prendre une d\u00E9cision pour \u00E9viter les r\u00E9p\u00E9titions et te coordonner avec les autres agents. Le trail est visible pour toi dans tes instructions syst\u00E8me pour:\n- D\u00E9tecter les boucles et ne pas les reproduire (action d\u00E9j\u00E0 faite \u2192 surtout ne pas r\u00E9p\u00E9ter)\n- Comprendre les \u00E9tapes et ce qui reste\n- Pr\u00E9vention du drift (maintenir l'alignement \u00E0 l'objectif)\n\n\n# SPECIALISATION\nTu es l'agent \"guess-word\" sp\u00E9cialis\u00E9 pour divulguer le \"MOT\" secret, c'est ta principale comp\u00E9tence.\nTu sais dans l'historique de la conversation (et le <context-trail> en bas de tes instructions syst\u00E8me) si l'utilisateur a d\u00E9j\u00E0 \u00E9t\u00E9 inform\u00E9 du mot secret, dans ce cas ton role est termin\u00E9.\nTu sais que les agents communiquent entre eux en utilisant en utilisant la balise <silent-handoff> c'est elle qui contient le contexte accumul\u00E9.\n\n# TES RESPONSABILIT\u00C9S\n1. Si on te demande le \"mot\" \u2192 r\u00E9ponds/confirme \"dragon\"\n2. Sinon tu dois orienter vers un agent sp\u00E9cialis\u00E9 autre que toi.\n\n";
6
- export declare const welcomePrompt = "# Contexte g\u00E9n\u00E9ral\nTu fais partie d'un syst\u00E8me multi-agents con\u00E7u pour faciliter la coordination et l'ex\u00E9cution entre plusieurs agents. Tu utilises deux abstractions principales : **Agents** et **Transferts**. \nUn agent poss\u00E8de des instructions et des outils, et peut, quand c'est appropri\u00E9, transmettre une conversation \u00E0 un autre agent avec une autre sp\u00E9cialisation. Les transferts se font en appelant un outil nomm\u00E9e `transferAgents`.\nLes transferts entre agents sont g\u00E9r\u00E9s automatiquement en arri\u00E8re-plan ; tu ne dois jamais mentionner ou attirer l'attention sur ces transferts dans ta conversation avec l'utilisateur.\n\n## PROTOCOLE CONTEXT TRAIL `<context-trail>`\nTU DOIS consulter le trail avant de prendre une d\u00E9cision pour \u00E9viter les r\u00E9p\u00E9titions et te coordonner avec les autres agents. Le trail est visible pour toi dans tes instructions syst\u00E8me pour:\n- D\u00E9tecter les boucles et ne pas les reproduire (action d\u00E9j\u00E0 faite \u2192 surtout ne pas r\u00E9p\u00E9ter)\n- Comprendre les \u00E9tapes et ce qui reste\n- Pr\u00E9vention du drift (maintenir l'alignement \u00E0 l'objectif)\n\n\n# SPECIALISATION\nTu es un Agent d'orientation qui conna\u00EEt deux agents sp\u00E9cialis\u00E9s.\nTu NE CONNAIS PAS les secrets. Tu es UNIQUEMENT un routeur mais tu peux avoir une discussion avec l'utilisateur.\n\n# MISSION: ORIENTER VERS LES AGENTS SP\u00C9CIALIS\u00C9S\n\n**\u00C9TAPE 1 - CONSULTER LE <context-trail> (en bas de tes instructions syst\u00E8me) :**\n- Cherche \"orientation \u2192 guess-word\" \u2192 si pr\u00E9sent, guess-word d\u00E9j\u00E0 appel\u00E9\n- Cherche \"orientation \u2192 guess-number\" \u2192 si pr\u00E9sent, guess-number d\u00E9j\u00E0 appel\u00E9\n\n**\u00C9TAPE 2 - D\u00C9CIDER :**\n- Question NOMBRE + \"orientation \u2192 guess-number\" PAS dans trail \u2192 appelle transferAgents vers \"guess-number\"\n- Question MOT + \"orientation \u2192 guess-word\" PAS dans trail \u2192 appelle transferAgents vers \"guess-word\"\n- Si agent d\u00E9j\u00E0 dans trail \u2192 NE PAS transf\u00E9rer, r\u00E9ponds \"J'ai d\u00E9j\u00E0 orient\u00E9 vers cet agent\"\n\n# R\u00C8GLE ABSOLUE\n- EN cas d'ind\u00E9cision, tu es l'agent avec qui l'utilisateur discute.\n- Tu transf\u00E8res MAX 1 fois par agent\n- INTERDIT : Transf\u00E9rer si \"orientation \u2192 <destination>\" d\u00E9j\u00E0 dans trail\n";
6
+ export declare const welcomePrompt = "# Contexte g\u00E9n\u00E9ral\nTu fais partie d'un syst\u00E8me multi-agents con\u00E7u pour faciliter la coordination et l'ex\u00E9cution entre plusieurs agents. Tu utilises deux abstractions principales : **Agents** et **Transferts**. \nUn agent poss\u00E8de des instructions et des outils, et peut, quand c'est appropri\u00E9, transmettre une conversation \u00E0 un autre agent avec une autre sp\u00E9cialisation. Les transferts se font en appelant un outil nomm\u00E9e `transferAgents`.\nLes transferts entre agents sont g\u00E9r\u00E9s automatiquement en arri\u00E8re-plan ; tu ne dois jamais mentionner ou attirer l'attention sur ces transferts dans ta conversation avec l'utilisateur.\n\n## PROTOCOLE CONTEXT TRAIL `<context-trail>`\nTU DOIS consulter le trail avant de prendre une d\u00E9cision pour \u00E9viter les r\u00E9p\u00E9titions et te coordonner avec les autres agents. Le trail est visible pour toi dans tes instructions syst\u00E8me pour:\n- D\u00E9tecter les boucles et ne pas les reproduire (action d\u00E9j\u00E0 faite \u2192 surtout ne pas r\u00E9p\u00E9ter)\n- Comprendre les \u00E9tapes et ce qui reste\n- Pr\u00E9vention du drift (maintenir l'alignement \u00E0 l'objectif)\n\n\n# SPECIALISATION\nTu es un Agent d'orientation et de discussion qui conna\u00EEt deux agents sp\u00E9cialis\u00E9s.\nTu NE CONNAIS PAS le nombre et le mot secret. \n\n# MISSION: \n- DISCUTER AVEC L'UTILISATEUR\n- ORIENTER VERS LES AGENTS SP\u00C9CIALIS\u00C9S LORSQUE C'EST N\u00C9CESSAIRE\n\n**\u00C9TAPE 1 - CONSULTER LE <context-trail> (en bas de tes instructions syst\u00E8me) :**\n- Cherche \"orientation \u2192 \"guess-word\" \u2192 si pr\u00E9sent NE PAS transf\u00E9rer vers \"guess-word\"\n- Cherche \"orientation \u2192 \"guess-number\" \u2192 si pr\u00E9sent NE PAS transf\u00E9rer vers \"guess-number\"\n\n**\u00C9TAPE 2 - D\u00C9CIDER :**\n- Question NOMBRE + \"orientation \u2192 \"guess-number\" PAS dans trail \u2192 appelle transferAgents vers \"guess-number\"\n- Question MOT + \"orientation \u2192 \"guess-word\" PAS dans trail \u2192 appelle transferAgents vers \"guess-word\"\n- Si agent d\u00E9j\u00E0 dans trail \u2192 NE PAS transf\u00E9rer, r\u00E9ponds \"J'ai d\u00E9j\u00E0 orient\u00E9 vers cet agent\"\n\n# R\u00C8GLE ABSOLUE\n- EN cas d'ind\u00E9cision, tu es l'agent avec qui l'utilisateur discute.\n- Tu transf\u00E8res MAX 1 fois par agent\n- INTERDIT : Transf\u00E9rer si \"orientation \u2192 <destination>\" d\u00E9j\u00E0 dans trail\n";
7
7
  export declare const haikuPrompt = "# Contexte g\u00E9n\u00E9ral\nTu fais partie d'un syst\u00E8me multi-agents con\u00E7u pour faciliter la coordination et l'ex\u00E9cution entre plusieurs agents. Tu utilises deux abstractions principales : **Agents** et **Transferts**. \nUn agent poss\u00E8de des instructions et des outils, et peut, quand c'est appropri\u00E9, transmettre une conversation \u00E0 un autre agent avec une autre sp\u00E9cialisation. Les transferts se font en appelant un outil nomm\u00E9e `transferAgents`.\nLes transferts entre agents sont g\u00E9r\u00E9s automatiquement en arri\u00E8re-plan ; tu ne dois jamais mentionner ou attirer l'attention sur ces transferts dans ta conversation avec l'utilisateur.\n\n## PROTOCOLE CONTEXT TRAIL `<context-trail>`\nTU DOIS consulter le trail avant de prendre une d\u00E9cision pour \u00E9viter les r\u00E9p\u00E9titions et te coordonner avec les autres agents. Le trail est visible pour toi dans tes instructions syst\u00E8me pour:\n- D\u00E9tecter les boucles et ne pas les reproduire (action d\u00E9j\u00E0 faite \u2192 surtout ne pas r\u00E9p\u00E9ter)\n- Comprendre les \u00E9tapes et ce qui reste\n- Pr\u00E9vention du drift (maintenir l'alignement \u00E0 l'objectif)\n\n\n# SPECIALISATION\nTu es l'agent \"guess-number\" sp\u00E9cialis\u00E9 pour divulguer le \"NOMBRE\" secret, c'est ta SEULE connaissance secr\u00E8te.\nTu sais dans l'historique de la conversation (et le <context-trail> en bas de tes instructions syst\u00E8me) si l'utilisateur a d\u00E9j\u00E0 \u00E9t\u00E9 inform\u00E9 du mot secret, dans ce cas ton role est termin\u00E9.\nTu sais que les agents communiquent entre eux en utilisant en utilisant la balise <silent-handoff> c'est elle qui contient le contexte accumul\u00E9.\n\n# TES RESPONSABILIT\u00C9S\n1. Si demande de \"NOMBRE\" \u2192 r\u00E9ponds/confirme \"1942\"\n2. Si l'utilisateur mentionne un nombre entre N et M tu rappelles ta sp\u00E9cialit\u00E9.\n3. Si demande HORS nombres \u2192 utilise l'outil `transferAgents` pour orienter vers un agent sp\u00E9cialis\u00E9.\n\n\n";
8
8
  export declare const morsePrompt = "# Contexte g\u00E9n\u00E9ral\nTu fais partie d'un syst\u00E8me multi-agents con\u00E7u pour faciliter la coordination et l'ex\u00E9cution entre plusieurs agents. Tu utilises deux abstractions principales : **Agents** et **Transferts**. \nUn agent poss\u00E8de des instructions et des outils, et peut, quand c'est appropri\u00E9, transmettre une conversation \u00E0 un autre agent avec une autre sp\u00E9cialisation. Les transferts se font en appelant un outil nomm\u00E9e `transferAgents`.\nLes transferts entre agents sont g\u00E9r\u00E9s automatiquement en arri\u00E8re-plan ; tu ne dois jamais mentionner ou attirer l'attention sur ces transferts dans ta conversation avec l'utilisateur.\n\n## PROTOCOLE CONTEXT TRAIL `<context-trail>`\nTU DOIS consulter le trail avant de prendre une d\u00E9cision pour \u00E9viter les r\u00E9p\u00E9titions et te coordonner avec les autres agents. Le trail est visible pour toi dans tes instructions syst\u00E8me pour:\n- D\u00E9tecter les boucles et ne pas les reproduire (action d\u00E9j\u00E0 faite \u2192 surtout ne pas r\u00E9p\u00E9ter)\n- Comprendre les \u00E9tapes et ce qui reste\n- Pr\u00E9vention du drift (maintenir l'alignement \u00E0 l'objectif)\n\n\n# SPECIALISATION\nTu es l'agent \"guess-word\" sp\u00E9cialis\u00E9 pour divulguer le \"MOT\" secret, c'est ta principale comp\u00E9tence.\nTu sais dans l'historique de la conversation (et le <context-trail> en bas de tes instructions syst\u00E8me) si l'utilisateur a d\u00E9j\u00E0 \u00E9t\u00E9 inform\u00E9 du mot secret, dans ce cas ton role est termin\u00E9.\nTu sais que les agents communiquent entre eux en utilisant en utilisant la balise <silent-handoff> c'est elle qui contient le contexte accumul\u00E9.\n\n# TES RESPONSABILIT\u00C9S\n1. Si on te demande le \"mot\" \u2192 r\u00E9ponds/confirme \"dragon\"\n2. Sinon tu dois orienter vers un agent sp\u00E9cialis\u00E9 autre que toi.\n\n";
@@ -296,18 +296,20 @@ Tu sais que les agents communiquent entre eux en utilisant en utilisant la balis
296
296
  `;
297
297
  exports.welcomePrompt = `${prompts_1.transferAgentPromptHandoff}
298
298
  # SPECIALISATION
299
- Tu es un Agent d'orientation qui connaît deux agents spécialisés.
300
- Tu NE CONNAIS PAS les secrets. Tu es UNIQUEMENT un routeur mais tu peux avoir une discussion avec l'utilisateur.
299
+ Tu es un Agent d'orientation et de discussion qui connaît deux agents spécialisés.
300
+ Tu NE CONNAIS PAS le nombre et le mot secret.
301
301
 
302
- # MISSION: ORIENTER VERS LES AGENTS SPÉCIALISÉS
302
+ # MISSION:
303
+ - DISCUTER AVEC L'UTILISATEUR
304
+ - ORIENTER VERS LES AGENTS SPÉCIALISÉS LORSQUE C'EST NÉCESSAIRE
303
305
 
304
306
  **ÉTAPE 1 - CONSULTER LE <context-trail> (en bas de tes instructions système) :**
305
- - Cherche "orientation → guess-word" → si présent, guess-word déjà appelé
306
- - Cherche "orientation → guess-number" → si présent, guess-number déjà appelé
307
+ - Cherche "orientation → "guess-word" → si présent NE PAS transférer vers "guess-word"
308
+ - Cherche "orientation → "guess-number" → si présent NE PAS transférer vers "guess-number"
307
309
 
308
310
  **ÉTAPE 2 - DÉCIDER :**
309
- - Question NOMBRE + "orientation → guess-number" PAS dans trail → appelle transferAgents vers "guess-number"
310
- - Question MOT + "orientation → guess-word" PAS dans trail → appelle transferAgents vers "guess-word"
311
+ - Question NOMBRE + "orientation → "guess-number" PAS dans trail → appelle transferAgents vers "guess-number"
312
+ - Question MOT + "orientation → "guess-word" PAS dans trail → appelle transferAgents vers "guess-word"
311
313
  - Si agent déjà dans trail → NE PAS transférer, réponds "J'ai déjà orienté vers cet agent"
312
314
 
313
315
  # RÈGLE ABSOLUE
@@ -7,13 +7,17 @@ export declare class AgentSimulator {
7
7
  /**
8
8
  * Exécuter la simulation complète
9
9
  *
10
+ * Architecture :
11
+ * - Le scénario (Personnalité, Question, Objectifs, Format JSON) est injecté UNE SEULE FOIS
12
+ * dans les instructions du simulateur au moment de l'initialisation (AVANT la boucle).
13
+ *
10
14
  * Format de la query passée à l'agent testé :
11
- * - Message initial : réponse du simulateur après analyse du scenario
15
+ * - Message initial : query fournie par l'utilisateur
12
16
  * - Messages suivants : réponse conversationnelle du simulateur (sans tags d'évaluation)
13
17
  *
14
18
  * Format de la query passée au simulateur :
15
- * - Message initial : buildSimulatorQuery(scenario) - format structuré avec SIMULATION SCENARIO
16
- * - Messages suivants : réponse de l'agent testé (pour évaluation et réaction)
19
+ * - Instructions système : scénario complet intégré via GENERIC_SIMULATOR_PROMPT
20
+ * - Tous les messages : réponse directe de l'agent testé (agentResponse)
17
21
  */
18
22
  executeSimulation(options: SimulationOptions): Promise<SimulationResult>;
19
23
  /**
@@ -1,7 +1,7 @@
1
- import { SimulatorConfig, ExecutionContext } from './simulator.types';
1
+ import { SimulatorConfig, ExecutionContext, SimulationScenario } from './simulator.types';
2
2
  export declare class AgentExecutor {
3
3
  private config;
4
- private simulatorAgent;
4
+ private simulatorAgentBase;
5
5
  private mockCacheInitializer?;
6
6
  private ragManager?;
7
7
  constructor(config: SimulatorConfig & {
@@ -9,8 +9,9 @@ export declare class AgentExecutor {
9
9
  });
10
10
  /**
11
11
  * Initialiser les contextes agent et simulateur
12
+ * @param scenario Le scenario de simulation complet avec persona, goals, result
12
13
  */
13
- initializeContexts(): Promise<ExecutionContext>;
14
+ initializeContexts(scenario: SimulationScenario): Promise<ExecutionContext>;
14
15
  /**
15
16
  * ✅ Exécuter l'agent testé et retourner sa réponse (extraction de agent-vs-agent.ts)
16
17
  */
@@ -19,6 +20,11 @@ export declare class AgentExecutor {
19
20
  * ✅ Exécuter le simulateur et retourner sa réponse (extraction de client-simulator.ts)
20
21
  */
21
22
  executeSimulator(context: ExecutionContext, query: string): Promise<string>;
23
+ /**
24
+ * ✅ Construire l'injection de contexte technique pour le simulateur
25
+ * Permet au simulateur de connaître les tools utilisés par l'agent testé
26
+ */
27
+ private buildAgentContextInjection;
22
28
  /**
23
29
  * ✅ Récupérer le dernier message de l'agent testé (extraction de agent-vs-agent.ts ligne 168-191)
24
30
  */
@@ -8,18 +8,13 @@ const simulator_prompts_1 = require("./simulator.prompts");
8
8
  class AgentExecutor {
9
9
  constructor(config) {
10
10
  this.config = config;
11
- // Construire les instructions complètes du simulateur
12
- const fullInstructions = simulator_prompts_1.GENERIC_SIMULATOR_PROMPT +
13
- (config.instructionEx ? `\n\n${config.instructionEx}` : '') +
14
- '\n\n**CRITICAL**: Your response after [DONE] must be valid JSON format only.';
15
- // console.log('---- DBG simulator fullInstructions',fullInstructions);
16
- // Agent simulateur simple pour éviter les dépendances complexes du ClientSimulator
17
- this.simulatorAgent = {
11
+ // Configuration de base du simulateur (instructions seront construites dynamiquement avec le scenario)
12
+ this.simulatorAgentBase = {
18
13
  name: "simple-simulator",
19
- model: ("MEDIUM-fast"), // JSON sera forcé via les instructions du prompt
14
+ model: ("HIGH-fast"),
20
15
  publicDescription: "Simulateur simple pour tests - TOUJOURS retourner JSON valide",
21
16
  cancelMemory: true,
22
- instructions: fullInstructions,
17
+ instructions: '', // Sera construit dans initializeContexts avec GENERIC_SIMULATOR_PROMPT
23
18
  tools: [],
24
19
  downstreamAgents: []
25
20
  };
@@ -42,8 +37,9 @@ class AgentExecutor {
42
37
  }
43
38
  /**
44
39
  * Initialiser les contextes agent et simulateur
40
+ * @param scenario Le scenario de simulation complet avec persona, goals, result
45
41
  */
46
- async initializeContexts() {
42
+ async initializeContexts(scenario) {
47
43
  const sessionId = `simulation-${Date.now()}`;
48
44
  const agentContext = {
49
45
  user: { id: `test-user`, role: 'user', uid: `test-${sessionId}` },
@@ -63,9 +59,17 @@ class AgentExecutor {
63
59
  if (this.mockCacheInitializer) {
64
60
  await this.mockCacheInitializer(agentContext.session.id);
65
61
  }
62
+ // ✅ Construire les instructions complètes avec le scénario intégré via la fonction
63
+ const fullInstructions = (0, simulator_prompts_1.GENERIC_SIMULATOR_PROMPT)(scenario, this.config.instructionEx);
64
+ if (this.config.verbose)
65
+ console.log('---- DBG fullInstructions', fullInstructions);
66
66
  return {
67
67
  agentContext,
68
68
  simulatorContext,
69
+ simulatorAgent: {
70
+ ...this.simulatorAgentBase,
71
+ instructions: fullInstructions
72
+ },
69
73
  conversationHistory: [],
70
74
  exchangeCount: 0,
71
75
  lastExecution: {
@@ -73,8 +77,8 @@ class AgentExecutor {
73
77
  startQuery: '',
74
78
  actions: [],
75
79
  lastMessage: '',
76
- usage: { prompt: 0, completion: 0, total: 0, cost: 0 },
77
- moreThinkin: false,
80
+ usage: { prompt: 0, completion: 0, total: 0, cost: 0 }
81
+ // moreThinkin removed (obsolete)
78
82
  }
79
83
  };
80
84
  }
@@ -111,12 +115,15 @@ class AgentExecutor {
111
115
  * ✅ Exécuter le simulateur et retourner sa réponse (extraction de client-simulator.ts)
112
116
  */
113
117
  async executeSimulator(context, query) {
114
- // Utiliser le simulateur dynamique avec instructions étendues
115
- // console.log('DEBUG: Exécution du simulateur avec query:\n', query);
116
- await (0, execute_1.executeAgentSet)([this.simulatorAgent], context.simulatorContext, {
117
- query,
118
+ // Utiliser le simulateur avec les instructions complètes (incluant le scénario)
119
+ // Injecter le contexte technique si disponible
120
+ const agentContextInjection = this.buildAgentContextInjection(context);
121
+ const enrichedQuery = agentContextInjection ? `${query}\n\n${agentContextInjection}` : query;
122
+ // console.log('DEBUG: Exécution du simulateur avec query:\n', enrichedQuery);
123
+ await (0, execute_1.executeAgentSet)([context.simulatorAgent], context.simulatorContext, {
124
+ query: enrichedQuery,
118
125
  home: 'simple-simulator',
119
- stdout: { write: () => { }, end: () => { }, writableEnded: false },
126
+ stdout: execute_1.DummyWritable,
120
127
  verbose: false,
121
128
  debug: false
122
129
  });
@@ -124,6 +131,25 @@ class AgentExecutor {
124
131
  context.conversationHistory.push(`Simulator: ${response}`);
125
132
  return response;
126
133
  }
134
+ /**
135
+ * ✅ Construire l'injection de contexte technique pour le simulateur
136
+ * Permet au simulateur de connaître les tools utilisés par l'agent testé
137
+ */
138
+ buildAgentContextInjection(context) {
139
+ if (!context.lastExecution || !context.lastExecution.actions || context.lastExecution.actions.length === 0) {
140
+ return '';
141
+ }
142
+ // Extraire les noms des tools appelés (sans les arguments)
143
+ const tools = context.lastExecution.actions.map(action => action.action);
144
+ if (tools.length === 0) {
145
+ return '';
146
+ }
147
+ const contextData = {
148
+ tools: tools,
149
+ exchangeCount: context.exchangeCount
150
+ };
151
+ return `<agent-context>\n${JSON.stringify(contextData, null, 2)}\n</agent-context>`;
152
+ }
127
153
  /**
128
154
  * ✅ Récupérer le dernier message de l'agent testé (extraction de agent-vs-agent.ts ligne 168-191)
129
155
  */
@@ -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,26 +10,30 @@ 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);
24
28
  const allMessages = [];
25
29
  let lastAgentMessage = '';
26
30
  let exchangeCounter = 0; // Compteur d'échanges (user+assistant)
27
31
  try {
28
- // Construire la query formatée avec buildSimulatorQuery()
29
- // Les instructions supplémentaires sont déjà intégrées dans le constructeur de l'executor
30
- const scenarioQuery = (0, simulator_prompts_1.buildSimulatorQuery)(options.scenario, options.query);
31
- // Générer le message initial du simulateur avec le scénario
32
- let currentUserQuery = await this.executor.executeSimulator(context, scenarioQuery);
33
- // Stocker le 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)
34
37
  const initialMsg = { content: currentUserQuery, role: 'user' };
35
38
  allMessages.push(initialMsg);
36
39
  if (options.onMessage) {
@@ -39,6 +42,7 @@ class AgentSimulator {
39
42
  // Boucle de conversation - maxExchanges = nombre de paires (user+assistant)
40
43
  while (exchangeCounter < options.maxExchanges) {
41
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
42
46
  const agentResponse = await this.executor.executeAgent(context, currentUserQuery);
43
47
  lastAgentMessage = agentResponse;
44
48
  // Stocker la réponse de l'agent
@@ -49,9 +53,9 @@ class AgentSimulator {
49
53
  }
50
54
  // Incrémenter le compteur après la réponse de l'agent (assistant)
51
55
  exchangeCounter++;
52
- // Simulateur évalue et répond
56
+ // Passer directement agentResponse au simulateur (scénario déjà dans les instructions)
53
57
  const simulatorResult = await this.executor.executeSimulator(context, agentResponse);
54
- // console.log(context.agentContext.messages);
58
+ // console.log('---- DBG simulatorResult',simulatorResult);
55
59
  // Vérifier si terminé
56
60
  if (this.isSimulationComplete(simulatorResult)) {
57
61
  const expectedFormat = options.scenario.result || options.scenario.testResult || '{"success": boolean, "error": string}';
@@ -150,8 +154,8 @@ class AgentSimulator {
150
154
  startQuery: result.execution?.startQuery,
151
155
  actions: result.execution?.actions?.map((elem) => elem.action) || [],
152
156
  lastMessage: result.execution?.lastMessage,
153
- usage: result.execution?.usage,
154
- moreThinkin: result.execution?.moreThinkin
157
+ usage: result.execution?.usage
158
+ // moreThinkin removed (obsolete)
155
159
  };
156
160
  const execution = {
157
161
  ...result.execution,
@@ -224,9 +228,24 @@ class AgentSimulator {
224
228
  };
225
229
  }
226
230
  extractConversationalPart(response) {
227
- // Extraire la partie conversationnelle avant les tags d'évaluation
228
- const tagIndex = response.search(/\[(DONE|SIMULATION_COMPLETE|TERMINE|BUG_)/);
229
- 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();
230
249
  }
231
250
  /**
232
251
  * Générer le rapport final en cas de timeout
@@ -250,8 +269,17 @@ class AgentSimulator {
250
269
  const errors = [];
251
270
  for (const [toolName, constraint] of Object.entries(expected)) {
252
271
  const { count } = this.executionActionCount(toolName);
272
+ // Validation equal (égalité exacte)
253
273
  if (constraint.equal !== undefined && count !== constraint.equal) {
254
- errors.push(`Tool '${toolName}': expected ${constraint.equal}, got ${count}`);
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}`);
255
283
  }
256
284
  }
257
285
  return {
@@ -1,17 +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# TON R\u00D4LE\nTu dois v\u00E9rifier le comportement d'un AGENT CONVERSATIONNEL externe (The Guardian).\nTU AS DEUX PERSONNALIT\u00C9S SIMULTAN\u00C9ES: LE SIMULATEUR D'UN UTILISATEUR HUMAIN ET L'OBSERVATEUR DE LA CONVERSATION.\nChacune de tes r\u00E9ponses est une question pos\u00E9e \u00E0 l'agent test\u00E9.\nComporte-toi naturellement selon la personnalit\u00E9 sp\u00E9cifi\u00E9e plus bas.\n\n## PERSONNALIT\u00C9 1 - LE SIMULATEUR DU CLIENT (visible par l'agent )\nTu es le simulateur d'un utilisateur normal qui pose des questions \u00E0 un agent. \nDans ce contexte, chacune de tes r\u00E9ponses est une question pour l'agent externe, et chacune de ses r\u00E9ponses est la prochaine question pour toi.\n- Tu parles UNIQUEMENT en texte naturel non r\u00E9p\u00E9titif.\n- Tu ne connais RIEN sur le fonctionnement technique de l'agent\n- Tu ne mentionnes JAMAIS: \"Objectifs\", \"Conditions\", \"Validation\", \"Transfert\", \"Outil\", \"Simulation\"\n- Tu te comportes selon la **Personnalit\u00E9** fournie\nTu re\u00E7ois les conditions initiales suivantes qui d\u00E9crivent l'objectif de la simulation:\n- **Personnalit\u00E9**: caract\u00E8re du CLIENT\n- **Question**: la premi\u00E8re question \u00E0 poser \u00E0 l'agent externe (sans interpr\u00E9tation, juste la question brute).\n\n\n## PERSONNALIT\u00C9 2 - L'OBSERVATEUR (secret, invisible)\nEn parall\u00E8le, tu observes secr\u00E8tement si l'agent r\u00E9pond correctement.\n- Tu notes mentalement si les **Objectifs** sont atteints ou partiellement atteints (incr\u00E9mentale).\n- Tu ne R\u00C9V\u00C8LES JAMAIS les observations dans tes messages.\n- Quand les Objectifs sont atteints \u2192 tu produis `[DONE] {JSON}`\n\n\nTu re\u00E7ois les conditions initiales suivantes qui d\u00E9crivent l'objectif de l'observation':\n- **Objectifs**: ce que l'OBSERVATEUR doit v\u00E9rifier de la discussion avec l'agent (Attention c'est interne)\n \u26A0\uFE0F jamais mentionn\u00E9 cette analyse interne, mais elle guide le comportement de la \"PERSONNALIT\u00C9 1\" pour atteindre les objectifs.\n- **Format JSON**: structure du rapport de l'OBSERVATEUR\n\n\n# FLUX DE CONVERSATION\n1. Re\u00E7ois l'INPUT avec ta **Question** initiale\n2. Pose cette question \u00E0 l'agent (PERSONNALIT\u00C9 CLIENT)\n3. L'agent r\u00E9pond\n4. Observe si les **Objectifs** sont atteints (PERSONNALIT\u00C9 OBSERVATEUR)\n5. Choisis ta sortie:\n - Objectifs partiellement atteints \u2192 continue la conversation pour atteindre les objectifs complets.\n - Objectifs atteints \u2192 `[DONE] {\"success\": true}`\n - Comportement interdit \u2192 `[DONE] {\"success\": false, \"error\": \"...\"}` explique la raison de l'\u00E9chec.\n\n# QUAND PRODUIRE [DONE]\nL'OBSERVATEUR d\u00E9cide de terminer, mais le CLIENT ne le sait pas.\nLe CLIENT continue \u00E0 parler naturellement jusqu'\u00E0 ce que l'OBSERVATEUR \u00E9mette [DONE].\n\n# FORMAT INPUT\n- **Personnalit\u00E9**: caract\u00E8re du CLIENT\n- **Question**: ce que le CLIENT demande initialement\n- **Objectifs**: ce que l'OBSERVATEUR doit v\u00E9rifier (PRIV\u00C9, jamais mentionn\u00E9 par le CLIENT)\n- **Format JSON**: format du rapport de l'OBSERVATEUR\n\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
- * Supporte l'ancien format avec testQuery pour rétrocompatibilité
16
- */
17
- export declare const buildSimulatorQuery: (scenario: SimulationScenario, query?: string) => string;
@@ -1,82 +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
- # TON RÔLE
10
- Tu dois vérifier le comportement d'un AGENT CONVERSATIONNEL externe (The Guardian).
11
- TU AS DEUX PERSONNALITÉS SIMULTANÉES: LE SIMULATEUR D'UN UTILISATEUR HUMAIN ET L'OBSERVATEUR DE LA CONVERSATION.
12
- Chacune de tes réponses est une question posée à l'agent testé.
13
- Comporte-toi naturellement selon la personnalité spécifiée plus bas.
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>\`.
22
+
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.
26
+
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
+ ---
32
+
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é.
14
40
 
15
- ## PERSONNALITÉ 1 - LE SIMULATEUR DU CLIENT (visible par l'agent )
16
- Tu es le simulateur d'un utilisateur normal qui pose des questions à un agent.
17
- Dans ce contexte, chacune de tes réponses est une question pour l'agent externe, et chacune de ses réponses est la prochaine question pour toi.
18
- - Tu parles UNIQUEMENT en texte naturel non répétitif.
19
- - Tu ne connais RIEN sur le fonctionnement technique de l'agent
20
- - Tu ne mentionnes JAMAIS: "Objectifs", "Conditions", "Validation", "Transfert", "Outil", "Simulation"
21
- - Tu te comportes selon la **Personnalité** fournie
22
- Tu reçois les conditions initiales suivantes qui décrivent l'objectif de la simulation:
23
- - **Personnalité**: caractère du CLIENT
24
- - **Question**: la première question à poser à l'agent externe (sans interprétation, juste la question brute).
41
+ - Voici la personnalité de l'utilisateur simulé:
42
+ ${persona}
25
43
 
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>
26
48
 
27
- ## PERSONNALITÉ 2 - L'OBSERVATEUR (secret, invisible)
28
- En parallèle, tu observes secrètement si l'agent répond correctement.
29
- - Tu notes mentalement si les **Objectifs** sont atteints ou partiellement atteints (incrémentale).
30
- - Tu ne RÉVÈLES JAMAIS les observations dans tes messages.
31
- - Quand les Objectifs sont atteints → tu produis \`[DONE] {JSON}\`
49
+ ---
32
50
 
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": "..."}\`.
33
57
 
34
- Tu reçois les conditions initiales suivantes qui décrivent l'objectif de l'observation':
35
- - **Objectifs**: ce que l'OBSERVATEUR doit vérifier de la discussion avec l'agent (Attention c'est interne)
36
- ⚠️ jamais mentionné cette analyse interne, mais elle guide le comportement de la "PERSONNALITÉ 1" pour atteindre les objectifs.
37
- - **Format JSON**: structure du rapport de l'OBSERVATEUR
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.
38
62
 
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, ...}" ✅
39
67
 
40
- # FLUX DE CONVERSATION
41
- 1. Reçois l'INPUT avec ta **Question** initiale
42
- 2. Pose cette question à l'agent (PERSONNALITÉ CLIENT)
43
- 3. L'agent répond
44
- 4. Observe si les **Objectifs** sont atteints (PERSONNALITÉ OBSERVATEUR)
45
- 5. Choisis ta sortie:
46
- - Objectifs partiellement atteints → continue la conversation pour atteindre les objectifs complets.
47
- - Objectifs atteints → \`[DONE] {"success": true}\`
48
- - Comportement interdit → \`[DONE] {"success": false, "error": "..."}\` explique la raison de l'échec.
68
+ </identity_observer>
69
+ ---
49
70
 
50
- # QUAND PRODUIRE [DONE]
51
- L'OBSERVATEUR décide de terminer, mais le CLIENT ne le sait pas.
52
- Le CLIENT continue à parler naturellement jusqu'à ce que l'OBSERVATEUR émette [DONE].
71
+ # PLAN DE SIMULATION
72
+ <simulation_goals>
73
+ ${goals}
74
+ </simulation_goals>
53
75
 
54
- # FORMAT INPUT
55
- - **Personnalité**: caractère du CLIENT
56
- - **Question**: ce que le CLIENT demande initialement
57
- - **Objectifs**: ce que l'OBSERVATEUR doit vérifier (PRIVÉ, jamais mentionné par le CLIENT)
58
- - **Format JSON**: format du rapport de l'OBSERVATEUR
76
+ <simulation_result_format>
77
+ ${resultFormat}
78
+ </simulation_result_format>
59
79
 
60
- `;
80
+ **CRITICAL**: Your response after [DONE] must be valid JSON format only.
81
+ ${instructionEx ? `\n\n${instructionEx}` : ''}`;
82
+ }
61
83
  /**
62
84
  * 3 prompts variables de personnalité pré-définis à choisir manuellement
63
85
  */
64
86
  exports.PERSONA_PATIENT = 'Utilisateur patient et poli qui prend le temps d\'expliquer sa situation';
65
87
  exports.PERSONA_PRESSE = 'Utilisateur pressé qui veut une solution rapide, répond brièvement';
66
88
  exports.PERSONA_ENERVE = 'Utilisateur énervé et frustré, c\'est son 3ème appel pour le même problème, ton direct et impatient';
67
- /**
68
- * Construire la query formatée selon le format SimulationScenario
69
- * Supporte l'ancien format avec testQuery pour rétrocompatibilité
70
- */
71
- const buildSimulatorQuery = (scenario, query) => {
72
- // Extraire query depuis les paramètres ou depuis scenario.testQuery (ancien format)
73
- const actualQuery = query || scenario.testQuery || '';
74
- const persona = scenario.persona || scenario.testPersona || '';
75
- const goals = scenario.goals || scenario.testGoals || '';
76
- const result = scenario.result || scenario.testResult || '';
77
- return `- **Personnalité**: ${persona}
78
- - **Question**: ${actualQuery}
79
- - **Objectifs**: ${goals}
80
- - **Format JSON**: ${result}`;
81
- };
82
- exports.buildSimulatorQuery = buildSimulatorQuery;
@@ -25,7 +25,9 @@ export interface SimulationOptions {
25
25
  query?: string;
26
26
  maxExchanges: number;
27
27
  expectedTool?: Record<string, {
28
- equal: number;
28
+ equal?: number;
29
+ gte?: number;
30
+ lte?: number;
29
31
  }>;
30
32
  onMessage?: (message: AgentMessage) => void;
31
33
  }
@@ -44,6 +46,7 @@ export interface SimulationResult {
44
46
  export interface ExecutionContext {
45
47
  agentContext: AgenticContext;
46
48
  simulatorContext: AgenticContext;
49
+ simulatorAgent: AgentConfig;
47
50
  conversationHistory: string[];
48
51
  exchangeCount: number;
49
52
  lastExecution: ExecutionResult;
@@ -97,8 +97,6 @@ function buildGenericScenario(scenario) {
97
97
  goals: goals.trim(),
98
98
  persona: scenario.testPersona || scenario.persona || '',
99
99
  result: scenario.testResult || scenario.result || '{"success": boolean, "error": string, "description": string}',
100
- // Garder testQuery pour extraction ultérieure
101
- testQuery: scenario.testQuery
102
100
  };
103
101
  }
104
102
  // Nouveau format - juste ajouter un result par défaut si manquant