MemoryOS 2.0.2__tar.gz → 2.0.3__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 (314) hide show
  1. {memoryos-2.0.2 → memoryos-2.0.3}/PKG-INFO +1 -1
  2. {memoryos-2.0.2 → memoryos-2.0.3}/pyproject.toml +1 -1
  3. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/__init__.py +1 -1
  4. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/config.py +3 -1
  5. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/component_init.py +16 -13
  6. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/config_builders.py +1 -1
  7. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/formatters_handler.py +2 -2
  8. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/mcp_serve.py +61 -19
  9. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/start_api.py +1 -1
  10. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/cli.py +1 -1
  11. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/neo4j.py +10 -1
  12. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/neo4j_community.py +9 -0
  13. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/polardb.py +37 -5
  14. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/hf.py +1 -1
  15. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_feedback/feedback.py +9 -5
  16. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_feedback/simple_feedback.py +2 -0
  17. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/image_parser.py +15 -17
  18. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/utils.py +1 -1
  19. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/simple_struct.py +24 -7
  20. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/utils.py +1 -1
  21. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/base_scheduler.py +8 -0
  22. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py +1 -1
  23. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/optimized_scheduler.py +27 -5
  24. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/orm_modules/api_redis_model.py +3 -2
  25. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +9 -26
  26. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/factory.py +4 -0
  27. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/http_bge.py +8 -0
  28. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/http_bge_strategy.py +8 -0
  29. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mem_reader_prompts.py +65 -9
  30. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/utils.py +2 -1
  31. {memoryos-2.0.2 → memoryos-2.0.3}/LICENSE +0 -0
  32. {memoryos-2.0.2 → memoryos-2.0.3}/README.md +0 -0
  33. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/client.py +0 -0
  34. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/context/dependencies.py +0 -0
  35. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/exceptions.py +0 -0
  36. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/__init__.py +0 -0
  37. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/add_handler.py +0 -0
  38. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/base_handler.py +0 -0
  39. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/chat_handler.py +0 -0
  40. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/feedback_handler.py +0 -0
  41. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/memory_handler.py +0 -0
  42. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/scheduler_handler.py +0 -0
  43. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/search_handler.py +0 -0
  44. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/suggestion_handler.py +0 -0
  45. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/middleware/request_context.py +0 -0
  46. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/product_api.py +0 -0
  47. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/product_models.py +0 -0
  48. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/routers/__init__.py +0 -0
  49. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/routers/product_router.py +0 -0
  50. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/routers/server_router.py +0 -0
  51. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/server_api.py +0 -0
  52. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/__init__.py +0 -0
  53. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/base.py +0 -0
  54. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/charactertext_chunker.py +0 -0
  55. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/factory.py +0 -0
  56. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/markdown_chunker.py +0 -0
  57. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/sentence_chunker.py +0 -0
  58. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/simple_chunker.py +0 -0
  59. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/__init__.py +0 -0
  60. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/base.py +0 -0
  61. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/chunker.py +0 -0
  62. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/embedder.py +0 -0
  63. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/graph_db.py +0 -0
  64. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/internet_retriever.py +0 -0
  65. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/llm.py +0 -0
  66. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_agent.py +0 -0
  67. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_chat.py +0 -0
  68. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_cube.py +0 -0
  69. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_os.py +0 -0
  70. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_reader.py +0 -0
  71. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_scheduler.py +0 -0
  72. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_user.py +0 -0
  73. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/memory.py +0 -0
  74. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/parser.py +0 -0
  75. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/reranker.py +0 -0
  76. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/utils.py +0 -0
  77. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/vec_db.py +0 -0
  78. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/context/context.py +0 -0
  79. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/dependency.py +0 -0
  80. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/deprecation.py +0 -0
  81. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/__init__.py +0 -0
  82. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/ark.py +0 -0
  83. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/base.py +0 -0
  84. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/factory.py +0 -0
  85. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/ollama.py +0 -0
  86. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/sentence_transformer.py +0 -0
  87. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/universal_api.py +0 -0
  88. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/exceptions.py +0 -0
  89. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/__init__.py +0 -0
  90. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/base.py +0 -0
  91. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/factory.py +0 -0
  92. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/item.py +0 -0
  93. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/nebular.py +0 -0
  94. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/hello_world.py +0 -0
  95. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/__init__.py +0 -0
  96. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/base.py +0 -0
  97. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/deepseek.py +0 -0
  98. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/factory.py +0 -0
  99. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/hf_singleton.py +0 -0
  100. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/ollama.py +0 -0
  101. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/openai.py +0 -0
  102. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/openai_new.py +0 -0
  103. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/qwen.py +0 -0
  104. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/utils.py +0 -0
  105. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/vllm.py +0 -0
  106. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/log.py +0 -0
  107. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_agent/base.py +0 -0
  108. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_agent/deepsearch_agent.py +0 -0
  109. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_agent/factory.py +0 -0
  110. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_chat/__init__.py +0 -0
  111. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_chat/base.py +0 -0
  112. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_chat/factory.py +0 -0
  113. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_chat/simple.py +0 -0
  114. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_cube/__init__.py +0 -0
  115. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_cube/base.py +0 -0
  116. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_cube/general.py +0 -0
  117. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_cube/navie.py +0 -0
  118. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_cube/utils.py +0 -0
  119. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_feedback/base.py +0 -0
  120. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_feedback/utils.py +0 -0
  121. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/client.py +0 -0
  122. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/core.py +0 -0
  123. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/main.py +0 -0
  124. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/product.py +0 -0
  125. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/product_server.py +0 -0
  126. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/utils/default_config.py +0 -0
  127. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/utils/format_utils.py +0 -0
  128. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/utils/reference_utils.py +0 -0
  129. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/__init__.py +0 -0
  130. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/base.py +0 -0
  131. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/factory.py +0 -0
  132. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/memory.py +0 -0
  133. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/multi_modal_struct.py +0 -0
  134. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/__init__.py +0 -0
  135. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/assistant_parser.py +0 -0
  136. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/base.py +0 -0
  137. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/file_content_parser.py +0 -0
  138. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/multi_modal_parser.py +0 -0
  139. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/string_parser.py +0 -0
  140. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/system_parser.py +0 -0
  141. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/text_content_parser.py +0 -0
  142. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/tool_parser.py +0 -0
  143. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/user_parser.py +0 -0
  144. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/strategy_struct.py +0 -0
  145. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/__init__.py +0 -0
  146. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/analyzer/__init__.py +0 -0
  147. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/analyzer/api_analyzer.py +0 -0
  148. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/analyzer/eval_analyzer.py +0 -0
  149. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +0 -0
  150. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/analyzer/scheduler_for_eval.py +0 -0
  151. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/__init__.py +0 -0
  152. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/api_misc.py +0 -0
  153. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/base.py +0 -0
  154. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/misc.py +0 -0
  155. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/scheduler_logger.py +0 -0
  156. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/task_threads.py +0 -0
  157. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_scheduler.py +0 -0
  158. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/memory_manage_modules/__init__.py +0 -0
  159. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/memory_manage_modules/memory_filter.py +0 -0
  160. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/memory_manage_modules/retriever.py +0 -0
  161. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/monitors/__init__.py +0 -0
  162. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/monitors/dispatcher_monitor.py +0 -0
  163. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/monitors/general_monitor.py +0 -0
  164. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/monitors/task_schedule_monitor.py +0 -0
  165. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/orm_modules/__init__.py +0 -0
  166. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/orm_modules/base_model.py +0 -0
  167. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/orm_modules/monitor_models.py +0 -0
  168. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/orm_modules/redis_model.py +0 -0
  169. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
  170. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/__init__.py +0 -0
  171. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/analyzer_schemas.py +0 -0
  172. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/api_schemas.py +0 -0
  173. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/general_schemas.py +0 -0
  174. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/message_schemas.py +0 -0
  175. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/monitor_schemas.py +0 -0
  176. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/task_schemas.py +0 -0
  177. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
  178. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +0 -0
  179. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +0 -0
  180. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/task_schedule_modules/orchestrator.py +0 -0
  181. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/task_schedule_modules/task_queue.py +0 -0
  182. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/__init__.py +0 -0
  183. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/api_utils.py +0 -0
  184. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/config_utils.py +0 -0
  185. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/db_utils.py +0 -0
  186. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/filter_utils.py +0 -0
  187. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/metrics.py +0 -0
  188. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/misc_utils.py +0 -0
  189. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/monitor_event_utils.py +0 -0
  190. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/status_tracker.py +0 -0
  191. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/webservice_modules/__init__.py +0 -0
  192. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +0 -0
  193. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/webservice_modules/redis_service.py +0 -0
  194. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/factory.py +0 -0
  195. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/mysql_persistent_user_manager.py +0 -0
  196. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/mysql_user_manager.py +0 -0
  197. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/persistent_factory.py +0 -0
  198. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/persistent_user_manager.py +0 -0
  199. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/redis_persistent_user_manager.py +0 -0
  200. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/user_manager.py +0 -0
  201. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/__init__.py +0 -0
  202. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/activation/__init__.py +0 -0
  203. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/activation/base.py +0 -0
  204. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/activation/item.py +0 -0
  205. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/activation/kv.py +0 -0
  206. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/activation/vllmkv.py +0 -0
  207. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/base.py +0 -0
  208. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/factory.py +0 -0
  209. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/parametric/__init__.py +0 -0
  210. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/parametric/base.py +0 -0
  211. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/parametric/item.py +0 -0
  212. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/parametric/lora.py +0 -0
  213. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/__init__.py +0 -0
  214. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/base.py +0 -0
  215. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/general.py +0 -0
  216. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/item.py +0 -0
  217. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/naive.py +0 -0
  218. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/__init__.py +0 -0
  219. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/adder.py +0 -0
  220. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/config.py +0 -0
  221. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/extractor.py +0 -0
  222. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/factory.py +0 -0
  223. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/retrievers.py +0 -0
  224. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/spliter.py +0 -0
  225. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/utils.py +0 -0
  226. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/preference.py +0 -0
  227. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/simple_preference.py +0 -0
  228. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/simple_tree.py +0 -0
  229. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree.py +0 -0
  230. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/__init__.py +0 -0
  231. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
  232. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/organize/handler.py +0 -0
  233. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/organize/manager.py +0 -0
  234. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +0 -0
  235. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +0 -0
  236. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
  237. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +0 -0
  238. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +0 -0
  239. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +0 -0
  240. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
  241. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +0 -0
  242. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
  243. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +0 -0
  244. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +0 -0
  245. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
  246. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +0 -0
  247. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +0 -0
  248. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +0 -0
  249. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +0 -0
  250. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
  251. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/dinding_report_bot.py +0 -0
  252. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/lockfree_dict.py +0 -0
  253. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/notification_service.py +0 -0
  254. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/notification_utils.py +0 -0
  255. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/singleton.py +0 -0
  256. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/thread_safe_dict.py +0 -0
  257. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/thread_safe_dict_segment.py +0 -0
  258. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/multi_mem_cube/__init__.py +0 -0
  259. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/multi_mem_cube/composite_cube.py +0 -0
  260. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/multi_mem_cube/single_cube.py +0 -0
  261. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/multi_mem_cube/views.py +0 -0
  262. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/parsers/__init__.py +0 -0
  263. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/parsers/base.py +0 -0
  264. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/parsers/factory.py +0 -0
  265. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/parsers/markitdown.py +0 -0
  266. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/__init__.py +0 -0
  267. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/base.py +0 -0
  268. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/concat.py +0 -0
  269. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/cosine_local.py +0 -0
  270. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/noop.py +0 -0
  271. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/__init__.py +0 -0
  272. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/base.py +0 -0
  273. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/concat_background.py +0 -0
  274. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/concat_docsource.py +0 -0
  275. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/dialogue_common.py +0 -0
  276. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/factory.py +0 -0
  277. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/single_turn.py +0 -0
  278. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/singleturn_outmem.py +0 -0
  279. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/settings.py +0 -0
  280. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/__init__.py +0 -0
  281. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/advanced_search_prompts.py +0 -0
  282. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/cloud_service_prompt.py +0 -0
  283. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/instruction_completion.py +0 -0
  284. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mem_agent_prompts.py +0 -0
  285. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mem_feedback_prompts.py +0 -0
  286. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mem_reader_strategy_prompts.py +0 -0
  287. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mem_scheduler_prompts.py +0 -0
  288. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mem_search_prompts.py +0 -0
  289. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mos_prompts.py +0 -0
  290. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/prefer_complete_prompt.py +0 -0
  291. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/tool_mem_prompts.py +0 -0
  292. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/tree_reorganize_prompts.py +0 -0
  293. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/__init__.py +0 -0
  294. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/general_types.py +0 -0
  295. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/__init__.py +0 -0
  296. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +0 -0
  297. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +0 -0
  298. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +0 -0
  299. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +0 -0
  300. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +0 -0
  301. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +0 -0
  302. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +0 -0
  303. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +0 -0
  304. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_message_param.py +0 -0
  305. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +0 -0
  306. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +0 -0
  307. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +0 -0
  308. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +0 -0
  309. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/vec_dbs/__init__.py +0 -0
  310. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/vec_dbs/base.py +0 -0
  311. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/vec_dbs/factory.py +0 -0
  312. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/vec_dbs/item.py +0 -0
  313. {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/vec_dbs/milvus.py +0 -0
  314. {memoryos-2.0.2 → memoryos-2.0.3}/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.2
3
+ Version: 2.0.3
4
4
  Summary: Intelligence Begins with Memory
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -4,7 +4,7 @@
4
4
  ##############################################################################
5
5
 
6
6
  name = "MemoryOS"
7
- version = "2.0.2"
7
+ version = "2.0.3"
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.2"
1
+ __version__ = "2.0.3"
2
2
 
3
3
  from memos.configs.mem_cube import GeneralMemCubeConfig
4
4
  from memos.configs.mem_os import MOSConfig
@@ -23,7 +23,7 @@ if TYPE_CHECKING:
23
23
 
24
24
 
25
25
  # Load environment variables
26
- load_dotenv()
26
+ load_dotenv(override=True)
27
27
 
28
28
  logger = logging.getLogger(__name__)
29
29
 
@@ -410,6 +410,8 @@ class APIConfig:
410
410
  "url": os.getenv("MOS_RERANKER_URL", "localhost:8000/v1/rerank"),
411
411
  "model": os.getenv("MOS_FEEDBACK_RERANKER_MODEL", "bge-reranker-v2-m3"),
412
412
  "timeout": 10,
413
+ "max_query_tokens": int(os.getenv("MOS_RERANKER_MAX_TOKENS", 8000)),
414
+ "concate_len": int(os.getenv("MOS_RERANKER_CONCAT_LEN", 1000)),
413
415
  "headers_extra": json.loads(os.getenv("MOS_RERANKER_HEADERS_EXTRA", "{}")),
414
416
  "rerank_source": os.getenv("MOS_RERANK_SOURCE"),
415
417
  "reranker_strategy": os.getenv("MOS_RERANKER_STRATEGY", "single_turn"),
@@ -133,19 +133,22 @@ def init_server() -> dict[str, Any]:
133
133
  logger.info("Initializing MemOS server components...")
134
134
 
135
135
  # Initialize Redis client first as it is a core dependency for features like scheduler status tracking
136
- try:
137
- from memos.mem_scheduler.orm_modules.api_redis_model import APIRedisDBManager
138
-
139
- redis_client = APIRedisDBManager.load_redis_engine_from_env()
140
- if redis_client:
141
- logger.info("Redis client initialized successfully.")
142
- else:
143
- logger.error(
144
- "Failed to initialize Redis client. Check REDIS_HOST etc. in environment variables."
145
- )
146
- except Exception as e:
147
- logger.error(f"Failed to initialize Redis client: {e}", exc_info=True)
148
- redis_client = None # Ensure redis_client exists even on failure
136
+ if os.getenv("MEMSCHEDULER_USE_REDIS_QUEUE", "False").lower() == "true":
137
+ try:
138
+ from memos.mem_scheduler.orm_modules.api_redis_model import APIRedisDBManager
139
+
140
+ redis_client = APIRedisDBManager.load_redis_engine_from_env()
141
+ if redis_client:
142
+ logger.info("Redis client initialized successfully.")
143
+ else:
144
+ logger.error(
145
+ "Failed to initialize Redis client. Check REDIS_HOST etc. in environment variables."
146
+ )
147
+ except Exception as e:
148
+ logger.error(f"Failed to initialize Redis client: {e}", exc_info=True)
149
+ redis_client = None # Ensure redis_client exists even on failure
150
+ else:
151
+ redis_client = None
149
152
 
150
153
  # Get default cube configuration
151
154
  default_cube_config = APIConfig.get_default_cube_config()
@@ -89,7 +89,7 @@ def build_chat_llm_config() -> list[dict[str, Any]]:
89
89
  Returns:
90
90
  Validated chat LLM configuration dictionary
91
91
  """
92
- configs = json.loads(os.getenv("CHAT_MODEL_LIST"))
92
+ configs = json.loads(os.getenv("CHAT_MODEL_LIST", "[]"))
93
93
  return [
94
94
  {
95
95
  "config_class": LLMConfigFactory.model_validate(
@@ -144,7 +144,7 @@ def separate_knowledge_and_conversation_mem(memories: list[dict[str, Any]]):
144
144
  knowledge_mem = []
145
145
  conversation_mem = []
146
146
  for item in memories:
147
- sources = item["metadata"]["sources"]
147
+ sources = item.get("metadata", {}).get("sources", [])
148
148
  if (
149
149
  len(sources) > 0
150
150
  and "type" in sources[0]
@@ -199,7 +199,7 @@ def rerank_knowledge_mem(
199
199
  item["metadata"]["sources"] = []
200
200
 
201
201
  for item in conversation_mem:
202
- item["metadata"]["sources"] = []
202
+ item.setdefault("metadata", {})["sources"] = []
203
203
 
204
204
  # deduplicate: remove items with duplicate memory content
205
205
  original_count = len(reranked_knowledge_mem)
@@ -61,6 +61,19 @@ def load_default_config(user_id="default_user"):
61
61
  "SCHEDULER_TOP_N": "scheduler_top_n",
62
62
  }
63
63
 
64
+ # Fields that should always be kept as strings (not converted to numbers)
65
+ string_only_fields = {
66
+ "openai_api_key",
67
+ "openai_api_base",
68
+ "neo4j_uri",
69
+ "neo4j_user",
70
+ "neo4j_password",
71
+ "neo4j_db_name",
72
+ "text_mem_type",
73
+ "model_name",
74
+ "embedder_model",
75
+ }
76
+
64
77
  kwargs = {"user_id": user_id}
65
78
  for env_key, param_key in env_mapping.items():
66
79
  val = os.getenv(env_key)
@@ -74,6 +87,9 @@ def load_default_config(user_id="default_user"):
74
87
  # Handle boolean conversions
75
88
  if val.lower() in ("true", "false"):
76
89
  kwargs[param_key] = val.lower() == "true"
90
+ # Keep certain fields as strings
91
+ elif param_key in string_only_fields:
92
+ kwargs[param_key] = val
77
93
  else:
78
94
  # Try numeric conversions (int first, then float)
79
95
  try:
@@ -93,6 +109,10 @@ def load_default_config(user_id="default_user"):
93
109
  openai_api_base = kwargs.pop("openai_api_base", "https://api.openai.com/v1")
94
110
  text_mem_type = kwargs.pop("text_mem_type", "tree_text")
95
111
 
112
+ # Ensure embedder_model has a default value if not set
113
+ if "embedder_model" not in kwargs:
114
+ kwargs["embedder_model"] = os.getenv("EMBEDDER_MODEL", "nomic-embed-text:latest")
115
+
96
116
  config, cube = get_default(
97
117
  openai_api_key=openai_api_key,
98
118
  openai_api_base=openai_api_base,
@@ -110,6 +130,21 @@ class MOSMCPStdioServer:
110
130
  self.mos_core.register_mem_cube(cube)
111
131
  self._setup_tools()
112
132
 
133
+
134
+ class MOSMCPServer:
135
+ """MCP Server that accepts an existing MOS instance."""
136
+
137
+ def __init__(self, mos_instance: MOS | None = None):
138
+ self.mcp = FastMCP("MOS Memory System")
139
+ if mos_instance is None:
140
+ # Fall back to creating from default config
141
+ config, cube = load_default_config()
142
+ self.mos_core = MOS(config=config)
143
+ self.mos_core.register_mem_cube(cube)
144
+ else:
145
+ self.mos_core = mos_instance
146
+ self._setup_tools()
147
+
113
148
  def _setup_tools(self):
114
149
  """Setup MCP tools"""
115
150
 
@@ -133,7 +168,10 @@ class MOSMCPStdioServer:
133
168
  response = self.mos_core.chat(query, user_id)
134
169
  return response
135
170
  except Exception as e:
136
- return f"Chat error: {e!s}"
171
+ import traceback
172
+
173
+ error_details = traceback.format_exc()
174
+ return f"Chat error: {e!s}\nTraceback:\n{error_details}"
137
175
 
138
176
  @self.mcp.tool()
139
177
  async def create_user(
@@ -261,7 +299,10 @@ class MOSMCPStdioServer:
261
299
  result = self.mos_core.search(query, user_id, cube_ids)
262
300
  return result
263
301
  except Exception as e:
264
- return {"error": str(e)}
302
+ import traceback
303
+
304
+ error_details = traceback.format_exc()
305
+ return {"error": str(e), "traceback": error_details}
265
306
 
266
307
  @self.mcp.tool()
267
308
  async def add_memory(
@@ -527,23 +568,24 @@ class MOSMCPStdioServer:
527
568
  except Exception as e:
528
569
  return f"Error controlling memory scheduler: {e!s}"
529
570
 
530
- def run(self, transport: str = "stdio", **kwargs):
531
- """Run MCP server with specified transport"""
532
- if transport == "stdio":
533
- # Run stdio mode (default for local usage)
534
- self.mcp.run(transport="stdio")
535
- elif transport == "http":
536
- # Run HTTP mode
537
- host = kwargs.get("host", "localhost")
538
- port = kwargs.get("port", 8000)
539
- asyncio.run(self.mcp.run_http_async(host=host, port=port))
540
- elif transport == "sse":
541
- # Run SSE mode (deprecated but still supported)
542
- host = kwargs.get("host", "localhost")
543
- port = kwargs.get("port", 8000)
544
- self.mcp.run(transport="sse", host=host, port=port)
545
- else:
546
- raise ValueError(f"Unsupported transport: {transport}")
571
+
572
+ def _run_mcp(self, transport: str = "stdio", **kwargs):
573
+ if transport == "stdio":
574
+ self.mcp.run(transport="stdio")
575
+ elif transport == "http":
576
+ host = kwargs.get("host", "localhost")
577
+ port = kwargs.get("port", 8000)
578
+ asyncio.run(self.mcp.run_http_async(host=host, port=port))
579
+ elif transport == "sse":
580
+ host = kwargs.get("host", "localhost")
581
+ port = kwargs.get("port", 8000)
582
+ self.mcp.run(transport="sse", host=host, port=port)
583
+ else:
584
+ raise ValueError(f"Unsupported transport: {transport}")
585
+
586
+
587
+ MOSMCPStdioServer.run = _run_mcp
588
+ MOSMCPServer.run = _run_mcp
547
589
 
548
590
 
549
591
  # Usage example
@@ -20,7 +20,7 @@ logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(
20
20
  logger = logging.getLogger(__name__)
21
21
 
22
22
  # Load environment variables
23
- load_dotenv()
23
+ load_dotenv(override=True)
24
24
 
25
25
  T = TypeVar("T")
26
26
 
@@ -13,7 +13,7 @@ from io import BytesIO
13
13
 
14
14
  def export_openapi(output: str) -> bool:
15
15
  """Export OpenAPI schema to JSON file."""
16
- from memos.api.start_api import app
16
+ from memos.api.server_api import app
17
17
 
18
18
  # Create directory if it doesn't exist
19
19
  if os.path.dirname(output):
@@ -209,6 +209,10 @@ class Neo4jGraphDB(BaseGraphDB):
209
209
  # Flatten info fields to top level (for Neo4j flat structure)
210
210
  metadata = _flatten_info_fields(metadata)
211
211
 
212
+ # Initialize delete_time and delete_record_id fields
213
+ metadata.setdefault("delete_time", "")
214
+ metadata.setdefault("delete_record_id", "")
215
+
212
216
  # Merge node and set metadata
213
217
  created_at = metadata.pop("created_at")
214
218
  updated_at = metadata.pop("updated_at")
@@ -251,6 +255,7 @@ class Neo4jGraphDB(BaseGraphDB):
251
255
  - metadata: dict[str, Any] - Node metadata
252
256
  user_name: Optional user name (will use config default if not provided)
253
257
  """
258
+ logger.info("neo4j [add_nodes_batch] staring")
254
259
  if not nodes:
255
260
  logger.warning("[add_nodes_batch] Empty nodes list, skipping")
256
261
  return
@@ -280,6 +285,10 @@ class Neo4jGraphDB(BaseGraphDB):
280
285
  # Flatten info fields to top level (for Neo4j flat structure)
281
286
  metadata = _flatten_info_fields(metadata)
282
287
 
288
+ # Initialize delete_time and delete_record_id fields
289
+ metadata.setdefault("delete_time", "")
290
+ metadata.setdefault("delete_record_id", "")
291
+
283
292
  # Merge node and set metadata
284
293
  created_at = metadata.pop("created_at")
285
294
  updated_at = metadata.pop("updated_at")
@@ -1705,7 +1714,7 @@ class Neo4jGraphDB(BaseGraphDB):
1705
1714
  node.pop("user_name", None)
1706
1715
 
1707
1716
  # serialization
1708
- if node["sources"]:
1717
+ if node.get("sources"):
1709
1718
  for idx in range(len(node["sources"])):
1710
1719
  if not (
1711
1720
  isinstance(node["sources"][idx], str)
@@ -56,6 +56,10 @@ class Neo4jCommunityGraphDB(Neo4jGraphDB):
56
56
  # Safely process metadata
57
57
  metadata = _prepare_node_metadata(metadata)
58
58
 
59
+ # Initialize delete_time and delete_record_id fields
60
+ metadata.setdefault("delete_time", "")
61
+ metadata.setdefault("delete_record_id", "")
62
+
59
63
  # serialization
60
64
  if metadata["sources"]:
61
65
  for idx in range(len(metadata["sources"])):
@@ -105,6 +109,7 @@ class Neo4jCommunityGraphDB(Neo4jGraphDB):
105
109
  )
106
110
 
107
111
  def add_nodes_batch(self, nodes: list[dict[str, Any]], user_name: str | None = None) -> None:
112
+ print("neo4j_community add_nodes_batch:")
108
113
  if not nodes:
109
114
  logger.warning("[add_nodes_batch] Empty nodes list, skipping")
110
115
  return
@@ -130,6 +135,10 @@ class Neo4jCommunityGraphDB(Neo4jGraphDB):
130
135
  metadata = _prepare_node_metadata(metadata)
131
136
  metadata = _flatten_info_fields(metadata)
132
137
 
138
+ # Initialize delete_time and delete_record_id fields
139
+ metadata.setdefault("delete_time", "")
140
+ metadata.setdefault("delete_record_id", "")
141
+
133
142
  embedding = metadata.pop("embedding", None)
134
143
  if embedding is None:
135
144
  raise ValueError(f"Missing 'embedding' in metadata for node {node_id}")
@@ -835,6 +835,11 @@ class PolarDBGraphDB(BaseGraphDB):
835
835
  def add_edge(
836
836
  self, source_id: str, target_id: str, type: str, user_name: str | None = None
837
837
  ) -> None:
838
+ logger.info(
839
+ f"polardb [add_edge] source_id: {source_id}, target_id: {target_id}, type: {type},user_name:{user_name}"
840
+ )
841
+
842
+ start_time = time.time()
838
843
  if not source_id or not target_id:
839
844
  logger.warning(f"Edge '{source_id}' and '{target_id}' are both None")
840
845
  raise ValueError("[add_edge] source_id and target_id must be provided")
@@ -864,13 +869,16 @@ class PolarDBGraphDB(BaseGraphDB):
864
869
  AND end_id = ag_catalog._make_graph_id('{self.db_name}_graph'::name, 'Memory'::name, '{target_id}'::text::cstring)
865
870
  );
