agentic-api 2.0.31 → 2.0.491
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/agents/agents.example.js +21 -22
- package/dist/src/agents/authentication.js +1 -2
- package/dist/src/agents/prompts.d.ts +5 -4
- package/dist/src/agents/prompts.js +44 -87
- package/dist/src/agents/reducer.core.d.ts +24 -2
- package/dist/src/agents/reducer.core.js +125 -35
- package/dist/src/agents/reducer.loaders.d.ts +55 -1
- package/dist/src/agents/reducer.loaders.js +114 -1
- package/dist/src/agents/reducer.types.d.ts +45 -2
- package/dist/src/agents/semantic.js +1 -2
- package/dist/src/agents/simulator.d.ts +11 -3
- package/dist/src/agents/simulator.executor.d.ts +14 -4
- package/dist/src/agents/simulator.executor.js +81 -23
- package/dist/src/agents/simulator.js +128 -42
- package/dist/src/agents/simulator.prompts.d.ts +9 -7
- package/dist/src/agents/simulator.prompts.js +66 -86
- package/dist/src/agents/simulator.types.d.ts +23 -5
- package/dist/src/agents/simulator.utils.d.ts +7 -2
- package/dist/src/agents/simulator.utils.js +31 -11
- package/dist/src/agents/system.js +1 -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/legacy.js +460 -0
- 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.d.ts +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/{princing.openai.d.ts → pricing.llm.d.ts} +6 -0
- package/dist/src/pricing.llm.js +255 -0
- package/dist/src/prompts.d.ts +13 -4
- package/dist/src/prompts.js +221 -114
- package/dist/src/rag/embeddings.d.ts +36 -18
- package/dist/src/rag/embeddings.js +131 -128
- package/dist/src/rag/index.d.ts +5 -5
- package/dist/src/rag/index.js +14 -17
- package/dist/src/rag/parser.d.ts +2 -1
- package/dist/src/rag/parser.js +11 -14
- package/dist/src/rag/rag.examples.d.ts +27 -0
- package/dist/src/rag/rag.examples.js +151 -0
- package/dist/src/rag/rag.manager.d.ts +383 -0
- package/dist/src/rag/rag.manager.js +1390 -0
- package/dist/src/rag/types.d.ts +128 -12
- package/dist/src/rag/types.js +100 -1
- package/dist/src/rag/usecase.d.ts +37 -0
- package/dist/src/rag/usecase.js +96 -7
- package/dist/src/rules/git/git.e2e.helper.js +22 -2
- package/dist/src/rules/git/git.health.d.ts +61 -2
- package/dist/src/rules/git/git.health.js +333 -11
- package/dist/src/rules/git/index.d.ts +2 -2
- package/dist/src/rules/git/index.js +13 -1
- package/dist/src/rules/git/repo.d.ts +160 -0
- package/dist/src/rules/git/repo.js +777 -0
- package/dist/src/rules/git/repo.pr.js +117 -13
- package/dist/src/rules/git/repo.tools.d.ts +22 -1
- package/dist/src/rules/git/repo.tools.js +50 -1
- package/dist/src/rules/types.d.ts +27 -14
- package/dist/src/rules/utils.matter.d.ts +0 -4
- package/dist/src/rules/utils.matter.js +35 -7
- package/dist/src/scrapper.d.ts +15 -22
- package/dist/src/scrapper.js +58 -110
- package/dist/src/stategraph/index.d.ts +1 -1
- package/dist/src/stategraph/stategraph.d.ts +56 -2
- package/dist/src/stategraph/stategraph.js +134 -6
- package/dist/src/stategraph/stategraph.storage.js +8 -0
- package/dist/src/stategraph/types.d.ts +27 -0
- package/dist/src/types.d.ts +46 -9
- package/dist/src/types.js +8 -7
- package/dist/src/usecase.d.ts +11 -2
- package/dist/src/usecase.js +27 -35
- package/dist/src/utils.d.ts +32 -18
- package/dist/src/utils.js +87 -129
- package/package.json +10 -3
- package/dist/src/agents/digestor.test.d.ts +0 -1
- package/dist/src/agents/digestor.test.js +0 -45
- package/dist/src/agents/reducer.example.d.ts +0 -28
- package/dist/src/agents/reducer.example.js +0 -118
- package/dist/src/agents/reducer.process.d.ts +0 -16
- package/dist/src/agents/reducer.process.js +0 -143
- package/dist/src/agents/reducer.tools.d.ts +0 -29
- package/dist/src/agents/reducer.tools.js +0 -157
- package/dist/src/agents/simpleExample.d.ts +0 -3
- package/dist/src/agents/simpleExample.js +0 -38
- package/dist/src/agents/system-review.d.ts +0 -5
- package/dist/src/agents/system-review.js +0 -181
- package/dist/src/agents/systemReview.d.ts +0 -4
- package/dist/src/agents/systemReview.js +0 -22
- package/dist/src/execute.d.ts +0 -49
- package/dist/src/execute.js +0 -564
- package/dist/src/princing.openai.js +0 -54
- package/dist/src/rag/tools.d.ts +0 -76
- package/dist/src/rag/tools.js +0 -196
- package/dist/src/rules/user.mapper.d.ts +0 -61
- package/dist/src/rules/user.mapper.js +0 -160
- package/dist/src/rules/utils/slug.d.ts +0 -22
- package/dist/src/rules/utils/slug.js +0 -35
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AgentSimulator = void 0;
|
|
4
4
|
const simulator_executor_1 = require("./simulator.executor");
|
|
5
|
-
const simulator_prompts_1 = require("./simulator.prompts");
|
|
6
5
|
class AgentSimulator {
|
|
7
6
|
constructor(config) {
|
|
8
7
|
this.config = config;
|
|
@@ -11,56 +10,98 @@ class AgentSimulator {
|
|
|
11
10
|
/**
|
|
12
11
|
* Exécuter la simulation complète
|
|
13
12
|
*
|
|
13
|
+
* Architecture :
|
|
14
|
+
* - Le scénario (Personnalité, Question, Objectifs, Format JSON) est injecté UNE SEULE FOIS
|
|
15
|
+
* dans les instructions du simulateur au moment de l'initialisation (AVANT la boucle).
|
|
16
|
+
*
|
|
14
17
|
* Format de la query passée à l'agent testé :
|
|
15
|
-
* - Message initial :
|
|
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);
|
|
28
|
+
const allMessages = [];
|
|
29
|
+
let lastAgentMessage = '';
|
|
30
|
+
let exchangeCounter = 0; // Compteur d'échanges (user+assistant)
|
|
24
31
|
try {
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
32
|
+
// ✅ Pour le premier message, utiliser directement la query fournie
|
|
33
|
+
// Le simulateur ne doit PAS reformuler la question initiale
|
|
34
|
+
const initialQuery = options.query || options.scenario.testQuery || '';
|
|
35
|
+
let currentUserQuery = initialQuery;
|
|
36
|
+
// Stocker le message initial (query brute de l'utilisateur)
|
|
37
|
+
const initialMsg = { content: currentUserQuery, role: 'user' };
|
|
38
|
+
allMessages.push(initialMsg);
|
|
31
39
|
if (options.onMessage) {
|
|
32
|
-
options.onMessage(
|
|
40
|
+
options.onMessage(initialMsg);
|
|
33
41
|
}
|
|
34
|
-
// Boucle de conversation
|
|
35
|
-
|
|
42
|
+
// Boucle de conversation - maxExchanges = nombre de paires (user+assistant)
|
|
43
|
+
while (exchangeCounter < options.maxExchanges) {
|
|
36
44
|
// Agent testé répond et retourne sa réponse
|
|
45
|
+
// La première fois la query est options.query, les fois suivantes c'est la réponse conversationnelle du simulateur
|
|
37
46
|
const agentResponse = await this.executor.executeAgent(context, currentUserQuery);
|
|
38
|
-
|
|
47
|
+
lastAgentMessage = agentResponse;
|
|
48
|
+
// Stocker la réponse de l'agent
|
|
49
|
+
const agentMsg = { content: agentResponse, role: 'assistant' };
|
|
50
|
+
allMessages.push(agentMsg);
|
|
39
51
|
if (options.onMessage) {
|
|
40
|
-
options.onMessage(
|
|
52
|
+
options.onMessage(agentMsg);
|
|
41
53
|
}
|
|
42
|
-
//
|
|
54
|
+
// Incrémenter le compteur après la réponse de l'agent (assistant)
|
|
55
|
+
exchangeCounter++;
|
|
56
|
+
// ✅ Passer directement agentResponse au simulateur (scénario déjà dans les instructions)
|
|
43
57
|
const simulatorResult = await this.executor.executeSimulator(context, agentResponse);
|
|
58
|
+
// console.log('---- DBG simulatorResult',simulatorResult);
|
|
44
59
|
// Vérifier si terminé
|
|
45
60
|
if (this.isSimulationComplete(simulatorResult)) {
|
|
46
|
-
const
|
|
61
|
+
const expectedFormat = options.scenario.result || options.scenario.testResult || '{"success": boolean, "error": string}';
|
|
62
|
+
const parsed = this.parseSimulationResult(simulatorResult, expectedFormat, context);
|
|
47
63
|
this.lastExecution = context.lastExecution;
|
|
64
|
+
// Validation des tools si expectedTool est fourni
|
|
65
|
+
if (options.expectedTool) {
|
|
66
|
+
const validation = this.validateExpectedTools(options.expectedTool);
|
|
67
|
+
if (!validation.passed) {
|
|
68
|
+
parsed.success = false;
|
|
69
|
+
parsed.error = validation.errors.join('; ');
|
|
70
|
+
parsed.toolValidation = validation;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Ajouter l'historique des messages au résultat
|
|
48
74
|
return {
|
|
49
75
|
...parsed,
|
|
50
76
|
execution: context.lastExecution,
|
|
51
|
-
exchangeCount:
|
|
77
|
+
exchangeCount: exchangeCounter, // Utiliser notre compteur d'échanges
|
|
78
|
+
messages: allMessages
|
|
52
79
|
};
|
|
53
80
|
}
|
|
54
81
|
currentUserQuery = this.extractConversationalPart(simulatorResult);
|
|
55
|
-
//
|
|
56
|
-
if (
|
|
57
|
-
|
|
82
|
+
// Stocker la réponse du simulateur (si pas terminé)
|
|
83
|
+
if (currentUserQuery) {
|
|
84
|
+
const simulatorMsg = { content: currentUserQuery, role: 'user' };
|
|
85
|
+
allMessages.push(simulatorMsg);
|
|
86
|
+
if (options.onMessage) {
|
|
87
|
+
options.onMessage(simulatorMsg);
|
|
88
|
+
}
|
|
58
89
|
}
|
|
59
90
|
}
|
|
60
91
|
// Timeout - générer rapport final
|
|
61
|
-
const
|
|
92
|
+
const expectedFormat = options.scenario.result || options.scenario.testResult || '{"success": boolean, "error": string}';
|
|
93
|
+
const timeout = await this.generateTimeoutReport(context, expectedFormat);
|
|
62
94
|
this.lastExecution = context.lastExecution;
|
|
63
|
-
|
|
95
|
+
// Validation des tools même en cas de timeout
|
|
96
|
+
if (options.expectedTool) {
|
|
97
|
+
const validation = this.validateExpectedTools(options.expectedTool);
|
|
98
|
+
if (!validation.passed) {
|
|
99
|
+
timeout.success = false;
|
|
100
|
+
timeout.error = validation.errors.join('; ');
|
|
101
|
+
timeout.toolValidation = validation;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { ...timeout, exchangeCount: exchangeCounter, messages: allMessages }; // Utiliser notre compteur
|
|
64
105
|
}
|
|
65
106
|
catch (error) {
|
|
66
107
|
this.lastExecution = context.lastExecution;
|
|
@@ -69,7 +110,8 @@ class AgentSimulator {
|
|
|
69
110
|
message: '',
|
|
70
111
|
error: `Erreur d'exécution: ${error.message || error}`,
|
|
71
112
|
execution: context.lastExecution,
|
|
72
|
-
exchangeCount:
|
|
113
|
+
exchangeCount: exchangeCounter, // Utiliser notre compteur
|
|
114
|
+
messages: allMessages
|
|
73
115
|
};
|
|
74
116
|
}
|
|
75
117
|
}
|
|
@@ -112,8 +154,8 @@ class AgentSimulator {
|
|
|
112
154
|
startQuery: result.execution?.startQuery,
|
|
113
155
|
actions: result.execution?.actions?.map((elem) => elem.action) || [],
|
|
114
156
|
lastMessage: result.execution?.lastMessage,
|
|
115
|
-
usage: result.execution?.usage
|
|
116
|
-
moreThinkin
|
|
157
|
+
usage: result.execution?.usage
|
|
158
|
+
// moreThinkin removed (obsolete)
|
|
117
159
|
};
|
|
118
160
|
const execution = {
|
|
119
161
|
...result.execution,
|
|
@@ -122,17 +164,17 @@ class AgentSimulator {
|
|
|
122
164
|
return { summary, execution };
|
|
123
165
|
}
|
|
124
166
|
isSimulationComplete(response) {
|
|
125
|
-
return response.includes('[SIMULATION_COMPLETE]') || response.includes('[TERMINE]');
|
|
167
|
+
return response.includes('[DONE]') || response.includes('[SIMULATION_COMPLETE]') || response.includes('[TERMINE]');
|
|
126
168
|
}
|
|
127
169
|
parseSimulationResult(response, expectedFormat, context) {
|
|
128
170
|
// Le simulateur produit directement le résultat et rapport
|
|
129
171
|
// Parsing pour détecter la fin et extraire le contenu JSON
|
|
130
|
-
// Détecter [SIMULATION_COMPLETE] ou [TERMINE]
|
|
131
|
-
if (response.includes('[SIMULATION_COMPLETE]') || response.includes('[TERMINE]')) {
|
|
172
|
+
// Détecter [DONE], [SIMULATION_COMPLETE] ou [TERMINE]
|
|
173
|
+
if (response.includes('[DONE]') || response.includes('[SIMULATION_COMPLETE]') || response.includes('[TERMINE]')) {
|
|
132
174
|
// Extraire le contenu après le tag
|
|
133
|
-
const match = response.match(/\[SIMULATION_COMPLETE\]\s*\n?([\s\S]*)/);
|
|
175
|
+
const match = response.match(/\[(DONE|SIMULATION_COMPLETE|TERMINE)\]\s*\n?([\s\S]*)/);
|
|
134
176
|
if (match) {
|
|
135
|
-
const resultContent = match[
|
|
177
|
+
const resultContent = match[2].trim();
|
|
136
178
|
// Essayer de parser comme JSON d'abord
|
|
137
179
|
try {
|
|
138
180
|
const jsonResult = JSON.parse(resultContent);
|
|
@@ -141,7 +183,8 @@ class AgentSimulator {
|
|
|
141
183
|
message: jsonResult.description || resultContent,
|
|
142
184
|
error: jsonResult.error || '',
|
|
143
185
|
execution: context.lastExecution,
|
|
144
|
-
exchangeCount: context.exchangeCount
|
|
186
|
+
exchangeCount: context.exchangeCount,
|
|
187
|
+
messages: [] // Sera rempli par executeSimulation
|
|
145
188
|
};
|
|
146
189
|
}
|
|
147
190
|
catch (jsonError) {
|
|
@@ -159,7 +202,8 @@ class AgentSimulator {
|
|
|
159
202
|
message: description,
|
|
160
203
|
error: errorMatch ? errorMatch[1].trim() : '',
|
|
161
204
|
execution: context.lastExecution,
|
|
162
|
-
exchangeCount: context.exchangeCount
|
|
205
|
+
exchangeCount: context.exchangeCount,
|
|
206
|
+
messages: [] // Sera rempli par executeSimulation
|
|
163
207
|
};
|
|
164
208
|
}
|
|
165
209
|
}
|
|
@@ -169,7 +213,8 @@ class AgentSimulator {
|
|
|
169
213
|
message: response,
|
|
170
214
|
error: '',
|
|
171
215
|
execution: context.lastExecution,
|
|
172
|
-
exchangeCount: context.exchangeCount
|
|
216
|
+
exchangeCount: context.exchangeCount,
|
|
217
|
+
messages: [] // Sera rempli par executeSimulation
|
|
173
218
|
};
|
|
174
219
|
}
|
|
175
220
|
// Si pas de tag de fin détecté
|
|
@@ -178,28 +223,69 @@ class AgentSimulator {
|
|
|
178
223
|
message: response,
|
|
179
224
|
error: 'Simulation non terminée',
|
|
180
225
|
execution: context.lastExecution,
|
|
181
|
-
exchangeCount: context.exchangeCount
|
|
226
|
+
exchangeCount: context.exchangeCount,
|
|
227
|
+
messages: [] // Sera rempli par executeSimulation
|
|
182
228
|
};
|
|
183
229
|
}
|
|
184
230
|
extractConversationalPart(response) {
|
|
185
|
-
// Extraire la partie conversationnelle avant les tags d'évaluation
|
|
186
|
-
|
|
187
|
-
|
|
231
|
+
// Extraire la partie conversationnelle avant les tags d'évaluation ou d'observation
|
|
232
|
+
// Filtrer tous les tags système : [DONE], [OBSERVATEUR SILENCIEUX], [À NOTER], etc.
|
|
233
|
+
const tagIndex = response.search(/\[(DONE|SIMULATION_COMPLETE|TERMINE|BUG_|OBSERVATEUR|À NOTER|NOTE|ANALYSE)/i);
|
|
234
|
+
if (tagIndex !== -1) {
|
|
235
|
+
return response.substring(0, tagIndex).trim();
|
|
236
|
+
}
|
|
237
|
+
// Filtrer aussi les lignes qui commencent par "Agent :" ou "[...]" (méta-commentaires)
|
|
238
|
+
const lines = response.split('\n');
|
|
239
|
+
const conversationalLines = lines.filter(line => {
|
|
240
|
+
const trimmed = line.trim();
|
|
241
|
+
// Exclure les lignes qui sont des méta-commentaires
|
|
242
|
+
if (trimmed.startsWith('Agent :') ||
|
|
243
|
+
trimmed.startsWith('[') && trimmed.includes(']') && !trimmed.match(/^\[[^\]]{1,3}\]/)) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
return true;
|
|
247
|
+
});
|
|
248
|
+
return conversationalLines.join('\n').trim();
|
|
188
249
|
}
|
|
189
250
|
/**
|
|
190
251
|
* Générer le rapport final en cas de timeout
|
|
191
252
|
*/
|
|
192
253
|
async generateTimeoutReport(context, expectedFormat) {
|
|
193
254
|
const reportQuery = `
|
|
194
|
-
La
|
|
255
|
+
La conversation a atteint la limite d'échanges sans conclusion.
|
|
195
256
|
Génère maintenant ton rapport final au format:
|
|
196
|
-
[
|
|
257
|
+
[DONE]
|
|
197
258
|
success: false
|
|
198
259
|
error: Limite d'échanges atteinte
|
|
199
|
-
description:
|
|
260
|
+
description: Conversation interrompue - timeout
|
|
200
261
|
`;
|
|
201
262
|
const finalResult = await this.executor.executeSimulator(context, reportQuery);
|
|
202
263
|
return this.parseSimulationResult(finalResult, expectedFormat, context);
|
|
203
264
|
}
|
|
265
|
+
/**
|
|
266
|
+
* Valider que les outils attendus ont été appelés le bon nombre de fois
|
|
267
|
+
*/
|
|
268
|
+
validateExpectedTools(expected) {
|
|
269
|
+
const errors = [];
|
|
270
|
+
for (const [toolName, constraint] of Object.entries(expected)) {
|
|
271
|
+
const { count } = this.executionActionCount(toolName);
|
|
272
|
+
// Validation equal (égalité exacte)
|
|
273
|
+
if (constraint.equal !== undefined && count !== constraint.equal) {
|
|
274
|
+
errors.push(`Tool '${toolName}': expected equal to ${constraint.equal}, got ${count}`);
|
|
275
|
+
}
|
|
276
|
+
// Validation gte (greater than or equal - supérieur ou égal)
|
|
277
|
+
if (constraint.gte !== undefined && count < constraint.gte) {
|
|
278
|
+
errors.push(`Tool '${toolName}': expected >= ${constraint.gte}, got ${count}`);
|
|
279
|
+
}
|
|
280
|
+
// Validation lte (less than or equal - inférieur ou égal)
|
|
281
|
+
if (constraint.lte !== undefined && count > constraint.lte) {
|
|
282
|
+
errors.push(`Tool '${toolName}': expected <= ${constraint.lte}, got ${count}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return {
|
|
286
|
+
passed: errors.length === 0,
|
|
287
|
+
errors
|
|
288
|
+
};
|
|
289
|
+
}
|
|
204
290
|
}
|
|
205
291
|
exports.AgentSimulator = AgentSimulator;
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { SimulationScenario } from "./simulator.types";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
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
|
-
*/
|
|
16
|
-
export declare const buildSimulatorQuery: (scenario: SimulationScenario) => string;
|
|
@@ -1,108 +1,88 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
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
|
-
|
|
15
|
+
function GENERIC_SIMULATOR_PROMPT(scenario, instructionEx) {
|
|
16
|
+
const persona = scenario.persona || scenario.testPersona || '';
|
|
17
|
+
const goals = scenario.goals || scenario.testGoals || '';
|
|
18
|
+
const resultFormat = scenario.result || scenario.testResult || '';
|
|
19
|
+
return `# IDENTITÉ
|
|
20
|
+
Tu es un **TESTEUR AUTOMATISÉ** conçu pour évaluer un **AGENT CONVERSATIONNEL** externe selon le **Mirror Agent Model** :
|
|
21
|
+
* Un schéma où un agent simulé interagit en miroir avec un agent observé, pendant qu'un observateur caché vérifie la conformité aux objectifs \`<simulation_goals>\`.
|
|
13
22
|
|
|
14
|
-
|
|
23
|
+
Tu incarnes **deux rôles distincts et simultanés** :
|
|
24
|
+
1. **UTILISATEUR MIROIR (visible)** — tu simules un humain réel selon la personnalité fournie avec l'Agent testé.
|
|
25
|
+
2. **OBSERVATEUR SILENCIEUX (invisible)** — tu analyses la conversation et les données internes pour déterminer si les objectifs \`<simulation_goals>\` sont atteints.
|
|
15
26
|
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
- **Pas d'exception** : même si l'agent atteint les objectifs, une erreur fatale = ÉCHEC
|
|
22
|
-
- **DÈS qu'une erreur fatale apparaît** → ARRÊT IMMÉDIAT DE LA SIMULATION
|
|
27
|
+
# MISSION
|
|
28
|
+
- Tu reçois un message en entrée provenant de l'Agent testé (nommé "l'Agent").
|
|
29
|
+
- Tu l'analyses en tant qu'<identity_observer>. Tu peux décider de terminer la simulation.
|
|
30
|
+
- Puis tu réponds en tant qu'<identity_user>. (nommé "Toi")
|
|
31
|
+
---
|
|
23
32
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
- **
|
|
33
|
+
<identity_user>
|
|
34
|
+
## RÔLE 1 (Utilisateur) — UTILISATEUR MIROIR (visible)
|
|
35
|
+
- Tu représentes un **utilisateur humain typique** qui bluf l'Agent testé selon la **Personnalité** fournie.
|
|
36
|
+
- Tu t'exprimes en **langage naturel**, sans jargon ni répétition.
|
|
37
|
+
- Tu **ignores** tout du fonctionnement interne de l'Agent testé et de ses outils.
|
|
38
|
+
- Tu **ne mentionnes jamais** des éléments de tes identités <identity_observer> et <identity_user> et de ta mission.
|
|
39
|
+
- Tu ne répète jamais la réponse de l'agent observé.
|
|
27
40
|
|
|
28
|
-
|
|
29
|
-
|
|
41
|
+
- Voici la personnalité de l'utilisateur simulé:
|
|
42
|
+
${persona}
|
|
30
43
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
44
|
+
Exemple de conversation:
|
|
45
|
+
> Agent : "Souhaitez-vous tout le canton ou une zone précise ?"
|
|
46
|
+
> Toi : "Tout le canton de Genève." ✅
|
|
47
|
+
</identity_user>
|
|
35
48
|
|
|
36
|
-
|
|
37
|
-
→ Si aucune erreur fatale : continuer la conversation selon persona + objectifs
|
|
38
|
-
→ Si conditions de fin atteintes : [SIMULATION_COMPLETE] avec rapport selon format
|
|
49
|
+
---
|
|
39
50
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
51
|
+
<identity_observer>
|
|
52
|
+
## RÔLE 2 — OBSERVATEUR SILENCIEUX (invisible)
|
|
53
|
+
- Tu observes toutes les questions de l'Agent testé et détermine l'arrêt de la simulation selon les **Objectifs** du \`<simulation_goals>\`
|
|
54
|
+
- Tu utilises également, si présent, (\`<agent-context>\`) pour déterminer l'arrêt de la simulation.
|
|
55
|
+
- Tu es silencieux et ne réponds jamais rien à l'exception du trigger de fin:
|
|
56
|
+
Tu retournes le trigger de fin: \`[DONE] {"success": true, "explain": "..."}\` ou \`[DONE] {"success": false, "error": "..."}\`.
|
|
46
57
|
|
|
47
|
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
- **Pas de récapitulatifs** : Un utilisateur ne résume pas, il répond à la question posée
|
|
52
|
-
- **Personnalité authentique** : adopter la persona définie
|
|
53
|
-
- **Pas de méta** : jamais mentionner "test", "simulation", "objectifs", "évaluation"
|
|
58
|
+
### CONTEXT (\`<agent-context>\` invisible pour le CLIENT)
|
|
59
|
+
- Le tag \`<agent-context>\` contient des données techniques de l'agent testé (outils appelés, nombre d'échanges, etc).
|
|
60
|
+
- Ces informations sont **strictement réservées à toi l'observateur.
|
|
61
|
+
**AUTORISÉ** : les exploiter pour valider les objectifs ou décider de la fin du test.
|
|
54
62
|
|
|
55
|
-
|
|
56
|
-
|
|
63
|
+
Exemple avec sortie pour <simulation_goals>CONDITION DE FIN: L'agent demande si l'utilisateur souhaite chercher sur internet</simulation_goals>:
|
|
64
|
+
> Toi : "Quelle est la température du lac à Genève ?"
|
|
65
|
+
> Agent : "Je n'ai pas cette information, souhaitez-vous que je cherche sur internet ?"
|
|
66
|
+
> Toi : "[DONE] {success=true, ...}" ✅
|
|
57
67
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
2. **ADOPTER** la personnalité indiquée
|
|
61
|
-
3. **VÉRIFIER** les objectifs tout en surveillant activement les erreurs
|
|
62
|
-
4. **TERMINER** selon les conditions OU dès qu'une erreur fatale apparaît
|
|
68
|
+
</identity_observer>
|
|
69
|
+
---
|
|
63
70
|
|
|
64
|
-
#
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
- **testPersona** : Personnalité à adopter (patient, pressé, énervé, etc.)
|
|
69
|
-
- **testError** : Termes/comportements interdits qui causent un échec immédiat (erreurs fatales)
|
|
70
|
-
- **testResult** : Format JSON attendu pour le rapport final de simulation
|
|
71
|
+
# PLAN DE SIMULATION
|
|
72
|
+
<simulation_goals>
|
|
73
|
+
${goals}
|
|
74
|
+
</simulation_goals>
|
|
71
75
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
76
|
+
<simulation_result_format>
|
|
77
|
+
${resultFormat}
|
|
78
|
+
</simulation_result_format>
|
|
79
|
+
|
|
80
|
+
**CRITICAL**: Your response after [DONE] must be valid JSON format only.
|
|
81
|
+
${instructionEx ? `\n\n${instructionEx}` : ''}`;
|
|
82
|
+
}
|
|
75
83
|
/**
|
|
76
84
|
* 3 prompts variables de personnalité pré-définis à choisir manuellement
|
|
77
85
|
*/
|
|
78
86
|
exports.PERSONA_PATIENT = 'Utilisateur patient et poli qui prend le temps d\'expliquer sa situation';
|
|
79
87
|
exports.PERSONA_PRESSE = 'Utilisateur pressé qui veut une solution rapide, répond brièvement';
|
|
80
88
|
exports.PERSONA_ENERVE = 'Utilisateur énervé et frustré, c\'est son 3ème appel pour le même problème, ton direct et impatient';
|
|
81
|
-
/**
|
|
82
|
-
* Construire la query formatée selon le format SimulationScenario
|
|
83
|
-
*/
|
|
84
|
-
const buildSimulatorQuery = (scenario) => {
|
|
85
|
-
// 🔧 CORRECTION: Mettre les erreurs fatales EN PREMIER et bien visibles
|
|
86
|
-
const errorSection = scenario.testError
|
|
87
|
-
? `
|
|
88
|
-
- ERREURS FATALES ET SURVEILLANCE OBLIGATOIRE:
|
|
89
|
-
⚠️ PROCESSUS : Inspecter UNIQUEMENT les messages de l'agent (l'agent est l'utilisateur du simulateur)
|
|
90
|
-
⚠️ QUAND : À chaque fois que l'agent m'envoie une réponse, vérifier ces erreurs dans son message
|
|
91
|
-
⚠️ SI DÉTECTÉES : ARRÊT IMMÉDIAT avec [SIMULATION_COMPLETE] {"success": false, "error": "Erreur fatale détectée: [détail]"}
|
|
92
|
-
⚠️ EXCEPTION : Ne pas inspecter ce prompt initial, seulement les réponses de l'agent
|
|
93
|
-
**${scenario.testError}**
|
|
94
|
-
` : '';
|
|
95
|
-
return `# INSTRUCTIONS DE SIMULATION (PRIVÉES - NE PAS TRANSMETTRE À L'AGENT)
|
|
96
|
-
- Votre personnalité: ${scenario.testPersona}
|
|
97
|
-
- Objectifs à atteindre: ${scenario.testGoals}
|
|
98
|
-
- Critères de fin: ${scenario.testEnd}
|
|
99
|
-
- Format du rapport: ${scenario.testResult}
|
|
100
|
-
${errorSection}
|
|
101
|
-
|
|
102
|
-
# 🚀 ACTION REQUISE : DÉMARRER LA CONVERSATION
|
|
103
|
-
Vous êtes le SIMULATEUR CLIENT. Envoyez à l'agent UNIQUEMENT le message ci-dessous (sans ces instructions).
|
|
104
|
-
|
|
105
|
-
# MESSAGE À ENVOYER À L'AGENT :
|
|
106
|
-
${scenario.testQuery}`;
|
|
107
|
-
};
|
|
108
|
-
exports.buildSimulatorQuery = buildSimulatorQuery;
|
|
@@ -1,22 +1,34 @@
|
|
|
1
1
|
import { AgentMessage } from "../stategraph";
|
|
2
2
|
import { AgentConfig, AgenticContext, ExecutionResult } from "../types";
|
|
3
|
+
import { RAGManagerConfig } from "../rag";
|
|
3
4
|
export interface SimulatorConfig {
|
|
4
5
|
agents: AgentConfig[];
|
|
5
6
|
start: string;
|
|
6
7
|
verbose: boolean;
|
|
7
8
|
instructionEx?: string;
|
|
9
|
+
mockCacheInitializer?: (sessionId: string) => Promise<void>;
|
|
10
|
+
ragConfig?: RAGManagerConfig;
|
|
8
11
|
}
|
|
9
12
|
export interface SimulationScenario {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
goals?: string;
|
|
14
|
+
persona?: string;
|
|
15
|
+
result?: string;
|
|
16
|
+
testGoals?: string;
|
|
17
|
+
testEnd?: string;
|
|
15
18
|
testError?: string;
|
|
19
|
+
testPersona?: string;
|
|
20
|
+
testQuery?: string;
|
|
21
|
+
testResult?: string;
|
|
16
22
|
}
|
|
17
23
|
export interface SimulationOptions {
|
|
18
24
|
scenario: SimulationScenario;
|
|
25
|
+
query?: string;
|
|
19
26
|
maxExchanges: number;
|
|
27
|
+
expectedTool?: Record<string, {
|
|
28
|
+
equal?: number;
|
|
29
|
+
gte?: number;
|
|
30
|
+
lte?: number;
|
|
31
|
+
}>;
|
|
20
32
|
onMessage?: (message: AgentMessage) => void;
|
|
21
33
|
}
|
|
22
34
|
export interface SimulationResult {
|
|
@@ -25,10 +37,16 @@ export interface SimulationResult {
|
|
|
25
37
|
error: string;
|
|
26
38
|
execution: ExecutionResult;
|
|
27
39
|
exchangeCount: number;
|
|
40
|
+
messages: AgentMessage[];
|
|
41
|
+
toolValidation?: {
|
|
42
|
+
passed: boolean;
|
|
43
|
+
errors: string[];
|
|
44
|
+
};
|
|
28
45
|
}
|
|
29
46
|
export interface ExecutionContext {
|
|
30
47
|
agentContext: AgenticContext;
|
|
31
48
|
simulatorContext: AgenticContext;
|
|
49
|
+
simulatorAgent: AgentConfig;
|
|
32
50
|
conversationHistory: string[];
|
|
33
51
|
exchangeCount: number;
|
|
34
52
|
lastExecution: ExecutionResult;
|
|
@@ -9,12 +9,17 @@ export declare function loadScenario(ticketPath: string): {
|
|
|
9
9
|
};
|
|
10
10
|
/**
|
|
11
11
|
* Construire SimulationScenario à partir d'un ticket PRSolver (rétrocompatibilité)
|
|
12
|
-
* Permet de surcharger tous les champs avec custom
|
|
12
|
+
* Permet de surcharger tous les champs avec custom
|
|
13
|
+
* Note: Cette fonction retourne un scenario SANS query - il faut la passer séparément à executeSimulation
|
|
13
14
|
*/
|
|
14
15
|
export declare function buildScenarioFromTicket(ticketPath: string, clientType: 'locataire' | 'proprietaire', persona?: string, // PERSONA_PATIENT | PERSONA_PRESSE | PERSONA_ENERVE
|
|
15
|
-
custom?: Partial<SimulationScenario>):
|
|
16
|
+
custom?: Partial<SimulationScenario>): {
|
|
17
|
+
scenario: SimulationScenario;
|
|
18
|
+
query: string;
|
|
19
|
+
};
|
|
16
20
|
/**
|
|
17
21
|
* Construire SimulationScenario générique directement
|
|
22
|
+
* Supporte l'ancien format (testGoals, testEnd, etc.) pour rétrocompatibilité
|
|
18
23
|
*/
|
|
19
24
|
export declare function buildGenericScenario(scenario: SimulationScenario): SimulationScenario;
|
|
20
25
|
export { PERSONA_PATIENT, PERSONA_PRESSE, PERSONA_ENERVE };
|
|
@@ -53,7 +53,8 @@ function loadScenario(ticketPath) {
|
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
55
|
* Construire SimulationScenario à partir d'un ticket PRSolver (rétrocompatibilité)
|
|
56
|
-
* Permet de surcharger tous les champs avec custom
|
|
56
|
+
* Permet de surcharger tous les champs avec custom
|
|
57
|
+
* Note: Cette fonction retourne un scenario SANS query - il faut la passer séparément à executeSimulation
|
|
57
58
|
*/
|
|
58
59
|
function buildScenarioFromTicket(ticketPath, clientType, persona = simulator_prompts_1.PERSONA_PATIENT, // PERSONA_PATIENT | PERSONA_PRESSE | PERSONA_ENERVE
|
|
59
60
|
custom // Surcharge optionnelle de tous les champs
|
|
@@ -61,27 +62,46 @@ custom // Surcharge optionnelle de tous les champs
|
|
|
61
62
|
const { ticketMarkdown, ticketId } = loadScenario(ticketPath);
|
|
62
63
|
// Scenario par défaut complet
|
|
63
64
|
const defaultScenario = {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
goals: `Valider les Objectifs de PRSolver pour ticket ${ticketId}. Agent termine avec salutations (état 5_cloture)`,
|
|
66
|
+
persona: persona,
|
|
67
|
+
result: 'done:boolean, error:string, description:string'
|
|
68
|
+
};
|
|
69
|
+
const query = `Je suis le client (demandeur '${clientType}') du ticket en ANNEXE. Démarre la conversation exactement comme décrit dans l'ANNEXE.
|
|
68
70
|
## ANNEXE - Ticket ${ticketId}
|
|
69
71
|
\`\`\`
|
|
70
72
|
${ticketMarkdown}
|
|
71
73
|
\`\`\`
|
|
72
|
-
|
|
73
|
-
testResult: 'done:boolean, error:string, description:string'
|
|
74
|
-
};
|
|
74
|
+
`;
|
|
75
75
|
// Merger avec custom
|
|
76
|
-
return {
|
|
76
|
+
return {
|
|
77
|
+
scenario: { ...defaultScenario, ...custom },
|
|
78
|
+
query
|
|
79
|
+
};
|
|
77
80
|
}
|
|
78
81
|
/**
|
|
79
82
|
* Construire SimulationScenario générique directement
|
|
83
|
+
* Supporte l'ancien format (testGoals, testEnd, etc.) pour rétrocompatibilité
|
|
80
84
|
*/
|
|
81
85
|
function buildGenericScenario(scenario) {
|
|
86
|
+
// Gérer la rétrocompatibilité avec l'ancien format
|
|
87
|
+
if (scenario.testGoals || scenario.testEnd || scenario.testError) {
|
|
88
|
+
// Ancien format détecté - conversion vers le nouveau format
|
|
89
|
+
let goals = scenario.testGoals || '';
|
|
90
|
+
if (scenario.testEnd) {
|
|
91
|
+
goals += `\nCONDITION DE FIN: ${scenario.testEnd}`;
|
|
92
|
+
}
|
|
93
|
+
if (scenario.testError) {
|
|
94
|
+
goals += `\nERREUR FATALE: ${scenario.testError}`;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
goals: goals.trim(),
|
|
98
|
+
persona: scenario.testPersona || scenario.persona || '',
|
|
99
|
+
result: scenario.testResult || scenario.result || '{"success": boolean, "error": string, "description": string}',
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// Nouveau format - juste ajouter un result par défaut si manquant
|
|
82
103
|
return {
|
|
83
104
|
...scenario,
|
|
84
|
-
|
|
85
|
-
testResult: scenario.testResult || 'done:boolean, error:string, description:string'
|
|
105
|
+
result: scenario.result || '{"success": boolean, "error": string, "description": string}'
|
|
86
106
|
};
|
|
87
107
|
}
|