@ai.ntellect/core 1.0.0 → 1.1.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 (435) hide show
  1. package/.mocharc.json +6 -0
  2. package/AGENTS.md +50 -0
  3. package/ARCHITECTURE.md +58 -0
  4. package/BENCHMARK.md +38 -0
  5. package/CHANGELOG.md +224 -0
  6. package/README.md +411 -142
  7. package/agent/agent-workflow.ts +569 -0
  8. package/agent/agent.ts +183 -0
  9. package/agent/base/executor.ts +103 -0
  10. package/agent/base/index.ts +87 -0
  11. package/agent/entity-resolver/confidence.ts +54 -0
  12. package/agent/entity-resolver/entity-index.ts +241 -0
  13. package/agent/entity-resolver/explore-strategy.ts +82 -0
  14. package/agent/entity-resolver/index.ts +22 -0
  15. package/agent/entity-resolver/resolver.ts +193 -0
  16. package/agent/entity-resolver/scorer.ts +211 -0
  17. package/agent/entity-resolver/types.ts +98 -0
  18. package/agent/generic-executor.ts +713 -0
  19. package/agent/handlers/cognitive-handler.ts +197 -0
  20. package/agent/handlers/index.ts +1 -0
  21. package/agent/handoff.ts +58 -0
  22. package/agent/llm-factory.ts +343 -0
  23. package/agent/orchestrator.ts +45 -0
  24. package/agent/prompt-builder.ts +78 -0
  25. package/agent/registry.ts +64 -0
  26. package/agent/tools/file-system.ts +471 -0
  27. package/agent/tools/index.ts +23 -0
  28. package/agent/tools/logger.ts +105 -0
  29. package/agent/tools/tool-resolver.ts +104 -0
  30. package/benchmark/cortexflow-workflow.ts +182 -0
  31. package/benchmark/langgraph-workflow.ts +201 -0
  32. package/benchmark/llm-client.ts +76 -0
  33. package/benchmark/run-benchmark.ts +222 -0
  34. package/cli-dev.ts +419 -0
  35. package/dist/agent/agent-workflow.d.ts +41 -0
  36. package/dist/agent/agent-workflow.d.ts.map +1 -0
  37. package/dist/agent/agent-workflow.js +560 -0
  38. package/dist/agent/agent-workflow.js.map +1 -0
  39. package/dist/agent/agent.d.ts +38 -0
  40. package/dist/agent/agent.d.ts.map +1 -0
  41. package/dist/agent/agent.js +149 -0
  42. package/dist/agent/agent.js.map +1 -0
  43. package/dist/agent/base/executor.d.ts +51 -0
  44. package/dist/agent/base/executor.d.ts.map +1 -0
  45. package/dist/agent/base/executor.js +69 -0
  46. package/dist/agent/base/executor.js.map +1 -0
  47. package/dist/agent/base/index.d.ts +30 -0
  48. package/dist/agent/base/index.d.ts.map +1 -0
  49. package/dist/agent/base/index.js +88 -0
  50. package/dist/agent/base/index.js.map +1 -0
  51. package/dist/agent/entity-resolver/confidence.d.ts +4 -0
  52. package/dist/agent/entity-resolver/confidence.d.ts.map +1 -0
  53. package/dist/agent/entity-resolver/confidence.js +47 -0
  54. package/dist/agent/entity-resolver/confidence.js.map +1 -0
  55. package/dist/agent/entity-resolver/entity-index.d.ts +40 -0
  56. package/dist/agent/entity-resolver/entity-index.d.ts.map +1 -0
  57. package/dist/agent/entity-resolver/entity-index.js +244 -0
  58. package/dist/agent/entity-resolver/entity-index.js.map +1 -0
  59. package/dist/agent/entity-resolver/explore-strategy.d.ts +13 -0
  60. package/dist/agent/entity-resolver/explore-strategy.d.ts.map +1 -0
  61. package/dist/agent/entity-resolver/explore-strategy.js +109 -0
  62. package/dist/agent/entity-resolver/explore-strategy.js.map +1 -0
  63. package/dist/agent/entity-resolver/index.d.ts +8 -0
  64. package/dist/agent/entity-resolver/index.d.ts.map +1 -0
  65. package/dist/agent/entity-resolver/index.js +16 -0
  66. package/dist/agent/entity-resolver/index.js.map +1 -0
  67. package/dist/agent/entity-resolver/resolver.d.ts +18 -0
  68. package/dist/agent/entity-resolver/resolver.d.ts.map +1 -0
  69. package/dist/agent/entity-resolver/resolver.js +158 -0
  70. package/dist/agent/entity-resolver/resolver.js.map +1 -0
  71. package/dist/agent/entity-resolver/scorer.d.ts +3 -0
  72. package/dist/agent/entity-resolver/scorer.d.ts.map +1 -0
  73. package/dist/agent/entity-resolver/scorer.js +182 -0
  74. package/dist/agent/entity-resolver/scorer.js.map +1 -0
  75. package/dist/agent/entity-resolver/types.d.ts +89 -0
  76. package/dist/agent/entity-resolver/types.d.ts.map +1 -0
  77. package/dist/agent/entity-resolver/types.js +3 -0
  78. package/dist/agent/entity-resolver/types.js.map +1 -0
  79. package/dist/agent/generic-executor.d.ts +68 -0
  80. package/dist/agent/generic-executor.d.ts.map +1 -0
  81. package/dist/agent/generic-executor.js +620 -0
  82. package/dist/agent/generic-executor.js.map +1 -0
  83. package/dist/agent/handlers/cognitive-handler.d.ts +44 -0
  84. package/dist/agent/handlers/cognitive-handler.d.ts.map +1 -0
  85. package/dist/agent/handlers/cognitive-handler.js +172 -0
  86. package/dist/agent/handlers/cognitive-handler.js.map +1 -0
  87. package/dist/agent/handlers/index.d.ts +2 -0
  88. package/dist/agent/handlers/index.d.ts.map +1 -0
  89. package/dist/agent/handlers/index.js +7 -0
  90. package/dist/agent/handlers/index.js.map +1 -0
  91. package/dist/agent/handoff.d.ts +12 -0
  92. package/dist/agent/handoff.d.ts.map +1 -0
  93. package/dist/agent/handoff.js +62 -0
  94. package/dist/agent/handoff.js.map +1 -0
  95. package/dist/agent/llm-factory.d.ts +19 -0
  96. package/dist/agent/llm-factory.d.ts.map +1 -0
  97. package/dist/agent/llm-factory.js +297 -0
  98. package/dist/agent/llm-factory.js.map +1 -0
  99. package/dist/agent/orchestrator.d.ts +18 -0
  100. package/dist/agent/orchestrator.d.ts.map +1 -0
  101. package/dist/agent/orchestrator.js +44 -0
  102. package/dist/agent/orchestrator.js.map +1 -0
  103. package/dist/agent/prompt-builder.d.ts +35 -0
  104. package/dist/agent/prompt-builder.d.ts.map +1 -0
  105. package/dist/agent/prompt-builder.js +76 -0
  106. package/dist/agent/prompt-builder.js.map +1 -0
  107. package/dist/agent/registry.d.ts +19 -0
  108. package/dist/agent/registry.d.ts.map +1 -0
  109. package/dist/agent/registry.js +48 -0
  110. package/dist/agent/registry.js.map +1 -0
  111. package/dist/agent/tools/file-system.d.ts +11 -0
  112. package/dist/agent/tools/file-system.d.ts.map +1 -0
  113. package/dist/agent/tools/file-system.js +528 -0
  114. package/dist/agent/tools/file-system.js.map +1 -0
  115. package/dist/agent/tools/index.d.ts +4 -0
  116. package/dist/agent/tools/index.d.ts.map +1 -0
  117. package/dist/agent/tools/index.js +20 -0
  118. package/dist/agent/tools/index.js.map +1 -0
  119. package/dist/agent/tools/logger.d.ts +33 -0
  120. package/dist/agent/tools/logger.d.ts.map +1 -0
  121. package/dist/agent/tools/logger.js +86 -0
  122. package/dist/agent/tools/logger.js.map +1 -0
  123. package/dist/agent/tools/tool-resolver.d.ts +7 -0
  124. package/dist/agent/tools/tool-resolver.d.ts.map +1 -0
  125. package/dist/agent/tools/tool-resolver.js +122 -0
  126. package/dist/agent/tools/tool-resolver.js.map +1 -0
  127. package/dist/execution/adapters/in-memory-checkpoint.d.ts +11 -0
  128. package/dist/execution/adapters/in-memory-checkpoint.d.ts.map +1 -0
  129. package/dist/execution/adapters/in-memory-checkpoint.js +54 -0
  130. package/dist/execution/adapters/in-memory-checkpoint.js.map +1 -0
  131. package/dist/execution/compiler.d.ts +8 -0
  132. package/dist/execution/compiler.d.ts.map +1 -0
  133. package/dist/execution/compiler.js +50 -0
  134. package/dist/execution/compiler.js.map +1 -0
  135. package/dist/execution/controller.d.ts +30 -0
  136. package/dist/execution/controller.d.ts.map +1 -0
  137. package/dist/execution/controller.js +80 -0
  138. package/dist/execution/controller.js.map +1 -0
  139. package/dist/execution/event-manager.d.ts +29 -0
  140. package/dist/execution/event-manager.d.ts.map +1 -0
  141. package/dist/execution/event-manager.js +264 -0
  142. package/dist/execution/event-manager.js.map +1 -0
  143. package/dist/execution/index.d.ts +221 -0
  144. package/dist/execution/index.d.ts.map +1 -0
  145. package/dist/execution/index.js +638 -0
  146. package/dist/execution/index.js.map +1 -0
  147. package/dist/execution/logger.d.ts +46 -0
  148. package/dist/execution/logger.d.ts.map +1 -0
  149. package/dist/execution/logger.js +69 -0
  150. package/dist/execution/logger.js.map +1 -0
  151. package/dist/execution/node.d.ts +65 -0
  152. package/dist/execution/node.d.ts.map +1 -0
  153. package/dist/execution/node.js +250 -0
  154. package/dist/execution/node.js.map +1 -0
  155. package/dist/execution/observer.d.ts +38 -0
  156. package/dist/execution/observer.d.ts.map +1 -0
  157. package/dist/execution/observer.js +111 -0
  158. package/dist/execution/observer.js.map +1 -0
  159. package/dist/execution/planner.d.ts +14 -0
  160. package/dist/execution/planner.d.ts.map +1 -0
  161. package/dist/execution/planner.js +43 -0
  162. package/dist/execution/planner.js.map +1 -0
  163. package/dist/execution/reducer.d.ts +19 -0
  164. package/dist/execution/reducer.d.ts.map +1 -0
  165. package/dist/execution/reducer.js +61 -0
  166. package/dist/execution/reducer.js.map +1 -0
  167. package/dist/execution/registry.d.ts +38 -0
  168. package/dist/execution/registry.d.ts.map +1 -0
  169. package/dist/execution/registry.js +63 -0
  170. package/dist/execution/registry.js.map +1 -0
  171. package/dist/execution/send-api.d.ts +24 -0
  172. package/dist/execution/send-api.d.ts.map +1 -0
  173. package/dist/execution/send-api.js +52 -0
  174. package/dist/execution/send-api.js.map +1 -0
  175. package/dist/execution/types.parallel.d.ts +61 -0
  176. package/dist/execution/types.parallel.d.ts.map +1 -0
  177. package/dist/execution/types.parallel.js +3 -0
  178. package/dist/execution/types.parallel.js.map +1 -0
  179. package/dist/execution/visualizer.d.ts +35 -0
  180. package/dist/execution/visualizer.d.ts.map +1 -0
  181. package/dist/execution/visualizer.js +131 -0
  182. package/dist/execution/visualizer.js.map +1 -0
  183. package/dist/index.d.ts +47 -0
  184. package/dist/index.d.ts.map +1 -0
  185. package/dist/index.js +78 -0
  186. package/dist/index.js.map +1 -0
  187. package/dist/interfaces/index.d.ts +487 -0
  188. package/dist/interfaces/index.d.ts.map +1 -0
  189. package/dist/interfaces/index.js +75 -0
  190. package/dist/interfaces/index.js.map +1 -0
  191. package/dist/modules/agenda/adapters/node-cron/index.d.ts +17 -0
  192. package/dist/modules/agenda/adapters/node-cron/index.d.ts.map +1 -0
  193. package/dist/modules/agenda/adapters/node-cron/index.js +30 -0
  194. package/dist/modules/agenda/adapters/node-cron/index.js.map +1 -0
  195. package/dist/modules/agenda/index.d.ts +63 -0
  196. package/dist/modules/agenda/index.d.ts.map +1 -0
  197. package/dist/modules/agenda/index.js +141 -0
  198. package/dist/modules/agenda/index.js.map +1 -0
  199. package/dist/modules/cli/index.d.ts +13 -0
  200. package/dist/modules/cli/index.d.ts.map +1 -0
  201. package/dist/modules/cli/index.js +672 -0
  202. package/dist/modules/cli/index.js.map +1 -0
  203. package/dist/modules/embedding/adapters/ai/index.d.ts +29 -0
  204. package/dist/modules/embedding/adapters/ai/index.d.ts.map +1 -0
  205. package/dist/modules/embedding/adapters/ai/index.js +58 -0
  206. package/dist/modules/embedding/adapters/ai/index.js.map +1 -0
  207. package/dist/modules/embedding/index.d.ts +36 -0
  208. package/dist/modules/embedding/index.d.ts.map +1 -0
  209. package/dist/modules/embedding/index.js +60 -0
  210. package/dist/modules/embedding/index.js.map +1 -0
  211. package/dist/modules/nlp/engine.d.ts +126 -0
  212. package/dist/modules/nlp/engine.d.ts.map +1 -0
  213. package/dist/modules/nlp/engine.js +299 -0
  214. package/dist/modules/nlp/engine.js.map +1 -0
  215. package/dist/modules/nlp/index.d.ts +27 -0
  216. package/dist/modules/nlp/index.d.ts.map +1 -0
  217. package/dist/modules/nlp/index.js +56 -0
  218. package/dist/modules/nlp/index.js.map +1 -0
  219. package/dist/persistence/index.d.ts +12 -0
  220. package/dist/persistence/index.d.ts.map +1 -0
  221. package/dist/persistence/index.js +24 -0
  222. package/dist/persistence/index.js.map +1 -0
  223. package/dist/persistence/neo4j/driver.d.ts +26 -0
  224. package/dist/persistence/neo4j/driver.d.ts.map +1 -0
  225. package/dist/persistence/neo4j/driver.js +64 -0
  226. package/dist/persistence/neo4j/driver.js.map +1 -0
  227. package/dist/persistence/neo4j/entity-store.d.ts +15 -0
  228. package/dist/persistence/neo4j/entity-store.d.ts.map +1 -0
  229. package/dist/persistence/neo4j/entity-store.js +136 -0
  230. package/dist/persistence/neo4j/entity-store.js.map +1 -0
  231. package/dist/persistence/neo4j/execution-tracer.d.ts +19 -0
  232. package/dist/persistence/neo4j/execution-tracer.d.ts.map +1 -0
  233. package/dist/persistence/neo4j/execution-tracer.js +166 -0
  234. package/dist/persistence/neo4j/execution-tracer.js.map +1 -0
  235. package/dist/persistence/neo4j/memory-adapter.d.ts +35 -0
  236. package/dist/persistence/neo4j/memory-adapter.d.ts.map +1 -0
  237. package/dist/persistence/neo4j/memory-adapter.js +252 -0
  238. package/dist/persistence/neo4j/memory-adapter.js.map +1 -0
  239. package/dist/persistence/neo4j/petri-checkpoint-adapter.d.ts +22 -0
  240. package/dist/persistence/neo4j/petri-checkpoint-adapter.d.ts.map +1 -0
  241. package/dist/persistence/neo4j/petri-checkpoint-adapter.js +141 -0
  242. package/dist/persistence/neo4j/petri-checkpoint-adapter.js.map +1 -0
  243. package/dist/pipeline/agent-pipeline.d.ts +99 -0
  244. package/dist/pipeline/agent-pipeline.d.ts.map +1 -0
  245. package/dist/pipeline/agent-pipeline.js +356 -0
  246. package/dist/pipeline/agent-pipeline.js.map +1 -0
  247. package/dist/routing/checkpoint-adapter.d.ts +30 -0
  248. package/dist/routing/checkpoint-adapter.d.ts.map +1 -0
  249. package/dist/routing/checkpoint-adapter.js +83 -0
  250. package/dist/routing/checkpoint-adapter.js.map +1 -0
  251. package/dist/routing/documentation-generator.d.ts +47 -0
  252. package/dist/routing/documentation-generator.d.ts.map +1 -0
  253. package/dist/routing/documentation-generator.js +320 -0
  254. package/dist/routing/documentation-generator.js.map +1 -0
  255. package/dist/routing/index.d.ts +38 -0
  256. package/dist/routing/index.d.ts.map +1 -0
  257. package/dist/routing/index.js +375 -0
  258. package/dist/routing/index.js.map +1 -0
  259. package/dist/routing/intent-classifier.d.ts +206 -0
  260. package/dist/routing/intent-classifier.d.ts.map +1 -0
  261. package/dist/routing/intent-classifier.js +267 -0
  262. package/dist/routing/intent-classifier.js.map +1 -0
  263. package/dist/routing/matrix.d.ts +6 -0
  264. package/dist/routing/matrix.d.ts.map +1 -0
  265. package/dist/routing/matrix.js +131 -0
  266. package/dist/routing/matrix.js.map +1 -0
  267. package/dist/routing/orchestrator.d.ts +87 -0
  268. package/dist/routing/orchestrator.d.ts.map +1 -0
  269. package/dist/routing/orchestrator.js +425 -0
  270. package/dist/routing/orchestrator.js.map +1 -0
  271. package/dist/routing/postgres-checkpoint-adapter.d.ts +32 -0
  272. package/dist/routing/postgres-checkpoint-adapter.d.ts.map +1 -0
  273. package/dist/routing/postgres-checkpoint-adapter.js +167 -0
  274. package/dist/routing/postgres-checkpoint-adapter.js.map +1 -0
  275. package/dist/routing/redis-checkpoint-adapter.d.ts +34 -0
  276. package/dist/routing/redis-checkpoint-adapter.d.ts.map +1 -0
  277. package/dist/routing/redis-checkpoint-adapter.js +170 -0
  278. package/dist/routing/redis-checkpoint-adapter.js.map +1 -0
  279. package/dist/routing/types.d.ts +49 -0
  280. package/dist/routing/types.d.ts.map +1 -0
  281. package/dist/routing/types.js +3 -0
  282. package/dist/routing/types.js.map +1 -0
  283. package/dist/types/agent.d.ts +289 -0
  284. package/dist/types/agent.d.ts.map +1 -0
  285. package/dist/types/agent.js +78 -0
  286. package/dist/types/agent.js.map +1 -0
  287. package/dist/types/index.d.ts +343 -0
  288. package/dist/types/index.d.ts.map +1 -0
  289. package/dist/types/index.js +3 -0
  290. package/dist/types/index.js.map +1 -0
  291. package/dist/utils/generate-action-schema.d.ts +4 -0
  292. package/dist/utils/generate-action-schema.d.ts.map +1 -0
  293. package/dist/utils/generate-action-schema.js +46 -0
  294. package/dist/utils/generate-action-schema.js.map +1 -0
  295. package/dist/utils/header-builder.d.ts +12 -0
  296. package/dist/utils/header-builder.d.ts.map +1 -0
  297. package/dist/utils/header-builder.js +35 -0
  298. package/dist/utils/header-builder.js.map +1 -0
  299. package/dist/utils/logger.d.ts +27 -0
  300. package/dist/utils/logger.d.ts.map +1 -0
  301. package/dist/utils/logger.js +45 -0
  302. package/dist/utils/logger.js.map +1 -0
  303. package/docs/.gitbook/assets/image (1).png +0 -0
  304. package/docs/.gitbook/assets/image (2).png +0 -0
  305. package/docs/.gitbook/assets/image (3).png +0 -0
  306. package/docs/.gitbook/assets/image (4).png +0 -0
  307. package/docs/.gitbook/assets/image (5).png +0 -0
  308. package/docs/.gitbook/assets/image (6).png +0 -0
  309. package/docs/.gitbook/assets/image.png +0 -0
  310. package/docs/README.md +57 -0
  311. package/docs/SUMMARY.md +34 -0
  312. package/docs/cas-dusages.md +69 -0
  313. package/docs/cli/README.md +65 -0
  314. package/docs/concepts-cles.md +50 -0
  315. package/docs/core/architecture.md +87 -0
  316. package/docs/core/benchmark.md +59 -0
  317. package/docs/core/checkpoint.md +72 -0
  318. package/docs/core/documentation.md +55 -0
  319. package/docs/core/graphcontroller.md +63 -0
  320. package/docs/core/graphflow.md +137 -0
  321. package/docs/core/introduction.md +41 -0
  322. package/docs/core/les-evenements.md +95 -0
  323. package/docs/modules/agenda/README.md +63 -0
  324. package/docs/modules/agenda/interface-iagenda.md +170 -0
  325. package/docs/modules/agenda/les-adaptateurs/README.md +237 -0
  326. package/docs/modules/agenda/les-adaptateurs/nodecronadapter.md +91 -0
  327. package/docs/modules/introduction.md +55 -0
  328. package/docs/modules/les-adaptateurs.md +52 -0
  329. package/docs/modules/memoire/README.md +68 -0
  330. package/docs/modules/memoire/interface-imemory.md +183 -0
  331. package/docs/modules/memoire/les-adaptateurs/README.md +209 -0
  332. package/docs/modules/memoire/les-adaptateurs/inmemoryadapter.md +110 -0
  333. package/docs/modules/memoire/les-adaptateurs/meilisearchadapter.md +147 -0
  334. package/docs/modules/memoire/les-adaptateurs/redisadapter.md +212 -0
  335. package/docs/modules/nlp/README.md +44 -0
  336. package/docs/philosophie.md +51 -0
  337. package/docs/tutoriels/ajouter-des-conditions.md +150 -0
  338. package/docs/tutoriels/branching.md +194 -0
  339. package/docs/tutoriels/checkpoint-usage.md +99 -0
  340. package/docs/tutoriels/creer-agent-onchain.md +1041 -0
  341. package/docs/tutoriels/creer-un-agent.md +108 -0
  342. package/docs/tutoriels/creer-un-graphe-simple.md +92 -0
  343. package/docs/tutoriels/gerer-les-erreurs.md +124 -0
  344. package/docs/tutoriels/pour-commencer.md +73 -0
  345. package/docs/tutoriels/retry.md +166 -0
  346. package/execution/adapters/in-memory-checkpoint.ts +35 -0
  347. package/execution/compiler.ts +47 -0
  348. package/execution/controller.ts +84 -0
  349. package/execution/event-manager.ts +331 -0
  350. package/execution/index.ts +800 -0
  351. package/execution/logger.ts +70 -0
  352. package/execution/node.ts +315 -0
  353. package/execution/observer.ts +192 -0
  354. package/execution/planner.ts +40 -0
  355. package/execution/reducer.ts +73 -0
  356. package/execution/registry.ts +86 -0
  357. package/execution/send-api.ts +58 -0
  358. package/execution/types.parallel.ts +81 -0
  359. package/execution/visualizer.ts +158 -0
  360. package/index.ts +55 -465
  361. package/interfaces/index.ts +597 -0
  362. package/modules/agenda/adapters/node-cron/index.ts +25 -0
  363. package/modules/agenda/index.ts +146 -0
  364. package/modules/cli/index.ts +580 -0
  365. package/modules/embedding/adapters/ai/index.ts +42 -0
  366. package/modules/embedding/index.ts +45 -0
  367. package/modules/nlp/engine.ts +324 -0
  368. package/modules/nlp/index.ts +45 -0
  369. package/package.json +81 -9
  370. package/persistence/index.ts +27 -0
  371. package/persistence/neo4j/driver.ts +34 -0
  372. package/persistence/neo4j/entity-store.ts +141 -0
  373. package/persistence/neo4j/execution-tracer.ts +194 -0
  374. package/persistence/neo4j/memory-adapter.ts +281 -0
  375. package/persistence/neo4j/petri-checkpoint-adapter.ts +153 -0
  376. package/pipeline/agent-pipeline.ts +426 -0
  377. package/routing/checkpoint-adapter.ts +79 -0
  378. package/routing/documentation-generator.ts +358 -0
  379. package/routing/index.ts +459 -0
  380. package/routing/intent-classifier.ts +360 -0
  381. package/routing/matrix.ts +138 -0
  382. package/routing/orchestrator.ts +498 -0
  383. package/routing/patterns/data-extraction.json +79 -0
  384. package/routing/patterns/human-approval.json +64 -0
  385. package/routing/patterns/rag-search.json +68 -0
  386. package/routing/postgres-checkpoint-adapter.ts +172 -0
  387. package/routing/redis-checkpoint-adapter.ts +187 -0
  388. package/routing/types.ts +59 -0
  389. package/routing/web-server.ts +260 -0
  390. package/scripts/generate-petri-docs.ts +70 -0
  391. package/scripts/get-gmail-token.js +65 -0
  392. package/scripts/get-gmail-token.ts +65 -0
  393. package/test/agent/agent.test.ts +92 -0
  394. package/test/agent/clone.test.ts +143 -0
  395. package/test/agent/cognitive-handler.test.ts +78 -0
  396. package/test/agent/entity-store.test.ts +80 -0
  397. package/test/agent/generic-executor.test.ts +230 -0
  398. package/test/agent/handoff.test.ts +163 -0
  399. package/test/agent/llm-factory.test.ts +40 -0
  400. package/test/agent/orchestrator.test.ts +156 -0
  401. package/test/agent/registry.test.ts +97 -0
  402. package/test/agent/tools.test.ts +267 -0
  403. package/test/execution/checkpoint.test.ts +811 -0
  404. package/test/execution/controller.test.ts +236 -0
  405. package/test/execution/event-manager.test.ts +118 -0
  406. package/test/execution/index.test.ts +690 -0
  407. package/test/execution/node.test.ts +464 -0
  408. package/test/execution/observer.test.ts +393 -0
  409. package/test/execution/parallel.test.ts +135 -0
  410. package/test/execution/plan-llm-integration.test.ts +290 -0
  411. package/test/execution/plan-real-onchain.test.ts +226 -0
  412. package/test/execution/send-api.test.ts +121 -0
  413. package/test/modules/agenda/node-cron.test.ts +307 -0
  414. package/test/modules/cli/index.test.ts +125 -0
  415. package/test/persistence/neo4j-execution-tracer.test.ts +96 -0
  416. package/test/persistence/neo4j-memory-adapter.test.ts +107 -0
  417. package/test/persistence/neo4j-petri-checkpoint.test.ts +89 -0
  418. package/test/pipeline/agent-pipeline.test.ts +118 -0
  419. package/test/routing/checkpoint-persistence.test.ts +58 -0
  420. package/test/routing/documentation-generator.test.ts +76 -0
  421. package/test/routing/integration.test.ts +261 -0
  422. package/test/routing/intent-classifier.test.ts +102 -0
  423. package/test/routing/petri.test.ts +156 -0
  424. package/test/routing/real-llm.test.ts +260 -0
  425. package/test-petri-features.ts +218 -0
  426. package/test-pipeline-api.ts +163 -0
  427. package/tsconfig.json +30 -108
  428. package/types/agent.ts +296 -0
  429. package/types/index.ts +387 -0
  430. package/utils/generate-action-schema.ts +47 -0
  431. package/utils/header-builder.ts +40 -0
  432. package/utils/logger.ts +40 -0
  433. package/package copy.json +0 -21
  434. package/types.ts +0 -62
  435. package/utils/executor.ts +0 -42
