memmachine-server 0.2.2__tar.gz → 0.2.4__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 (172) hide show
  1. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/PKG-INFO +8 -1
  2. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/README.md +7 -0
  3. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/pyproject.toml +5 -2
  4. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/__init__.py +1 -0
  5. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/api/doc.py +77 -0
  6. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/api/spec.py +327 -7
  7. memmachine_server-0.2.4/src/memmachine/common/api/version.py +21 -0
  8. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/configuration/database_conf.py +43 -0
  9. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/configuration/mixin_confs.py +25 -18
  10. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/episode_store/episode_model.py +1 -0
  11. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/errors.py +20 -0
  12. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/resource_manager/database_manager.py +39 -10
  13. memmachine_server-0.2.4/src/memmachine/common/rw_locks.py +145 -0
  14. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/session_manager/session_data_manager_sql_impl.py +79 -12
  15. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/vector_graph_store/neo4j_vector_graph_store.py +2 -3
  16. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/episodic_memory/declarative_memory/declarative_memory.py +69 -24
  17. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/episodic_memory/episodic_memory.py +21 -11
  18. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/episodic_memory/episodic_memory_manager.py +136 -124
  19. memmachine_server-0.2.4/src/memmachine/episodic_memory/instance_lru_cache.py +236 -0
  20. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/episodic_memory/long_term_memory/long_term_memory.py +33 -6
  21. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/installation/memmachine_configure.py +44 -27
  22. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/installation/utilities.py +10 -0
  23. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/main/memmachine.py +4 -0
  24. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/rest_client/client.py +38 -25
  25. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/rest_client/memory.py +7 -3
  26. memmachine_server-0.2.4/src/memmachine/semantic_memory/storage/alembic_pg/script.py.mako +28 -0
  27. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/api_v2/mcp.py +4 -1
  28. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/api_v2/router.py +23 -39
  29. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/api_v2/service.py +58 -4
  30. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/app.py +59 -41
  31. memmachine_server-0.2.4/src/memmachine/server/middleware.py +91 -0
  32. memmachine_server-0.2.4/src/memmachine-ts/rest_client/.gitignore +30 -0
  33. memmachine_server-0.2.4/src/memmachine-ts/rest_client/.prettierignore +18 -0
  34. memmachine_server-0.2.4/src/memmachine-ts/rest_client/.prettierrc +15 -0
  35. memmachine_server-0.2.4/src/memmachine-ts/rest_client/README.md +156 -0
  36. memmachine_server-0.2.4/src/memmachine-ts/rest_client/eslint.config.mjs +19 -0
  37. memmachine_server-0.2.4/src/memmachine-ts/rest_client/jest.config.ts +20 -0
  38. memmachine_server-0.2.4/src/memmachine-ts/rest_client/package-lock.json +10073 -0
  39. memmachine_server-0.2.4/src/memmachine-ts/rest_client/package.json +93 -0
  40. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/client/index.ts +9 -0
  41. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/client/memmachine-client.ts +118 -0
  42. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/client/memmachine-client.types.ts +34 -0
  43. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/env.d.ts +1 -0
  44. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/errors/api-error-handler.ts +20 -0
  45. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/errors/index.ts +8 -0
  46. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/errors/memmachine-api-error.ts +14 -0
  47. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/index.ts +13 -0
  48. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/memory/index.ts +20 -0
  49. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/memory/memmachine-memory.ts +315 -0
  50. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/memory/memmachine-memory.types.ts +166 -0
  51. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/project/index.ts +9 -0
  52. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/project/memmachine-project.ts +167 -0
  53. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/project/memmachine-project.types.ts +41 -0
  54. memmachine_server-0.2.4/src/memmachine-ts/rest_client/src/version.ts +1 -0
  55. memmachine_server-0.2.4/src/memmachine-ts/rest_client/tests/api-error-handler.spec.ts +36 -0
  56. memmachine_server-0.2.4/src/memmachine-ts/rest_client/tests/index.spec.ts +11 -0
  57. memmachine_server-0.2.4/src/memmachine-ts/rest_client/tests/memmachine-client.spec.ts +52 -0
  58. memmachine_server-0.2.4/src/memmachine-ts/rest_client/tests/memmachine-memory.spec.ts +149 -0
  59. memmachine_server-0.2.4/src/memmachine-ts/rest_client/tests/memmachine-project.spec.ts +101 -0
  60. memmachine_server-0.2.4/src/memmachine-ts/rest_client/tsconfig.json +44 -0
  61. memmachine_server-0.2.4/src/memmachine-ts/rest_client/tsup.config.ts +14 -0
  62. memmachine_server-0.2.4/src/memmachine-ts/rest_client/typedoc.json +4 -0
  63. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine_server.egg-info/PKG-INFO +8 -1
  64. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine_server.egg-info/SOURCES.txt +35 -0
  65. memmachine_server-0.2.2/src/memmachine/episodic_memory/instance_lru_cache.py +0 -177
  66. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/LICENSE +0 -0
  67. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/setup.cfg +0 -0
  68. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/__init__.py +0 -0
  69. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/api/__init__.py +0 -0
  70. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/configuration/__init__.py +0 -0
  71. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/configuration/default_episode_summary_system_prompt.txt +0 -0
  72. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/configuration/default_episode_summary_user_prompt.txt +0 -0
  73. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/configuration/embedder_conf.py +0 -0
  74. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/configuration/episodic_config.py +0 -0
  75. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/configuration/language_model_conf.py +0 -0
  76. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/configuration/log_conf.py +0 -0
  77. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/configuration/reranker_conf.py +0 -0
  78. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/data_types.py +0 -0
  79. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/embedder/__init__.py +0 -0
  80. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/embedder/amazon_bedrock_embedder.py +0 -0
  81. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/embedder/embedder.py +0 -0
  82. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/embedder/openai_embedder.py +0 -0
  83. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/embedder/sentence_transformer_embedder.py +0 -0
  84. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/episode_store/__init__.py +0 -0
  85. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/episode_store/count_caching_episode_storage.py +0 -0
  86. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/episode_store/episode_sqlalchemy_store.py +0 -0
  87. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/episode_store/episode_storage.py +0 -0
  88. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/filter/__init__.py +0 -0
  89. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/filter/filter_parser.py +0 -0
  90. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/filter/sql_filter_util.py +0 -0
  91. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/language_model/__init__.py +0 -0
  92. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/language_model/amazon_bedrock_language_model.py +0 -0
  93. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/language_model/language_model.py +0 -0
  94. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/language_model/openai_chat_completions_language_model.py +0 -0
  95. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/language_model/openai_responses_language_model.py +0 -0
  96. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/metrics_factory/__init__.py +0 -0
  97. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/metrics_factory/metrics_factory.py +0 -0
  98. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/metrics_factory/prometheus_metrics_factory.py +0 -0
  99. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/reranker/__init__.py +0 -0
  100. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/reranker/amazon_bedrock_reranker.py +0 -0
  101. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/reranker/bm25_reranker.py +0 -0
  102. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/reranker/cohere_reranker.py +0 -0
  103. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/reranker/cross_encoder_reranker.py +0 -0
  104. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/reranker/embedder_reranker.py +0 -0
  105. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/reranker/identity_reranker.py +0 -0
  106. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/reranker/reranker.py +0 -0
  107. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/reranker/rrf_hybrid_reranker.py +0 -0
  108. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/resource_manager/__init__.py +0 -0
  109. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/resource_manager/embedder_manager.py +0 -0
  110. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/resource_manager/language_model_manager.py +0 -0
  111. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/resource_manager/reranker_manager.py +0 -0
  112. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/resource_manager/resource_manager.py +0 -0
  113. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/resource_manager/semantic_manager.py +0 -0
  114. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/session_manager/__init__.py +0 -0
  115. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/session_manager/session_data_manager.py +0 -0
  116. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/utils.py +0 -0
  117. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/vector_graph_store/__init__.py +0 -0
  118. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/vector_graph_store/data_types.py +0 -0
  119. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/common/vector_graph_store/vector_graph_store.py +0 -0
  120. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/episodic_memory/__init__.py +0 -0
  121. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/episodic_memory/declarative_memory/__init__.py +0 -0
  122. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/episodic_memory/declarative_memory/data_types.py +0 -0
  123. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/episodic_memory/long_term_memory/__init__.py +0 -0
  124. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/episodic_memory/long_term_memory/service_locator.py +0 -0
  125. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/episodic_memory/service_locator.py +0 -0
  126. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/episodic_memory/short_term_memory/__init__.py +0 -0
  127. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/episodic_memory/short_term_memory/service_locator.py +0 -0
  128. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/episodic_memory/short_term_memory/short_term_memory.py +0 -0
  129. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/installation/__init__.py +0 -0
  130. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/installation/configuration_wizard.py +0 -0
  131. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/main/__init__.py +0 -0
  132. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/rest_client/README.md +0 -0
  133. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/rest_client/__init__.py +0 -0
  134. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/rest_client/project.py +0 -0
  135. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/__init__.py +0 -0
  136. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/semantic_ingestion.py +0 -0
  137. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/semantic_llm.py +0 -0
  138. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/semantic_memory.py +0 -0
  139. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/semantic_model.py +0 -0
  140. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/semantic_session_manager.py +0 -0
  141. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/storage/__init__.py +0 -0
  142. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/storage/alembic_pg/__init__.py +0 -0
  143. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/storage/alembic_pg/env.py +0 -0
  144. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/storage/alembic_pg/versions/001_initial_migration.py +0 -0
  145. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/storage/alembic_pg/versions/3d6aaebdc526_sync_sqlalchemy_schema.py +0 -0
  146. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/storage/alembic_pg/versions/62dff1150a46_add_created_at_to_history_add.py +0 -0
  147. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/storage/alembic_pg/versions/79f00a9f2409_change_history_id_to_string.py +0 -0
  148. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/storage/alembic_pg/versions/843f6d216d10_rename_semantic_type_to_semantic_.py +0 -0
  149. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/storage/alembic_pg/versions/__init__.py +0 -0
  150. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/storage/alembic_pg/versions/adb5618bd4ee_remove_history_table.py +0 -0
  151. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/storage/neo4j_semantic_storage.py +0 -0
  152. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/storage/sqlalchemy_pgvector_semantic.py +0 -0
  153. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/storage/storage_base.py +0 -0
  154. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/util/__init__.py +0 -0
  155. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/semantic_memory/util/semantic_prompt_template.py +0 -0
  156. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/__init__.py +0 -0
  157. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/api_v2/__init__.py +0 -0
  158. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/mcp_http.py +0 -0
  159. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/mcp_stdio.py +0 -0
  160. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/prompt/__init__.py +0 -0
  161. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/prompt/coding_style_prompt.py +0 -0
  162. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/prompt/crm_prompt.py +0 -0
  163. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/prompt/default_prompts.py +0 -0
  164. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/prompt/financial_analyst_prompt.py +0 -0
  165. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/prompt/health_assistant_prompt.py +0 -0
  166. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/prompt/profile_prompt.py +0 -0
  167. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/prompt/prompt_utilities.py +0 -0
  168. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine/server/prompt/writing_assistant_prompt.py +0 -0
  169. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine_server.egg-info/dependency_links.txt +0 -0
  170. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine_server.egg-info/entry_points.txt +0 -0
  171. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/src/memmachine_server.egg-info/requires.txt +0 -0
  172. {memmachine_server-0.2.2 → memmachine_server-0.2.4}/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.2.2
