memmachine-server 0.3.8__tar.gz → 0.3.9__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.8 → memmachine_server-0.3.9}/PKG-INFO +2 -2
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/pyproject.toml +1 -1
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_configuration.py +171 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/episode_store/test_episode_storage.py +20 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/session_manager/test_session_manager.py +2 -2
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/conftest.py +8 -2
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/segment_store/test_sqlalchemy_segment_store.py +22 -16
- memmachine_server-0.3.9/server_tests/memmachine_server/episodic_memory/event_memory/segmenter/test_passthrough_segmenter.py +92 -0
- memmachine_server-0.3.9/server_tests/memmachine_server/episodic_memory/long_term_memory/test_episode_to_event.py +163 -0
- memmachine_server-0.3.9/server_tests/memmachine_server/episodic_memory/long_term_memory/test_event_backend_wiring.py +583 -0
- memmachine_server-0.3.9/server_tests/memmachine_server/episodic_memory/long_term_memory/test_long_term_memory.py +315 -0
- memmachine_server-0.3.9/server_tests/memmachine_server/episodic_memory/long_term_memory/test_service_locator.py +88 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/test_episodic_memory.py +1 -1
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/installation/test_configuration_wizard.py +87 -3
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/main/test_memmachine_mock.py +2 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/test_config_router.py +23 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/test_config_service.py +136 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/test_router.py +122 -4
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/episodic_config.py +215 -8
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/episode_store/count_caching_episode_storage.py +7 -5
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/episode_store/episode_sqlalchemy_store.py +23 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/episode_store/episode_storage.py +13 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/__init__.py +12 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/resource_manager.py +26 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/episodic_memory.py +1 -1
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segment_store/sqlalchemy_segment_store.py +1 -1
- memmachine_server-0.3.9/src/memmachine_server/episodic_memory/event_memory/segmenter/passthrough_segmenter.py +32 -0
- memmachine_server-0.3.9/src/memmachine_server/episodic_memory/long_term_memory/__init__.py +17 -0
- memmachine_server-0.3.9/src/memmachine_server/episodic_memory/long_term_memory/long_term_memory.py +691 -0
- memmachine_server-0.3.9/src/memmachine_server/episodic_memory/long_term_memory/service_locator.py +234 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/installation/configuration_wizard.py +146 -3
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/main/memmachine.py +43 -12
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/config_router.py +4 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/config_service.py +109 -20
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/router.py +62 -14
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server.egg-info/PKG-INFO +2 -2
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server.egg-info/SOURCES.txt +5 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server.egg-info/requires.txt +1 -1
- memmachine_server-0.3.8/server_tests/memmachine_server/episodic_memory/long_term_memory/test_long_term_memory.py +0 -832
- memmachine_server-0.3.8/src/memmachine_server/episodic_memory/long_term_memory/__init__.py +0 -8
- memmachine_server-0.3.8/src/memmachine_server/episodic_memory/long_term_memory/long_term_memory.py +0 -362
- memmachine_server-0.3.8/src/memmachine_server/episodic_memory/long_term_memory/service_locator.py +0 -27
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/LICENSE +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/README.md +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/api/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/api/test_version.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_database_conf.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_embedder_conf.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_episodic_config.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_language_model_conf.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_log_conf.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_mixin_confs.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_prompt_conf.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_reranker_conf.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_semantic_conf.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/configuration/test_server_conf.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/embedder/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/embedder/test_amazon_bedrock_embedder.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/embedder/test_embedder.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/embedder/test_openai_embedder.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/embedder/test_sentence_transformer_embedder.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/episode_store/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/episode_store/test_count_caching_episode_storage.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/episode_store/test_episode_model.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/episode_store/test_sqlalchemy_episode_store_startup.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/filter/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/filter/test_filter_parser.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/filter/test_sql_filter_util.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/language_model/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/language_model/test_openai_chat_completions_language_model.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/language_model/test_openai_responses_language_model.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/payload_codec/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/payload_codec/test_payload_codec.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/payload_codec/test_payload_codec_config.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/fake_embedder.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_amazon_bedrock_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_bm25_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_cohere_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_cross_encoder_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_embedder_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_identity_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/reranker/test_rrf_hybrid_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/resource_manager/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/resource_manager/test_database_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/resource_manager/test_embedder_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/resource_manager/test_language_model_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/resource_manager/test_reranker_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/resource_manager/test_resource_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/session_manager/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/session_manager/test_session_manager_migration.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/test_properties_json.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/test_rw_locks.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/test_utils.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_graph_store/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_graph_store/test_nebula_graph_vector_graph_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_graph_store/test_neo4j_vector_graph_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/in_memory_vector_store_collection.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/test_qdrant_vector_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/test_sqlite_vec_vector_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/test_sqlite_vector_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/vector_search_engine/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/vector_search_engine/test_hnswlib_engine.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/common/vector_store/vector_search_engine/test_usearch_engine.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/conftest.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/conftest.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/declarative_memory/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/declarative_memory/test_declarative_memory.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/declarative_memory/test_string_from_episode_context.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/deriver/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/deriver/test_text_deriver.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/segment_store/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/segment_store/test_data_types.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/segmenter/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/segmenter/test_text_segmenter.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/test_data_types.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/event_memory/test_event_memory.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/long_term_memory/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/short_term_memory/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/short_term_memory/test_short_term_memory.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/test_episodic_memory_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/episodic_memory/test_instance_lru_cache.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/installation/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/installation/test_memmachine_configure.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/installation/test_utilities.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/main/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/main/conftest.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/main/test_memachine.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/main/test_memmachine_delete_session.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/main/test_memmachine_integration.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/retrieval_agent/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/retrieval_agent/test_retrieval_agent.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/cluster_store/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/cluster_store/test_cluster_state_storage.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/config_store/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/config_store/test_caching_semantic_config_storage.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/config_store/test_semantic_config_storage.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/conftest.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/mock_semantic_memory_objects.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/semantic_test_utils.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/helpers.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/original_schema.sql +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_set_id_migration.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_sqlalchemy_vs_alembic.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/conftest.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/in_memory_semantic_storage.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/test_semantic_storage.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/storage/test_text_sanitizer.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_cluster_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_cluster_splitter.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_history_cleanup.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_ingestion.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_llm.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_llm_integration.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_memory.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_background.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_integration.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_model.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/semantic_memory/test_semantic_session_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/test_mcp.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/test_service.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/api_v2/test_spec.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/prompt/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/prompt/test_prompt_utilities.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/server/test_middleware.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/server_tests/memmachine_server/test_data/longmemeval_snippet.json +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/setup.cfg +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/api/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/api/version.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/database_conf.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/default_episode_summary_system_prompt.txt +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/default_episode_summary_user_prompt.txt +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/embedder_conf.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/language_model_conf.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/log_conf.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/mixin_confs.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/reranker_conf.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/configuration/retrieval_config.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/data_types.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/embedder/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/embedder/amazon_bedrock_embedder.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/embedder/embedder.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/embedder/openai_embedder.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/embedder/sentence_transformer_embedder.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/episode_store/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/episode_store/episode_model.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/errors.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/filter/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/filter/filter_parser.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/filter/sql_filter_util.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/language_model/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/language_model/amazon_bedrock_language_model.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/language_model/language_model.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/language_model/openai_chat_completions_language_model.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/language_model/openai_responses_language_model.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/metrics_factory/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/metrics_factory/metrics_factory.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/metrics_factory/operation_tracker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/metrics_factory/prometheus_metrics_factory.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/neo4j_utils.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/payload_codec/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/payload_codec/payload_codec.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/payload_codec/payload_codec_config.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/payload_codec/plaintext_payload_codec.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/properties_json.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/amazon_bedrock_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/bm25_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/cohere_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/cross_encoder_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/embedder_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/identity_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/reranker/rrf_hybrid_reranker.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/base_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/database_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/embedder_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/language_model_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/reranker_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/resource_manager/semantic_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/rw_locks.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/session_manager/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/session_manager/session_data_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/session_manager/session_data_manager_sql_impl.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/utils.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_graph_store/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_graph_store/data_types.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_graph_store/nebula_graph_vector_graph_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_graph_store/neo4j_vector_graph_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_graph_store/vector_graph_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/data_types.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/qdrant_vector_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/sqlite_vec_vector_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/sqlite_vector_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/utils.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/vector_search_engine/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/vector_search_engine/hnswlib_engine.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/vector_search_engine/usearch_engine.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/vector_search_engine/vector_search_engine.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/common/vector_store/vector_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/declarative_memory/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/declarative_memory/data_types.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/declarative_memory/declarative_memory.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/episodic_memory_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/data_types.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/deriver/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/deriver/deriver.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/deriver/text_deriver.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/event_memory.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segment_store/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segment_store/data_types.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segment_store/segment_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segmenter/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segmenter/segmenter.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/event_memory/segmenter/text_segmenter.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/instance_lru_cache.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/service_locator.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/short_term_memory/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/short_term_memory/service_locator.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/episodic_memory/short_term_memory/short_term_memory.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/installation/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/installation/memmachine_configure.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/installation/utilities.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/main/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/agents/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/agents/coq_agent.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/agents/memmachine_retriever.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/agents/split_query_agent.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/agents/tool_select_agent.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/common/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/common/agent_api.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/retrieval_agent/service_locator.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/cluster_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/cluster_splitter.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/cluster_store/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/cluster_store/cluster_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/cluster_store/cluster_store_sqlalchemy.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/cluster_store/in_memory_cluster_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/config_store/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/config_store/caching_semantic_config_storage.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/config_store/config_store.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/config_store/config_store_sqlalchemy.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/semantic_ingestion.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/semantic_llm.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/semantic_memory.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/semantic_model.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/semantic_session_manager.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/env.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/script.py.mako +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/001_initial_migration.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/3d6aaebdc526_sync_sqlalchemy_schema.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/62dff1150a46_add_created_at_to_history_add.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/79f00a9f2409_change_history_id_to_string.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/843f6d216d10_rename_semantic_type_to_semantic_.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/adb5618bd4ee_remove_history_table.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/b65f7f4a9d2c_migrate_legacy_set_ids.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/c7a2f8e31b90_add_ingested_composite_index.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/d1a9df11343b_add_indexes.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/neo4j_semantic_storage.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/sqlalchemy_pgvector_semantic.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/storage_base.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/storage/text_sanitizer.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/util/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/semantic_memory/util/semantic_prompt_template.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/exceptions.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/mcp.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/api_v2/service.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/app.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/diagnostics.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/mcp_http.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/mcp_stdio.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/middleware.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/__init__.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/coding_style_prompt.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/crm_prompt.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/default_prompts.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/financial_analyst_prompt.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/health_assistant_prompt.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/profile_prompt.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/prompt_utilities.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server/server/prompt/writing_assistant_prompt.py +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server.egg-info/dependency_links.txt +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/src/memmachine_server.egg-info/entry_points.txt +0 -0
- {memmachine_server-0.3.8 → memmachine_server-0.3.9}/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.9
|
|
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
|
|
@@ -31,7 +31,7 @@ Requires-Dist: langchain-aws>=0.2.33
|
|
|
31
31
|
Requires-Dist: neo4j>=5.28.2
|
|
32
32
|
Requires-Dist: nltk>=3.9.4
|
|
33
33
|
Requires-Dist: openai>=2.21.0
|
|
34
|
-
Requires-Dist: pgvector>=0.4.
|
|
34
|
+
Requires-Dist: pgvector>=0.4.2
|
|
35
35
|
Requires-Dist: prometheus-client>=0.22.1
|
|
36
36
|
Requires-Dist: pydantic>=2.11.7
|
|
37
37
|
Requires-Dist: pyyaml>=6.0.2
|
|
@@ -10,8 +10,13 @@ from memmachine_server.common.configuration import (
|
|
|
10
10
|
EpisodicMemoryConfPartial,
|
|
11
11
|
)
|
|
12
12
|
from memmachine_server.common.configuration.episodic_config import (
|
|
13
|
+
DeclarativeLongTermMemoryConf,
|
|
14
|
+
EpisodicMemoryConf,
|
|
15
|
+
EventLongTermMemoryConf,
|
|
13
16
|
LongTermMemoryConfPartial,
|
|
17
|
+
PassthroughSegmenterConf,
|
|
14
18
|
ShortTermMemoryConfPartial,
|
|
19
|
+
WholeTextDeriverConf,
|
|
15
20
|
)
|
|
16
21
|
from memmachine_server.common.configuration.log_conf import LogLevel
|
|
17
22
|
|
|
@@ -34,6 +39,7 @@ def test_update_long_term_memory_conf(long_term_memory_conf: LongTermMemoryConfP
|
|
|
34
39
|
)
|
|
35
40
|
|
|
36
41
|
updated = specific.merge(long_term_memory_conf)
|
|
42
|
+
assert isinstance(updated, DeclarativeLongTermMemoryConf)
|
|
37
43
|
assert updated.session_id == "session_123"
|
|
38
44
|
assert updated.embedder == "embedder_v2"
|
|
39
45
|
assert updated.reranker == "reranker_v1"
|
|
@@ -219,3 +225,168 @@ def test_save_raises_error_when_no_path():
|
|
|
219
225
|
|
|
220
226
|
with pytest.raises(ValueError, match="No path provided"):
|
|
221
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"
|
|
@@ -105,6 +105,26 @@ async def test_add_and_get_history(episode_storage: EpisodeStorage):
|
|
|
105
105
|
assert history.episode_type == EpisodeType.MESSAGE
|
|
106
106
|
|
|
107
107
|
|
|
108
|
+
@pytest.mark.asyncio
|
|
109
|
+
async def test_get_episodes_batch(episode_storage: EpisodeStorage):
|
|
110
|
+
first = await create_history_entry(episode_storage, content="first")
|
|
111
|
+
second = await create_history_entry(episode_storage, content="second")
|
|
112
|
+
third = await create_history_entry(episode_storage, content="third")
|
|
113
|
+
|
|
114
|
+
try:
|
|
115
|
+
# All present; duplicates are deduped; missing IDs are absent.
|
|
116
|
+
fetched = await episode_storage.get_episodes([first, third, first, "999999999"])
|
|
117
|
+
by_uid = {ep.uid: ep for ep in fetched}
|
|
118
|
+
assert set(by_uid.keys()) == {first, third}
|
|
119
|
+
assert by_uid[first].content == "first"
|
|
120
|
+
assert by_uid[third].content == "third"
|
|
121
|
+
|
|
122
|
+
# Empty input returns empty list without hitting the DB.
|
|
123
|
+
assert await episode_storage.get_episodes([]) == []
|
|
124
|
+
finally:
|
|
125
|
+
await episode_storage.delete_episodes([first, second, third])
|
|
126
|
+
|
|
127
|
+
|
|
108
128
|
@pytest.mark.asyncio
|
|
109
129
|
async def test_add_multiple_episodes_returns_models(
|
|
110
130
|
episode_storage: EpisodeStorage,
|
|
@@ -6,8 +6,8 @@ from pydantic import JsonValue
|
|
|
6
6
|
from sqlalchemy.ext.asyncio import AsyncEngine
|
|
7
7
|
|
|
8
8
|
from memmachine_server.common.configuration.episodic_config import (
|
|
9
|
+
DeclarativeLongTermMemoryConf,
|
|
9
10
|
EpisodicMemoryConf,
|
|
10
|
-
LongTermMemoryConf,
|
|
11
11
|
ShortTermMemoryConf,
|
|
12
12
|
)
|
|
13
13
|
from memmachine_server.common.errors import (
|
|
@@ -61,7 +61,7 @@ def episodic_memory_conf():
|
|
|
61
61
|
"""Fixture for a dummy EpisodicMemoryConf object."""
|
|
62
62
|
return EpisodicMemoryConf(
|
|
63
63
|
session_key="test_session",
|
|
64
|
-
long_term_memory=
|
|
64
|
+
long_term_memory=DeclarativeLongTermMemoryConf(
|
|
65
65
|
session_id="test_session",
|
|
66
66
|
vector_graph_store="test_store",
|
|
67
67
|
embedder="test_embedder",
|
|
@@ -116,11 +116,17 @@ class InMemorySegmentStorePartition(SegmentStorePartition):
|
|
|
116
116
|
|
|
117
117
|
@staticmethod
|
|
118
118
|
def _normalize_segment_field(field: str) -> str:
|
|
119
|
-
"""Translate canonical filter field names to raw segment property keys.
|
|
119
|
+
"""Translate canonical filter field names to raw segment property keys.
|
|
120
|
+
|
|
121
|
+
Mirrors SQLAlchemySegmentStorePartition._resolve_segment_field:
|
|
122
|
+
- `m.<key>` / `metadata.<key>` → user metadata, bare key.
|
|
123
|
+
- any other bare name → system field, `_<field>` (matches the
|
|
124
|
+
LongTermMemory event-backend property layout).
|
|
125
|
+
"""
|
|
120
126
|
internal_name, is_user_metadata = normalize_filter_field(field)
|
|
121
127
|
if is_user_metadata:
|
|
122
128
|
return demangle_user_metadata_key(internal_name)
|
|
123
|
-
return field
|
|
129
|
+
return f"_{field}"
|
|
124
130
|
|
|
125
131
|
@override
|
|
126
132
|
async def get_segment_uuids_by_event_uuids(
|
|
@@ -399,7 +399,13 @@ async def test_contexts_property_filter(
|
|
|
399
399
|
async def test_contexts_filter_by_context_producer(
|
|
400
400
|
partition: SQLAlchemySegmentStorePartition,
|
|
401
401
|
) -> None:
|
|
402
|
-
"""
|
|
402
|
+
"""`context.producer` is not a stored property; the filter just matches nothing.
|
|
403
|
+
|
|
404
|
+
Bare names that aren't `timestamp` are looked up as `_<name>` in the JSON
|
|
405
|
+
properties (matching EventMemory's `_to_vector_record_property` convention
|
|
406
|
+
for system fields). `context.producer` becomes `_context.producer`, which
|
|
407
|
+
isn't a stored key on any segment, so the filter returns no contexts.
|
|
408
|
+
"""
|
|
403
409
|
ep = uuid4()
|
|
404
410
|
s0 = _seg(
|
|
405
411
|
event_uuid=ep,
|
|
@@ -422,20 +428,20 @@ async def test_contexts_filter_by_context_producer(
|
|
|
422
428
|
await partition.add_segments(_links(s0, s1, s2))
|
|
423
429
|
|
|
424
430
|
filt = Comparison(field="context.producer", op="=", value="Alice")
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
431
|
+
contexts = await partition.get_segment_contexts(
|
|
432
|
+
[s0.uuid],
|
|
433
|
+
max_backward_segments=5,
|
|
434
|
+
max_forward_segments=5,
|
|
435
|
+
property_filter=filt,
|
|
436
|
+
)
|
|
437
|
+
assert contexts == {}
|
|
432
438
|
|
|
433
439
|
|
|
434
440
|
@pytest.mark.asyncio
|
|
435
441
|
async def test_contexts_filter_by_context_type(
|
|
436
442
|
partition: SQLAlchemySegmentStorePartition,
|
|
437
443
|
) -> None:
|
|
438
|
-
"""
|
|
444
|
+
"""`context.context_type` is not a stored property; filter matches nothing."""
|
|
439
445
|
ep = uuid4()
|
|
440
446
|
s0 = _seg(
|
|
441
447
|
event_uuid=ep,
|
|
@@ -458,13 +464,13 @@ async def test_contexts_filter_by_context_type(
|
|
|
458
464
|
await partition.add_segments(_links(s0, s1, s2))
|
|
459
465
|
|
|
460
466
|
filt = Comparison(field="context.context_type", op="=", value="producer")
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
467
|
+
contexts = await partition.get_segment_contexts(
|
|
468
|
+
[s0.uuid],
|
|
469
|
+
max_backward_segments=5,
|
|
470
|
+
max_forward_segments=5,
|
|
471
|
+
property_filter=filt,
|
|
472
|
+
)
|
|
473
|
+
assert contexts == {}
|
|
468
474
|
|
|
469
475
|
|
|
470
476
|
@pytest.mark.asyncio
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""Tests for PassthroughSegmenter."""
|
|
2
|
+
|
|
3
|
+
from datetime import UTC, datetime
|
|
4
|
+
from uuid import uuid4
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
from memmachine_server.episodic_memory.event_memory.data_types import (
|
|
9
|
+
Event,
|
|
10
|
+
NullContext,
|
|
11
|
+
ProducerContext,
|
|
12
|
+
TextBlock,
|
|
13
|
+
)
|
|
14
|
+
from memmachine_server.episodic_memory.event_memory.segmenter.passthrough_segmenter import (
|
|
15
|
+
PassthroughSegmenter,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
pytestmark = pytest.mark.asyncio
|
|
19
|
+
|
|
20
|
+
_TS = datetime(2026, 1, 15, 10, 30, tzinfo=UTC)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
async def test_passthrough_emits_one_segment_per_block():
|
|
24
|
+
event = Event(
|
|
25
|
+
uuid=uuid4(),
|
|
26
|
+
timestamp=_TS,
|
|
27
|
+
context=ProducerContext(producer="alice"),
|
|
28
|
+
blocks=[
|
|
29
|
+
TextBlock(text="first block"),
|
|
30
|
+
TextBlock(text="second block"),
|
|
31
|
+
TextBlock(text="third block"),
|
|
32
|
+
],
|
|
33
|
+
properties={"my_field": "value"},
|
|
34
|
+
)
|
|
35
|
+
segmenter = PassthroughSegmenter()
|
|
36
|
+
|
|
37
|
+
segments = await segmenter.segment(event)
|
|
38
|
+
|
|
39
|
+
assert len(segments) == 3
|
|
40
|
+
for index, segment in enumerate(segments):
|
|
41
|
+
assert segment.event_uuid == event.uuid
|
|
42
|
+
assert segment.index == index
|
|
43
|
+
assert segment.offset == 0
|
|
44
|
+
assert segment.timestamp == event.timestamp
|
|
45
|
+
assert segment.context == event.context
|
|
46
|
+
assert segment.properties == event.properties
|
|
47
|
+
assert segment.block.text == event.blocks[index].text
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
async def test_passthrough_does_not_split_long_text():
|
|
51
|
+
"""Each block is preserved verbatim, regardless of length."""
|
|
52
|
+
long_text = "lorem ipsum " * 1000
|
|
53
|
+
event = Event(
|
|
54
|
+
uuid=uuid4(),
|
|
55
|
+
timestamp=_TS,
|
|
56
|
+
context=NullContext(),
|
|
57
|
+
blocks=[TextBlock(text=long_text)],
|
|
58
|
+
)
|
|
59
|
+
segmenter = PassthroughSegmenter()
|
|
60
|
+
|
|
61
|
+
segments = await segmenter.segment(event)
|
|
62
|
+
|
|
63
|
+
assert len(segments) == 1
|
|
64
|
+
assert segments[0].block.text == long_text
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
async def test_passthrough_empty_blocks_yields_no_segments():
|
|
68
|
+
event = Event(
|
|
69
|
+
uuid=uuid4(),
|
|
70
|
+
timestamp=_TS,
|
|
71
|
+
context=NullContext(),
|
|
72
|
+
blocks=[],
|
|
73
|
+
)
|
|
74
|
+
segmenter = PassthroughSegmenter()
|
|
75
|
+
|
|
76
|
+
segments = await segmenter.segment(event)
|
|
77
|
+
|
|
78
|
+
assert segments == []
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
async def test_passthrough_each_segment_has_unique_uuid():
|
|
82
|
+
event = Event(
|
|
83
|
+
uuid=uuid4(),
|
|
84
|
+
timestamp=_TS,
|
|
85
|
+
context=NullContext(),
|
|
86
|
+
blocks=[TextBlock(text="a"), TextBlock(text="b")],
|
|
87
|
+
)
|
|
88
|
+
segmenter = PassthroughSegmenter()
|
|
89
|
+
|
|
90
|
+
segments = await segmenter.segment(event)
|
|
91
|
+
|
|
92
|
+
assert len({s.uuid for s in segments}) == len(segments)
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"""Unit tests for the Episode → Event translation in LongTermMemory."""
|
|
2
|
+
|
|
3
|
+
from datetime import UTC, datetime
|
|
4
|
+
from uuid import uuid5
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
from memmachine_server.common.episode_store import (
|
|
9
|
+
ContentType,
|
|
10
|
+
Episode,
|
|
11
|
+
EpisodeType,
|
|
12
|
+
)
|
|
13
|
+
from memmachine_server.episodic_memory.event_memory.data_types import (
|
|
14
|
+
NullContext,
|
|
15
|
+
ProducerContext,
|
|
16
|
+
TextBlock,
|
|
17
|
+
)
|
|
18
|
+
from memmachine_server.episodic_memory.long_term_memory.long_term_memory import (
|
|
19
|
+
_EVENT_UUID_NAMESPACE,
|
|
20
|
+
LongTermMemory,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _episode(
|
|
25
|
+
*,
|
|
26
|
+
uid: str = "ep1",
|
|
27
|
+
content: str = "hello",
|
|
28
|
+
producer_id: str = "alice",
|
|
29
|
+
producer_role: str = "user",
|
|
30
|
+
produced_for_id: str | None = None,
|
|
31
|
+
sequence_num: int = 0,
|
|
32
|
+
episode_type: EpisodeType = EpisodeType.MESSAGE,
|
|
33
|
+
filterable_metadata: dict | None = None,
|
|
34
|
+
metadata: dict | None = None,
|
|
35
|
+
session_key: str = "session-1",
|
|
36
|
+
) -> Episode:
|
|
37
|
+
return Episode(
|
|
38
|
+
uid=uid,
|
|
39
|
+
content=content,
|
|
40
|
+
session_key=session_key,
|
|
41
|
+
created_at=datetime(2026, 1, 15, 12, 0, tzinfo=UTC),
|
|
42
|
+
producer_id=producer_id,
|
|
43
|
+
producer_role=producer_role,
|
|
44
|
+
produced_for_id=produced_for_id,
|
|
45
|
+
sequence_num=sequence_num,
|
|
46
|
+
episode_type=episode_type,
|
|
47
|
+
content_type=ContentType.STRING,
|
|
48
|
+
filterable_metadata=filterable_metadata,
|
|
49
|
+
metadata=metadata,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_event_uuid_is_deterministic_uuid5_of_episode_uid():
|
|
54
|
+
episode = _episode(uid="abc-123")
|
|
55
|
+
event = LongTermMemory._episode_to_event(episode)
|
|
56
|
+
assert event.uuid == uuid5(_EVENT_UUID_NAMESPACE, "abc-123")
|
|
57
|
+
# Stable across calls.
|
|
58
|
+
assert LongTermMemory._episode_to_event(episode).uuid == event.uuid
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_message_episode_uses_producer_context():
|
|
62
|
+
episode = _episode(producer_id="alice", episode_type=EpisodeType.MESSAGE)
|
|
63
|
+
event = LongTermMemory._episode_to_event(episode)
|
|
64
|
+
assert isinstance(event.context, ProducerContext)
|
|
65
|
+
assert event.context.producer == "alice"
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def test_non_message_episode_uses_null_context():
|
|
69
|
+
# Use any non-MESSAGE EpisodeType. The enum is defined in
|
|
70
|
+
# memmachine_common.api; pick the first non-MESSAGE entry dynamically so
|
|
71
|
+
# this test doesn't break when the enum gains members.
|
|
72
|
+
non_message = next(
|
|
73
|
+
(t for t in EpisodeType if t is not EpisodeType.MESSAGE),
|
|
74
|
+
None,
|
|
75
|
+
)
|
|
76
|
+
if non_message is None:
|
|
77
|
+
# Only MESSAGE exists today; this branch will start exercising once
|
|
78
|
+
# additional Episode types are introduced. Skip rather than assert
|
|
79
|
+
# invariant we can't yet exercise.
|
|
80
|
+
pytest.skip("Only MESSAGE EpisodeType exists; nothing else to verify yet")
|
|
81
|
+
episode = _episode(episode_type=non_message)
|
|
82
|
+
event = LongTermMemory._episode_to_event(episode)
|
|
83
|
+
assert isinstance(event.context, NullContext)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def test_event_has_single_text_block_with_episode_content():
|
|
87
|
+
episode = _episode(content="hello world")
|
|
88
|
+
event = LongTermMemory._episode_to_event(episode)
|
|
89
|
+
assert len(event.blocks) == 1
|
|
90
|
+
assert isinstance(event.blocks[0], TextBlock)
|
|
91
|
+
assert event.blocks[0].text == "hello world"
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def test_system_fields_are_underscore_prefixed():
|
|
95
|
+
episode = _episode(
|
|
96
|
+
uid="ep-1",
|
|
97
|
+
producer_id="alice",
|
|
98
|
+
producer_role="user",
|
|
99
|
+
produced_for_id="bob",
|
|
100
|
+
sequence_num=42,
|
|
101
|
+
session_key="sess-X",
|
|
102
|
+
)
|
|
103
|
+
event = LongTermMemory._episode_to_event(episode)
|
|
104
|
+
p = event.properties
|
|
105
|
+
assert p["_episode_uid"] == "ep-1"
|
|
106
|
+
assert p["_session_key"] == "sess-X"
|
|
107
|
+
assert p["_producer_id"] == "alice"
|
|
108
|
+
assert p["_producer_role"] == "user"
|
|
109
|
+
assert p["_produced_for_id"] == "bob"
|
|
110
|
+
assert p["_sequence_num"] == 42
|
|
111
|
+
assert p["_episode_type"] == "message"
|
|
112
|
+
assert p["_content_type"] == "string"
|
|
113
|
+
assert p["_created_at"] == episode.created_at
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def test_produced_for_id_omitted_when_none():
|
|
117
|
+
episode = _episode(produced_for_id=None)
|
|
118
|
+
event = LongTermMemory._episode_to_event(episode)
|
|
119
|
+
assert "_produced_for_id" not in event.properties
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def test_user_filterable_metadata_keys_are_bare():
|
|
123
|
+
episode = _episode(
|
|
124
|
+
filterable_metadata={"my_field": "value", "count": 7},
|
|
125
|
+
)
|
|
126
|
+
event = LongTermMemory._episode_to_event(episode)
|
|
127
|
+
p = event.properties
|
|
128
|
+
# User-defined keys land bare (no `_` prefix), so the v2 client filter API
|
|
129
|
+
# `m.my_field` resolves to vector-record property `my_field`.
|
|
130
|
+
assert p["my_field"] == "value"
|
|
131
|
+
assert p["count"] == 7
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def test_episode_to_event_rejects_underscore_prefixed_user_keys():
|
|
135
|
+
"""Reserved `_`-prefixed user keys must be rejected at the event-backend
|
|
136
|
+
translation layer. Without this check a client could send
|
|
137
|
+
{"_producer_id": "victim", "_session_key": "other-session"} via
|
|
138
|
+
filterable_metadata, get its content indexed under those spoofed
|
|
139
|
+
identities, and impersonate the victim through search_scored's
|
|
140
|
+
property_filter API. We raise loudly so callers see the misuse instead
|
|
141
|
+
of silently dropping. (Event-backend only — the declarative backend
|
|
142
|
+
mangles user keys with a `metadata.` prefix and is unaffected.)
|
|
143
|
+
"""
|
|
144
|
+
episode = _episode(
|
|
145
|
+
filterable_metadata={
|
|
146
|
+
"safe_key": "ok",
|
|
147
|
+
"_producer_id": "victim",
|
|
148
|
+
"_session_key": "other-session",
|
|
149
|
+
"_episode_uid": "spoofed-uid",
|
|
150
|
+
}
|
|
151
|
+
)
|
|
152
|
+
with pytest.raises(ValueError, match=r"reserved.*`_`-prefixed"):
|
|
153
|
+
LongTermMemory._episode_to_event(episode)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def test_episode_to_event_allows_metadata_dot_prefixed_keys():
|
|
157
|
+
"""The declarative backend mangles user keys with a `metadata.` prefix.
|
|
158
|
+
On the event backend, a literal `metadata.foo` key is just a regular
|
|
159
|
+
user property and must not be rejected.
|
|
160
|
+
"""
|
|
161
|
+
episode = _episode(filterable_metadata={"metadata.foo": "bar"})
|
|
162
|
+
event = LongTermMemory._episode_to_event(episode)
|
|
163
|
+
assert event.properties["metadata.foo"] == "bar"
|