MemoryOS 0.2.2__tar.gz → 1.0.1__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.

Potentially problematic release.


This version of MemoryOS might be problematic. Click here for more details.

Files changed (188) hide show
  1. {memoryos-0.2.2 → memoryos-1.0.1}/PKG-INFO +7 -1
  2. {memoryos-0.2.2 → memoryos-1.0.1}/README.md +6 -0
  3. {memoryos-0.2.2 → memoryos-1.0.1}/pyproject.toml +1 -1
  4. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/__init__.py +1 -1
  5. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/api/config.py +31 -8
  6. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/api/context/context.py +1 -1
  7. memoryos-1.0.1/src/memos/api/context/context_thread.py +96 -0
  8. memoryos-1.0.1/src/memos/api/middleware/request_context.py +94 -0
  9. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/api/product_api.py +5 -1
  10. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/api/product_models.py +16 -0
  11. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/api/routers/product_router.py +39 -3
  12. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/api/start_api.py +3 -0
  13. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/internet_retriever.py +13 -0
  14. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/mem_scheduler.py +38 -16
  15. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/memory.py +13 -0
  16. memoryos-1.0.1/src/memos/configs/reranker.py +18 -0
  17. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/graph_dbs/base.py +33 -4
  18. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/graph_dbs/nebular.py +631 -236
  19. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/graph_dbs/neo4j.py +18 -7
  20. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/graph_dbs/neo4j_community.py +6 -3
  21. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/llms/vllm.py +2 -0
  22. memoryos-1.0.1/src/memos/log.py +195 -0
  23. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_os/core.py +49 -11
  24. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_os/main.py +1 -1
  25. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_os/product.py +392 -215
  26. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_os/utils/default_config.py +1 -1
  27. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_os/utils/format_utils.py +11 -47
  28. memoryos-1.0.1/src/memos/mem_os/utils/reference_utils.py +153 -0
  29. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_reader/simple_struct.py +112 -43
  30. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_scheduler/base_scheduler.py +58 -55
  31. {memoryos-0.2.2/src/memos/mem_scheduler/modules → memoryos-1.0.1/src/memos/mem_scheduler/general_modules}/base.py +1 -2
  32. {memoryos-0.2.2/src/memos/mem_scheduler/modules → memoryos-1.0.1/src/memos/mem_scheduler/general_modules}/dispatcher.py +54 -15
  33. {memoryos-0.2.2/src/memos/mem_scheduler/modules → memoryos-1.0.1/src/memos/mem_scheduler/general_modules}/rabbitmq_service.py +4 -4
  34. {memoryos-0.2.2/src/memos/mem_scheduler/modules → memoryos-1.0.1/src/memos/mem_scheduler/general_modules}/redis_service.py +1 -1
  35. {memoryos-0.2.2/src/memos/mem_scheduler/modules → memoryos-1.0.1/src/memos/mem_scheduler/general_modules}/retriever.py +19 -5
  36. {memoryos-0.2.2/src/memos/mem_scheduler/modules → memoryos-1.0.1/src/memos/mem_scheduler/general_modules}/scheduler_logger.py +10 -4
  37. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_scheduler/general_scheduler.py +110 -67
  38. memoryos-1.0.1/src/memos/mem_scheduler/monitors/dispatcher_monitor.py +305 -0
  39. memoryos-0.2.2/src/memos/mem_scheduler/modules/monitor.py → memoryos-1.0.1/src/memos/mem_scheduler/monitors/general_monitor.py +57 -19
  40. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_scheduler/mos_for_test_scheduler.py +7 -1
  41. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_scheduler/schemas/general_schemas.py +3 -2
  42. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_scheduler/schemas/message_schemas.py +2 -1
  43. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_scheduler/schemas/monitor_schemas.py +10 -2
  44. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_scheduler/utils/misc_utils.py +43 -2
  45. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_user/mysql_user_manager.py +4 -2
  46. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/activation/item.py +1 -1
  47. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/activation/kv.py +20 -8
  48. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/base.py +1 -1
  49. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/general.py +1 -1
  50. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/item.py +1 -1
  51. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/tree.py +31 -1
  52. memoryos-0.2.2/src/memos/memories/textual/tree_text_memory/organize/conflict.py → memoryos-1.0.1/src/memos/memories/textual/tree_text_memory/organize/handler.py +30 -48
  53. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/tree_text_memory/organize/manager.py +8 -96
  54. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +2 -0
  55. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +102 -140
  56. memoryos-1.0.1/src/memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +231 -0
  57. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +9 -0
  58. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +67 -10
  59. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +1 -1
  60. memoryos-1.0.1/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +344 -0
  61. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +7 -2
  62. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +7 -5
  63. memoryos-1.0.1/src/memos/memos_tools/lockfree_dict.py +120 -0
  64. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memos_tools/notification_utils.py +46 -0
  65. memoryos-1.0.1/src/memos/memos_tools/thread_safe_dict.py +288 -0
  66. memoryos-1.0.1/src/memos/reranker/__init__.py +4 -0
  67. memoryos-1.0.1/src/memos/reranker/base.py +24 -0
  68. memoryos-1.0.1/src/memos/reranker/cosine_local.py +95 -0
  69. memoryos-1.0.1/src/memos/reranker/factory.py +43 -0
  70. memoryos-1.0.1/src/memos/reranker/http_bge.py +99 -0
  71. memoryos-1.0.1/src/memos/reranker/noop.py +16 -0
  72. memoryos-1.0.1/src/memos/templates/mem_reader_prompts.py +419 -0
  73. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/templates/mem_scheduler_prompts.py +23 -10
  74. memoryos-1.0.1/src/memos/templates/mos_prompts.py +252 -0
  75. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/templates/tree_reorganize_prompts.py +24 -17
  76. memoryos-1.0.1/src/memos/utils.py +19 -0
  77. memoryos-1.0.1/src/memos/vec_dbs/__init__.py +0 -0
  78. memoryos-0.2.2/src/memos/log.py +0 -78
  79. memoryos-0.2.2/src/memos/memories/textual/tree_text_memory/organize/redundancy.py +0 -193
  80. memoryos-0.2.2/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +0 -232
  81. memoryos-0.2.2/src/memos/templates/mem_reader_prompts.py +0 -168
  82. memoryos-0.2.2/src/memos/templates/mos_prompts.py +0 -150
  83. {memoryos-0.2.2 → memoryos-1.0.1}/LICENSE +0 -0
  84. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/api/context/dependencies.py +0 -0
  85. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/api/exceptions.py +0 -0
  86. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/api/mcp_serve.py +0 -0
  87. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/api/routers/__init__.py +0 -0
  88. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/chunkers/__init__.py +0 -0
  89. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/chunkers/base.py +0 -0
  90. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/chunkers/factory.py +0 -0
  91. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/chunkers/sentence_chunker.py +0 -0
  92. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/cli.py +0 -0
  93. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/__init__.py +0 -0
  94. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/base.py +0 -0
  95. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/chunker.py +0 -0
  96. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/embedder.py +0 -0
  97. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/graph_db.py +0 -0
  98. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/llm.py +0 -0
  99. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/mem_chat.py +0 -0
  100. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/mem_cube.py +0 -0
  101. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/mem_os.py +0 -0
  102. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/mem_reader.py +0 -0
  103. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/mem_user.py +0 -0
  104. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/parser.py +0 -0
  105. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/utils.py +0 -0
  106. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/configs/vec_db.py +0 -0
  107. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/dependency.py +0 -0
  108. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/deprecation.py +0 -0
  109. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/embedders/__init__.py +0 -0
  110. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/embedders/ark.py +0 -0
  111. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/embedders/base.py +0 -0
  112. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/embedders/factory.py +0 -0
  113. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/embedders/ollama.py +0 -0
  114. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/embedders/sentence_transformer.py +0 -0
  115. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/embedders/universal_api.py +0 -0
  116. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/exceptions.py +0 -0
  117. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/graph_dbs/__init__.py +0 -0
  118. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/graph_dbs/factory.py +0 -0
  119. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/graph_dbs/item.py +0 -0
  120. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/hello_world.py +0 -0
  121. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/llms/__init__.py +0 -0
  122. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/llms/base.py +0 -0
  123. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/llms/deepseek.py +0 -0
  124. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/llms/factory.py +0 -0
  125. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/llms/hf.py +0 -0
  126. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/llms/hf_singleton.py +0 -0
  127. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/llms/ollama.py +0 -0
  128. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/llms/openai.py +0 -0
  129. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/llms/qwen.py +0 -0
  130. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/llms/utils.py +0 -0
  131. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_chat/__init__.py +0 -0
  132. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_chat/base.py +0 -0
  133. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_chat/factory.py +0 -0
  134. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_chat/simple.py +0 -0
  135. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_cube/__init__.py +0 -0
  136. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_cube/base.py +0 -0
  137. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_cube/general.py +0 -0
  138. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_cube/utils.py +0 -0
  139. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_os/client.py +0 -0
  140. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_reader/__init__.py +0 -0
  141. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_reader/base.py +0 -0
  142. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_reader/factory.py +0 -0
  143. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_reader/memory.py +0 -0
  144. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_scheduler/__init__.py +0 -0
  145. {memoryos-0.2.2/src/memos/mem_scheduler/modules → memoryos-1.0.1/src/memos/mem_scheduler/general_modules}/__init__.py +0 -0
  146. {memoryos-0.2.2/src/memos/mem_scheduler/modules → memoryos-1.0.1/src/memos/mem_scheduler/general_modules}/misc.py +0 -0
  147. {memoryos-0.2.2/src/memos/mem_scheduler/schemas → memoryos-1.0.1/src/memos/mem_scheduler/monitors}/__init__.py +0 -0
  148. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
  149. {memoryos-0.2.2/src/memos/mem_scheduler/utils → memoryos-1.0.1/src/memos/mem_scheduler/schemas}/__init__.py +0 -0
  150. {memoryos-0.2.2/src/memos/memories → memoryos-1.0.1/src/memos/mem_scheduler/utils}/__init__.py +0 -0
  151. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_scheduler/utils/filter_utils.py +0 -0
  152. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_user/factory.py +0 -0
  153. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_user/mysql_persistent_user_manager.py +0 -0
  154. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_user/persistent_factory.py +0 -0
  155. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_user/persistent_user_manager.py +0 -0
  156. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/mem_user/user_manager.py +0 -0
  157. {memoryos-0.2.2/src/memos/memories/activation → memoryos-1.0.1/src/memos/memories}/__init__.py +0 -0
  158. {memoryos-0.2.2/src/memos/memories/parametric → memoryos-1.0.1/src/memos/memories/activation}/__init__.py +0 -0
  159. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/activation/base.py +0 -0
  160. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/activation/vllmkv.py +0 -0
  161. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/base.py +0 -0
  162. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/factory.py +0 -0
  163. {memoryos-0.2.2/src/memos/memories/textual → memoryos-1.0.1/src/memos/memories/parametric}/__init__.py +0 -0
  164. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/parametric/base.py +0 -0
  165. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/parametric/item.py +0 -0
  166. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/parametric/lora.py +0 -0
  167. {memoryos-0.2.2/src/memos/memories/textual/tree_text_memory → memoryos-1.0.1/src/memos/memories/textual}/__init__.py +0 -0
  168. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/naive.py +0 -0
  169. {memoryos-0.2.2/src/memos/memories/textual/tree_text_memory/organize → memoryos-1.0.1/src/memos/memories/textual/tree_text_memory}/__init__.py +0 -0
  170. {memoryos-0.2.2/src/memos/memories/textual/tree_text_memory/retrieve → memoryos-1.0.1/src/memos/memories/textual/tree_text_memory/organize}/__init__.py +0 -0
  171. {memoryos-0.2.2/src/memos/parsers → memoryos-1.0.1/src/memos/memories/textual/tree_text_memory/retrieve}/__init__.py +0 -0
  172. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
  173. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
  174. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
  175. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
  176. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memos_tools/dinding_report_bot.py +0 -0
  177. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/memos_tools/notification_service.py +0 -0
  178. {memoryos-0.2.2/src/memos/templates → memoryos-1.0.1/src/memos/parsers}/__init__.py +0 -0
  179. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/parsers/base.py +0 -0
  180. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/parsers/factory.py +0 -0
  181. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/parsers/markitdown.py +0 -0
  182. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/settings.py +0 -0
  183. {memoryos-0.2.2/src/memos/vec_dbs → memoryos-1.0.1/src/memos/templates}/__init__.py +0 -0
  184. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/types.py +0 -0
  185. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/vec_dbs/base.py +0 -0
  186. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/vec_dbs/factory.py +0 -0
  187. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/vec_dbs/item.py +0 -0
  188. {memoryos-0.2.2 → memoryos-1.0.1}/src/memos/vec_dbs/qdrant.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: MemoryOS
