memmachine-server 0.3.8__tar.gz → 0.4.0__tar.gz

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 (386) hide show
  1. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/PKG-INFO +10 -8
  2. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/pyproject.toml +26 -7
  3. memmachine_server-0.4.0/server_tests/memmachine_server/common/api/test_version.py +8 -0
  4. memmachine_server-0.4.0/server_tests/memmachine_server/common/configuration/test_configuration.py +457 -0
  5. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/configuration/test_database_conf.py +64 -7
  6. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/configuration/test_mixin_confs.py +1 -1
  7. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/configuration/test_semantic_conf.py +39 -0
  8. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/embedder/test_openai_embedder.py +42 -2
  9. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/episode_store/test_count_caching_episode_storage.py +4 -2
  10. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/episode_store/test_episode_model.py +30 -3
  11. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/episode_store/test_episode_storage.py +245 -13
  12. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/episode_store/test_sqlalchemy_episode_store_startup.py +12 -2
  13. memmachine_server-0.4.0/server_tests/memmachine_server/common/episode_store/test_uuid_contract.py +45 -0
  14. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/filter/test_filter_parser.py +31 -0
  15. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/filter/test_sql_filter_util.py +16 -0
  16. memmachine_server-0.4.0/server_tests/memmachine_server/common/language_model/test_litellm_language_model.py +324 -0
  17. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/language_model/test_openai_chat_completions_language_model.py +4 -6
  18. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/language_model/test_openai_responses_language_model.py +4 -6
  19. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/resource_manager/test_database_manager.py +211 -9
  20. memmachine_server-0.4.0/server_tests/memmachine_server/common/resource_manager/test_metrics_factory_wiring.py +178 -0
  21. memmachine_server-0.4.0/server_tests/memmachine_server/common/resource_manager/test_resource_manager.py +380 -0
  22. memmachine_server-0.4.0/server_tests/memmachine_server/common/resource_manager/test_semantic_manager_config_storage.py +27 -0
  23. memmachine_server-0.4.0/server_tests/memmachine_server/common/resource_manager/test_semantic_manager_vector_store.py +54 -0
  24. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/session_manager/test_session_manager.py +60 -27
  25. memmachine_server-0.4.0/server_tests/memmachine_server/common/sql_lease_lock/test_postgres.py +83 -0
  26. memmachine_server-0.4.0/server_tests/memmachine_server/common/sql_lease_lock/test_service.py +874 -0
  27. memmachine_server-0.4.0/server_tests/memmachine_server/common/test_neo4j_utils.py +33 -0
  28. memmachine_server-0.4.0/server_tests/memmachine_server/common/vector_store/test_milvus_vector_store.py +557 -0
  29. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/vector_store/test_qdrant_vector_store.py +117 -91
  30. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/conftest.py +30 -30
  31. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/declarative_memory/test_declarative_memory.py +86 -82
  32. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/declarative_memory/test_string_from_episode_context.py +2 -1
  33. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/event_memory/conftest.py +8 -2
  34. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/event_memory/deriver/test_text_deriver.py +49 -7
  35. memmachine_server-0.4.0/server_tests/memmachine_server/episodic_memory/event_memory/segment_store/test_sqlalchemy_segment_store.py +3396 -0
  36. memmachine_server-0.4.0/server_tests/memmachine_server/episodic_memory/event_memory/segmenter/test_passthrough_segmenter.py +92 -0
  37. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/event_memory/test_event_memory.py +90 -0
  38. memmachine_server-0.4.0/server_tests/memmachine_server/episodic_memory/long_term_memory/test_episode_to_event.py +159 -0
  39. memmachine_server-0.4.0/server_tests/memmachine_server/episodic_memory/long_term_memory/test_event_backend_wiring.py +944 -0
  40. memmachine_server-0.4.0/server_tests/memmachine_server/episodic_memory/long_term_memory/test_long_term_memory.py +314 -0
  41. memmachine_server-0.4.0/server_tests/memmachine_server/episodic_memory/long_term_memory/test_service_locator.py +98 -0
  42. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/short_term_memory/test_short_term_memory.py +99 -2
  43. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/test_episodic_memory.py +1 -2
  44. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/test_episodic_memory_manager.py +55 -18
  45. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/test_instance_lru_cache.py +22 -4
  46. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/installation/test_configuration_wizard.py +137 -3
  47. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/installation/test_memmachine_configure.py +26 -21
  48. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/main/test_memachine.py +1 -1
  49. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/main/test_memmachine_delete_session.py +6 -4
  50. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/main/test_memmachine_mock.py +719 -24
  51. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/retrieval_agent/test_retrieval_agent.py +24 -2
  52. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/cluster_store/test_cluster_state_storage.py +58 -22
  53. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/mock_semantic_memory_objects.py +25 -9
  54. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/storage/in_memory_semantic_storage.py +52 -27
  55. memmachine_server-0.4.0/server_tests/memmachine_server/semantic_memory/storage/test_history_ordering.py +258 -0
  56. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/storage/test_semantic_storage.py +20 -16
  57. memmachine_server-0.4.0/server_tests/memmachine_server/semantic_memory/storage/test_vector_store_semantic_storage.py +144 -0
  58. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/test_cluster_manager.py +17 -12
  59. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/test_cluster_splitter.py +30 -17
  60. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/test_semantic_history_cleanup.py +3 -1
  61. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/test_semantic_ingestion.py +232 -12
  62. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/test_semantic_memory.py +63 -1
  63. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_background.py +24 -63
  64. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/test_semantic_model.py +7 -6
  65. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/test_semantic_session_manager.py +123 -10
  66. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/server/api_v2/test_config_router.py +29 -0
  67. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/server/api_v2/test_config_service.py +201 -0
  68. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/server/api_v2/test_mcp.py +2 -2
  69. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/server/api_v2/test_router.py +149 -23
  70. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/server/api_v2/test_service.py +53 -0
  71. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/server/api_v2/test_spec.py +71 -8
  72. memmachine_server-0.4.0/server_tests/memmachine_server/server/prompt/__init__.py +0 -0
  73. memmachine_server-0.4.0/server_tests/memmachine_server/server/test_multiproc_dir.py +129 -0
  74. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/configuration/__init__.py +123 -15
  75. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/configuration/database_conf.py +100 -10
  76. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/configuration/episodic_config.py +215 -8
  77. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/configuration/language_model_conf.py +93 -1
  78. memmachine_server-0.4.0/src/memmachine_server/common/configuration/retrieval_config.py +59 -0
  79. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/embedder/amazon_bedrock_embedder.py +20 -5
  80. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/embedder/openai_embedder.py +29 -26
  81. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/embedder/sentence_transformer_embedder.py +22 -8
  82. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/episode_store/__init__.py +0 -2
  83. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/episode_store/count_caching_episode_storage.py +11 -9
  84. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/episode_store/episode_model.py +6 -7
  85. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/episode_store/episode_sqlalchemy_store.py +80 -41
  86. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/episode_store/episode_storage.py +17 -4
  87. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/errors.py +4 -0
  88. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/filter/filter_parser.py +40 -2
  89. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/filter/sql_filter_util.py +31 -4
  90. memmachine_server-0.4.0/src/memmachine_server/common/language_model/litellm_language_model.py +227 -0
  91. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/language_model/openai_responses_language_model.py +1 -1
  92. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/metrics_factory/__init__.py +3 -0
  93. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/metrics_factory/operation_tracker.py +2 -2
  94. memmachine_server-0.4.0/src/memmachine_server/common/metrics_factory/timed.py +54 -0
  95. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/neo4j_utils.py +6 -1
  96. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/reranker/amazon_bedrock_reranker.py +1 -1
  97. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/resource_manager/__init__.py +17 -0
  98. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/resource_manager/database_manager.py +158 -18
  99. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/resource_manager/language_model_manager.py +44 -4
  100. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/resource_manager/reranker_manager.py +1 -2
  101. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/resource_manager/resource_manager.py +108 -2
  102. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/resource_manager/semantic_manager.py +88 -3
  103. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/session_manager/session_data_manager.py +2 -2
  104. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/session_manager/session_data_manager_sql_impl.py +33 -11
  105. memmachine_server-0.4.0/src/memmachine_server/common/sql_lease_lock/__init__.py +17 -0
  106. memmachine_server-0.4.0/src/memmachine_server/common/sql_lease_lock/_store.py +192 -0
  107. memmachine_server-0.4.0/src/memmachine_server/common/sql_lease_lock/service.py +348 -0
  108. memmachine_server-0.4.0/src/memmachine_server/common/vector_store/milvus_vector_store.py +858 -0
  109. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_store/qdrant_vector_store.py +35 -80
  110. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_store/sqlite_vector_store.py +3 -1
  111. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/declarative_memory/data_types.py +2 -1
  112. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/declarative_memory/declarative_memory.py +10 -10
  113. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/episodic_memory.py +4 -3
  114. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/episodic_memory_manager.py +17 -15
  115. memmachine_server-0.4.0/src/memmachine_server/episodic_memory/event_memory/deriver/deriver.py +31 -0
  116. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/event_memory/deriver/text_deriver.py +39 -4
  117. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/event_memory/event_memory.py +23 -64
  118. memmachine_server-0.4.0/src/memmachine_server/episodic_memory/event_memory/formatting.py +59 -0
  119. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/event_memory/segment_store/__init__.py +4 -0
  120. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/event_memory/segment_store/data_types.py +21 -0
  121. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/event_memory/segment_store/segment_store.py +51 -3
  122. memmachine_server-0.4.0/src/memmachine_server/episodic_memory/event_memory/segment_store/sqlalchemy_segment_store.py +1432 -0
  123. memmachine_server-0.4.0/src/memmachine_server/episodic_memory/event_memory/segment_store/utils.py +34 -0
  124. memmachine_server-0.4.0/src/memmachine_server/episodic_memory/event_memory/segmenter/passthrough_segmenter.py +38 -0
  125. memmachine_server-0.4.0/src/memmachine_server/episodic_memory/event_memory/segmenter/segmenter.py +31 -0
  126. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/event_memory/segmenter/text_segmenter.py +7 -1
  127. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/instance_lru_cache.py +17 -3
  128. memmachine_server-0.4.0/src/memmachine_server/episodic_memory/long_term_memory/__init__.py +17 -0
  129. memmachine_server-0.4.0/src/memmachine_server/episodic_memory/long_term_memory/long_term_memory.py +844 -0
  130. memmachine_server-0.4.0/src/memmachine_server/episodic_memory/long_term_memory/service_locator.py +237 -0
  131. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/short_term_memory/short_term_memory.py +15 -4
  132. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/installation/configuration_wizard.py +200 -3
  133. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/main/memmachine.py +172 -58
  134. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/retrieval_agent/agents/__init__.py +2 -0
  135. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/retrieval_agent/agents/coq_agent.py +2 -2
  136. memmachine_server-0.4.0/src/memmachine_server/retrieval_agent/agents/decomposer/__init__.py +32 -0
  137. memmachine_server-0.4.0/src/memmachine_server/retrieval_agent/agents/decomposer/decomposer.py +812 -0
  138. memmachine_server-0.4.0/src/memmachine_server/retrieval_agent/agents/rarag_query_agent.py +491 -0
  139. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/retrieval_agent/common/agent_api.py +3 -3
  140. memmachine_server-0.4.0/src/memmachine_server/retrieval_agent/service_locator.py +95 -0
  141. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/cluster_manager.py +4 -3
  142. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/cluster_splitter.py +13 -18
  143. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/cluster_store/cluster_store_sqlalchemy.py +11 -15
  144. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/semantic_ingestion.py +48 -29
  145. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/semantic_llm.py +2 -2
  146. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/semantic_memory.py +36 -10
  147. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/semantic_model.py +2 -2
  148. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/semantic_session_manager.py +13 -6
  149. memmachine_server-0.4.0/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/e8d4a37b69f2_add_episode_order_to_history.py +28 -0
  150. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/neo4j_semantic_storage.py +64 -14
  151. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/sqlalchemy_pgvector_semantic.py +59 -17
  152. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/storage_base.py +27 -8
  153. memmachine_server-0.4.0/src/memmachine_server/semantic_memory/storage/vector_store_semantic_storage.py +911 -0
  154. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/api_v2/config_router.py +4 -0
  155. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/api_v2/config_service.py +148 -21
  156. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/api_v2/mcp.py +6 -6
  157. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/api_v2/router.py +80 -16
  158. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/app.py +85 -18
  159. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server.egg-info/PKG-INFO +10 -8
  160. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server.egg-info/SOURCES.txt +33 -0
  161. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server.egg-info/requires.txt +11 -7
  162. memmachine_server-0.4.0/src/memmachine_server.egg-info/scm_file_list.json +367 -0
  163. memmachine_server-0.4.0/src/memmachine_server.egg-info/scm_version.json +8 -0
  164. memmachine_server-0.3.8/server_tests/memmachine_server/common/api/test_version.py +0 -41
  165. memmachine_server-0.3.8/server_tests/memmachine_server/common/configuration/test_configuration.py +0 -221
  166. memmachine_server-0.3.8/server_tests/memmachine_server/common/resource_manager/test_resource_manager.py +0 -181
  167. memmachine_server-0.3.8/server_tests/memmachine_server/episodic_memory/event_memory/segment_store/test_sqlalchemy_segment_store.py +0 -992
  168. memmachine_server-0.3.8/server_tests/memmachine_server/episodic_memory/long_term_memory/test_long_term_memory.py +0 -832
  169. memmachine_server-0.3.8/src/memmachine_server/common/configuration/retrieval_config.py +0 -26
  170. memmachine_server-0.3.8/src/memmachine_server/episodic_memory/event_memory/deriver/deriver.py +0 -17
  171. memmachine_server-0.3.8/src/memmachine_server/episodic_memory/event_memory/segment_store/sqlalchemy_segment_store.py +0 -1076
  172. memmachine_server-0.3.8/src/memmachine_server/episodic_memory/event_memory/segmenter/segmenter.py +0 -17
  173. memmachine_server-0.3.8/src/memmachine_server/episodic_memory/long_term_memory/__init__.py +0 -8
  174. memmachine_server-0.3.8/src/memmachine_server/episodic_memory/long_term_memory/long_term_memory.py +0 -362
  175. memmachine_server-0.3.8/src/memmachine_server/episodic_memory/long_term_memory/service_locator.py +0 -27
  176. memmachine_server-0.3.8/src/memmachine_server/retrieval_agent/service_locator.py +0 -57
  177. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/LICENSE +0 -0
  178. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/README.md +0 -0
  179. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/__init__.py +0 -0
  180. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/__init__.py +0 -0
  181. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/__init__.py +0 -0
  182. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/api/__init__.py +0 -0
  183. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/configuration/__init__.py +0 -0
  184. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/configuration/test_embedder_conf.py +0 -0
  185. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/configuration/test_episodic_config.py +0 -0
  186. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/configuration/test_language_model_conf.py +0 -0
  187. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/configuration/test_log_conf.py +0 -0
  188. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/configuration/test_prompt_conf.py +0 -0
  189. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/configuration/test_reranker_conf.py +0 -0
  190. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/configuration/test_server_conf.py +0 -0
  191. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/embedder/__init__.py +0 -0
  192. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/embedder/test_amazon_bedrock_embedder.py +0 -0
  193. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/embedder/test_embedder.py +0 -0
  194. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/embedder/test_sentence_transformer_embedder.py +0 -0
  195. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/episode_store/__init__.py +0 -0
  196. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/filter/__init__.py +0 -0
  197. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/language_model/__init__.py +0 -0
  198. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/payload_codec/__init__.py +0 -0
  199. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/payload_codec/test_payload_codec.py +0 -0
  200. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/payload_codec/test_payload_codec_config.py +0 -0
  201. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/reranker/__init__.py +0 -0
  202. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/reranker/fake_embedder.py +0 -0
  203. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/reranker/test_amazon_bedrock_reranker.py +0 -0
  204. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/reranker/test_bm25_reranker.py +0 -0
  205. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/reranker/test_cohere_reranker.py +0 -0
  206. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/reranker/test_cross_encoder_reranker.py +0 -0
  207. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/reranker/test_embedder_reranker.py +0 -0
  208. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/reranker/test_identity_reranker.py +0 -0
  209. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/reranker/test_rrf_hybrid_reranker.py +0 -0
  210. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/resource_manager/__init__.py +0 -0
  211. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/resource_manager/test_embedder_manager.py +0 -0
  212. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/resource_manager/test_language_model_manager.py +0 -0
  213. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/resource_manager/test_reranker_manager.py +0 -0
  214. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/session_manager/__init__.py +0 -0
  215. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/session_manager/test_session_manager_migration.py +0 -0
  216. {memmachine_server-0.3.8/server_tests/memmachine_server/common/vector_graph_store → memmachine_server-0.4.0/server_tests/memmachine_server/common/sql_lease_lock}/__init__.py +0 -0
  217. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/test_properties_json.py +0 -0
  218. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/test_rw_locks.py +0 -0
  219. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/test_utils.py +0 -0
  220. {memmachine_server-0.3.8/server_tests/memmachine_server/common/vector_store → memmachine_server-0.4.0/server_tests/memmachine_server/common/vector_graph_store}/__init__.py +0 -0
  221. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/vector_graph_store/test_nebula_graph_vector_graph_store.py +0 -0
  222. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/vector_graph_store/test_neo4j_vector_graph_store.py +0 -0
  223. {memmachine_server-0.3.8/server_tests/memmachine_server/common/vector_store/vector_search_engine → memmachine_server-0.4.0/server_tests/memmachine_server/common/vector_store}/__init__.py +0 -0
  224. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/vector_store/in_memory_vector_store_collection.py +0 -0
  225. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/vector_store/test_sqlite_vec_vector_store.py +0 -0
  226. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/vector_store/test_sqlite_vector_store.py +0 -0
  227. {memmachine_server-0.3.8/server_tests/memmachine_server/episodic_memory → memmachine_server-0.4.0/server_tests/memmachine_server/common/vector_store/vector_search_engine}/__init__.py +0 -0
  228. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/vector_store/vector_search_engine/test_hnswlib_engine.py +0 -0
  229. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/common/vector_store/vector_search_engine/test_usearch_engine.py +0 -0
  230. {memmachine_server-0.3.8/server_tests/memmachine_server/episodic_memory/declarative_memory → memmachine_server-0.4.0/server_tests/memmachine_server/episodic_memory}/__init__.py +0 -0
  231. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/conftest.py +0 -0
  232. {memmachine_server-0.3.8/server_tests/memmachine_server/episodic_memory/event_memory → memmachine_server-0.4.0/server_tests/memmachine_server/episodic_memory/declarative_memory}/__init__.py +0 -0
  233. {memmachine_server-0.3.8/server_tests/memmachine_server/episodic_memory/long_term_memory → memmachine_server-0.4.0/server_tests/memmachine_server/episodic_memory/event_memory}/__init__.py +0 -0
  234. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/event_memory/deriver/__init__.py +0 -0
  235. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/event_memory/segment_store/__init__.py +0 -0
  236. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/event_memory/segment_store/test_data_types.py +0 -0
  237. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/event_memory/segmenter/__init__.py +0 -0
  238. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/event_memory/segmenter/test_text_segmenter.py +0 -0
  239. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/episodic_memory/event_memory/test_data_types.py +0 -0
  240. {memmachine_server-0.3.8/server_tests/memmachine_server/episodic_memory/short_term_memory → memmachine_server-0.4.0/server_tests/memmachine_server/episodic_memory/long_term_memory}/__init__.py +0 -0
  241. {memmachine_server-0.3.8/server_tests/memmachine_server/installation → memmachine_server-0.4.0/server_tests/memmachine_server/episodic_memory/short_term_memory}/__init__.py +0 -0
  242. {memmachine_server-0.3.8/server_tests/memmachine_server/main → memmachine_server-0.4.0/server_tests/memmachine_server/installation}/__init__.py +0 -0
  243. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/installation/test_utilities.py +0 -0
  244. {memmachine_server-0.3.8/server_tests/memmachine_server/semantic_memory → memmachine_server-0.4.0/server_tests/memmachine_server/main}/__init__.py +0 -0
  245. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/main/conftest.py +0 -0
  246. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/main/test_memmachine_integration.py +0 -0
  247. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/retrieval_agent/__init__.py +0 -0
  248. {memmachine_server-0.3.8/server_tests/memmachine_server/semantic_memory/config_store → memmachine_server-0.4.0/server_tests/memmachine_server/semantic_memory}/__init__.py +0 -0
  249. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/cluster_store/__init__.py +0 -0
  250. {memmachine_server-0.3.8/server_tests/memmachine_server/semantic_memory/storage → memmachine_server-0.4.0/server_tests/memmachine_server/semantic_memory/config_store}/__init__.py +0 -0
  251. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/config_store/test_caching_semantic_config_storage.py +0 -0
  252. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/config_store/test_semantic_config_storage.py +0 -0
  253. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/conftest.py +0 -0
  254. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/semantic_test_utils.py +0 -0
  255. {memmachine_server-0.3.8/server_tests/memmachine_server/semantic_memory/storage/alembic_pg → memmachine_server-0.4.0/server_tests/memmachine_server/semantic_memory/storage}/__init__.py +0 -0
  256. {memmachine_server-0.3.8/server_tests/memmachine_server/server → memmachine_server-0.4.0/server_tests/memmachine_server/semantic_memory/storage/alembic_pg}/__init__.py +0 -0
  257. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/helpers.py +0 -0
  258. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/original_schema.sql +0 -0
  259. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_set_id_migration.py +0 -0
  260. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_sqlalchemy_vs_alembic.py +0 -0
  261. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/storage/conftest.py +0 -0
  262. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/storage/test_text_sanitizer.py +0 -0
  263. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/test_semantic_llm.py +0 -0
  264. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/test_semantic_llm_integration.py +0 -0
  265. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_integration.py +0 -0
  266. {memmachine_server-0.3.8/server_tests/memmachine_server/server/api_v2 → memmachine_server-0.4.0/server_tests/memmachine_server/server}/__init__.py +0 -0
  267. {memmachine_server-0.3.8/server_tests/memmachine_server/server/prompt → memmachine_server-0.4.0/server_tests/memmachine_server/server/api_v2}/__init__.py +0 -0
  268. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/server/prompt/test_prompt_utilities.py +0 -0
  269. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/server/test_middleware.py +0 -0
  270. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/server_tests/memmachine_server/test_data/longmemeval_snippet.json +0 -0
  271. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/setup.cfg +0 -0
  272. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/__init__.py +0 -0
  273. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/__init__.py +0 -0
  274. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/api/__init__.py +0 -0
  275. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/api/version.py +0 -0
  276. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/configuration/default_episode_summary_system_prompt.txt +0 -0
  277. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/configuration/default_episode_summary_user_prompt.txt +0 -0
  278. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/configuration/embedder_conf.py +0 -0
  279. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/configuration/log_conf.py +0 -0
  280. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/configuration/mixin_confs.py +0 -0
  281. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/configuration/reranker_conf.py +0 -0
  282. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/data_types.py +0 -0
  283. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/embedder/__init__.py +0 -0
  284. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/embedder/embedder.py +0 -0
  285. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/filter/__init__.py +0 -0
  286. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/language_model/__init__.py +0 -0
  287. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/language_model/amazon_bedrock_language_model.py +0 -0
  288. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/language_model/language_model.py +0 -0
  289. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/language_model/openai_chat_completions_language_model.py +0 -0
  290. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/metrics_factory/metrics_factory.py +0 -0
  291. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/metrics_factory/prometheus_metrics_factory.py +0 -0
  292. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/payload_codec/__init__.py +0 -0
  293. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/payload_codec/payload_codec.py +0 -0
  294. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/payload_codec/payload_codec_config.py +0 -0
  295. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/payload_codec/plaintext_payload_codec.py +0 -0
  296. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/properties_json.py +0 -0
  297. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/reranker/__init__.py +0 -0
  298. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/reranker/bm25_reranker.py +0 -0
  299. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/reranker/cohere_reranker.py +0 -0
  300. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/reranker/cross_encoder_reranker.py +0 -0
  301. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/reranker/embedder_reranker.py +0 -0
  302. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/reranker/identity_reranker.py +0 -0
  303. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/reranker/reranker.py +0 -0
  304. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/reranker/rrf_hybrid_reranker.py +0 -0
  305. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/resource_manager/base_manager.py +0 -0
  306. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/resource_manager/embedder_manager.py +0 -0
  307. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/rw_locks.py +0 -0
  308. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/session_manager/__init__.py +0 -0
  309. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/utils.py +0 -0
  310. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_graph_store/__init__.py +0 -0
  311. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_graph_store/data_types.py +0 -0
  312. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_graph_store/nebula_graph_vector_graph_store.py +0 -0
  313. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_graph_store/neo4j_vector_graph_store.py +0 -0
  314. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_graph_store/vector_graph_store.py +0 -0
  315. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_store/__init__.py +0 -0
  316. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_store/data_types.py +0 -0
  317. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_store/sqlite_vec_vector_store.py +0 -0
  318. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_store/utils.py +0 -0
  319. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_store/vector_search_engine/__init__.py +0 -0
  320. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_store/vector_search_engine/hnswlib_engine.py +0 -0
  321. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_store/vector_search_engine/usearch_engine.py +0 -0
  322. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_store/vector_search_engine/vector_search_engine.py +0 -0
  323. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/common/vector_store/vector_store.py +0 -0
  324. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/__init__.py +0 -0
  325. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/declarative_memory/__init__.py +0 -0
  326. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/event_memory/__init__.py +0 -0
  327. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/event_memory/data_types.py +0 -0
  328. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/event_memory/deriver/__init__.py +0 -0
  329. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/event_memory/segmenter/__init__.py +0 -0
  330. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/service_locator.py +0 -0
  331. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/short_term_memory/__init__.py +0 -0
  332. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/episodic_memory/short_term_memory/service_locator.py +0 -0
  333. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/installation/__init__.py +0 -0
  334. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/installation/memmachine_configure.py +0 -0
  335. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/installation/utilities.py +0 -0
  336. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/main/__init__.py +0 -0
  337. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/retrieval_agent/__init__.py +0 -0
  338. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/retrieval_agent/agents/memmachine_retriever.py +0 -0
  339. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/retrieval_agent/agents/split_query_agent.py +0 -0
  340. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/retrieval_agent/agents/tool_select_agent.py +0 -0
  341. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/retrieval_agent/common/__init__.py +0 -0
  342. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/__init__.py +0 -0
  343. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/cluster_store/__init__.py +0 -0
  344. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/cluster_store/cluster_store.py +0 -0
  345. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/cluster_store/in_memory_cluster_store.py +0 -0
  346. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/config_store/__init__.py +0 -0
  347. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/config_store/caching_semantic_config_storage.py +0 -0
  348. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/config_store/config_store.py +0 -0
  349. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/config_store/config_store_sqlalchemy.py +0 -0
  350. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/__init__.py +0 -0
  351. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/alembic_pg/__init__.py +0 -0
  352. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/alembic_pg/env.py +0 -0
  353. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/alembic_pg/script.py.mako +0 -0
  354. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/001_initial_migration.py +0 -0
  355. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/3d6aaebdc526_sync_sqlalchemy_schema.py +0 -0
  356. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/62dff1150a46_add_created_at_to_history_add.py +0 -0
  357. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/79f00a9f2409_change_history_id_to_string.py +0 -0
  358. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/843f6d216d10_rename_semantic_type_to_semantic_.py +0 -0
  359. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/__init__.py +0 -0
  360. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/adb5618bd4ee_remove_history_table.py +0 -0
  361. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/b65f7f4a9d2c_migrate_legacy_set_ids.py +0 -0
  362. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/c7a2f8e31b90_add_ingested_composite_index.py +0 -0
  363. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/d1a9df11343b_add_indexes.py +0 -0
  364. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/storage/text_sanitizer.py +0 -0
  365. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/util/__init__.py +0 -0
  366. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/semantic_memory/util/semantic_prompt_template.py +0 -0
  367. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/__init__.py +0 -0
  368. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/api_v2/__init__.py +0 -0
  369. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/api_v2/exceptions.py +0 -0
  370. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/api_v2/service.py +0 -0
  371. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/diagnostics.py +0 -0
  372. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/mcp_http.py +0 -0
  373. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/mcp_stdio.py +0 -0
  374. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/middleware.py +0 -0
  375. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/prompt/__init__.py +0 -0
  376. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/prompt/coding_style_prompt.py +0 -0
  377. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/prompt/crm_prompt.py +0 -0
  378. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/prompt/default_prompts.py +0 -0
  379. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/prompt/financial_analyst_prompt.py +0 -0
  380. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/prompt/health_assistant_prompt.py +0 -0
  381. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/prompt/profile_prompt.py +0 -0
  382. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/prompt/prompt_utilities.py +0 -0
  383. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server/server/prompt/writing_assistant_prompt.py +0 -0
  384. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server.egg-info/dependency_links.txt +0 -0
  385. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server.egg-info/entry_points.txt +0 -0
  386. {memmachine_server-0.3.8 → memmachine_server-0.4.0}/src/memmachine_server.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memmachine-server
