agentic-api 2.0.314 → 2.0.585

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +37 -34
  2. package/dist/src/agents/prompts.d.ts +1 -1
  3. package/dist/src/agents/prompts.js +9 -7
  4. package/dist/src/agents/reducer.core.js +2 -2
  5. package/dist/src/agents/simulator.d.ts +33 -4
  6. package/dist/src/agents/simulator.dashboard.d.ts +140 -0
  7. package/dist/src/agents/simulator.dashboard.js +344 -0
  8. package/dist/src/agents/simulator.executor.d.ts +9 -3
  9. package/dist/src/agents/simulator.executor.js +43 -17
  10. package/dist/src/agents/simulator.js +103 -19
  11. package/dist/src/agents/simulator.prompts.d.ts +9 -8
  12. package/dist/src/agents/simulator.prompts.js +68 -62
  13. package/dist/src/agents/simulator.types.d.ts +39 -4
  14. package/dist/src/agents/simulator.utils.d.ts +22 -1
  15. package/dist/src/agents/simulator.utils.js +27 -2
  16. package/dist/src/execute/helpers.d.ts +75 -0
  17. package/dist/src/execute/helpers.js +139 -0
  18. package/dist/src/execute/index.d.ts +11 -0
  19. package/dist/src/execute/index.js +44 -0
  20. package/dist/src/execute/legacy.d.ts +46 -0
  21. package/dist/src/{execute.js → execute/legacy.js} +130 -232
  22. package/dist/src/execute/modelconfig.d.ts +29 -0
  23. package/dist/src/execute/modelconfig.js +72 -0
  24. package/dist/src/execute/responses.d.ts +55 -0
  25. package/dist/src/execute/responses.js +595 -0
  26. package/dist/src/execute/shared.d.ts +83 -0
  27. package/dist/src/execute/shared.js +188 -0
  28. package/dist/src/index.d.ts +5 -1
  29. package/dist/src/index.js +21 -2
  30. package/dist/src/llm/config.d.ts +25 -0
  31. package/dist/src/llm/config.js +38 -0
  32. package/dist/src/llm/index.d.ts +48 -0
  33. package/dist/src/llm/index.js +115 -0
  34. package/dist/src/llm/openai.d.ts +6 -0
  35. package/dist/src/llm/openai.js +154 -0
  36. package/dist/src/llm/pricing.d.ts +26 -0
  37. package/dist/src/llm/pricing.js +129 -0
  38. package/dist/src/llm/xai.d.ts +17 -0
  39. package/dist/src/llm/xai.js +90 -0
  40. package/dist/src/pricing.llm.d.ts +3 -15
  41. package/dist/src/pricing.llm.js +10 -230
  42. package/dist/src/prompts.d.ts +0 -1
  43. package/dist/src/prompts.js +51 -118
  44. package/dist/src/rag/embeddings.d.ts +5 -1
  45. package/dist/src/rag/embeddings.js +23 -7
  46. package/dist/src/rag/parser.js +1 -1
  47. package/dist/src/rag/rag.manager.d.ts +33 -2
  48. package/dist/src/rag/rag.manager.js +159 -61
  49. package/dist/src/rag/types.d.ts +2 -0
  50. package/dist/src/rag/usecase.js +8 -11
  51. package/dist/src/rules/git/git.e2e.helper.js +21 -2
  52. package/dist/src/rules/git/git.health.d.ts +4 -2
  53. package/dist/src/rules/git/git.health.js +113 -16
  54. package/dist/src/rules/git/index.d.ts +1 -1
  55. package/dist/src/rules/git/index.js +3 -2
  56. package/dist/src/rules/git/repo.d.ts +57 -7
  57. package/dist/src/rules/git/repo.js +326 -39
  58. package/dist/src/rules/git/repo.pr.d.ts +8 -0
  59. package/dist/src/rules/git/repo.pr.js +161 -13
  60. package/dist/src/rules/git/repo.tools.d.ts +5 -1
  61. package/dist/src/rules/git/repo.tools.js +54 -7
  62. package/dist/src/rules/types.d.ts +25 -0
  63. package/dist/src/rules/utils.matter.d.ts +0 -20
  64. package/dist/src/rules/utils.matter.js +58 -81
  65. package/dist/src/scrapper.js +3 -2
  66. package/dist/src/stategraph/stategraph.d.ts +26 -1
  67. package/dist/src/stategraph/stategraph.js +43 -2
  68. package/dist/src/stategraph/stategraph.storage.js +4 -0
  69. package/dist/src/stategraph/types.d.ts +5 -0
  70. package/dist/src/types.d.ts +42 -7
  71. package/dist/src/types.js +8 -7
  72. package/dist/src/usecase.js +1 -1
  73. package/dist/src/utils.d.ts +0 -8
  74. package/dist/src/utils.js +26 -29
  75. package/package.json +9 -7
  76. package/dist/src/execute.d.ts +0 -63