3
- Version: 0.2.2
3
+ Version: 1.0.1
4
4
  Summary: Intelligence Begins with Memory
5
5
  License: Apache-2.0
6
6
  Keywords: memory,llm,language model,memoryOS,agent,kv cache,lora
@@ -310,6 +310,12 @@ MemOS is licensed under the [Apache 2.0 License](./LICENSE).
310
310
 
311
311
  Stay up to date with the latest MemOS announcements, releases, and community highlights.
312
312
 
313
+
314
+ - **2025-09-10** - 🎉 *MemOS v1.0.1 (Group Q&A Bot)*: Group Q&A bot based on MemOS Cube, updated KV-Cache performance comparison data across different GPU deployment schemes, optimized test benchmarks and statistics, added plaintext memory Reranker sorting, optimized plaintext memory hallucination issues, and Playground version updates. [Try PlayGround](https://memos-playground.openmem.net/login/)
315
+ - **2025-08-07** - 🎉 *MemOS v1.0.0 (MemCube Release)*: First MemCube with word game demo, LongMemEval evaluation, BochaAISearchRetriever integration, NebulaGraph support, enhanced search capabilities, and official Playground launch.
316
+ - **2025-07-29** – 🎉 *MemOS v0.2.2 (Nebula Update)*: Internet search+Nebula DB integration, refactored memory scheduler, KV Cache stress tests, MemCube Cookbook release (CN/EN), and 4b/1.7b/0.6b memory ops models.
317
+ - **2025-07-21** – 🎉 *MemOS v0.2.1 (Neo Release)*: Lightweight Neo version with plaintext+KV Cache functionality, Docker/multi-tenant support, MCP expansion, and new Cookbook/Mud game examples.
318
+ - **2025-07-11** – 🎉 *MemOS v0.2.0 (Cross-Platform)*: Added doc search/bilingual UI, MemReader-4B (local deploy), full Win/Mac/Linux support, and playground end-to-end connection.
313
319
  - **2025-07-07** – 🎉 *MemOS 1.0 (Stellar) Preview Release*: A SOTA Memory OS for LLMs is now open-sourced.
314
320
  - **2025-07-04** – 🎉 *MemOS Paper Released*: [MemOS: A Memory OS for AI System](https://arxiv.org/abs/2507.03724) was published on arXiv.
315
321
  - **2025-05-28** – 🎉 *Short Paper Uploaded*: [MemOS: An Operating System for Memory-Augmented Generation (MAG) in Large Language Models](https://arxiv.org/abs/2505.22101) was published on arXiv.
@@ -251,6 +251,12 @@ MemOS is licensed under the [Apache 2.0 License](./LICENSE).
251
251
 
252
252
  Stay up to date with the latest MemOS announcements, releases, and community highlights.
253
253
 
254
+
255
+ - **2025-09-10** - 🎉 *MemOS v1.0.1 (Group Q&A Bot)*: Group Q&A bot based on MemOS Cube, updated KV-Cache performance comparison data across different GPU deployment schemes, optimized test benchmarks and statistics, added plaintext memory Reranker sorting, optimized plaintext memory hallucination issues, and Playground version updates. [Try PlayGround](https://memos-playground.openmem.net/login/)
256
+ - **2025-08-07** - 🎉 *MemOS v1.0.0 (MemCube Release)*: First MemCube with word game demo, LongMemEval evaluation, BochaAISearchRetriever integration, NebulaGraph support, enhanced search capabilities, and official Playground launch.
257
+ - **2025-07-29** – 🎉 *MemOS v0.2.2 (Nebula Update)*: Internet search+Nebula DB integration, refactored memory scheduler, KV Cache stress tests, MemCube Cookbook release (CN/EN), and 4b/1.7b/0.6b memory ops models.
258
+ - **2025-07-21** – 🎉 *MemOS v0.2.1 (Neo Release)*: Lightweight Neo version with plaintext+KV Cache functionality, Docker/multi-tenant support, MCP expansion, and new Cookbook/Mud game examples.
259
+ - **2025-07-11** – 🎉 *MemOS v0.2.0 (Cross-Platform)*: Added doc search/bilingual UI, MemReader-4B (local deploy), full Win/Mac/Linux support, and playground end-to-end connection.
254
260
  - **2025-07-07** – 🎉 *MemOS 1.0 (Stellar) Preview Release*: A SOTA Memory OS for LLMs is now open-sourced.
255
261
  - **2025-07-04** – 🎉 *MemOS Paper Released*: [MemOS: A Memory OS for AI System](https://arxiv.org/abs/2507.03724) was published on arXiv.
256
262
  - **2025-05-28** – 🎉 *Short Paper Uploaded*: [MemOS: An Operating System for Memory-Augmented Generation (MAG) in Large Language Models](https://arxiv.org/abs/2505.22101) was published on arXiv.
@@ -4,7 +4,7 @@
4
4
  ##############################################################################
5
5
 
6
6
  name = "MemoryOS"
7
- version = "0.2.2"
7
+ version = "1.0.1"
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__ = "0.2.2"
1
+ __version__ = "1.0.1"
2
2
 
3
3
  from memos.configs.mem_cube import GeneralMemCubeConfig
4
4
  from memos.configs.mem_os import MOSConfig
@@ -90,6 +90,29 @@ class APIConfig:
90
90
  },
91
91
  }
92
92
 
93
+ @staticmethod
94
+ def get_reranker_config() -> dict[str, Any]:
95
+ """Get embedder configuration."""
96
+ embedder_backend = os.getenv("MOS_RERANKER_BACKEND", "http_bge")
97
+
98
+ if embedder_backend == "http_bge":
99
+ return {
100
+ "backend": "http_bge",
101
+ "config": {
102
+ "url": os.getenv("MOS_RERANKER_URL"),
103
+ "model": "bge-reranker-v2-m3",
104
+ "timeout": 10,
105
+ },
106
+ }
107
+ else:
108
+ return {
109
+ "backend": "cosine_local",
110
+ "config": {
111
+ "level_weights": {"topic": 1.0, "concept": 1.0, "fact": 1.0},
112
+ "level_field": "background",
113
+ },
114
+ }
115
+
93
116
  @staticmethod
94
117
  def get_embedder_config() -> dict[str, Any]:
95
118
  """Get embedder configuration."""
@@ -100,9 +123,9 @@ class APIConfig:
100
123
  "backend": "universal_api",
101
124
  "config": {
102
125
  "provider": os.getenv("MOS_EMBEDDER_PROVIDER", "openai"),
103
- "api_key": os.getenv("OPENAI_API_KEY", "sk-xxxx"),
126
+ "api_key": os.getenv("MOS_EMBEDDER_API_KEY", "sk-xxxx"),
104
127
  "model_name_or_path": os.getenv("MOS_EMBEDDER_MODEL", "text-embedding-3-large"),
105
- "base_url": os.getenv("OPENAI_API_BASE", "http://openai.com"),
128
+ "base_url": os.getenv("MOS_EMBEDDER_API_BASE", "http://openai.com"),
106
129
  },
107
130
  }
108
131
  else: # ollama
@@ -120,10 +143,9 @@ class APIConfig:
120
143
  def get_internet_config() -> dict[str, Any]:
121
144
  """Get embedder configuration."""
122
145
  return {
123
- "backend": "xinyu",
146
+ "backend": "bocha",
124
147
  "config": {
125
- "api_key": os.getenv("XINYU_API_KEY"),
126
- "search_engine_id": os.getenv("XINYU_SEARCH_ENGINE_ID"),
148
+ "api_key": os.getenv("BOCHA_API_KEY"),
127
149
  "max_results": 15,
128
150
  "num_per_request": 10,
129
151
  "reader": {
@@ -137,7 +159,7 @@ class APIConfig:
137
159
  "max_tokens": 5000,
138
160
  "top_p": 0.95,
139
161
  "top_k": 20,
140
- "api_key": "EMPTY",
162
+ "api_key": os.getenv("MEMRADER_API_KEY", "EMPTY"),
141
163
  "api_base": os.getenv("MEMRADER_API_BASE"),
142
164
  "remove_think_prefix": True,
143
165
  "extra_body": {"chat_template_kwargs": {"enable_thinking": False}},
@@ -252,7 +274,6 @@ class APIConfig:
252
274
  "backend": "general_scheduler",
253
275
  "config": {
254
276
  "top_k": int(os.getenv("MOS_SCHEDULER_TOP_K", "10")),
255
- "top_n": int(os.getenv("MOS_SCHEDULER_TOP_N", "5")),
256
277
  "act_mem_update_interval": int(
257
278
  os.getenv("MOS_SCHEDULER_ACT_MEM_UPDATE_INTERVAL", "300")
258
279
  ),
@@ -267,7 +288,7 @@ class APIConfig:
267
288
  "MOS_SCHEDULER_ENABLE_PARALLEL_DISPATCH", "true"
268
289
  ).lower()
269
290
  == "true",
270
- "enable_act_memory_update": True,
291
+ "enable_activation_memory": True,
271
292
  },
272
293
  }
273
294
 
@@ -494,6 +515,7 @@ class APIConfig:
494
515
  },
495
516
  "embedder": APIConfig.get_embedder_config(),
496
517
  "internet_retriever": internet_config,
518
+ "reranker": APIConfig.get_reranker_config(),
497
519
  },
498
520
  },
499
521
  "act_mem": {}
@@ -547,6 +569,7 @@ class APIConfig:
547
569
  "config": graph_db_backend_map[graph_db_backend],
548
570
  },
