memmachine-server 0.3.4__tar.gz → 0.3.6__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.4/src/memmachine_server.egg-info → memmachine_server-0.3.6}/PKG-INFO +3 -3
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/pyproject.toml +2 -2
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/embedder/test_openai_embedder.py +45 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/language_model/test_openai_chat_completions_language_model.py +19 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_ingestion.py +351 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/embedder/openai_embedder.py +4 -4
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/language_model/openai_chat_completions_language_model.py +1 -1
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/semantic_ingestion.py +82 -7
- {memmachine_server-0.3.4 → memmachine_server-0.3.6/src/memmachine_server.egg-info}/PKG-INFO +3 -3
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server.egg-info/requires.txt +2 -2
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/LICENSE +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/README.md +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/api/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/api/test_version.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_configuration.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_database_conf.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_embedder_conf.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_episodic_config.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_language_model_conf.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_log_conf.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_mixin_confs.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_prompt_conf.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_reranker_conf.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_semantic_conf.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_server_conf.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/embedder/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/embedder/test_amazon_bedrock_embedder.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/embedder/test_sentence_transformer_embedder.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/episode_store/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/episode_store/test_count_caching_episode_storage.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/episode_store/test_episode_model.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/episode_store/test_episode_storage.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/episode_store/test_sqlalchemy_episode_store_startup.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/filter/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/filter/test_filter_parser.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/filter/test_sql_filter_util.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/language_model/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/language_model/test_openai_responses_language_model.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/fake_embedder.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_amazon_bedrock_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_bm25_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_cohere_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_cross_encoder_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_embedder_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_identity_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_rrf_hybrid_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/resource_manager/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/resource_manager/test_database_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/resource_manager/test_embedder_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/resource_manager/test_language_model_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/resource_manager/test_reranker_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/resource_manager/test_resource_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/session_manager/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/session_manager/test_session_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/session_manager/test_session_manager_migration.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/test_rw_locks.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/test_utils.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/vector_graph_store/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/vector_graph_store/test_nebula_graph_vector_graph_store.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/vector_graph_store/test_neo4j_vector_graph_store.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/conftest.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/conftest.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/declarative_memory/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/declarative_memory/test_declarative_memory.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/long_term_memory/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/long_term_memory/test_long_term_memory.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/short_term_memory/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/short_term_memory/test_short_term_memory.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/test_episodic_memory.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/test_episodic_memory_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/test_instance_lru_cache.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/installation/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/installation/test_configuration_wizard.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/installation/test_memmachine_configure.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/installation/test_utilities.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/main/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/main/conftest.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/main/test_memachine.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/main/test_memmachine_delete_session.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/main/test_memmachine_integration.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/main/test_memmachine_mock.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/retrieval_agent/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/retrieval_agent/test_retrieval_agent.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/cluster_store/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/cluster_store/test_cluster_state_storage.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/config_store/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/config_store/test_caching_semantic_config_storage.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/config_store/test_semantic_config_storage.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/conftest.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/mock_semantic_memory_objects.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/semantic_test_utils.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/helpers.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/original_schema.sql +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_set_id_migration.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_sqlalchemy_vs_alembic.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/conftest.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/in_memory_semantic_storage.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/test_semantic_storage.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/test_text_sanitizer.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_cluster_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_cluster_splitter.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_history_cleanup.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_llm.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_llm_integration.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_memory.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_background.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_integration.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_model.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_session_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/test_config_router.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/test_config_service.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/test_mcp.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/test_router.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/test_service.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/test_spec.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/prompt/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/prompt/test_prompt_utilities.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/test_middleware.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/server_tests/memmachine_server/test_data/longmemeval_snippet.json +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/setup.cfg +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/api/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/api/version.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/database_conf.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/default_episode_summary_system_prompt.txt +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/default_episode_summary_user_prompt.txt +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/embedder_conf.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/episodic_config.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/language_model_conf.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/log_conf.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/mixin_confs.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/reranker_conf.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/retrieval_config.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/data_types.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/embedder/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/embedder/amazon_bedrock_embedder.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/embedder/embedder.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/embedder/sentence_transformer_embedder.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/episode_store/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/episode_store/count_caching_episode_storage.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/episode_store/episode_model.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/episode_store/episode_sqlalchemy_store.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/episode_store/episode_storage.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/errors.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/filter/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/filter/filter_parser.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/filter/sql_filter_util.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/language_model/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/language_model/amazon_bedrock_language_model.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/language_model/language_model.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/language_model/openai_responses_language_model.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/metrics_factory/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/metrics_factory/metrics_factory.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/metrics_factory/operation_tracker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/metrics_factory/prometheus_metrics_factory.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/neo4j_utils.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/amazon_bedrock_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/bm25_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/cohere_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/cross_encoder_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/embedder_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/identity_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/rrf_hybrid_reranker.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/base_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/database_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/embedder_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/language_model_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/reranker_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/resource_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/semantic_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/rw_locks.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/session_manager/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/session_manager/session_data_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/session_manager/session_data_manager_sql_impl.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/utils.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_graph_store/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_graph_store/data_types.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_graph_store/nebula_graph_vector_graph_store.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_graph_store/neo4j_vector_graph_store.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_graph_store/vector_graph_store.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_store/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_store/data_types.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_store/utils.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_store/vector_store.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/declarative_memory/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/declarative_memory/data_types.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/declarative_memory/declarative_memory.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/episodic_memory.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/episodic_memory_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/instance_lru_cache.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/long_term_memory/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/long_term_memory/long_term_memory.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/long_term_memory/service_locator.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/service_locator.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/short_term_memory/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/short_term_memory/service_locator.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/short_term_memory/short_term_memory.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/installation/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/installation/configuration_wizard.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/installation/memmachine_configure.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/installation/utilities.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/main/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/main/memmachine.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/agents/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/agents/coq_agent.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/agents/memmachine_retriever.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/agents/split_query_agent.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/agents/tool_select_agent.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/common/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/common/agent_api.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/service_locator.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/cluster_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/cluster_splitter.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/cluster_store/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/cluster_store/cluster_store.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/cluster_store/cluster_store_sqlalchemy.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/cluster_store/in_memory_cluster_store.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/config_store/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/config_store/caching_semantic_config_storage.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/config_store/config_store.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/config_store/config_store_sqlalchemy.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/semantic_llm.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/semantic_memory.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/semantic_model.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/semantic_session_manager.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/env.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/script.py.mako +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/001_initial_migration.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/3d6aaebdc526_sync_sqlalchemy_schema.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/62dff1150a46_add_created_at_to_history_add.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/79f00a9f2409_change_history_id_to_string.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/843f6d216d10_rename_semantic_type_to_semantic_.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/adb5618bd4ee_remove_history_table.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/b65f7f4a9d2c_migrate_legacy_set_ids.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/c7a2f8e31b90_add_ingested_composite_index.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/d1a9df11343b_add_indexes.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/neo4j_semantic_storage.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/sqlalchemy_pgvector_semantic.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/storage_base.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/text_sanitizer.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/util/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/util/semantic_prompt_template.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/config_router.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/config_service.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/exceptions.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/mcp.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/router.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/service.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/app.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/diagnostics.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/mcp_http.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/mcp_stdio.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/middleware.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/__init__.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/coding_style_prompt.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/crm_prompt.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/default_prompts.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/financial_analyst_prompt.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/health_assistant_prompt.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/profile_prompt.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/prompt_utilities.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/writing_assistant_prompt.py +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server.egg-info/SOURCES.txt +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server.egg-info/dependency_links.txt +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server.egg-info/entry_points.txt +0 -0
- {memmachine_server-0.3.4 → memmachine_server-0.3.6}/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.6
|
|
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
|
|
@@ -24,12 +24,12 @@ Requires-Dist: boto3-stubs==1.40.64
|
|
|
24
24
|
Requires-Dist: cohere>=5.20.0
|
|
25
25
|
Requires-Dist: dotenv>=0.9.9
|
|
26
26
|
Requires-Dist: fastapi>=0.116.1
|
|
27
|
-
Requires-Dist: fastmcp>=3.0
|
|
27
|
+
Requires-Dist: fastmcp>=3.2.0
|
|
28
28
|
Requires-Dist: instructor[bedrock]>=1.12.0
|
|
29
29
|
Requires-Dist: json-repair>=0.54
|
|
30
30
|
Requires-Dist: langchain-aws>=0.2.33
|
|
31
31
|
Requires-Dist: neo4j>=5.28.2
|
|
32
|
-
Requires-Dist: nltk>=3.9.
|
|
32
|
+
Requires-Dist: nltk>=3.9.4
|
|
33
33
|
Requires-Dist: openai>=2.21.0
|
|
34
34
|
Requires-Dist: pgvector>=0.4.1
|
|
35
35
|
Requires-Dist: prometheus-client>=0.22.1
|
|
@@ -15,12 +15,12 @@ dependencies = [
|
|
|
15
15
|
"cohere>=5.20.0",
|
|
16
16
|
"dotenv>=0.9.9",
|
|
17
17
|
"fastapi>=0.116.1",
|
|
18
|
-
"fastmcp>=3.0
|
|
18
|
+
"fastmcp>=3.2.0",
|
|
19
19
|
"instructor[bedrock]>=1.12.0",
|
|
20
20
|
"json-repair>=0.54",
|
|
21
21
|
"langchain-aws>=0.2.33",
|
|
22
22
|
"neo4j>=5.28.2",
|
|
23
|
-
"nltk>=3.9.
|
|
23
|
+
"nltk>=3.9.4",
|
|
24
24
|
"openai>=2.21.0",
|
|
25
25
|
"pgvector>=0.4.1",
|
|
26
26
|
"prometheus-client>=0.22.1",
|
|
@@ -124,3 +124,48 @@ async def test_embed_fail_after_max_retries_on_internal_server_error(mock_sleep)
|
|
|
124
124
|
assert mock_sleep.call_count == 2
|
|
125
125
|
mock_sleep.assert_any_await(1)
|
|
126
126
|
mock_sleep.assert_any_await(2)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
@pytest.mark.asyncio
|
|
130
|
+
async def test_embed_oversized_input_with_no_max_input_length():
|
|
131
|
+
"""Regression for #1298: text > 75,000 chars must not raise ValueError.
|
|
132
|
+
|
|
133
|
+
When max_input_length is None, _embed() must fall back to
|
|
134
|
+
max_total_input_length_per_request (75,000) as the chunking bound so that
|
|
135
|
+
cluster_texts() never receives a text that exceeds its hard limit.
|
|
136
|
+
Prior to the fix, this raised ValueError("Text length ... exceeds
|
|
137
|
+
max_total_length_per_cluster ..."), which surfaced as HTTP 500.
|
|
138
|
+
"""
|
|
139
|
+
mock_client = AsyncMock(spec=openai.AsyncOpenAI)
|
|
140
|
+
|
|
141
|
+
mock_embedding = MagicMock()
|
|
142
|
+
mock_embedding.embedding = [0.1] * 256
|
|
143
|
+
|
|
144
|
+
mock_response = MagicMock()
|
|
145
|
+
mock_response.data = [mock_embedding]
|
|
146
|
+
mock_response.usage.prompt_tokens = 10
|
|
147
|
+
mock_response.usage.total_tokens = 10
|
|
148
|
+
|
|
149
|
+
mock_client.embeddings.create = AsyncMock(return_value=mock_response)
|
|
150
|
+
|
|
151
|
+
embedder = OpenAIEmbedder(
|
|
152
|
+
OpenAIEmbedderParams(
|
|
153
|
+
client=mock_client,
|
|
154
|
+
model="test-model",
|
|
155
|
+
dimensions=256,
|
|
156
|
+
max_input_length=None, # default — reproduces the crash scenario
|
|
157
|
+
)
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
# 80,000 chars exceeds the 75,000-char cluster hard limit by 5,000.
|
|
161
|
+
long_text = "x" * 80_000
|
|
162
|
+
|
|
163
|
+
# Before the fix this raised:
|
|
164
|
+
# ValueError: Text length 80000 exceeds max_total_length_per_cluster 75000
|
|
165
|
+
result = await embedder.ingest_embed([long_text])
|
|
166
|
+
|
|
167
|
+
assert len(result) == 1
|
|
168
|
+
assert len(result[0]) == 256
|
|
169
|
+
# The text must have been split: balanced chunks of 80,000 chars at limit
|
|
170
|
+
# 75,000 produce two chunks of 40,000 each, each in its own cluster.
|
|
171
|
+
assert mock_client.embeddings.create.call_count >= 2
|
|
@@ -819,6 +819,25 @@ async def test_generate_response_runtime_exception_mapping(
|
|
|
819
819
|
await lm.generate_response()
|
|
820
820
|
|
|
821
821
|
|
|
822
|
+
@pytest.mark.asyncio
|
|
823
|
+
async def test_generate_response_preserves_original_error_message(
|
|
824
|
+
mock_async_openai,
|
|
825
|
+
minimal_config,
|
|
826
|
+
):
|
|
827
|
+
# Regression for #1309: the wrapped ExternalServiceAPIError must carry the
|
|
828
|
+
# original LLM error text so _is_exceed_context_window_error can key off it.
|
|
829
|
+
mock_client = mock_async_openai.return_value
|
|
830
|
+
mock_client.chat.completions.create.side_effect = openai.BadRequestError(
|
|
831
|
+
"This model's maximum context length is 202752 tokens...",
|
|
832
|
+
response=MagicMock(),
|
|
833
|
+
body=None,
|
|
834
|
+
)
|
|
835
|
+
|
|
836
|
+
lm = OpenAIChatCompletionsLanguageModel(minimal_config)
|
|
837
|
+
with pytest.raises(ExternalServiceAPIError, match="context length"):
|
|
838
|
+
await lm.generate_response()
|
|
839
|
+
|
|
840
|
+
|
|
822
841
|
@pytest.mark.asyncio
|
|
823
842
|
async def test_metrics_collection(mock_async_openai, full_config):
|
|
824
843
|
"""Test that metrics are collected on a successful call."""
|
|
@@ -1003,3 +1003,354 @@ async def test_user_tags_preserved_after_ingestion_and_consolidation(
|
|
|
1003
1003
|
# "bugfix" and "decision" survive (each had < 2 entries)
|
|
1004
1004
|
assert "bugfix" in remaining_tags
|
|
1005
1005
|
assert "decision" in remaining_tags
|
|
1006
|
+
|
|
1007
|
+
|
|
1008
|
+
@pytest.mark.asyncio
|
|
1009
|
+
async def test_consolidation_retries_on_none_response(
|
|
1010
|
+
ingestion_service: IngestionService,
|
|
1011
|
+
semantic_storage: SemanticStorage,
|
|
1012
|
+
episode_storage: EpisodeStorage,
|
|
1013
|
+
resources: Resources,
|
|
1014
|
+
semantic_category: SemanticCategory,
|
|
1015
|
+
monkeypatch,
|
|
1016
|
+
):
|
|
1017
|
+
"""When llm_consolidate_features returns None on the first attempt but
|
|
1018
|
+
succeeds on the second, consolidation completes and features are removed."""
|
|
1019
|
+
hist1 = await add_history(episode_storage, content="msg1")
|
|
1020
|
+
hist2 = await add_history(episode_storage, content="msg2")
|
|
1021
|
+
|
|
1022
|
+
id1 = await semantic_storage.add_feature(
|
|
1023
|
+
set_id="user-retry-none",
|
|
1024
|
+
category_name=semantic_category.name,
|
|
1025
|
+
feature="feat_x",
|
|
1026
|
+
value="value x",
|
|
1027
|
+
tag="retry_tag",
|
|
1028
|
+
embedding=np.array([1.0, 0.0]),
|
|
1029
|
+
)
|
|
1030
|
+
id2 = await semantic_storage.add_feature(
|
|
1031
|
+
set_id="user-retry-none",
|
|
1032
|
+
category_name=semantic_category.name,
|
|
1033
|
+
feature="feat_y",
|
|
1034
|
+
value="value y",
|
|
1035
|
+
tag="retry_tag",
|
|
1036
|
+
embedding=np.array([0.0, 1.0]),
|
|
1037
|
+
)
|
|
1038
|
+
await semantic_storage.add_citations(id1, [hist1])
|
|
1039
|
+
await semantic_storage.add_citations(id2, [hist2])
|
|
1040
|
+
|
|
1041
|
+
filter_str = f"set_id IN ('user-retry-none') AND category_name IN ('{semantic_category.name}')"
|
|
1042
|
+
memories = await _collect(
|
|
1043
|
+
semantic_storage.get_feature_set(
|
|
1044
|
+
filter_expr=parse_filter(filter_str),
|
|
1045
|
+
load_citations=True,
|
|
1046
|
+
)
|
|
1047
|
+
)
|
|
1048
|
+
|
|
1049
|
+
valid_response = SemanticConsolidateMemoryRes(
|
|
1050
|
+
consolidated_memories=[
|
|
1051
|
+
LLMReducedFeature(tag="retry_tag", feature="combined", value="combined x+y")
|
|
1052
|
+
],
|
|
1053
|
+
keep_memories=[],
|
|
1054
|
+
)
|
|
1055
|
+
llm_mock = AsyncMock(side_effect=[None, valid_response])
|
|
1056
|
+
monkeypatch.setattr(
|
|
1057
|
+
"memmachine_server.semantic_memory.semantic_ingestion.llm_consolidate_features",
|
|
1058
|
+
llm_mock,
|
|
1059
|
+
)
|
|
1060
|
+
|
|
1061
|
+
await ingestion_service._deduplicate_features(
|
|
1062
|
+
set_id="user-retry-none",
|
|
1063
|
+
memories=memories,
|
|
1064
|
+
semantic_category=semantic_category,
|
|
1065
|
+
resources=resources,
|
|
1066
|
+
)
|
|
1067
|
+
|
|
1068
|
+
assert llm_mock.await_count == 2
|
|
1069
|
+
assert await semantic_storage.get_feature(id1) is None
|
|
1070
|
+
assert await semantic_storage.get_feature(id2) is None
|
|
1071
|
+
remaining = await _collect(
|
|
1072
|
+
semantic_storage.get_feature_set(filter_expr=parse_filter(filter_str))
|
|
1073
|
+
)
|
|
1074
|
+
assert len(remaining) == 1
|
|
1075
|
+
assert remaining[0].value == "combined x+y"
|
|
1076
|
+
|
|
1077
|
+
|
|
1078
|
+
@pytest.mark.asyncio
|
|
1079
|
+
async def test_consolidation_exhausts_retries_and_returns(
|
|
1080
|
+
ingestion_service: IngestionService,
|
|
1081
|
+
semantic_storage: SemanticStorage,
|
|
1082
|
+
episode_storage: EpisodeStorage,
|
|
1083
|
+
resources: Resources,
|
|
1084
|
+
semantic_category: SemanticCategory,
|
|
1085
|
+
monkeypatch,
|
|
1086
|
+
):
|
|
1087
|
+
"""When llm_consolidate_features always returns None, _deduplicate_features
|
|
1088
|
+
logs a warning and returns without raising and without touching features."""
|
|
1089
|
+
id1 = await semantic_storage.add_feature(
|
|
1090
|
+
set_id="user-retry-exhaust",
|
|
1091
|
+
category_name=semantic_category.name,
|
|
1092
|
+
feature="feat_a",
|
|
1093
|
+
value="value a",
|
|
1094
|
+
tag="exhaust_tag",
|
|
1095
|
+
embedding=np.array([1.0, 0.0]),
|
|
1096
|
+
)
|
|
1097
|
+
id2 = await semantic_storage.add_feature(
|
|
1098
|
+
set_id="user-retry-exhaust",
|
|
1099
|
+
category_name=semantic_category.name,
|
|
1100
|
+
feature="feat_b",
|
|
1101
|
+
value="value b",
|
|
1102
|
+
tag="exhaust_tag",
|
|
1103
|
+
embedding=np.array([0.0, 1.0]),
|
|
1104
|
+
)
|
|
1105
|
+
|
|
1106
|
+
filter_str = f"set_id IN ('user-retry-exhaust') AND category_name IN ('{semantic_category.name}')"
|
|
1107
|
+
memories = await _collect(
|
|
1108
|
+
semantic_storage.get_feature_set(filter_expr=parse_filter(filter_str))
|
|
1109
|
+
)
|
|
1110
|
+
|
|
1111
|
+
llm_mock = AsyncMock(return_value=None)
|
|
1112
|
+
monkeypatch.setattr(
|
|
1113
|
+
"memmachine_server.semantic_memory.semantic_ingestion.llm_consolidate_features",
|
|
1114
|
+
llm_mock,
|
|
1115
|
+
)
|
|
1116
|
+
|
|
1117
|
+
await ingestion_service._deduplicate_features(
|
|
1118
|
+
set_id="user-retry-exhaust",
|
|
1119
|
+
memories=memories,
|
|
1120
|
+
semantic_category=semantic_category,
|
|
1121
|
+
resources=resources,
|
|
1122
|
+
)
|
|
1123
|
+
|
|
1124
|
+
assert llm_mock.await_count == 2
|
|
1125
|
+
assert await semantic_storage.get_feature(id1) is not None
|
|
1126
|
+
assert await semantic_storage.get_feature(id2) is not None
|
|
1127
|
+
|
|
1128
|
+
|
|
1129
|
+
@pytest.mark.asyncio
|
|
1130
|
+
async def test_consolidation_skips_context_length_error(
|
|
1131
|
+
ingestion_service: IngestionService,
|
|
1132
|
+
semantic_storage: SemanticStorage,
|
|
1133
|
+
episode_storage: EpisodeStorage,
|
|
1134
|
+
resources: Resources,
|
|
1135
|
+
semantic_category: SemanticCategory,
|
|
1136
|
+
monkeypatch,
|
|
1137
|
+
):
|
|
1138
|
+
"""A context-length exception during consolidation is handled gracefully:
|
|
1139
|
+
no exception propagates and features are left unchanged."""
|
|
1140
|
+
|
|
1141
|
+
class ContextLengthExceededError(Exception):
|
|
1142
|
+
code = "context_length_exceeded"
|
|
1143
|
+
|
|
1144
|
+
id1 = await semantic_storage.add_feature(
|
|
1145
|
+
set_id="user-consolidate-ctx",
|
|
1146
|
+
category_name=semantic_category.name,
|
|
1147
|
+
feature="feat_p",
|
|
1148
|
+
value="value p",
|
|
1149
|
+
tag="ctx_tag",
|
|
1150
|
+
embedding=np.array([1.0, 0.0]),
|
|
1151
|
+
)
|
|
1152
|
+
id2 = await semantic_storage.add_feature(
|
|
1153
|
+
set_id="user-consolidate-ctx",
|
|
1154
|
+
category_name=semantic_category.name,
|
|
1155
|
+
feature="feat_q",
|
|
1156
|
+
value="value q",
|
|
1157
|
+
tag="ctx_tag",
|
|
1158
|
+
embedding=np.array([0.0, 1.0]),
|
|
1159
|
+
)
|
|
1160
|
+
|
|
1161
|
+
filter_str = f"set_id IN ('user-consolidate-ctx') AND category_name IN ('{semantic_category.name}')"
|
|
1162
|
+
memories = await _collect(
|
|
1163
|
+
semantic_storage.get_feature_set(filter_expr=parse_filter(filter_str))
|
|
1164
|
+
)
|
|
1165
|
+
|
|
1166
|
+
async def raise_ctx_error(*args, **kwargs):
|
|
1167
|
+
raise ExternalServiceAPIError(
|
|
1168
|
+
"context window exceeded"
|
|
1169
|
+
) from ContextLengthExceededError("input exceeds context window")
|
|
1170
|
+
|
|
1171
|
+
monkeypatch.setattr(
|
|
1172
|
+
"memmachine_server.semantic_memory.semantic_ingestion.llm_consolidate_features",
|
|
1173
|
+
raise_ctx_error,
|
|
1174
|
+
)
|
|
1175
|
+
|
|
1176
|
+
await ingestion_service._deduplicate_features(
|
|
1177
|
+
set_id="user-consolidate-ctx",
|
|
1178
|
+
memories=memories,
|
|
1179
|
+
semantic_category=semantic_category,
|
|
1180
|
+
resources=resources,
|
|
1181
|
+
)
|
|
1182
|
+
|
|
1183
|
+
assert await semantic_storage.get_feature(id1) is not None
|
|
1184
|
+
assert await semantic_storage.get_feature(id2) is not None
|
|
1185
|
+
|
|
1186
|
+
|
|
1187
|
+
@pytest.mark.asyncio
|
|
1188
|
+
async def test_consolidation_retries_on_exception(
|
|
1189
|
+
ingestion_service: IngestionService,
|
|
1190
|
+
semantic_storage: SemanticStorage,
|
|
1191
|
+
episode_storage: EpisodeStorage,
|
|
1192
|
+
resources: Resources,
|
|
1193
|
+
semantic_category: SemanticCategory,
|
|
1194
|
+
semantic_prompt,
|
|
1195
|
+
monkeypatch,
|
|
1196
|
+
):
|
|
1197
|
+
"""A non-context exception on the first call must not short-circuit the
|
|
1198
|
+
loop — the helper retries once and proceeds with the successful response."""
|
|
1199
|
+
id1 = await semantic_storage.add_feature(
|
|
1200
|
+
set_id="user-retry-exc",
|
|
1201
|
+
category_name=semantic_category.name,
|
|
1202
|
+
feature="feat_a",
|
|
1203
|
+
value="value a",
|
|
1204
|
+
tag="exc_tag",
|
|
1205
|
+
embedding=np.array([1.0, 0.0]),
|
|
1206
|
+
)
|
|
1207
|
+
await semantic_storage.add_feature(
|
|
1208
|
+
set_id="user-retry-exc",
|
|
1209
|
+
category_name=semantic_category.name,
|
|
1210
|
+
feature="feat_b",
|
|
1211
|
+
value="value b",
|
|
1212
|
+
tag="exc_tag",
|
|
1213
|
+
embedding=np.array([0.0, 1.0]),
|
|
1214
|
+
)
|
|
1215
|
+
|
|
1216
|
+
valid_response = SemanticConsolidateMemoryRes(
|
|
1217
|
+
consolidated_memories=[
|
|
1218
|
+
LLMReducedFeature(tag="exc_tag", feature="combined", value="combined a+b")
|
|
1219
|
+
],
|
|
1220
|
+
keep_memories=[id1],
|
|
1221
|
+
)
|
|
1222
|
+
|
|
1223
|
+
async def flaky(*args, **kwargs):
|
|
1224
|
+
if llm_mock.await_count == 1:
|
|
1225
|
+
raise ValueError("structured-output validation failed")
|
|
1226
|
+
return valid_response
|
|
1227
|
+
|
|
1228
|
+
llm_mock = AsyncMock(side_effect=flaky)
|
|
1229
|
+
monkeypatch.setattr(
|
|
1230
|
+
"memmachine_server.semantic_memory.semantic_ingestion.llm_consolidate_features",
|
|
1231
|
+
llm_mock,
|
|
1232
|
+
)
|
|
1233
|
+
|
|
1234
|
+
result = await ingestion_service._try_consolidate(
|
|
1235
|
+
set_id="user-retry-exc",
|
|
1236
|
+
features=[],
|
|
1237
|
+
model=resources.language_model,
|
|
1238
|
+
consolidation_prompt=semantic_prompt.consolidation_prompt,
|
|
1239
|
+
)
|
|
1240
|
+
|
|
1241
|
+
assert llm_mock.await_count == 2
|
|
1242
|
+
assert result is valid_response
|
|
1243
|
+
|
|
1244
|
+
|
|
1245
|
+
@pytest.mark.asyncio
|
|
1246
|
+
async def test_consolidation_exhausted_exceptions_respects_debug_fail_loudly(
|
|
1247
|
+
semantic_storage: SemanticStorage,
|
|
1248
|
+
episode_storage: EpisodeStorage,
|
|
1249
|
+
resource_retriever: MockResourceRetriever,
|
|
1250
|
+
resources: Resources,
|
|
1251
|
+
semantic_category: SemanticCategory,
|
|
1252
|
+
semantic_prompt,
|
|
1253
|
+
monkeypatch,
|
|
1254
|
+
):
|
|
1255
|
+
"""When every attempt raises a non-context exception, _try_consolidate
|
|
1256
|
+
re-raises under debug_fail_loudly only after the retry is exhausted."""
|
|
1257
|
+
ingestion_service = IngestionService(
|
|
1258
|
+
IngestionService.Params(
|
|
1259
|
+
semantic_storage=semantic_storage,
|
|
1260
|
+
history_store=episode_storage,
|
|
1261
|
+
resource_retriever=resource_retriever.get_resources,
|
|
1262
|
+
consolidated_threshold=2,
|
|
1263
|
+
debug_fail_loudly=True,
|
|
1264
|
+
)
|
|
1265
|
+
)
|
|
1266
|
+
|
|
1267
|
+
async def always_raise(*args, **kwargs):
|
|
1268
|
+
raise ValueError("structured-output validation failed")
|
|
1269
|
+
|
|
1270
|
+
llm_mock = AsyncMock(side_effect=always_raise)
|
|
1271
|
+
monkeypatch.setattr(
|
|
1272
|
+
"memmachine_server.semantic_memory.semantic_ingestion.llm_consolidate_features",
|
|
1273
|
+
llm_mock,
|
|
1274
|
+
)
|
|
1275
|
+
|
|
1276
|
+
with pytest.raises(ValueError, match="structured-output validation failed"):
|
|
1277
|
+
await ingestion_service._try_consolidate(
|
|
1278
|
+
set_id="user-exc-loud",
|
|
1279
|
+
features=[],
|
|
1280
|
+
model=resources.language_model,
|
|
1281
|
+
consolidation_prompt=semantic_prompt.consolidation_prompt,
|
|
1282
|
+
)
|
|
1283
|
+
|
|
1284
|
+
# Retry must still happen before the loud re-raise.
|
|
1285
|
+
assert llm_mock.await_count == 2
|
|
1286
|
+
|
|
1287
|
+
|
|
1288
|
+
@pytest.mark.asyncio
|
|
1289
|
+
async def test_deduplicate_features_context_length_does_not_raise_in_debug_mode(
|
|
1290
|
+
semantic_storage: SemanticStorage,
|
|
1291
|
+
episode_storage: EpisodeStorage,
|
|
1292
|
+
resource_retriever: MockResourceRetriever,
|
|
1293
|
+
resources: Resources,
|
|
1294
|
+
semantic_category: SemanticCategory,
|
|
1295
|
+
monkeypatch,
|
|
1296
|
+
):
|
|
1297
|
+
"""Context-length errors during consolidation must be handled gracefully
|
|
1298
|
+
even when debug_fail_loudly is True, matching the feature-update path."""
|
|
1299
|
+
|
|
1300
|
+
class ContextLengthExceededError(Exception):
|
|
1301
|
+
code = "context_length_exceeded"
|
|
1302
|
+
|
|
1303
|
+
ingestion_service = IngestionService(
|
|
1304
|
+
IngestionService.Params(
|
|
1305
|
+
semantic_storage=semantic_storage,
|
|
1306
|
+
history_store=episode_storage,
|
|
1307
|
+
resource_retriever=resource_retriever.get_resources,
|
|
1308
|
+
consolidated_threshold=2,
|
|
1309
|
+
debug_fail_loudly=True,
|
|
1310
|
+
)
|
|
1311
|
+
)
|
|
1312
|
+
|
|
1313
|
+
id1 = await semantic_storage.add_feature(
|
|
1314
|
+
set_id="user-ctx-loud",
|
|
1315
|
+
category_name=semantic_category.name,
|
|
1316
|
+
feature="feat_p",
|
|
1317
|
+
value="value p",
|
|
1318
|
+
tag="ctx_tag",
|
|
1319
|
+
embedding=np.array([1.0, 0.0]),
|
|
1320
|
+
)
|
|
1321
|
+
id2 = await semantic_storage.add_feature(
|
|
1322
|
+
set_id="user-ctx-loud",
|
|
1323
|
+
category_name=semantic_category.name,
|
|
1324
|
+
feature="feat_q",
|
|
1325
|
+
value="value q",
|
|
1326
|
+
tag="ctx_tag",
|
|
1327
|
+
embedding=np.array([0.0, 1.0]),
|
|
1328
|
+
)
|
|
1329
|
+
|
|
1330
|
+
filter_str = (
|
|
1331
|
+
f"set_id IN ('user-ctx-loud') AND category_name IN ('{semantic_category.name}')"
|
|
1332
|
+
)
|
|
1333
|
+
memories = await _collect(
|
|
1334
|
+
semantic_storage.get_feature_set(filter_expr=parse_filter(filter_str))
|
|
1335
|
+
)
|
|
1336
|
+
|
|
1337
|
+
async def raise_ctx_error(*args, **kwargs):
|
|
1338
|
+
raise ExternalServiceAPIError(
|
|
1339
|
+
"context window exceeded"
|
|
1340
|
+
) from ContextLengthExceededError("input exceeds context window")
|
|
1341
|
+
|
|
1342
|
+
monkeypatch.setattr(
|
|
1343
|
+
"memmachine_server.semantic_memory.semantic_ingestion.llm_consolidate_features",
|
|
1344
|
+
raise_ctx_error,
|
|
1345
|
+
)
|
|
1346
|
+
|
|
1347
|
+
# Must not raise even though debug_fail_loudly=True.
|
|
1348
|
+
await ingestion_service._deduplicate_features(
|
|
1349
|
+
set_id="user-ctx-loud",
|
|
1350
|
+
memories=memories,
|
|
1351
|
+
semantic_category=semantic_category,
|
|
1352
|
+
resources=resources,
|
|
1353
|
+
)
|
|
1354
|
+
|
|
1355
|
+
assert await semantic_storage.get_feature(id1) is not None
|
|
1356
|
+
assert await semantic_storage.get_feature(id2) is not None
|
|
@@ -150,11 +150,11 @@ class OpenAIEmbedder(Embedder):
|
|
|
150
150
|
for input_text in inputs
|
|
151
151
|
]
|
|
152
152
|
|
|
153
|
+
effective_max = (
|
|
154
|
+
self._max_input_length or self.max_total_input_length_per_request
|
|
155
|
+
)
|
|
153
156
|
inputs_chunks = [
|
|
154
|
-
chunk_text_balanced(input_text,
|
|
155
|
-
if self._max_input_length is not None
|
|
156
|
-
else [input_text]
|
|
157
|
-
for input_text in inputs
|
|
157
|
+
chunk_text_balanced(input_text, effective_max) for input_text in inputs
|
|
158
158
|
]
|
|
159
159
|
|
|
160
160
|
chunks = [chunk for input_chunks in inputs_chunks for chunk in input_chunks]
|
|
@@ -269,7 +269,7 @@ class OpenAIChatCompletionsLanguageModel(LanguageModel):
|
|
|
269
269
|
f"[call uuid: {generate_response_call_uuid}] "
|
|
270
270
|
"Giving up generating response "
|
|
271
271
|
f"after failed attempt {attempt} "
|
|
272
|
-
f"due to non-retryable {type(e).__name__}"
|
|
272
|
+
f"due to non-retryable {type(e).__name__}: {e}"
|
|
273
273
|
)
|
|
274
274
|
logger.exception(error_message)
|
|
275
275
|
raise ExternalServiceAPIError(error_message) from e
|
|
@@ -12,8 +12,10 @@ from pydantic import BaseModel, Field, InstanceOf, TypeAdapter
|
|
|
12
12
|
from memmachine_server.common.embedder import Embedder
|
|
13
13
|
from memmachine_server.common.episode_store import Episode, EpisodeIdT, EpisodeStorage
|
|
14
14
|
from memmachine_server.common.filter.filter_parser import And, Comparison
|
|
15
|
+
from memmachine_server.common.language_model import LanguageModel
|
|
15
16
|
from memmachine_server.semantic_memory.semantic_llm import (
|
|
16
17
|
LLMReducedFeature,
|
|
18
|
+
SemanticConsolidateMemoryRes,
|
|
17
19
|
llm_consolidate_features,
|
|
18
20
|
llm_feature_update,
|
|
19
21
|
)
|
|
@@ -30,6 +32,17 @@ from memmachine_server.semantic_memory.storage.storage_base import SemanticStora
|
|
|
30
32
|
|
|
31
33
|
logger = logging.getLogger(__name__)
|
|
32
34
|
|
|
35
|
+
_MAX_CONSOLIDATION_ATTEMPTS = 2
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class _ConsolidationContextLengthError(Exception):
|
|
39
|
+
"""Signals that consolidation must be skipped due to a context-length error.
|
|
40
|
+
|
|
41
|
+
Caught inside the ingestion service to distinguish the graceful-skip path
|
|
42
|
+
from genuine consolidation failure, so that `debug_fail_loudly` does not
|
|
43
|
+
raise for scenarios the feature-update path already handles silently.
|
|
44
|
+
"""
|
|
45
|
+
|
|
33
46
|
|
|
34
47
|
def _is_context_length_exceeded_error(error: Exception) -> bool:
|
|
35
48
|
seen: set[int] = set()
|
|
@@ -370,6 +383,67 @@ class IngestionService:
|
|
|
370
383
|
|
|
371
384
|
await asyncio.gather(*category_tasks)
|
|
372
385
|
|
|
386
|
+
async def _try_consolidate(
|
|
387
|
+
self,
|
|
388
|
+
*,
|
|
389
|
+
set_id: str,
|
|
390
|
+
features: list[SemanticFeature],
|
|
391
|
+
model: LanguageModel,
|
|
392
|
+
consolidation_prompt: str,
|
|
393
|
+
) -> SemanticConsolidateMemoryRes | None:
|
|
394
|
+
"""Call llm_consolidate_features with retry on transient failures.
|
|
395
|
+
|
|
396
|
+
Retries on parse/validation exceptions and on ``None`` returns (which
|
|
397
|
+
indicate a structured-output parse failure upstream). A context-length
|
|
398
|
+
exception is raised as :class:`_ConsolidationContextLengthError` so
|
|
399
|
+
the caller can skip the group without tripping ``debug_fail_loudly``.
|
|
400
|
+
Returns ``None`` once retries are exhausted, raising instead when
|
|
401
|
+
``self._debug_fail_loudly`` is True and the last failure was not a
|
|
402
|
+
context-length error.
|
|
403
|
+
"""
|
|
404
|
+
for attempt in range(1, _MAX_CONSOLIDATION_ATTEMPTS + 1):
|
|
405
|
+
try:
|
|
406
|
+
result = await llm_consolidate_features(
|
|
407
|
+
features=features,
|
|
408
|
+
model=model,
|
|
409
|
+
consolidate_prompt=consolidation_prompt,
|
|
410
|
+
)
|
|
411
|
+
except Exception as err:
|
|
412
|
+
if _is_context_length_exceeded_error(err):
|
|
413
|
+
logger.warning(
|
|
414
|
+
"Skipping consolidation for set %s due to non-retryable context length error",
|
|
415
|
+
set_id,
|
|
416
|
+
)
|
|
417
|
+
raise _ConsolidationContextLengthError from err
|
|
418
|
+
if attempt < _MAX_CONSOLIDATION_ATTEMPTS:
|
|
419
|
+
logger.warning(
|
|
420
|
+
"Consolidation raised %s on attempt %d/%d for set %s, retrying",
|
|
421
|
+
type(err).__name__,
|
|
422
|
+
attempt,
|
|
423
|
+
_MAX_CONSOLIDATION_ATTEMPTS,
|
|
424
|
+
set_id,
|
|
425
|
+
)
|
|
426
|
+
continue
|
|
427
|
+
logger.exception(
|
|
428
|
+
"Failed to consolidate features while calling LLM for set %s on attempt %d/%d",
|
|
429
|
+
set_id,
|
|
430
|
+
attempt,
|
|
431
|
+
_MAX_CONSOLIDATION_ATTEMPTS,
|
|
432
|
+
)
|
|
433
|
+
if self._debug_fail_loudly:
|
|
434
|
+
raise
|
|
435
|
+
return None
|
|
436
|
+
if result is not None:
|
|
437
|
+
return result
|
|
438
|
+
if attempt < _MAX_CONSOLIDATION_ATTEMPTS:
|
|
439
|
+
logger.warning(
|
|
440
|
+
"Consolidation returned None on attempt %d/%d for set %s, retrying",
|
|
441
|
+
attempt,
|
|
442
|
+
_MAX_CONSOLIDATION_ATTEMPTS,
|
|
443
|
+
set_id,
|
|
444
|
+
)
|
|
445
|
+
return None
|
|
446
|
+
|
|
373
447
|
async def _deduplicate_features(
|
|
374
448
|
self,
|
|
375
449
|
*,
|
|
@@ -379,19 +453,20 @@ class IngestionService:
|
|
|
379
453
|
resources: InstanceOf[Resources],
|
|
380
454
|
) -> None:
|
|
381
455
|
try:
|
|
382
|
-
consolidate_resp = await
|
|
456
|
+
consolidate_resp = await self._try_consolidate(
|
|
457
|
+
set_id=set_id,
|
|
383
458
|
features=list(memories),
|
|
384
459
|
model=resources.language_model,
|
|
385
|
-
|
|
460
|
+
consolidation_prompt=semantic_category.prompt.consolidation_prompt,
|
|
386
461
|
)
|
|
387
|
-
except
|
|
388
|
-
logger.exception("Failed to update features while calling LLM")
|
|
389
|
-
if self._debug_fail_loudly:
|
|
390
|
-
raise
|
|
462
|
+
except _ConsolidationContextLengthError:
|
|
391
463
|
return
|
|
392
464
|
|
|
393
465
|
if consolidate_resp is None or consolidate_resp.keep_memories is None:
|
|
394
|
-
logger.warning(
|
|
466
|
+
logger.warning(
|
|
467
|
+
"Failed to consolidate features after %d attempts",
|
|
468
|
+
_MAX_CONSOLIDATION_ATTEMPTS,
|
|
469
|
+
)
|
|
395
470
|
if self._debug_fail_loudly:
|
|
396
471
|
raise ValueError("Failed to consolidate features")
|
|
397
472
|
return
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memmachine-server
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
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
|
|
@@ -24,12 +24,12 @@ Requires-Dist: boto3-stubs==1.40.64
|
|
|
24
24
|
Requires-Dist: cohere>=5.20.0
|
|
25
25
|
Requires-Dist: dotenv>=0.9.9
|
|
26
26
|
Requires-Dist: fastapi>=0.116.1
|
|
27
|
-
Requires-Dist: fastmcp>=3.0
|
|
27
|
+
Requires-Dist: fastmcp>=3.2.0
|
|
28
28
|
Requires-Dist: instructor[bedrock]>=1.12.0
|
|
29
29
|
Requires-Dist: json-repair>=0.54
|
|
30
30
|
Requires-Dist: langchain-aws>=0.2.33
|
|
31
31
|
Requires-Dist: neo4j>=5.28.2
|
|
32
|
-
Requires-Dist: nltk>=3.9.
|
|
32
|
+
Requires-Dist: nltk>=3.9.4
|
|
33
33
|
Requires-Dist: openai>=2.21.0
|
|
34
34
|
Requires-Dist: pgvector>=0.4.1
|
|
35
35
|
Requires-Dist: prometheus-client>=0.22.1
|
{memmachine_server-0.3.4 → memmachine_server-0.3.6}/src/memmachine_server.egg-info/requires.txt
RENAMED
|
@@ -7,12 +7,12 @@ boto3-stubs==1.40.64
|
|
|
7
7
|
cohere>=5.20.0
|
|
8
8
|
dotenv>=0.9.9
|
|
9
9
|
fastapi>=0.116.1
|
|
10
|
-
fastmcp>=3.0
|
|
10
|
+
fastmcp>=3.2.0
|
|
11
11
|
instructor[bedrock]>=1.12.0
|
|
12
12
|
json-repair>=0.54
|
|
13
13
|
langchain-aws>=0.2.33
|
|
14
14
|
neo4j>=5.28.2
|
|
15
|
-
nltk>=3.9.
|
|
15
|
+
nltk>=3.9.4
|
|
16
16
|
openai>=2.21.0
|
|
17
17
|
pgvector>=0.4.1
|
|
18
18
|
prometheus-client>=0.22.1
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{memmachine_server-0.3.4 → memmachine_server-0.3.6}/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
|