3
- Version: 0.3.8
3
+ Version: 0.4.0
4
4
  Summary: MemMachine Server - The complete MemMachine memory system server with episodic and profile memory
5
5
  Author-email: MemMachine <noreply@memmachine.ai>
6
6
  License-Expression: Apache-2.0
@@ -20,9 +20,8 @@ Requires-Dist: alembic>=1.17.1
20
20
  Requires-Dist: asyncpg>=0.31.0
21
21
  Requires-Dist: aiosqlite>=0.20.0
22
22
  Requires-Dist: boto3>=1.40.40
23
- Requires-Dist: boto3-stubs==1.40.64
24
23
  Requires-Dist: cohere>=5.20.0
25
- Requires-Dist: dotenv>=0.9.9
24
+ Requires-Dist: python-dotenv>=1.2.2
26
25
  Requires-Dist: fastapi>=0.116.1
27
26
  Requires-Dist: fastmcp>=3.2.0
28
27
  Requires-Dist: instructor[bedrock]>=1.12.0
@@ -31,17 +30,15 @@ Requires-Dist: langchain-aws>=0.2.33
31
30
  Requires-Dist: neo4j>=5.28.2
32
31
  Requires-Dist: nltk>=3.9.4
33
32
  Requires-Dist: openai>=2.21.0
