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.
- package/dist/src/agents/prompts.d.ts +1 -1
- package/dist/src/agents/prompts.js +9 -7
- package/dist/src/agents/simulator.d.ts +7 -3
- package/dist/src/agents/simulator.executor.d.ts +9 -3
- package/dist/src/agents/simulator.executor.js +43 -17
- package/dist/src/agents/simulator.js +47 -19
- package/dist/src/agents/simulator.prompts.d.ts +9 -8
- package/dist/src/agents/simulator.prompts.js +68 -62
- package/dist/src/agents/simulator.types.d.ts +4 -1
- package/dist/src/agents/simulator.utils.js +0 -2
- package/dist/src/execute/helpers.d.ts +75 -0
- package/dist/src/execute/helpers.js +139 -0
- package/dist/src/execute/index.d.ts +11 -0
- package/dist/src/execute/index.js +44 -0
- package/dist/src/execute/legacy.d.ts +46 -0
- package/dist/src/{execute.js → execute/legacy.js} +130 -232
- package/dist/src/execute/modelconfig.d.ts +19 -0
- package/dist/src/execute/modelconfig.js +56 -0
- package/dist/src/execute/responses.d.ts +55 -0
- package/dist/src/execute/responses.js +594 -0
- package/dist/src/execute/shared.d.ts +83 -0
- package/dist/src/execute/shared.js +188 -0
- package/dist/src/index.js +1 -1
- package/dist/src/pricing.llm.d.ts +1 -1
- package/dist/src/pricing.llm.js +39 -18
- package/dist/src/rag/embeddings.js +8 -2
- package/dist/src/rag/rag.manager.js +27 -15
- package/dist/src/rules/git/git.e2e.helper.js +21 -2
- package/dist/src/rules/git/git.health.d.ts +4 -2
- package/dist/src/rules/git/git.health.js +58 -16
- package/dist/src/rules/git/index.d.ts +1 -1
- package/dist/src/rules/git/index.js +3 -2
- package/dist/src/rules/git/repo.d.ts +46 -3
- package/dist/src/rules/git/repo.js +264 -23
- package/dist/src/rules/git/repo.pr.js +117 -13
- package/dist/src/rules/types.d.ts +11 -0
- package/dist/src/rules/utils.matter.js +16 -7
- package/dist/src/scrapper.js +1 -0
- package/dist/src/stategraph/stategraph.d.ts +26 -1
- package/dist/src/stategraph/stategraph.js +43 -2
- package/dist/src/stategraph/stategraph.storage.js +4 -0
- package/dist/src/stategraph/types.d.ts +5 -0
- package/dist/src/types.d.ts +42 -7
- package/dist/src/types.js +8 -7
- package/dist/src/usecase.js +1 -1
- package/dist/src/utils.js +28 -4
- package/package.json +9 -7
- 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
|
|
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
|
|
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:
|
|
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
|
|
306
|
-
- Cherche "orientation → guess-number" → si présent
|
|
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 :
|
|
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
|
-
* -
|
|
16
|
-
* -
|
|
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
|
|
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
|
-
//
|
|
12
|
-
|
|
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: ("
|
|
14
|
+
model: ("HIGH-fast"),
|
|
20
15
|
publicDescription: "Simulateur simple pour tests - TOUJOURS retourner JSON valide",
|
|
21
16
|
cancelMemory: true,
|
|
22
|
-
instructions:
|
|
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
|
|
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
|
|
115
|
-
//
|
|
116
|
-
|
|
117
|
-
|
|
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:
|
|
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 :
|
|
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
|
-
* -
|
|
20
|
-
* -
|
|
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
|
-
|
|
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
|
-
//
|
|
29
|
-
//
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
//
|
|
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(
|
|
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
|
|
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
|
-
|
|
229
|
-
|
|
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
|
-
*
|
|
4
|
-
*
|
|
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
|
|
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.
|
|
3
|
+
exports.PERSONA_ENERVE = exports.PERSONA_PRESSE = exports.PERSONA_PATIENT = void 0;
|
|
4
|
+
exports.GENERIC_SIMULATOR_PROMPT = GENERIC_SIMULATOR_PROMPT;
|
|
4
5
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
|
|
35
|
-
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
#
|
|
51
|
-
|
|
52
|
-
|
|
71
|
+
# PLAN DE SIMULATION
|
|
72
|
+
<simulation_goals>
|
|
73
|
+
${goals}
|
|
74
|
+
</simulation_goals>
|
|
53
75
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
|
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
|