package/README.md CHANGED
@@ -66,15 +66,24 @@ npm install @agentic-api
66
66
 
67
67
  ## 💡 Quick Start
68
68
 
69
+ ### Configuration `.env`
70
+
71
+ ```bash
72
+ # Provider LLM (openai | xai)
73
+ LLM_PROVIDER=openai
74
+
75
+ # Clés API
76
+ OPENAI_API_KEY=sk-... # Requis pour OpenAI + embeddings + whisper
77
+ XAI_API_KEY=xai-... # Requis si LLM_PROVIDER=xai
78
+ ```
79
+
80
+ ### Usage
81
+
69
82
  ```typescript
70
- import OpenAI from "openai";
71
- import { executeAgentSet } from '@agentic-api';
72
- import { AgenticContext } from '@agentic-api';
73
- import { AgentStateGraph } from '@agentic-api';
83
+ import { llmInstance, executeAgentSet, AgenticContext, AgentStateGraph } from '@agentic-api';
74
84
 
75
- const openai = new OpenAI({
76
- apiKey: process.env.OPENAI_API_KEY,
77
- });
85
+ // Initialiser le LLM (utilise LLM_PROVIDER depuis .env)
86
+ llmInstance();
78
87
 
79
88
  // Create context with user information
80
89
  const context: AgenticContext = {
@@ -357,41 +366,35 @@ const structuredResult = await mapper.reduce(config, structuredCallback, {
357
366
 
358
367
  Advanced testing framework for agent behavior validation with scenario-based simulations.
359
368
 
360
- - **Scenario-Based Testing**: Define complex test scenarios with goals, personas, and expected outcomes
361
- - **Conversational Simulation**: Simulate realistic user interactions with agents
362
- - **Automatic Validation**: Built-in success/failure detection and error reporting
369
+ - **Clean API**: Separated `scenario` (context) and `testCase` (test parameters)
370
+ - **Oneshot by Default**: `maxExchanges=1` for simple single-response tests
371
+ - **Automatic Tool Validation**: Built-in validation with `expectedTools`
363
372
  - **Exchange Limiting**: Control simulation length with configurable exchange limits
364
373
 
365
374
  📖 **[Complete Agent Simulator Documentation →](./docs/README-AGENT-SIMULATOR.md)**
366
375
 
367
376
  ```typescript
368
- import { AgentSimulator, SimulationScenario } from '@agentic-api';
369
-
370
- // Define test scenario
371
- const scenario: SimulationScenario = {
372
- testGoals: "Verify that the agent can help with haiku creation",
373
- testEnd: "Agent provides a complete haiku poem",
374
- testPersona: "A poetry enthusiast seeking creative assistance",
375
- testQuery: "I want to write a haiku about nature. Can you help me?",
376
- testResult: "Agent successfully guides haiku creation process",
377
- testError: "Agent refuses to help or provides incorrect format"
378
- };
377
+ import { AgentSimulator, PERSONA_PATIENT } from '@agentic-api';
379
378
 
380
379
  // Configure simulator
381
380
  const simulator = new AgentSimulator({
382
381
  agents: [haikuAgent, welcomeAgent],
383
382
  start: "welcome",
384
- verbose: true,
385
- instructionEx: "Focus on creative writing assistance"
383
+ verbose: true
386
384
  });
387
385
 