@@ -0,0 +1,209 @@
1
+ ---
2
+ description: >-
3
+ Un adaptateur mémoire est un composant permettant de gérer la persistance et
4
+ la récupération des données de l'agent en fonction du moteur sous-jacent.
5
+ ---
6
+
7
+ # Les adaptateurs
8
+
9
+ ### **Qu’est-ce qu’un adaptateur mémoire ?**
10
+
11
+ Un **adaptateur mémoire** est un composant permettant de gérer la **persistance et la récupération** des données de l'agent en fonction du moteur sous-jacent.
12
+
13
+ Il sert d'interface entre le système et le stockage, en encapsulant les spécificités d’un moteur (base de données, cache, indexation…).
14
+
15
+ Grâce aux adaptateurs, **le système peut changer de moteur de stockage sans modifier son code**.
16
+
17
+ ***
18
+
19
+ ### **Fonctionnement des adaptateurs mémoire**
20
+
21
+ Tous les adaptateurs doivent implémenter une interface commune **`IMemoryAdapter`**, garantissant une API standardisée.
22
+
23
+ #### **Méthodes essentielles d’un adaptateur**
24
+
25
+ | Méthode | Description |
26
+ | ------------------------------------------------------------------------------ | -------------------------------------------- |
27
+ | `init(roomId: string)` | Initialise le stockage pour une salle donnée |
28
+ | `createMemory(input: CreateMemoryInput)` | Stocke une nouvelle mémoire |
29
+ | `getMemoryById(id: string, roomId: string)` | Récupère une mémoire spécifique |
30
+ | `getMemoryByIndex(query: string, options: { roomId: string; limit?: number })` | Recherche des mémoires par indexation |
31
+ | `getAllMemories(roomId: string)` | Récupère toutes les mémoires d’une salle |
32
+ | `clearMemoryById(id: string, roomId: string)` | Supprime une mémoire spécifique |
33
+ | `clearAllMemories()` | Vide toutes les mémoires |
34
+
35
+ Ainsi, un adaptateur peut être **changé ou ajouté dynamiquement**, sans modifier l'agent.
36
+
37
+ ***
38
+
39
+ ### **Adaptateurs intégrés (par défaut)**
40
+
41
+ Le framework propose **plusieurs adaptateurs intégrés** :
42
+
43
+ | Adaptateur | Type de stockage | Cas d’usage |
44
+ | ---------------------- | -------------------- | ------------------------------- |
45
+ | **InMemoryAdapter** | RAM (non persistant) | Cache rapide, temporaire |
46
+ | **MeilisearchAdapter** | Moteur de recherche | Recherche avancée et indexation |
47
+ | **RedisAdapter** | Stockage clé-valeur | Cache persistant avec TTL |
48
+
49
+ ***
50
+
51
+ ### **Créer un nouvel adaptateur : Exemple avec SQLite**
52
+
53
+ Si on veut utiliser **SQLite** comme moteur de stockage mémoire, on doit créer un nouvel adaptateur.
54
+
55
+ #### **1. Installer la dépendance**
56
+
57
+ On utilise [BetterSQLite3](https://github.com/WiseLibs/better-sqlite3) pour des accès rapides et synchrones.
58
+
59
+ ```sh
60
+ npm install better-sqlite3
61
+ ```
62
+
63
+ #### **2. Implémenter l’adaptateur**
64
+
65
+ On crée un fichier `BetterSQLiteAdapter.ts` qui respecte l’interface `IMemoryAdapter`.
66
+
67
+ ```typescript
68
+ import Database from "better-sqlite3";
69
+ import { IMemoryAdapter } from "../interfaces";
70
+ import { BaseMemoryType, CreateMemoryInput } from "../types";
71
+
72
+ /**
73
+ * @module BetterSQLiteAdapter
74
+ * @description Adaptateur SQLite pour le stockage persistant des mémoires.
75
+ */
76
+ export class BetterSQLiteAdapter implements IMemoryAdapter {
77
+ private db: Database.Database;
78
+
79
+ /**
80
+ * Initialise l'adaptateur avec une base SQLite.
81
+ * @param {string} dbPath - Chemin vers le fichier SQLite
82
+ */
83
+ constructor(dbPath: string = "./memory.db") {
84
+ this.db = new Database(dbPath);
85
+ this.initSchema();
86
+ }
87
+
88
+ /**
89
+ * Initialise la table SQLite si elle n'existe pas
90
+ */
91
+ private initSchema(): void {
92
+ this.db.exec(`
93
+ CREATE TABLE IF NOT EXISTS memories (
94
+ id TEXT PRIMARY KEY,
95
+ roomId TEXT,
96
+ data TEXT,
97
+ createdAt TEXT
98
+ )
99
+ `);
100
+ }
101
+
102
+ /**
103
+ * Initialise le stockage pour une salle spécifique (non nécessaire pour SQLite).
104
+ */
105
+ async init(_roomId: string): Promise<void> {
106
+ return;
107
+ }
108
+
109
+ /**
110
+ * Stocke une nouvelle mémoire dans la base SQLite.
111
+ * @param {CreateMemoryInput} input - Données de la mémoire
112
+ * @returns {Promise<BaseMemoryType>} - Mémoire créée
113
+ */
114
+ async createMemory(input: CreateMemoryInput): Promise<BaseMemoryType> {
115
+ const memory: BaseMemoryType = {
116
+ id: input.id || crypto.randomUUID(),
117
+ data: input.data,
118
+ roomId: input.roomId,
119
+ createdAt: new Date(),
120
+ };
121
+
122
+ const stmt = this.db.prepare(`
123
+ INSERT INTO memories (id, roomId, data, createdAt)
124
+ VALUES (?, ?, ?, ?)
125
+ `);
126
+ stmt.run(memory.id, memory.roomId, memory.data, memory.createdAt.toISOString());
127
+
128
+ return memory;
129
+ }
130
+
131
+ /**
132
+ * Récupère une mémoire par ID et salle.
133
+ * @param {string} id - Identifiant de la mémoire
134
+ * @param {string} roomId - Identifiant de la salle
135
+ * @returns {Promise<BaseMemoryType | null>} - Mémoire trouvée ou null
136
+ */
137
+ async getMemoryById(id: string, roomId: string): Promise<BaseMemoryType | null> {
138
+ const stmt = this.db.prepare(`
139
+ SELECT * FROM memories WHERE id = ? AND roomId = ?
140
+ `);
141
+ const row = stmt.get(id, roomId);
142
+ return row ? { ...row, createdAt: new Date(row.createdAt) } : null;
143
+ }
144
+
145
+ /**
146
+ * Recherche des mémoires contenant un mot-clé.
147
+ */
148
+ async getMemoryByIndex(query: string, options: { roomId: string; limit?: number }): Promise<BaseMemoryType[]> {
149
+ const stmt = this.db.prepare(`
150
+ SELECT * FROM memories WHERE roomId = ? AND data LIKE ? LIMIT ?
151
+ `);
152
+ return stmt.all(options.roomId, `%${query}%`, options.limit || 10);
153
+ }
154
+
155
+ /**
156
+ * Récupère toutes les mémoires d'une salle.
157
+ */
158
+ async getAllMemories(roomId: string): Promise<BaseMemoryType[]> {
159
+ const stmt = this.db.prepare(`
160
+ SELECT * FROM memories WHERE roomId = ?
161
+ `);
162
+ return stmt.all(roomId);
163
+ }
164
+
165
+ /**
166
+ * Supprime une mémoire spécifique.
167
+ */
168
+ async clearMemoryById(id: string, roomId: string): Promise<void> {
169
+ const stmt = this.db.prepare(`
170
+ DELETE FROM memories WHERE id = ? AND roomId = ?
171
+ `);
172
+ stmt.run(id, roomId);
173
+ }
174
+
175
+ /**
176
+ * Supprime toutes les mémoires.
177
+ */
178
+ async clearAllMemories(): Promise<void> {
179
+ this.db.exec(`DELETE FROM memories`);
180
+ }
181
+ }
182
+ ```
183
+
184
+ ***
185
+
186
+ ### **Intégrer le nouvel adaptateur**
187
+
188
+ Une fois le nouvel adaptateur implémenté, on peut l’intégrer dans l’agent :
189
+
190
+ ```typescript
191
+ import { BetterSQLiteAdapter } from "./BetterSQLiteAdapter";
192
+ import { Memory } from "../modules/memory";
193
+
194
+ // Initialisation avec SQLite
195
+ const memoryAdapter = new BetterSQLiteAdapter("./agent-memory.db");
196
+ const memoryModule = new Memory(memoryAdapter);
197
+
198
+ async function run() {
199
+ await memoryModule.createMemory({
200
+ data: "Ceci est un test",
201
+ roomId: "chat-session-1",
202
+ });
203
+
204
+ const memories = await memoryModule.getAllMemories("chat-session-1");
205
+ console.log("Mémoires récupérées :", memories);
206
+ }
207
+
208
+ run();
209
+ ```
@@ -0,0 +1,110 @@
1
+ ---
2
+ description: >-
3
+ InMemoryAdapter est l'implémentation la plus simple d'un adaptateur mémoire.
4
+ Il stocke les données en RAM.
5
+ ---
6
+
7
+ # InMemoryAdapter
8
+
9
+ `InMemoryAdapter` est une implémentation simple et efficace de l’interface **IMemoryAdapter**. Il repose sur une structure **Map** pour stocker des entrées mémoire **en RAM** et ne conserve aucune donnée une fois le processus arrêté.
10
+
11
+ Ce type d’adaptateur est particulièrement adapté aux cas où la mémoire doit être temporaire, avec un accès très rapide, sans nécessiter de persistance durable.
12
+
13
+ ***
14
+
15
+ ### **Spécificités techniques de l’InMemoryAdapter**
16
+
17
+ #### **Stockage en mémoire via une Map**
18
+
19
+ L’adaptateur utilise une **Map TypeScript**, qui associe un `roomId` à une liste de mémoires. Contrairement à une base de données, les opérations de lecture et d’écriture sont exécutées en **temps constant O(1)** pour l’insertion et l’accès direct par clé.
20
+
21
+ ```typescript
22
+ private storage: Map<string, BaseMemoryType[]> = new Map();
23
+ ```
24
+
25
+ Chaque **room** représente une instance de mémoire séparée. Cela permet d’isoler les données par contexte, tout en bénéficiant d’une récupération rapide.
26
+
27
+ ***
28
+
29
+ #### **Initialisation et création dynamique des rooms**
30
+
31
+ Lorsqu’un système accède à la mémoire pour la première fois, une **vérification est effectuée** afin de s’assurer que le `roomId` existe bien dans la **Map**. Si ce n’est pas le cas, un espace de stockage est créé dynamiquement.
32
+
33
+ ```typescript
34
+ async init(roomId: string): Promise<void> {
35
+ if (!this.storage.has(roomId)) {
36
+ this.storage.set(roomId, []);
37
+ }
38
+ }
39
+ ```
40
+
41
+ Ce mécanisme permet une allocation **à la demande**, évitant tout stockage inutile en mémoire.
42
+
43
+ ***
44
+
45
+ #### **Optimisation des recherches**
46
+
47
+ `InMemoryAdapter` ne permet pas d’indexation avancée comme une base de données. La recherche est effectuée **par filtrage séquentiel** dans la liste des mémoires associées à une room.
48
+
49
+ ```typescript
50
+ async getMemoryByIndex(query: string, options: { roomId: string; limit?: number })
51
+ : Promise<BaseMemoryType[]> {
52
+ const memories = this.storage.get(options.roomId) || [];
53
+ return memories.filter((m) => m.data.includes(query)).slice(0, options.limit || 10);
54
+ }
55
+ ```
56
+
57
+ Ce type de recherche est suffisant pour un usage **temporaire ou de prototypage**, mais il devient inefficace sur **de grands volumes de données**.
58
+
59
+ ***
60
+
61
+ #### **Effacement ciblé et suppression totale**
62
+
63
+ `InMemoryAdapter` permet de supprimer des entrées individuelles ou de réinitialiser l’ensemble des données en **effaçant directement les références stockées**.
64
+
65
+ **Suppression d’une mémoire spécifique**
66
+
67
+ ```typescript
68
+ async clearMemoryById(id: string, roomId: string): Promise<void> {
69
+ const memories = this.storage.get(roomId) || [];
70
+ this.storage.set(roomId, memories.filter((m) => m.id !== id));
71
+ }
72
+ ```
73
+
74
+ **Réinitialisation complète de toutes les rooms**
75
+
76
+ ```typescript
77
+ async clearAllMemories(): Promise<void> {
78
+ this.storage.clear();
79
+ }
80
+ ```
81
+
82
+ Ces opérations sont **instantanées**, mais elles **ne permettent pas d’annulation** (contrairement à une base de données transactionnelle).
83
+
84
+ ***
85
+
86
+ ### **Limitations et considérations**
87
+
88
+ #### **Absence de persistance**
89
+
90
+ `InMemoryAdapter` est **volatile** : les données disparaissent dès l’arrêt du processus. Pour des systèmes nécessitant un historique persistant, un adaptateur basé sur un stockage externe (comme **Redis**, **SQLite**, ou **Meilisearch**) est recommandé.
91
+
92
+ #### **Consommation mémoire**
93
+
94
+ Le stockage en **RAM** signifie que la quantité de mémoire disponible limite la capacité de stockage. **Une accumulation non contrôlée peut entraîner des fuites mémoire et un crash de l’application**.
95
+
96
+ #### **Performances sur de gros volumes**
97
+
98
+ Les accès directs via `roomId` sont rapides, mais la **recherche textuelle est inefficace** sur de grands ensembles de données, car elle repose sur une **parcours linéaire**.
99
+
100
+ ***
101
+
102
+ ### **Cas d’usage**&#x20;
103
+
104
+ `InMemoryAdapter` est une solution pertinente pour :
105
+
106
+ * **Stockage temporaire d’interactions utilisateur** dans des agents conversationnels.
107
+ * **Tests et prototypage rapide** sans configurer de base de données.
108
+ * **Cache léger** pour éviter des appels répétés à des services externes.
109
+
110
+ Pour une application en production ou nécessitant des recherches complexes, une alternative **persistance** est nécessaire.&#x20;
@@ -0,0 +1,147 @@
1
+ ---
2
+ description: >-
3
+ L'adaptateur Meilisearch est conçu pour offrir une indexation rapide et une
4
+ recherche avancée sur les données en mémoire.
5
+ ---
6
+
7
+ # MeiliSearchAdapter
8
+
9
+ `MeilisearchAdapter` intègre Meilisearch comme moteur de stockage et de recherche pour la mémoire des systèmes.&#x20;
10
+
11
+ Ce type d’adaptateur est particulièrement adapté aux cas où un système doit retrouver rapidement des informations contextuelles à partir d’une **grande quantité de données**.
12
+
13
+ ***
14
+
15
+ ### **Spécificités techniques du MeilisearchAdapter**
16
+
17
+ #### **Stockage sous forme d’index dans Meilisearch**
18
+
19
+ L’adaptateur crée un index distinct pour chaque `roomId`. Un index est l’équivalent d’une **collection de documents** dans une base NoSQL, permettant une **recherche optimisée**.
20
+
21
+ ```typescript
22
+ private async initializeStorage(roomId: string): Promise<void> {
23
+ try {
24
+ await this.makeRequest(`/indexes/${roomId}`);
25
+ } catch {
26
+ await this.makeRequest("/indexes", {
27
+ method: "POST",
28
+ body: JSON.stringify({ uid: roomId, primaryKey: "id" }),
29
+ });
30
+ }
31
+ }
32
+ ```
33
+
34
+ Si l’index n’existe pas encore, il est automatiquement créé, évitant toute configuration manuelle.
35
+
36
+ ***
37
+
38
+ #### **Indexation et recherche avancée**
39
+
40
+ Meilisearch permet des **requêtes de recherche floues** avec un **scoring** de pertinence. Les résultats sont classés en fonction de leur **similarité avec la requête**, ce qui est idéal pour une mémoire adaptative.
41
+
42
+ **Indexation d’une nouvelle mémoire**
43
+
44
+ ```typescript
45
+ async createMemory(input: CreateMemoryInput & { embedding?: number[] }): Promise<BaseMemoryType | undefined> {
46
+ await this.initializeStorage(input.roomId);
47
+
48
+ const existingMemory = await this.search(input.data, input.roomId, { limit: 1 });
49
+ if (existingMemory.length > 0) {
50
+ return existingMemory[0].document;
51
+ }
52
+
53
+ const memory: BaseMemoryType = {
54
+ id: input.id || crypto.randomUUID(),
55
+ data: input.data,
56
+ embedding: input.embedding,
57
+ roomId: input.roomId,
58
+ createdAt: new Date(),
59
+ };
60
+
61
+ await this.addDocuments([memory], input.roomId);
62
+ return memory;
63
+ }
64
+ ```
65
+
66
+ Chaque mémoire ajoutée est immédiatement indexée et accessible via **une recherche contextuelle rapide**.
67
+
68
+ ***
69
+
70
+ #### **Optimisation de la recherche et scoring de pertinence**
71
+
72
+ Contrairement à une recherche brute basée sur une correspondance exacte, Meilisearch évalue **le degré de similarité** des documents avec la requête. Cela permet d’améliorer la compréhension contextuelle du système.
73
+
74
+ ```typescript
75
+ private async search(query: string, roomId: string, options?: { limit?: number; threshold?: number }): Promise<SearchResult[]> {
76
+ const searchResults = await this.makeRequest(`/indexes/${roomId}/search`, {
77
+ method: "POST",
78
+ body: JSON.stringify({
79
+ q: query,
80
+ limit: options?.limit || 10,
81
+ }),
82
+ });
83
+
84
+ if (!searchResults.hits) return [];
85
+
86
+ return searchResults.hits.map((hit: any) => ({
87
+ document: {
88
+ id: hit.id,
89
+ data: hit.data,
90
+ embedding: hit.embedding,
91
+ roomId: hit.roomId,
92
+ createdAt: hit.createdAt,
93
+ },
94
+ score: hit._score || 0,
95
+ }));
96
+ }
97
+ ```
98
+
99
+ Les résultats retournés sont **triés par pertinence**, avec un score de similarité permettant d'ajuster dynamiquement les réponses du système.
100
+
101
+ ***
102
+
103
+ #### **Suppression et nettoyage d’index**
104
+
105
+ L’adaptateur permet d’effacer **sélectivement** une mémoire spécifique ou **de supprimer un index complet**, ce qui est utile lorsque la mémoire devient obsolète ou que l’on veut réinitialiser un contexte.
106
+
107
+ **Suppression d’une mémoire spécifique**
108
+
109
+ ```typescript
110
+ async clearMemoryById(id: string, roomId: string): Promise<void> {
111
+ await this.makeRequest(`/indexes/${roomId}/documents/${id}`, { method: "DELETE" });
112
+ }
113
+ ```
114
+
115
+ **Suppression de toutes les mémoires d’un index**
116
+
117
+ ```typescript
118
+ private async deleteStorage(roomId: string): Promise<void> {
119
+ await this.makeRequest(`/indexes/${roomId}`, { method: "DELETE" });
120
+ }
121
+ ```
122
+
123
+ ***
124
+
125
+ ### **Limitations et considérations**
126
+
127
+ #### **Dépendance à un service externe**
128
+
129
+ Meilisearch nécessite une instance serveur active. Un système exécuté localement doit donc **se connecter à une base distante** ou à **une instance en auto-hébergement**.
130
+
131
+ #### **Latence réseau**
132
+
133
+ Les performances dépendent de la latence du serveur Meilisearch. Pour des besoins de faible latence, une solution comme **Redis** peut être plus adaptée.
134
+
135
+ #### **Consommation mémoire et stockage**
136
+
137
+ Les index doivent être **nettoyés régulièrement**, en particulier si l’agent génère un **grand volume de données**.
138
+
139
+ ***
140
+
141
+ ### **Cas d’usage**&#x20;
142
+
143
+ **`MeilisearchAdapter`** est idéal pour :
144
+
145
+ * **La recherche avancée en langage naturel** dans les logs de l’agent.
146
+ * **L’historisation et la récupération d’interactions** sur le long terme.
147
+ * **La gestion d’une base de connaissances structurée** pour un agent conversationnel.
@@ -0,0 +1,212 @@
1
+ ---
2
+ description: >-
3
+ L’adaptateur Redis utilise une base de données clé-valeur en mémoire, idéale
4
+ pour des stockages rapides et temporaires.
5
+ ---
6
+
7
+ # RedisAdapter
8
+
9
+ `RedisAdapter` intègre **Redis** comme moteur de stockage pour la mémoire des systèmes.&#x20;
10
+
11
+ Redis permet un **accès instantané** aux données grâce à un modèle **clé-valeur**, tout en offrant des fonctionnalités avancées comme **la persistance**, **le TTL (Time-To-Live)** et **la réplication distribuée**.
12
+
13
+ Ce type d’adaptateur est particulièrement adapté aux agents qui nécessitent **des accès ultra-rapides** et une **gestion fine du cycle de vie des mémoires**.
14
+
15
+ ***
16
+
17
+ ### **Spécificités techniques du RedisAdapter**
18
+
19
+ #### **Stockage sous forme de clés structurées**
20
+
21
+ Chaque mémoire est stockée dans Redis avec une clé formée comme suit :
22
+
23
+ ```plaintext
24
+ <memory_prefix>:<room_id>:<memory_id>
25
+ ```
26
+
27
+ Cela permet de **segmenter les mémoires** par `roomId` et d’éviter les collisions.
28
+
29
+ Exemple de stockage d’une mémoire :
30
+
31
+ ```typescript
32
+ const key = `${this.cachePrefix}${memory.roomId}:${memory.id}`;
33
+ await this.redis.set(key, JSON.stringify(memory), { EX: this.cacheTTL });
34
+ ```
35
+
36
+ L’option `{ EX: this.cacheTTL }` définit **une expiration automatique** après un temps défini, évitant ainsi l’accumulation de données obsolètes.
37
+
38
+ ***
39
+
40
+ #### **Initialisation et connexion au serveur Redis**
41
+
42
+ L’adaptateur doit établir une connexion avec un serveur Redis, qui peut être **local, distant ou géré via un service cloud**.
43
+
44
+ ```typescript
45
+ constructor(
46
+ private readonly redisUrl: string,
47
+ options: { cachePrefix?: string; cacheTTL?: number }
48
+ ) {
49
+ this.cachePrefix = options.cachePrefix || "memory:";
50
+ this.cacheTTL = options.cacheTTL || 3600;
51
+ this.redis = createClient({ url: redisUrl });
52
+ }
53
+ ```
54
+
55
+ * `cachePrefix` permet de **différencier plusieurs types de données** stockées dans Redis.
56
+ * `cacheTTL` définit **le temps de rétention** des mémoires (en secondes).
57
+
58
+ **Avantage :** Un système utilisant Redis peut fonctionner sans base de données persistante, en exploitant uniquement la mémoire vive du serveur.
59
+
60
+ ***
61
+
62
+ #### **Création et récupération des mémoires**
63
+
64
+ **Stockage d’une nouvelle mémoire**
65
+
66
+ Chaque entrée est **convertie en JSON** et stockée sous une clé unique dans Redis.
67
+
68
+ ```typescript
69
+ async createMemory(input: CreateMemoryInput & { embedding?: number[] }): Promise<BaseMemoryType | undefined> {
70
+ const memory: BaseMemoryType = {
71
+ id: input.id || crypto.randomUUID(),
72
+ data: input.data,
73
+ embedding: input.embedding,
74
+ roomId: input.roomId,
75
+ createdAt: new Date(),
76
+ };
77
+
78
+ const key = `${this.cachePrefix}${memory.roomId}:${memory.id}`;
79
+ await this.redis.set(key, JSON.stringify(memory), { EX: this.cacheTTL });
80
+
81
+ return memory;
82
+ }
83
+ ```
84
+
85
+ 💡 **Optimisation :** Redis étant une base en RAM, **éviter de stocker des objets volumineux** pour limiter l’impact sur la mémoire.
86
+
87
+ ***
88
+
89
+ **Récupération d’une mémoire**
90
+
91
+ Les entrées sont récupérées en **temps constant** grâce à l’accès clé-valeur.
92
+
93
+ ```typescript
94
+ async getMemoryById(id: string, roomId: string): Promise<BaseMemoryType | null> {
95
+ const key = `${this.cachePrefix}${roomId}:${id}`;
96
+ const data = await this.redis.get(key);
97
+ return data ? JSON.parse(data) : null;
98
+ }
99
+ ```
100
+
101
+ **Temps d’accès :** \~ **1 ms**, bien plus rapide qu’une base de données traditionnelle.
102
+
103
+ ***
104
+
105
+ #### **Recherche et indexation dans Redis**
106
+
107
+ Redis ne supporte pas nativement **les recherches full-text**, mais il est possible de **simuler une indexation** en utilisant **les clés et SCAN MATCH**.
108
+
109
+ ```typescript
110
+ async getMemoryByIndex(query: string, options: { roomId: string; limit?: number }): Promise<BaseMemoryType[]> {
111
+ const pattern = `${this.cachePrefix}${options.roomId}:*`;
112
+ const keys = await this.redis.keys(pattern);
113
+
114
+ const memories = await Promise.all(
115
+ keys.map(async (key) => {
116
+ const data = await this.redis.get(key);
117
+ return data ? JSON.parse(data) : null;
118
+ })
119
+ );
120
+
121
+ return memories.filter(Boolean).slice(0, options.limit || 10);
122
+ }
123
+ ```
124
+
125
+ **Limite :** Redis ne propose pas de scoring de pertinence comme Meilisearch. Les recherches sont basées sur **des correspondances exactes** ou **un filtrage par clé**.
126
+
127
+ ***
128
+
129
+ #### **Suppression et nettoyage de la mémoire**
130
+
131
+ Redis permet une suppression instantanée d’une mémoire spécifique ou d’un ensemble de mémoires.
132
+
133
+ **Suppression d’une mémoire individuelle**
134
+
135
+ ```typescript
136
+ async clearMemoryById(id: string, roomId: string): Promise<void> {
137
+ const key = `${this.cachePrefix}${roomId}:${id}`;
138
+ await this.redis.del(key);
139
+ }
140
+ ```
141
+
142
+ **Suppression de toutes les mémoires d’un agent**
143
+
144
+ ```typescript
145
+ async clearAllMemories(): Promise<void> {
146
+ const keys = await this.redis.keys(`${this.cachePrefix}*`);
147
+ if (keys.length > 0) {
148
+ await this.redis.del(keys);
149
+ }
150
+ }
151
+ ```
152
+
153
+ **Attention :** Cette opération peut être coûteuse si le volume de données est important.
154
+
155
+ ***
156
+
157
+ ### **Limitations et considérations**
158
+
159
+ #### **Dépendance à un service en mémoire volatile**
160
+
161
+ Redis fonctionne en **RAM**, ce qui signifie que **sans mécanisme de persistance activé**, les mémoires stockées peuvent être **perdues en cas de redémarrage**. Par défaut, Redis offre **deux modes de persistance** :
162
+
163
+ * **RDB (Redis Database Snapshot)** : Sauvegarde périodique en dur.
164
+ * **AOF (Append-Only File)** : Journalisation des opérations pour rejouer l’état en cas de crash.\
165
+ Si la mémoire de l’agent doit être **persistante sur le long terme**, il est recommandé d’associer Redis avec **une base durable** comme PostgreSQL ou Meilisearch.
166
+
167
+ #### **Latence ultra-faible mais dépendance au réseau**
168
+
169
+ Redis est **extrêmement rapide** (accès en **O(1)**), mais cette rapidité dépend de **l’emplacement du serveur**.
170
+
171
+ * Un **Redis local** offre **des performances optimales**.
172
+ * Un **Redis distant** introduit une **latence liée au réseau**.\
173
+ Si l’agent est déployé dans un environnement distribué, il est préférable d’**héberger Redis proche de l’instance exécutant l’agent**.
174
+
175
+ #### **Consommation mémoire et TTL obligatoire**
176
+
177
+ Redis stocke **tout en RAM**, ce qui peut poser un problème si un système génère un **grand volume de données**.
178
+
179
+ ⚠ **Sans expiration (TTL), les mémoires s’accumulent et saturent Redis**.
180
+
181
+ Il est **recommandé de fixer une politique d’expiration** (exemple : **stockage des mémoires pour X heures**).
182
+
183
+ Exemple de gestion du TTL :
184
+
185
+ ```typescript
186
+ await this.redis.set(key, JSON.stringify(memory), { EX: 3600 }); // Expire après 1h
187
+ ```
188
+
189
+ Si l’agent doit **conserver son historique sur le long terme**, une solution **persistante (Meilisearch, SQL, stockage objet)** est plus adaptée.
190
+
191
+ #### **Absence de moteur de recherche avancé**
192
+
193
+ Redis **ne supporte pas nativement les recherches full-text ou vectorielles**.
194
+
195
+ * Pour **des recherches sémantiques**, il est préférable d’utiliser **Meilisearch**.
196
+ * Pour **des recherches par similarité**, Redis **peut stocker des embeddings**, mais un moteur spécialisé comme **FAISS ou Weaviate** est plus efficace.
197
+
198
+ #### **Non adapté aux grosses bases historiques**
199
+
200
+ Si le système doit **retrouver des informations sur plusieurs mois/années**, Redis n’est pas une solution idéale.\
201
+ **Recommandation** : Utiliser Redis pour **le stockage temporaire** et exporter les anciennes données vers une **base durable** (Meilisearch/PostgreSQL).
202
+
203
+ ***
204
+
205
+ ### **Cas d’usage adaptés**
206
+
207
+ **`RedisAdapter`** est particulièrement utile pour :&#x20;
208
+
209
+ * **Le caching des réponses d’un agent** pour réduire les appels aux LLMs.
210
+ * **Les sessions temporaires**, où l’état mémoire doit expirer après une période définie.
211
+ * **Les interactions en temps réel**, nécessitant des accès ultra-rapides.
212
+ * **Le stockage intermédiaire** avant synchronisation avec une base plus durable.