866
871
  """
867
-
872
+ logger.info(f"polardb [add_edge] query: {query}, properties: {json.dumps(properties)}")
868
873
  conn = None
869
874
  try:
870
875
  conn = self._get_connection()
871
876
  with conn.cursor() as cursor:
872
877
  cursor.execute(query, (source_id, target_id, type, json.dumps(properties)))
873
878
  logger.info(f"Edge created: {source_id} -[{type}]-> {target_id}")
879
+
880
+ elapsed_time = time.time() - start_time
881
+ logger.info(f" polardb [add_edge] insert completed time in {elapsed_time:.2f}s")
874
882
  except Exception as e:
875
883
  logger.error(f"Failed to insert edge: {e}", exc_info=True)
876
884
  raise
@@ -1033,7 +1041,10 @@ class PolarDBGraphDB(BaseGraphDB):
1033
1041
  Returns:
1034
1042
  dict: Node properties as key-value pairs, or None if not found.
1035
1043
  """
1036
-
1044
+ logger.info(
1045
+ f"polardb [get_node] id: {id}, include_embedding: {include_embedding}, user_name: {user_name}"
1046
+ )
1047
+ start_time = time.time()
1037
1048
  select_fields = "id, properties, embedding" if include_embedding else "id, properties"
1038
1049
 
