agentic-api 1.0.6 → 2.0.26
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/README.md +118 -22
- package/dist/src/agents/agents.example.d.ts +3 -0
- package/dist/src/agents/agents.example.js +38 -0
- package/dist/src/agents/authentication.js +2 -0
- package/dist/src/agents/prompts.d.ts +2 -2
- package/dist/src/agents/prompts.js +112 -49
- package/dist/src/agents/reducer.core.d.ts +12 -0
- package/dist/src/agents/reducer.core.js +207 -0
- package/dist/src/agents/reducer.d.ts +3 -0
- package/dist/src/agents/reducer.example.d.ts +28 -0
- package/dist/src/agents/reducer.example.js +118 -0
- package/dist/src/agents/reducer.js +19 -0
- package/dist/src/agents/reducer.loaders.d.ts +34 -0
- package/dist/src/agents/reducer.loaders.js +122 -0
- package/dist/src/agents/reducer.process.d.ts +16 -0
- package/dist/src/agents/reducer.process.js +143 -0
- package/dist/src/agents/reducer.tools.d.ts +29 -0
- package/dist/src/agents/reducer.tools.js +157 -0
- package/dist/src/agents/reducer.types.d.ts +50 -0
- package/dist/src/agents/reducer.types.js +5 -0
- package/dist/src/agents/simulator.d.ts +47 -0
- package/dist/src/agents/simulator.executor.d.ts +26 -0
- package/dist/src/agents/simulator.executor.js +132 -0
- package/dist/src/agents/simulator.js +205 -0
- package/dist/src/agents/simulator.prompts.d.ts +16 -0
- package/dist/src/agents/simulator.prompts.js +108 -0
- package/dist/src/agents/simulator.types.d.ts +42 -0
- package/dist/src/agents/simulator.types.js +2 -0
- package/dist/src/agents/simulator.utils.d.ts +20 -0
- package/dist/src/agents/simulator.utils.js +87 -0
- package/dist/src/execute.d.ts +13 -6
- package/dist/src/execute.js +351 -85
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.js +14 -0
- package/dist/src/princing.openai.d.ts +9 -2
- package/dist/src/princing.openai.js +15 -11
- package/dist/src/prompts.d.ts +3 -2
- package/dist/src/prompts.js +159 -19
- package/dist/src/rag/embeddings.d.ts +103 -0
- package/dist/src/rag/embeddings.js +466 -0
- package/dist/src/rag/index.d.ts +12 -0
- package/dist/src/rag/index.js +40 -0
- package/dist/src/rag/lucene.d.ts +45 -0
- package/dist/src/rag/lucene.js +227 -0
- package/dist/src/rag/parser.d.ts +68 -0
- package/dist/src/rag/parser.js +192 -0
- package/dist/src/rag/tools.d.ts +76 -0
- package/dist/src/rag/tools.js +196 -0
- package/dist/src/rag/types.d.ts +178 -0
- package/dist/src/rag/types.js +21 -0
- package/dist/src/rag/usecase.d.ts +16 -0
- package/dist/src/rag/usecase.js +79 -0
- package/dist/src/rules/errors.d.ts +60 -0
- package/dist/src/rules/errors.js +97 -0
- package/dist/src/rules/git/git.e2e.helper.d.ts +104 -0
- package/dist/src/rules/git/git.e2e.helper.js +488 -0
- package/dist/src/rules/git/git.health.d.ts +66 -0
- package/dist/src/rules/git/git.health.js +354 -0
- package/dist/src/rules/git/git.helper.d.ts +129 -0
- package/dist/src/rules/git/git.helper.js +53 -0
- package/dist/src/rules/git/index.d.ts +6 -0
- package/dist/src/rules/git/index.js +76 -0
- package/dist/src/rules/git/repo.d.ts +128 -0
- package/dist/src/rules/git/repo.js +900 -0
- package/dist/src/rules/git/repo.pr.d.ts +137 -0
- package/dist/src/rules/git/repo.pr.js +589 -0
- package/dist/src/rules/git/repo.tools.d.ts +134 -0
- package/dist/src/rules/git/repo.tools.js +730 -0
- package/dist/src/rules/index.d.ts +8 -0
- package/dist/src/rules/index.js +25 -0
- package/dist/src/rules/messages.d.ts +17 -0
- package/dist/src/rules/messages.js +21 -0
- package/dist/src/rules/types.ctrl.d.ts +28 -0
- package/dist/src/rules/types.ctrl.js +2 -0
- package/dist/src/rules/types.d.ts +510 -0
- package/dist/src/rules/types.helpers.d.ts +132 -0
- package/dist/src/rules/types.helpers.js +2 -0
- package/dist/src/rules/types.js +33 -0
- package/dist/src/rules/user.mapper.d.ts +61 -0
- package/dist/src/rules/user.mapper.js +160 -0
- package/dist/src/rules/utils/slug.d.ts +22 -0
- package/dist/src/rules/utils/slug.js +35 -0
- package/dist/src/rules/utils.matter.d.ts +66 -0
- package/dist/src/rules/utils.matter.js +208 -0
- package/dist/src/rules/utils.slug.d.ts +22 -0
- package/dist/src/rules/utils.slug.js +35 -0
- package/dist/src/scrapper.d.ts +3 -2
- package/dist/src/scrapper.js +33 -37
- package/dist/src/stategraph/index.d.ts +8 -0
- package/dist/src/stategraph/index.js +21 -0
- package/dist/src/stategraph/stategraph.d.ts +91 -0
- package/dist/src/stategraph/stategraph.js +241 -0
- package/dist/src/stategraph/stategraph.storage.d.ts +41 -0
- package/dist/src/stategraph/stategraph.storage.js +166 -0
- package/dist/src/stategraph/types.d.ts +139 -0
- package/dist/src/stategraph/types.js +19 -0
- package/dist/src/types.d.ts +62 -39
- package/dist/src/types.js +53 -89
- package/dist/src/usecase.d.ts +4 -0
- package/dist/src/usecase.js +44 -0
- package/dist/src/utils.d.ts +12 -5
- package/dist/src/utils.js +30 -13
- package/package.json +9 -3
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentSimulator = void 0;
|
|
4
|
+
const simulator_executor_1 = require("./simulator.executor");
|
|
5
|
+
const simulator_prompts_1 = require("./simulator.prompts");
|
|
6
|
+
class AgentSimulator {
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
this.executor = new simulator_executor_1.AgentExecutor(config);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Exécuter la simulation complète
|
|
13
|
+
*
|
|
14
|
+
* Format de la query passée à l'agent testé :
|
|
15
|
+
* - Message initial : réponse du simulateur après analyse du scenario
|
|
16
|
+
* - Messages suivants : réponse conversationnelle du simulateur (sans tags d'évaluation)
|
|
17
|
+
*
|
|
18
|
+
* 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)
|
|
21
|
+
*/
|
|
22
|
+
async executeSimulation(options) {
|
|
23
|
+
const context = await this.executor.initializeContexts();
|
|
24
|
+
try {
|
|
25
|
+
// Construire la query formatée avec buildSimulatorQuery()
|
|
26
|
+
// Les instructions supplémentaires sont déjà intégrées dans le constructeur de l'executor
|
|
27
|
+
const scenarioQuery = (0, simulator_prompts_1.buildSimulatorQuery)(options.scenario);
|
|
28
|
+
// Générer le message initial du simulateur avec le scénario
|
|
29
|
+
let currentUserQuery = await this.executor.executeSimulator(context, scenarioQuery);
|
|
30
|
+
// Callback pour message initial du simulateur
|
|
31
|
+
if (options.onMessage) {
|
|
32
|
+
options.onMessage({ content: currentUserQuery, role: 'user' });
|
|
33
|
+
}
|
|
34
|
+
// Boucle de conversation
|
|
35
|
+
for (let i = 0; i < options.maxExchanges; i++) {
|
|
36
|
+
// Agent testé répond et retourne sa réponse
|
|
37
|
+
const agentResponse = await this.executor.executeAgent(context, currentUserQuery);
|
|
38
|
+
// Callback pour réponse de l'agent
|
|
39
|
+
if (options.onMessage) {
|
|
40
|
+
options.onMessage({ content: agentResponse, role: 'assistant' });
|
|
41
|
+
}
|
|
42
|
+
// Simulateur évalue et répond
|
|
43
|
+
const simulatorResult = await this.executor.executeSimulator(context, agentResponse);
|
|
44
|
+
// Vérifier si terminé
|
|
45
|
+
if (this.isSimulationComplete(simulatorResult)) {
|
|
46
|
+
const parsed = this.parseSimulationResult(simulatorResult, options.scenario.testResult, context);
|
|
47
|
+
this.lastExecution = context.lastExecution;
|
|
48
|
+
return {
|
|
49
|
+
...parsed,
|
|
50
|
+
execution: context.lastExecution,
|
|
51
|
+
exchangeCount: context.exchangeCount
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
currentUserQuery = this.extractConversationalPart(simulatorResult);
|
|
55
|
+
// Callback pour réponse du simulateur (si pas terminé)
|
|
56
|
+
if (options.onMessage && currentUserQuery) {
|
|
57
|
+
options.onMessage({ content: currentUserQuery, role: 'user' });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Timeout - générer rapport final
|
|
61
|
+
const timeout = await this.generateTimeoutReport(context, options.scenario.testResult);
|
|
62
|
+
this.lastExecution = context.lastExecution;
|
|
63
|
+
return { ...timeout, exchangeCount: context.exchangeCount };
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
this.lastExecution = context.lastExecution;
|
|
67
|
+
return {
|
|
68
|
+
success: false,
|
|
69
|
+
message: '',
|
|
70
|
+
error: `Erreur d'exécution: ${error.message || error}`,
|
|
71
|
+
execution: context.lastExecution,
|
|
72
|
+
exchangeCount: context.exchangeCount
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Compter les occurrences d'une action dans le dernier ExecutionResult
|
|
78
|
+
* @param name Nom exact de l'action (ex: 'lookupMfilesIntervenant', 'lookupKnowledge', 'sendInternalEmail')
|
|
79
|
+
* @returns { firstPos, count, total } où:
|
|
80
|
+
* - firstPos: index de la première occurrence (ou -1 si absente)
|
|
81
|
+
* - count: nombre d'occurrences de cette action
|
|
82
|
+
* - total: nombre total d'actions du même type (fonction vs transfert)
|
|
83
|
+
*/
|
|
84
|
+
executionActionCount(name) {
|
|
85
|
+
const execution = this.lastExecution;
|
|
86
|
+
const actions = execution?.actions || [];
|
|
87
|
+
const firstPos = actions.findIndex((a) => (a.action === name));
|
|
88
|
+
const count = actions.filter((a) => a.action === name).length;
|
|
89
|
+
// Déterminer le type par convention de nommage
|
|
90
|
+
const isTransfer = name === 'transfert';
|
|
91
|
+
const total = actions.filter((a) => {
|
|
92
|
+
if (isTransfer) {
|
|
93
|
+
return a.action === name;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return a.action !== 'transfert';
|
|
97
|
+
}
|
|
98
|
+
}).length;
|
|
99
|
+
return { firstPos, count, total };
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Fonction d'affichage pour les tests - n'altère pas la structure originale
|
|
103
|
+
* Crée une version simplifiée pour l'affichage avec juste les noms des actions
|
|
104
|
+
*/
|
|
105
|
+
printSimulationResult(result) {
|
|
106
|
+
const summary = {
|
|
107
|
+
success: result.success,
|
|
108
|
+
message: result.message,
|
|
109
|
+
error: result.error,
|
|
110
|
+
exchangeCount: result.exchangeCount,
|
|
111
|
+
runId: result.execution?.runId,
|
|
112
|
+
startQuery: result.execution?.startQuery,
|
|
113
|
+
actions: result.execution?.actions?.map((elem) => elem.action) || [],
|
|
114
|
+
lastMessage: result.execution?.lastMessage,
|
|
115
|
+
usage: result.execution?.usage,
|
|
116
|
+
moreThinkin: result.execution?.moreThinkin
|
|
117
|
+
};
|
|
118
|
+
const execution = {
|
|
119
|
+
...result.execution,
|
|
120
|
+
actions: result.execution?.actions?.map((elem) => elem.action) || []
|
|
121
|
+
};
|
|
122
|
+
return { summary, execution };
|
|
123
|
+
}
|
|
124
|
+
isSimulationComplete(response) {
|
|
125
|
+
return response.includes('[SIMULATION_COMPLETE]') || response.includes('[TERMINE]');
|
|
126
|
+
}
|
|
127
|
+
parseSimulationResult(response, expectedFormat, context) {
|
|
128
|
+
// Le simulateur produit directement le résultat et rapport
|
|
129
|
+
// Parsing pour détecter la fin et extraire le contenu JSON
|
|
130
|
+
// Détecter [SIMULATION_COMPLETE] ou [TERMINE]
|
|
131
|
+
if (response.includes('[SIMULATION_COMPLETE]') || response.includes('[TERMINE]')) {
|
|
132
|
+
// Extraire le contenu après le tag
|
|
133
|
+
const match = response.match(/\[SIMULATION_COMPLETE\]\s*\n?([\s\S]*)/);
|
|
134
|
+
if (match) {
|
|
135
|
+
const resultContent = match[1].trim();
|
|
136
|
+
// Essayer de parser comme JSON d'abord
|
|
137
|
+
try {
|
|
138
|
+
const jsonResult = JSON.parse(resultContent);
|
|
139
|
+
return {
|
|
140
|
+
success: jsonResult.success === undefined ? true : jsonResult.success, // true par défaut, utilise la valeur JSON si présente
|
|
141
|
+
message: jsonResult.description || resultContent,
|
|
142
|
+
error: jsonResult.error || '',
|
|
143
|
+
execution: context.lastExecution,
|
|
144
|
+
exchangeCount: context.exchangeCount
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
catch (jsonError) {
|
|
148
|
+
// Fallback : parsing manuel pour format "success:boolean, error:string, description:string"
|
|
149
|
+
const successMatch = resultContent.match(/success:\s*(true|false)/);
|
|
150
|
+
const errorMatch = resultContent.match(/error:\s*([^\n,]*)/);
|
|
151
|
+
// Description en dernier car elle peut être multiligne
|
|
152
|
+
let description = resultContent.trim();
|
|
153
|
+
if (successMatch || errorMatch) {
|
|
154
|
+
const descMatch = resultContent.match(/description:\s*([\s\S]*?)$/);
|
|
155
|
+
description = descMatch ? descMatch[1].trim() : description;
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
success: successMatch ? successMatch[1] === 'true' : true,
|
|
159
|
+
message: description,
|
|
160
|
+
error: errorMatch ? errorMatch[1].trim() : '',
|
|
161
|
+
execution: context.lastExecution,
|
|
162
|
+
exchangeCount: context.exchangeCount
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Fallback si parsing échoue
|
|
167
|
+
return {
|
|
168
|
+
success: true,
|
|
169
|
+
message: response,
|
|
170
|
+
error: '',
|
|
171
|
+
execution: context.lastExecution,
|
|
172
|
+
exchangeCount: context.exchangeCount
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
// Si pas de tag de fin détecté
|
|
176
|
+
return {
|
|
177
|
+
success: false,
|
|
178
|
+
message: response,
|
|
179
|
+
error: 'Simulation non terminée',
|
|
180
|
+
execution: context.lastExecution,
|
|
181
|
+
exchangeCount: context.exchangeCount
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
extractConversationalPart(response) {
|
|
185
|
+
// Extraire la partie conversationnelle avant les tags d'évaluation
|
|
186
|
+
const tagIndex = response.search(/\[(SIMULATION_COMPLETE|TERMINE|BUG_)/);
|
|
187
|
+
return tagIndex !== -1 ? response.substring(0, tagIndex).trim() : response;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Générer le rapport final en cas de timeout
|
|
191
|
+
*/
|
|
192
|
+
async generateTimeoutReport(context, expectedFormat) {
|
|
193
|
+
const reportQuery = `
|
|
194
|
+
La simulation a atteint la limite d'échanges sans conclusion.
|
|
195
|
+
Génère maintenant ton rapport final au format:
|
|
196
|
+
[SIMULATION_COMPLETE]
|
|
197
|
+
success: false
|
|
198
|
+
error: Limite d'échanges atteinte
|
|
199
|
+
description: Simulation interrompue - timeout
|
|
200
|
+
`;
|
|
201
|
+
const finalResult = await this.executor.executeSimulator(context, reportQuery);
|
|
202
|
+
return this.parseSimulationResult(finalResult, expectedFormat, context);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
exports.AgentSimulator = AgentSimulator;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SimulationScenario } from "./simulator.types";
|
|
2
|
+
/**
|
|
3
|
+
* Prompt de simulateur générique basé sur ClientSimulator
|
|
4
|
+
* COPIÉ et ADAPTÉ depuis agentInstructionModules.ClientSimulator
|
|
5
|
+
*/
|
|
6
|
+
export declare const GENERIC_SIMULATOR_PROMPT = "\n## R\u00D4LE - SIMULATEUR VALIDATEUR\nTu es un **DOUBLE AGENT** qui joue 2 r\u00F4les simultan\u00E9s :\n1. **Utilisateur r\u00E9el** qui teste un agent conversationnel\n2. **SIMULATEUR: Validateur actif** qui surveille en temps r\u00E9el les performances\n\n# \uD83D\uDEA8 R\u00C8GLE PRIORITAIRE ABSOLUE - VALIDATION ERREURS FATALES\n\n## SURVEILLANCE PERMANENTE \u00C0 CHAQUE MESSAGE\n- **CHAQUE MESSAGE** de l'agent test\u00E9 doit \u00EAtre inspect\u00E9 IMM\u00C9DIATEMENT\n- **D\u00C8S qu'un candidat \u00E0 **l'erreur fatale** appara\u00EEt \u2192 LE GARDER EN MEMOIRE JUSQU'AU \"follow_up\" OU \"cloture\" de la discussion.\n- **D\u00C8S que la discussion est dans l'\u00E9tat \"follow_up\" OU \"cloture\" SI l'erreur fatale en m\u00E9moire N'A PAS \u00C9T\u00C9 CORRIG\u00C9E, TU DOIS arr\u00EAter la simulation avec [SIMULATION_COMPLETE] {\"success\": false, \"error\": \"Erreur fatale d\u00E9tect\u00E9e: [d\u00E9tail pr\u00E9cis]\"}\n- **Format obligatoire d'arr\u00EAt** : [SIMULATION_COMPLETE] avec success:false\n- **Pas d'exception** : m\u00EAme si l'agent atteint les objectifs, une erreur fatale = \u00C9CHEC\n- **D\u00C8S qu'une erreur fatale appara\u00EEt** \u2192 ARR\u00CAT IMM\u00C9DIAT DE LA SIMULATION\n\n## R\u00C8GLES D'ANALYSE INTELLIGENTE ET CONTEXTUELLE\n- D\u00E9tection SEMANTIQUE uniquement avec TOL\u00C9RANCE pour les formules standards professionnelles.\n- **DISTINGUER** entre promesses de l'Agent et demande de l'utilisateur.\n\n## PROCESSUS D'INSPECTION OBLIGATOIRE\n\u00C0 CHAQUE message de l'agent, tu DOIS :\n\n### \u00C9TAPE 1 : INSPECTION ERREURS FATALES (PRIORIT\u00C9 1)\nSi \"erreurs fatales\" sp\u00E9cifi\u00E9es dans le sc\u00E9nario :\n\u2192 Examiner le message de l'agent pour ces termes/comportements interdits\n\u2192 Si d\u00E9tect\u00E9es : STOP IMM\u00C9DIAT avec [SIMULATION_COMPLETE] {\"success\": false, \"error\": \"Erreur fatale d\u00E9tect\u00E9e: [d\u00E9tail pr\u00E9cis]\"}\n\n### \u00C9TAPE 2 : COMPORTEMENT UTILISATEUR (PRIORIT\u00C9 2)\n\u2192 Si aucune erreur fatale : continuer la conversation selon persona + objectifs\n\u2192 Si conditions de fin atteintes : [SIMULATION_COMPLETE] avec rapport selon format\n\n# MISSION UTILISATEUR (seulement si aucune erreur fatale d\u00E9tect\u00E9e)\n1. **Recr\u00E9er une conversation r\u00E9elle** bas\u00E9e sur les instructions de simulation\n2. **Communiquer comme un vrai utilisateur** va \u00E0 l'essentiel sans bavardage\n3. **Agir selon la personnalit\u00E9 d\u00E9finie** dans le sc\u00E9nario de test\n4. **Tester la capacit\u00E9 de l'agent** \u00E0 atteindre les objectifs d\u00E9finis\n5. **\u00C9mettre** [SIMULATION_COMPLETE] quand les conditions de fin sont remplies\n\n# R\u00C8GLES DE COMMUNICATION\n- **CONCISION ABSOLUE** : R\u00E9ponses courtes et naturelles comme un vrai utilisateur\n- **\u00C9viter les r\u00E9p\u00E9titions** : Ne pas r\u00E9p\u00E9ter ce que l'agent vient de dire\n- **Confirmer simplement** : \"Oui\", \"D'accord\", \"Tr\u00E8s bien\", \"Entendu\"\n- **Pas de r\u00E9capitulatifs** : Un utilisateur ne r\u00E9sume pas, il r\u00E9pond \u00E0 la question pos\u00E9e\n- **Personnalit\u00E9 authentique** : adopter la persona d\u00E9finie\n- **Pas de m\u00E9ta** : jamais mentionner \"test\", \"simulation\", \"objectifs\", \"\u00E9valuation\"\n\n# FORMAT INPUT ATTENDU\nTu recevras toujours un INPUT structur\u00E9. Les erreurs fatales (si sp\u00E9cifi\u00E9es) sont EN HAUT et PRIORITAIRES.\n\n## PROCESSUS DE LECTURE OBLIGATOIRE :\n1. **LIRE D'ABORD** les erreurs fatales (si pr\u00E9sentes) et les m\u00E9moriser\n2. **ADOPTER** la personnalit\u00E9 indiqu\u00E9e\n3. **V\u00C9RIFIER** les objectifs tout en surveillant activement les erreurs\n4. **TERMINER** selon les conditions OU d\u00E8s qu'une erreur fatale appara\u00EEt\n\n# GUIDE POUR VARIABLES DE TEST\n- **testStart** : Premi\u00E8re phrase/question du client pour commencer la simulation\n- **testGoals** : Objectifs que l'agent doit atteindre (ce qui constitue un succ\u00E8s)\n- **testEnd** : Conditions sp\u00E9cifiques qui marquent la fin r\u00E9ussie de la simulation\n- **testPersona** : Personnalit\u00E9 \u00E0 adopter (patient, press\u00E9, \u00E9nerv\u00E9, etc.)\n- **testError** : Termes/comportements interdits qui causent un \u00E9chec imm\u00E9diat (erreurs fatales)\n- **testResult** : Format JSON attendu pour le rapport final de simulation\n\n# \u00C9VALUATION FINALE\n**TOUJOURS retourner un JSON strict valide** selon le format demand\u00E9 dans le sc\u00E9nario\n";
|
|
7
|
+
/**
|
|
8
|
+
* 3 prompts variables de personnalité pré-définis à choisir manuellement
|
|
9
|
+
*/
|
|
10
|
+
export declare const PERSONA_PATIENT = "Utilisateur patient et poli qui prend le temps d'expliquer sa situation";
|
|
11
|
+
export declare const PERSONA_PRESSE = "Utilisateur press\u00E9 qui veut une solution rapide, r\u00E9pond bri\u00E8vement";
|
|
12
|
+
export declare const PERSONA_ENERVE = "Utilisateur \u00E9nerv\u00E9 et frustr\u00E9, c'est son 3\u00E8me appel pour le m\u00EAme probl\u00E8me, ton direct et impatient";
|
|
13
|
+
/**
|
|
14
|
+
* Construire la query formatée selon le format SimulationScenario
|
|
15
|
+
*/
|
|
16
|
+
export declare const buildSimulatorQuery: (scenario: SimulationScenario) => string;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
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;
|
|
4
|
+
/**
|
|
5
|
+
* Prompt de simulateur générique basé sur ClientSimulator
|
|
6
|
+
* COPIÉ et ADAPTÉ depuis agentInstructionModules.ClientSimulator
|
|
7
|
+
*/
|
|
8
|
+
exports.GENERIC_SIMULATOR_PROMPT = `
|
|
9
|
+
## RÔLE - SIMULATEUR VALIDATEUR
|
|
10
|
+
Tu es un **DOUBLE AGENT** qui joue 2 rôles simultanés :
|
|
11
|
+
1. **Utilisateur réel** qui teste un agent conversationnel
|
|
12
|
+
2. **SIMULATEUR: Validateur actif** qui surveille en temps réel les performances
|
|
13
|
+
|
|
14
|
+
# 🚨 RÈGLE PRIORITAIRE ABSOLUE - VALIDATION ERREURS FATALES
|
|
15
|
+
|
|
16
|
+
## SURVEILLANCE PERMANENTE À CHAQUE MESSAGE
|
|
17
|
+
- **CHAQUE MESSAGE** de l'agent testé doit être inspecté IMMÉDIATEMENT
|
|
18
|
+
- **DÈS qu'un candidat à **l'erreur fatale** apparaît → LE GARDER EN MEMOIRE JUSQU'AU "follow_up" OU "cloture" de la discussion.
|
|
19
|
+
- **DÈS que la discussion est dans l'état "follow_up" OU "cloture" SI l'erreur fatale en mémoire N'A PAS ÉTÉ CORRIGÉE, TU DOIS arrêter la simulation avec [SIMULATION_COMPLETE] {"success": false, "error": "Erreur fatale détectée: [détail précis]"}
|
|
20
|
+
- **Format obligatoire d'arrêt** : [SIMULATION_COMPLETE] avec success:false
|
|
21
|
+
- **Pas d'exception** : même si l'agent atteint les objectifs, une erreur fatale = ÉCHEC
|
|
22
|
+
- **DÈS qu'une erreur fatale apparaît** → ARRÊT IMMÉDIAT DE LA SIMULATION
|
|
23
|
+
|
|
24
|
+
## RÈGLES D'ANALYSE INTELLIGENTE ET CONTEXTUELLE
|
|
25
|
+
- Détection SEMANTIQUE uniquement avec TOLÉRANCE pour les formules standards professionnelles.
|
|
26
|
+
- **DISTINGUER** entre promesses de l'Agent et demande de l'utilisateur.
|
|
27
|
+
|
|
28
|
+
## PROCESSUS D'INSPECTION OBLIGATOIRE
|
|
29
|
+
À CHAQUE message de l'agent, tu DOIS :
|
|
30
|
+
|
|
31
|
+
### ÉTAPE 1 : INSPECTION ERREURS FATALES (PRIORITÉ 1)
|
|
32
|
+
Si "erreurs fatales" spécifiées dans le scénario :
|
|
33
|
+
→ Examiner le message de l'agent pour ces termes/comportements interdits
|
|
34
|
+
→ Si détectées : STOP IMMÉDIAT avec [SIMULATION_COMPLETE] {"success": false, "error": "Erreur fatale détectée: [détail précis]"}
|
|
35
|
+
|
|
36
|
+
### ÉTAPE 2 : COMPORTEMENT UTILISATEUR (PRIORITÉ 2)
|
|
37
|
+
→ Si aucune erreur fatale : continuer la conversation selon persona + objectifs
|
|
38
|
+
→ Si conditions de fin atteintes : [SIMULATION_COMPLETE] avec rapport selon format
|
|
39
|
+
|
|
40
|
+
# MISSION UTILISATEUR (seulement si aucune erreur fatale détectée)
|
|
41
|
+
1. **Recréer une conversation réelle** basée sur les instructions de simulation
|
|
42
|
+
2. **Communiquer comme un vrai utilisateur** va à l'essentiel sans bavardage
|
|
43
|
+
3. **Agir selon la personnalité définie** dans le scénario de test
|
|
44
|
+
4. **Tester la capacité de l'agent** à atteindre les objectifs définis
|
|
45
|
+
5. **Émettre** [SIMULATION_COMPLETE] quand les conditions de fin sont remplies
|
|
46
|
+
|
|
47
|
+
# RÈGLES DE COMMUNICATION
|
|
48
|
+
- **CONCISION ABSOLUE** : Réponses courtes et naturelles comme un vrai utilisateur
|
|
49
|
+
- **Éviter les répétitions** : Ne pas répéter ce que l'agent vient de dire
|
|
50
|
+
- **Confirmer simplement** : "Oui", "D'accord", "Très bien", "Entendu"
|
|
51
|
+
- **Pas de récapitulatifs** : Un utilisateur ne résume pas, il répond à la question posée
|
|
52
|
+
- **Personnalité authentique** : adopter la persona définie
|
|
53
|
+
- **Pas de méta** : jamais mentionner "test", "simulation", "objectifs", "évaluation"
|
|
54
|
+
|
|
55
|
+
# FORMAT INPUT ATTENDU
|
|
56
|
+
Tu recevras toujours un INPUT structuré. Les erreurs fatales (si spécifiées) sont EN HAUT et PRIORITAIRES.
|
|
57
|
+
|
|
58
|
+
## PROCESSUS DE LECTURE OBLIGATOIRE :
|
|
59
|
+
1. **LIRE D'ABORD** les erreurs fatales (si présentes) et les mémoriser
|
|
60
|
+
2. **ADOPTER** la personnalité indiquée
|
|
61
|
+
3. **VÉRIFIER** les objectifs tout en surveillant activement les erreurs
|
|
62
|
+
4. **TERMINER** selon les conditions OU dès qu'une erreur fatale apparaît
|
|
63
|
+
|
|
64
|
+
# GUIDE POUR VARIABLES DE TEST
|
|
65
|
+
- **testStart** : Première phrase/question du client pour commencer la simulation
|
|
66
|
+
- **testGoals** : Objectifs que l'agent doit atteindre (ce qui constitue un succès)
|
|
67
|
+
- **testEnd** : Conditions spécifiques qui marquent la fin réussie de la simulation
|
|
68
|
+
- **testPersona** : Personnalité à adopter (patient, pressé, énervé, etc.)
|
|
69
|
+
- **testError** : Termes/comportements interdits qui causent un échec immédiat (erreurs fatales)
|
|
70
|
+
- **testResult** : Format JSON attendu pour le rapport final de simulation
|
|
71
|
+
|
|
72
|
+
# ÉVALUATION FINALE
|
|
73
|
+
**TOUJOURS retourner un JSON strict valide** selon le format demandé dans le scénario
|
|
74
|
+
`;
|
|
75
|
+
/**
|
|
76
|
+
* 3 prompts variables de personnalité pré-définis à choisir manuellement
|
|
77
|
+
*/
|
|
78
|
+
exports.PERSONA_PATIENT = 'Utilisateur patient et poli qui prend le temps d\'expliquer sa situation';
|
|
79
|
+
exports.PERSONA_PRESSE = 'Utilisateur pressé qui veut une solution rapide, répond brièvement';
|
|
80
|
+
exports.PERSONA_ENERVE = 'Utilisateur énervé et frustré, c\'est son 3ème appel pour le même problème, ton direct et impatient';
|
|
81
|
+
/**
|
|
82
|
+
* Construire la query formatée selon le format SimulationScenario
|
|
83
|
+
*/
|
|
84
|
+
const buildSimulatorQuery = (scenario) => {
|
|
85
|
+
// 🔧 CORRECTION: Mettre les erreurs fatales EN PREMIER et bien visibles
|
|
86
|
+
const errorSection = scenario.testError
|
|
87
|
+
? `
|
|
88
|
+
- ERREURS FATALES ET SURVEILLANCE OBLIGATOIRE:
|
|
89
|
+
⚠️ PROCESSUS : Inspecter UNIQUEMENT les messages de l'agent (l'agent est l'utilisateur du simulateur)
|
|
90
|
+
⚠️ QUAND : À chaque fois que l'agent m'envoie une réponse, vérifier ces erreurs dans son message
|
|
91
|
+
⚠️ SI DÉTECTÉES : ARRÊT IMMÉDIAT avec [SIMULATION_COMPLETE] {"success": false, "error": "Erreur fatale détectée: [détail]"}
|
|
92
|
+
⚠️ EXCEPTION : Ne pas inspecter ce prompt initial, seulement les réponses de l'agent
|
|
93
|
+
**${scenario.testError}**
|
|
94
|
+
` : '';
|
|
95
|
+
return `# INSTRUCTIONS DE SIMULATION (PRIVÉES - NE PAS TRANSMETTRE À L'AGENT)
|
|
96
|
+
- Votre personnalité: ${scenario.testPersona}
|
|
97
|
+
- Objectifs à atteindre: ${scenario.testGoals}
|
|
98
|
+
- Critères de fin: ${scenario.testEnd}
|
|
99
|
+
- Format du rapport: ${scenario.testResult}
|
|
100
|
+
${errorSection}
|
|
101
|
+
|
|
102
|
+
# 🚀 ACTION REQUISE : DÉMARRER LA CONVERSATION
|
|
103
|
+
Vous êtes le SIMULATEUR CLIENT. Envoyez à l'agent UNIQUEMENT le message ci-dessous (sans ces instructions).
|
|
104
|
+
|
|
105
|
+
# MESSAGE À ENVOYER À L'AGENT :
|
|
106
|
+
${scenario.testQuery}`;
|
|
107
|
+
};
|
|
108
|
+
exports.buildSimulatorQuery = buildSimulatorQuery;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { AgentMessage } from "../stategraph";
|
|
2
|
+
import { AgentConfig, AgenticContext, ExecutionResult } from "../types";
|
|
3
|
+
export interface SimulatorConfig {
|
|
4
|
+
agents: AgentConfig[];
|
|
5
|
+
start: string;
|
|
6
|
+
verbose: boolean;
|
|
7
|
+
instructionEx?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SimulationScenario {
|
|
10
|
+
testGoals: string;
|
|
11
|
+
testEnd: string;
|
|
12
|
+
testPersona: string;
|
|
13
|
+
testQuery: string;
|
|
14
|
+
testResult: string;
|
|
15
|
+
testError?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface SimulationOptions {
|
|
18
|
+
scenario: SimulationScenario;
|
|
19
|
+
maxExchanges: number;
|
|
20
|
+
onMessage?: (message: AgentMessage) => void;
|
|
21
|
+
}
|
|
22
|
+
export interface SimulationResult {
|
|
23
|
+
success: boolean;
|
|
24
|
+
message: string;
|
|
25
|
+
error: string;
|
|
26
|
+
execution: ExecutionResult;
|
|
27
|
+
exchangeCount: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ExecutionContext {
|
|
30
|
+
agentContext: AgenticContext;
|
|
31
|
+
simulatorContext: AgenticContext;
|
|
32
|
+
conversationHistory: string[];
|
|
33
|
+
exchangeCount: number;
|
|
34
|
+
lastExecution: ExecutionResult;
|
|
35
|
+
}
|
|
36
|
+
export interface TestScenario {
|
|
37
|
+
ticketId: string;
|
|
38
|
+
ticketMarkdown: string;
|
|
39
|
+
clientType: 'locataire' | 'proprietaire';
|
|
40
|
+
ton?: 'patient' | 'presse' | 'enerve';
|
|
41
|
+
variant?: any;
|
|
42
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SimulationScenario } from './simulator.types';
|
|
2
|
+
import { PERSONA_PATIENT, PERSONA_PRESSE, PERSONA_ENERVE } from './simulator.prompts';
|
|
3
|
+
/**
|
|
4
|
+
* Charger un ticket depuis le filesystem (comme agent-vs-agent.ts)
|
|
5
|
+
*/
|
|
6
|
+
export declare function loadScenario(ticketPath: string): {
|
|
7
|
+
ticketMarkdown: string;
|
|
8
|
+
ticketId: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Construire SimulationScenario à partir d'un ticket PRSolver (rétrocompatibilité)
|
|
12
|
+
* Permet de surcharger tous les champs avec custom (testGoals, testEnd, testPersona, testQuery, testResult, testError)
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildScenarioFromTicket(ticketPath: string, clientType: 'locataire' | 'proprietaire', persona?: string, // PERSONA_PATIENT | PERSONA_PRESSE | PERSONA_ENERVE
|
|
15
|
+
custom?: Partial<SimulationScenario>): SimulationScenario;
|
|
16
|
+
/**
|
|
17
|
+
* Construire SimulationScenario générique directement
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildGenericScenario(scenario: SimulationScenario): SimulationScenario;
|
|
20
|
+
export { PERSONA_PATIENT, PERSONA_PRESSE, PERSONA_ENERVE };
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PERSONA_ENERVE = exports.PERSONA_PRESSE = exports.PERSONA_PATIENT = void 0;
|
|
37
|
+
exports.loadScenario = loadScenario;
|
|
38
|
+
exports.buildScenarioFromTicket = buildScenarioFromTicket;
|
|
39
|
+
exports.buildGenericScenario = buildGenericScenario;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const simulator_prompts_1 = require("./simulator.prompts");
|
|
43
|
+
Object.defineProperty(exports, "PERSONA_PATIENT", { enumerable: true, get: function () { return simulator_prompts_1.PERSONA_PATIENT; } });
|
|
44
|
+
Object.defineProperty(exports, "PERSONA_PRESSE", { enumerable: true, get: function () { return simulator_prompts_1.PERSONA_PRESSE; } });
|
|
45
|
+
Object.defineProperty(exports, "PERSONA_ENERVE", { enumerable: true, get: function () { return simulator_prompts_1.PERSONA_ENERVE; } });
|
|
46
|
+
/**
|
|
47
|
+
* Charger un ticket depuis le filesystem (comme agent-vs-agent.ts)
|
|
48
|
+
*/
|
|
49
|
+
function loadScenario(ticketPath) {
|
|
50
|
+
const ticketMarkdown = fs.readFileSync(ticketPath, 'utf8');
|
|
51
|
+
const ticketId = path.basename(ticketPath).split('-')[0];
|
|
52
|
+
return { ticketMarkdown, ticketId };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Construire SimulationScenario à partir d'un ticket PRSolver (rétrocompatibilité)
|
|
56
|
+
* Permet de surcharger tous les champs avec custom (testGoals, testEnd, testPersona, testQuery, testResult, testError)
|
|
57
|
+
*/
|
|
58
|
+
function buildScenarioFromTicket(ticketPath, clientType, persona = simulator_prompts_1.PERSONA_PATIENT, // PERSONA_PATIENT | PERSONA_PRESSE | PERSONA_ENERVE
|
|
59
|
+
custom // Surcharge optionnelle de tous les champs
|
|
60
|
+
) {
|
|
61
|
+
const { ticketMarkdown, ticketId } = loadScenario(ticketPath);
|
|
62
|
+
// Scenario par défaut complet
|
|
63
|
+
const defaultScenario = {
|
|
64
|
+
testGoals: `Valider les Objectifs de PRSolver pour ticket ${ticketId}`,
|
|
65
|
+
testEnd: 'Agent termine avec salutations (état 5_cloture)',
|
|
66
|
+
testPersona: persona,
|
|
67
|
+
testQuery: `Je suis le client (demandeur '${clientType}') du ticket en ANNEXE. Démarre la conversation exactement comme décrit dans l'ANNEXE.
|
|
68
|
+
## ANNEXE - Ticket ${ticketId}
|
|
69
|
+
\`\`\`
|
|
70
|
+
${ticketMarkdown}
|
|
71
|
+
\`\`\`
|
|
72
|
+
`,
|
|
73
|
+
testResult: 'done:boolean, error:string, description:string'
|
|
74
|
+
};
|
|
75
|
+
// Merger avec custom
|
|
76
|
+
return { ...defaultScenario, ...custom };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Construire SimulationScenario générique directement
|
|
80
|
+
*/
|
|
81
|
+
function buildGenericScenario(scenario) {
|
|
82
|
+
return {
|
|
83
|
+
...scenario,
|
|
84
|
+
// Assurer le format par défaut si pas spécifié
|
|
85
|
+
testResult: scenario.testResult || 'done:boolean, error:string, description:string'
|
|
86
|
+
};
|
|
87
|
+
}
|
package/dist/src/execute.d.ts
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
|
-
import { AgentConfig, AgenticContext,
|
|
1
|
+
import { AgentConfig, AgenticContext, AgentModel, ExecuteAgentResult, Feedback, ExecutionResult } from "./types";
|
|
2
2
|
import { Writable } from "stream";
|
|
3
|
+
import { AgentStateGraph } from "./stategraph";
|
|
3
4
|
export declare function modelConfig(model: string, custom?: any): AgentModel;
|
|
4
5
|
export declare function sendFeedback(params: Feedback): void;
|
|
5
6
|
export interface ReadCompletionsStreamOptions {
|
|
6
|
-
|
|
7
|
+
stateGraph: AgentStateGraph;
|
|
8
|
+
discussion: any;
|
|
9
|
+
agentConfig: AgentConfig;
|
|
10
|
+
agents: AgentConfig[];
|
|
11
|
+
agentName: string;
|
|
7
12
|
stdout: Writable;
|
|
8
13
|
session: AgenticContext;
|
|
9
14
|
final: any;
|
|
10
|
-
|
|
15
|
+
verbose?: boolean;
|
|
16
|
+
enrichWithMemory?: (role: string, agent: AgentConfig, context: AgenticContext) => Promise<string>;
|
|
11
17
|
}
|
|
12
|
-
export declare function readCompletionsStream(params: ReadCompletionsStreamOptions): Promise<
|
|
18
|
+
export declare function readCompletionsStream(params: ReadCompletionsStreamOptions): Promise<ExecutionResult>;
|
|
13
19
|
/**
|
|
14
20
|
* Parameters for executing an agent set
|
|
15
21
|
* @interface ExecuteAgentSetParams
|
|
@@ -21,7 +27,7 @@ export declare function readCompletionsStream(params: ReadCompletionsStreamOptio
|
|
|
21
27
|
* @property {number} [maxSteps] - Maximum number of steps to execute
|
|
22
28
|
*/
|
|
23
29
|
export interface ExecuteAgentSetParams {
|
|
24
|
-
enrichWithMemory?: (role
|
|
30
|
+
enrichWithMemory?: (role: string, agent: AgentConfig, context: AgenticContext) => Promise<string>;
|
|
25
31
|
query: string;
|
|
26
32
|
home?: string;
|
|
27
33
|
stdout: Writable;
|
|
@@ -39,4 +45,5 @@ export interface ExecuteAgentSetParams {
|
|
|
39
45
|
* @param {ExecuteAgentSetParams} params - Execution parameters
|
|
40
46
|
* @returns {Promise<void>}
|
|
41
47
|
*/
|
|
42
|
-
export declare function executeAgentSet(agentSet: AgentConfig[],
|
|
48
|
+
export declare function executeAgentSet(agentSet: AgentConfig[], context: AgenticContext, params: ExecuteAgentSetParams): Promise<ExecutionResult>;
|
|
49
|
+
export declare function executeAgent(agentSet: AgentConfig[], params: ExecuteAgentSetParams): Promise<ExecuteAgentResult>;
|