549
571
  "embedder": APIConfig.get_embedder_config(),
572
+ "reranker": APIConfig.get_reranker_config(),
550
573
  "reorganize": os.getenv("MOS_ENABLE_REORGANIZE", "false").lower()
551
574
  == "true",
552
575
  "internet_retriever": internet_config,
@@ -122,7 +122,7 @@ def set_trace_id_getter(getter: TraceIdGetter) -> None:
122
122
  Set a custom trace_id getter function.
123
123
 
124
124
  This allows the logging system to retrieve trace_id without importing
125
- API-specific modules.
125
+ API-specific general_modules.
126
126
  """
127
127
  global _trace_id_getter
128
128
  _trace_id_getter = getter
@@ -0,0 +1,96 @@
1
+ import functools
2
+ import threading
3
+
4
+ from collections.abc import Callable
5
+ from concurrent.futures import ThreadPoolExecutor
6
+ from typing import Any, TypeVar
7
+
8
+ from memos.api.context.context import (
9
+ RequestContext,
10
+ get_current_context,
11
+ get_current_trace_id,
12
+ set_request_context,
13
+ )
14
+
15
+
16
+ T = TypeVar("T")
17
+
18
+
19
+ class ContextThread(threading.Thread):
20
+ """
21
+ Thread class that automatically propagates the main thread's trace_id to child threads.
22
+ """
23
+
24
+ def __init__(self, target, args=(), kwargs=None, **thread_kwargs):
25
+ super().__init__(**thread_kwargs)
26
+ self.target = target
27
+ self.args = args
28
+ self.kwargs = kwargs or {}
29
+
30
+ self.main_trace_id = get_current_trace_id()
31
+ self.main_context = get_current_context()
32
+
33
+ def run(self):
34
+ # Create a new RequestContext with the main thread's trace_id
35
+ if self.main_context:
36
+ # Copy the context data
37
+ child_context = RequestContext(trace_id=self.main_trace_id)
38
+ child_context._data = self.main_context._data.copy()
39
+
40
+ # Set the context in the child thread
41
+ set_request_context(child_context)
42
+
43
+ # Run the target function
44
+ self.target(*self.args, **self.kwargs)
45
+
46
+
47
+ class ContextThreadPoolExecutor(ThreadPoolExecutor):
48
+ """
49
+ ThreadPoolExecutor that automatically propagates the main thread's trace_id to worker threads.
50
+ """
51
+
52
+ def submit(self, fn: Callable[..., T], *args: Any, **kwargs: Any) -> Any:
53
+ """
54
+ Submit a callable to be executed with the given arguments.
55
+ Automatically propagates the current thread's context to the worker thread.
56
+ """
57
+ main_trace_id = get_current_trace_id()
58
+ main_context = get_current_context()
59
+
60
+ @functools.wraps(fn)
61
+ def wrapper(*args: Any, **kwargs: Any) -> Any:
62
+ if main_context:
63
+ # Create and set new context in worker thread
64
+ child_context = RequestContext(trace_id=main_trace_id)
65
+ child_context._data = main_context._data.copy()
66
+ set_request_context(child_context)
67
+
68
+ return fn(*args, **kwargs)
69
+
70
+ return super().submit(wrapper, *args, **kwargs)
71
+
72
+ def map(
73
+ self,
74
+ fn: Callable[..., T],
75
+ *iterables: Any,
76
+ timeout: float | None = None,
77
+ chunksize: int = 1,
78
+ ) -> Any:
79
+ """
80
+ Returns an iterator equivalent to map(fn, iter).
81
+ Automatically propagates the current thread's context to worker threads.
82
+ """
83
+ main_trace_id = get_current_trace_id()
84
+ main_context = get_current_context()
85
+
86
+ @functools.wraps(fn)
87
+ def wrapper(*args: Any, **kwargs: Any) -> Any:
88
+ if main_context:
89
+ # Create and set new context in worker thread
90
+ child_context = RequestContext(trace_id=main_trace_id)
91
+ child_context._data = main_context._data.copy()
92
+ set_request_context(child_context)
93
+
94
+ return fn(*args, **kwargs)
95
+
96
+ return super().map(wrapper, *iterables, timeout=timeout, chunksize=chunksize)
@@ -0,0 +1,94 @@
1
+ """
2
+ Request context middleware for automatic trace_id injection.
3
+ """
4
+
5
+ import logging
6
+ import os
7
+
8
+ from collections.abc import Callable
9
+
10
+ from starlette.middleware.base import BaseHTTPMiddleware
11
+ from starlette.requests import Request
12
+ from starlette.responses import Response
13
+
14
+ from memos.api.context.context import RequestContext, set_request_context
15
+
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+ def generate_trace_id() -> str:
21
+ """Generate a random trace_id."""
22
+ return os.urandom(16).hex()
23
+
24
+
25
+ def extract_trace_id_from_headers(request: Request) -> str | None:
26
+ """Extract trace_id from various possible headers with priority: g-trace-id > x-trace-id > trace-id."""
27
+ trace_id = request.headers.get("g-trace-id")
28
+ if trace_id:
29
+ return trace_id
30
+
31
+ trace_id = request.headers.get("x-trace-id")
32
+ if trace_id:
33
+ return trace_id
34
+
35
+ trace_id = request.headers.get("trace-id")
36
+ if trace_id:
37
+ return trace_id
38
+
39
+ return None
40
+
41
+
42
+ class RequestContextMiddleware(BaseHTTPMiddleware):
43
+ """
44
+ Middleware to automatically inject request context for every HTTP request.
45
+
46
+ This middleware:
47
+ 1. Extracts trace_id from headers or generates a new one
48
+ 2. Creates a RequestContext and sets it globally
49
+ 3. Ensures the context is available throughout the request lifecycle
50
+ """
51
+
52
+ async def dispatch(self, request: Request, call_next: Callable) -> Response:
53
+ # Extract or generate trace_id
54
+ trace_id = extract_trace_id_from_headers(request)
55
+ if not trace_id:
56
+ trace_id = generate_trace_id()
57
+
58
+ # Create and set request context
59
+ context = RequestContext(trace_id=trace_id)
60
+ set_request_context(context)
61
+
62
+ # Add request metadata to context
63
+ context.set("method", request.method)
64
+ context.set("path", request.url.path)
65
+ context.set("client_ip", request.client.host if request.client else None)
66
+
67
+ # Log request start with parameters
68
+ params_log = {}
69
+
70
+ # Get query parameters
71
+ if request.query_params:
72
+ params_log["query_params"] = dict(request.query_params)
73
+
74
+ # Get request body if it's available
75
+ try:
76
+ params_log = await request.json()
77
+ except Exception as e:
78
+ logger.error(f"Error getting request body: {e}")
79
+ # If body is not JSON or empty, ignore it
80
+
81
+ logger.info(
82
+ f"Request started: {request.method} {request.url.path} - Parameters: {params_log}"
83
+ )
84
+
85
+ # Process the request
86
+ response = await call_next(request)
87
+
88
+ # Log request completion with output
89
+ logger.info(f"Request completed: {request.url.path}, status: {response.status_code}")
90
+
91
+ # Add trace_id to response headers for debugging
92
+ response.headers["x-trace-id"] = trace_id
93
+
94
+ return response
@@ -3,6 +3,7 @@ import logging
3
3
  from fastapi import FastAPI
4
4
 
5
5
  from memos.api.exceptions import APIExceptionHandler
6
+ from memos.api.middleware.request_context import RequestContextMiddleware
6
7
  from memos.api.routers.product_router import router as product_router
7
8
 
8
9
 
@@ -13,9 +14,12 @@ logger = logging.getLogger(__name__)
13
14
  app = FastAPI(
14
15
  title="MemOS Product REST APIs",
15
16
  description="A REST API for managing multiple users with MemOS Product.",
16
- version="1.0.0",
17
+ version="1.0.1",
17
18
  )
18
19
 
20
+ # Add request context middleware (must be added first)
21
+ app.add_middleware(RequestContextMiddleware)
22
+
19
23
  # Include routers
20
24
  app.include_router(product_router)
21
25
 
@@ -84,6 +84,21 @@ class ChatRequest(BaseRequest):
84
84
  mem_cube_id: str | None = Field(None, description="Cube ID to use for chat")
85
85
  history: list[MessageDict] | None = Field(None, description="Chat history")
86
86
  internet_search: bool = Field(True, description="Whether to use internet search")
87
+ moscube: bool = Field(False, description="Whether to use MemOSCube")
88
+
89
+
90
+ class ChatCompleteRequest(BaseRequest):
91
+ """Request model for chat operations."""
92
+
93
+ user_id: str = Field(..., description="User ID")
94
+ query: str = Field(..., description="Chat query message")
95
+ mem_cube_id: str | None = Field(None, description="Cube ID to use for chat")
96
+ history: list[MessageDict] | None = Field(None, description="Chat history")
97
+ internet_search: bool = Field(False, description="Whether to use internet search")
98
+ moscube: bool = Field(False, description="Whether to use MemOSCube")
99
+ base_prompt: str | None = Field(None, description="Base prompt to use for chat")
100
+ top_k: int = Field(10, description="Number of results to return")
101
+ threshold: float = Field(0.5, description="Threshold for filtering references")
87
102
 
88
103
 
89
104
  class UserCreate(BaseRequest):
@@ -161,3 +176,4 @@ class SuggestionRequest(BaseRequest):
161
176
 
162
177
  user_id: str = Field(..., description="User ID")
163
178
  language: Literal["zh", "en"] = Field("zh", description="Language for suggestions")
179
+ message: list[MessageDict] | None = Field(None, description="List of messages to store.")
@@ -1,5 +1,4 @@
1
1
  import json
2
- import logging
3
2
  import traceback
4
3
 
5
4
  from datetime import datetime
@@ -12,6 +11,7 @@ from memos.api.config import APIConfig
12
11
  from memos.api.context.dependencies import G, get_g_object
13
12
  from memos.api.product_models import (
14
13
  BaseResponse,
14
+ ChatCompleteRequest,
15
15
  ChatRequest,
16
16
  GetMemoryRequest,
17
17
  MemoryCreateRequest,
@@ -25,11 +25,12 @@ from memos.api.product_models import (
25
25
  UserRegisterResponse,
26
26
  )
27
27
  from memos.configs.mem_os import MOSConfig
28
+ from memos.log import get_logger
28
29
  from memos.mem_os.product import MOSProduct
29
30
  from memos.memos_tools.notification_service import get_error_bot_function, get_online_bot_function
30
31
 
31
32
 
32
- logger = logging.getLogger(__name__)
33
+ logger = get_logger(__name__)
33
34
 
34
35
  router = APIRouter(prefix="/product", tags=["Product API"])
35
36
 
@@ -148,7 +149,9 @@ def get_suggestion_queries_post(suggestion_req: SuggestionRequest):
148
149
  try:
149
150
  mos_product = get_mos_product_instance()
150
151
  suggestions = mos_product.get_suggestion_query(
151
- user_id=suggestion_req.user_id, language=suggestion_req.language
152
+ user_id=suggestion_req.user_id,
153
+ language=suggestion_req.language,
154
+ message=suggestion_req.message,
152
155
  )
153
156
  return SuggestionResponse(
154
157
  message="Suggestions retrieved successfully", data={"query": suggestions}
@@ -246,6 +249,7 @@ def chat(chat_req: ChatRequest):
246
249
  cube_id=chat_req.mem_cube_id,
247
250
  history=chat_req.history,
248
251
  internet_search=chat_req.internet_search,
252
+ moscube=chat_req.moscube,
249
253
  )
250
254
 
251
255
  except Exception as e:
@@ -273,6 +277,38 @@ def chat(chat_req: ChatRequest):
273
277
  raise HTTPException(status_code=500, detail=str(traceback.format_exc())) from err
274
278
 
275
279
 
280
+ @router.post("/chat/complete", summary="Chat with MemOS (Complete Response)")
281
+ def chat_complete(chat_req: ChatCompleteRequest):
282
+ """Chat with MemOS for a specific user. Returns complete response (non-streaming)."""
283
+ try:
284
+ mos_product = get_mos_product_instance()
285
+
286
+ # Collect all responses from the generator
287
+ content, references = mos_product.chat(
288
+ query=chat_req.query,
289
+ user_id=chat_req.user_id,
290
+ cube_id=chat_req.mem_cube_id,
291
+ history=chat_req.history,
292
+ internet_search=chat_req.internet_search,
293
+ moscube=chat_req.moscube,
294
+ base_prompt=chat_req.base_prompt,
295
+ top_k=chat_req.top_k,
296
+ threshold=chat_req.threshold,
297
+ )
298
+
299
+ # Return the complete response
300
+ return {
301
+ "message": "Chat completed successfully",
302
+ "data": {"response": content, "references": references},
303
+ }
304
+
305
+ except ValueError as err:
306
+ raise HTTPException(status_code=404, detail=str(traceback.format_exc())) from err
307
+ except Exception as err:
308
+ logger.error(f"Failed to start chat: {traceback.format_exc()}")
309
+ raise HTTPException(status_code=500, detail=str(traceback.format_exc())) from err
310
+
311
+
276
312
  @router.get("/users", summary="List all users", response_model=BaseResponse[list])
277
313
  def list_users():
278
314
  """List all registered users."""
@@ -9,6 +9,7 @@ from fastapi.requests import Request
9
9
  from fastapi.responses import JSONResponse, RedirectResponse
10
10
  from pydantic import BaseModel, Field
11
11
 
12
+ from memos.api.middleware.request_context import RequestContextMiddleware
12
13
  from memos.configs.mem_os import MOSConfig
13
14
  from memos.mem_os.main import MOS
14
15
  from memos.mem_user.user_manager import UserManager, UserRole
@@ -78,6 +79,8 @@ app = FastAPI(
78
79
  version="1.0.0",
79
80
  )
80
81
 
82
+ app.add_middleware(RequestContextMiddleware)
83
+
81
84
 
82
85
  class BaseRequest(BaseModel):
83
86
  """Base model for all requests."""
@@ -55,6 +55,18 @@ class XinyuSearchConfig(BaseInternetRetrieverConfig):
55
55
  )
56
56
 
57
57
 
58
+ class BochaSearchConfig(BaseInternetRetrieverConfig):
59
+ """Configuration class for Bocha Search API."""
60
+
61
+ max_results: int = Field(default=20, description="Maximum number of results to retrieve")
62
+ num_per_request: int = Field(default=10, description="Number of results per API request")
63
+ reader: MemReaderConfigFactory = Field(
64
+ ...,
65
+ default_factory=MemReaderConfigFactory,
66
+ description="Reader configuration",
67
+ )
68
+
69
+
58
70
  class InternetRetrieverConfigFactory(BaseConfig):
59
71
  """Factory class for creating internet retriever configurations."""
60
72
 
@@ -69,6 +81,7 @@ class InternetRetrieverConfigFactory(BaseConfig):
69
81
  "google": GoogleCustomSearchConfig,
70
82
  "bing": BingSearchConfig,
71
83
  "xinyu": XinyuSearchConfig,
84
+ "bocha": BochaSearchConfig,
72
85
  }
73
86
 
74
87
  @field_validator("backend")
@@ -6,7 +6,7 @@ from typing import Any, ClassVar
6
6
  from pydantic import ConfigDict, Field, field_validator, model_validator
7
7
 
8
8
  from memos.configs.base import BaseConfig
9
- from memos.mem_scheduler.modules.misc import DictConversionMixin
9
+ from memos.mem_scheduler.general_modules.misc import DictConversionMixin
10
10
  from memos.mem_scheduler.schemas.general_schemas import (
11
11
  BASE_DIR,
12
12
  DEFAULT_ACT_MEM_DUMP_PATH,
@@ -21,8 +21,6 @@ class BaseSchedulerConfig(BaseConfig):
21
21
  top_k: int = Field(
22
22
  default=10, description="Number of top candidates to consider in initial retrieval"
23
23
  )
24
- # TODO: The 'top_n' field is deprecated and will be removed in future versions.
25
- top_n: int = Field(default=5, description="Number of final results to return after processing")
26
24
  enable_parallel_dispatch: bool = Field(
27
25
  default=True, description="Whether to enable parallel message processing using thread pool"
28
26
  )
@@ -45,6 +43,7 @@ class BaseSchedulerConfig(BaseConfig):
45
43
 
46
44
 
47
45
  class GeneralSchedulerConfig(BaseSchedulerConfig):
46
+ model_config = ConfigDict(extra="ignore", strict=True)
48
47
  act_mem_update_interval: int | None = Field(
49
48
  default=300, description="Interval in seconds for updating activation memory"
50
49
  )
@@ -55,9 +54,15 @@ class GeneralSchedulerConfig(BaseSchedulerConfig):
55
54
  default=DEFAULT_ACT_MEM_DUMP_PATH, # Replace with DEFAULT_ACT_MEM_DUMP_PATH
56
55
  description="File path for dumping activation memory",
57
56
  )
58
- enable_act_memory_update: bool = Field(
57
+ enable_activation_memory: bool = Field(
59
58
  default=False, description="Whether to enable automatic activation memory updates"
60
59
  )
60
+ working_mem_monitor_capacity: int = Field(
61
+ default=30, description="Capacity of the working memory monitor"
62
+ )
63
+ activation_mem_monitor_capacity: int = Field(
64
+ default=20, description="Capacity of the activation memory monitor"
65
+ )
61
66
 
62
67
 
63
68
  class SchedulerConfigFactory(BaseConfig):
@@ -137,29 +142,46 @@ class AuthConfig(BaseConfig, DictConversionMixin):
137
142
  )
138
143
 
139
144
  @classmethod
140
- def from_local_yaml(cls, config_path: str | None = None) -> "AuthConfig":
145
+ def from_local_config(cls, config_path: str | Path | None = None) -> "AuthConfig":
141
146
  """