1039
1050
  query = f"""
@@ -1048,6 +1059,7 @@ class PolarDBGraphDB(BaseGraphDB):
1048
1059
  query += "\nAND ag_catalog.agtype_access_operator(properties, '\"user_name\"'::agtype) = %s::agtype"
1049
1060
  params.append(self.format_param_value(user_name))
1050
1061
 
1062
+ logger.info(f"polardb [get_node] query: {query},params: {params}")
1051
1063
  conn = None
1052
1064
  try:
1053
1065
  conn = self._get_connection()
@@ -1084,6 +1096,10 @@ class PolarDBGraphDB(BaseGraphDB):
1084
1096
  except (json.JSONDecodeError, TypeError):
1085
1097
  logger.warning(f"Failed to parse embedding for node {id}")
1086
1098
 
1099
+ elapsed_time = time.time() - start_time
1100
+ logger.info(
1101
+ f" polardb [get_node] get_node completed time in {elapsed_time:.2f}s"
1102
+ )
1087
1103
  return self._parse_node(
1088
1104
  {
1089
1105
  "id": id,
@@ -1879,7 +1895,7 @@ class PolarDBGraphDB(BaseGraphDB):
1879
1895
  filter: dict | None = None,
1880
1896
  knowledgebase_ids: list[str] | None = None,
1881
1897
  tsvector_field: str = "properties_tsvector_zh",
1882
- tsquery_config: str = "jiebaqry",
1898
+ tsquery_config: str = "jiebacfg",
1883
1899
  **kwargs,
1884
1900
  ) -> list[dict]:
1885
1901
  """
