agentic-api 1.0.6 → 2.0.31
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 +336 -76
- 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,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Implémentation du système AgentStateGraph
|
|
4
|
+
* Classe principale pour gérer les discussions par agent
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.AgentStateGraph = void 0;
|
|
8
|
+
const crypto_1 = require("crypto");
|
|
9
|
+
const types_1 = require("./types");
|
|
10
|
+
/**
|
|
11
|
+
* Implémentation du StateGraph pour la gestion des discussions par agent
|
|
12
|
+
* Remplace AgenticMemoryManager avec une architecture simplifiée
|
|
13
|
+
*/
|
|
14
|
+
class AgentStateGraph {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.discussions = [];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Crée ou restaure une discussion pour un agent donné
|
|
20
|
+
* @param agentName Nom de l'agent
|
|
21
|
+
* @returns Discussion existante ou nouvelle discussion créée
|
|
22
|
+
*/
|
|
23
|
+
createOrRestore(agentName, description) {
|
|
24
|
+
// Chercher une discussion existante pour cet agent
|
|
25
|
+
let discussion = this.discussions.find(d => d.startAgent === agentName);
|
|
26
|
+
if (!discussion) {
|
|
27
|
+
// Créer une nouvelle discussion
|
|
28
|
+
discussion = {
|
|
29
|
+
id: (0, crypto_1.randomUUID)(),
|
|
30
|
+
description: description,
|
|
31
|
+
messages: [],
|
|
32
|
+
usage: { prompt: 0, completion: 0, total: 0, cost: 0 },
|
|
33
|
+
createdAt: new Date(),
|
|
34
|
+
updatedAt: new Date(),
|
|
35
|
+
startAgent: agentName
|
|
36
|
+
};
|
|
37
|
+
this.discussions.push(discussion);
|
|
38
|
+
}
|
|
39
|
+
return discussion;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Ajoute un message à la discussion d'un agent
|
|
43
|
+
* @param agentName Nom de l'agent
|
|
44
|
+
* @param message Message sans ID ni timestamp (auto-générés)
|
|
45
|
+
*/
|
|
46
|
+
push(agentName, message) {
|
|
47
|
+
const discussion = this.createOrRestore(agentName);
|
|
48
|
+
const fullMessage = {
|
|
49
|
+
...message,
|
|
50
|
+
id: (0, crypto_1.randomUUID)(),
|
|
51
|
+
timestamp: new Date()
|
|
52
|
+
};
|
|
53
|
+
discussion.messages.push(fullMessage);
|
|
54
|
+
discussion.updatedAt = new Date();
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Écrase le message system de la discussion avec un nouvel agent
|
|
58
|
+
* Le message system est toujours messages[0] avec role: "system"
|
|
59
|
+
* @param agentName Nom de l'agent
|
|
60
|
+
* @param content Nouveau contenu du message system
|
|
61
|
+
*/
|
|
62
|
+
set(agentName, content) {
|
|
63
|
+
const discussion = this.createOrRestore(agentName);
|
|
64
|
+
const systemMessage = {
|
|
65
|
+
id: (0, crypto_1.randomUUID)(),
|
|
66
|
+
role: 'system',
|
|
67
|
+
content,
|
|
68
|
+
agent: agentName,
|
|
69
|
+
timestamp: new Date()
|
|
70
|
+
};
|
|
71
|
+
// Écraser ou créer le message system (toujours en position 0)
|
|
72
|
+
if (discussion.messages.length === 0) {
|
|
73
|
+
discussion.messages.push(systemMessage);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
discussion.messages[0] = systemMessage;
|
|
77
|
+
}
|
|
78
|
+
discussion.updatedAt = new Date();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Additionne l'usage des tokens pour un agent
|
|
82
|
+
* @param agentName Nom de l'agent
|
|
83
|
+
* @param usage Ajout aux valeurs existantes (addition)
|
|
84
|
+
*/
|
|
85
|
+
updateTokens(agentName, usage) {
|
|
86
|
+
const discussion = this.createOrRestore(agentName);
|
|
87
|
+
// Additionner les valeurs aux existantes
|
|
88
|
+
discussion.usage = {
|
|
89
|
+
prompt: discussion.usage.prompt + (usage.prompt ?? 0),
|
|
90
|
+
completion: discussion.usage.completion + (usage.completion ?? 0),
|
|
91
|
+
total: discussion.usage.total + (usage.total ?? 0),
|
|
92
|
+
cost: discussion.usage.cost ? discussion.usage.cost + (usage.cost ?? 0) : (usage.cost ?? 0)
|
|
93
|
+
};
|
|
94
|
+
discussion.updatedAt = new Date();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Retourne une vue filtrée pour le client
|
|
98
|
+
* Supprime les messages system et les métadonnées d'outils
|
|
99
|
+
* @param agentName Nom de l'agent
|
|
100
|
+
* @returns Discussion filtrée pour l'affichage client
|
|
101
|
+
*/
|
|
102
|
+
toClientView(agentName) {
|
|
103
|
+
const discussion = this.createOrRestore(agentName);
|
|
104
|
+
const cleanContent = (content) => {
|
|
105
|
+
if (typeof content === 'string') {
|
|
106
|
+
return content.replace(/<memories[^>]+[\s\S]*?<\/memories>/g, '');
|
|
107
|
+
}
|
|
108
|
+
return content;
|
|
109
|
+
};
|
|
110
|
+
// Filtrer les messages pour le client - exclure system et tool
|
|
111
|
+
const clientMessages = discussion.messages
|
|
112
|
+
.filter(msg => msg.role !== 'system' && !msg.name)
|
|
113
|
+
.map(msg => ({
|
|
114
|
+
id: msg.id,
|
|
115
|
+
role: msg.role,
|
|
116
|
+
content: cleanContent(msg.content),
|
|
117
|
+
timestamp: msg.timestamp
|
|
118
|
+
}));
|
|
119
|
+
return {
|
|
120
|
+
id: discussion.id,
|
|
121
|
+
name: discussion.name,
|
|
122
|
+
description: discussion.description,
|
|
123
|
+
agent: agentName,
|
|
124
|
+
messages: clientMessages,
|
|
125
|
+
usage: discussion.usage,
|
|
126
|
+
createdAt: discussion.createdAt,
|
|
127
|
+
updatedAt: discussion.updatedAt
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Trouve une discussion par son ID
|
|
132
|
+
* @param discussionId ID de la discussion
|
|
133
|
+
* @returns Discussion trouvée ou undefined
|
|
134
|
+
*/
|
|
135
|
+
findDiscussionById(discussionId) {
|
|
136
|
+
return this.discussions.find(d => d.id === discussionId);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Supprime une discussion
|
|
140
|
+
* @param discussionId ID de la discussion à supprimer
|
|
141
|
+
* @returns true si supprimée, false si non trouvée
|
|
142
|
+
*/
|
|
143
|
+
deleteDiscussion(discussionId) {
|
|
144
|
+
const index = this.discussions.findIndex(d => d.id === discussionId);
|
|
145
|
+
if (index >= 0) {
|
|
146
|
+
this.discussions.splice(index, 1);
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Vide une discussion en gardant uniquement le message system
|
|
153
|
+
* @param agentName Nom de l'agent
|
|
154
|
+
*/
|
|
155
|
+
clearDiscussion(agentName) {
|
|
156
|
+
const discussion = this.createOrRestore(agentName);
|
|
157
|
+
// Garder uniquement le premier message s'il est de type system
|
|
158
|
+
if (discussion.messages.length > 0 && discussion.messages[0].role === 'system') {
|
|
159
|
+
discussion.messages = [discussion.messages[0]];
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
discussion.messages = [];
|
|
163
|
+
}
|
|
164
|
+
// Réinitialiser l'usage
|
|
165
|
+
discussion.usage = { prompt: 0, completion: 0, total: 0, cost: 0 };
|
|
166
|
+
discussion.updatedAt = new Date();
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Supprime un message spécifique d'une discussion
|
|
170
|
+
* @param agentName Nom de l'agent
|
|
171
|
+
* @param messageId ID du message à supprimer
|
|
172
|
+
* @returns true si le message a été supprimé, false s'il n'a pas été trouvé
|
|
173
|
+
*/
|
|
174
|
+
deleteMessage(agentName, messageId) {
|
|
175
|
+
const discussion = this.createOrRestore(agentName);
|
|
176
|
+
// Trouver l'index du message à supprimer
|
|
177
|
+
const messageIndex = discussion.messages.findIndex(msg => msg.id === messageId);
|
|
178
|
+
if (messageIndex !== -1) {
|
|
179
|
+
// Supprimer le message
|
|
180
|
+
discussion.messages.splice(messageIndex, 1);
|
|
181
|
+
discussion.updatedAt = new Date();
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Renomme une discussion
|
|
188
|
+
* @param discussionId ID de la discussion
|
|
189
|
+
* @param name Nouveau nom
|
|
190
|
+
* @param description Nouvelle description (optionnel)
|
|
191
|
+
*/
|
|
192
|
+
renameDiscussion(discussionId, name, description) {
|
|
193
|
+
const discussion = this.findDiscussionById(discussionId);
|
|
194
|
+
if (discussion) {
|
|
195
|
+
discussion.name = name;
|
|
196
|
+
if (description !== undefined) {
|
|
197
|
+
discussion.description = description;
|
|
198
|
+
}
|
|
199
|
+
discussion.updatedAt = new Date();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Retourne l'agent spécialisé pour une discussion
|
|
204
|
+
* @param agentName Nom de l'agent
|
|
205
|
+
* @returns Nom de l'agent spécialisé
|
|
206
|
+
*/
|
|
207
|
+
getSpecializedAgent(agentName) {
|
|
208
|
+
const discussion = this.discussions.find(d => d.startAgent === agentName);
|
|
209
|
+
if (discussion) {
|
|
210
|
+
return (0, types_1.getSpecializedAgent)(discussion);
|
|
211
|
+
}
|
|
212
|
+
return agentName;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Sérialise le StateGraph en JSON
|
|
216
|
+
* @returns Représentation JSON
|
|
217
|
+
*/
|
|
218
|
+
toJSON() {
|
|
219
|
+
return {
|
|
220
|
+
discussions: this.discussions
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Restaure le StateGraph depuis JSON
|
|
225
|
+
* @param data Données JSON
|
|
226
|
+
*/
|
|
227
|
+
fromJSON(data) {
|
|
228
|
+
if (data.discussions && Array.isArray(data.discussions)) {
|
|
229
|
+
this.discussions = data.discussions.map((d) => ({
|
|
230
|
+
...d,
|
|
231
|
+
createdAt: new Date(d.createdAt),
|
|
232
|
+
updatedAt: new Date(d.updatedAt),
|
|
233
|
+
messages: d.messages.map((m) => ({
|
|
234
|
+
...m,
|
|
235
|
+
timestamp: new Date(m.timestamp)
|
|
236
|
+
}))
|
|
237
|
+
}));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
exports.AgentStateGraph = AgentStateGraph;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Gestion du stockage et de la persistance pour AgentStateGraph
|
|
3
|
+
* Intégration avec req.session avec compression gzip pour optimiser la taille
|
|
4
|
+
*/
|
|
5
|
+
import { AgentStateGraph } from './stategraph';
|
|
6
|
+
import { AgenticContext } from '../types';
|
|
7
|
+
/**
|
|
8
|
+
* Récupère le StateGraph depuis la session avec décompression
|
|
9
|
+
* @param context qui contient la session requête Express OU objet avec session pour les tests
|
|
10
|
+
* @returns StateGraph existant ou nouveau
|
|
11
|
+
*/
|
|
12
|
+
export declare function sessionStateGraphGet(context: AgenticContext): AgentStateGraph;
|
|
13
|
+
/**
|
|
14
|
+
* Sauvegarde le StateGraph dans la session avec compression
|
|
15
|
+
* @param req Requête Express avec session OU objet avec session pour les tests
|
|
16
|
+
* @param stateGraph StateGraph à sauvegarder
|
|
17
|
+
*/
|
|
18
|
+
export declare function sessionStateGraphSet(context: AgenticContext, stateGraph: AgentStateGraph): void;
|
|
19
|
+
/**
|
|
20
|
+
* Supprime le StateGraph de la session
|
|
21
|
+
* @param context AgenticContext qui contient la session
|
|
22
|
+
*/
|
|
23
|
+
export declare function sessionStateGraphClear(context: AgenticContext): void;
|
|
24
|
+
/**
|
|
25
|
+
* Vérifie si un StateGraph existe dans la session
|
|
26
|
+
* @param context AgenticContext qui contient la session
|
|
27
|
+
* @returns true si un StateGraph existe
|
|
28
|
+
*/
|
|
29
|
+
export declare function sessionStateGraphExists(context: AgenticContext): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Obtient la taille du StateGraph en session (en bytes)
|
|
32
|
+
* @param context AgenticContext qui contient la session
|
|
33
|
+
* @returns Taille en bytes ou 0 si pas de StateGraph
|
|
34
|
+
*/
|
|
35
|
+
export declare function sessionStateGraphSize(context: AgenticContext): number;
|
|
36
|
+
/**
|
|
37
|
+
* Convertit req.session.memory vers AgentStateGraph
|
|
38
|
+
* @param context AgenticContext qui contient la session
|
|
39
|
+
* @returns true si migration effectuée
|
|
40
|
+
*/
|
|
41
|
+
export declare function migrateFromLegacySession(context: AgenticContext): boolean;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Gestion du stockage et de la persistance pour AgentStateGraph
|
|
4
|
+
* Intégration avec req.session avec compression gzip pour optimiser la taille
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.sessionStateGraphGet = sessionStateGraphGet;
|
|
8
|
+
exports.sessionStateGraphSet = sessionStateGraphSet;
|
|
9
|
+
exports.sessionStateGraphClear = sessionStateGraphClear;
|
|
10
|
+
exports.sessionStateGraphExists = sessionStateGraphExists;
|
|
11
|
+
exports.sessionStateGraphSize = sessionStateGraphSize;
|
|
12
|
+
exports.migrateFromLegacySession = migrateFromLegacySession;
|
|
13
|
+
const zlib_1 = require("zlib");
|
|
14
|
+
const stategraph_1 = require("./stategraph");
|
|
15
|
+
/**
|
|
16
|
+
* Clé utilisée pour stocker le StateGraph dans req.session
|
|
17
|
+
*/
|
|
18
|
+
const SESSION_STATEGRAPH_KEY = 'agentStateGraph';
|
|
19
|
+
/**
|
|
20
|
+
* Récupère le StateGraph depuis la session avec décompression
|
|
21
|
+
* @param context qui contient la session requête Express OU objet avec session pour les tests
|
|
22
|
+
* @returns StateGraph existant ou nouveau
|
|
23
|
+
*/
|
|
24
|
+
function sessionStateGraphGet(context) {
|
|
25
|
+
const session = context.session;
|
|
26
|
+
if (!session) {
|
|
27
|
+
// Pour les tests, retourner un nouveau StateGraph si pas de session
|
|
28
|
+
if (process.env.NODE_ENV === 'test') {
|
|
29
|
+
return new stategraph_1.AgentStateGraph();
|
|
30
|
+
}
|
|
31
|
+
throw new Error('Session middleware non configuré');
|
|
32
|
+
}
|
|
33
|
+
// Vérifier si un StateGraph existe dans la session
|
|
34
|
+
const compressedData = session[SESSION_STATEGRAPH_KEY];
|
|
35
|
+
if (compressedData) {
|
|
36
|
+
try {
|
|
37
|
+
// Décompresser et parser le JSON
|
|
38
|
+
const jsonData = (0, zlib_1.gunzipSync)(Buffer.from(compressedData, 'base64')).toString('utf8');
|
|
39
|
+
const data = JSON.parse(jsonData);
|
|
40
|
+
// Créer un nouveau StateGraph et le restaurer
|
|
41
|
+
const stateGraph = new stategraph_1.AgentStateGraph();
|
|
42
|
+
stateGraph.fromJSON(data);
|
|
43
|
+
return stateGraph;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.warn('Erreur lors de la restauration du StateGraph:', error);
|
|
47
|
+
// En cas d'erreur, retourner un nouveau StateGraph
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Retourner un nouveau StateGraph si rien en session
|
|
51
|
+
return new stategraph_1.AgentStateGraph();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Sauvegarde le StateGraph dans la session avec compression
|
|
55
|
+
* @param req Requête Express avec session OU objet avec session pour les tests
|
|
56
|
+
* @param stateGraph StateGraph à sauvegarder
|
|
57
|
+
*/
|
|
58
|
+
function sessionStateGraphSet(context, stateGraph) {
|
|
59
|
+
const session = context.session;
|
|
60
|
+
if (!session) {
|
|
61
|
+
// Pour les tests, ne rien faire si pas de session
|
|
62
|
+
if (process.env.NODE_ENV === 'test') {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
throw new Error('Session middleware non configuré');
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
// Sérialiser en JSON
|
|
69
|
+
const jsonData = JSON.stringify(stateGraph.toJSON());
|
|
70
|
+
// Compresser avec gzip
|
|
71
|
+
const compressed = (0, zlib_1.gzipSync)(Buffer.from(jsonData, 'utf8'));
|
|
72
|
+
// Stocker en base64 dans la session
|
|
73
|
+
session[SESSION_STATEGRAPH_KEY] = compressed.toString('base64');
|
|
74
|
+
// Logging pour debug (taille avant/après compression)
|
|
75
|
+
if (process.env.NODE_ENV === 'development') {
|
|
76
|
+
const originalSize = Buffer.byteLength(jsonData, 'utf8');
|
|
77
|
+
const compressedSize = compressed.length;
|
|
78
|
+
const ratio = Math.round((1 - compressedSize / originalSize) * 100);
|
|
79
|
+
console.log(`🗜️ StateGraph sauvegardé: ${originalSize}B → ${compressedSize}B (${ratio}% compression)`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.error('Erreur lors de la sauvegarde du StateGraph:', error);
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Supprime le StateGraph de la session
|
|
89
|
+
* @param context AgenticContext qui contient la session
|
|
90
|
+
*/
|
|
91
|
+
function sessionStateGraphClear(context) {
|
|
92
|
+
const session = context.session;
|
|
93
|
+
if (session && session[SESSION_STATEGRAPH_KEY]) {
|
|
94
|
+
delete session[SESSION_STATEGRAPH_KEY];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Vérifie si un StateGraph existe dans la session
|
|
99
|
+
* @param context AgenticContext qui contient la session
|
|
100
|
+
* @returns true si un StateGraph existe
|
|
101
|
+
*/
|
|
102
|
+
function sessionStateGraphExists(context) {
|
|
103
|
+
const session = context.session;
|
|
104
|
+
return session && !!session[SESSION_STATEGRAPH_KEY];
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Obtient la taille du StateGraph en session (en bytes)
|
|
108
|
+
* @param context AgenticContext qui contient la session
|
|
109
|
+
* @returns Taille en bytes ou 0 si pas de StateGraph
|
|
110
|
+
*/
|
|
111
|
+
function sessionStateGraphSize(context) {
|
|
112
|
+
const session = context.session;
|
|
113
|
+
if (!session || !session[SESSION_STATEGRAPH_KEY]) {
|
|
114
|
+
return 0;
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
const compressedData = session[SESSION_STATEGRAPH_KEY];
|
|
118
|
+
return Buffer.from(compressedData, 'base64').length;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error('Erreur lors du calcul de la taille StateGraph:', error);
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Convertit req.session.memory vers AgentStateGraph
|
|
127
|
+
* @param context AgenticContext qui contient la session
|
|
128
|
+
* @returns true si migration effectuée
|
|
129
|
+
*/
|
|
130
|
+
function migrateFromLegacySession(context) {
|
|
131
|
+
const session = context.session;
|
|
132
|
+
if (!session || !session.memory || sessionStateGraphExists(context)) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
const legacyMemory = session.memory;
|
|
137
|
+
const stateGraph = new stategraph_1.AgentStateGraph();
|
|
138
|
+
// Créer une discussion depuis l'ancienne mémoire
|
|
139
|
+
if (legacyMemory.messages && Array.isArray(legacyMemory.messages)) {
|
|
140
|
+
const agentName = legacyMemory.currentAgent || 'default';
|
|
141
|
+
const discussion = stateGraph.createOrRestore(agentName);
|
|
142
|
+
// Migrer les messages
|
|
143
|
+
legacyMemory.messages.forEach((msg, index) => {
|
|
144
|
+
stateGraph.push(agentName, {
|
|
145
|
+
role: msg.role || 'user',
|
|
146
|
+
content: msg.content || '',
|
|
147
|
+
agent: msg.agent || agentName
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
// Migrer l'usage
|
|
151
|
+
if (legacyMemory.usage) {
|
|
152
|
+
stateGraph.updateTokens(agentName, legacyMemory.usage);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Sauvegarder le nouveau format
|
|
156
|
+
sessionStateGraphSet(context, stateGraph);
|
|
157
|
+
// Supprimer l'ancienne mémoire
|
|
158
|
+
delete session.memory;
|
|
159
|
+
console.log('✅ Migration réussie de session.memory vers AgentStateGraph');
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
console.error('❌ Erreur lors de la migration:', error);
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Types pour le système AgentStateGraph
|
|
3
|
+
* Remplace l'ancien système AgenticMemoryManager pour une gestion simplifiée des discussions par agent
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Message d'agent dans une discussion
|
|
7
|
+
* Compatible avec le format OpenAI Chat Completions
|
|
8
|
+
*/
|
|
9
|
+
export interface AgentMessage {
|
|
10
|
+
/** Identifiant unique du message */
|
|
11
|
+
id: string;
|
|
12
|
+
/** Rôle du message (system, user, assistant, tool) */
|
|
13
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
14
|
+
/** Contenu textuel du message */
|
|
15
|
+
content: string;
|
|
16
|
+
/** Nom de l'agent ou de l'outil (compatible OpenAI) */
|
|
17
|
+
name?: string;
|
|
18
|
+
/** Agent associé à ce message (optionnel) */
|
|
19
|
+
agent?: string;
|
|
20
|
+
/** Timestamp de création */
|
|
21
|
+
timestamp: Date;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Usage des tokens et coût
|
|
25
|
+
*/
|
|
26
|
+
export interface TokenUsage {
|
|
27
|
+
/** Tokens de prompt */
|
|
28
|
+
prompt: number;
|
|
29
|
+
/** Tokens de complétion */
|
|
30
|
+
completion: number;
|
|
31
|
+
/** Total des tokens */
|
|
32
|
+
total: number;
|
|
33
|
+
/** Coût estimé en USD (optionnel) */
|
|
34
|
+
cost?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Discussion d'agent - thread de messages pour un agent spécifique
|
|
38
|
+
* Remplace l'ancienne AgenticMemorySession
|
|
39
|
+
*/
|
|
40
|
+
export interface AgentDiscussion {
|
|
41
|
+
/** Identifiant unique de la discussion */
|
|
42
|
+
id: string;
|
|
43
|
+
/** Nom descriptif (optionnel) */
|
|
44
|
+
name?: string;
|
|
45
|
+
/** Description de la discussion (optionnel) */
|
|
46
|
+
description?: string;
|
|
47
|
+
/** Messages de la discussion */
|
|
48
|
+
messages: AgentMessage[];
|
|
49
|
+
/** Usage des tokens pour cette discussion */
|
|
50
|
+
usage: TokenUsage;
|
|
51
|
+
/** Date de création */
|
|
52
|
+
createdAt: Date;
|
|
53
|
+
/** Date de dernière mise à jour */
|
|
54
|
+
updatedAt: Date;
|
|
55
|
+
/** Agent qui a initié cette discussion (requis) */
|
|
56
|
+
startAgent: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Interface principale du StateGraph pour gérer les discussions par agent
|
|
60
|
+
* Remplace AgenticMemoryManager avec une API simplifiée
|
|
61
|
+
*/
|
|
62
|
+
export interface AgentStateGraph {
|
|
63
|
+
/** Liste des discussions par agent */
|
|
64
|
+
discussions: AgentDiscussion[];
|
|
65
|
+
/**
|
|
66
|
+
* Crée ou restaure une discussion pour un agent
|
|
67
|
+
* @param agentName Nom de l'agent
|
|
68
|
+
* @returns Discussion existante ou nouvelle
|
|
69
|
+
*/
|
|
70
|
+
createOrRestore(agentName: string): AgentDiscussion;
|
|
71
|
+
/**
|
|
72
|
+
* Ajoute un message à la discussion d'un agent
|
|
73
|
+
* @param agentName Nom de l'agent
|
|
74
|
+
* @param message Message sans ID ni timestamp (auto-générés)
|
|
75
|
+
*/
|
|
76
|
+
push(agentName: string, message: Omit<AgentMessage, 'id' | 'timestamp'>): void;
|
|
77
|
+
/**
|
|
78
|
+
* Écrase le message system de la discussion avec un nouvel agent
|
|
79
|
+
* @param agentName Nom de l'agent
|
|
80
|
+
* @param content Nouveau contenu du message system
|
|
81
|
+
*/
|
|
82
|
+
set(agentName: string, content: string): void;
|
|
83
|
+
/**
|
|
84
|
+
* Additionne l'usage des tokens pour un agent
|
|
85
|
+
* @param agentName Nom de l'agent
|
|
86
|
+
* @param usage Ajout aux valeurs existantes (addition)
|
|
87
|
+
*/
|
|
88
|
+
updateTokens(agentName: string, usage: Partial<TokenUsage>): void;
|
|
89
|
+
/**
|
|
90
|
+
* Retourne une vue filtrée pour le client (sans system messages, sans metadata tools)
|
|
91
|
+
* @param agentName Nom de l'agent
|
|
92
|
+
* @returns Discussion filtrée pour l'affichage client
|
|
93
|
+
*/
|
|
94
|
+
toClientView(agentName: string): ClientDiscussion;
|
|
95
|
+
/**
|
|
96
|
+
* Vide une discussion en gardant uniquement le message system
|
|
97
|
+
* @param agentName Nom de l'agent
|
|
98
|
+
*/
|
|
99
|
+
clearDiscussion(agentName: string): void;
|
|
100
|
+
/**
|
|
101
|
+
* Supprime un message spécifique d'une discussion
|
|
102
|
+
* @param agentName Nom de l'agent
|
|
103
|
+
* @param messageId ID du message à supprimer
|
|
104
|
+
* @returns true si le message a été supprimé, false s'il n'a pas été trouvé
|
|
105
|
+
*/
|
|
106
|
+
deleteMessage(agentName: string, messageId: string): boolean;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Vue client d'une discussion (filtrée)
|
|
110
|
+
*/
|
|
111
|
+
export interface ClientDiscussion {
|
|
112
|
+
/** Identifiant de la discussion */
|
|
113
|
+
id: string;
|
|
114
|
+
/** Nom de la discussion */
|
|
115
|
+
name?: string;
|
|
116
|
+
/** Description */
|
|
117
|
+
description?: string;
|
|
118
|
+
/** Agent associé à cette discussion */
|
|
119
|
+
agent?: string;
|
|
120
|
+
/** Messages filtrés (sans system, sans metadata) */
|
|
121
|
+
messages: Array<{
|
|
122
|
+
id: string;
|
|
123
|
+
role: 'user' | 'assistant';
|
|
124
|
+
content: string;
|
|
125
|
+
timestamp: Date;
|
|
126
|
+
}>;
|
|
127
|
+
/** Usage des tokens */
|
|
128
|
+
usage: TokenUsage;
|
|
129
|
+
/** Dates */
|
|
130
|
+
createdAt: Date;
|
|
131
|
+
updatedAt: Date;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Retourne l'agent spécialisé d'une discussion
|
|
135
|
+
* Récupère l'agent depuis messages[0].agent ou utilise startAgent comme fallback
|
|
136
|
+
* @param discussion Discussion à analyser
|
|
137
|
+
* @returns Nom de l'agent spécialisé
|
|
138
|
+
*/
|
|
139
|
+
export declare function getSpecializedAgent(discussion: AgentDiscussion): string;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Types pour le système AgentStateGraph
|
|
4
|
+
* Remplace l'ancien système AgenticMemoryManager pour une gestion simplifiée des discussions par agent
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getSpecializedAgent = getSpecializedAgent;
|
|
8
|
+
/**
|
|
9
|
+
* Retourne l'agent spécialisé d'une discussion
|
|
10
|
+
* Récupère l'agent depuis messages[0].agent ou utilise startAgent comme fallback
|
|
11
|
+
* @param discussion Discussion à analyser
|
|
12
|
+
* @returns Nom de l'agent spécialisé
|
|
13
|
+
*/
|
|
14
|
+
function getSpecializedAgent(discussion) {
|
|
15
|
+
if (discussion && discussion.messages.length > 0 && discussion.messages[0].agent) {
|
|
16
|
+
return discussion.messages[0].agent;
|
|
17
|
+
}
|
|
18
|
+
return discussion.startAgent;
|
|
19
|
+
}
|