memmachine-server 0.3.5__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.
Files changed (290) hide show
  1. {memmachine_server-0.3.5/src/memmachine_server.egg-info → memmachine_server-0.3.6}/PKG-INFO +3 -3
  2. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/pyproject.toml +2 -2
  3. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/language_model/test_openai_chat_completions_language_model.py +19 -0
  4. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_ingestion.py +351 -0
  5. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/language_model/openai_chat_completions_language_model.py +1 -1
  6. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/semantic_ingestion.py +82 -7
  7. {memmachine_server-0.3.5 → memmachine_server-0.3.6/src/memmachine_server.egg-info}/PKG-INFO +3 -3
  8. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server.egg-info/requires.txt +2 -2
  9. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/LICENSE +0 -0
  10. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/README.md +0 -0
  11. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/__init__.py +0 -0
  12. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/__init__.py +0 -0
  13. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/__init__.py +0 -0
  14. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/api/__init__.py +0 -0
  15. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/api/test_version.py +0 -0
  16. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/__init__.py +0 -0
  17. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_configuration.py +0 -0
  18. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_database_conf.py +0 -0
  19. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_embedder_conf.py +0 -0
  20. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_episodic_config.py +0 -0
  21. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_language_model_conf.py +0 -0
  22. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_log_conf.py +0 -0
  23. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_mixin_confs.py +0 -0
  24. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_prompt_conf.py +0 -0
  25. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_reranker_conf.py +0 -0
  26. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_semantic_conf.py +0 -0
  27. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/configuration/test_server_conf.py +0 -0
  28. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/embedder/__init__.py +0 -0
  29. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/embedder/test_amazon_bedrock_embedder.py +0 -0
  30. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/embedder/test_openai_embedder.py +0 -0
  31. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/embedder/test_sentence_transformer_embedder.py +0 -0
  32. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/episode_store/__init__.py +0 -0
  33. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/episode_store/test_count_caching_episode_storage.py +0 -0
  34. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/episode_store/test_episode_model.py +0 -0
  35. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/episode_store/test_episode_storage.py +0 -0
  36. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/episode_store/test_sqlalchemy_episode_store_startup.py +0 -0
  37. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/filter/__init__.py +0 -0
  38. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/filter/test_filter_parser.py +0 -0
  39. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/filter/test_sql_filter_util.py +0 -0
  40. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/language_model/__init__.py +0 -0
  41. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/language_model/test_openai_responses_language_model.py +0 -0
  42. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/__init__.py +0 -0
  43. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/fake_embedder.py +0 -0
  44. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_amazon_bedrock_reranker.py +0 -0
  45. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_bm25_reranker.py +0 -0
  46. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_cohere_reranker.py +0 -0
  47. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_cross_encoder_reranker.py +0 -0
  48. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_embedder_reranker.py +0 -0
  49. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_identity_reranker.py +0 -0
  50. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/reranker/test_rrf_hybrid_reranker.py +0 -0
  51. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/resource_manager/__init__.py +0 -0
  52. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/resource_manager/test_database_manager.py +0 -0
  53. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/resource_manager/test_embedder_manager.py +0 -0
  54. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/resource_manager/test_language_model_manager.py +0 -0
  55. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/resource_manager/test_reranker_manager.py +0 -0
  56. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/resource_manager/test_resource_manager.py +0 -0
  57. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/session_manager/__init__.py +0 -0
  58. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/session_manager/test_session_manager.py +0 -0
  59. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/session_manager/test_session_manager_migration.py +0 -0
  60. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/test_rw_locks.py +0 -0
  61. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/test_utils.py +0 -0
  62. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/vector_graph_store/__init__.py +0 -0
  63. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/vector_graph_store/test_nebula_graph_vector_graph_store.py +0 -0
  64. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/common/vector_graph_store/test_neo4j_vector_graph_store.py +0 -0
  65. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/conftest.py +0 -0
  66. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/__init__.py +0 -0
  67. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/conftest.py +0 -0
  68. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/declarative_memory/__init__.py +0 -0
  69. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/declarative_memory/test_declarative_memory.py +0 -0
  70. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/long_term_memory/__init__.py +0 -0
  71. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/long_term_memory/test_long_term_memory.py +0 -0
  72. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/short_term_memory/__init__.py +0 -0
  73. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/short_term_memory/test_short_term_memory.py +0 -0
  74. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/test_episodic_memory.py +0 -0
  75. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/test_episodic_memory_manager.py +0 -0
  76. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/episodic_memory/test_instance_lru_cache.py +0 -0
  77. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/installation/__init__.py +0 -0
  78. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/installation/test_configuration_wizard.py +0 -0
  79. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/installation/test_memmachine_configure.py +0 -0
  80. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/installation/test_utilities.py +0 -0
  81. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/main/__init__.py +0 -0
  82. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/main/conftest.py +0 -0
  83. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/main/test_memachine.py +0 -0
  84. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/main/test_memmachine_delete_session.py +0 -0
  85. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/main/test_memmachine_integration.py +0 -0
  86. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/main/test_memmachine_mock.py +0 -0
  87. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/retrieval_agent/__init__.py +0 -0
  88. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/retrieval_agent/test_retrieval_agent.py +0 -0
  89. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/__init__.py +0 -0
  90. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/cluster_store/__init__.py +0 -0
  91. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/cluster_store/test_cluster_state_storage.py +0 -0
  92. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/config_store/__init__.py +0 -0
  93. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/config_store/test_caching_semantic_config_storage.py +0 -0
  94. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/config_store/test_semantic_config_storage.py +0 -0
  95. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/conftest.py +0 -0
  96. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/mock_semantic_memory_objects.py +0 -0
  97. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/semantic_test_utils.py +0 -0
  98. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/__init__.py +0 -0
  99. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/__init__.py +0 -0
  100. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/helpers.py +0 -0
  101. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/original_schema.sql +0 -0
  102. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_set_id_migration.py +0 -0
  103. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/alembic_pg/test_sqlalchemy_vs_alembic.py +0 -0
  104. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/conftest.py +0 -0
  105. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/in_memory_semantic_storage.py +0 -0
  106. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/test_semantic_storage.py +0 -0
  107. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/storage/test_text_sanitizer.py +0 -0
  108. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_cluster_manager.py +0 -0
  109. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_cluster_splitter.py +0 -0
  110. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_history_cleanup.py +0 -0
  111. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_llm.py +0 -0
  112. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_llm_integration.py +0 -0
  113. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_memory.py +0 -0
  114. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_background.py +0 -0
  115. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_memory_integration.py +0 -0
  116. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_model.py +0 -0
  117. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/semantic_memory/test_semantic_session_manager.py +0 -0
  118. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/__init__.py +0 -0
  119. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/__init__.py +0 -0
  120. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/test_config_router.py +0 -0
  121. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/test_config_service.py +0 -0
  122. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/test_mcp.py +0 -0
  123. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/test_router.py +0 -0
  124. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/test_service.py +0 -0
  125. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/api_v2/test_spec.py +0 -0
  126. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/prompt/__init__.py +0 -0
  127. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/prompt/test_prompt_utilities.py +0 -0
  128. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/server/test_middleware.py +0 -0
  129. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/server_tests/memmachine_server/test_data/longmemeval_snippet.json +0 -0
  130. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/setup.cfg +0 -0
  131. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/__init__.py +0 -0
  132. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/__init__.py +0 -0
  133. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/api/__init__.py +0 -0
  134. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/api/version.py +0 -0
  135. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/__init__.py +0 -0
  136. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/database_conf.py +0 -0
  137. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/default_episode_summary_system_prompt.txt +0 -0
  138. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/default_episode_summary_user_prompt.txt +0 -0
  139. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/embedder_conf.py +0 -0
  140. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/episodic_config.py +0 -0
  141. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/language_model_conf.py +0 -0
  142. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/log_conf.py +0 -0
  143. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/mixin_confs.py +0 -0
  144. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/reranker_conf.py +0 -0
  145. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/configuration/retrieval_config.py +0 -0
  146. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/data_types.py +0 -0
  147. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/embedder/__init__.py +0 -0
  148. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/embedder/amazon_bedrock_embedder.py +0 -0
  149. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/embedder/embedder.py +0 -0
  150. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/embedder/openai_embedder.py +0 -0
  151. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/embedder/sentence_transformer_embedder.py +0 -0
  152. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/episode_store/__init__.py +0 -0
  153. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/episode_store/count_caching_episode_storage.py +0 -0
  154. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/episode_store/episode_model.py +0 -0
  155. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/episode_store/episode_sqlalchemy_store.py +0 -0
  156. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/episode_store/episode_storage.py +0 -0
  157. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/errors.py +0 -0
  158. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/filter/__init__.py +0 -0
  159. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/filter/filter_parser.py +0 -0
  160. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/filter/sql_filter_util.py +0 -0
  161. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/language_model/__init__.py +0 -0
  162. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/language_model/amazon_bedrock_language_model.py +0 -0
  163. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/language_model/language_model.py +0 -0
  164. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/language_model/openai_responses_language_model.py +0 -0
  165. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/metrics_factory/__init__.py +0 -0
  166. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/metrics_factory/metrics_factory.py +0 -0
  167. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/metrics_factory/operation_tracker.py +0 -0
  168. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/metrics_factory/prometheus_metrics_factory.py +0 -0
  169. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/neo4j_utils.py +0 -0
  170. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/__init__.py +0 -0
  171. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/amazon_bedrock_reranker.py +0 -0
  172. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/bm25_reranker.py +0 -0
  173. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/cohere_reranker.py +0 -0
  174. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/cross_encoder_reranker.py +0 -0
  175. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/embedder_reranker.py +0 -0
  176. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/identity_reranker.py +0 -0
  177. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/reranker.py +0 -0
  178. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/reranker/rrf_hybrid_reranker.py +0 -0
  179. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/__init__.py +0 -0
  180. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/base_manager.py +0 -0
  181. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/database_manager.py +0 -0
  182. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/embedder_manager.py +0 -0
  183. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/language_model_manager.py +0 -0
  184. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/reranker_manager.py +0 -0
  185. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/resource_manager.py +0 -0
  186. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/resource_manager/semantic_manager.py +0 -0
  187. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/rw_locks.py +0 -0
  188. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/session_manager/__init__.py +0 -0
  189. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/session_manager/session_data_manager.py +0 -0
  190. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/session_manager/session_data_manager_sql_impl.py +0 -0
  191. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/utils.py +0 -0
  192. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_graph_store/__init__.py +0 -0
  193. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_graph_store/data_types.py +0 -0
  194. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_graph_store/nebula_graph_vector_graph_store.py +0 -0
  195. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_graph_store/neo4j_vector_graph_store.py +0 -0
  196. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_graph_store/vector_graph_store.py +0 -0
  197. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_store/__init__.py +0 -0
  198. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_store/data_types.py +0 -0
  199. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_store/utils.py +0 -0
  200. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/common/vector_store/vector_store.py +0 -0
  201. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/__init__.py +0 -0
  202. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/declarative_memory/__init__.py +0 -0
  203. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/declarative_memory/data_types.py +0 -0
  204. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/declarative_memory/declarative_memory.py +0 -0
  205. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/episodic_memory.py +0 -0
  206. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/episodic_memory_manager.py +0 -0
  207. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/instance_lru_cache.py +0 -0
  208. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/long_term_memory/__init__.py +0 -0
  209. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/long_term_memory/long_term_memory.py +0 -0
  210. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/long_term_memory/service_locator.py +0 -0
  211. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/service_locator.py +0 -0
  212. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/short_term_memory/__init__.py +0 -0
  213. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/short_term_memory/service_locator.py +0 -0
  214. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/episodic_memory/short_term_memory/short_term_memory.py +0 -0
  215. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/installation/__init__.py +0 -0
  216. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/installation/configuration_wizard.py +0 -0
  217. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/installation/memmachine_configure.py +0 -0
  218. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/installation/utilities.py +0 -0
  219. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/main/__init__.py +0 -0
  220. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/main/memmachine.py +0 -0
  221. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/__init__.py +0 -0
  222. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/agents/__init__.py +0 -0
  223. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/agents/coq_agent.py +0 -0
  224. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/agents/memmachine_retriever.py +0 -0
  225. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/agents/split_query_agent.py +0 -0
  226. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/agents/tool_select_agent.py +0 -0
  227. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/common/__init__.py +0 -0
  228. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/common/agent_api.py +0 -0
  229. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/retrieval_agent/service_locator.py +0 -0
  230. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/__init__.py +0 -0
  231. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/cluster_manager.py +0 -0
  232. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/cluster_splitter.py +0 -0
  233. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/cluster_store/__init__.py +0 -0
  234. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/cluster_store/cluster_store.py +0 -0
  235. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/cluster_store/cluster_store_sqlalchemy.py +0 -0
  236. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/cluster_store/in_memory_cluster_store.py +0 -0
  237. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/config_store/__init__.py +0 -0
  238. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/config_store/caching_semantic_config_storage.py +0 -0
  239. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/config_store/config_store.py +0 -0
  240. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/config_store/config_store_sqlalchemy.py +0 -0
  241. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/semantic_llm.py +0 -0
  242. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/semantic_memory.py +0 -0
  243. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/semantic_model.py +0 -0
  244. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/semantic_session_manager.py +0 -0
  245. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/__init__.py +0 -0
  246. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/__init__.py +0 -0
  247. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/env.py +0 -0
  248. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/script.py.mako +0 -0
  249. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/001_initial_migration.py +0 -0
  250. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/3d6aaebdc526_sync_sqlalchemy_schema.py +0 -0
  251. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/62dff1150a46_add_created_at_to_history_add.py +0 -0
  252. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/79f00a9f2409_change_history_id_to_string.py +0 -0
  253. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/843f6d216d10_rename_semantic_type_to_semantic_.py +0 -0
  254. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/__init__.py +0 -0
  255. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/adb5618bd4ee_remove_history_table.py +0 -0
  256. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/b65f7f4a9d2c_migrate_legacy_set_ids.py +0 -0
  257. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/c7a2f8e31b90_add_ingested_composite_index.py +0 -0
  258. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/alembic_pg/versions/d1a9df11343b_add_indexes.py +0 -0
  259. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/neo4j_semantic_storage.py +0 -0
  260. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/sqlalchemy_pgvector_semantic.py +0 -0
  261. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/storage_base.py +0 -0
  262. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/storage/text_sanitizer.py +0 -0
  263. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/util/__init__.py +0 -0
  264. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/semantic_memory/util/semantic_prompt_template.py +0 -0
  265. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/__init__.py +0 -0
  266. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/__init__.py +0 -0
  267. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/config_router.py +0 -0
  268. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/config_service.py +0 -0
  269. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/exceptions.py +0 -0
  270. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/mcp.py +0 -0
  271. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/router.py +0 -0
  272. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/api_v2/service.py +0 -0
  273. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/app.py +0 -0
  274. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/diagnostics.py +0 -0
  275. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/mcp_http.py +0 -0
  276. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/mcp_stdio.py +0 -0
  277. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/middleware.py +0 -0
  278. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/__init__.py +0 -0
  279. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/coding_style_prompt.py +0 -0
  280. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/crm_prompt.py +0 -0
  281. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/default_prompts.py +0 -0
  282. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/financial_analyst_prompt.py +0 -0
  283. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/health_assistant_prompt.py +0 -0
  284. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/profile_prompt.py +0 -0
  285. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/prompt_utilities.py +0 -0
  286. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server/server/prompt/writing_assistant_prompt.py +0 -0
  287. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server.egg-info/SOURCES.txt +0 -0
  288. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server.egg-info/dependency_links.txt +0 -0
  289. {memmachine_server-0.3.5 → memmachine_server-0.3.6}/src/memmachine_server.egg-info/entry_points.txt +0 -0
  290. {memmachine_server-0.3.5 → 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.5
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.2
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.3
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.2",
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.3",
23
+ "nltk>=3.9.4",
24
24
  "openai>=2.21.0",
25
25
  "pgvector>=0.4.1",
26
26
  "prometheus-client>=0.22.1",
@@ -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
@@ -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 llm_consolidate_features(
456
+ consolidate_resp = await self._try_consolidate(
457
+ set_id=set_id,
383
458
  features=list(memories),
384
459
  model=resources.language_model,
385
- consolidate_prompt=semantic_category.prompt.consolidation_prompt,
460
+ consolidation_prompt=semantic_category.prompt.consolidation_prompt,
386
461
  )
387
- except (ValueError, TypeError):
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("Failed to consolidate features")
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.5
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.2
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.3
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
@@ -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.2
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.3
15
+ nltk>=3.9.4
16
16
  openai>=2.21.0
17
17
  pgvector>=0.4.1
18
18
  prometheus-client>=0.22.1