34
- Requires-Dist: pgvector>=0.4.1
33
+ Requires-Dist: pgvector>=0.4.2
35
34
  Requires-Dist: prometheus-client>=0.22.1
36
35
  Requires-Dist: pydantic>=2.11.7
37
36
  Requires-Dist: pyyaml>=6.0.2
38
37
  Requires-Dist: rank-bm25>=0.2.2
39
- Requires-Dist: regex>=2023.0.0
40
38
  Requires-Dist: sqlite-vec>=0.1.9
41
- Requires-Dist: sqlalchemy>=2.0.43
39
+ Requires-Dist: sqlalchemy[asyncio]>=2.0.43
42
40
  Requires-Dist: usearch>=2.25.1
43
41
  Requires-Dist: uvicorn>=0.35.0
44
- Requires-Dist: greenlet>=3.2.4
45
42
  Requires-Dist: tzdata>=2024.1; sys_platform == "win32"
46
43
  Requires-Dist: psutil>=7.1.0
47
44
  Requires-Dist: langchain-text-splitters>=1.1.1
@@ -51,9 +48,14 @@ Requires-Dist: sentence-transformers>=5.1.0; extra == "gpu"
51
48
  Provides-Extra: hnswlib
52
49
  Requires-Dist: hnswlib>=0.8.0; extra == "hnswlib"
