@ai.ntellect/core 0.8.3 → 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.
- package/.mocharc.json +2 -1
- package/AGENTS.md +50 -0
- package/ARCHITECTURE.md +58 -0
- package/BENCHMARK.md +38 -0
- package/CHANGELOG.md +224 -0
- package/README.md +413 -199
- package/agent/agent-workflow.ts +569 -0
- package/agent/agent.ts +183 -0
- package/{modules/agent → agent}/base/executor.ts +11 -8
- package/{modules/agent → agent}/base/index.ts +2 -14
- package/agent/entity-resolver/confidence.ts +54 -0
- package/agent/entity-resolver/entity-index.ts +241 -0
- package/agent/entity-resolver/explore-strategy.ts +82 -0
- package/agent/entity-resolver/index.ts +22 -0
- package/agent/entity-resolver/resolver.ts +193 -0
- package/agent/entity-resolver/scorer.ts +211 -0
- package/agent/entity-resolver/types.ts +98 -0
- package/agent/generic-executor.ts +713 -0
- package/agent/handlers/cognitive-handler.ts +197 -0
- package/agent/handlers/index.ts +1 -0
- package/agent/handoff.ts +58 -0
- package/agent/llm-factory.ts +343 -0
- package/agent/orchestrator.ts +45 -0
- package/{modules/agent → agent}/prompt-builder.ts +1 -1
- package/agent/registry.ts +64 -0
- package/agent/tools/file-system.ts +471 -0
- package/agent/tools/index.ts +23 -0
- package/agent/tools/logger.ts +105 -0
- package/agent/tools/tool-resolver.ts +104 -0
- package/benchmark/cortexflow-workflow.ts +182 -0
- package/benchmark/langgraph-workflow.ts +201 -0
- package/benchmark/llm-client.ts +76 -0
- package/benchmark/run-benchmark.ts +222 -0
- package/cli-dev.ts +419 -0
- package/dist/agent/agent-workflow.d.ts +41 -0
- package/dist/agent/agent-workflow.d.ts.map +1 -0
- package/dist/agent/agent-workflow.js +560 -0
- package/dist/agent/agent-workflow.js.map +1 -0
- package/dist/agent/agent.d.ts +38 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +149 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/{modules/agent → agent}/base/executor.d.ts +3 -3
- package/dist/agent/base/executor.d.ts.map +1 -0
- package/dist/{modules/agent → agent}/base/executor.js +8 -5
- package/dist/agent/base/executor.js.map +1 -0
- package/dist/{modules/agent → agent}/base/index.d.ts +1 -1
- package/dist/agent/base/index.d.ts.map +1 -0
- package/dist/{modules/agent → agent}/base/index.js +0 -12
- package/dist/agent/base/index.js.map +1 -0
- package/dist/agent/entity-resolver/confidence.d.ts +4 -0
- package/dist/agent/entity-resolver/confidence.d.ts.map +1 -0
- package/dist/agent/entity-resolver/confidence.js +47 -0
- package/dist/agent/entity-resolver/confidence.js.map +1 -0
- package/dist/agent/entity-resolver/entity-index.d.ts +40 -0
- package/dist/agent/entity-resolver/entity-index.d.ts.map +1 -0
- package/dist/agent/entity-resolver/entity-index.js +244 -0
- package/dist/agent/entity-resolver/entity-index.js.map +1 -0
- package/dist/agent/entity-resolver/explore-strategy.d.ts +13 -0
- package/dist/agent/entity-resolver/explore-strategy.d.ts.map +1 -0
- package/dist/agent/entity-resolver/explore-strategy.js +109 -0
- package/dist/agent/entity-resolver/explore-strategy.js.map +1 -0
- package/dist/agent/entity-resolver/index.d.ts +8 -0
- package/dist/agent/entity-resolver/index.d.ts.map +1 -0
- package/dist/agent/entity-resolver/index.js +16 -0
- package/dist/agent/entity-resolver/index.js.map +1 -0
- package/dist/agent/entity-resolver/resolver.d.ts +18 -0
- package/dist/agent/entity-resolver/resolver.d.ts.map +1 -0
- package/dist/agent/entity-resolver/resolver.js +158 -0
- package/dist/agent/entity-resolver/resolver.js.map +1 -0
- package/dist/agent/entity-resolver/scorer.d.ts +3 -0
- package/dist/agent/entity-resolver/scorer.d.ts.map +1 -0
- package/dist/agent/entity-resolver/scorer.js +182 -0
- package/dist/agent/entity-resolver/scorer.js.map +1 -0
- package/dist/agent/entity-resolver/types.d.ts +89 -0
- package/dist/agent/entity-resolver/types.d.ts.map +1 -0
- package/dist/agent/entity-resolver/types.js +3 -0
- package/dist/agent/entity-resolver/types.js.map +1 -0
- package/dist/{modules/agent → agent}/generic-executor.d.ts +37 -27
- package/dist/agent/generic-executor.d.ts.map +1 -0
- package/dist/agent/generic-executor.js +620 -0
- package/dist/agent/generic-executor.js.map +1 -0
- package/dist/agent/handlers/cognitive-handler.d.ts +44 -0
- package/dist/agent/handlers/cognitive-handler.d.ts.map +1 -0
- package/dist/agent/handlers/cognitive-handler.js +172 -0
- package/dist/agent/handlers/cognitive-handler.js.map +1 -0
- package/dist/agent/handlers/index.d.ts +2 -0
- package/dist/agent/handlers/index.d.ts.map +1 -0
- package/dist/agent/handlers/index.js +7 -0
- package/dist/agent/handlers/index.js.map +1 -0
- package/dist/agent/handoff.d.ts +12 -0
- package/dist/agent/handoff.d.ts.map +1 -0
- package/dist/agent/handoff.js +62 -0
- package/dist/agent/handoff.js.map +1 -0
- package/dist/agent/llm-factory.d.ts.map +1 -0
- package/dist/agent/llm-factory.js +297 -0
- package/dist/agent/llm-factory.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +18 -0
- package/dist/agent/orchestrator.d.ts.map +1 -0
- package/dist/agent/orchestrator.js +44 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/{modules/agent → agent}/prompt-builder.d.ts +1 -1
- package/dist/agent/prompt-builder.d.ts.map +1 -0
- package/dist/agent/prompt-builder.js.map +1 -0
- package/dist/agent/registry.d.ts +19 -0
- package/dist/agent/registry.d.ts.map +1 -0
- package/dist/agent/registry.js +48 -0
- package/dist/agent/registry.js.map +1 -0
- package/dist/agent/tools/file-system.d.ts +11 -0
- package/dist/agent/tools/file-system.d.ts.map +1 -0
- package/dist/agent/tools/file-system.js +528 -0
- package/dist/agent/tools/file-system.js.map +1 -0
- package/dist/agent/tools/index.d.ts +4 -0
- package/dist/agent/tools/index.d.ts.map +1 -0
- package/dist/agent/tools/index.js +20 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/tools/logger.d.ts +33 -0
- package/dist/agent/tools/logger.d.ts.map +1 -0
- package/dist/agent/tools/logger.js +86 -0
- package/dist/agent/tools/logger.js.map +1 -0
- package/dist/agent/tools/tool-resolver.d.ts +7 -0
- package/dist/agent/tools/tool-resolver.d.ts.map +1 -0
- package/dist/agent/tools/tool-resolver.js +122 -0
- package/dist/agent/tools/tool-resolver.js.map +1 -0
- package/dist/execution/adapters/in-memory-checkpoint.d.ts +11 -0
- package/dist/execution/adapters/in-memory-checkpoint.d.ts.map +1 -0
- package/dist/execution/adapters/in-memory-checkpoint.js +54 -0
- package/dist/execution/adapters/in-memory-checkpoint.js.map +1 -0
- package/dist/execution/compiler.d.ts +8 -0
- package/dist/execution/compiler.d.ts.map +1 -0
- package/dist/execution/compiler.js +50 -0
- package/dist/execution/compiler.js.map +1 -0
- package/dist/execution/controller.d.ts.map +1 -0
- package/dist/execution/controller.js.map +1 -0
- package/dist/execution/event-manager.d.ts +29 -0
- package/dist/execution/event-manager.d.ts.map +1 -0
- package/dist/{graph → execution}/event-manager.js +4 -114
- package/dist/execution/event-manager.js.map +1 -0
- package/dist/{graph → execution}/index.d.ts +50 -2
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +638 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/logger.d.ts.map +1 -0
- package/dist/execution/logger.js.map +1 -0
- package/dist/{graph → execution}/node.d.ts +6 -1
- package/dist/execution/node.d.ts.map +1 -0
- package/dist/{graph → execution}/node.js +83 -10
- package/dist/execution/node.js.map +1 -0
- package/dist/execution/observer.d.ts.map +1 -0
- package/dist/execution/observer.js.map +1 -0
- package/dist/execution/planner.d.ts +14 -0
- package/dist/execution/planner.d.ts.map +1 -0
- package/dist/execution/planner.js +43 -0
- package/dist/execution/planner.js.map +1 -0
- package/dist/execution/reducer.d.ts +19 -0
- package/dist/execution/reducer.d.ts.map +1 -0
- package/dist/execution/reducer.js +61 -0
- package/dist/execution/reducer.js.map +1 -0
- package/dist/execution/registry.d.ts +38 -0
- package/dist/execution/registry.d.ts.map +1 -0
- package/dist/execution/registry.js +63 -0
- package/dist/execution/registry.js.map +1 -0
- package/dist/execution/send-api.d.ts +24 -0
- package/dist/execution/send-api.d.ts.map +1 -0
- package/dist/execution/send-api.js +52 -0
- package/dist/execution/send-api.js.map +1 -0
- package/dist/execution/types.parallel.d.ts +61 -0
- package/dist/execution/types.parallel.d.ts.map +1 -0
- package/dist/execution/types.parallel.js +3 -0
- package/dist/execution/types.parallel.js.map +1 -0
- package/dist/execution/visualizer.d.ts.map +1 -0
- package/dist/execution/visualizer.js.map +1 -0
- package/dist/index.d.ts +27 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -8
- package/dist/index.js.map +1 -1
- package/dist/interfaces/index.d.ts +32 -1
- package/dist/interfaces/index.d.ts.map +1 -1
- package/dist/interfaces/index.js.map +1 -1
- package/dist/modules/cli/index.d.ts +13 -0
- package/dist/modules/cli/index.d.ts.map +1 -0
- package/dist/modules/cli/index.js +672 -0
- package/dist/modules/cli/index.js.map +1 -0
- package/dist/modules/nlp/engine.d.ts.map +1 -1
- package/dist/modules/nlp/engine.js +0 -1
- package/dist/modules/nlp/engine.js.map +1 -1
- package/dist/persistence/index.d.ts +12 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +24 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/neo4j/driver.d.ts +26 -0
- package/dist/persistence/neo4j/driver.d.ts.map +1 -0
- package/dist/persistence/neo4j/driver.js +64 -0
- package/dist/persistence/neo4j/driver.js.map +1 -0
- package/dist/persistence/neo4j/entity-store.d.ts +15 -0
- package/dist/persistence/neo4j/entity-store.d.ts.map +1 -0
- package/dist/persistence/neo4j/entity-store.js +136 -0
- package/dist/persistence/neo4j/entity-store.js.map +1 -0
- package/dist/persistence/neo4j/execution-tracer.d.ts +19 -0
- package/dist/persistence/neo4j/execution-tracer.d.ts.map +1 -0
- package/dist/persistence/neo4j/execution-tracer.js +166 -0
- package/dist/persistence/neo4j/execution-tracer.js.map +1 -0
- package/dist/persistence/neo4j/memory-adapter.d.ts +35 -0
- package/dist/persistence/neo4j/memory-adapter.d.ts.map +1 -0
- package/dist/persistence/neo4j/memory-adapter.js +252 -0
- package/dist/persistence/neo4j/memory-adapter.js.map +1 -0
- package/dist/persistence/neo4j/petri-checkpoint-adapter.d.ts +22 -0
- package/dist/persistence/neo4j/petri-checkpoint-adapter.d.ts.map +1 -0
- package/dist/persistence/neo4j/petri-checkpoint-adapter.js +141 -0
- package/dist/persistence/neo4j/petri-checkpoint-adapter.js.map +1 -0
- package/dist/pipeline/agent-pipeline.d.ts +99 -0
- package/dist/pipeline/agent-pipeline.d.ts.map +1 -0
- package/dist/pipeline/agent-pipeline.js +356 -0
- package/dist/pipeline/agent-pipeline.js.map +1 -0
- package/dist/routing/checkpoint-adapter.d.ts +30 -0
- package/dist/routing/checkpoint-adapter.d.ts.map +1 -0
- package/dist/routing/checkpoint-adapter.js +83 -0
- package/dist/routing/checkpoint-adapter.js.map +1 -0
- package/dist/routing/documentation-generator.d.ts +47 -0
- package/dist/routing/documentation-generator.d.ts.map +1 -0
- package/dist/routing/documentation-generator.js +320 -0
- package/dist/routing/documentation-generator.js.map +1 -0
- package/dist/routing/index.d.ts +38 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +375 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/intent-classifier.d.ts +206 -0
- package/dist/routing/intent-classifier.d.ts.map +1 -0
- package/dist/routing/intent-classifier.js +267 -0
- package/dist/routing/intent-classifier.js.map +1 -0
- package/dist/routing/matrix.d.ts +6 -0
- package/dist/routing/matrix.d.ts.map +1 -0
- package/dist/routing/matrix.js +131 -0
- package/dist/routing/matrix.js.map +1 -0
- package/dist/routing/orchestrator.d.ts +87 -0
- package/dist/routing/orchestrator.d.ts.map +1 -0
- package/dist/routing/orchestrator.js +425 -0
- package/dist/routing/orchestrator.js.map +1 -0
- package/dist/routing/postgres-checkpoint-adapter.d.ts +32 -0
- package/dist/routing/postgres-checkpoint-adapter.d.ts.map +1 -0
- package/dist/routing/postgres-checkpoint-adapter.js +167 -0
- package/dist/routing/postgres-checkpoint-adapter.js.map +1 -0
- package/dist/routing/redis-checkpoint-adapter.d.ts +34 -0
- package/dist/routing/redis-checkpoint-adapter.d.ts.map +1 -0
- package/dist/routing/redis-checkpoint-adapter.js +170 -0
- package/dist/routing/redis-checkpoint-adapter.js.map +1 -0
- package/dist/routing/types.d.ts +49 -0
- package/dist/routing/types.d.ts.map +1 -0
- package/dist/routing/types.js +3 -0
- package/dist/routing/types.js.map +1 -0
- package/dist/types/agent.d.ts +144 -88
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +49 -0
- package/dist/types/agent.js.map +1 -1
- package/dist/types/index.d.ts +46 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/generate-action-schema.d.ts +2 -3
- package/dist/utils/generate-action-schema.d.ts.map +1 -1
- package/dist/utils/generate-action-schema.js +3 -1
- package/dist/utils/generate-action-schema.js.map +1 -1
- package/dist/utils/logger.d.ts +27 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +45 -0
- package/dist/utils/logger.js.map +1 -0
- package/docs/.gitbook/assets/image (1).png +0 -0
- package/docs/.gitbook/assets/image (2).png +0 -0
- package/docs/.gitbook/assets/image (3).png +0 -0
- package/docs/.gitbook/assets/image (4).png +0 -0
- package/docs/.gitbook/assets/image (5).png +0 -0
- package/docs/.gitbook/assets/image (6).png +0 -0
- package/docs/.gitbook/assets/image.png +0 -0
- package/docs/README.md +57 -0
- package/docs/SUMMARY.md +34 -0
- package/docs/cas-dusages.md +69 -0
- package/docs/cli/README.md +65 -0
- package/docs/concepts-cles.md +50 -0
- package/docs/core/architecture.md +87 -0
- package/docs/core/benchmark.md +59 -0
- package/docs/core/checkpoint.md +72 -0
- package/docs/core/documentation.md +55 -0
- package/docs/core/graphcontroller.md +63 -0
- package/docs/core/graphflow.md +137 -0
- package/docs/core/introduction.md +41 -0
- package/docs/core/les-evenements.md +95 -0
- package/docs/modules/agenda/README.md +63 -0
- package/docs/modules/agenda/interface-iagenda.md +170 -0
- package/docs/modules/agenda/les-adaptateurs/README.md +237 -0
- package/docs/modules/agenda/les-adaptateurs/nodecronadapter.md +91 -0
- package/docs/modules/introduction.md +55 -0
- package/docs/modules/les-adaptateurs.md +52 -0
- package/docs/modules/memoire/README.md +68 -0
- package/docs/modules/memoire/interface-imemory.md +183 -0
- package/docs/modules/memoire/les-adaptateurs/README.md +209 -0
- package/docs/modules/memoire/les-adaptateurs/inmemoryadapter.md +110 -0
- package/docs/modules/memoire/les-adaptateurs/meilisearchadapter.md +147 -0
- package/docs/modules/memoire/les-adaptateurs/redisadapter.md +212 -0
- package/docs/modules/nlp/README.md +44 -0
- package/docs/philosophie.md +51 -0
- package/docs/tutoriels/ajouter-des-conditions.md +150 -0
- package/docs/tutoriels/branching.md +194 -0
- package/docs/tutoriels/checkpoint-usage.md +99 -0
- package/docs/tutoriels/creer-agent-onchain.md +1041 -0
- package/docs/tutoriels/creer-un-agent.md +108 -0
- package/docs/tutoriels/creer-un-graphe-simple.md +92 -0
- package/docs/tutoriels/gerer-les-erreurs.md +124 -0
- package/docs/tutoriels/pour-commencer.md +73 -0
- package/docs/tutoriels/retry.md +166 -0
- package/execution/adapters/in-memory-checkpoint.ts +35 -0
- package/execution/compiler.ts +47 -0
- package/{graph → execution}/event-manager.ts +4 -117
- package/{graph → execution}/index.ts +376 -8
- package/{graph → execution}/node.ts +116 -12
- package/execution/planner.ts +40 -0
- package/execution/reducer.ts +73 -0
- package/execution/registry.ts +86 -0
- package/execution/send-api.ts +58 -0
- package/execution/types.parallel.ts +81 -0
- package/index.ts +35 -8
- package/interfaces/index.ts +37 -0
- package/modules/cli/index.ts +580 -0
- package/modules/nlp/engine.ts +0 -1
- package/package.json +50 -16
- package/persistence/index.ts +27 -0
- package/persistence/neo4j/driver.ts +34 -0
- package/persistence/neo4j/entity-store.ts +141 -0
- package/persistence/neo4j/execution-tracer.ts +194 -0
- package/persistence/neo4j/memory-adapter.ts +281 -0
- package/persistence/neo4j/petri-checkpoint-adapter.ts +153 -0
- package/pipeline/agent-pipeline.ts +426 -0
- package/routing/checkpoint-adapter.ts +79 -0
- package/routing/documentation-generator.ts +358 -0
- package/routing/index.ts +459 -0
- package/routing/intent-classifier.ts +360 -0
- package/routing/matrix.ts +138 -0
- package/routing/orchestrator.ts +498 -0
- package/routing/patterns/data-extraction.json +79 -0
- package/routing/patterns/human-approval.json +64 -0
- package/routing/patterns/rag-search.json +68 -0
- package/routing/postgres-checkpoint-adapter.ts +172 -0
- package/routing/redis-checkpoint-adapter.ts +187 -0
- package/routing/types.ts +59 -0
- package/routing/web-server.ts +260 -0
- package/scripts/generate-petri-docs.ts +70 -0
- package/scripts/get-gmail-token.js +65 -0
- package/scripts/get-gmail-token.ts +65 -0
- package/test/agent/agent.test.ts +92 -0
- package/test/agent/clone.test.ts +143 -0
- package/test/agent/cognitive-handler.test.ts +78 -0
- package/test/agent/entity-store.test.ts +80 -0
- package/test/agent/generic-executor.test.ts +230 -0
- package/test/agent/handoff.test.ts +163 -0
- package/test/agent/llm-factory.test.ts +40 -0
- package/test/agent/orchestrator.test.ts +156 -0
- package/test/agent/registry.test.ts +97 -0
- package/test/agent/tools.test.ts +267 -0
- package/test/execution/checkpoint.test.ts +811 -0
- package/test/{graph → execution}/controller.test.ts +2 -2
- package/test/{graph → execution}/event-manager.test.ts +1 -1
- package/test/{graph → execution}/index.test.ts +24 -15
- package/test/{graph → execution}/node.test.ts +3 -3
- package/test/{graph → execution}/observer.test.ts +2 -2
- package/test/execution/parallel.test.ts +135 -0
- package/test/execution/plan-llm-integration.test.ts +290 -0
- package/test/execution/plan-real-onchain.test.ts +226 -0
- package/test/execution/send-api.test.ts +121 -0
- package/test/modules/cli/index.test.ts +125 -0
- package/test/persistence/neo4j-execution-tracer.test.ts +96 -0
- package/test/persistence/neo4j-memory-adapter.test.ts +107 -0
- package/test/persistence/neo4j-petri-checkpoint.test.ts +89 -0
- package/test/pipeline/agent-pipeline.test.ts +118 -0
- package/test/routing/checkpoint-persistence.test.ts +58 -0
- package/test/routing/documentation-generator.test.ts +76 -0
- package/test/routing/integration.test.ts +261 -0
- package/test/routing/intent-classifier.test.ts +102 -0
- package/test/routing/petri.test.ts +156 -0
- package/test/routing/real-llm.test.ts +260 -0
- package/test-petri-features.ts +218 -0
- package/test-pipeline-api.ts +163 -0
- package/tsconfig.json +5 -2
- package/types/agent.ts +126 -4
- package/types/index.ts +66 -5
- package/utils/generate-action-schema.ts +5 -4
- package/utils/logger.ts +40 -0
- package/dist/graph/controller.d.ts.map +0 -1
- package/dist/graph/controller.js.map +0 -1
- package/dist/graph/event-manager.d.ts +0 -101
- package/dist/graph/event-manager.d.ts.map +0 -1
- package/dist/graph/event-manager.js.map +0 -1
- package/dist/graph/index.d.ts.map +0 -1
- package/dist/graph/index.js +0 -340
- package/dist/graph/index.js.map +0 -1
- package/dist/graph/logger.d.ts.map +0 -1
- package/dist/graph/logger.js.map +0 -1
- package/dist/graph/node.d.ts.map +0 -1
- package/dist/graph/node.js.map +0 -1
- package/dist/graph/observer.d.ts.map +0 -1
- package/dist/graph/observer.js.map +0 -1
- package/dist/graph/visualizer.d.ts.map +0 -1
- package/dist/graph/visualizer.js.map +0 -1
- package/dist/modules/agent/agent.d.ts +0 -35
- package/dist/modules/agent/agent.d.ts.map +0 -1
- package/dist/modules/agent/agent.js +0 -103
- package/dist/modules/agent/agent.js.map +0 -1
- package/dist/modules/agent/base/executor.d.ts.map +0 -1
- package/dist/modules/agent/base/executor.js.map +0 -1
- package/dist/modules/agent/base/index.d.ts.map +0 -1
- package/dist/modules/agent/base/index.js.map +0 -1
- package/dist/modules/agent/generic-assistant.d.ts +0 -20
- package/dist/modules/agent/generic-assistant.d.ts.map +0 -1
- package/dist/modules/agent/generic-assistant.js +0 -89
- package/dist/modules/agent/generic-assistant.js.map +0 -1
- package/dist/modules/agent/generic-executor.d.ts.map +0 -1
- package/dist/modules/agent/generic-executor.js +0 -189
- package/dist/modules/agent/generic-executor.js.map +0 -1
- package/dist/modules/agent/llm-factory.d.ts.map +0 -1
- package/dist/modules/agent/llm-factory.js +0 -56
- package/dist/modules/agent/llm-factory.js.map +0 -1
- package/dist/modules/agent/prompt-builder.d.ts.map +0 -1
- package/dist/modules/agent/prompt-builder.js.map +0 -1
- package/dist/modules/memory/adapters/in-memory/index.d.ts +0 -120
- package/dist/modules/memory/adapters/in-memory/index.d.ts.map +0 -1
- package/dist/modules/memory/adapters/in-memory/index.js +0 -212
- package/dist/modules/memory/adapters/in-memory/index.js.map +0 -1
- package/dist/modules/memory/adapters/meilisearch/index.d.ts +0 -110
- package/dist/modules/memory/adapters/meilisearch/index.d.ts.map +0 -1
- package/dist/modules/memory/adapters/meilisearch/index.js +0 -324
- package/dist/modules/memory/adapters/meilisearch/index.js.map +0 -1
- package/dist/modules/memory/adapters/redis/index.d.ts +0 -82
- package/dist/modules/memory/adapters/redis/index.d.ts.map +0 -1
- package/dist/modules/memory/adapters/redis/index.js +0 -160
- package/dist/modules/memory/adapters/redis/index.js.map +0 -1
- package/dist/modules/memory/index.d.ts +0 -67
- package/dist/modules/memory/index.d.ts.map +0 -1
- package/dist/modules/memory/index.js +0 -104
- package/dist/modules/memory/index.js.map +0 -1
- package/modules/agent/agent.ts +0 -107
- package/modules/agent/generic-assistant.ts +0 -92
- package/modules/agent/generic-executor.ts +0 -252
- package/modules/agent/llm-factory.ts +0 -47
- package/modules/memory/adapters/in-memory/index.ts +0 -208
- package/modules/memory/adapters/meilisearch/index.ts +0 -364
- package/modules/memory/adapters/redis/index.ts +0 -165
- package/modules/memory/index.ts +0 -93
- package/test/modules/memory/adapters/in-memory.test.ts +0 -153
- package/test/modules/memory/adapters/meilisearch.test.ts +0 -287
- package/test/modules/memory/base.test.ts +0 -230
- /package/dist/{modules/agent → agent}/llm-factory.d.ts +0 -0
- /package/dist/{modules/agent → agent}/prompt-builder.js +0 -0
- /package/dist/{graph → execution}/controller.d.ts +0 -0
- /package/dist/{graph → execution}/controller.js +0 -0
- /package/dist/{graph → execution}/logger.d.ts +0 -0
- /package/dist/{graph → execution}/logger.js +0 -0
- /package/dist/{graph → execution}/observer.d.ts +0 -0
- /package/dist/{graph → execution}/observer.js +0 -0
- /package/dist/{graph → execution}/visualizer.d.ts +0 -0
- /package/dist/{graph → execution}/visualizer.js +0 -0
- /package/{graph → execution}/controller.ts +0 -0
- /package/{graph → execution}/logger.ts +0 -0
- /package/{graph → execution}/observer.ts +0 -0
- /package/{graph → execution}/visualizer.ts +0 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
L'interface IMemory définit une abstraction pour stocker, rechercher et gérer
|
|
4
|
+
des entrées mémorielles
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Interface IMemory
|
|
8
|
+
|
|
9
|
+
L'interface `IMemory` définit une abstraction pour **stocker, rechercher et gérer des entrées mémorielles** dans un environnement où un agent doit retenir des informations sur le long terme ou pour des sessions temporaires.
|
|
10
|
+
|
|
11
|
+
Ce module suit une **approche modulaire et agnostique** du backend, permettant d’être implémenté avec différents moteurs de stockage :
|
|
12
|
+
|
|
13
|
+
* **Stockage en mémoire** (`InMemoryAdapter`)
|
|
14
|
+
* **Base de données** (`MeilisearchAdapter`, `RedisAdapter`, `PostgreSQLAdapter`)
|
|
15
|
+
* **Stockage distribué** (`VectorDBAdapter`, `PineconeAdapter`)
|
|
16
|
+
|
|
17
|
+
***
|
|
18
|
+
|
|
19
|
+
### **Objectif de l'interface**
|
|
20
|
+
|
|
21
|
+
L'interface `IMemory` doit permettre :
|
|
22
|
+
|
|
23
|
+
* **Le stockage structuré et sécurisé d'informations** persistantes ou temporaires.
|
|
24
|
+
* **Une récupération rapide** avec support des **requêtes sémantiques** (recherche par similarité).
|
|
25
|
+
* **La gestion dynamique du cycle de vie des mémoires** (création, expiration, suppression).
|
|
26
|
+
* **L’adaptabilité à différents backends**, grâce aux `IMemoryAdapter` interchangeables.
|
|
27
|
+
|
|
28
|
+
***
|
|
29
|
+
|
|
30
|
+
### **Définition de l’interface**
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
/**
|
|
34
|
+
* Interface pour la gestion de la mémoire d'un agent
|
|
35
|
+
*/
|
|
36
|
+
export interface IMemory {
|
|
37
|
+
/**
|
|
38
|
+
* Initialise le service mémoire avec les configurations requises
|
|
39
|
+
* @returns {Promise<void>}
|
|
40
|
+
*/
|
|
41
|
+
init(): Promise<void>;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Crée une nouvelle entrée mémoire.
|
|
45
|
+
* @param {MemoryInput} input - Données de la mémoire à enregistrer.
|
|
46
|
+
* @returns {Promise<MemoryEntry | undefined>} Retourne l’entrée créée, ou `undefined` en cas d’échec.
|
|
47
|
+
*/
|
|
48
|
+
createMemory(input: MemoryInput): Promise<MemoryEntry | undefined>;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Récupère une entrée mémoire par son identifiant.
|
|
52
|
+
* @param {string} id - Identifiant unique de la mémoire.
|
|
53
|
+
* @param {string} roomId - Identifiant de la session ou du contexte.
|
|
54
|
+
* @returns {Promise<MemoryEntry | null>} Retourne l'entrée mémoire si trouvée, sinon `null`.
|
|
55
|
+
*/
|
|
56
|
+
getMemoryById(id: string, roomId: string): Promise<MemoryEntry | null>;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Effectue une recherche d’entrées mémoire selon une requête textuelle.
|
|
60
|
+
* @param {string} query - Texte de la requête.
|
|
61
|
+
* @param {MemorySearchOptions} options - Options de recherche.
|
|
62
|
+
* @returns {Promise<MemoryEntry[]>} Retourne une liste d'entrées mémorielles correspondantes.
|
|
63
|
+
*/
|
|
64
|
+
searchMemory(
|
|
65
|
+
query: string,
|
|
66
|
+
options: MemorySearchOptions
|
|
67
|
+
): Promise<MemoryEntry[]>;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Récupère toutes les mémoires associées à un `roomId`.
|
|
71
|
+
* @param {string} roomId - Identifiant de la session.
|
|
72
|
+
* @returns {Promise<MemoryEntry[]>} Liste des entrées mémorielles.
|
|
73
|
+
*/
|
|
74
|
+
getAllMemories(roomId: string): Promise<MemoryEntry[]>;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Supprime une entrée mémoire spécifique.
|
|
78
|
+
* @param {string} id - Identifiant de la mémoire.
|
|
79
|
+
* @param {string} roomId - Identifiant de la session.
|
|
80
|
+
* @returns {Promise<void>}
|
|
81
|
+
*/
|
|
82
|
+
deleteMemoryById(id: string, roomId: string): Promise<void>;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Supprime toutes les entrées mémorielles d'un `roomId`.
|
|
86
|
+
* @param {string} roomId - Identifiant de la session.
|
|
87
|
+
* @returns {Promise<void>}
|
|
88
|
+
*/
|
|
89
|
+
clearMemories(roomId: string): Promise<void>;
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
***
|
|
94
|
+
|
|
95
|
+
### **Interfaces associées**
|
|
96
|
+
|
|
97
|
+
#### **1. `MemoryInput` : Données pour une nouvelle entrée mémoire**
|
|
98
|
+
|
|
99
|
+
Lorsqu’une nouvelle mémoire est créée, elle doit suivre une structure bien définie.
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
/**
|
|
103
|
+
* Données nécessaires pour créer une mémoire
|
|
104
|
+
*/
|
|
105
|
+
export interface MemoryInput {
|
|
106
|
+
/** Identifiant unique de la mémoire (optionnel, généré si absent) */
|
|
107
|
+
id?: string;
|
|
108
|
+
/** Contenu textuel de la mémoire */
|
|
109
|
+
data: string;
|
|
110
|
+
/** Identifiant de la session ou du contexte */
|
|
111
|
+
roomId: string;
|
|
112
|
+
/** (Optionnel) Vecteur d’embedding pour recherche sémantique */
|
|
113
|
+
embedding?: number[];
|
|
114
|
+
/** Date d’expiration (TTL) */
|
|
115
|
+
expiresAt?: Date;
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
#### **2. `MemoryEntry` : Représentation d’une mémoire stockée**
|
|
120
|
+
|
|
121
|
+
Une mémoire active stockée doit être représentée sous cette forme.
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
/**
|
|
125
|
+
* Représentation d'une mémoire stockée
|
|
126
|
+
*/
|
|
127
|
+
export interface MemoryEntry extends MemoryInput {
|
|
128
|
+
/** Identifiant unique attribué à la mémoire */
|
|
129
|
+
id: string;
|
|
130
|
+
/** Date de création de la mémoire */
|
|
131
|
+
createdAt: Date;
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
#### **3. `MemorySearchOptions` : Options de recherche avancées**
|
|
136
|
+
|
|
137
|
+
La recherche mémoire peut inclure des critères supplémentaires pour affiner les résultats.
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
/**
|
|
141
|
+
* Options de recherche pour requêtes mémoire
|
|
142
|
+
*/
|
|
143
|
+
export interface MemorySearchOptions {
|
|
144
|
+
/** Identifiant du contexte de recherche */
|
|
145
|
+
roomId: string;
|
|
146
|
+
/** Nombre maximal de résultats */
|
|
147
|
+
limit?: number;
|
|
148
|
+
/** Score minimal de similarité si une recherche sémantique est utilisée */
|
|
149
|
+
minSimilarity?: number;
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
***
|
|
154
|
+
|
|
155
|
+
### **Pourquoi cette interface ?**
|
|
156
|
+
|
|
157
|
+
L’interface `IMemory` permet une **gestion optimisée et évolutive** des données mémoire :
|
|
158
|
+
|
|
159
|
+
1. **Abstraction complète du moteur de stockage**
|
|
160
|
+
* Permet d’implémenter `IMemory` avec **n’importe quel backend** (`Redis`, `PostgreSQL`, `VectorDB`, etc.).
|
|
161
|
+
* Découple la **logique métier** de la **logique de persistance**.
|
|
162
|
+
2. **Support des recherches sémantiques**
|
|
163
|
+
* Les données peuvent être indexées sous forme de **vecteurs** (`embedding`).
|
|
164
|
+
* Permet des recherches avancées **par similarité** et non uniquement par mots-clés.
|
|
165
|
+
3. **Modèle flexible et dynamique**
|
|
166
|
+
* Gestion **multi-sessions (`roomId`)** pour segmenter la mémoire selon les contextes.
|
|
167
|
+
* Prise en charge d’un **TTL** (`expiresAt`) pour éviter l’accumulation inutile de données.
|
|
168
|
+
4. **Extensibilité via des adaptateurs (`IMemoryAdapter`)**
|
|
169
|
+
* Compatible avec **des moteurs de stockage externes** (`Meilisearch`, `Pinecone`, etc.).
|
|
170
|
+
* Possibilité d’intégrer **plusieurs sources de mémoire** (ex: mémoire immédiate + historique long-terme).
|
|
171
|
+
|
|
172
|
+
***
|
|
173
|
+
|
|
174
|
+
### **Cas d’usage**
|
|
175
|
+
|
|
176
|
+
L’interface `IMemory` peut être utilisée dans plusieurs scénarios :
|
|
177
|
+
|
|
178
|
+
| **Cas d'usage** | **Exemple** |
|
|
179
|
+
| --------------------------------- | ---------------------------------------------------------------- |
|
|
180
|
+
| Stockage d’historique utilisateur | Mémorisation des interactions d’un chatbot avec un utilisateur. |
|
|
181
|
+
| Recherche sémantique | Trouver des documents ou réponses similaires à une requête. |
|
|
182
|
+
| Maintien du contexte | Conserver un état conversationnel pour un agent autonome. |
|
|
183
|
+
| Mémoire dynamique | Stocker temporairement des informations utiles dans un `roomId`. |
|
|
@@ -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** 
|
|
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. 
|
|
@@ -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. 
|
|
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** 
|
|
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.
|