@@ -1902,7 +1918,11 @@ class PolarDBGraphDB(BaseGraphDB):
1902
1918
  Returns:
1903
1919
  list[dict]: result list containing id and score
1904
1920
  """
1921
+ logger.info(
1922
+ f"[search_by_fulltext] query_words: {query_words},top_k:{top_k},scope:{scope},status:{status},threshold:{threshold},search_filter:{search_filter},user_name:{user_name},knowledgebase_ids:{knowledgebase_ids},filter:{filter}"
1923
+ )
1905
1924
  # Build WHERE clause dynamically, same as search_by_embedding
1925
+ start_time = time.time()
1906
1926
  where_clauses = []
1907
1927
 
1908
1928
  if scope:
@@ -1924,6 +1944,7 @@ class PolarDBGraphDB(BaseGraphDB):
1924
1944
  knowledgebase_ids=knowledgebase_ids,
1925
1945
  default_user_name=self.config.user_name,
1926
1946
  )
1947
+ logger.info(f"[search_by_fulltext] user_name_conditions: {user_name_conditions}")
1927
1948
 
1928
1949
  # Add OR condition if we have any user_name conditions
1929
1950
  if user_name_conditions:
@@ -1946,6 +1967,8 @@ class PolarDBGraphDB(BaseGraphDB):
1946
1967
 
1947
1968
  # Build filter conditions using common method
1948
1969
  filter_conditions = self._build_filter_conditions_sql(filter)
1970
+ logger.info(f"[search_by_fulltext] filter_conditions: {filter_conditions}")
1971
+
1949
1972
  where_clauses.extend(filter_conditions)
1950
1973
  # Add fulltext search condition
1951
1974
  # Convert query_text to OR query format: "word1 | word2 | word3"
@@ -1955,6 +1978,8 @@ class PolarDBGraphDB(BaseGraphDB):
1955
1978
 
1956
1979
  where_clause = f"WHERE {' AND '.join(where_clauses)}" if where_clauses else ""
1957
1980
 
1981
+ logger.info(f"[search_by_fulltext] where_clause: {where_clause}")
1982
+
1958
1983
  # Build fulltext search query
1959
1984
  query = f"""