3
+ Version: 0.2.4
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
@@ -43,9 +43,16 @@ Dynamic: license-file
43
43
 
44
44
  <div align="center">
45
45
 
46
+ ![GitHub Release Version](https://img.shields.io/github/v/release/memmachine/memmachine?display_name=release)
46
47
  ![Discord](https://img.shields.io/discord/1412878659479666810)
47
48
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/MemMachine/MemMachine)
48
49
  ![GitHub License](https://img.shields.io/github/license/MemMachine/MemMachine)
50
+ <br/>
51
+ ![Docker Pulls](https://img.shields.io/docker/pulls/memmachine/memmachine)
52
+ ![GitHub Downloads](https://img.shields.io/github/downloads/memmachine/memmachine/total?label=GitHub%20Downloads)
53
+ <br/>
54
+ ![PyPI Downloads - memmachine-client](https://img.shields.io/pypi/dm/memmachine-client?label=PyPI%20Downloads%3A%20memmachine-client)
55
+ ![PyPI Downloads - memmachine-server](https://img.shields.io/pypi/dm/memmachine-server?label=PyPI%20Downloads%3A%20memmachine-server)
49
56
 
50
57
  </div>
51
58
 
@@ -2,9 +2,16 @@
2
2
 
3
3
  <div align="center">
4
4
 
5
+ ![GitHub Release Version](https://img.shields.io/github/v/release/memmachine/memmachine?display_name=release)
5
6
  ![Discord](https://img.shields.io/discord/1412878659479666810)
6
7
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/MemMachine/MemMachine)
7
8
  ![GitHub License](https://img.shields.io/github/license/MemMachine/MemMachine)
9
+ <br/>
10
+ ![Docker Pulls](https://img.shields.io/docker/pulls/memmachine/memmachine)
11
+ ![GitHub Downloads](https://img.shields.io/github/downloads/memmachine/memmachine/total?label=GitHub%20Downloads)
12
+ <br/>
13
+ ![PyPI Downloads - memmachine-client](https://img.shields.io/pypi/dm/memmachine-client?label=PyPI%20Downloads%3A%20memmachine-client)
14
+ ![PyPI Downloads - memmachine-server](https://img.shields.io/pypi/dm/memmachine-server?label=PyPI%20Downloads%3A%20memmachine-server)
8
15
 
9
16
  </div>
10
17
 
@@ -1,10 +1,10 @@
1
1
  [build-system]
2
- requires = ["setuptools>=68.0", "wheel"]
2
+ requires = ["setuptools>=68.0", "wheel", "setuptools-scm>=8.0"]
3
3
  build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "memmachine-server"
7
- version = "v0.2.2"
7
+ dynamic = ["version"]
8
8
  dependencies = [
9
9
  "alembic>=1.17.1",
10
10
  "asyncpg>=0.31.0",
@@ -96,3 +96,6 @@ packages = [
96
96
 
97
97
  [tool.setuptools.package-dir]
98
98
  "" = "src"
99
+
100
+ [tool.setuptools_scm]
101
+ root = "../.."
@@ -1,5 +1,6 @@
1
1
  """Public package exports and utilities for MemMachine."""
2
2
 
3
+ from memmachine.common import api # noqa: F401
3
4
  from memmachine.rest_client import MemMachineClient, Memory, Project
4
5
 
5
6
  try:
@@ -1,5 +1,7 @@
1
1
  """API documentation strings for MemMachine server v2."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  from typing import ClassVar
4
6
 
5
7
 
@@ -77,6 +79,68 @@ class SpecDoc:
77
79
 
78
80
  EPISODE_COUNT = "The total number of episodic memories in the project."
79
81
 
82
+ EPISODE_CONTENT = "The content payload of the episode."
83
+
84
+ EPISODE_PRODUCER_ID = "Identifier of the episode producer."
85
+
86
+ EPISODE_PRODUCER_ROLE = "Role of the producer (e.g., user/assistant/system)."
87
+
88
+ EPISODE_PRODUCED_FOR_ID = "Identifier of the intended recipient of the episode."
89
+
90
+ EPISODE_TYPE = "The type of episode being stored (e.g., message)."
91
+
92
+ EPISODE_METADATA = "Optional metadata associated with the episode."
93
+
94
+ EPISODE_CREATED_AT = "Timestamp when the episode was created."
95
+
96
+ EPISODE_UID = "Unique identifier for the episode."
97
+
98
+ EPISODE_SCORE = "Optional relevance score for the episode."
99
+
100
+ EPISODE_SESSION_KEY = "Session key associated with the episode."
101
+
102
+ EPISODE_SEQUENCE_NUM = "Sequence number within the session."
103
+
104
+ EPISODE_CONTENT_TYPE = "Content type of the episode."
105
+
106
+ EPISODE_FILTERABLE_METADATA = "Metadata indexed for filtering."
107
+
108
+ SEMANTIC_SET_ID = "Identifier of the semantic set."
109
+
110
+ SEMANTIC_CATEGORY = "Category of the semantic feature."
111
+
112
+ SEMANTIC_TAG = "Tag associated with the semantic feature."
113
+
114
+ SEMANTIC_FEATURE_NAME = "Name of the semantic feature."
115
+
116
+ SEMANTIC_VALUE = "Value of the semantic feature."
117
+
118
+ SEMANTIC_METADATA = "Storage metadata for the semantic feature."
119
+
120
+ SEMANTIC_METADATA_CITATIONS = "Episode IDs cited by this semantic feature."
121
+
122
+ SEMANTIC_METADATA_ID = "Identifier for the semantic feature."
123
+
124
+ SEMANTIC_METADATA_OTHER = "Additional storage metadata for the semantic feature."
125
+
126
+ EPISODIC_SHORT_EPISODES = "Matched short-term episodic entries."
127
+
128
+ EPISODIC_SHORT_SUMMARY = "Summaries of matched short-term episodes."
129
+
130
+ EPISODIC_LONG_EPISODES = "Matched long-term episodic entries."
131
+
132
+ EPISODIC_LONG_TERM = "Long-term episodic search results."
133
+
134
+ EPISODIC_SHORT_TERM = "Short-term episodic search results."
135
+
136
+ SEARCH_EPISODIC_MEMORY = "Episodic memory search results."
137
+
138
+ SEARCH_SEMANTIC_MEMORY = "Semantic memory search results."
139
+
140
+ LIST_EPISODIC_MEMORY = "Listed episodic memory entries."
141
+
142
+ LIST_SEMANTIC_MEMORY = "Listed semantic memory entries."
143
+
80
144
  MEMORY_CONTENT = "The content or text of the message."
81
145
 
82
146
  MEMORY_PRODUCER = """
@@ -128,6 +192,10 @@ class SpecDoc:
128
192
  The maximum number of memories to return in the search results.
129
193
  """
130
194
 
195
+ SCORE_THRESHOLD = """
196
+ The minimum score for a memory to be included in the search results. Defaults to -inf (no threshold) represented as None. Meaningful only for certain ranking methods.
197
+ """
198
+
131
199
  QUERY = """
132
200
  The natural language query used for semantic memory search. This should be
133
201
  a descriptive string of the information you are looking for.
@@ -195,6 +263,12 @@ class SpecDoc:
195
263
  ERROR_INTERNAL = """
196
264
  The real error that triggered the exception, for internal debugging."""
197
265
 
266
+ SERVER_VERSION = """
267
+ The version of the MemMachine server."""
268
+
269
+ CLIENT_VERSION = """
270
+ The version of the MemMachine client."""
271
+
198
272
 
199
273
  class Examples:
200
274
  """Common examples for API fields."""
@@ -208,6 +282,7 @@ class Examples:
208
282
  RERANKER: ClassVar[list[str]] = ["bge-reranker-large", "my-custom-reranker"]
209
283
  EMBEDDER: ClassVar[list[str]] = ["bge-base-en", "my-embedder"]
210
284
  TOP_K: ClassVar[list[int]] = [5, 10, 20]
285
+ SCORE_THRESHOLD: ClassVar[list[float | None]] = [0.0, 0.5, None]
211
286
  QUERY: ClassVar[list[str]] = [
212
287
  "What was the user's last conversation about finance?"
213
288
  ]
@@ -223,6 +298,8 @@ class Examples:
223
298
  SEMANTIC_ID: ClassVar[list[str]] = ["12", "23"]
224
299
  SEMANTIC_IDS: ClassVar[list[list[str]]] = [["123", "345"], ["23"]]
225
300
  SEARCH_RESULT_STATUS: ClassVar[list[int]] = [0]
301
+ SERVER_VERSION: ClassVar[list[str]] = ["0.1.2", "0.2.0"]
302
+ CLIENT_VERSION: ClassVar[list[str]] = ["0.1.2", "0.2.0"]
226
303
 
227
304
 
228
305
  class RouterDoc:
@@ -1,14 +1,37 @@
1
1
  """API v2 specification models for request and response structures."""
2
2
 
3
3
  import logging
4
- from datetime import UTC, datetime
5
- from typing import Annotated, Any, Self
4
+ from datetime import datetime, timezone
5
+ from enum import Enum
6
6
 
7
- import regex
8
- from pydantic import AfterValidator, BaseModel, Field, field_validator, model_validator
7
+ # Python 3.11+ has UTC as a constant, Python 3.10 uses timezone.utc
8
+ try:
9
+ from datetime import UTC
10
+ except ImportError:
11
+ UTC = timezone.utc
12
+
13
+ from typing import Annotated, Any
9
14
 
10
- from memmachine.common.api import EpisodeType, MemoryType
11
- from memmachine.common.api.doc import Examples, SpecDoc
15
+ # Python 3.11+ has Self in typing, Python 3.10 uses typing_extensions
16
+ try:
17
+ from typing import Self
18
+ except ImportError:
19
+ from typing_extensions import Self
20
+
21
+ import regex
22
+ from pydantic import (
23
+ AfterValidator,
24
+ AwareDatetime,
25
+ BaseModel,
26
+ ConfigDict,
27
+ Field,
28
+ JsonValue,
29
+ field_validator,
30
+ model_validator,
31
+ )
32
+
33
+ from . import EpisodeType, MemoryType
34
+ from .doc import Examples, SpecDoc
12
35
 
13
36
  DEFAULT_ORG_AND_PROJECT_ID = "universal"
14
37
 
@@ -16,6 +39,179 @@ DEFAULT_ORG_AND_PROJECT_ID = "universal"
16
39
  logger = logging.getLogger(__name__)
17
40
 
18
41
 
42
+ # --------------------------------------------------------------------------------------
43
+ # Client-safe DTOs
44
+ #
45
+ # NOTE:
46
+ # These models intentionally live in this API spec module (and do NOT import the
47
+ # internal/core models) so that the client distribution can import the API schema
48
+ # without pulling in server-only packages.
49
+ # --------------------------------------------------------------------------------------
50
+
51
+ EpisodeIdT = str
52
+
53
+
54
+ class ContentType(Enum):
55
+ """Enumeration for the type of content within an Episode."""
56
+
57
+ STRING = "string"
58
+
59
+
60
+ class EpisodeEntry(BaseModel):
61
+ """Payload used when creating a new episode entry."""
62
+
63
+ content: Annotated[
64
+ str,
65
+ Field(..., description=SpecDoc.EPISODE_CONTENT),
66
+ ]
67
+ producer_id: Annotated[
68
+ str,
69
+ Field(..., description=SpecDoc.EPISODE_PRODUCER_ID),
70
+ ]
71
+ producer_role: Annotated[
72
+ str,
73
+ Field(..., description=SpecDoc.EPISODE_PRODUCER_ROLE),
74
+ ]
75
+ produced_for_id: Annotated[
76
+ str | None,
77
+ Field(default=None, description=SpecDoc.EPISODE_PRODUCED_FOR_ID),
78
+ ]
79
+ episode_type: Annotated[
80
+ EpisodeType | None,
81
+ Field(default=None, description=SpecDoc.EPISODE_TYPE),
82
+ ]
83
+ metadata: Annotated[
84
+ dict[str, JsonValue] | None,
85
+ Field(default=None, description=SpecDoc.EPISODE_METADATA),
86
+ ]
87
+ created_at: Annotated[
88
+ AwareDatetime | None,
89
+ Field(default=None, description=SpecDoc.EPISODE_CREATED_AT),
90
+ ]
91
+
92
+
93
+ class EpisodeResponse(EpisodeEntry):
94
+ """Episode data returned in search responses."""
95
+
96
+ uid: Annotated[
97
+ EpisodeIdT,
98
+ Field(..., description=SpecDoc.EPISODE_UID),
99
+ ]
100
+ score: Annotated[
101
+ float | None,
102
+ Field(default=None, description=SpecDoc.EPISODE_SCORE),
103
+ ]
104
+
105
+
106
+ class Episode(BaseModel):
107
+ """Episode data returned in list responses."""
108
+
109
+ uid: Annotated[
110
+ EpisodeIdT,
111
+ Field(..., description=SpecDoc.EPISODE_UID),
112
+ ]
113
+ content: Annotated[
114
+ str,
115
+ Field(..., description=SpecDoc.EPISODE_CONTENT),
116
+ ]
117
+ session_key: Annotated[
118
+ str,
119
+ Field(..., description=SpecDoc.EPISODE_SESSION_KEY),
120
+ ]
121
+ created_at: Annotated[
122
+ AwareDatetime,
123
+ Field(..., description=SpecDoc.EPISODE_CREATED_AT),
124
+ ]
125
+
126
+ producer_id: Annotated[
127
+ str,
128
+ Field(..., description=SpecDoc.EPISODE_PRODUCER_ID),
129
+ ]
130
+ producer_role: Annotated[
131
+ str,
132
+ Field(..., description=SpecDoc.EPISODE_PRODUCER_ROLE),
133
+ ]
134
+ produced_for_id: Annotated[
135
+ str | None,
136
+ Field(default=None, description=SpecDoc.EPISODE_PRODUCED_FOR_ID),
137
+ ]
138
+
139
+ sequence_num: Annotated[
140
+ int,
141
+ Field(default=0, description=SpecDoc.EPISODE_SEQUENCE_NUM),
142
+ ]
143
+
144
+ episode_type: Annotated[
145
+ EpisodeType,
146
+ Field(default=EpisodeType.MESSAGE, description=SpecDoc.EPISODE_TYPE),
147
+ ]
148
+ content_type: Annotated[
149
+ ContentType,
150
+ Field(default=ContentType.STRING, description=SpecDoc.EPISODE_CONTENT_TYPE),
151
+ ]
152
+ filterable_metadata: Annotated[
153
+ dict[str, Any] | None,
154
+ Field(default=None, description=SpecDoc.EPISODE_FILTERABLE_METADATA),
155
+ ]
156
+ metadata: Annotated[
157
+ dict[str, JsonValue] | None,
158
+ Field(default=None, description=SpecDoc.EPISODE_METADATA),
159
+ ]
160
+
161
+ def __hash__(self) -> int:
162
+ """Hash an episode by its UID."""
163
+ return hash(self.uid)
164
+
165
+
166
+ SetIdT = str
167
+ FeatureIdT = str
168
+
169
+
170
+ class SemanticFeature(BaseModel):
171
+ """Semantic memory entry returned in API responses."""
172
+
173
+ class Metadata(BaseModel):
174
+ """Storage metadata for a semantic feature, including id and citations."""
175
+
176
+ citations: Annotated[
177
+ list[EpisodeIdT] | None,
178
+ Field(default=None, description=SpecDoc.SEMANTIC_METADATA_CITATIONS),
179
+ ]
180
+ id: Annotated[
181
+ FeatureIdT | None,
182
+ Field(default=None, description=SpecDoc.SEMANTIC_METADATA_ID),
183
+ ]
184
+ other: Annotated[
185
+ dict[str, Any] | None,
186
+ Field(default=None, description=SpecDoc.SEMANTIC_METADATA_OTHER),
187
+ ]
188
+
189
+ set_id: Annotated[
190
+ SetIdT | None,
191
+ Field(default=None, description=SpecDoc.SEMANTIC_SET_ID),
192
+ ]
193
+ category: Annotated[
194
+ str,
195
+ Field(..., description=SpecDoc.SEMANTIC_CATEGORY),
196
+ ]
197
+ tag: Annotated[
198
+ str,
199
+ Field(..., description=SpecDoc.SEMANTIC_TAG),
200
+ ]
201
+ feature_name: Annotated[
202
+ str,
203
+ Field(..., description=SpecDoc.SEMANTIC_FEATURE_NAME),
204
+ ]
205
+ value: Annotated[
206
+ str,
207
+ Field(..., description=SpecDoc.SEMANTIC_VALUE),
208
+ ]
209
+ metadata: Annotated[
210
+ Metadata,
211
+ Field(default_factory=Metadata, description=SpecDoc.SEMANTIC_METADATA),
212
+ ]
213
+
214
+
19
215
  class InvalidNameError(ValueError):
20
216
  """Custom error for invalid names."""
21
217
 
@@ -240,6 +436,7 @@ class DeleteProjectSpec(BaseModel):
240
436
  ]
241
437
 
242
438
 
439
+ # Type alias for timestamp input
243
440
  TimestampInput = datetime | int | float | str | None
244
441
 
245
442
 
@@ -392,6 +589,14 @@ class SearchMemoriesSpec(_WithOrgAndProj):
392
589
  examples=Examples.FILTER_MEM,
393
590
  ),
394
591
  ]
592
+ score_threshold: Annotated[
593
+ float | None,
594
+ Field(
595
+ default=None,
596
+ description=SpecDoc.SCORE_THRESHOLD,
597
+ examples=Examples.SCORE_THRESHOLD,
598
+ ),
599
+ ]
395
600
  types: Annotated[
396
601
  list[MemoryType],
397
602
  Field(
@@ -526,7 +731,77 @@ class SearchResult(BaseModel):
526
731
  ),
527
732
  ]
528
733
  content: Annotated[
529
- dict[str, Any],
734
+ "SearchResultContent",
735
+ Field(
736
+ ...,
737
+ description=SpecDoc.CONTENT,
738
+ ),
739
+ ]
740
+
741
+
742
+ class EpisodicSearchShortTermMemory(BaseModel):
743
+ """Short-term episodic memory search results."""
744
+
745
+ episodes: Annotated[
746
+ list[EpisodeResponse],
747
+ Field(..., description=SpecDoc.EPISODIC_SHORT_EPISODES),
748
+ ]
749
+ episode_summary: Annotated[
750
+ list[str],
751
+ Field(..., description=SpecDoc.EPISODIC_SHORT_SUMMARY),
752
+ ]
753
+
754
+
755
+ class EpisodicSearchLongTermMemory(BaseModel):
756
+ """Long-term episodic memory search results."""
757
+
758
+ episodes: Annotated[
759
+ list[EpisodeResponse],
760
+ Field(..., description=SpecDoc.EPISODIC_LONG_EPISODES),
761
+ ]
762
+
763
+
764
+ class EpisodicSearchResult(BaseModel):
765
+ """Episodic payload returned by `/memories/search`."""
766
+
767
+ long_term_memory: Annotated[
768
+ EpisodicSearchLongTermMemory,
769
+ Field(..., description=SpecDoc.EPISODIC_LONG_TERM),
770
+ ]
771
+ short_term_memory: Annotated[
772
+ EpisodicSearchShortTermMemory,
773
+ Field(..., description=SpecDoc.EPISODIC_SHORT_TERM),
774
+ ]
775
+
776
+
777
+ class SearchResultContent(BaseModel):
778
+ """Payload for SearchResult.content returned by `/memories/search`."""
779
+
780
+ model_config = ConfigDict(extra="forbid")
781
+
782
+ episodic_memory: Annotated[
783
+ EpisodicSearchResult | None,
784
+ Field(default=None, description=SpecDoc.SEARCH_EPISODIC_MEMORY),
785
+ ]
786
+ semantic_memory: Annotated[
787
+ list[SemanticFeature] | None,
788
+ Field(default=None, description=SpecDoc.SEARCH_SEMANTIC_MEMORY),
789
+ ]
790
+
791
+
792
+ class ListResult(BaseModel):
793
+ """Response model for memory list results."""
794
+
795
+ status: Annotated[
796
+ int,
797
+ Field(
798
+ default=0,
799
+ description=SpecDoc.STATUS,
800
+ examples=Examples.SEARCH_RESULT_STATUS,
801
+ ),
802
+ ]
803
+ content: Annotated[
804
+ "ListResultContent",
530
805
  Field(
531
806
  ...,
532
807
  description=SpecDoc.CONTENT,
@@ -534,6 +809,21 @@ class SearchResult(BaseModel):
534
809
  ]
535
810
 
536
811
 
812
+ class ListResultContent(BaseModel):
813
+ """Payload for ListResult.content returned by `/memories/list`."""
814
+
815
+ model_config = ConfigDict(extra="forbid")
816
+
817
+ episodic_memory: Annotated[
818
+ list[Episode] | None,
819
+ Field(default=None, description=SpecDoc.LIST_EPISODIC_MEMORY),
820
+ ]
821
+ semantic_memory: Annotated[
822
+ list[SemanticFeature] | None,
823
+ Field(default=None, description=SpecDoc.LIST_SEMANTIC_MEMORY),
824
+ ]
825
+
826
+
537
827
  class RestErrorModel(BaseModel):
538
828
  """Model representing an error response."""
539
829
 
@@ -573,3 +863,33 @@ class RestErrorModel(BaseModel):
573
863
  description=SpecDoc.ERROR_TRACE,
574
864
  ),
575
865
  ]
866
+
867
+
868
+ class Version(BaseModel):
869
+ """Model representing version information."""
870
+
871
+ server_version: Annotated[
872
+ str,
873
+ Field(
874
+ ...,
875
+ description=SpecDoc.SERVER_VERSION,
876
+ examples=Examples.SERVER_VERSION,
877
+ ),
878
+ ]
879
+ client_version: Annotated[
880
+ str,
881
+ Field(
882
+ ...,
883
+ description=SpecDoc.CLIENT_VERSION,
884
+ examples=Examples.CLIENT_VERSION,
885
+ ),
886
+ ]
887
+
888
+ def __str__(self) -> str:
889
+ """Return the version as a string."""
890
+ return "\n".join(
891
+ [
892
+ f"server: {self.server_version}",
893
+ f"client: {self.client_version}",
894
+ ]
895
+ )
@@ -0,0 +1,21 @@
1
+ """version information."""
2
+
3
+ import contextlib
4
+ from importlib.metadata import PackageNotFoundError, version
5
+
6
+ from memmachine.common.api.spec import Version
7
+
8
+
9
+ def _get_package_version(package_name: str) -> str:
10
+ ret = "not available"
11
+ with contextlib.suppress(PackageNotFoundError):
12
+ ret = version(package_name)
13
+ return ret
14
+
15
+
16
+ def get_version() -> Version:
17
+ """Get the server and client version information."""
18
+ return Version(
19
+ server_version=_get_package_version("memmachine-server"),
20
+ client_version=_get_package_version("memmachine-client"),
21
+ )
@@ -32,6 +32,34 @@ class Neo4jConf(YamlSerializableMixin, PasswordMixin):
32
32
  default=False,
33
33
  description="Whether to force exact similarity search",
34
34
  )
35
+ range_index_creation_threshold: int | None = Field(
36
+ default=None,
37
+ description=(
38
+ "Minimum number of entities in a collection or relationship "
39
+ "required before Neo4j automatically creates a range index."
40
+ ),
41
+ )
42
+ vector_index_creation_threshold: int | None = Field(
43
+ default=None,
44
+ description=(
45
+ "Minimum number of entities in a collection or relationship "
46
+ "required before Neo4j automatically creates a vector index."
47
+ ),
48
+ )
49
+ max_connection_pool_size: int | None = Field(
50
+ default=None,
51
+ description=(
52
+ "Maximum number of connections to maintain in the connection pool. "
53
+ "Internal default is 100."
54
+ ),
55
+ )
56
+ connection_acquisition_timeout: float | None = Field(
57
+ default=None,
58
+ description=(
59
+ "Maximum time in seconds to wait for a connection from the pool. "
60
+ "Internal default is 60.0."
61
+ ),
62
+ )
35
63
 
36
64
  def get_uri(self) -> str:
37
65
  if self.uri:
@@ -60,6 +88,21 @@ class SqlAlchemyConf(YamlSerializableMixin, PasswordMixin):
60
88
  ),
61
89
  )
62
90
  db_name: str | None = Field(default=None, description="DB name")
91
+ pool_size: int | None = Field(
92
+ default=None,
93
+ description=(
94
+ "Number of persistent connections to maintain in the connection pool. "
95
+ "If set, the pool will keep up to this many open connections ready for use."
96
+ ),
97
+ )
98
+ max_overflow: int | None = Field(
99
+ default=None,
100
+ description=(
101
+ "Maximum number of temporary connections allowed above `pool_size` during "
102
+ "traffic spikes. These overflow connections are created on demand and "
103
+ "disposed of when no longer needed."
104
+ ),
105
+ )
63
106
 
64
107
  @property
65
108
  def schema_part(self) -> str: