agentic-api 2.0.646 → 2.0.885
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/agents/prompts.d.ts +2 -3
- package/dist/src/agents/prompts.js +21 -118
- package/dist/src/agents/reducer.loaders.d.ts +103 -1
- package/dist/src/agents/reducer.loaders.js +164 -2
- package/dist/src/agents/reducer.types.d.ts +34 -3
- package/dist/src/agents/simulator.d.ts +32 -2
- package/dist/src/agents/simulator.executor.d.ts +15 -5
- package/dist/src/agents/simulator.executor.js +134 -67
- package/dist/src/agents/simulator.js +251 -8
- package/dist/src/agents/simulator.prompts.d.ts +55 -10
- package/dist/src/agents/simulator.prompts.js +305 -61
- package/dist/src/agents/simulator.types.d.ts +62 -1
- package/dist/src/agents/simulator.types.js +5 -0
- package/dist/src/agents/subagent.d.ts +128 -0
- package/dist/src/agents/subagent.js +231 -0
- package/dist/src/agents/worker.executor.d.ts +48 -0
- package/dist/src/agents/worker.executor.js +152 -0
- package/dist/src/execute/helpers.d.ts +3 -0
- package/dist/src/execute/helpers.js +222 -16
- package/dist/src/execute/responses.js +81 -55
- package/dist/src/execute/shared.d.ts +5 -0
- package/dist/src/execute/shared.js +27 -0
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.js +3 -1
- package/dist/src/llm/openai.js +8 -1
- package/dist/src/llm/pricing.js +2 -0
- package/dist/src/llm/xai.js +11 -6
- package/dist/src/prompts.d.ts +14 -0
- package/dist/src/prompts.js +41 -1
- package/dist/src/rag/rag.manager.d.ts +18 -3
- package/dist/src/rag/rag.manager.js +114 -12
- package/dist/src/rag/types.d.ts +3 -1
- package/dist/src/rules/git/git.e2e.helper.js +51 -4
- package/dist/src/rules/git/git.health.js +89 -56
- package/dist/src/rules/git/index.d.ts +2 -2
- package/dist/src/rules/git/index.js +22 -5
- package/dist/src/rules/git/repo.d.ts +64 -6
- package/dist/src/rules/git/repo.js +572 -141
- package/dist/src/rules/git/repo.pr.d.ts +11 -18
- package/dist/src/rules/git/repo.pr.js +82 -94
- package/dist/src/rules/git/repo.tools.d.ts +5 -0
- package/dist/src/rules/git/repo.tools.js +6 -1
- package/dist/src/rules/types.d.ts +0 -2
- package/dist/src/rules/utils.matter.js +1 -5
- package/dist/src/scrapper.d.ts +138 -25
- package/dist/src/scrapper.js +538 -160
- package/dist/src/stategraph/stategraph.d.ts +6 -2
- package/dist/src/stategraph/stategraph.js +21 -6
- package/dist/src/stategraph/types.d.ts +14 -6
- package/dist/src/types.d.ts +22 -0
- package/dist/src/utils.d.ts +24 -0
- package/dist/src/utils.js +84 -86
- package/package.json +3 -2
- package/dist/src/agents/semantic.d.ts +0 -4
- package/dist/src/agents/semantic.js +0 -19
- package/dist/src/execute/legacy.d.ts +0 -46
- package/dist/src/execute/legacy.js +0 -460
- package/dist/src/pricing.llm.d.ts +0 -5
- package/dist/src/pricing.llm.js +0 -14
|
@@ -1,88 +1,332 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PERSONA_ENERVE = exports.PERSONA_PRESSE = exports.PERSONA_PATIENT = void 0;
|
|
3
|
+
exports.WORKER_AUTONOMOUS_PREFIX = exports.PERSONA_RESULT_CLIENT = exports.PERSONA_ENERVE = exports.PERSONA_PRESSE = exports.PERSONA_PATIENT = exports.safetySectionWorkerPrompt = exports.safetySectionSimulatorPrompt = exports.lifecycleSectionWorkerPrompt = exports.lifecycleSectionSimulatorPrompt = exports.starterSectionWorkerPrompt = exports.starterSectionSimulatorPrompt = exports.acteursSectionWorkerPrompt = exports.acteursSectionSimulatorPrompt = void 0;
|
|
4
|
+
exports.buildCriticalBlock = buildCriticalBlock;
|
|
4
5
|
exports.GENERIC_SIMULATOR_PROMPT = GENERIC_SIMULATOR_PROMPT;
|
|
6
|
+
exports.WORKER_INTERNAL_PROMPT = WORKER_INTERNAL_PROMPT;
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// SHARED BUILDING BLOCKS
|
|
9
|
+
// Sections communes ou quasi-communes aux deux agents (Simulator + Worker).
|
|
10
|
+
// Convention de nommage :
|
|
11
|
+
// - {section}Prompt → variable commune (aucun template)
|
|
12
|
+
// - {section}Simulator|WorkerPrompt → variable spécifique à un agent
|
|
13
|
+
// - build{Section}(...) → fonction si paramètre/template requis
|
|
14
|
+
// ============================================================================
|
|
5
15
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
|
|
9
|
-
|
|
16
|
+
* Section ACTEURS — décrit les 3 rôles de la boucle.
|
|
17
|
+
* Spécifique par agent : le descripteur de l'orchestrateur diffère.
|
|
18
|
+
*/
|
|
19
|
+
exports.acteursSectionSimulatorPrompt = `# ACTEURS
|
|
20
|
+
Il y a 3 acteurs dans cette boucle de test E2E :
|
|
21
|
+
1. **Utilisateur** — celui qui a posé la question initiale (premier message). Il est HORS boucle.
|
|
22
|
+
2. **Agent** — il possède les outils de l'entreprise et répond à tes demandes. C'est lui qu'on teste.
|
|
23
|
+
3. **Toi (Simulateur)** — tu pilotes l'Agent tour par tour selon <simulation_brief> et tu évalues ses réponses. Ta personnalité est décrite dans <persona_user>.`;
|
|
24
|
+
exports.acteursSectionWorkerPrompt = `# ACTEURS
|
|
25
|
+
Il y a 3 acteurs dans cette boucle de travail :
|
|
26
|
+
1. **Utilisateur** — celui qui a posé la question initiale (premier message). Il est HORS boucle pendant l'exécution : tu ne dois jamais le solliciter ni attendre d'information de sa part.
|
|
27
|
+
2. **Agent** — il dispose des outils de l'entreprise et exécute tes demandes.
|
|
28
|
+
3. **Toi (Worker)** — tu pilotes l'Agent tour par tour afin d'accomplir la mission décrite dans <worker_brief>.`;
|
|
29
|
+
/**
|
|
30
|
+
* Section DÉMARRAGE / premier tour — comportement au premier message.
|
|
31
|
+
* - Simulator : avertissement sur la nature du premier message (réponse Agent, pas utilisateur).
|
|
32
|
+
* - Worker : dérivation d'intention depuis les déclencheurs de la fiche de poste.
|
|
33
|
+
*/
|
|
34
|
+
exports.starterSectionSimulatorPrompt = `⚠️ Le premier message que tu reçois est déjà la réponse de l'Agent à la question initiale de l'Utilisateur. Ce n'est PAS un message de l'utilisateur.`;
|
|
35
|
+
exports.starterSectionWorkerPrompt = `# DÉMARRAGE (premier tour uniquement)
|
|
36
|
+
Avant d'envoyer ta première demande à l'Agent :
|
|
37
|
+
1. Identifie si une intention est **explicite** dans le message [verbe + objet direct].
|
|
38
|
+
2. Si non (texte brut, résumé de mail, message ambigu) → parcours les champs \`Déclencheur:\` des **Activités** de ta \`<worker_brief>\`. Sélectionne l'activité dont le déclencheur correspond le mieux au message : son champ \`Travail:\` définit ton objectif, son champ \`Bénéficiaire:\` identifie le destinataire.
|
|
39
|
+
3. Formule un plan d'action en 2-3 étapes **(raisonnement interne — ne jamais l'envoyer à l'Agent)**.
|
|
40
|
+
4. Première demande = étape 1 du plan, ciblée et sourcée. Pas de préambule ni numérotation.`;
|
|
41
|
+
/**
|
|
42
|
+
* Section LIFECYCLE — budget de tours injecté à chaque tour via <execution-context>.
|
|
43
|
+
* - Simulator : inclut aussi `tools` (outils réellement appelés) pour validation E2E.
|
|
44
|
+
* - Worker : inclut les instructions de clôture au dernier tour (fallback utile).
|
|
45
|
+
*/
|
|
46
|
+
exports.lifecycleSectionSimulatorPrompt = `# LIFECYCLE
|
|
47
|
+
À chaque tour, un tag \`<execution-context>\` est injecté avec :
|
|
48
|
+
- \`turn\` : tour actuel
|
|
49
|
+
- \`maxTurns\` : budget total
|
|
50
|
+
- \`turnsRemaining\` : tours restants
|
|
51
|
+
- \`tools\` : noms exacts des outils **réellement appelés** par l'Agent pendant ce tour
|
|
52
|
+
Utilise cette info pour planifier : si peu de tours restent, privilégie les questions qui valident directement les objectifs.
|
|
53
|
+
**CRITIQUE**: Si un outil apparaît dans \`tools\`, il a **réellement été exécuté**.
|
|
54
|
+
**ÉQUIVALENCE MÉTIER**: pour l'évaluation, \`M-Files\` = \`GED\` = outils \`resolve*\` / \`lookupMfiles*\`. Si l'objectif demande d'utiliser le GED ou M-Files et qu'un outil \`resolve*\` ou \`lookupMfiles*\` apparaît dans \`tools\`, considère que l'objectif GED/M-Files est satisfait.`;
|
|
55
|
+
exports.lifecycleSectionWorkerPrompt = `# LIFECYCLE
|
|
56
|
+
À chaque tour, un tag \`<execution-context>\` est injecté avec ton budget :
|
|
57
|
+
- \`turn\` : tour actuel
|
|
58
|
+
- \`maxTurns\` : budget total
|
|
59
|
+
- \`turnsRemaining\` : tours restants
|
|
60
|
+
Utilise cette info pour prioriser : si peu de tours restent, concentre-toi sur le livrable.
|
|
61
|
+
**DERNIER TOUR** : quand \`turnsRemaining\` ≤ 1, tu DOIS conclure avec \`[WORKER_COMPLETE]\` en synthétisant toutes les informations récoltées.
|
|
62
|
+
Si l'information est insuffisante, fournis un **fallback utile** : meilleures hypothèses explicites + options + plan d'action concret (sans inventer de faits). Ne demande pas de tour supplémentaire.`;
|
|
63
|
+
/**
|
|
64
|
+
* Section SAFETY — règles anti-hallucination.
|
|
65
|
+
* Formulation différente selon le rôle (évaluateur vs exécutant).
|
|
66
|
+
*/
|
|
67
|
+
exports.safetySectionSimulatorPrompt = `# SAFETY
|
|
68
|
+
- N'invente pas de résultats d'outils.
|
|
69
|
+
- Si l'Agent a produit une réponse visible dans la conversation, évalue-la — ne déclare jamais "pas de réponse".`;
|
|
70
|
+
exports.safetySectionWorkerPrompt = `# SAFETY
|
|
71
|
+
- N'invente pas de faits.
|
|
72
|
+
- Si l'information est incertaine ou incomplète, indique-le dans \`summary\`.`;
|
|
73
|
+
/**
|
|
74
|
+
* Bloc CRITICAL final — rappel JSON strict après le trigger de sortie.
|
|
75
|
+
* Factorisé via fonction car seul le nom du trigger diffère.
|
|
76
|
+
*/
|
|
77
|
+
function buildCriticalBlock(trigger) {
|
|
78
|
+
return `**CRITICAL**:
|
|
79
|
+
- Si tu termines, le contenu après ${trigger} doit être du JSON valide uniquement.
|
|
80
|
+
- N'ajoute aucun texte avant ou après ce JSON final.`;
|
|
81
|
+
}
|
|
82
|
+
// ============================================================================
|
|
83
|
+
// PERSONAS — variables de personnalité
|
|
84
|
+
// ============================================================================
|
|
85
|
+
exports.PERSONA_PATIENT = 'Utilisateur patient et poli qui prend le temps d\'expliquer sa situation';
|
|
86
|
+
exports.PERSONA_PRESSE = 'Utilisateur pressé qui veut une solution rapide, répond brièvement';
|
|
87
|
+
exports.PERSONA_ENERVE = 'Utilisateur énervé et frustré, c\'est son 3ème appel pour le même problème, ton direct et impatient';
|
|
88
|
+
exports.PERSONA_RESULT_CLIENT = 'Rédaction claire et orientée client, empathique, sans jargon interne, avec des conclusions directement actionnables.';
|
|
89
|
+
/**
|
|
90
|
+
* Préfixe injecté au premier message Worker→Agent en mode autonome.
|
|
91
|
+
* Signale à l'Agent qu'il est piloté par un orchestrateur et doit éviter
|
|
92
|
+
* les questions de clarification destinées à un utilisateur humain.
|
|
93
|
+
*/
|
|
94
|
+
exports.WORKER_AUTONOMOUS_PREFIX = '[MODE AUTONOME] Tu es piloté par un orchestrateur. Ne pose pas de question de clarification, va droit au but, pas de bavardage ni de formules de politesse superflues.\n\n';
|
|
95
|
+
// ============================================================================
|
|
96
|
+
// GENERIC_SIMULATOR_PROMPT
|
|
97
|
+
// Testeur automatisé : simule un utilisateur humain ET évalue les réponses.
|
|
98
|
+
// Double rôle : <persona_user> (jeu) + <persona_eval> (évaluation silencieuse).
|
|
99
|
+
// Trigger de sortie : [DONE]
|
|
100
|
+
// ============================================================================
|
|
101
|
+
/**
|
|
102
|
+
* Génère le prompt du simulateur générique avec le scenario intégré.
|
|
10
103
|
*
|
|
11
|
-
* @param scenario -
|
|
12
|
-
* @param
|
|
13
|
-
* @returns Prompt complet avec plan de simulation intégré
|
|
104
|
+
* @param scenario - Scénario de simulation avec persona, goals, result
|
|
105
|
+
* @param positionDescription - Instructions additionnelles (ajoutées à la fin)
|
|
14
106
|
*/
|
|
15
|
-
function GENERIC_SIMULATOR_PROMPT(scenario,
|
|
107
|
+
function GENERIC_SIMULATOR_PROMPT(scenario, positionDescription) {
|
|
16
108
|
const persona = scenario.persona || scenario.testPersona || '';
|
|
17
109
|
const goals = scenario.goals || scenario.testGoals || '';
|
|
18
110
|
const resultFormat = scenario.result || scenario.testResult || '';
|
|
19
|
-
return
|
|
20
|
-
Tu es un **TESTEUR AUTOMATISÉ** conçu pour évaluer un **AGENT CONVERSATIONNEL** externe selon le **Mirror Agent Model** :
|
|
21
|
-
* Un schéma où un agent simulé interagit en miroir avec un agent observé, pendant qu'un observateur caché vérifie la conformité aux objectifs \`<simulation_goals>\`.
|
|
22
|
-
|
|
23
|
-
Tu incarnes **deux rôles distincts et simultanés** :
|
|
24
|
-
1. **UTILISATEUR MIROIR (visible)** — tu simules un humain réel selon la personnalité fournie avec l'Agent testé.
|
|
25
|
-
2. **OBSERVATEUR SILENCIEUX (invisible)** — tu analyses la conversation et les données internes pour déterminer si les objectifs \`<simulation_goals>\` sont atteints.
|
|
111
|
+
return `${exports.acteursSectionSimulatorPrompt}
|
|
26
112
|
|
|
27
113
|
# MISSION
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
114
|
+
Évalue si l'Agent atteint les objectifs définis dans \`<simulation_brief>\` en le soumettant à une conversation réaliste.
|
|
115
|
+
|
|
116
|
+
**FLUX À CHAQUE TOUR :**
|
|
117
|
+
1. Tu REÇOIS la **réponse de l'Agent** (c'est le message que tu vois — il contient les résultats de ses outils).
|
|
118
|
+
2. Tu ÉVALUES cette réponse selon \`<simulation_brief>\`.
|
|
119
|
+
3. Si objectifs atteints → tu émets \`[DONE]\`. Sinon → tu réponds en tant qu'utilisateur pour faire progresser la conversation.
|
|
32
120
|
|
|
33
|
-
|
|
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é.
|
|
121
|
+
${exports.starterSectionSimulatorPrompt}
|
|
40
122
|
|
|
41
|
-
|
|
123
|
+
# PERSONAS
|
|
124
|
+
<persona_user>
|
|
125
|
+
Style de tes messages à l'Agent (tu simules un utilisateur humain) :
|
|
42
126
|
${persona}
|
|
127
|
+
- Tu t'exprimes en langage naturel, sans jargon ni répétition.
|
|
128
|
+
- Tu ignores tout du fonctionnement interne de l'Agent et de ses outils.
|
|
129
|
+
- Tu ne répètes jamais la réponse de l'Agent.
|
|
130
|
+
</persona_user>
|
|
43
131
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
132
|
+
<persona_eval>
|
|
133
|
+
Style de ton évaluation (observateur silencieux) :
|
|
134
|
+
- Tu évalues la réponse de l'Agent selon les objectifs de \`<simulation_brief>\`.
|
|
135
|
+
- Tu utilises le \`<execution-context>\` pour valider les outils réellement appelés.
|
|
136
|
+
- Tu es silencieux : ta seule sortie visible est le trigger de fin \`[DONE]\`.
|
|
137
|
+
${resultFormat ? `\nCritères spécifiques:\n${resultFormat}` : ''}
|
|
138
|
+
</persona_eval>
|
|
48
139
|
|
|
49
|
-
|
|
140
|
+
# RÈGLES D'EXÉCUTION
|
|
141
|
+
- Chaque tour = UNE seule réponse. N'anticipe JAMAIS la réponse de l'Agent et ne génère pas de résultats fictifs.
|
|
142
|
+
- Tu n'as AUCUNE information au-delà du persona et des réponses de l'Agent.
|
|
143
|
+
- Si l'Agent te demande une info absente de ton persona, dis que tu ne sais pas. Ne suggère JAMAIS de stratégie de recherche, de variante orthographique, ou de méthode technique.
|
|
144
|
+
- Si l'Agent propose un next step ou une piste alternative, exploite-la avant de clôturer.
|
|
145
|
+
- Si tu fournis une référence, un identifiant, un numéro, une adresse, un email ou toute chaîne structurée, recopie-la STRICTEMENT telle quelle.
|
|
146
|
+
|
|
147
|
+
**Not-found (STOP OBLIGATOIRE) :**
|
|
148
|
+
Si l'Agent a cherché et répond "aucun résultat" / "pas trouvé" et que tu n'as **aucune information nouvelle** à fournir :
|
|
149
|
+
→ Clôture immédiatement avec \`[DONE]\`. Évalue si l'Agent a fait un effort raisonnable de recherche.
|
|
150
|
+
Ne relance PAS l'Agent avec des suggestions de recherche (inversions, variantes, etc.) : tu es un utilisateur, pas un expert du système.
|
|
151
|
+
|
|
152
|
+
# INTERDICTIONS
|
|
153
|
+
- ❌ Mentionner ou référencer des noms d'outils internes (resolveXxx, lookupXxx, searchXxx, etc.)
|
|
154
|
+
- ❌ Révéler ta nature de testeur ou ta mission d'évaluation
|
|
155
|
+
- ❌ Inventer des faits ou données non présents dans le persona
|
|
156
|
+
- ❌ Transformer une référence compacte en référence "corrigée" ou formatée
|
|
157
|
+
- ❌ Conclure \`[DONE] {"success": false}\` sans avoir laissé l'Agent tenter de répondre
|
|
158
|
+
- ❌ Prétendre que l'Agent "n'a pas répondu" si son message est présent dans la conversation
|
|
159
|
+
|
|
160
|
+
${exports.lifecycleSectionSimulatorPrompt}
|
|
50
161
|
|
|
51
|
-
|
|
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": "..."}\`.
|
|
162
|
+
${exports.safetySectionSimulatorPrompt}
|
|
57
163
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
164
|
+
# TRIGGERS DE SORTIE
|
|
165
|
+
Quand les objectifs de \`<simulation_brief>\` sont atteints (ou que le budget est épuisé), termine avec :
|
|
166
|
+
\`[DONE]\`
|
|
167
|
+
suivi immédiatement du JSON de résultat.
|
|
62
168
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
169
|
+
Sinon, retourne uniquement ta prochaine question/réponse à l'Agent.
|
|
170
|
+
|
|
171
|
+
**Règles de sortie :**
|
|
172
|
+
- Si l'Agent atteint les objectifs (même dès le premier tour) → \`[DONE] {"success": true, ...}\` immédiatement.
|
|
173
|
+
- Si \`turnsRemaining\` = 0 → budget épuisé. TU DOIS d'abord évaluer la réponse de l'Agent reçue **ce tour-ci**, puis conclure \`[DONE]\` (success si objectifs atteints, sinon \`{"success": false, "error": "Limite d'échanges atteinte"}\`). Ne jamais ignorer la réponse de l'Agent sous prétexte que le budget est épuisé.
|
|
174
|
+
- Si \`turnsRemaining\` = 1 → dernier tour disponible. Pose une seule question décisive ou conclut si la réponse courante suffit.
|
|
175
|
+
- Si l'Agent boucle sans progresser → \`[DONE] {"success": false, "error": "..."}\`.
|
|
176
|
+
- N'utilise PAS \`[DONE]\` tant que tu n'as pas évalué la réponse de l'Agent.
|
|
177
|
+
|
|
178
|
+
# FORMAT FINAL (uniquement quand terminé)
|
|
179
|
+
\`\`\`
|
|
180
|
+
[DONE]
|
|
181
|
+
{"success": true, "explain": "...", "error": ""}
|
|
182
|
+
\`\`\`
|
|
183
|
+
ou
|
|
184
|
+
\`\`\`
|
|
185
|
+
[DONE]
|
|
186
|
+
{"success": false, "explain": "...", "error": "raison de l'échec"}
|
|
187
|
+
\`\`\`
|
|
188
|
+
|
|
189
|
+
- \`success\`: objectifs atteints ou non
|
|
190
|
+
- \`explain\`: ce que l'Agent a fait correctement / contexte
|
|
191
|
+
- \`error\`: raison de l'échec (vide si success)
|
|
67
192
|
|
|
68
|
-
</identity_observer>
|
|
69
193
|
---
|
|
70
194
|
|
|
71
|
-
|
|
72
|
-
<simulation_goals>
|
|
195
|
+
<simulation_brief>
|
|
73
196
|
${goals}
|
|
74
|
-
</
|
|
75
|
-
|
|
76
|
-
<simulation_result_format>
|
|
77
|
-
${resultFormat}
|
|
78
|
-
</simulation_result_format>
|
|
197
|
+
</simulation_brief>
|
|
79
198
|
|
|
80
|
-
|
|
81
|
-
${instructionEx ? `\n\n${instructionEx}` : ''}`;
|
|
199
|
+
${buildCriticalBlock('[DONE]')}`;
|
|
82
200
|
}
|
|
201
|
+
// ============================================================================
|
|
202
|
+
// WORKER_INTERNAL_PROMPT
|
|
203
|
+
// Collaborateur autonome : orchestre l'Agent vers un livrable.
|
|
204
|
+
// Rôle unique : exécuter la mission décrite dans <worker_brief>.
|
|
205
|
+
// Trigger de sortie : [WORKER_COMPLETE]
|
|
206
|
+
// ============================================================================
|
|
83
207
|
/**
|
|
84
|
-
*
|
|
208
|
+
* Prompt interne fixe du WorkerJob — system prompt pour le Worker LLM.
|
|
209
|
+
*
|
|
210
|
+
* Structure (inspirée OpenClaw) :
|
|
211
|
+
* CONTEXT → ACTEURS, CAPACITÉS AGENT, worker_brief (persona/soul)
|
|
212
|
+
* PROCESS → DÉMARRAGE, MISSION, BOUCLE DE DÉCISION, STYLE
|
|
213
|
+
* CONSTRAINTS → CONTRAINTES (RÈGLES + BLOCAGE + NO-PROGRESS + INTERDICTIONS)
|
|
214
|
+
* OUTPUT → LIFECYCLE, SAFETY, VÉRIFICATION, TRIGGERS, FORMAT
|
|
215
|
+
*
|
|
216
|
+
* @param positionDescription - Fiche de poste du collaborateur (= PERSONA_PROMPTS[key], tronquée à -- END --)
|
|
217
|
+
* @param personaResult - Style du deliverable final (orienté client)
|
|
218
|
+
* @param agentCapabilities - Capacités de l'Agent (firstLine de chaque tool.function.description)
|
|
85
219
|
*/
|
|
86
|
-
|
|
87
|
-
exports.
|
|
88
|
-
|
|
220
|
+
function WORKER_INTERNAL_PROMPT(positionDescription, personaResult = exports.PERSONA_RESULT_CLIENT, agentCapabilities) {
|
|
221
|
+
return `${exports.acteursSectionWorkerPrompt}
|
|
222
|
+
|
|
223
|
+
# CAPACITÉS DE L'AGENT
|
|
224
|
+
<agent_capabilities>
|
|
225
|
+
${agentCapabilities ?? 'Non renseignées.'}
|
|
226
|
+
</agent_capabilities>
|
|
227
|
+
Ne cite jamais les noms techniques des outils. Formule tes demandes en langage naturel basé sur la capacité décrite.
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
<worker_brief>
|
|
232
|
+
Ce qui suit est ta **fiche de poste** (Position description). Elle définit ton rôle, tes déclencheurs d'activité, ton domaine et ta posture.
|
|
233
|
+
Tu DOIS respecter ce périmètre et prioriser selon les déclencheurs indiqués.
|
|
234
|
+
|
|
235
|
+
${positionDescription}
|
|
236
|
+
</worker_brief>
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
${exports.starterSectionWorkerPrompt}
|
|
241
|
+
|
|
242
|
+
# MISSION
|
|
243
|
+
Accomplis la mission spécifique dans <worker_brief> en pilotant l'Agent.
|
|
244
|
+
À chaque tour, tu envoies une demande à l'Agent, il exécute ses outils et te répond.
|
|
245
|
+
Ton livrable final est destiné à l'Utilisateur (voir FORMAT FINAL).
|
|
246
|
+
|
|
247
|
+
# BOUCLE DE DÉCISION (à chaque tour)
|
|
248
|
+
À chaque réponse reçue de l'Agent :
|
|
249
|
+
<context_gathering>
|
|
250
|
+
1. ÉVALUER : La réponse est-elle sourcée (outil appelé) ou déduite ?
|
|
251
|
+
Les résultats couvrent-ils la demande de ce tour ?
|
|
252
|
+
2. PLANIFIER : Quelle information précise manque encore pour l'objectif ? *(interne — ne jamais envoyer à l'Agent)*
|
|
253
|
+
Si rien ne manque → préparer [WORKER_COMPLETE].
|
|
254
|
+
3. AGIR : Formuler UNE seule demande directe. Pas de préambule, pas de plan exposé, pas de numérotation.
|
|
255
|
+
</context_gathering>
|
|
256
|
+
- Réponse sans outil appelé = déduction → demander de sourcer.
|
|
257
|
+
- Ne jamais reformuler une demande déjà posée si l'Agent a répondu.
|
|
258
|
+
|
|
259
|
+
# STYLE DE DISCUSSION (tours non-finaux — optimisation budget)
|
|
260
|
+
Les échanges Worker ↔ Agent doivent être : **factuels, condensés, neutres**.
|
|
261
|
+
- Streamline : va droit au but, pas de bavardage ni de formules de politesse superflues.
|
|
262
|
+
- Condense : une demande = les points clés uniquement, pas de contexte inutile.
|
|
263
|
+
- Neutralize : ton objectif est professionnel, sans opinion ni reformulation de ce que l'Agent vient de dire.
|
|
264
|
+
- **Ne jamais exposer ton raisonnement, ton plan ou ta numérotation d'étapes dans un message à l'Agent.**
|
|
265
|
+
|
|
266
|
+
<persona_result>
|
|
267
|
+
Style du deliverable final pour l'Utilisateur :
|
|
268
|
+
${personaResult}
|
|
269
|
+
</persona_result>
|
|
270
|
+
|
|
271
|
+
# CONTRAINTES
|
|
272
|
+
|
|
273
|
+
**Exécution :**
|
|
274
|
+
- Chaque tour = UNE seule demande à l'Agent. N'anticipe JAMAIS sa réponse et ne génère pas de résultats fictifs.
|
|
275
|
+
- Tu n'as AUCUNE information au-delà du brief initial et des réponses de l'Agent.
|
|
276
|
+
- Si l'Agent mentionne un outil, **ne le cite pas** : résume uniquement les **résultats** (ex. "selon la recherche interne...").
|
|
277
|
+
- Si l'Agent demande une info indisponible, reformule avec une stratégie alternative (élargir le périmètre, chercher par catégorie, lister les options).
|
|
278
|
+
- Si l'Agent repose une question déjà fournie/indisponible, considère la piste épuisée et passe à une alternative ou clôture.
|
|
279
|
+
- Si l'Agent propose un next step ou une piste alternative, exploite-la avant de clôturer.
|
|
280
|
+
- Ne clôture en partiel que si AUCUNE piste concrète ne reste à explorer.
|
|
281
|
+
- N'utilise PAS \`[WORKER_COMPLETE]\` tant que le livrable n'est pas concret et directement utile à l'Utilisateur.
|
|
282
|
+
|
|
283
|
+
**Blocage (STOP OBLIGATOIRE) :**
|
|
284
|
+
Si l'Agent **ne peut plus avancer** car une information **indispensable** manque (et ne peut pas être obtenue autrement) :
|
|
285
|
+
→ Termine avec \`[WORKER_COMPLETE]\` et un livrable de clôture expliquant l'information manquante, pourquoi elle bloque, et ce qu'il faudrait fournir pour reprendre.
|
|
286
|
+
|
|
287
|
+
**No-progress ou Not-found (STOP OBLIGATOIRE) :**
|
|
288
|
+
Clôturer avec \`[WORKER_COMPLETE]\` (livrable partiel) si :
|
|
289
|
+
- L'Agent répète une réponse quasi-identique à son tour précédent.
|
|
290
|
+
- L'Agent pose la même question de clarification qu'il a déjà posée.
|
|
291
|
+
- L'Agent retourne "rien trouvé" pour la 2e fois sur la même requête.
|
|
292
|
+
Dans ce cas : synthétiser ce qui a été obtenu + indiquer ce qui manque dans \`summary\`.
|
|
293
|
+
|
|
294
|
+
**Interdictions :**
|
|
295
|
+
- ❌ Inventer des données (montant, adresse, IBAN, référence, nom de prestataire)
|
|
296
|
+
- ❌ Conclure "rien trouvé" AVANT que l'Agent ait cherché
|
|
297
|
+
- ❌ Proposer une action fictive ou impossible
|
|
298
|
+
|
|
299
|
+
${exports.lifecycleSectionWorkerPrompt}
|
|
300
|
+
|
|
301
|
+
${exports.safetySectionWorkerPrompt}
|
|
302
|
+
|
|
303
|
+
# VÉRIFICATION AVANT CLÔTURE (STOP si faux)
|
|
304
|
+
<verification>
|
|
305
|
+
- deliverable non vide && non JSON seul || STOP → continuer
|
|
306
|
+
- summary décrit ce qui a été trouvé ET ce qui manque || STOP → enrichir
|
|
307
|
+
- confidence reflète honnêtement les lacunes (0.0-1.0) || STOP → corriger
|
|
308
|
+
- aucune donnée inventée dans deliverable || STOP → supprimer
|
|
309
|
+
</verification>
|
|
310
|
+
|
|
311
|
+
# TRIGGERS DE SORTIE
|
|
312
|
+
Quand la mission est accomplie (ou qu'aucune piste concrète ne reste), termine avec :
|
|
313
|
+
\`[WORKER_COMPLETE]\`
|
|
314
|
+
suivi immédiatement du JSON de résultat.
|
|
315
|
+
|
|
316
|
+
Sinon, retourne uniquement ta prochaine demande à l'Agent (texte clair et actionnable, sans format imposé).
|
|
317
|
+
|
|
318
|
+
# FORMAT FINAL (uniquement quand terminé)
|
|
319
|
+
\`\`\`
|
|
320
|
+
[WORKER_COMPLETE]
|
|
321
|
+
{"deliverable": "...", "summary": "...", "confidence": 0.0}
|
|
322
|
+
\`\`\`
|
|
323
|
+
|
|
324
|
+
- \`deliverable\`: le résultat complet de la mission (texte, données, rapport...) sans compression. Suit \`<persona_result>\`.
|
|
325
|
+
- \`summary\`: ce qui est fait + ce qui manque
|
|
326
|
+
- \`confidence\`: 0.0 -> 1.0 (estimation honnête)
|
|
327
|
+
|
|
328
|
+
Si résultat partiel: l'indiquer explicitement dans \`summary\`.
|
|
329
|
+
Interdit comme sortie finale: "instruction envoyée", "à faire", ou livrable vide.
|
|
330
|
+
|
|
331
|
+
${buildCriticalBlock('[WORKER_COMPLETE]')}`;
|
|
332
|
+
}
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { AgentMessage } from "../stategraph";
|
|
2
2
|
import { AgentConfig, AgenticContext, ExecutionResult } from "../types";
|
|
3
3
|
import { RAGManagerConfig } from "../rag";
|
|
4
|
+
export declare const SIMULATOR_AGENT_NAME = "simple-simulator";
|
|
5
|
+
export declare const SIMULATOR_AGENT_DESCRIPTION = "Simulateur simple pour tests - TOUJOURS retourner JSON valide";
|
|
6
|
+
export declare const WORKER_AGENT_NAME = "worker-agent";
|
|
7
|
+
export declare const WORKER_AGENT_DESCRIPTION = "Worker collaborateur pour missions autonomes";
|
|
4
8
|
export interface SimulatorConfig {
|
|
5
9
|
agents: AgentConfig[];
|
|
6
10
|
start: string;
|
|
7
11
|
verbose: boolean;
|
|
8
|
-
|
|
12
|
+
mode?: 'simulator' | 'worker';
|
|
13
|
+
positionDescription?: string;
|
|
14
|
+
personaResult?: string;
|
|
15
|
+
workerModel?: string;
|
|
16
|
+
agentModel?: string;
|
|
9
17
|
mockCacheInitializer?: (sessionId: string) => Promise<void>;
|
|
10
18
|
ragConfig?: RAGManagerConfig;
|
|
11
19
|
}
|
|
@@ -38,6 +46,58 @@ export interface TestCaseInput {
|
|
|
38
46
|
expectedTools?: Record<string, ToolConstraint>;
|
|
39
47
|
onMessage?: (message: AgentMessage) => void;
|
|
40
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Événements lifecycle du Worker, poussés via sendFeedback(data: WorkerEvent)
|
|
51
|
+
* Discriminant : data.type permet au frontend de distinguer les steps Worker
|
|
52
|
+
*/
|
|
53
|
+
export type WorkerEvent = {
|
|
54
|
+
type: 'worker_started';
|
|
55
|
+
jobId: string;
|
|
56
|
+
maxIterations: number;
|
|
57
|
+
description?: string;
|
|
58
|
+
} | {
|
|
59
|
+
type: 'worker_iteration';
|
|
60
|
+
iteration: number;
|
|
61
|
+
maxIterations: number;
|
|
62
|
+
query: string;
|
|
63
|
+
} | {
|
|
64
|
+
type: 'worker_completed';
|
|
65
|
+
success: boolean;
|
|
66
|
+
summary: string;
|
|
67
|
+
iterations: number;
|
|
68
|
+
duration: number;
|
|
69
|
+
} | {
|
|
70
|
+
type: 'worker_failed';
|
|
71
|
+
error: string;
|
|
72
|
+
iterations: number;
|
|
73
|
+
duration: number;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Input pour worker.runJob() — parallèle à TestCaseInput
|
|
77
|
+
*/
|
|
78
|
+
export interface WorkerJobInput {
|
|
79
|
+
query: string;
|
|
80
|
+
maxIterations?: number;
|
|
81
|
+
agentContext: AgenticContext;
|
|
82
|
+
jobId?: string;
|
|
83
|
+
description?: string;
|
|
84
|
+
onMessage?: (message: AgentMessage) => void;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Résultat d'un WorkerJob — parallèle à SimulationResult
|
|
88
|
+
*/
|
|
89
|
+
export interface WorkerResult {
|
|
90
|
+
success: boolean;
|
|
91
|
+
deliverable: string;
|
|
92
|
+
summary: string;
|
|
93
|
+
confidence: number;
|
|
94
|
+
iterations: number;
|
|
95
|
+
maxIterations: number;
|
|
96
|
+
duration: number;
|
|
97
|
+
execution: ExecutionResult;
|
|
98
|
+
messages: AgentMessage[];
|
|
99
|
+
error?: string;
|
|
100
|
+
}
|
|
41
101
|
/**
|
|
42
102
|
* @deprecated Utiliser TestScenario à la place
|
|
43
103
|
*/
|
|
@@ -80,6 +140,7 @@ export interface ExecutionContext {
|
|
|
80
140
|
simulatorAgent: AgentConfig;
|
|
81
141
|
conversationHistory: string[];
|
|
82
142
|
exchangeCount: number;
|
|
143
|
+
maxTurns?: number;
|
|
83
144
|
lastExecution: ExecutionResult;
|
|
84
145
|
}
|
|
85
146
|
/** @deprecated Utiliser TestScenario avec l'API testCase() */
|
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WORKER_AGENT_DESCRIPTION = exports.WORKER_AGENT_NAME = exports.SIMULATOR_AGENT_DESCRIPTION = exports.SIMULATOR_AGENT_NAME = void 0;
|
|
4
|
+
exports.SIMULATOR_AGENT_NAME = 'simple-simulator';
|
|
5
|
+
exports.SIMULATOR_AGENT_DESCRIPTION = 'Simulateur simple pour tests - TOUJOURS retourner JSON valide';
|
|
6
|
+
exports.WORKER_AGENT_NAME = 'worker-agent';
|
|
7
|
+
exports.WORKER_AGENT_DESCRIPTION = 'Worker collaborateur pour missions autonomes';
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SubAgent — Injection et introspection des sub-agents
|
|
3
|
+
*
|
|
4
|
+
* Toutes les fonctions liées au pattern subAgent<Name> :
|
|
5
|
+
* - subAgentInjectTools() : génère les tools subAgent<Name> pour le parent
|
|
6
|
+
* - subAgentExtractCapabilities() : résumé des capacités (1ère ligne de chaque tool description)
|
|
7
|
+
* - SUBAGENT_TOOL_PARAMS : schéma paramètres par défaut (query, context, goal)
|
|
8
|
+
*
|
|
9
|
+
* Séparation parent-facing vs subAgent-facing :
|
|
10
|
+
* - Parent-facing : publicDescription + capabilities + params schema (vu par le parent LLM)
|
|
11
|
+
* - SubAgent-facing : instructions internes (graph, routage, contrat — défini côté serveur)
|
|
12
|
+
*/
|
|
13
|
+
import { AgentConfig } from '../types';
|
|
14
|
+
/**
|
|
15
|
+
* Paramètres par défaut du tool subAgent<Name>.
|
|
16
|
+
* Descriptions génériques et courtes (best practice OpenAI).
|
|
17
|
+
* Les exemples domaine sont dans publicDescription de chaque subAgent.
|
|
18
|
+
*/
|
|
19
|
+
export declare const SUBAGENT_TOOL_PARAMS: {
|
|
20
|
+
readonly query: {
|
|
21
|
+
readonly type: "string";
|
|
22
|
+
readonly description: "Question utilisateur ou intention normalisée.";
|
|
23
|
+
};
|
|
24
|
+
readonly context: {
|
|
25
|
+
readonly type: "string";
|
|
26
|
+
readonly description: "Entités pré-résolues par le parent (nom, entité, IDs). Vide si rien pré-résolu.";
|
|
27
|
+
};
|
|
28
|
+
readonly goal: {
|
|
29
|
+
readonly type: "string";
|
|
30
|
+
readonly description: "Livrable attendu — condition d'arrêt du sub-agent.";
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
export declare const SUBAGENT_REQUIRED_PARAMS: string[];
|
|
34
|
+
export type SubAgentKnowledgeFound = 'no' | 'yes' | 'partial' | 'conflict';
|
|
35
|
+
export type SubAgentOutput = {
|
|
36
|
+
status: 'ok' | 'empty' | 'error';
|
|
37
|
+
items: string[];
|
|
38
|
+
meta: {
|
|
39
|
+
resolved: string[];
|
|
40
|
+
notFound: string[];
|
|
41
|
+
knowledge_found: SubAgentKnowledgeFound;
|
|
42
|
+
};
|
|
43
|
+
control: {
|
|
44
|
+
can_retry: boolean;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
export type SubAgentCallResult = SubAgentOutput & {
|
|
48
|
+
/** Texte principal envoyé comme function_call_output au LLM */
|
|
49
|
+
content: string;
|
|
50
|
+
/** Nom du tool pour addStep dans le stateGraph */
|
|
51
|
+
name: string;
|
|
52
|
+
/** Justification transmise à sendFeedback */
|
|
53
|
+
feedback?: string;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Schéma de sortie générique des sous-agents.
|
|
57
|
+
* Les `items` sont sérialisés en chaînes JSON pour rester compatibles avec
|
|
58
|
+
* le mode `json_schema strict` tout en conservant une structure métier libre.
|
|
59
|
+
*/
|
|
60
|
+
export declare const SUBAGENT_OUTPUT_SCHEMA: {
|
|
61
|
+
readonly type: "object";
|
|
62
|
+
readonly additionalProperties: false;
|
|
63
|
+
readonly required: readonly ["status", "items", "meta", "control"];
|
|
64
|
+
readonly properties: {
|
|
65
|
+
readonly status: {
|
|
66
|
+
readonly type: "string";
|
|
67
|
+
readonly enum: readonly ["ok", "empty", "error"];
|
|
68
|
+
};
|
|
69
|
+
readonly items: {
|
|
70
|
+
readonly type: "array";
|
|
71
|
+
readonly items: {
|
|
72
|
+
readonly type: "string";
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
readonly meta: {
|
|
76
|
+
readonly type: "object";
|
|
77
|
+
readonly additionalProperties: false;
|
|
78
|
+
readonly required: readonly ["resolved", "notFound", "knowledge_found"];
|
|
79
|
+
readonly properties: {
|
|
80
|
+
readonly resolved: {
|
|
81
|
+
readonly type: "array";
|
|
82
|
+
readonly items: {
|
|
83
|
+
readonly type: "string";
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
readonly notFound: {
|
|
87
|
+
readonly type: "array";
|
|
88
|
+
readonly items: {
|
|
89
|
+
readonly type: "string";
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
readonly knowledge_found: {
|
|
93
|
+
readonly type: "string";
|
|
94
|
+
readonly enum: readonly ["no", "yes", "partial", "conflict"];
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
readonly control: {
|
|
99
|
+
readonly type: "object";
|
|
100
|
+
readonly additionalProperties: false;
|
|
101
|
+
readonly required: readonly ["can_retry"];
|
|
102
|
+
readonly properties: {
|
|
103
|
+
readonly can_retry: {
|
|
104
|
+
readonly type: "boolean";
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
export declare function parseSubAgentOutputContent(content: string): SubAgentOutput | null;
|
|
111
|
+
/**
|
|
112
|
+
* Extrait les capacités d'un agent depuis ses tools.
|
|
113
|
+
* Prend la 1ère ligne de chaque `function.description`.
|
|
114
|
+
*/
|
|
115
|
+
export declare function subAgentExtractCapabilities(agents: AgentConfig[], name: string): string;
|
|
116
|
+
/**
|
|
117
|
+
* Compose la mission envoyée au sub-agent depuis les arguments du tool.
|
|
118
|
+
* Supporte les deux formats (ancien triplet et nouveau query/context/goal).
|
|
119
|
+
*/
|
|
120
|
+
export declare function subAgentComposeMission(args: Record<string, any>): string;
|
|
121
|
+
/**
|
|
122
|
+
* Injecte un tool `subAgent<Name>` par sub-agent déclaré dans `agentDef.subAgents`.
|
|
123
|
+
*
|
|
124
|
+
* Le schéma des paramètres provient de :
|
|
125
|
+
* 1. `subAgent.subAgentToolParams` (override spécifique)
|
|
126
|
+
* 2. `SUBAGENT_TOOL_PARAMS` (défaut: query, context, goal)
|
|
127
|
+
*/
|
|
128
|
+
export declare function subAgentInjectTools(agentDefs: AgentConfig[]): AgentConfig[];
|