1960
1985
  SELECT
@@ -1986,7 +2011,10 @@ class PolarDBGraphDB(BaseGraphDB):
1986
2011
  # Apply threshold filter if specified
1987
2012
  if threshold is None or score_val >= threshold:
1988
2013
  output.append({"id": id_val, "score": score_val})
1989
-
2014
+ elapsed_time = time.time() - start_time
2015
+ logger.info(
2016
+ f" polardb [search_by_fulltext] query completed time in {elapsed_time:.2f}s"
2017
+ )
1990
2018
  return output[:top_k]
1991
2019
  finally:
1992
2020
  self._return_connection(conn)
@@ -3394,6 +3422,8 @@ class PolarDBGraphDB(BaseGraphDB):
3394
3422
  "memory": memory,
3395
3423
  "created_at": created_at,
3396
3424
  "updated_at": updated_at,
3425
+ "delete_time": "",
3426
+ "delete_record_id": "",
3397
3427
  **metadata,
3398
3428
  }
3399
3429
 
@@ -3535,6 +3565,8 @@ class PolarDBGraphDB(BaseGraphDB):
3535
3565
  "memory": memory,
3536
3566
  "created_at": created_at,
3537
3567
  "updated_at": updated_at,
3568
+ "delete_time": "",
3569
+ "delete_record_id": "",
3538
3570
  **metadata,
