@ai.ntellect/core 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/.mocharc.json +1 -1
  2. package/README.md +311 -272
  3. package/dist/graph/controller.js +63 -0
  4. package/dist/graph/engine.js +563 -0
  5. package/dist/index.js +6 -6
  6. package/dist/memory/adapters/meilisearch/index.js +249 -0
  7. package/dist/memory/adapters/redis/index.js +96 -0
  8. package/dist/memory/index.js +9 -0
  9. package/dist/services/agenda.js +115 -0
  10. package/dist/services/embedding.js +40 -0
  11. package/dist/services/queue.js +99 -103
  12. package/dist/test/graph/controller.test.js +170 -0
  13. package/dist/test/graph/engine.test.js +465 -0
  14. package/dist/test/memory/adapters/meilisearch.test.js +250 -0
  15. package/dist/test/memory/adapters/redis.test.js +143 -0
  16. package/dist/test/memory/base.test.js +209 -0
  17. package/dist/test/services/agenda.test.js +230 -0
  18. package/dist/test/services/queue.test.js +258 -0
  19. package/dist/types/index.js +2 -0
  20. package/dist/utils/generate-object.js +32 -11
  21. package/dist/utils/inject-actions.js +2 -2
  22. package/dist/utils/queue-item-transformer.js +2 -2
  23. package/dist/utils/state-manager.js +20 -0
  24. package/graph/controller.ts +60 -0
  25. package/graph/engine.ts +709 -0
  26. package/index.ts +7 -7
  27. package/interfaces/index.ts +119 -0
  28. package/memory/adapters/meilisearch/index.ts +286 -0
  29. package/memory/adapters/redis/index.ts +103 -0
  30. package/memory/index.ts +22 -0
  31. package/package.json +9 -2
  32. package/services/agenda.ts +118 -0
  33. package/services/embedding.ts +26 -0
  34. package/services/queue.ts +5 -32
  35. package/test/.env.test +4 -0
  36. package/test/graph/controller.test.ts +186 -0
  37. package/test/graph/engine.test.ts +563 -0
  38. package/test/memory/adapters/meilisearch.test.ts +297 -0
  39. package/test/memory/adapters/redis.test.ts +160 -0
  40. package/test/memory/base.test.ts +229 -0
  41. package/test/services/agenda.test.ts +280 -0
  42. package/test/services/queue.test.ts +286 -44
  43. package/tsconfig.json +10 -9
  44. package/types/index.ts +270 -0
  45. package/utils/generate-object.js +111 -0
  46. package/utils/generate-object.ts +24 -12
  47. package/utils/header-builder.js +34 -0
  48. package/utils/inject-actions.js +16 -0
  49. package/utils/inject-actions.ts +3 -3
  50. package/utils/queue-item-transformer.js +24 -0
  51. package/utils/queue-item-transformer.ts +8 -11
  52. package/utils/sanitize-results.js +60 -0
  53. package/utils/schema-generator.js +46 -0
  54. package/utils/state-manager.js +20 -0
  55. package/utils/state-manager.ts +30 -0
  56. package/.nvmrc +0 -1
  57. package/README.FR.md +0 -365
  58. package/agent/index.ts +0 -244
  59. package/agent/tools/get-rss.ts +0 -64
  60. package/bull.ts +0 -5
  61. package/dist/agent/index.d.ts +0 -38
  62. package/dist/agent/index.js +0 -143
  63. package/dist/agent/tools/get-rss.d.ts +0 -16
  64. package/dist/agent/tools/get-rss.js +0 -62
  65. package/dist/bull.d.ts +0 -1
  66. package/dist/bull.js +0 -9
  67. package/dist/examples/index.d.ts +0 -2
  68. package/dist/examples/index.js +0 -89
  69. package/dist/index.d.ts +0 -7
  70. package/dist/llm/interpreter/context.d.ts +0 -15
  71. package/dist/llm/interpreter/context.js +0 -89
  72. package/dist/llm/interpreter/index.d.ts +0 -21
  73. package/dist/llm/interpreter/index.js +0 -87
  74. package/dist/llm/memory-manager/context.d.ts +0 -2
  75. package/dist/llm/memory-manager/context.js +0 -22
  76. package/dist/llm/memory-manager/index.d.ts +0 -17
  77. package/dist/llm/memory-manager/index.js +0 -107
  78. package/dist/llm/orchestrator/context.d.ts +0 -2
  79. package/dist/llm/orchestrator/context.js +0 -23
  80. package/dist/llm/orchestrator/index.d.ts +0 -44
  81. package/dist/llm/orchestrator/index.js +0 -139
  82. package/dist/llm/orchestrator/types.d.ts +0 -12
  83. package/dist/memory/cache.d.ts +0 -22
  84. package/dist/memory/cache.js +0 -165
  85. package/dist/memory/persistent.d.ts +0 -57
  86. package/dist/memory/persistent.js +0 -189
  87. package/dist/services/queue.d.ts +0 -13
  88. package/dist/services/redis-cache.d.ts +0 -37
  89. package/dist/services/redis-cache.js +0 -93
  90. package/dist/services/scheduler.d.ts +0 -40
  91. package/dist/services/scheduler.js +0 -99
  92. package/dist/services/telegram-monitor.d.ts +0 -0
  93. package/dist/services/telegram-monitor.js +0 -118
  94. package/dist/t.d.ts +0 -46
  95. package/dist/t.js +0 -102
  96. package/dist/test.d.ts +0 -0
  97. package/dist/test.js +0 -438
  98. package/dist/types.d.ts +0 -258
  99. package/dist/types.js +0 -22
  100. package/dist/utils/generate-object.d.ts +0 -12
  101. package/dist/utils/header-builder.d.ts +0 -11
  102. package/dist/utils/inject-actions.d.ts +0 -2
  103. package/dist/utils/queue-item-transformer.d.ts +0 -7
  104. package/dist/utils/sanitize-results.d.ts +0 -17
  105. package/dist/utils/schema-generator.d.ts +0 -16
  106. package/examples/index.ts +0 -103
  107. package/llm/interpreter/context.ts +0 -101
  108. package/llm/interpreter/index.ts +0 -136
  109. package/llm/memory-manager/context.ts +0 -21
  110. package/llm/memory-manager/index.ts +0 -163
  111. package/llm/orchestrator/context.ts +0 -22
  112. package/llm/orchestrator/index.ts +0 -232
  113. package/llm/orchestrator/types.ts +0 -14
  114. package/memory/cache.ts +0 -221
  115. package/memory/persistent.ts +0 -265
  116. package/services/redis-cache.ts +0 -128
  117. package/services/scheduler.ts +0 -128
  118. package/services/telegram-monitor.ts +0 -138
  119. package/t.py +0 -79
  120. package/t.spec +0 -38
  121. package/t.ts +0 -133
  122. package/test/llm/orchestrator.test.ts +0 -47
  123. package/test/llm/synthesizer.test.ts +0 -31
  124. package/types.ts +0 -288
  125. /package/dist/{llm/orchestrator/types.js → interfaces/index.js} +0 -0
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StateManager = void 0;
4
+ class StateManager {
5
+ /**
6
+ * Updates the shared state while preserving immutability
7
+ * @param currentState Current shared state
8
+ * @param updates Partial updates to apply
9
+ * @returns Updated shared state
10
+ */
11
+ static updateState(state, updates) {
12
+ return Object.assign(Object.assign({}, state), { context: Object.assign(Object.assign({}, (state.context || {})), updates) });
13
+ }
14
+ static createUpdate(updates) {
15
+ return {
16
+ context: Object.assign({}, updates),
17
+ };
18
+ }
19
+ }
20
+ exports.StateManager = StateManager;
@@ -0,0 +1,30 @@
1
+ import { SharedState } from "../types";
2
+
3
+ export class StateManager {
4
+ /**
5
+ * Updates the shared state while preserving immutability
6
+ * @param currentState Current shared state
7
+ * @param updates Partial updates to apply
8
+ * @returns Updated shared state
9
+ */
10
+ static updateState<T>(
11
+ state: SharedState<T>,
12
+ updates: Partial<T>
13
+ ): SharedState<T> {
14
+ return {
15
+ ...state,
16
+ context: {
17
+ ...(state.context || {}),
18
+ ...updates,
19
+ },
20
+ };
21
+ }
22
+
23
+ static createUpdate<T>(updates: Partial<T>) {
24
+ return {
25
+ context: {
26
+ ...updates,
27
+ },
28
+ };
29
+ }
30
+ }
package/.nvmrc DELETED
@@ -1 +0,0 @@
1
- v22.0.0
package/README.FR.md DELETED
@@ -1,365 +0,0 @@
1
- # AI.ntellect Core Framework
2
-
3
- ## Vue d'ensemble
4
-
5
- Ce framework est conçu pour exécuter des workflows complexes à l'aide d'une orchestration avancée, de la gestion de mémoire et d'une intelligence exploitable. Il intègre des outils, des interpréteurs et des systèmes de mémoire pour :
6
-
7
- - Analyser les entrƩes utilisateur dans leur contexte.
8
- - ExƩcuter des workflows prƩdƩfinis et des actions dynamiques.
9
- - GƩrer efficacement la mƩmoire Ơ court et Ơ long terme.
10
- - Permettre une intƩgration fluide avec des API et outils externes.
11
-
12
- ---
13
-
14
- ## Table des matiĆØres
15
-
16
- 1. [Composants d'architecture](#composants-darchitecture)
17
- - [Runtime de l'agent](#runtime-de-lagent)
18
- - [Orchestrateur](#orchestrateur)
19
- - [Gestionnaire de file d'attente](#gestionnaire-de-file-dattente)
20
- - [InterprƩteur](#interprƩteur)
21
- - [Système de mémoire](#système-de-mémoire)
22
- - [Listeners](#listeners)
23
- - [Schedulers](#schedulers)
24
- 2. [DƩfinir et exƩcuter des actions](#dƩfinir-et-exƩcuter-des-actions)
25
- 3. [Gestion de l'Ʃtat et rƩcursivitƩ](#gestion-de-letat-et-recursivitƩ)
26
- 4. [Installation et configuration](#installation-et-configuration)
27
- 5. [Exemple d'utilisation](#exemple-dutilisation)
28
- 6. [Travaux en cours (WIP)](#travaux-en-cours-wip)
29
-
30
- ---
31
-
32
- ## Composants d'architecture
33
-
34
- ### Runtime de l'agent
35
-
36
- Le `AgentRuntime` est le moteur principal qui coordonne le workflow global. Il connecte tous les composants et garantit que les tâches sont exécutées efficacement.
37
-
38
- **ResponsabilitƩs :**
39
-
40
- - Construire un contexte pour l'état actuel à l'aide des systèmes de mémoire (RAG et CAG).
41
- - Orchestrer les actions Ć  l'aide du gestionnaire de file d'attente.
42
- - Exploiter les interprƩteurs pour analyser les rƩsultats et gƩnƩrer des rƩponses.
43
-
44
- #### Construction du contexte
45
-
46
- La mƩthode `buildContext` crƩe un contexte complet en :
47
-
48
- 1. Ajoutant les outils et les demandes utilisateur.
49
- 2. RƩcupƩrant les actions rƩcentes via la mƩmoire cache (CAG).
50
- 3. Cherchant les connaissances pertinentes dans la mƩmoire persistante (RAG).
51
- 4. Incluant les interprƩteurs disponibles pour la demande.
52
-
53
- #### Traitement des workflows
54
-
55
- La mƩthode `process` :
56
-
57
- 1. Génère des réponses basées sur le contexte à l'aide d'un modèle de langage.
58
- 2. Gère les workflows récursifs pour l'exécution des actions.
59
- 3. SƩlectionne les interprƩteurs appropriƩs pour analyser les rƩsultats.
60
-
61
- ---
62
-
63
- ### Orchestrateur
64
-
65
- L'**orchestrateur** dirige les workflows en analysant les entrées utilisateur et en planifiant les actions. Il interagit avec les outils, les systèmes de mémoire et les interpréteurs pour garantir une exécution logique.
66
-
67
- **CaractƩristiques clƩs :**
68
-
69
- - SƩlection dynamique des actions en fonction du contexte.
70
- - Gestion des interactions mƩmoire pour les opƩrations RAG et CAG.
71
- - Gestion des workflows multi-Ʃtapes avec affinage itƩratif.
72
-
73
- ---
74
-
75
- ### Gestionnaire de file d'attente
76
-
77
- Le **gestionnaire de file d'attente** est chargé d'organiser et d'exécuter les actions dans le bon ordre, qu'elles soient séquentielles ou parallèles. Il agit comme le mécanisme central pour gérer les workflows, en s'assurant que chaque action est correctement mise en file d'attente, validée et exécutée.
78
-
79
- **ResponsabilitƩs principales :**
80
-
81
- 1. **Mise en file d'attente des actions :**
82
-
83
- - Les actions sont ajoutƩes Ơ une file pour exƩcution, individuellement ou en lot.
84
- - Prise en charge des journaux pour le dƩbogage et la traƧabilitƩ.
85
-
86
- 2. **Traitement des actions :**
87
-
88
- - ExƩcute les actions en maintenant le bon ordre.
89
- - Respecte les dƩpendances entre les actions.
90
- - GĆØre les erreurs ou confirmations via des rappels.
91
-
92
- 3. **Gestion des confirmations :**
93
- - Prend en charge les invites de confirmation pour les actions critiques.
94
- - S'appuie sur des rappels pour dƩcider de poursuivre des actions spƩcifiques.
95
-
96
- **Exemple :**
97
-
98
- ```typescript
99
- import { ActionQueueManager } from "@ai-ntellect/core";
100
- import { actions, callbacks } from "@ai-ntellect/core/examples";
101
-
102
- const queueManager = new ActionQueueManager(actions, callbacks);
103
- queueManager.addToQueue([{ name: "fetch-data", parameters: [...] }]);
104
- const results = await queueManager.processQueue();
105
- console.log("RƩsultats :", results);
106
- ```
107
-
108
- ---
109
-
110
- ### InterprƩteur
111
-
112
- L'**interpréteur** se spécialise dans l'analyse des résultats et la génération d'informations spécifiques à un domaine. Chaque interpréteur est adapté à un cas d'utilisation particulier et utilise sa propre configuration de caractère.
113
-
114
- **Exemples :**
115
-
116
- 1. **MarketInterpreter** : Analyse des données financières de marché.
117
- 2. **SecurityInterpreter** : VƩrification de la sƩcuritƩ.
118
- 3. **GeneralInterpreter** : Traitement des demandes gƩnƩrales.
119
-
120
- #### Workflow d'interprƩtation
121
-
122
- 1. Construit un contexte avec l'Ʃtat actuel, y compris les rƩsultats et les demandes utilisateur.
123
- 2. Utilise le modèle de langage pour générer des informations exploitables.
124
- 3. Fournit des rƩponses dƩtaillƩes pour l'utilisateur final.
125
-
126
- ---
127
-
128
- ### Système de mémoire
129
-
130
- L'architecture mƩmoire combine une mƩmoire Ơ court terme et une mƩmoire Ơ long terme pour fournir un traitement contextuel.
131
-
132
- #### Types de mƩmoire
133
-
134
- 1. **MƩmoire cache (Redis) :**
135
- - Stocke des données temporaires pour un accès rapide.
136
- - Exemples : Actions rƩcentes, donnƩes de session.
137
- 2. **MƩmoire persistante (Meilisearch) :**
138
- - Stocke des donnƩes Ơ long terme comme les interactions historiques et les connaissances.
139
- - Permet des recherches sƩmantiques et des rƩcupƩrations basƩes sur des vecteurs.
140
-
141
- ---
142
-
143
- ### Listeners
144
-
145
- Les **listeners** permettent de se connecter Ơ des ƩvƩnements externes via WebSocket. Ils Ʃcoutent les mises Ơ jour en temps rƩel et dƩclenchent des actions ou des callbacks spƩcifiques en rƩponse aux ƩvƩnements.
146
-
147
- **CaractƩristiques principales :**
148
-
149
- - Connexion Ơ des WebSockets pour Ʃcouter les ƩvƩnements.
150
- - Gestion des abonnements avec des messages personnalisƩs.
151
- - DƩclenchement de callbacks pour traiter les donnƩes reƧues.
152
-
153
- **Exemple d'utilisation :**
154
-
155
- ```typescript
156
- agent.addListener(
157
- "listener-id",
158
- "wss://example.com/socket",
159
- () => JSON.stringify({ action: "subscribe" }),
160
- async (data) => {
161
- console.log("Data reƧue :", data);
162
- }
163
- );
164
- ```
165
-
166
- ---
167
-
168
- ### Schedulers
169
-
170
- Les **schedulers** permettent de planifier des tâches ou actions pour une exécution ultérieure. Ils utilisent des expressions cron pour définir les intervalles de planification.
171
-
172
- **CaractƩristiques principales :**
173
-
174
- - Planification basƩe sur des expressions cron.
175
- - Support des tâches récurrentes et non récurrentes.
176
- - Gestion et annulation des tâches planifiées.
177
-
178
- **Exemple d'utilisation :**
179
-
180
- ```typescript
181
- const scheduler = new TaskScheduler(agentRuntime, redisCache);
182
-
183
- const taskId = await scheduler.scheduleRequest({
184
- originalRequest: "Analyse de marchƩ",
185
- cronExpression: "0 9 * * *", // Tous les jours Ć  9h
186
- });
187
-
188
- console.log(`Tâche planifiée avec ID : ${taskId}`);
189
-
190
- // Annuler la tâche si nécessaire
191
- scheduler.cancelScheduledRequest(taskId);
192
- ```
193
-
194
- ---
195
-
196
- ## DƩfinir et exƩcuter des actions
197
-
198
- ### Qu'est-ce qu'une action ?
199
-
200
- Les actions sont les tâches fondamentales exécutées par le framework. Chaque action comprend :
201
-
202
- - Un nom et une description uniques.
203
- - Des paramètres d'entrée validés à l'aide de schémas.
204
- - Une logique d'exƩcution encapsulƩe dans la mƩthode `execute`.
205
-
206
- ### Exemple d'action
207
-
208
- ```typescript
209
- import { z } from "zod";
210
- import { parseEther } from "ethers";
211
-
212
- export const prepareTransaction = {
213
- name: "prepare-transaction",
214
- description: "PrƩpare un transfert de token pour approbation utilisateur.",
215
- parameters: z.object({
216
- walletAddress: z.string(),
217
- amount: z.string(),
218
- networkId: z.string(),
219
- }),
220
- execute: async ({ walletAddress, amount, networkId }) => {
221
- return {
222
- to: walletAddress,
223
- value: parseEther(amount).toString(),
224
- network: networkId,
225
- };
226
- },
227
- };
228
- ```
229
-
230
- ---
231
-
232
- ## Gestion de l'Ʃtat et rƩcursivitƩ
233
-
234
- L'agent gère l'état et les workflows récursifs pour s'assurer que les actions sont exécutées de manière ordonnée et jusqu'à leur achèvement, tout en respectant un maximum d'itérations pour éviter les boucles infinies.
235
-
236
- ### Gestion de l'Ʃtat
237
-
238
- L'Ʃtat (`State`) contient :
239
-
240
- - `currentContext` : Contexte actuel de la requĆŖte utilisateur.
241
- - `previousActions` : Liste des actions exƩcutƩes prƩcƩdemment.
242
-
243
- Lorsqu'une action est terminƩe, l'Ʃtat est mis Ơ jour pour inclure :
244
-
245
- - Les rƩsultats des actions prƩcƩdentes.
246
- - Le contexte restant Ć  traiter.
247
-
248
- ### RƩcursivitƩ contrƓlƩe
249
-
250
- Pour éviter les boucles infinies, le système limite le nombre d'itérations via la configuration `maxIterations`.
251
-
252
- **Fonctionnement :**
253
-
254
- 1. **Initialisation :** ƀ chaque itĆ©ration, l'agent :
255
-
256
- - ExƩcute les actions dans la file d'attente.
257
- - Met Ơ jour l'Ʃtat avec les nouveaux rƩsultats.
258
-
259
- 2. **Validation des limites :**
260
-
261
- - Si le nombre d'itƩrations dƩpasse `maxIterations`, le traitement est interrompu avec un message "Max iterations reached".
262
-
263
- 3. **RƩcursivitƩ :**
264
- - Si des actions restent Ơ exƩcuter, l'agent appelle rƩcursivement la mƩthode `process` avec le nouvel Ʃtat.
265
-
266
- **Exemple de gestion d'Ʃtat et rƩcursivitƩ :**
267
-
268
- ```typescript
269
- const updatedNextState: State = {
270
- ...state,
271
- currentContext: state.currentContext,
272
- previousActions: [...(state.previousActions || []), ...(results || [])],
273
- };
274
-
275
- if (countIterations < this.config.maxIterations) {
276
- return this.process(updatedNextState);
277
- } else {
278
- console.log("Max iterations reached");
279
- response.shouldContinue = false;
280
- }
281
- ```
282
-
283
- ---
284
-
285
- ## Installation et configuration
286
-
287
- ### Installer les dƩpendances
288
-
289
- ```bash
290
- npm install
291
- ```
292
-
293
- ### Configurer les services externes
294
-
295
- #### Redis (MƩmoire cache)
296
-
297
- ```bash
298
- docker run --name redis -d -p 6379:6379 redis
299
- ```
300
-
301
- #### Meilisearch (MƩmoire persistante)
302
-
303
- ```bash
304
- curl -L https://install.meilisearch.com | sh
305
- ./meilisearch --master-key="VOTRE_CLƉ_MAƎTRE"
306
- ```
307
-
308
- ---
309
-
310
- ## Exemple d'utilisation
311
-
312
- ### Initialiser l'agent
313
-
314
- ```typescript
315
- import { deepseek } from "@ai-ntellect/core";
316
- import { Agent } from "@ai-ntellect/core";
317
- import { checkHoneypot, fetchMarkPrice } from "@ai-ntellect/core/actions";
318
- import {
319
- generalInterpreterCharacter,
320
- marketInterpreterCharacter,
321
- securityInterpreterCharacter,
322
- } from "@ai-ntellect/core/interpreter/context";
323
-
324
- const model = deepseek("deepseek-reasoner");
325
-
326
- const agent = new Agent({
327
- orchestrator: {
328
- model,
329
- tools: [checkHoneypot, fetchMarkPrice],
330
- },
331
- interpreters: [
332
- new Interpreter({
333
- name: "security",
334
- model,
335
- character: securityInterpreterCharacter,
336
- }),
337
- new Interpreter({
338
- name: "market",
339
- model,
340
- character: marketInterpreterCharacter,
341
- }),
342
- new Interpreter({
343
- name: "general",
344
- model,
345
- character: generalInterpreterCharacter,
346
- }),
347
- ],
348
- memoryManager: {
349
- model,
350
- },
351
- maxIterations: 3,
352
- });
353
- ```
354
-
355
- ### Traiter une demande
356
-
357
- ```typescript
358
- const state = {
359
- currentContext: "Analyse des tendances de marchƩ XRP/USD",
360
- previousActions: [],
361
- };
362
-
363
- const result = await agent.process(state);
364
- console.log("RƩsultat :", result);
365
- ```
package/agent/index.ts DELETED
@@ -1,244 +0,0 @@
1
- import { LanguageModel } from "ai";
2
- import WebSocket from "ws";
3
- import { Interpreter } from "../llm/interpreter";
4
- import { MemoryManager } from "../llm/memory-manager";
5
- import { AgentRuntime } from "../llm/orchestrator";
6
- import { State } from "../llm/orchestrator/types";
7
- import { CacheMemory } from "../memory/cache";
8
- import { PersistentMemory } from "../memory/persistent";
9
- import { ActionQueueManager } from "../services/queue";
10
- import { CacheConfig, RedisCache } from "../services/redis-cache";
11
- import { ActionData, ActionSchema, QueueCallbacks } from "../types";
12
- import { QueueItemTransformer } from "../utils/queue-item-transformer";
13
-
14
- export class Agent {
15
- private readonly agent: AgentRuntime;
16
- private readonly memoryManager: MemoryManager;
17
- private readonly cache: RedisCache;
18
-
19
- private listeners: Map<
20
- string,
21
- { socket: WebSocket; callback: (data: any) => Promise<void> }
22
- > = new Map();
23
- private readonly config: {
24
- orchestrator: {
25
- model: LanguageModel;
26
- tools: ActionSchema[];
27
- memory?: {
28
- cache?: CacheMemory;
29
- persistent?: PersistentMemory;
30
- };
31
- };
32
- interpreters: Interpreter[];
33
- memoryManager: {
34
- model: LanguageModel;
35
- memory?: {
36
- cache?: CacheMemory;
37
- persistent?: PersistentMemory;
38
- };
39
- };
40
- maxIterations: number;
41
- };
42
-
43
- constructor(config: {
44
- cache: CacheConfig;
45
- orchestrator: {
46
- model: LanguageModel;
47
- tools: ActionSchema[];
48
- memory?: {
49
- cache?: CacheMemory;
50
- persistent?: PersistentMemory;
51
- };
52
- };
53
- interpreters: Interpreter[];
54
- memoryManager: {
55
- model: LanguageModel;
56
- memory?: {
57
- cache?: CacheMemory;
58
- persistent?: PersistentMemory;
59
- };
60
- };
61
- callbacks?: QueueCallbacks;
62
- maxIterations: number;
63
- }) {
64
- this.cache = new RedisCache(config.cache);
65
- this.config = config;
66
- this.agent = new AgentRuntime(
67
- config.orchestrator.model,
68
- config.orchestrator.tools,
69
- config.interpreters,
70
- config.cache,
71
- config.orchestrator.memory
72
- );
73
- this.memoryManager = new MemoryManager({
74
- model: config.memoryManager.model,
75
- memory: {
76
- cache: config.memoryManager.memory?.cache ?? undefined,
77
- persistent: config.memoryManager.memory?.persistent ?? undefined,
78
- },
79
- });
80
- this.config.maxIterations = 3;
81
- }
82
-
83
- public async process(state: State, callbacks?: QueueCallbacks): Promise<any> {
84
- console.log("šŸ”„ Processing state:");
85
- console.dir(state, { depth: null });
86
- let countIterations = 0;
87
- const response = await this.agent.process(state);
88
-
89
- const unscheduledActions = response.actions.filter(
90
- (action) => !action.scheduler?.isScheduled
91
- );
92
- // Execute actions if needed
93
- if (unscheduledActions?.length > 0 && response.shouldContinue) {
94
- console.log("\nšŸ“‹ Processing action queue");
95
- const queueManager = new ActionQueueManager(
96
- this.config.orchestrator.tools,
97
- callbacks
98
- );
99
- const queueItems = QueueItemTransformer.transformActionsToQueueItems(
100
- response.actions as ActionData[]
101
- );
102
- if (!queueItems) {
103
- throw new Error("No queue items found");
104
- }
105
-
106
- console.log(
107
- "šŸ“‹ Actions to execute:",
108
- queueItems
109
- .map((item) => (typeof item === "string" ? item : item.name))
110
- .join(", ")
111
- );
112
-
113
- queueManager.addToQueue(queueItems);
114
- console.log("\n⚔ Executing actions...");
115
- const results = await queueManager.processQueue();
116
- console.log("āœ… Execution results:", results);
117
-
118
- const updatedNextState: State = {
119
- ...state,
120
- currentContext: state.currentContext,
121
- previousActions: [...(state.previousActions || []), ...(results || [])],
122
- };
123
-
124
- console.log("\nšŸ” Recursively processing with updated state");
125
- countIterations++;
126
- if (countIterations < this.config.maxIterations) {
127
- return this.process(updatedNextState);
128
- }
129
- }
130
-
131
- if (countIterations >= this.config.maxIterations) {
132
- console.log("Max iterations reached");
133
- response.shouldContinue = false;
134
- console.log("Forcing stop");
135
- }
136
-
137
- // Handle final interpretation
138
- if (
139
- !response.shouldContinue &&
140
- state.previousActions?.length &&
141
- response.interpreter
142
- ) {
143
- console.log("\nšŸ Analysis complete - generating final interpretation");
144
- const interpreter = this.getInterpreter(
145
- this.config.interpreters,
146
- response.interpreter
147
- );
148
- console.log("šŸŽ­ Selected Interpreter:", interpreter?.name);
149
- console.dir(state, { depth: null });
150
- const interpretationResult = (await interpreter?.process(
151
- "Interpret the analysis results",
152
- {
153
- ...state,
154
- results: JSON.stringify(state.previousActions),
155
- userRequest: state.currentContext,
156
- }
157
- )) as { response: string };
158
-
159
- console.log("\nšŸ“Š Final Analysis:", interpretationResult.response);
160
-
161
- const finalState: State = {
162
- ...state,
163
- results: interpretationResult.response,
164
- };
165
-
166
- console.log("šŸ”„ Final state:", finalState);
167
- }
168
-
169
- // Return the final response at the end of the function
170
- const validatedActions = response.actions.map((action) => ({
171
- ...action,
172
- parameters: action.parameters.map((param) => ({
173
- ...param,
174
- value: param.value ?? null, // Set a default value if undefined
175
- })),
176
- }));
177
-
178
- const result = {
179
- ...response,
180
- actions: validatedActions,
181
- results: JSON.stringify(state.previousActions),
182
- };
183
- if (!result.shouldContinue) {
184
- await this.memoryManager.process(state, JSON.stringify(result));
185
- }
186
- return result;
187
- }
188
-
189
- private getInterpreter(interpreters: Interpreter[], name: string) {
190
- return interpreters.find((interpreter) => interpreter.name === name);
191
- }
192
-
193
- public addListener(
194
- id: string,
195
- url: string,
196
- subscriptionMessageFactory: () => string,
197
- callback: (data: any, agentContext: Agent) => Promise<void>
198
- ): void {
199
- if (this.listeners.has(id)) {
200
- console.warn(`WebSocket with ID ${id} already exists.`);
201
- return;
202
- }
203
-
204
- const socket = new WebSocket(url);
205
-
206
- const wrappedCallback = async (data: any) => {
207
- await callback(data, this);
208
- };
209
-
210
- socket.on("open", () => {
211
- console.log(`šŸ”— WebSocket connected for ID: ${id}`);
212
-
213
- // Envoie le message d'abonnement si une factory est fournie
214
- if (subscriptionMessageFactory) {
215
- const subscriptionMessage = subscriptionMessageFactory();
216
- socket.send(subscriptionMessage);
217
- console.log(
218
- `šŸ“” Sent subscription message for ID ${id}:`,
219
- subscriptionMessage
220
- );
221
- }
222
- });
223
-
224
- socket.on("message", async (message: string) => {
225
- console.log(`šŸ“Ø Message received for WebSocket ID ${id}:`, message);
226
- try {
227
- const data = JSON.parse(message);
228
- await wrappedCallback(data);
229
- } catch (error) {
230
- console.error(`āŒ Error in callback for WebSocket ID ${id}:`, error);
231
- }
232
- });
233
-
234
- socket.on("error", (error) => {
235
- console.error(`āŒ WebSocket error for ID ${id}:`, error);
236
- });
237
-
238
- socket.on("close", () => {
239
- console.log(`šŸ”Œ WebSocket closed for ID: ${id}`);
240
- });
241
-
242
- this.listeners.set(id, { socket, callback: wrappedCallback });
243
- }
244
- }