142
- Load configuration from YAML file
147
+ Load configuration from either a YAML or JSON file based on file extension.
148
+
149
+ Automatically detects file type (YAML or JSON) from the file extension
150
+ and uses the appropriate parser. If no path is provided, uses the default
151
+ configuration path (YAML) or its JSON counterpart.
143
152
 
144
153
  Args:
145
- config_path: Path to YAML configuration file
154
+ config_path: Optional path to configuration file.
155
+ If not provided, uses default configuration path.
146
156
 
147
157
  Returns:
148
- AuthConfig instance
158
+ AuthConfig instance populated with data from the configuration file.
149
159
 
150
160
  Raises:
151
- FileNotFoundError: If config file doesn't exist
152
- ValueError: If YAML parsing or validation fails
161
+ FileNotFoundError: If the specified or default configuration file does not exist.
162
+ ValueError: If file extension is not .yaml/.yml or .json, or if parsing fails.
153
163
  """
154
-
164
+ # Determine config path
155
165
  if config_path is None:
156
166
  config_path = cls.default_config_path
157
167
 
158
- # Check file exists
159
- if not Path(config_path).exists():
160
- raise FileNotFoundError(f"Config file not found: {config_path}")
161
-
162
- return cls.from_yaml_file(yaml_path=config_path)
168
+ # Validate file existence
169
+ config_path_obj = Path(config_path)
170
+ if not config_path_obj.exists():
171
+ raise FileNotFoundError(f"Configuration file not found: {config_path}")
172
+
173
+ # Get file extension and determine parser
174
+ file_ext = config_path_obj.suffix.lower()
175
+
176
+ if file_ext in (".yaml", ".yml"):
177
+ return cls.from_yaml_file(yaml_path=str(config_path_obj))
178
+ elif file_ext == ".json":
179
+ return cls.from_json_file(json_path=str(config_path_obj))
180
+ else:
181
+ raise ValueError(
182
+ f"Unsupported file format: {file_ext}. "
183
+ "Please use YAML (.yaml, .yml) or JSON (.json) files."
184
+ )
163
185
 
164
186
  def set_openai_config_to_environment(self):
165
187
  # Set environment variables
@@ -7,6 +7,7 @@ from memos.configs.embedder import EmbedderConfigFactory
7
7
  from memos.configs.graph_db import GraphDBConfigFactory
8
8
  from memos.configs.internet_retriever import InternetRetrieverConfigFactory
9
9
  from memos.configs.llm import LLMConfigFactory
10
+ from memos.configs.reranker import RerankerConfigFactory
10
11
  from memos.configs.vec_db import VectorDBConfigFactory
11
12
  from memos.exceptions import ConfigurationError
12
13
 
@@ -151,6 +152,10 @@ class TreeTextMemoryConfig(BaseTextMemoryConfig):
151
152
  default_factory=EmbedderConfigFactory,
152
153
  description="Embedder configuration for the memory embedding",
153
154
  )
155
+ reranker: RerankerConfigFactory | None = Field(
156
+ None,
157
+ description="Reranker configuration (optional, defaults to cosine_local).",
158
+ )
154
159
  graph_db: GraphDBConfigFactory = Field(
155
160
  ...,
156
161
  default_factory=GraphDBConfigFactory,
@@ -166,6 +171,14 @@ class TreeTextMemoryConfig(BaseTextMemoryConfig):
166
171
  description="Optional description for this memory configuration.",
167
172
  )
168
173
 
174
+ memory_size: dict[str, Any] | None = Field(
175
+ default=None,
176
+ description=(
177
+ "Maximum item counts per memory bucket, e.g.: "
178
+ '{"WorkingMemory": 20, "LongTermMemory": 10000, "UserMemory": 10000}'
179
+ ),
180
+ )
181
+
169
182
 
170
183
  # ─── 3. Global Memory Config Factory ──────────────────────────────────────────
171
184