memmachine-server 0.3.1__tar.gz → 0.3.2__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.
- {memmachine_server-0.3.1/src/memmachine_server.egg-info → memmachine_server-0.3.2}/PKG-INFO +1 -1
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_database_conf.py +33 -0
- memmachine_server-0.3.2/server_tests/memmachine_server/common/resource_manager/test_database_manager.py +256 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/database_conf.py +43 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/database_manager.py +30 -15
- {memmachine_server-0.3.1 → memmachine_server-0.3.2/src/memmachine_server.egg-info}/PKG-INFO +1 -1
- memmachine_server-0.3.1/server_tests/memmachine_server/common/resource_manager/test_database_manager.py +0 -121
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/LICENSE +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/README.md +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/pyproject.toml +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/api/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/api/test_version.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_configuration.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_embedder_conf.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_episodic_config.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_language_model_conf.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_log_conf.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_mixin_confs.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_prompt_conf.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_reranker_conf.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_semantic_conf.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/configuration/test_server_conf.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/embedder/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/embedder/test_amazon_bedrock_embedder.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/embedder/test_openai_embedder.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/embedder/test_sentence_transformer_embedder.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/episode_store/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/episode_store/test_count_caching_episode_storage.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/episode_store/test_episode_model.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/episode_store/test_episode_storage.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/episode_store/test_sqlalchemy_episode_store_startup.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/filter/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/filter/test_filter_parser.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/filter/test_sql_filter_util.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/language_model/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/language_model/test_openai_chat_completions_language_model.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/language_model/test_openai_responses_language_model.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/fake_embedder.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_amazon_bedrock_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_bm25_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_cohere_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_cross_encoder_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_embedder_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_identity_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/reranker/test_rrf_hybrid_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/resource_manager/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/resource_manager/test_embedder_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/resource_manager/test_language_model_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/resource_manager/test_reranker_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/resource_manager/test_resource_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/session_manager/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/session_manager/test_session_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/session_manager/test_session_manager_migration.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/test_rw_locks.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/test_utils.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/vector_graph_store/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/vector_graph_store/test_nebula_graph_vector_graph_store.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/common/vector_graph_store/test_neo4j_vector_graph_store.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/conftest.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/conftest.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/declarative_memory/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/declarative_memory/test_declarative_memory.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/long_term_memory/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/long_term_memory/test_long_term_memory.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/short_term_memory/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/short_term_memory/test_short_term_memory.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/test_episodic_memory.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/test_episodic_memory_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/episodic_memory/test_instance_lru_cache.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/installation/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/installation/test_configuration_wizard.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/installation/test_memmachine_configure.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/installation/test_utilities.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/main/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/main/conftest.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/main/test_memachine.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/main/test_memmachine_delete_session.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/main/test_memmachine_integration.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/main/test_memmachine_mock.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/retrieval_agent/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/retrieval_agent/test_retrieval_agent.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/config_store/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/config_store/test_caching_semantic_config_storage.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/config_store/test_semantic_config_storage.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/conftest.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/mock_semantic_memory_objects.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/semantic_test_utils.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/helpers.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/original_schema.sql +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_set_id_migration.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_sqlalchemy_vs_alembic.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/conftest.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/in_memory_semantic_storage.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/storage/test_semantic_storage.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_history_cleanup.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_ingestion.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_llm.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_llm_integration.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_memory.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_background.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_integration.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_model.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/semantic_memory/test_semantic_session_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/test_config_router.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/test_config_service.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/test_mcp.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/test_router.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/test_service.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/api_v2/test_spec.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/prompt/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/prompt/test_prompt_utilities.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/server/test_middleware.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/test_data/longmemeval_snippet.json +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/setup.cfg +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/api/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/api/version.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/default_episode_summary_system_prompt.txt +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/default_episode_summary_user_prompt.txt +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/embedder_conf.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/episodic_config.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/language_model_conf.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/log_conf.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/mixin_confs.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/reranker_conf.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/configuration/retrieval_config.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/data_types.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/embedder/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/embedder/amazon_bedrock_embedder.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/embedder/embedder.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/embedder/openai_embedder.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/embedder/sentence_transformer_embedder.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/episode_store/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/episode_store/count_caching_episode_storage.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/episode_store/episode_model.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/episode_store/episode_sqlalchemy_store.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/episode_store/episode_storage.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/errors.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/filter/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/filter/filter_parser.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/filter/sql_filter_util.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/language_model/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/language_model/amazon_bedrock_language_model.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/language_model/language_model.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/language_model/openai_chat_completions_language_model.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/language_model/openai_responses_language_model.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/metrics_factory/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/metrics_factory/metrics_factory.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/metrics_factory/operation_tracker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/metrics_factory/prometheus_metrics_factory.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/neo4j_utils.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/amazon_bedrock_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/bm25_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/cohere_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/cross_encoder_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/embedder_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/identity_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/reranker/rrf_hybrid_reranker.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/base_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/embedder_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/language_model_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/reranker_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/resource_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/resource_manager/semantic_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/rw_locks.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/session_manager/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/session_manager/session_data_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/session_manager/session_data_manager_sql_impl.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/utils.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_graph_store/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_graph_store/data_types.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_graph_store/nebula_graph_vector_graph_store.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_graph_store/neo4j_vector_graph_store.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_graph_store/vector_graph_store.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_store/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_store/data_types.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/common/vector_store/vector_store.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/declarative_memory/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/declarative_memory/data_types.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/declarative_memory/declarative_memory.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/episodic_memory.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/episodic_memory_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/instance_lru_cache.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/long_term_memory/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/long_term_memory/long_term_memory.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/long_term_memory/service_locator.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/service_locator.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/short_term_memory/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/short_term_memory/service_locator.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/episodic_memory/short_term_memory/short_term_memory.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/installation/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/installation/configuration_wizard.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/installation/memmachine_configure.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/installation/utilities.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/main/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/main/memmachine.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/agents/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/agents/coq_agent.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/agents/memmachine_retriever.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/agents/split_query_agent.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/agents/tool_select_agent.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/common/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/common/agent_api.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/retrieval_agent/service_locator.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/config_store/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/config_store/caching_semantic_config_storage.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/config_store/config_store.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/config_store/config_store_sqlalchemy.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/semantic_ingestion.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/semantic_llm.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/semantic_memory.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/semantic_model.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/semantic_session_manager.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/env.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/script.py.mako +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/001_initial_migration.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/3d6aaebdc526_sync_sqlalchemy_schema.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/62dff1150a46_add_created_at_to_history_add.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/79f00a9f2409_change_history_id_to_string.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/843f6d216d10_rename_semantic_type_to_semantic_.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/adb5618bd4ee_remove_history_table.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/b65f7f4a9d2c_migrate_legacy_set_ids.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/d1a9df11343b_add_indexes.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/neo4j_semantic_storage.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/sqlalchemy_pgvector_semantic.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/storage/storage_base.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/util/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/semantic_memory/util/semantic_prompt_template.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/config_router.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/config_service.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/exceptions.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/mcp.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/router.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/api_v2/service.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/app.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/diagnostics.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/mcp_http.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/mcp_stdio.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/middleware.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/__init__.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/coding_style_prompt.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/crm_prompt.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/default_prompts.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/financial_analyst_prompt.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/health_assistant_prompt.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/profile_prompt.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/prompt_utilities.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server/server/prompt/writing_assistant_prompt.py +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server.egg-info/SOURCES.txt +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server.egg-info/dependency_links.txt +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server.egg-info/entry_points.txt +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/src/memmachine_server.egg-info/requires.txt +0 -0
- {memmachine_server-0.3.1 → memmachine_server-0.3.2}/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.
|
|
3
|
+
Version: 0.3.2
|
|
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
|
|
@@ -166,6 +166,39 @@ def test_serialize_deserialize_database_conf(db_conf_dict):
|
|
|
166
166
|
assert conf == conf_cp
|
|
167
167
|
|
|
168
168
|
|
|
169
|
+
def test_neo4j_pool_lifecycle_fields():
|
|
170
|
+
# Defaults are None (use driver's internal defaults)
|
|
171
|
+
conf = Neo4jConf()
|
|
172
|
+
assert conf.max_connection_lifetime is None
|
|
173
|
+
assert conf.liveness_check_timeout is None
|
|
174
|
+
|
|
175
|
+
# Explicit values round-trip correctly
|
|
176
|
+
conf = Neo4jConf(max_connection_lifetime=3000.0, liveness_check_timeout=300.0)
|
|
177
|
+
assert conf.max_connection_lifetime == 3000.0
|
|
178
|
+
assert conf.liveness_check_timeout == 300.0
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def test_sqlalchemy_pool_lifecycle_fields():
|
|
182
|
+
# Defaults are None (use SQLAlchemy's internal defaults)
|
|
183
|
+
conf = SqlAlchemyConf(dialect="sqlite", driver="aiosqlite", path="test.db")
|
|
184
|
+
assert conf.pool_timeout is None
|
|
185
|
+
assert conf.pool_recycle is None
|
|
186
|
+
assert conf.pool_pre_ping is None
|
|
187
|
+
|
|
188
|
+
# Explicit values round-trip correctly
|
|
189
|
+
conf = SqlAlchemyConf(
|
|
190
|
+
dialect="sqlite",
|
|
191
|
+
driver="aiosqlite",
|
|
192
|
+
path="test.db",
|
|
193
|
+
pool_timeout=30,
|
|
194
|
+
pool_recycle=3000,
|
|
195
|
+
pool_pre_ping=True,
|
|
196
|
+
)
|
|
197
|
+
assert conf.pool_timeout == 30
|
|
198
|
+
assert conf.pool_recycle == 3000
|
|
199
|
+
assert conf.pool_pre_ping is True
|
|
200
|
+
|
|
201
|
+
|
|
169
202
|
def test_neo4j_uri():
|
|
170
203
|
conf = Neo4jConf(uri="bolt://localhost:1234")
|
|
171
204
|
assert conf.get_uri() == "bolt://localhost:1234"
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
from typing import Any, cast
|
|
2
|
+
from unittest.mock import AsyncMock, MagicMock, patch
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
from pydantic import SecretStr
|
|
6
|
+
from sqlalchemy.ext.asyncio import AsyncEngine
|
|
7
|
+
|
|
8
|
+
from memmachine_server.common.configuration.database_conf import (
|
|
9
|
+
DatabasesConf,
|
|
10
|
+
Neo4jConf,
|
|
11
|
+
SqlAlchemyConf,
|
|
12
|
+
)
|
|
13
|
+
from memmachine_server.common.resource_manager.database_manager import DatabaseManager
|
|
14
|
+
from memmachine_server.common.vector_graph_store import VectorGraphStore
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@pytest.fixture
|
|
18
|
+
def mock_conf():
|
|
19
|
+
"""Mock StoragesConf with dummy connection configurations."""
|
|
20
|
+
conf = MagicMock(spec=DatabasesConf)
|
|
21
|
+
conf.neo4j_confs = {
|
|
22
|
+
"neo1": Neo4jConf(
|
|
23
|
+
host="localhost", port=1234, user="neo", password=SecretStr("pw")
|
|
24
|
+
),
|
|
25
|
+
}
|
|
26
|
+
conf.relational_db_confs = {
|
|
27
|
+
"pg1": SqlAlchemyConf(
|
|
28
|
+
dialect="postgresql",
|
|
29
|
+
driver="asyncpg",
|
|
30
|
+
host="localhost",
|
|
31
|
+
port=5432,
|
|
32
|
+
user="user",
|
|
33
|
+
password=SecretStr("password"),
|
|
34
|
+
db_name="testdb",
|
|
35
|
+
),
|
|
36
|
+
"sqlite1": SqlAlchemyConf(
|
|
37
|
+
dialect="sqlite",
|
|
38
|
+
driver="aiosqlite",
|
|
39
|
+
path="test.db",
|
|
40
|
+
),
|
|
41
|
+
}
|
|
42
|
+
conf.sqlite_confs = {}
|
|
43
|
+
conf.nebula_graph_confs = {}
|
|
44
|
+
return conf
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@pytest.mark.asyncio
|
|
48
|
+
async def test_build_neo4j(mock_conf):
|
|
49
|
+
builder = DatabaseManager(mock_conf)
|
|
50
|
+
await builder._build_neo4j()
|
|
51
|
+
|
|
52
|
+
assert "neo1" in builder.graph_stores
|
|
53
|
+
driver = builder.graph_stores["neo1"]
|
|
54
|
+
assert isinstance(driver, VectorGraphStore)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@pytest.mark.asyncio
|
|
58
|
+
async def test_validate_neo4j(mock_conf):
|
|
59
|
+
builder = DatabaseManager(mock_conf)
|
|
60
|
+
|
|
61
|
+
mock_driver = MagicMock()
|
|
62
|
+
mock_session = AsyncMock()
|
|
63
|
+
mock_result = AsyncMock()
|
|
64
|
+
mock_record = {"ok": 1}
|
|
65
|
+
|
|
66
|
+
mock_driver.close = AsyncMock()
|
|
67
|
+
mock_result.single.return_value = mock_record
|
|
68
|
+
mock_session.run.return_value = mock_result
|
|
69
|
+
|
|
70
|
+
mock_driver.session.return_value.__aenter__ = AsyncMock(return_value=mock_session)
|
|
71
|
+
mock_driver.session.return_value.__aexit__ = AsyncMock(return_value=None)
|
|
72
|
+
|
|
73
|
+
builder.neo4j_drivers = {"neo1": mock_driver}
|
|
74
|
+
|
|
75
|
+
await builder._validate_neo4j_drivers()
|
|
76
|
+
mock_session.run.assert_awaited_once_with("RETURN 1 AS ok")
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@pytest.mark.asyncio
|
|
80
|
+
async def test_build_sqlite(mock_conf):
|
|
81
|
+
builder = DatabaseManager(mock_conf)
|
|
82
|
+
await builder._build_sql_engines()
|
|
83
|
+
|
|
84
|
+
assert "sqlite1" in builder.sql_engines
|
|
85
|
+
assert isinstance(builder.sql_engines["sqlite1"], AsyncEngine)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@pytest.mark.asyncio
|
|
89
|
+
async def test_build_and_validate_sqlite():
|
|
90
|
+
conf = MagicMock(spec=DatabasesConf)
|
|
91
|
+
conf.neo4j_confs = {}
|
|
92
|
+
conf.nebula_graph_confs = {}
|
|
93
|
+
conf.relational_db_confs = {
|
|
94
|
+
"sqlite1": SqlAlchemyConf(
|
|
95
|
+
dialect="sqlite",
|
|
96
|
+
driver="aiosqlite",
|
|
97
|
+
path=":memory:",
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
builder = DatabaseManager(conf)
|
|
101
|
+
await builder.build_all(validate=True)
|
|
102
|
+
# If no exception is raised, validation passed
|
|
103
|
+
assert "sqlite1" in builder.sql_engines
|
|
104
|
+
await builder.close()
|
|
105
|
+
assert "sqlite1" not in builder.sql_engines
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
@pytest.mark.asyncio
|
|
109
|
+
async def test_build_all_without_validation(mock_conf):
|
|
110
|
+
builder = DatabaseManager(mock_conf)
|
|
111
|
+
builder_any = cast(Any, builder)
|
|
112
|
+
builder_any._build_neo4j = AsyncMock()
|
|
113
|
+
builder_any._build_sql_engines = AsyncMock()
|
|
114
|
+
builder_any._validate_neo4j_drivers = AsyncMock()
|
|
115
|
+
builder_any._validate_sql_engines = AsyncMock()
|
|
116
|
+
|
|
117
|
+
await builder.build_all(validate=False)
|
|
118
|
+
|
|
119
|
+
assert "sqlite1" in builder.sql_engines
|
|
120
|
+
assert "pg1" in builder.sql_engines
|
|
121
|
+
assert "neo1" in builder.graph_stores
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@pytest.mark.asyncio
|
|
125
|
+
async def test_neo4j_pool_lifecycle_kwargs():
|
|
126
|
+
"""max_connection_lifetime and liveness_check_timeout are forwarded to the driver."""
|
|
127
|
+
conf = MagicMock(spec=DatabasesConf)
|
|
128
|
+
neo4j_conf = Neo4jConf(
|
|
129
|
+
host="localhost",
|
|
130
|
+
port=7687,
|
|
131
|
+
user="neo4j",
|
|
132
|
+
password=SecretStr("pw"),
|
|
133
|
+
max_connection_lifetime=3000.0,
|
|
134
|
+
liveness_check_timeout=300.0,
|
|
135
|
+
)
|
|
136
|
+
conf.neo4j_confs = {"neo1": neo4j_conf}
|
|
137
|
+
conf.relational_db_confs = {}
|
|
138
|
+
conf.nebula_graph_confs = {}
|
|
139
|
+
|
|
140
|
+
mock_driver = MagicMock()
|
|
141
|
+
mock_driver.close = AsyncMock()
|
|
142
|
+
|
|
143
|
+
with (
|
|
144
|
+
patch(
|
|
145
|
+
"memmachine_server.common.resource_manager.database_manager.AsyncGraphDatabase.driver",
|
|
146
|
+
return_value=mock_driver,
|
|
147
|
+
) as mock_driver_cls,
|
|
148
|
+
patch(
|
|
149
|
+
"memmachine_server.common.resource_manager.database_manager.Neo4jVectorGraphStoreParams",
|
|
150
|
+
),
|
|
151
|
+
patch(
|
|
152
|
+
"memmachine_server.common.resource_manager.database_manager.Neo4jVectorGraphStore",
|
|
153
|
+
),
|
|
154
|
+
):
|
|
155
|
+
builder = DatabaseManager(conf)
|
|
156
|
+
await builder.async_get_neo4j_driver("neo1")
|
|
157
|
+
|
|
158
|
+
call_kwargs = mock_driver_cls.call_args.kwargs
|
|
159
|
+
assert call_kwargs["max_connection_lifetime"] == 3000.0
|
|
160
|
+
assert call_kwargs["liveness_check_timeout"] == 300.0
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@pytest.mark.asyncio
|
|
164
|
+
async def test_sqlalchemy_pool_lifecycle_kwargs():
|
|
165
|
+
"""pool_timeout, pool_recycle, and pool_pre_ping are forwarded to create_async_engine."""
|
|
166
|
+
conf = MagicMock(spec=DatabasesConf)
|
|
167
|
+
sql_conf = SqlAlchemyConf(
|
|
168
|
+
dialect="sqlite",
|
|
169
|
+
driver="aiosqlite",
|
|
170
|
+
path=":memory:",
|
|
171
|
+
pool_timeout=30,
|
|
172
|
+
pool_recycle=3000,
|
|
173
|
+
pool_pre_ping=True,
|
|
174
|
+
)
|
|
175
|
+
conf.neo4j_confs = {}
|
|
176
|
+
conf.nebula_graph_confs = {}
|
|
177
|
+
conf.relational_db_confs = {"db1": sql_conf}
|
|
178
|
+
|
|
179
|
+
mock_engine = MagicMock(spec=AsyncEngine)
|
|
180
|
+
|
|
181
|
+
with patch(
|
|
182
|
+
"memmachine_server.common.resource_manager.database_manager.create_async_engine",
|
|
183
|
+
return_value=mock_engine,
|
|
184
|
+
) as mock_create:
|
|
185
|
+
builder = DatabaseManager(conf)
|
|
186
|
+
await builder.async_get_sql_engine("db1")
|
|
187
|
+
|
|
188
|
+
call_kwargs = mock_create.call_args.kwargs
|
|
189
|
+
assert call_kwargs["pool_timeout"] == 30
|
|
190
|
+
assert call_kwargs["pool_recycle"] == 3000
|
|
191
|
+
assert call_kwargs["pool_pre_ping"] is True
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
@pytest.mark.asyncio
|
|
195
|
+
async def test_neo4j_pool_lifecycle_kwargs_none_omitted():
|
|
196
|
+
"""When pool lifecycle fields are None, they are not forwarded to the driver."""
|
|
197
|
+
conf = MagicMock(spec=DatabasesConf)
|
|
198
|
+
neo4j_conf = Neo4jConf(
|
|
199
|
+
host="localhost",
|
|
200
|
+
port=7687,
|
|
201
|
+
user="neo4j",
|
|
202
|
+
password=SecretStr("pw"),
|
|
203
|
+
)
|
|
204
|
+
conf.neo4j_confs = {"neo1": neo4j_conf}
|
|
205
|
+
conf.relational_db_confs = {}
|
|
206
|
+
conf.nebula_graph_confs = {}
|
|
207
|
+
|
|
208
|
+
mock_driver = MagicMock()
|
|
209
|
+
mock_driver.close = AsyncMock()
|
|
210
|
+
|
|
211
|
+
with (
|
|
212
|
+
patch(
|
|
213
|
+
"memmachine_server.common.resource_manager.database_manager.AsyncGraphDatabase.driver",
|
|
214
|
+
return_value=mock_driver,
|
|
215
|
+
) as mock_driver_cls,
|
|
216
|
+
patch(
|
|
217
|
+
"memmachine_server.common.resource_manager.database_manager.Neo4jVectorGraphStoreParams",
|
|
218
|
+
),
|
|
219
|
+
patch(
|
|
220
|
+
"memmachine_server.common.resource_manager.database_manager.Neo4jVectorGraphStore",
|
|
221
|
+
),
|
|
222
|
+
):
|
|
223
|
+
builder = DatabaseManager(conf)
|
|
224
|
+
await builder.async_get_neo4j_driver("neo1")
|
|
225
|
+
|
|
226
|
+
call_kwargs = mock_driver_cls.call_args.kwargs
|
|
227
|
+
assert "max_connection_lifetime" not in call_kwargs
|
|
228
|
+
assert "liveness_check_timeout" not in call_kwargs
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
@pytest.mark.asyncio
|
|
232
|
+
async def test_sqlalchemy_pool_lifecycle_kwargs_none_omitted():
|
|
233
|
+
"""When pool lifecycle fields are None, they are not forwarded to create_async_engine."""
|
|
234
|
+
conf = MagicMock(spec=DatabasesConf)
|
|
235
|
+
sql_conf = SqlAlchemyConf(
|
|
236
|
+
dialect="sqlite",
|
|
237
|
+
driver="aiosqlite",
|
|
238
|
+
path=":memory:",
|
|
239
|
+
)
|
|
240
|
+
conf.neo4j_confs = {}
|
|
241
|
+
conf.nebula_graph_confs = {}
|
|
242
|
+
conf.relational_db_confs = {"db1": sql_conf}
|
|
243
|
+
|
|
244
|
+
mock_engine = MagicMock(spec=AsyncEngine)
|
|
245
|
+
|
|
246
|
+
with patch(
|
|
247
|
+
"memmachine_server.common.resource_manager.database_manager.create_async_engine",
|
|
248
|
+
return_value=mock_engine,
|
|
249
|
+
) as mock_create:
|
|
250
|
+
builder = DatabaseManager(conf)
|
|
251
|
+
await builder.async_get_sql_engine("db1")
|
|
252
|
+
|
|
253
|
+
call_kwargs = mock_create.call_args.kwargs
|
|
254
|
+
assert "pool_timeout" not in call_kwargs
|
|
255
|
+
assert "pool_recycle" not in call_kwargs
|
|
256
|
+
assert "pool_pre_ping" not in call_kwargs
|
|
@@ -60,6 +60,24 @@ class Neo4jConf(YamlSerializableMixin, PasswordMixin):
|
|
|
60
60
|
"Internal default is 60.0."
|
|
61
61
|
),
|
|
62
62
|
)
|
|
63
|
+
max_connection_lifetime: float | None = Field(
|
|
64
|
+
default=None,
|
|
65
|
+
description=(
|
|
66
|
+
"Maximum connection lifetime in seconds. Connections older than this "
|
|
67
|
+
"are proactively closed and replaced. Set below your infrastructure's "
|
|
68
|
+
"idle-connection timeout (e.g. AuraDB's 60-minute limit) to avoid "
|
|
69
|
+
"handing out defunct connections. Internal default is 3600."
|
|
70
|
+
),
|
|
71
|
+
)
|
|
72
|
+
liveness_check_timeout: float | None = Field(
|
|
73
|
+
default=None,
|
|
74
|
+
description=(
|
|
75
|
+
"Idle time in seconds after which a pooled connection is tested for "
|
|
76
|
+
"liveness before being handed to a caller. Catches connections that "
|
|
77
|
+
"were reset server-side while sitting idle in the pool. "
|
|
78
|
+
"Set to None to disable liveness checks."
|
|
79
|
+
),
|
|
80
|
+
)
|
|
63
81
|
|
|
64
82
|
def get_uri(self) -> str:
|
|
65
83
|
if self.uri:
|
|
@@ -241,6 +259,31 @@ class SqlAlchemyConf(YamlSerializableMixin, PasswordMixin):
|
|
|
241
259
|
"disposed of when no longer needed."
|
|
242
260
|
),
|
|
243
261
|
)
|
|
262
|
+
pool_timeout: int | None = Field(
|
|
263
|
+
default=None,
|
|
264
|
+
description=(
|
|
265
|
+
"Maximum time in seconds to wait for a connection from the pool. "
|
|
266
|
+
"If no connection is available within this period, a TimeoutError "
|
|
267
|
+
"is raised. Internal default is 30."
|
|
268
|
+
),
|
|
269
|
+
)
|
|
270
|
+
pool_recycle: int | None = Field(
|
|
271
|
+
default=None,
|
|
272
|
+
description=(
|
|
273
|
+
"Maximum age of a connection in seconds before it is recycled. "
|
|
274
|
+
"Connections older than this are transparently replaced on checkout. "
|
|
275
|
+
"Set below your database server's idle-connection timeout to avoid "
|
|
276
|
+
"handing out stale connections. Internal default is -1 (disabled)."
|
|
277
|
+
),
|
|
278
|
+
)
|
|
279
|
+
pool_pre_ping: bool | None = Field(
|
|
280
|
+
default=None,
|
|
281
|
+
description=(
|
|
282
|
+
"When True, test each connection for liveness (via a lightweight "
|
|
283
|
+
"SELECT 1) before checking it out of the pool. Catches connections "
|
|
284
|
+
"that were reset server-side. Internal default is False."
|
|
285
|
+
),
|
|
286
|
+
)
|
|
244
287
|
|
|
245
288
|
@property
|
|
246
289
|
def schema_part(self) -> str:
|
|
@@ -9,7 +9,10 @@ from neo4j import AsyncDriver, AsyncGraphDatabase
|
|
|
9
9
|
from sqlalchemy import text
|
|
10
10
|
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
|
|
11
11
|
|
|
12
|
-
from memmachine_server.common.configuration.database_conf import
|
|
12
|
+
from memmachine_server.common.configuration.database_conf import (
|
|
13
|
+
DatabasesConf,
|
|
14
|
+
Neo4jConf,
|
|
15
|
+
)
|
|
13
16
|
from memmachine_server.common.errors import (
|
|
14
17
|
Neo4JConfigurationError,
|
|
15
18
|
SQLConfigurationError,
|
|
@@ -120,6 +123,25 @@ class DatabaseManager:
|
|
|
120
123
|
if tasks:
|
|
121
124
|
await asyncio.gather(*tasks)
|
|
122
125
|
|
|
126
|
+
@staticmethod
|
|
127
|
+
def _build_neo4j_driver_kwargs(conf: Neo4jConf) -> dict[str, Any]:
|
|
128
|
+
"""Build keyword arguments for AsyncGraphDatabase.driver from config."""
|
|
129
|
+
kwargs: dict[str, Any] = {
|
|
130
|
+
"uri": conf.get_uri(),
|
|
131
|
+
"auth": (conf.user, conf.password.get_secret_value()),
|
|
132
|
+
}
|
|
133
|
+
optional_fields = (
|
|
134
|
+
"max_connection_pool_size",
|
|
135
|
+
"connection_acquisition_timeout",
|
|
136
|
+
"max_connection_lifetime",
|
|
137
|
+
"liveness_check_timeout",
|
|
138
|
+
)
|
|
139
|
+
for field in optional_fields:
|
|
140
|
+
value = getattr(conf, field)
|
|
141
|
+
if value is not None:
|
|
142
|
+
kwargs[field] = value
|
|
143
|
+
return kwargs
|
|
144
|
+
|
|
123
145
|
async def async_get_neo4j_driver(
|
|
124
146
|
self, name: str, validate: bool = False
|
|
125
147
|
) -> AsyncDriver:
|
|
@@ -136,20 +158,7 @@ class DatabaseManager:
|
|
|
136
158
|
if not conf:
|
|
137
159
|
raise ValueError(f"Neo4j config '{name}' not found.")
|
|
138
160
|
|
|
139
|
-
|
|
140
|
-
"uri": conf.get_uri(),
|
|
141
|
-
"auth": (conf.user, conf.password.get_secret_value()),
|
|
142
|
-
}
|
|
143
|
-
if conf.max_connection_pool_size is not None:
|
|
144
|
-
driver_kwargs["max_connection_pool_size"] = (
|
|
145
|
-
conf.max_connection_pool_size
|
|
146
|
-
)
|
|
147
|
-
if conf.connection_acquisition_timeout is not None:
|
|
148
|
-
driver_kwargs["connection_acquisition_timeout"] = (
|
|
149
|
-
conf.connection_acquisition_timeout
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
driver = AsyncGraphDatabase.driver(**driver_kwargs)
|
|
161
|
+
driver = AsyncGraphDatabase.driver(**self._build_neo4j_driver_kwargs(conf))
|
|
153
162
|
if validate:
|
|
154
163
|
await self.validate_neo4j_driver(name, driver)
|
|
155
164
|
self.neo4j_drivers[name] = driver
|
|
@@ -255,6 +264,12 @@ class DatabaseManager:
|
|
|
255
264
|
engine_kwargs["pool_size"] = conf.pool_size
|
|
256
265
|
if conf.max_overflow is not None:
|
|
257
266
|
engine_kwargs["max_overflow"] = conf.max_overflow
|
|
267
|
+
if conf.pool_timeout is not None:
|
|
268
|
+
engine_kwargs["pool_timeout"] = conf.pool_timeout
|
|
269
|
+
if conf.pool_recycle is not None:
|
|
270
|
+
engine_kwargs["pool_recycle"] = conf.pool_recycle
|
|
271
|
+
if conf.pool_pre_ping is not None:
|
|
272
|
+
engine_kwargs["pool_pre_ping"] = conf.pool_pre_ping
|
|
258
273
|
|
|
259
274
|
engine = create_async_engine(conf.uri, **engine_kwargs)
|
|
260
275
|
if validate:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memmachine-server
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
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
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
from typing import Any, cast
|
|
2
|
-
from unittest.mock import AsyncMock, MagicMock
|
|
3
|
-
|
|
4
|
-
import pytest
|
|
5
|
-
from pydantic import SecretStr
|
|
6
|
-
from sqlalchemy.ext.asyncio import AsyncEngine
|
|
7
|
-
|
|
8
|
-
from memmachine_server.common.configuration.database_conf import (
|
|
9
|
-
DatabasesConf,
|
|
10
|
-
Neo4jConf,
|
|
11
|
-
SqlAlchemyConf,
|
|
12
|
-
)
|
|
13
|
-
from memmachine_server.common.resource_manager.database_manager import DatabaseManager
|
|
14
|
-
from memmachine_server.common.vector_graph_store import VectorGraphStore
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@pytest.fixture
|
|
18
|
-
def mock_conf():
|
|
19
|
-
"""Mock StoragesConf with dummy connection configurations."""
|
|
20
|
-
conf = MagicMock(spec=DatabasesConf)
|
|
21
|
-
conf.neo4j_confs = {
|
|
22
|
-
"neo1": Neo4jConf(
|
|
23
|
-
host="localhost", port=1234, user="neo", password=SecretStr("pw")
|
|
24
|
-
),
|
|
25
|
-
}
|
|
26
|
-
conf.relational_db_confs = {
|
|
27
|
-
"pg1": SqlAlchemyConf(
|
|
28
|
-
dialect="postgresql",
|
|
29
|
-
driver="asyncpg",
|
|
30
|
-
host="localhost",
|
|
31
|
-
port=5432,
|
|
32
|
-
user="user",
|
|
33
|
-
password=SecretStr("password"),
|
|
34
|
-
db_name="testdb",
|
|
35
|
-
),
|
|
36
|
-
"sqlite1": SqlAlchemyConf(
|
|
37
|
-
dialect="sqlite",
|
|
38
|
-
driver="aiosqlite",
|
|
39
|
-
path="test.db",
|
|
40
|
-
),
|
|
41
|
-
}
|
|
42
|
-
conf.sqlite_confs = {}
|
|
43
|
-
conf.nebula_graph_confs = {}
|
|
44
|
-
return conf
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
@pytest.mark.asyncio
|
|
48
|
-
async def test_build_neo4j(mock_conf):
|
|
49
|
-
builder = DatabaseManager(mock_conf)
|
|
50
|
-
await builder._build_neo4j()
|
|
51
|
-
|
|
52
|
-
assert "neo1" in builder.graph_stores
|
|
53
|
-
driver = builder.graph_stores["neo1"]
|
|
54
|
-
assert isinstance(driver, VectorGraphStore)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
@pytest.mark.asyncio
|
|
58
|
-
async def test_validate_neo4j(mock_conf):
|
|
59
|
-
builder = DatabaseManager(mock_conf)
|
|
60
|
-
|
|
61
|
-
mock_driver = MagicMock()
|
|
62
|
-
mock_session = AsyncMock()
|
|
63
|
-
mock_result = AsyncMock()
|
|
64
|
-
mock_record = {"ok": 1}
|
|
65
|
-
|
|
66
|
-
mock_driver.close = AsyncMock()
|
|
67
|
-
mock_result.single.return_value = mock_record
|
|
68
|
-
mock_session.run.return_value = mock_result
|
|
69
|
-
|
|
70
|
-
mock_driver.session.return_value.__aenter__ = AsyncMock(return_value=mock_session)
|
|
71
|
-
mock_driver.session.return_value.__aexit__ = AsyncMock(return_value=None)
|
|
72
|
-
|
|
73
|
-
builder.neo4j_drivers = {"neo1": mock_driver}
|
|
74
|
-
|
|
75
|
-
await builder._validate_neo4j_drivers()
|
|
76
|
-
mock_session.run.assert_awaited_once_with("RETURN 1 AS ok")
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
@pytest.mark.asyncio
|
|
80
|
-
async def test_build_sqlite(mock_conf):
|
|
81
|
-
builder = DatabaseManager(mock_conf)
|
|
82
|
-
await builder._build_sql_engines()
|
|
83
|
-
|
|
84
|
-
assert "sqlite1" in builder.sql_engines
|
|
85
|
-
assert isinstance(builder.sql_engines["sqlite1"], AsyncEngine)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
@pytest.mark.asyncio
|
|
89
|
-
async def test_build_and_validate_sqlite():
|
|
90
|
-
conf = MagicMock(spec=DatabasesConf)
|
|
91
|
-
conf.neo4j_confs = {}
|
|
92
|
-
conf.nebula_graph_confs = {}
|
|
93
|
-
conf.relational_db_confs = {
|
|
94
|
-
"sqlite1": SqlAlchemyConf(
|
|
95
|
-
dialect="sqlite",
|
|
96
|
-
driver="aiosqlite",
|
|
97
|
-
path=":memory:",
|
|
98
|
-
)
|
|
99
|
-
}
|
|
100
|
-
builder = DatabaseManager(conf)
|
|
101
|
-
await builder.build_all(validate=True)
|
|
102
|
-
# If no exception is raised, validation passed
|
|
103
|
-
assert "sqlite1" in builder.sql_engines
|
|
104
|
-
await builder.close()
|
|
105
|
-
assert "sqlite1" not in builder.sql_engines
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
@pytest.mark.asyncio
|
|
109
|
-
async def test_build_all_without_validation(mock_conf):
|
|
110
|
-
builder = DatabaseManager(mock_conf)
|
|
111
|
-
builder_any = cast(Any, builder)
|
|
112
|
-
builder_any._build_neo4j = AsyncMock()
|
|
113
|
-
builder_any._build_sql_engines = AsyncMock()
|
|
114
|
-
builder_any._validate_neo4j_drivers = AsyncMock()
|
|
115
|
-
builder_any._validate_sql_engines = AsyncMock()
|
|
116
|
-
|
|
117
|
-
await builder.build_all(validate=False)
|
|
118
|
-
|
|
119
|
-
assert "sqlite1" in builder.sql_engines
|
|
120
|
-
assert "pg1" in builder.sql_engines
|
|
121
|
-
assert "neo1" in builder.graph_stores
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{memmachine_server-0.3.1 → memmachine_server-0.3.2}/server_tests/memmachine_server/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|