388
- // Run simulation
389
- const result = await simulator.executeSimulation({
390
- scenario,
391
- maxExchanges: 10,
392
- onMessage: (message) => {
393
- console.log(`${message.role}: ${message.content}`);
394
- }
386
+ // Define test scenario (context)
387
+ const scenario = {
388
+ goals: "Verify that the agent can help with haiku creation. Agent provides a complete haiku poem.",
389
+ persona: PERSONA_PATIENT
390
+ // result defaults to '{"success": boolean, "explain": string, "error": string}'
391
+ };
392
+
393
+ // Run test case
394
+ const result = await simulator.testCase(scenario, {
395
+ query: "I want to write a haiku about nature. Can you help me?",
396
+ maxExchanges: 5, // defaults to 1 (oneshot)
397
+ expectedTools: { 'transferAgents': { gte: 1 } } // defaults to {}
395
398
  });
396
399
 
397
400
  // Validate results
@@ -406,10 +409,10 @@ if (!result.success) {
406
409
 
407
410
  ### Simulation Features
408
411
 
409
- - **Structured Scenarios**: Define test goals, end conditions, and expected behaviors
410
- - **Persona Simulation**: Simulator adopts specific user personas for realistic testing
411
- - **Error Detection**: Automatic detection of unwanted content or behaviors
412
- - **Exchange Tracking**: Monitor conversation flow and agent performance
412
+ - **Separated Concerns**: `scenario` for context, `testCase` for test parameters
413
+ - **Sensible Defaults**: `maxExchanges=1`, `expectedTools={}`, default result format
414
+ - **Persona Simulation**: Built-in personas (PERSONA_PATIENT, PERSONA_PRESSE, PERSONA_ENERVE)
415
+ - **Tool Validation**: Automatic validation with `equal`, `gte`, `lte` constraints
413
416
  - **Execution Metadata**: Access to token usage, actions, and performance metrics
414
417
 
415
418
  ## 📋 Rules Management System
@@ -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
@@ -5,7 +5,7 @@
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.MapLLM = void 0;
7
7
  const execute_1 = require("../execute");
8
- const utils_1 = require("../utils");
8
+ const llm_1 = require("../llm");
9
9
  /**
10
10
  * MapLLM - Orchestrateur principal pour le reduce hiérarchique
11
11
  */
@@ -54,7 +54,7 @@ class MapLLM {
54
54
  let totalChunkSize = 0;
55
55
  let totalReduce = 0;
56
56
  const model = (0, execute_1.modelConfig)(result.model);
57
- const openai = (0, utils_1.openaiInstance)();
57
+ const openai = (0, llm_1.llmInstance)();
58
58
  const llm = Object.assign({}, model);
59
59
  llm.stream = false;
60
60
  delete llm.stream_options;
@@ -1,19 +1,48 @@
1
- import { SimulatorConfig, SimulationOptions, SimulationResult } from './simulator.types';
1
+ import { SimulatorConfig, SimulationOptions, SimulationResult, TestScenario, TestCaseInput } from './simulator.types';
2
2
  export declare class AgentSimulator {
3
3
  private config;
4
4
  private executor;
5
5
  private lastExecution?;
6
6
  constructor(config: SimulatorConfig);
7
7
  /**
8
+ * Exécuter un cas de test avec scénario et paramètres séparés
9
+ *
10
+ * @param scenario - Contexte stable (goals, persona, result)
11
+ * @param testCase - Paramètres du test (query, maxExchanges, model, expectedTools)
12
+ * @returns SimulationResult
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const scenario = {
17
+ * goals: 'Obtenir le nombre secret 1942',
18
+ * persona: PERSONA_PATIENT,
19
+ * result: '{"success": boolean, "error": string}'
20
+ * };
21
+ *
22
+ * const result = await simulator.testCase(scenario, {
23
+ * query: 'À quel nombre penses-tu?',
24
+ * maxExchanges: 3, // défaut: 1 (oneshot)
25
+ * expectedTools: { 'transferAgents': { equal: 1 } } // défaut: {}
26
+ * });
27
+ * ```
28
+ */
29
+ testCase(scenario: TestScenario, testCase: TestCaseInput): Promise<SimulationResult>;
30
+ /**
31
+ * @deprecated Utiliser testCase(scenario, case) à la place
32
+ *
8
33
  * Exécuter la simulation complète
9
34
  *
35
+ * Architecture :
36
+ * - Le scénario (Personnalité, Question, Objectifs, Format JSON) est injecté UNE SEULE FOIS
37
+ * dans les instructions du simulateur au moment de l'initialisation (AVANT la boucle).
38
+ *
10
39
  * Format de la query passée à l'agent testé :
11
- * - Message initial : réponse du simulateur après analyse du scenario
40
+ * - Message initial : query fournie par l'utilisateur
12
41
  * - Messages suivants : réponse conversationnelle du simulateur (sans tags d'évaluation)
13
42
  *
14
43
  * 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)
44
+ * - Instructions système : scénario complet intégré via GENERIC_SIMULATOR_PROMPT
45
+ * - Tous les messages : réponse directe de l'agent testé (agentResponse)
17
46
  */
18
47
  executeSimulation(options: SimulationOptions): Promise<SimulationResult>;
19
48
  /**
@@ -0,0 +1,140 @@
1
+ import { TestScenario, TestCaseInput, SimulatorConfig } from './simulator.types';
2
+ import { AgentMessage } from '../stategraph';
3
+ /**
4
+ * Test case combining scenario and case input
5
+ * Format du fichier JSON d'entrée
6
+ */
7
+ export interface DashboardTestCase {
8
+ id?: string;
9
+ name?: string;
10
+ scenario: TestScenario;
11
+ case: TestCaseInput;
12
+ }
13
+ /**
14
+ * Format du fichier JSON d'entrée
15
+ */
16
+ export interface DashboardInput {
17
+ name?: string;
18
+ description?: string;
19
+ config?: Partial<SimulatorConfig>;
20
+ tests: DashboardTestCase[];
21
+ }
22
+ /**
23
+ * Status d'exécution d'un test
24
+ */
25
+ export type TestStatus = 'pending' | 'running' | 'completed' | 'failed' | 'error';
26
+ /**
27
+ * Ligne JSONL pour un résultat de test
28
+ */
29
+ export interface DashboardOutputLine {
30
+ type: 'start' | 'result' | 'end' | 'error';
31
+ timestamp: string;
32
+ sessionId?: string;
33
+ totalTests?: number;
34
+ testId?: string;
35
+ testIndex?: number;
36
+ name?: string;
37
+ description?: string;
38
+ query?: string;
39
+ status?: TestStatus;
40
+ success?: boolean;
41
+ message?: string;
42
+ error?: string;
43
+ exchangeCount?: number;
44
+ messages?: AgentMessage[];
45
+ duration?: number;
46
+ summary?: {
47
+ total: number;
48
+ passed: number;
49
+ failed: number;
50
+ errors: number;
51
+ totalDuration: number;
52
+ };
53
+ }
54
+ /**
55
+ * Status de l'exécution pour le contrôleur backend
56
+ */
57
+ export interface DashboardStatus {
58
+ isRunning: boolean;
59
+ sessionId: string | null;
60
+ currentTest: number;
61
+ totalTests: number;
62
+ passed: number;
63
+ failed: number;
64
+ errors: number;
65
+ startTime: Date | null;
66
+ lastUpdate: Date | null;
67
+ }
68
+ export declare class SimulatorDashboard {
69
+ private config;
70
+ private status;
71
+ private simulator;
72
+ private abortController;
73
+ private _currentOutputPath;
74
+ private _currentInputPath;
75
+ constructor(config: SimulatorConfig);
76
+ /**
77
+ * Chemin du fichier output actuel (ou du dernier run)
78
+ */
79
+ get currentOutputPath(): string | null;
80
+ /**
81
+ * Chemin du fichier input actuel (ou du dernier run)
82
+ */
83
+ get currentInputPath(): string | null;
84
+ private createInitialStatus;
85
+ /**
86
+ * Obtenir le status actuel (pour le contrôleur backend)
87
+ */
88
+ getStatus(): DashboardStatus;
89
+ /**
90
+ * Vérifier si une exécution est en cours
91
+ */
92
+ isRunning(): boolean;
93
+ /**
94
+ * Annuler l'exécution en cours
95
+ */
96
+ abort(): void;
97
+ /**
98
+ * Charger un fichier JSON d'entrée
99
+ */
100
+ loadInputFile(filePath: string): Promise<DashboardInput>;
101
+ /**
102
+ * Générer le chemin du fichier output basé sur le fichier input
103
+ * Exemple: tests/my-tests.json → tests/results.my-tests.jsonl
104
+ */
105
+ createOutputPath(inputPath: string): string;
106
+ /**
107
+ * Charger les résultats JSONL existants (en cours ou terminés)
108
+ * Supporte le streaming partiel (fichier en cours d'écriture)
109
+ *
110
+ * @param inputPath - Chemin du fichier JSON d'entrée (génère automatiquement le output path)
111
+ * @returns Les lignes parsées ou null si le fichier n'existe pas
112
+ */
113
+ loadResults(inputPath?: string): Promise<DashboardOutputLine[] | null>;
114
+ /**
115
+ * Obtenir le résumé des résultats (dernière ligne type='end')
116
+ * @param inputPath - Chemin du fichier JSON d'entrée
117
+ */
118
+ getResultsSummary(inputPath?: string): Promise<DashboardOutputLine['summary'] | null>;
119
+ /**
120
+ * Vérifier si les résultats sont complets (contient une ligne 'end')
121
+ * @param inputPath - Chemin du fichier JSON d'entrée
122
+ */
123
+ isResultsComplete(inputPath?: string): Promise<boolean>;
124
+ /**
125
+ * Exécuter les tests et écrire les résultats en JSONL
126
+ *
127
+ * @param input - Données d'entrée (ou chemin vers fichier JSON)
128
+ * @param outputPath - Chemin du fichier JSONL de sortie
129
+ * @param onLine - Callback optionnel pour chaque ligne JSONL (streaming)
130
+ */
131
+ run(input: DashboardInput | string, outputPath?: string, onLine?: (line: DashboardOutputLine) => void): Promise<DashboardOutputLine[]>;
132
+ /**
133
+ * Exécuter avec callback de streaming (pour SSE/WebSocket)
134
+ */
135
+ runWithStream(input: DashboardInput | string, onLine: (line: DashboardOutputLine) => void): Promise<DashboardOutputLine[]>;
136
+ /**
137
+ * Créer un fichier JSON d'exemple pour les tests
138
+ */
139
+ static createExampleInput(): DashboardInput;
140
+ }