3539
3571
  }
3540
3572
 
@@ -4281,7 +4313,7 @@ class PolarDBGraphDB(BaseGraphDB):
4281
4313
  user_name_conditions = []
4282
4314
  effective_user_name = user_name if user_name else default_user_name
4283
4315
 
4284
- if effective_user_name:
4316
+ if effective_user_name and default_user_name != "xxx":
4285
4317
  user_name_conditions.append(
4286
4318
  f"ag_catalog.agtype_access_operator(properties, '\"user_name\"'::agtype) = '\"{effective_user_name}\"'::agtype"
4287
4319
  )
@@ -51,7 +51,7 @@ class HFLLM(BaseLLM):
51
51
  self.config.model_name_or_path, torch_dtype="auto", device_map="auto"
52
52
  )
53
53
  self.tokenizer = AutoTokenizer.from_pretrained(
54
- self.config.model_name_or_path, use_fast=True
54
+ self.config.model_name_or_path, use_fast=True, force_download=True
55
55
  )
56
56
 
57
57
  # Logits processors for sampling
@@ -96,6 +96,7 @@ class MemFeedback(BaseMemFeedback):
96
96
  self.searcher: Searcher = None
97
97
  self.reranker = None
98
98
  self.pref_mem: SimplePreferenceTextMemory = None