53
50
  Provides-Extra: nebula
54
- Requires-Dist: nebula5-python>=5.2.1; extra == "nebula"
51
+ Requires-Dist: nebula5-python<5.3,>=5.2.1; extra == "nebula"
55
52
  Provides-Extra: qdrant
56
53
  Requires-Dist: qdrant-client>=1.17.0; extra == "qdrant"
54
+ Provides-Extra: milvus
55
+ Requires-Dist: pymilvus>=3.0.0; extra == "milvus"
56
+ Requires-Dist: milvus-lite>=3.0.0; extra == "milvus"
57
+ Provides-Extra: litellm
58
+ Requires-Dist: litellm>=1.93.0; extra == "litellm"
57
59
  Dynamic: license-file
58
60
 
59
61
  # MemMachine
@@ -11,9 +11,8 @@ dependencies = [
11
11
  "asyncpg>=0.31.0",
12
12
  "aiosqlite>=0.20.0",
13
13
  "boto3>=1.40.40",
14
- "boto3-stubs==1.40.64",
15
14
  "cohere>=5.20.0",
16
- "dotenv>=0.9.9",
15
+ "python-dotenv>=1.2.2",
17
16
  "fastapi>=0.116.1",
18
17
  "fastmcp>=3.2.0",
19
18
  "instructor[bedrock]>=1.12.0",
@@ -22,17 +21,15 @@ dependencies = [
22
21
  "neo4j>=5.28.2",
23
22
  "nltk>=3.9.4",
24
23
  "openai>=2.21.0",
25
- "pgvector>=0.4.1",
24
+ "pgvector>=0.4.2",
26
25
  "prometheus-client>=0.22.1",
27
26
  "pydantic>=2.11.7",
28
27
  "pyyaml>=6.0.2",
29
28
  "rank-bm25>=0.2.2",
30
- "regex>=2023.0.0",
31
29
  "sqlite-vec>=0.1.9",
32
- "sqlalchemy>=2.0.43",
30
+ "sqlalchemy[asyncio]>=2.0.43",
33
31
  "usearch>=2.25.1",
34
32
  "uvicorn>=0.35.0",
35
- "greenlet>=3.2.4",
36
33
  "tzdata>=2024.1 ; sys_platform == 'win32'",
37
34
  "psutil>=7.1.0",
38
35
  "langchain-text-splitters>=1.1.1",
@@ -62,11 +59,25 @@ hnswlib = [
62
59
  "hnswlib>=0.8.0",
63
60
  ]
64
61
  nebula = [
65
- "nebula5-python>=5.2.1",
62
+ # 5.3 removed the public async client this backend is written against:
63
+ # NebulaAsyncClient, SessionConfig and SessionPoolConfig are gone, and the
64
+ # AsyncNebulaClient that replaces NebulaAsyncClient has no public way to
65
+ # open a connection -- only the private _init_client(). Until it does, the
66
+ # async backend cannot move past 5.2.
67
+ "nebula5-python>=5.2.1,<5.3",
66
68
  ]
67
69
  qdrant = [
68
70
  "qdrant-client>=1.17.0",
69
71
  ]
72
+ milvus = [
73
+ "pymilvus>=3.0.0",
74
+ "milvus-lite>=3.0.0",
75
+ ]
76
+ litellm = [
77
+ # 1.93 is the first release that supports Python 3.14; 1.83.8 through
78
+ # 1.92 cap themselves at <3.14.
79
+ "litellm>=1.93.0",
80
+ ]
70
81
 
71
82
  [project.scripts]
72
83
  memmachine-server = "memmachine_server.server.app:main"
@@ -98,6 +109,14 @@ extra-paths = ["../common/src", "../client/src"]
98
109
  [tool.ty.src]
99
110
  exclude = ["build/**"]
100
111
 
112
+ [tool.ty.analysis]
113
+ # spaCy is an optional dependency (the ``multihop`` dependency-group) and is not
114
+ # installed in the type-checking environments (notably the Python 3.14 matrix,
115
+ # where spaCy 3.8.x has no wheels). Suppress unresolved-import for spaCy so the
116
+ # static checks pass without it; the decomposer falls back to LLM splitting at
117
+ # runtime when spaCy is absent.
118
+ allowed-unresolved-imports = ["spacy.**"]
119
+
101
120
  [tool.ruff]
102
121
  extend = "../../pyproject.toml"
103
122
  target-version = "py312"
@@ -0,0 +1,8 @@
1
+ """test version information."""
2
+
3
+ from memmachine_common.api.spec import Version
4
+
5
+
6
+ def test_version_string():
7
+ version = Version(server_version="0.2.2", client_version="0.2.2")
8
+ assert str(version) == "server: 0.2.2\nclient: 0.2.2"
@@ -0,0 +1,457 @@
1
+ import logging
2
+ from pathlib import Path
3
+
4
+ import pytest
5
+ import yaml
6
+ from pydantic import SecretStr
7
+
8
+ from memmachine_server.common.configuration import (
9
+ Configuration,
10
+ EpisodicMemoryConfPartial,
11
+ )
12
+ from memmachine_server.common.configuration.episodic_config import (
13
+ DeclarativeLongTermMemoryConf,
14
+ EpisodicMemoryConf,
15
+ EventLongTermMemoryConf,
16
+ LongTermMemoryConfPartial,
17
+ PassthroughSegmenterConf,
18
+ ShortTermMemoryConfPartial,
19
+ WholeTextDeriverConf,
20
+ )
21
+ from memmachine_server.common.configuration.log_conf import LogLevel
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ @pytest.fixture
27
+ def long_term_memory_conf() -> LongTermMemoryConfPartial:
28
+ return LongTermMemoryConfPartial(
29
+ embedder="embedder_v1",
30
+ reranker="reranker_v1",
31
+ vector_graph_store="store_v1",
32
+ )
33
+
34
+
35
+ def test_update_long_term_memory_conf(long_term_memory_conf: LongTermMemoryConfPartial):
36
+ specific = LongTermMemoryConfPartial(
37
+ session_id="session_123",
38
+ embedder="embedder_v2",
39
+ )
40
+
41
+ updated = specific.merge(long_term_memory_conf)
42
+ assert isinstance(updated, DeclarativeLongTermMemoryConf)
43
+ assert updated.session_id == "session_123"
44
+ assert updated.embedder == "embedder_v2"
45
+ assert updated.reranker == "reranker_v1"
46
+ assert updated.vector_graph_store == "store_v1"
47
+
48
+
49
+ @pytest.fixture
50
+ def short_term_memory_conf() -> ShortTermMemoryConfPartial:
51
+ return ShortTermMemoryConfPartial(
52
+ llm_model="model_v1",
53
+ message_capacity=12345,
54
+ summary_prompt_user="Summarize the following:",
55
+ summary_prompt_system="You are a helpful assistant.",
56
+ )
57
+
58
+
59
+ def test_update_session_memory_conf(short_term_memory_conf: ShortTermMemoryConfPartial):
60
+ specific = ShortTermMemoryConfPartial(
61
+ session_key="session_123",
62
+ message_capacity=3000,
63
+ )
64
+
65
+ updated = specific.merge(short_term_memory_conf)
66
+ assert updated.session_key == "session_123"
67
+ assert updated.llm_model == "model_v1"
68
+ assert updated.message_capacity == 3000
69
+
70
+
71
+ def test_update_episodic_memory_conf(
72
+ long_term_memory_conf: LongTermMemoryConfPartial,
73
+ short_term_memory_conf: ShortTermMemoryConfPartial,
74
+ ):
75
+ base = EpisodicMemoryConfPartial(
76
+ short_term_memory=short_term_memory_conf,
77
+ long_term_memory=long_term_memory_conf,
78
+ metrics_factory_id="metrics_factory_id",
79
+ )
80
+ specific = EpisodicMemoryConfPartial(
81
+ session_key="session_123",
82
+ long_term_memory=LongTermMemoryConfPartial(embedder="embedder_v2"),
83
+ )
84
+
85
+ updated = specific.merge(base)
86
+ assert updated.long_term_memory is not None
87
+ assert updated.short_term_memory is not None
88
+ assert updated.long_term_memory.embedder == "embedder_v2"
89
+ assert updated.long_term_memory.reranker == "reranker_v1"
90
+ assert updated.short_term_memory is not None
91
+ assert updated.short_term_memory.session_key == "session_123"
92
+ assert updated.short_term_memory.message_capacity == 12345
93
+
94
+
95
+ def find_config_file(filename: str, start_path: Path | None = None) -> Path:
96
+ """Search parent directories for `sample_configs/filename`."""
97
+ if start_path is None:
98
+ start_path = Path(__file__).resolve()
99
+
100
+ current = start_path.parent
101
+
102
+ while current != current.parent: # until we reach root
103
+ candidate = current / "sample_configs" / filename
104
+ if candidate.is_file():
105
+ return candidate
106
+ current = current.parent
107
+
108
+ raise FileNotFoundError(
109
+ f"Could not find '{filename}' in any parent 'sample_configs' folder.",
110
+ )
111
+
112
+
113
+ def test_load_sample_cpu_config():
114
+ config_path = find_config_file("episodic_memory_config.cpu.sample")
115
+ conf = Configuration.load_yml_file(str(config_path))
116
+ resources_conf = conf.resources
117
+ assert conf.logging.level == LogLevel.INFO
118
+ assert conf.session_manager.database == "profile_storage"
119
+ assert (
120
+ len(resources_conf.language_models.openai_chat_completions_language_model_confs)
121
+ > 0
122
+ )
123
+ assert (
124
+ resources_conf.language_models.openai_chat_completions_language_model_confs[
125
+ "ollama_model"
126
+ ].model
127
+ == "llama3"
128
+ )
129
+ postgres_conf = resources_conf.databases.relational_db_confs["profile_storage"]
130
+ assert postgres_conf.password == SecretStr("<YOUR_PASSWORD_HERE>")
131
+ assert conf.semantic_memory.database == "profile_storage"
132
+ embedder_conf = resources_conf.embedders.openai["openai_embedder"]
133
+ assert embedder_conf.api_key == SecretStr("<YOUR_API_KEY>")
134
+ reranker_conf = resources_conf.rerankers.amazon_bedrock["aws_reranker_id"]
135
+ assert reranker_conf.aws_access_key_id == SecretStr("<AWS_ACCESS_KEY_ID>")
136
+ assert isinstance(conf.prompt.episode_summary_user_prompt, str)
137
+ assert len(conf.prompt.episode_summary_user_prompt) > 0
138
+ assert "concise" in conf.prompt.episode_summary_system_prompt
139
+
140
+
141
+ def test_load_sample_gpu_config():
142
+ config_path = find_config_file("episodic_memory_config.gpu.sample")
143
+ conf = Configuration.load_yml_file(str(config_path))
144
+ assert conf.logging.level == LogLevel.INFO
145
+
146
+
147
+ def test_serialize_and_deserialize_configuration():
148
+ config_path = find_config_file("episodic_memory_config.gpu.sample")
149
+ conf = Configuration.load_yml_file(str(config_path))
150
+ yaml_str = conf.to_yaml()
151
+ logger.debug("configuration yaml string:\n%s", yaml_str)
152
+ data = yaml.safe_load(yaml_str)
153
+ conf_cp = Configuration(**data)
154
+ # Compare YAML output since _config_file_path differs (set vs None)
155
+ assert conf_cp.to_yaml() == yaml_str
156
+
157
+
158
+ def test_load_yml_file_sets_config_file_path():
159
+ """Test that load_yml_file stores the file path in the configuration."""
160
+ config_path = find_config_file("episodic_memory_config.gpu.sample")
161
+ conf = Configuration.load_yml_file(str(config_path))
162
+ assert conf.config_file_path == str(config_path)
163
+
164
+
165
+ def test_config_file_path_none_when_not_loaded_from_file():
166
+ """Test that config_file_path is None when configuration is created directly."""
167
+ config_path = find_config_file("episodic_memory_config.gpu.sample")
168
+ conf = Configuration.load_yml_file(str(config_path))
169
+ # Create a new configuration from the same data (not from file)
170
+ yaml_str = conf.to_yaml()
171
+ data = yaml.safe_load(yaml_str)
172
+ conf_direct = Configuration(**data)
173
+ assert conf_direct.config_file_path is None
174
+
175
+
176
+ def test_save_configuration_to_file(tmp_path):
177
+ """Test that save() writes configuration to a file."""
178
+ config_path = find_config_file("episodic_memory_config.gpu.sample")
179
+ conf = Configuration.load_yml_file(str(config_path))
180
+
181
+ # Save to a new file
182
+ save_path = tmp_path / "saved_config.yml"
183
+ conf.save(str(save_path))
184
+
185
+ # Verify file was created and can be loaded
186
+ assert save_path.exists()
187
+ loaded_conf = Configuration.load_yml_file(str(save_path))
188
+ # Compare YAML output since _config_file_path differs between instances
189
+ assert loaded_conf.to_yaml() == conf.to_yaml()
190
+
191
+
192
+ def test_save_configuration_to_original_path(tmp_path):
193
+ """Test that save() writes to original path when no path is provided."""
194
+ # First, create a config file in tmp_path
195
+ config_path = find_config_file("episodic_memory_config.gpu.sample")
196
+ original_conf = Configuration.load_yml_file(str(config_path))
197
+
198
+ temp_config_path = tmp_path / "test_config.yml"
199
+ temp_config_path.write_text(original_conf.to_yaml(), encoding="utf-8")
200
+
201
+ # Load from temp path
202
+ conf = Configuration.load_yml_file(str(temp_config_path))
203
+ assert conf.config_file_path == str(temp_config_path)
204
+
205
+ # Modify something (just to ensure save works)
206
+ conf.server.port = 9999
207
+
208
+ # Save without providing path (should use original path)
209
+ conf.save()
210
+
211
+ # Reload and verify
212
+ reloaded = Configuration.load_yml_file(str(temp_config_path))
213
+ assert reloaded.server.port == 9999
214
+
215
+
216
+ def test_save_raises_error_when_no_path():
217
+ """Test that save() raises ValueError when no path is available."""
218
+ config_path = find_config_file("episodic_memory_config.gpu.sample")
219
+ conf = Configuration.load_yml_file(str(config_path))
220
+
221
+ # Create a new configuration without file path
222
+ yaml_str = conf.to_yaml()
223
+ data = yaml.safe_load(yaml_str)
224
+ conf_no_path = Configuration(**data)
225
+
226
+ with pytest.raises(ValueError, match="No path provided"):
227
+ conf_no_path.save()
228
+
229
+
230
+ # --- Backwards-compat: long-term-memory backend discriminator ---
231
+
232
+
233
+ def _ltm_minimal_short_term_block() -> dict:
234
+ return {
235
+ "session_key": "s",
236
+ "llm_model": "m",
237
+ "summary_prompt_system": "x",
238
+ "summary_prompt_user": "y",
239
+ }
240
+
241
+
242
+ def test_old_param_data_without_backend_loads_as_declarative():
243
+ """Old persisted session param_data (no `backend`) round-trips as declarative.
244
+
245
+ Reproduces the historical session_data_manager_sql_impl.py:306 path:
246
+ `EpisodicMemoryConf(**session.param_data)` for a row written before the
247
+ backend discriminator existed.
248
+ """
249
+ old_param_data = {
250
+ "session_key": "old_session",
251
+ "long_term_memory": {
252
+ "session_id": "old_session",
253
+ "embedder": "openai_embedder",
254
+ "reranker": "my_reranker_id",
255
+ "vector_graph_store": "my_storage_id",
256
+ },
257
+ "short_term_memory": _ltm_minimal_short_term_block(),
258
+ "long_term_memory_enabled": True,
259
+ "short_term_memory_enabled": True,
260
+ "enabled": True,
261
+ }
262
+
263
+ conf = EpisodicMemoryConf.model_validate(old_param_data)
264
+ assert isinstance(conf.long_term_memory, DeclarativeLongTermMemoryConf)
265
+ assert conf.long_term_memory.backend == "declarative"
266
+ assert conf.long_term_memory.embedder == "openai_embedder"
267
+ assert conf.long_term_memory.vector_graph_store == "my_storage_id"
268
+
269
+
270
+ def test_episodic_memory_conf_with_explicit_event_backend_loads_as_event():
271
+ data = {
272
+ "session_key": "s",
273
+ "long_term_memory": {
274
+ "backend": "event",
275
+ "session_id": "s",
276
+ "vector_store": "vstore",
277
+ "segment_store": "pg_engine",
278
+ "embedder": "openai_embedder",
279
+ },
280
+ "short_term_memory": _ltm_minimal_short_term_block(),
281
+ }
282
+
283
+ conf = EpisodicMemoryConf.model_validate(data)
284
+ assert isinstance(conf.long_term_memory, EventLongTermMemoryConf)
285
+ assert conf.long_term_memory.vector_store == "vstore"
286
+ assert conf.long_term_memory.segment_store == "pg_engine"
287
+ # Default sub-configs.
288
+ assert isinstance(conf.long_term_memory.segmenter, PassthroughSegmenterConf)
289
+ assert isinstance(conf.long_term_memory.deriver, WholeTextDeriverConf)
290
+ # Reranker is optional on the event backend.
291
+ assert conf.long_term_memory.reranker is None
292
+
293
+
294
+ def test_episodic_memory_conf_with_explicit_declarative_backend_loads_as_declarative():
295
+ data = {
296
+ "session_key": "s",
297
+ "long_term_memory": {
298
+ "backend": "declarative",
299
+ "session_id": "s",
300
+ "vector_graph_store": "g",
301
+ "embedder": "e",
302
+ "reranker": "r",
303
+ },
304
+ "short_term_memory": _ltm_minimal_short_term_block(),
305
+ }
306
+
307
+ conf = EpisodicMemoryConf.model_validate(data)
308
+ assert isinstance(conf.long_term_memory, DeclarativeLongTermMemoryConf)
309
+ assert conf.long_term_memory.vector_graph_store == "g"
310
+
311
+
312
+ def test_partial_merge_with_no_backend_resolves_to_declarative():
313
+ """LongTermMemoryConfPartial.merge() defaults missing backend to declarative."""
314
+ base = LongTermMemoryConfPartial(
315
+ session_id="s",
316
+ embedder="e",
317
+ reranker="r",
318
+ vector_graph_store="g",
319
+ )
320
+ override = LongTermMemoryConfPartial(embedder="e2")
321
+
322
+ merged = override.merge(base)
323
+ assert isinstance(merged, DeclarativeLongTermMemoryConf)
324
+ assert merged.embedder == "e2"
325
+ assert merged.reranker == "r"
326
+ assert merged.vector_graph_store == "g"
327
+
328
+
329
+ def test_partial_merge_with_event_backend_resolves_to_event():
330
+ base = LongTermMemoryConfPartial(
331
+ backend="event",
332
+ session_id="s",
333
+ embedder="e",
334
+ vector_store="v",
335
+ segment_store="seg",
336
+ )
337
+ override = LongTermMemoryConfPartial()
338
+
339
+ merged = override.merge(base)
340
+ assert isinstance(merged, EventLongTermMemoryConf)
341
+ assert merged.vector_store == "v"
342
+ assert merged.segment_store == "seg"
343
+ assert merged.embedder == "e"
344
+ assert merged.reranker is None
345
+
346
+
347
+ def test_partial_merge_explicit_declarative_backend():
348
+ base = LongTermMemoryConfPartial(
349
+ backend="declarative",
350
+ session_id="s",
351
+ embedder="e",
352
+ reranker="r",
353
+ vector_graph_store="g",
354
+ )
355
+ merged = LongTermMemoryConfPartial().merge(base)
356
+ assert isinstance(merged, DeclarativeLongTermMemoryConf)
357
+
358
+
359
+ def test_partial_merge_primary_backend_wins_over_fallback():
360
+ """Primary backend takes precedence over fallback."""
361
+ primary = LongTermMemoryConfPartial(
362
+ backend="event",
363
+ session_id="s",
364
+ embedder="e",
365
+ vector_store="v",
366
+ segment_store="seg",
367
+ )
368
+ fallback = LongTermMemoryConfPartial(
369
+ backend="declarative",
370
+ session_id="s",
371
+ embedder="e",
372
+ reranker="r",
373
+ vector_graph_store="g",
374
+ )
375
+ merged = primary.merge(fallback)
376
+ assert isinstance(merged, EventLongTermMemoryConf)
377
+
378
+
379
+ def test_existing_sample_yaml_loads_as_declarative_via_full_configuration():
380
+ """Existing sample YAMLs (no `backend` field) load through Configuration."""
381
+ config_path = find_config_file("episodic_memory_config.cpu.sample")
382
+ conf = Configuration.load_yml_file(str(config_path))
383
+ assert conf.episodic_memory.long_term_memory is not None
384
+ # Configuration.episodic_memory is the partial; backend stays None on load.
385
+ assert conf.episodic_memory.long_term_memory.backend is None
386
+ # ...and merging the LTM partial alone resolves to declarative.
387
+ ltm_merged = LongTermMemoryConfPartial(session_id="test_session").merge(
388
+ conf.episodic_memory.long_term_memory
389
+ )
390
+ assert isinstance(ltm_merged, DeclarativeLongTermMemoryConf)
391
+ assert ltm_merged.embedder == "openai_embedder"
392
+ assert ltm_merged.vector_graph_store == "my_storage_id"
393
+
394
+
395
+ def _sample_config_data() -> dict:
396
+ config_path = find_config_file("episodic_memory_config.cpu.sample")
397
+ return yaml.safe_load(config_path.read_text(encoding="utf-8"))
398
+
399
+
400
+ def test_configuration_loads_without_semantic_memory_section():
401
+ data = _sample_config_data()
402
+ data.pop("semantic_memory")
403
+
404
+ conf = Configuration(**data)
405
+
406
+ assert conf.semantic_memory.enabled is False
407
+ assert conf.semantic_memory.config_database is None
408
+
409
+
410
+ def test_configuration_semantic_memory_disabled_with_enabled_false_alone():
411
+ data = _sample_config_data()
412
+ data["semantic_memory"] = {"enabled": False}
413
+
414
+ conf = Configuration(**data)
415
+
416
+ assert conf.semantic_memory.enabled is False
417
+
418
+
419
+ @pytest.mark.parametrize("section", [None, {}])
420
+ def test_configuration_empty_semantic_section_is_disabled(section, caplog):
421
+ """A null or empty section is disabled silently, like an omitted one."""
422
+ data = _sample_config_data()
423
+ data["semantic_memory"] = section
424
+
425
+ with caplog.at_level(logging.WARNING):
426
+ conf = Configuration(**data)
427
+
428
+ assert conf.semantic_memory.enabled is False
429
+ assert "auto-disabled" not in caplog.text
430
+
431
+
432
+ def test_disabled_semantic_memory_round_trips_through_yaml():
433
+ """A complete-but-disabled section keeps enabled: false across save + reload."""
434
+ data = _sample_config_data()
435
+ data["semantic_memory"]["enabled"] = False
436
+ conf = Configuration(**data)
437
+
438
+ dumped = yaml.safe_load(conf.to_yaml())
439
+ conf_cp = Configuration(**dumped)
440
+
441
+ assert dumped["semantic_memory"]["enabled"] is False
442
+ assert dumped["semantic_memory"]["config_database"] == "profile_storage"
443
+ assert conf_cp.semantic_memory.enabled is False
444
+
445
+
446
+ def test_bare_disabled_semantic_memory_round_trips_through_yaml():
447
+ """The minimal {enabled: false} section survives the serializer's empty-value drop."""
448
+ data = _sample_config_data()
449
+ data["semantic_memory"] = {"enabled": False}
450
+ conf = Configuration(**data)
451
+
452
+ dumped = yaml.safe_load(conf.to_yaml())
453
+ conf_cp = Configuration(**dumped)
454
+
455
+ assert dumped["semantic_memory"]["enabled"] is False
456
+ assert "config_database" not in dumped["semantic_memory"]
457
+ assert conf_cp.semantic_memory.enabled is False