MemoryOS 2.0.1__tar.gz → 2.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. {memoryos-2.0.1 → memoryos-2.0.2}/PKG-INFO +2 -1
  2. {memoryos-2.0.1 → memoryos-2.0.2}/README.md +1 -0
  3. {memoryos-2.0.1 → memoryos-2.0.2}/pyproject.toml +1 -1
  4. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/__init__.py +1 -1
  5. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/component_init.py +2 -1
  6. memoryos-2.0.2/src/memos/api/handlers/formatters_handler.py +237 -0
  7. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/memory_handler.py +47 -30
  8. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/search_handler.py +15 -0
  9. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/product_models.py +3 -1
  10. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/base.py +14 -5
  11. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/neo4j.py +23 -5
  12. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/neo4j_community.py +103 -1
  13. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/polardb.py +10 -1
  14. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/openai.py +12 -0
  15. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/vllm.py +6 -0
  16. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_feedback/feedback.py +2 -1
  17. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/base.py +22 -1
  18. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/factory.py +29 -3
  19. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/multi_modal_struct.py +255 -33
  20. memoryos-2.0.2/src/memos/mem_reader/read_multi_modal/system_parser.py +327 -0
  21. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/simple_struct.py +31 -10
  22. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/base_scheduler.py +6 -3
  23. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py +2 -1
  24. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_scheduler.py +33 -0
  25. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +0 -31
  26. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +228 -48
  27. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +28 -14
  28. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/extractor.py +4 -4
  29. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree.py +2 -1
  30. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +12 -5
  31. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +3 -45
  32. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/multi_mem_cube/single_cube.py +31 -0
  33. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/concat.py +10 -2
  34. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/http_bge.py +10 -6
  35. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mem_reader_prompts.py +207 -37
  36. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/prefer_complete_prompt.py +44 -2
  37. memoryos-2.0.2/src/memos/templates/tool_mem_prompts.py +139 -0
  38. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/utils.py +0 -1
  39. memoryos-2.0.1/src/memos/api/handlers/formatters_handler.py +0 -127
  40. memoryos-2.0.1/src/memos/mem_reader/read_multi_modal/system_parser.py +0 -172
  41. memoryos-2.0.1/src/memos/templates/tool_mem_prompts.py +0 -84
  42. {memoryos-2.0.1 → memoryos-2.0.2}/LICENSE +0 -0
  43. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/client.py +0 -0
  44. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/config.py +0 -0
  45. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/context/dependencies.py +0 -0
  46. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/exceptions.py +0 -0
  47. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/__init__.py +0 -0
  48. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/add_handler.py +0 -0
  49. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/base_handler.py +0 -0
  50. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/chat_handler.py +0 -0
  51. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/config_builders.py +0 -0
  52. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/feedback_handler.py +0 -0
  53. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/scheduler_handler.py +0 -0
  54. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/suggestion_handler.py +0 -0
  55. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/mcp_serve.py +0 -0
  56. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/middleware/request_context.py +0 -0
  57. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/product_api.py +0 -0
  58. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/routers/__init__.py +0 -0
  59. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/routers/product_router.py +0 -0
  60. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/routers/server_router.py +0 -0
  61. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/server_api.py +0 -0
  62. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/start_api.py +0 -0
  63. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/__init__.py +0 -0
  64. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/base.py +0 -0
  65. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/charactertext_chunker.py +0 -0
  66. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/factory.py +0 -0
  67. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/markdown_chunker.py +0 -0
  68. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/sentence_chunker.py +0 -0
  69. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/simple_chunker.py +0 -0
  70. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/cli.py +0 -0
  71. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/__init__.py +0 -0
  72. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/base.py +0 -0
  73. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/chunker.py +0 -0
  74. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/embedder.py +0 -0
  75. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/graph_db.py +0 -0
  76. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/internet_retriever.py +0 -0
  77. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/llm.py +0 -0
  78. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_agent.py +0 -0
  79. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_chat.py +0 -0
  80. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_cube.py +0 -0
  81. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_os.py +0 -0
  82. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_reader.py +0 -0
  83. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_scheduler.py +0 -0
  84. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_user.py +0 -0
  85. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/memory.py +0 -0
  86. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/parser.py +0 -0
  87. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/reranker.py +0 -0
  88. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/utils.py +0 -0
  89. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/vec_db.py +0 -0
  90. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/context/context.py +0 -0
  91. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/dependency.py +0 -0
  92. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/deprecation.py +0 -0
  93. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/__init__.py +0 -0
  94. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/ark.py +0 -0
  95. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/base.py +0 -0
  96. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/factory.py +0 -0
  97. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/ollama.py +0 -0
  98. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/sentence_transformer.py +0 -0
  99. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/universal_api.py +0 -0
  100. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/exceptions.py +0 -0
  101. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/__init__.py +0 -0
  102. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/factory.py +0 -0
  103. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/item.py +0 -0
  104. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/nebular.py +0 -0
  105. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/hello_world.py +0 -0
  106. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/__init__.py +0 -0
  107. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/base.py +0 -0
  108. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/deepseek.py +0 -0
  109. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/factory.py +0 -0
  110. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/hf.py +0 -0
  111. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/hf_singleton.py +0 -0
  112. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/ollama.py +0 -0
  113. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/openai_new.py +0 -0
  114. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/qwen.py +0 -0
  115. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/utils.py +0 -0
  116. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/log.py +0 -0
  117. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_agent/base.py +0 -0
  118. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_agent/deepsearch_agent.py +0 -0
  119. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_agent/factory.py +0 -0
  120. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_chat/__init__.py +0 -0
  121. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_chat/base.py +0 -0
  122. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_chat/factory.py +0 -0
  123. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_chat/simple.py +0 -0
  124. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_cube/__init__.py +0 -0
  125. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_cube/base.py +0 -0
  126. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_cube/general.py +0 -0
  127. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_cube/navie.py +0 -0
  128. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_cube/utils.py +0 -0
  129. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_feedback/base.py +0 -0
  130. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_feedback/simple_feedback.py +0 -0
  131. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_feedback/utils.py +0 -0
  132. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/client.py +0 -0
  133. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/core.py +0 -0
  134. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/main.py +0 -0
  135. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/product.py +0 -0
  136. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/product_server.py +0 -0
  137. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/utils/default_config.py +0 -0
  138. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/utils/format_utils.py +0 -0
  139. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/utils/reference_utils.py +0 -0
  140. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/__init__.py +0 -0
  141. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/memory.py +0 -0
  142. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/__init__.py +0 -0
  143. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/assistant_parser.py +0 -0
  144. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/base.py +0 -0
  145. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/file_content_parser.py +0 -0
  146. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/image_parser.py +0 -0
  147. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/multi_modal_parser.py +0 -0
  148. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/string_parser.py +0 -0
  149. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/text_content_parser.py +0 -0
  150. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/tool_parser.py +0 -0
  151. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/user_parser.py +0 -0
  152. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/utils.py +0 -0
  153. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/strategy_struct.py +0 -0
  154. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/utils.py +0 -0
  155. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/__init__.py +0 -0
  156. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/analyzer/__init__.py +0 -0
  157. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/analyzer/api_analyzer.py +0 -0
  158. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/analyzer/eval_analyzer.py +0 -0
  159. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +0 -0
  160. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/analyzer/scheduler_for_eval.py +0 -0
  161. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/__init__.py +0 -0
  162. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/api_misc.py +0 -0
  163. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/base.py +0 -0
  164. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/misc.py +0 -0
  165. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/scheduler_logger.py +0 -0
  166. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/task_threads.py +0 -0
  167. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/memory_manage_modules/__init__.py +0 -0
  168. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/memory_manage_modules/memory_filter.py +0 -0
  169. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/memory_manage_modules/retriever.py +0 -0
  170. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/monitors/__init__.py +0 -0
  171. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/monitors/dispatcher_monitor.py +0 -0
  172. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/monitors/general_monitor.py +0 -0
  173. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/monitors/task_schedule_monitor.py +0 -0
  174. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/optimized_scheduler.py +0 -0
  175. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/orm_modules/__init__.py +0 -0
  176. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/orm_modules/api_redis_model.py +0 -0
  177. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/orm_modules/base_model.py +0 -0
  178. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/orm_modules/monitor_models.py +0 -0
  179. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/orm_modules/redis_model.py +0 -0
  180. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
  181. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/__init__.py +0 -0
  182. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/analyzer_schemas.py +0 -0
  183. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/api_schemas.py +0 -0
  184. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/general_schemas.py +0 -0
  185. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/message_schemas.py +0 -0
  186. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/monitor_schemas.py +0 -0
  187. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/task_schemas.py +0 -0
  188. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
  189. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +0 -0
  190. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/task_schedule_modules/orchestrator.py +0 -0
  191. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/task_schedule_modules/task_queue.py +0 -0
  192. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/__init__.py +0 -0
  193. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/api_utils.py +0 -0
  194. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/config_utils.py +0 -0
  195. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/db_utils.py +0 -0
  196. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/filter_utils.py +0 -0
  197. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/metrics.py +0 -0
  198. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/misc_utils.py +0 -0
  199. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/monitor_event_utils.py +0 -0
  200. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/status_tracker.py +0 -0
  201. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/webservice_modules/__init__.py +0 -0
  202. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/webservice_modules/redis_service.py +0 -0
  203. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/factory.py +0 -0
  204. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/mysql_persistent_user_manager.py +0 -0
  205. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/mysql_user_manager.py +0 -0
  206. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/persistent_factory.py +0 -0
  207. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/persistent_user_manager.py +0 -0
  208. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/redis_persistent_user_manager.py +0 -0
  209. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/user_manager.py +0 -0
  210. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/__init__.py +0 -0
  211. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/activation/__init__.py +0 -0
  212. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/activation/base.py +0 -0
  213. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/activation/item.py +0 -0
  214. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/activation/kv.py +0 -0
  215. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/activation/vllmkv.py +0 -0
  216. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/base.py +0 -0
  217. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/factory.py +0 -0
  218. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/parametric/__init__.py +0 -0
  219. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/parametric/base.py +0 -0
  220. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/parametric/item.py +0 -0
  221. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/parametric/lora.py +0 -0
  222. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/__init__.py +0 -0
  223. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/base.py +0 -0
  224. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/general.py +0 -0
  225. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/item.py +0 -0
  226. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/naive.py +0 -0
  227. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/__init__.py +0 -0
  228. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/adder.py +0 -0
  229. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/config.py +0 -0
  230. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/factory.py +0 -0
  231. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/retrievers.py +0 -0
  232. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/spliter.py +0 -0
  233. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/utils.py +0 -0
  234. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/preference.py +0 -0
  235. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/simple_preference.py +0 -0
  236. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/simple_tree.py +0 -0
  237. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/__init__.py +0 -0
  238. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
  239. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/organize/handler.py +0 -0
  240. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/organize/manager.py +0 -0
  241. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +0 -0
  242. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +0 -0
  243. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
  244. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +0 -0
  245. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +0 -0
  246. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +0 -0
  247. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
  248. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +0 -0
  249. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
  250. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +0 -0
  251. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
  252. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +0 -0
  253. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +0 -0
  254. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +0 -0
  255. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
  256. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/dinding_report_bot.py +0 -0
  257. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/lockfree_dict.py +0 -0
  258. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/notification_service.py +0 -0
  259. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/notification_utils.py +0 -0
  260. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/singleton.py +0 -0
  261. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/thread_safe_dict.py +0 -0
  262. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/thread_safe_dict_segment.py +0 -0
  263. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/multi_mem_cube/__init__.py +0 -0
  264. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/multi_mem_cube/composite_cube.py +0 -0
  265. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/multi_mem_cube/views.py +0 -0
  266. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/parsers/__init__.py +0 -0
  267. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/parsers/base.py +0 -0
  268. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/parsers/factory.py +0 -0
  269. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/parsers/markitdown.py +0 -0
  270. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/__init__.py +0 -0
  271. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/base.py +0 -0
  272. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/cosine_local.py +0 -0
  273. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/factory.py +0 -0
  274. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/http_bge_strategy.py +0 -0
  275. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/noop.py +0 -0
  276. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/__init__.py +0 -0
  277. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/base.py +0 -0
  278. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/concat_background.py +0 -0
  279. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/concat_docsource.py +0 -0
  280. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/dialogue_common.py +0 -0
  281. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/factory.py +0 -0
  282. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/single_turn.py +0 -0
  283. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/singleturn_outmem.py +0 -0
  284. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/settings.py +0 -0
  285. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/__init__.py +0 -0
  286. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/advanced_search_prompts.py +0 -0
  287. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/cloud_service_prompt.py +0 -0
  288. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/instruction_completion.py +0 -0
  289. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mem_agent_prompts.py +0 -0
  290. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mem_feedback_prompts.py +0 -0
  291. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mem_reader_strategy_prompts.py +0 -0
  292. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mem_scheduler_prompts.py +0 -0
  293. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mem_search_prompts.py +0 -0
  294. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mos_prompts.py +0 -0
  295. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/tree_reorganize_prompts.py +0 -0
  296. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/__init__.py +0 -0
  297. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/general_types.py +0 -0
  298. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/__init__.py +0 -0
  299. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +0 -0
  300. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +0 -0
  301. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +0 -0
  302. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +0 -0
  303. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +0 -0
  304. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +0 -0
  305. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +0 -0
  306. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +0 -0
  307. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_message_param.py +0 -0
  308. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +0 -0
  309. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +0 -0
  310. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +0 -0
  311. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +0 -0
  312. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/vec_dbs/__init__.py +0 -0
  313. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/vec_dbs/base.py +0 -0
  314. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/vec_dbs/factory.py +0 -0
  315. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/vec_dbs/item.py +0 -0
  316. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/vec_dbs/milvus.py +0 -0
  317. {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/vec_dbs/qdrant.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MemoryOS
3
- Version: 2.0.1
3
+ Version: 2.0.2
4
4
  Summary: Intelligence Begins with Memory
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -289,6 +289,7 @@ Get Free API: [Try API](https://memos-dashboard.openmem.net/quickstart/?source=g
289
289
  - Launch via the uvicorn command line interface (CLI)
290
290
  ###### Tips: Please ensure that Neo4j and Qdrant are running before executing the following command.
291
291
  ```bash
292
+ cd src
292
293
  uvicorn memos.api.server_api:app --host 0.0.0.0 --port 8001 --workers 1
293
294
  ```
294
295
  ##### For detailed integration steps, see the [`CLI Reference`](https://docs.openmem.net/open_source/getting_started/rest_api_server/#method-3client-install-with-CLI).
@@ -211,6 +211,7 @@ Get Free API: [Try API](https://memos-dashboard.openmem.net/quickstart/?source=g
211
211
  - Launch via the uvicorn command line interface (CLI)
212
212
  ###### Tips: Please ensure that Neo4j and Qdrant are running before executing the following command.
213
213
  ```bash
214
+ cd src
214
215
  uvicorn memos.api.server_api:app --host 0.0.0.0 --port 8001 --workers 1
215
216
  ```
216
217
  ##### For detailed integration steps, see the [`CLI Reference`](https://docs.openmem.net/open_source/getting_started/rest_api_server/#method-3client-install-with-CLI).
@@ -4,7 +4,7 @@
4
4
  ##############################################################################
5
5
 
6
6
  name = "MemoryOS"
7
- version = "2.0.1"
7
+ version = "2.0.2"
8
8
  description = "Intelligence Begins with Memory"
9
9
  license = {text = "Apache-2.0"}
10
10
  readme = "README.md"
@@ -1,4 +1,4 @@
1
- __version__ = "2.0.0"
1
+ __version__ = "2.0.2"
2
2
 
3
3
  from memos.configs.mem_cube import GeneralMemCubeConfig
4
4
  from memos.configs.mem_os import MOSConfig
@@ -183,7 +183,8 @@ def init_server() -> dict[str, Any]:
183
183
  else None
184
184
  )
185
185
  embedder = EmbedderFactory.from_config(embedder_config)
186
- mem_reader = MemReaderFactory.from_config(mem_reader_config)
186
+ # Pass graph_db to mem_reader for recall operations (deduplication, conflict detection)
187
+ mem_reader = MemReaderFactory.from_config(mem_reader_config, graph_db=graph_db)
187
188
  reranker = RerankerFactory.from_config(reranker_config)
188
189
  feedback_reranker = RerankerFactory.from_config(feedback_reranker_config)
189
190
  internet_retriever = InternetRetrieverFactory.from_config(
@@ -0,0 +1,237 @@
1
+ """
2
+ Data formatting utilities for server handlers.
3
+
4
+ This module provides utility functions for formatting and transforming data
5
+ structures for API responses, including memory items and preferences.
6
+ """
7
+
8
+ from typing import Any
9
+
10
+ from memos.log import get_logger
11
+ from memos.templates.instruction_completion import instruct_completion
12
+
13
+
14
+ logger = get_logger(__name__)
15
+
16
+
17
+ def to_iter(running: Any) -> list[Any]:
18
+ """
19
+ Normalize running tasks to a list of task objects.
20
+
21
+ Handles different input types and converts them to a consistent list format.
22
+
23
+ Args:
24
+ running: Running tasks, can be None, dict, or iterable
25
+
26
+ Returns:
27
+ List of task objects
28
+ """
29
+ if running is None:
30
+ return []
31
+ if isinstance(running, dict):
32
+ return list(running.values())
33
+ return list(running) if running else []
34
+
35
+
36
+ def format_memory_item(
37
+ memory_data: Any, include_embedding: bool = False, save_sources: bool = True
38
+ ) -> dict[str, Any]:
39
+ """
40
+ Format a single memory item for API response.
41
+
42
+ Transforms a memory object into a dictionary with metadata properly
43
+ structured for API consumption.
44
+
45
+ Args:
46
+ memory_data: Memory object to format
47
+
48
+ Returns:
49
+ Formatted memory dictionary with ref_id and metadata
50
+ """
51
+ memory = memory_data.model_dump()
52
+ memory_id = memory["id"]
53
+ ref_id = f"[{memory_id.split('-')[0]}]"
54
+
55
+ memory["ref_id"] = ref_id
56
+ if not include_embedding:
57
+ memory["metadata"]["embedding"] = []
58
+ if not save_sources:
59
+ memory["metadata"]["sources"] = []
60
+ memory["metadata"]["usage"] = []
61
+ memory["metadata"]["ref_id"] = ref_id
62
+ memory["metadata"]["id"] = memory_id
63
+ memory["metadata"]["memory"] = memory["memory"]
64
+
65
+ return memory
66
+
67
+
68
+ def post_process_pref_mem(
69
+ memories_result: dict[str, Any],
70
+ pref_formatted_mem: list[dict[str, Any]],
71
+ mem_cube_id: str,
72
+ include_preference: bool,
73
+ ) -> dict[str, Any]:
74
+ """
75
+ Post-process preference memory results.
76
+
77
+ Adds formatted preference memories to the result dictionary and generates
78
+ instruction completion strings if preferences are included.
79
+
80
+ Args:
81
+ memories_result: Result dictionary to update
82
+ pref_formatted_mem: List of formatted preference memories
83
+ mem_cube_id: Memory cube ID
84
+ include_preference: Whether to include preferences in result
85
+
86
+ Returns:
87
+ Updated memories_result dictionary
88
+ """
89
+ if include_preference:
90
+ memories_result["pref_mem"].append(
91
+ {
92
+ "cube_id": mem_cube_id,
93
+ "memories": pref_formatted_mem,
94
+ "total_nodes": len(pref_formatted_mem),
95
+ }
96
+ )
97
+ pref_instruction, pref_note = instruct_completion(pref_formatted_mem)
98
+ memories_result["pref_string"] = pref_instruction
99
+ memories_result["pref_note"] = pref_note
100
+
101
+ return memories_result
102
+
103
+
104
+ def post_process_textual_mem(
105
+ memories_result: dict[str, Any],
106
+ text_formatted_mem: list[dict[str, Any]],
107
+ mem_cube_id: str,
108
+ ) -> dict[str, Any]:
109
+ """
110
+ Post-process text and tool memory results.
111
+ """
112
+ fact_mem = [
113
+ mem
114
+ for mem in text_formatted_mem
115
+ if mem["metadata"]["memory_type"] not in ["ToolSchemaMemory", "ToolTrajectoryMemory"]
116
+ ]
117
+ tool_mem = [
118
+ mem
119
+ for mem in text_formatted_mem
120
+ if mem["metadata"]["memory_type"] in ["ToolSchemaMemory", "ToolTrajectoryMemory"]
121
+ ]
122
+
123
+ memories_result["text_mem"].append(
124
+ {
125
+ "cube_id": mem_cube_id,
126
+ "memories": fact_mem,
127
+ "total_nodes": len(fact_mem),
128
+ }
129
+ )
130
+ memories_result["tool_mem"].append(
131
+ {
132
+ "cube_id": mem_cube_id,
133
+ "memories": tool_mem,
134
+ "total_nodes": len(tool_mem),
135
+ }
136
+ )
137
+ return memories_result
138
+
139
+
140
+ def separate_knowledge_and_conversation_mem(memories: list[dict[str, Any]]):
141
+ """
142
+ Separate knowledge and conversation memories from retrieval results.
143
+ """
144
+ knowledge_mem = []
145
+ conversation_mem = []
146
+ for item in memories:
147
+ sources = item["metadata"]["sources"]
148
+ if (
149
+ len(sources) > 0
150
+ and "type" in sources[0]
151
+ and sources[0]["type"] == "file"
152
+ and "content" in sources[0]
153
+ and sources[0]["content"] != ""
154
+ ): # TODO change to memory_type
155
+ knowledge_mem.append(item)
156
+ else:
157
+ conversation_mem.append(item)
158
+
159
+ logger.info(
160
+ f"Retrieval results number of knowledge_mem: {len(knowledge_mem)}, conversation_mem: {len(conversation_mem)}"
161
+ )
162
+ return knowledge_mem, conversation_mem
163
+
164
+
165
+ def rerank_knowledge_mem(
166
+ reranker: Any,
167
+ query: str,
168
+ text_mem: list[dict[str, Any]],
169
+ top_k: int,
170
+ file_mem_proportion: float = 0.5,
171
+ ) -> list[dict[str, Any]]:
172
+ """
173
+ Rerank knowledge memories and keep conversation memories.
174
+ """
175
+ memid2cubeid = {}
176
+ memories_list = []
177
+ for memory_group in text_mem:
178
+ cube_id = memory_group["cube_id"]
179
+ memories = memory_group["memories"]
180
+ memories_list.extend(memories)
181
+ for memory in memories:
182
+ memid2cubeid[memory["id"]] = cube_id
183
+
184
+ knowledge_mem, conversation_mem = separate_knowledge_and_conversation_mem(memories_list)
185
+ knowledge_mem_top_k = max(int(top_k * file_mem_proportion), int(top_k - len(conversation_mem)))
186
+ # rerank set unuse
187
+ reranked_knowledge_mem = knowledge_mem
188
+
189
+ # Sort by relativity in descending order
190
+ reranked_knowledge_mem = sorted(
191
+ reranked_knowledge_mem,
192
+ key=lambda item: item.get("metadata", {}).get("relativity", 0.0),
193
+ reverse=True,
194
+ )
195
+
196
+ # TODO revoke sources replace memory value
197
+ for item in reranked_knowledge_mem:
198
+ item["memory"] = item["metadata"]["sources"][0]["content"]
199
+ item["metadata"]["sources"] = []
200
+
201
+ for item in conversation_mem:
202
+ item["metadata"]["sources"] = []
203
+
204
+ # deduplicate: remove items with duplicate memory content
205
+ original_count = len(reranked_knowledge_mem)
206
+ seen_memories = set[Any]()
207
+ deduplicated_knowledge_mem = []
208
+ for item in reranked_knowledge_mem:
209
+ memory_content = item.get("memory", "")
210
+ if memory_content and memory_content not in seen_memories:
211
+ seen_memories.add(memory_content)
212
+ deduplicated_knowledge_mem.append(item)
213
+ deduplicated_count = len(deduplicated_knowledge_mem)
214
+ logger.info(
215
+ f"After filtering duplicate knowledge base text from sources, count changed from {original_count} to {deduplicated_count}"
216
+ )
217
+
218
+ reranked_knowledge_mem = deduplicated_knowledge_mem[:knowledge_mem_top_k]
219
+ conversation_mem_top_k = top_k - len(reranked_knowledge_mem)
220
+ cubeid2memories = {}
221
+ text_mem_res = []
222
+
223
+ for memory in reranked_knowledge_mem + conversation_mem[:conversation_mem_top_k]:
224
+ cube_id = memid2cubeid[memory["id"]]
225
+ if cube_id not in cubeid2memories:
226
+ cubeid2memories[cube_id] = []
227
+ cubeid2memories[cube_id].append(memory)
228
+
229
+ for cube_id, memories in cubeid2memories.items():
230
+ text_mem_res.append(
231
+ {
232
+ "cube_id": cube_id,
233
+ "memories": memories,
234
+ }
235
+ )
236
+
237
+ return text_mem_res
@@ -6,7 +6,11 @@ This module handles retrieving all memories or specific subgraphs based on queri
6
6
 
7
7
  from typing import TYPE_CHECKING, Any, Literal
8
8
 
9
- from memos.api.handlers.formatters_handler import format_memory_item
9
+ from memos.api.handlers.formatters_handler import (
10
+ format_memory_item,
11
+ post_process_pref_mem,
12
+ post_process_textual_mem,
13
+ )
10
14
  from memos.api.product_models import (
11
15
  DeleteMemoryRequest,
12
16
  DeleteMemoryResponse,
@@ -209,54 +213,67 @@ def handle_get_memory(memory_id: str, naive_mem_cube: NaiveMemCube) -> GetMemory
209
213
  def handle_get_memories(
210
214
  get_mem_req: GetMemoryRequest, naive_mem_cube: NaiveMemCube
211
215
  ) -> GetMemoryResponse:
212
- # TODO: Implement get memory with filter
216
+ results: dict[str, Any] = {"text_mem": [], "pref_mem": [], "tool_mem": []}
213
217
  memories = naive_mem_cube.text_mem.get_all(
214
218
  user_name=get_mem_req.mem_cube_id,
215
219
  user_id=get_mem_req.user_id,
216
220
  page=get_mem_req.page,
217
221
  page_size=get_mem_req.page_size,
218
- )
219
- total_nodes = memories["total_nodes"]
220
- total_edges = memories["total_edges"]
221
- del memories["total_nodes"]
222
- del memories["total_edges"]
222
+ filter=get_mem_req.filter,
223
+ )["nodes"]
224
+
225
+ results = post_process_textual_mem(results, memories, get_mem_req.mem_cube_id)
226
+
227
+ if not get_mem_req.include_tool_memory:
228
+ results["tool_mem"] = []
223
229
 
224
230
  preferences: list[TextualMemoryItem] = []
225
- total_pref = 0
226
231
 
232
+ format_preferences = []
227
233
  if get_mem_req.include_preference and naive_mem_cube.pref_mem is not None:
228
234
  filter_params: dict[str, Any] = {}
229
235
  if get_mem_req.user_id is not None:
230
236
  filter_params["user_id"] = get_mem_req.user_id
231
237
  if get_mem_req.mem_cube_id is not None:
232
238
  filter_params["mem_cube_id"] = get_mem_req.mem_cube_id
233
-
234
- preferences, total_pref = naive_mem_cube.pref_mem.get_memory_by_filter(
239
+ if get_mem_req.filter is not None:
240
+ # Check and remove user_id/mem_cube_id from filter if present
241
+ filter_copy = get_mem_req.filter.copy()
242
+ removed_fields = []
243
+
244
+ if "user_id" in filter_copy:
245
+ filter_copy.pop("user_id")
246
+ removed_fields.append("user_id")
247
+ if "mem_cube_id" in filter_copy:
248
+ filter_copy.pop("mem_cube_id")
249
+ removed_fields.append("mem_cube_id")
250
+
251
+ if removed_fields:
252
+ logger.warning(
253
+ f"Fields {removed_fields} found in filter will be ignored. "
254
+ f"Use request-level user_id/mem_cube_id parameters instead."
255
+ )
256
+
257
+ filter_params.update(filter_copy)
258
+
259
+ preferences, _ = naive_mem_cube.pref_mem.get_memory_by_filter(
235
260
  filter_params, page=get_mem_req.page, page_size=get_mem_req.page_size
236
261
  )
237
- format_preferences = [format_memory_item(item) for item in preferences]
262
+ format_preferences = [format_memory_item(item, save_sources=False) for item in preferences]
238
263
 
239
- return GetMemoryResponse(
240
- message="Memories retrieved successfully",
241
- data={
242
- "text_mem": [
243
- {
244
- "cube_id": get_mem_req.mem_cube_id,
245
- "memories": memories,
246
- "total_nodes": total_nodes,
247
- "total_edges": total_edges,
248
- }
249
- ],
250
- "pref_mem": [
251
- {
252
- "cube_id": get_mem_req.mem_cube_id,
253
- "memories": format_preferences,
254
- "total_nodes": total_pref,
255
- }
256
- ],
257
- },
264
+ results = post_process_pref_mem(
265
+ results, format_preferences, get_mem_req.mem_cube_id, get_mem_req.include_preference
258
266
  )
259
267
 
268
+ # Filter to only keep text_mem, pref_mem, tool_mem
269
+ filtered_results = {
270
+ "text_mem": results.get("text_mem", []),
271
+ "pref_mem": results.get("pref_mem", []),
272
+ "tool_mem": results.get("tool_mem", []),
273
+ }
274
+
275
+ return GetMemoryResponse(message="Memories retrieved successfully", data=filtered_results)
276
+
260
277
 
261
278
  def handle_delete_memories(delete_mem_req: DeleteMemoryRequest, naive_mem_cube: NaiveMemCube):
262
279
  logger.info(
@@ -5,9 +5,12 @@ This module provides a class-based implementation of search handlers,
5
5
  using dependency injection for better modularity and testability.
6
6
  """
7
7
 
8
+ import time
9
+
8
10
  from typing import Any
9
11
 
10
12
  from memos.api.handlers.base_handler import BaseHandler, HandlerDependencies
13
+ from memos.api.handlers.formatters_handler import rerank_knowledge_mem
11
14
  from memos.api.product_models import APISearchRequest, SearchResponse
12
15
  from memos.log import get_logger
13
16
  from memos.memories.textual.tree_text_memory.retrieve.retrieve_utils import (
@@ -69,6 +72,18 @@ class SearchHandler(BaseHandler):
69
72
  # Restore original top_k for downstream logic or response metadata
70
73
  search_req.top_k = original_top_k
71
74
 
75
+ start_time = time.time()
76
+ text_mem = results["text_mem"]
77
+ results["text_mem"] = rerank_knowledge_mem(
78
+ self.reranker,
79
+ query=search_req.query,
80
+ text_mem=text_mem,
81
+ top_k=original_top_k,
82
+ file_mem_proportion=0.5,
83
+ )
84
+ rerank_time = time.time() - start_time
85
+
86
+ self.logger.info(f"[Knowledge_replace_memory_time] Rerank time: {rerank_time} seconds")
72
87
  self.logger.info(
73
88
  f"[SearchHandler] Final search results: count={len(results)} results={results}"
74
89
  )
@@ -771,7 +771,9 @@ class GetMemoryRequest(BaseRequest):
771
771
 
772
772
  mem_cube_id: str = Field(..., description="Cube ID")
773
773
  user_id: str | None = Field(None, description="User ID")
774
- include_preference: bool = Field(True, description="Whether to handle preference memory")
774
+ include_preference: bool = Field(True, description="Whether to return preference memory")
775
+ include_tool_memory: bool = Field(False, description="Whether to return tool memory")
776
+ filter: dict[str, Any] | None = Field(None, description="Filter for the memory")
775
777
  page: int | None = Field(
776
778
  None,
777
779
  description="Page number (starts from 1). If None, exports all data without pagination.",
@@ -19,12 +19,13 @@ class BaseGraphDB(ABC):
19
19
  """
20
20
 
21
21
  @abstractmethod
22
- def update_node(self, id: str, fields: dict[str, Any]) -> None:
22
+ def update_node(self, id: str, fields: dict[str, Any], user_name: str | None = None) -> None:
23
23
  """
24
24
  Update attributes of an existing node.
25
25
  Args:
26
26
  id: Node identifier to be updated.
27
27
  fields: Dictionary of fields to update.
28
+ user_name: given user_name
28
29
  """
29
30
 
30
31
  @abstractmethod
@@ -70,7 +71,7 @@ class BaseGraphDB(ABC):
70
71
 
71
72
  # Graph Query & Reasoning
72
73
  @abstractmethod
73
- def get_node(self, id: str, include_embedding: bool = False) -> dict[str, Any] | None:
74
+ def get_node(self, id: str, include_embedding: bool = False, **kwargs) -> dict[str, Any] | None:
74
75
  """
75
76
  Retrieve the metadata and content of a node.
76
77
  Args:
@@ -82,7 +83,7 @@ class BaseGraphDB(ABC):
82
83
 
83
84
  @abstractmethod
84
85
  def get_nodes(
85
- self, id: str, include_embedding: bool = False, **kwargs
86
+ self, ids: list, include_embedding: bool = False, **kwargs
86
87
  ) -> dict[str, Any] | None:
87
88
  """
88
89
  Retrieve the metadata and memory of a list of nodes.
@@ -160,13 +161,17 @@ class BaseGraphDB(ABC):
160
161
  """
161
162
 
162
163
  @abstractmethod
163
- def get_by_metadata(self, filters: list[dict[str, Any]]) -> list[str]:
164
+ def get_by_metadata(
165
+ self, filters: list[dict[str, Any]], status: str | None = None
166
+ ) -> list[str]:
164
167
  """
165
168
  Retrieve node IDs that match given metadata filters.
166
169
 
167
170
  Args:
168
171
  filters (dict[str, Any]): A dictionary of attribute-value filters.
169
172
  Example: {"topic": "psychology", "importance": 2}
173
+ status (str, optional): Filter by status (e.g., 'activated', 'archived').
174
+ If None, no status filter is applied.
170
175
 
171
176
  Returns:
172
177
  list[str]: Node IDs whose metadata match the filter conditions.
@@ -239,13 +244,17 @@ class BaseGraphDB(ABC):
239
244
  """
240
245
 
241
246
  @abstractmethod
242
- def get_all_memory_items(self, scope: str, include_embedding: bool = False) -> list[dict]:
247
+ def get_all_memory_items(
248
+ self, scope: str, include_embedding: bool = False, status: str | None = None
249
+ ) -> list[dict]:
243
250
  """
244
251
  Retrieve all memory items of a specific memory_type.
245
252
 
246
253
  Args:
247
254
  scope (str): Must be one of 'WorkingMemory', 'LongTermMemory', or 'UserMemory'.
248
255
  include_embedding: with/without embedding
256
+ status (str, optional): Filter by status (e.g., 'activated', 'archived').
257
+ If None, no status filter is applied.
249
258
 
250
259
  Returns:
251
260
  list[dict]: Full list of memory items under this scope.
@@ -916,6 +916,7 @@ class Neo4jGraphDB(BaseGraphDB):
916
916
  filter: dict | None = None,
917
917
  knowledgebase_ids: list[str] | None = None,
918
918
  user_name_flag: bool = True,
919
+ status: str | None = None,
919
920
  ) -> list[str]:
920
921
  """
921
922
  TODO:
@@ -933,6 +934,8 @@ class Neo4jGraphDB(BaseGraphDB):
933
934
  {"field": "tags", "op": "contains", "value": "AI"},
934
935
  ...
935
936
  ]
937
+ status (str, optional): Filter by status (e.g., 'activated', 'archived').
938
+ If None, no status filter is applied.
936
939
 
937
940
  Returns:
938
941
  list[str]: Node IDs whose metadata match the filter conditions. (AND logic).
@@ -942,15 +945,20 @@ class Neo4jGraphDB(BaseGraphDB):
942
945
  - Can be used for faceted recall or prefiltering before embedding rerank.
943
946
  """
944
947
  logger.info(
945
- f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids}"
948
+ f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids},status: {status}"
946
949
  )
947
950
  print(
948
- f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids}"
951
+ f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids},status: {status}"
949
952
  )
950
953
  user_name = user_name if user_name else self.config.user_name
951
954
  where_clauses = []
952
955
  params = {}
953
956
 
957
+ # Add status filter if provided
958
+ if status:
959
+ where_clauses.append("n.status = $status")
960
+ params["status"] = status
961
+
954
962
  for i, f in enumerate(filters):
955
963
  field = f["field"]
956
964
  op = f.get("op", "=")
@@ -1272,8 +1280,10 @@ class Neo4jGraphDB(BaseGraphDB):
1272
1280
  def get_all_memory_items(
1273
1281
  self,
1274
1282
  scope: str,
1283
+ include_embedding: bool = False,
1275
1284
  filter: dict | None = None,
1276
1285
  knowledgebase_ids: list[str] | None = None,
1286
+ status: str | None = None,
1277
1287
  **kwargs,
1278
1288
  ) -> list[dict]:
1279
1289
  """
@@ -1281,18 +1291,21 @@ class Neo4jGraphDB(BaseGraphDB):
1281
1291
 
1282
1292
  Args:
1283
1293
  scope (str): Must be one of 'WorkingMemory', 'LongTermMemory', or 'UserMemory'.
1294
+ include_embedding (bool): Whether to include embedding in results.
1284
1295
  filter (dict, optional): Filter conditions with 'and' or 'or' logic for search results.
1285
1296
  Example: {"and": [{"id": "xxx"}, {"A": "yyy"}]} or {"or": [{"id": "xxx"}, {"A": "yyy"}]}
1286
- Returns:
1297
+ knowledgebase_ids (list[str], optional): List of knowledgebase IDs to filter by.
1298
+ status (str, optional): Filter by status (e.g., 'activated', 'archived').
1299
+ If None, no status filter is applied.
1287
1300
 
1288
1301
  Returns:
1289
1302
  list[dict]: Full list of memory items under this scope.
1290
1303
  """
1291
1304
  logger.info(
1292
- f"[get_all_memory_items] scope: {scope},filter: {filter},knowledgebase_ids: {knowledgebase_ids}"
1305
+ f"[get_all_memory_items] scope: {scope},filter: {filter},knowledgebase_ids: {knowledgebase_ids},status: {status}"
1293
1306
  )
1294
1307
  print(
1295
- f"[get_all_memory_items] scope: {scope},filter: {filter},knowledgebase_ids: {knowledgebase_ids}"
1308
+ f"[get_all_memory_items] scope: {scope},filter: {filter},knowledgebase_ids: {knowledgebase_ids},status: {status}"
1296
1309
  )
1297
1310
 
1298
1311
  user_name = kwargs.get("user_name") if kwargs.get("user_name") else self.config.user_name
@@ -1302,6 +1315,11 @@ class Neo4jGraphDB(BaseGraphDB):
1302
1315
  where_clauses = ["n.memory_type = $scope"]
1303
1316
  params = {"scope": scope}
1304
1317
 
1318
+ # Add status filter if provided
1319
+ if status:
1320
+ where_clauses.append("n.status = $status")
1321
+ params["status"] = status
1322
+
1305
1323
  # Build user_name filter with knowledgebase_ids support (OR relationship) using common method
1306
1324
  user_name_conditions, user_name_params = self._build_user_name_and_kb_ids_conditions_cypher(
1307
1325
  user_name=user_name,