99
+ self.pref_feedback: bool = False
99
100
  self.DB_IDX_READY = False
100
101
 
101
102
  @require_python_package(
@@ -630,11 +631,14 @@ class MemFeedback(BaseMemFeedback):
630
631
  )
631
632
  retrieved_mems = [item[0] for item in retrieved_mems if float(item[1]) > 0.01]
632
633
 
633
- pref_info = {}
634
- if "user_id" in info:
635
- pref_info = {"user_id": info["user_id"]}
636
- retrieved_prefs = self.pref_mem.search(query, top_k, pref_info)
637
- return retrieved_mems + retrieved_prefs
634
+ if self.pref_feedback:
635
+ pref_info = {}
636
+ if "user_id" in info:
637
+ pref_info = {"user_id": info["user_id"]}
638
+ retrieved_prefs = self.pref_mem.search(query, top_k, pref_info)
639
+ return retrieved_mems + retrieved_prefs
640
+ else:
641
+ return retrieved_mems
638
642
 
639
643
  def _vec_query(self, new_memories_embedding: list[float], user_name=None):
640
644
  """Vector retrieval query"""
@@ -25,6 +25,7 @@ class SimpleMemFeedback(MemFeedback):
25
25
  searcher: Searcher,
26
26
  reranker: BaseReranker,
27
27
  pref_mem: SimplePreferenceTextMemory,
28
+ pref_feedback: bool = False,
28
29
  ):
29
30
  self.llm = llm
30
31
  self.embedder = embedder
@@ -36,3 +37,4 @@ class SimpleMemFeedback(MemFeedback):
36
37
  self.pref_mem = pref_mem
37
38
  self.reranker = reranker
38
39
  self.DB_IDX_READY = False
40
+ self.pref_feedback = pref_feedback
@@ -151,6 +151,17 @@ class ImageParser(BaseMessageParser):
151
151
  IMAGE_ANALYSIS_PROMPT_ZH if lang == "zh" else IMAGE_ANALYSIS_PROMPT_EN
152
152
  )
153
153
 
154
+ # Add context if available
155
+ context_text = ""
156
+ if context_items:
157
+ for item in context_items:
158
+ if hasattr(item, "memory") and item.memory:
159
+ context_text += f"{item.memory}\n"
160
+ context_text = context_text.strip()
161
+
162
+ # Inject context into prompt when possible
163
+ image_analysis_prompt = image_analysis_prompt.replace("{context}", context_text)
164
+
154
165
  # Build messages with image content
155
166
  messages = [
156
167
  {
@@ -168,21 +179,6 @@ class ImageParser(BaseMessageParser):
168
179
  }
169
180
  ]
170
181
 
171
- # Add context if available
172
- if context_items:
173
- context_text = ""
174
- for item in context_items:
175
- if hasattr(item, "memory") and item.memory:
176
- context_text += f"{item.memory}\n"
177
- if context_text:
178
- messages.insert(
179
- 0,
180
- {
181
- "role": "system",
182
- "content": f"Context from previous conversation:\n{context_text}",
183
- },
184
- )
185
-
186
182
  try:
187
183
  # Call LLM with vision model
188
184
  response_text = self.llm.generate(messages)
@@ -192,6 +188,9 @@ class ImageParser(BaseMessageParser):
192
188
 
193
189
  # Parse JSON response
194
190
  response_json = self._parse_json_result(response_text)
191
+ if not response_json:
192
+ logger.warning(f"[ImageParser] Fail to parse response from LLM: {response_text}")
193
+ return []
195
194
 
196
195
  # Extract memory items from response
197
196
  memory_items = []
@@ -323,8 +322,7 @@ class ImageParser(BaseMessageParser):
323
322
  return json.loads(s)
324
323
  except json.JSONDecodeError:
325
324
  pass
326
- logger.error(f"[ImageParser] Failed to parse JSON: {e}\nResponse: {response_text}")
327
- return {}
325
+ logger.warning(f"[ImageParser] Failed to parse JSON: {e}\nResponse: {response_text}")
328
326
 
329
327
  def _create_memory_item(
330
328
  self,
@@ -97,7 +97,7 @@ def parse_json_result(response_text: str) -> dict:
97
97
  return json.loads(s)
98
98
  except json.JSONDecodeError:
99
99
  pass
100
- logger.error(f"[JSONParse] Failed to decode JSON: {e}\nRaw: {response_text}")
100
+ logger.warning(f"[JSONParse] Failed to decode JSON: {e}\nRaw: {response_text}")
101
101
  return {}
102
102
 
103
103
 
@@ -224,6 +224,22 @@ class SimpleStructMemReader(BaseMemReader, ABC):
224
224
  ),
225
225
  )
226
226
 
227
+ def _safe_generate(self, messages: list[dict]) -> str | None:
228
+ try:
229
+ return self.llm.generate(messages)
230
+ except Exception:
231
+ logger.exception("[LLM] Generation failed")
232
+ return None
233
+
234
+ def _safe_parse(self, text: str | None) -> dict | None:
235
+ if not text:
236
+ return None
237
+ try:
238
+ return parse_json_result(text)
239
+ except Exception:
240
+ logger.warning("[LLM] JSON parse failed")
241
+ return None
242
+
227
243
  def _get_llm_response(self, mem_str: str, custom_tags: list[str] | None) -> dict:
228
244
  lang = detect_lang(mem_str)
229
245
  template = PROMPT_DICT["chat"][lang]
@@ -240,13 +256,13 @@ class SimpleStructMemReader(BaseMemReader, ABC):
240
256
  if self.config.remove_prompt_example:
241
257
  prompt = prompt.replace(examples, "")
242
258
  messages = [{"role": "user", "content": prompt}]
243
- try:
244
- response_text = self.llm.generate(messages)
245
- response_json = parse_json_result(response_text)
246
- except Exception as e:
247
- logger.error(f"[LLM] Exception during chat generation: {e}")
248
- response_json = {
249
- "memory list": [
259
+
260
+ response_text = self._safe_generate(messages)
261
+ response_json = self._safe_parse(response_text)
262
+
263
+ if not response_json:
264
+ return {
265
+ "memory_list": [
250
266
  {
251
267
  "key": mem_str[:10],
252
268
  "memory_type": "UserMemory",
@@ -256,6 +272,7 @@ class SimpleStructMemReader(BaseMemReader, ABC):
256
272
  ],
257
273
  "summary": mem_str,
258
274
  }
275
+
259
276
  return response_json
260
277
 
261
278
  def _iter_chat_windows(self, scene_data_info, max_tokens=None, overlap=200):
@@ -70,7 +70,7 @@ def parse_json_result(response_text: str) -> dict:
70
70
  if "Invalid \\escape" in str(e):
71
71
  s = s.replace("\\", "\\\\")
72
72
  return json.loads(s)
73
- logger.error(
73
+ logger.warning(
74
74
  f"[JSONParse] Failed to decode JSON: {e}\nTail: Raw {response_text} \
75
75
  json: {s}"
76
76
  )