MemoryOS 2.0.24__tar.gz → 2.0.25__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 (386) hide show
  1. {memoryos-2.0.24 → memoryos-2.0.25}/PKG-INFO +1 -1
  2. {memoryos-2.0.24 → memoryos-2.0.25}/pyproject.toml +1 -1
  3. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/__init__.py +1 -1
  4. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/client.py +13 -0
  5. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/config.py +95 -84
  6. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/__init__.py +2 -0
  7. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/component_init.py +4 -1
  8. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/config_builders.py +10 -0
  9. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/search_handler.py +96 -3
  10. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_reader.py +6 -1
  11. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_scheduler.py +18 -4
  12. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/parser.py +21 -6
  13. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/ark.py +2 -1
  14. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/base.py +55 -0
  15. memoryos-2.0.25/src/memos/embedders/cache.py +229 -0
  16. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/factory.py +6 -1
  17. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/ollama.py +2 -1
  18. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/sentence_transformer.py +2 -1
  19. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/universal_api.py +4 -20
  20. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/polardb.py +64 -7
  21. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/hello_world.py +1 -1
  22. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/log.py +72 -0
  23. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_feedback/feedback.py +21 -7
  24. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/multi_modal_struct.py +10 -2
  25. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/file_content_parser.py +47 -3
  26. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/multi_modal_parser.py +5 -2
  27. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/analyzer/eval_analyzer.py +3 -3
  28. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py +13 -1
  29. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +95 -5
  30. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +2 -8
  31. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/multi_mem_cube/single_cube.py +3 -4
  32. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/cosine_local.py +9 -1
  33. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mem_feedback_prompts.py +10 -12
  34. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mem_reader_prompts.py +34 -12
  35. {memoryos-2.0.24 → memoryos-2.0.25}/LICENSE +0 -0
  36. {memoryos-2.0.24 → memoryos-2.0.25}/README.md +0 -0
  37. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/__init__.py +0 -0
  38. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/context/dependencies.py +0 -0
  39. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/exceptions.py +0 -0
  40. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/add_handler.py +0 -0
  41. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/base_handler.py +0 -0
  42. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/chat_handler.py +0 -0
  43. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/cube_handler.py +0 -0
  44. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/feedback_handler.py +0 -0
  45. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/formatters_handler.py +0 -0
  46. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/memory_handler.py +0 -0
  47. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/scheduler_handler.py +0 -0
  48. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/suggestion_handler.py +0 -0
  49. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/lifecycle.py +0 -0
  50. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/mcp_serve.py +0 -0
  51. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/middleware/__init__.py +0 -0
  52. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/middleware/auth.py +0 -0
  53. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/middleware/rate_limit.py +0 -0
  54. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/middleware/request_context.py +0 -0
  55. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/product_models.py +0 -0
  56. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/routers/__init__.py +0 -0
  57. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/routers/admin_router.py +0 -0
  58. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/routers/server_router.py +0 -0
  59. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/server_api.py +0 -0
  60. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/server_api_ext.py +0 -0
  61. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/utils/__init__.py +0 -0
  62. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/utils/api_keys.py +0 -0
  63. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/__init__.py +0 -0
  64. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/base.py +0 -0
  65. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/charactertext_chunker.py +0 -0
  66. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/factory.py +0 -0
  67. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/markdown_chunker.py +0 -0
  68. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/sentence_chunker.py +0 -0
  69. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/simple_chunker.py +0 -0
  70. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/cli.py +0 -0
  71. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/__init__.py +0 -0
  72. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/base.py +0 -0
  73. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/chunker.py +0 -0
  74. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/embedder.py +0 -0
  75. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/graph_db.py +0 -0
  76. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/internet_retriever.py +0 -0
  77. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/llm.py +0 -0
  78. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_agent.py +0 -0
  79. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_chat.py +0 -0
  80. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_cube.py +0 -0
  81. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_os.py +0 -0
  82. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_user.py +0 -0
  83. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/memory.py +0 -0
  84. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/reranker.py +0 -0
  85. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/utils.py +0 -0
  86. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/vec_db.py +0 -0
  87. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/context/context.py +0 -0
  88. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dependency.py +0 -0
  89. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/deprecation.py +0 -0
  90. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/README.md +0 -0
  91. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/__init__.py +0 -0
  92. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/contextualization.py +0 -0
  93. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/enrichment.py +0 -0
  94. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/hook_defs.py +0 -0
  95. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/hooks.py +0 -0
  96. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/maintenance.py +0 -0
  97. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/__init__.py +0 -0
  98. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/base.py +0 -0
  99. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/diary.py +0 -0
  100. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/motive.py +0 -0
  101. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/persistence.py +0 -0
  102. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/reasoning.py +0 -0
  103. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/recall.py +0 -0
  104. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/plugin.py +0 -0
  105. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/prompts/__init__.py +0 -0
  106. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/prompts/context_binding_prompt.py +0 -0
  107. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/prompts/context_summary_prompt.py +0 -0
  108. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/prompts/motive_prompt.py +0 -0
  109. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/prompts/reasoning_prompt.py +0 -0
  110. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/routers/__init__.py +0 -0
  111. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/routers/diary_router.py +0 -0
  112. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/routers/trigger_router.py +0 -0
  113. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/routes.py +0 -0
  114. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/search.py +0 -0
  115. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/signal_store.py +0 -0
  116. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/types.py +0 -0
  117. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/__init__.py +0 -0
  118. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/exceptions.py +0 -0
  119. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/extras/__init__.py +0 -0
  120. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/__init__.py +0 -0
  121. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/base.py +0 -0
  122. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/factory.py +0 -0
  123. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/item.py +0 -0
  124. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/neo4j.py +0 -0
  125. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/neo4j_community.py +0 -0
  126. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/postgres.py +0 -0
  127. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/__init__.py +0 -0
  128. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/base.py +0 -0
  129. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/deepseek.py +0 -0
  130. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/factory.py +0 -0
  131. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/hf.py +0 -0
  132. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/hf_singleton.py +0 -0
  133. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/minimax.py +0 -0
  134. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/ollama.py +0 -0
  135. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/openai.py +0 -0
  136. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/openai_new.py +0 -0
  137. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/qwen.py +0 -0
  138. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/utils.py +0 -0
  139. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/vllm.py +0 -0
  140. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_agent/base.py +0 -0
  141. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_agent/deepsearch_agent.py +0 -0
  142. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_agent/factory.py +0 -0
  143. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_chat/__init__.py +0 -0
  144. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_chat/base.py +0 -0
  145. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_chat/factory.py +0 -0
  146. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_chat/simple.py +0 -0
  147. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_cube/__init__.py +0 -0
  148. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_cube/base.py +0 -0
  149. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_cube/general.py +0 -0
  150. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_cube/navie.py +0 -0
  151. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_cube/utils.py +0 -0
  152. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_feedback/base.py +0 -0
  153. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_feedback/simple_feedback.py +0 -0
  154. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_feedback/utils.py +0 -0
  155. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_os/core.py +0 -0
  156. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_os/main.py +0 -0
  157. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_os/utils/default_config.py +0 -0
  158. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_os/utils/format_utils.py +0 -0
  159. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_os/utils/reference_utils.py +0 -0
  160. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/__init__.py +0 -0
  161. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/base.py +0 -0
  162. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/factory.py +0 -0
  163. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/memory.py +0 -0
  164. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/__init__.py +0 -0
  165. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/assistant_parser.py +0 -0
  166. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/base.py +0 -0
  167. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/image_parser.py +0 -0
  168. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/string_parser.py +0 -0
  169. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/system_parser.py +0 -0
  170. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/text_content_parser.py +0 -0
  171. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/tool_parser.py +0 -0
  172. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/user_parser.py +0 -0
  173. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/utils.py +0 -0
  174. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_pref_memory/process_preference_memory.py +0 -0
  175. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_skill_memory/process_skill_memory.py +0 -0
  176. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_skill_memory/upload_skill_memory.py +0 -0
  177. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/simple_struct.py +0 -0
  178. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/strategy_struct.py +0 -0
  179. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/utils.py +0 -0
  180. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/__init__.py +0 -0
  181. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/analyzer/__init__.py +0 -0
  182. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/analyzer/api_analyzer.py +0 -0
  183. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +0 -0
  184. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/analyzer/scheduler_for_eval.py +0 -0
  185. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/base_mixins/__init__.py +0 -0
  186. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/base_mixins/memory_ops.py +0 -0
  187. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/base_mixins/queue_ops.py +0 -0
  188. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/base_mixins/web_log_ops.py +0 -0
  189. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/base_scheduler.py +0 -0
  190. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/__init__.py +0 -0
  191. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/api_misc.py +0 -0
  192. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/base.py +0 -0
  193. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/misc.py +0 -0
  194. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/scheduler_logger.py +0 -0
  195. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/task_threads.py +0 -0
  196. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_scheduler.py +0 -0
  197. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/__init__.py +0 -0
  198. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/activation_memory_manager.py +0 -0
  199. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/enhancement_pipeline.py +0 -0
  200. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/filter_pipeline.py +0 -0
  201. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/memory_filter.py +0 -0
  202. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/post_processor.py +0 -0
  203. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/rerank_pipeline.py +0 -0
  204. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/retriever.py +0 -0
  205. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/search_pipeline.py +0 -0
  206. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/search_service.py +0 -0
  207. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/monitors/__init__.py +0 -0
  208. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/monitors/dispatcher_monitor.py +0 -0
  209. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/monitors/general_monitor.py +0 -0
  210. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/monitors/task_schedule_monitor.py +0 -0
  211. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/optimized_scheduler.py +0 -0
  212. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/orm_modules/__init__.py +0 -0
  213. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/orm_modules/api_redis_model.py +0 -0
  214. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/orm_modules/base_model.py +0 -0
  215. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/orm_modules/monitor_models.py +0 -0
  216. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/orm_modules/redis_model.py +0 -0
  217. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
  218. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/__init__.py +0 -0
  219. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/analyzer_schemas.py +0 -0
  220. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/api_schemas.py +0 -0
  221. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/general_schemas.py +0 -0
  222. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/message_schemas.py +0 -0
  223. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/monitor_schemas.py +0 -0
  224. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/task_schemas.py +0 -0
  225. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
  226. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/base_handler.py +0 -0
  227. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/context.py +0 -0
  228. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +0 -0
  229. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/__init__.py +0 -0
  230. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/add_handler.py +0 -0
  231. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/answer_handler.py +0 -0
  232. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/feedback_handler.py +0 -0
  233. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_dream_handler.py +0 -0
  234. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_read_handler.py +0 -0
  235. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_reorganize_handler.py +0 -0
  236. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/memory_update_handler.py +0 -0
  237. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/pref_add_handler.py +0 -0
  238. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/query_handler.py +0 -0
  239. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +0 -0
  240. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/orchestrator.py +0 -0
  241. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +0 -0
  242. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/registry.py +0 -0
  243. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/task_queue.py +0 -0
  244. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/__init__.py +0 -0
  245. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/api_utils.py +0 -0
  246. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/config_utils.py +0 -0
  247. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/db_utils.py +0 -0
  248. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/filter_utils.py +0 -0
  249. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/metrics.py +0 -0
  250. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/misc_utils.py +0 -0
  251. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/monitor_event_utils.py +0 -0
  252. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/status_tracker.py +0 -0
  253. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/webservice_modules/__init__.py +0 -0
  254. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +0 -0
  255. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/webservice_modules/redis_service.py +0 -0
  256. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/factory.py +0 -0
  257. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/mysql_persistent_user_manager.py +0 -0
  258. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/mysql_user_manager.py +0 -0
  259. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/persistent_factory.py +0 -0
  260. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/persistent_user_manager.py +0 -0
  261. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/redis_persistent_user_manager.py +0 -0
  262. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/user_manager.py +0 -0
  263. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/__init__.py +0 -0
  264. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/activation/__init__.py +0 -0
  265. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/activation/base.py +0 -0
  266. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/activation/item.py +0 -0
  267. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/activation/kv.py +0 -0
  268. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/activation/vllmkv.py +0 -0
  269. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/base.py +0 -0
  270. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/factory.py +0 -0
  271. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/parametric/__init__.py +0 -0
  272. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/parametric/base.py +0 -0
  273. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/parametric/item.py +0 -0
  274. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/parametric/lora.py +0 -0
  275. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/__init__.py +0 -0
  276. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/base.py +0 -0
  277. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/general.py +0 -0
  278. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/item.py +0 -0
  279. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/naive.py +0 -0
  280. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/__init__.py +0 -0
  281. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/adder.py +0 -0
  282. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/config.py +0 -0
  283. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/extractor.py +0 -0
  284. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/factory.py +0 -0
  285. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/retrievers.py +0 -0
  286. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/spliter.py +0 -0
  287. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/utils.py +0 -0
  288. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/preference.py +0 -0
  289. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/simple_preference.py +0 -0
  290. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/simple_tree.py +0 -0
  291. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree.py +0 -0
  292. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/__init__.py +0 -0
  293. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
  294. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/organize/handler.py +0 -0
  295. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/organize/manager.py +0 -0
  296. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +0 -0
  297. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +0 -0
  298. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
  299. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +0 -0
  300. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +0 -0
  301. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +0 -0
  302. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
  303. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +0 -0
  304. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
  305. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +0 -0
  306. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
  307. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +0 -0
  308. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +0 -0
  309. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/tavilysearch.py +0 -0
  310. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +0 -0
  311. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
  312. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/dinding_report_bot.py +0 -0
  313. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/lockfree_dict.py +0 -0
  314. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/notification_service.py +0 -0
  315. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/notification_utils.py +0 -0
  316. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/singleton.py +0 -0
  317. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/thread_safe_dict.py +0 -0
  318. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/thread_safe_dict_segment.py +0 -0
  319. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/multi_mem_cube/__init__.py +0 -0
  320. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/multi_mem_cube/composite_cube.py +0 -0
  321. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/multi_mem_cube/views.py +0 -0
  322. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/parsers/__init__.py +0 -0
  323. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/parsers/base.py +0 -0
  324. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/parsers/factory.py +0 -0
  325. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/parsers/markitdown.py +0 -0
  326. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/README.md +0 -0
  327. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/__init__.py +0 -0
  328. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/base.py +0 -0
  329. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/component_bootstrap.py +0 -0
  330. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/hook_defs.py +0 -0
  331. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/hooks.py +0 -0
  332. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/manager.py +0 -0
  333. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/__init__.py +0 -0
  334. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/base.py +0 -0
  335. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/concat.py +0 -0
  336. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/factory.py +0 -0
  337. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/http_bge.py +0 -0
  338. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/http_bge_strategy.py +0 -0
  339. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/noop.py +0 -0
  340. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/__init__.py +0 -0
  341. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/base.py +0 -0
  342. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/concat_background.py +0 -0
  343. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/concat_docsource.py +0 -0
  344. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/dialogue_common.py +0 -0
  345. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/factory.py +0 -0
  346. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/single_turn.py +0 -0
  347. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/singleturn_outmem.py +0 -0
  348. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/search/__init__.py +0 -0
  349. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/search/search_service.py +0 -0
  350. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/settings.py +0 -0
  351. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/__init__.py +0 -0
  352. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/advanced_search_prompts.py +0 -0
  353. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/cloud_service_prompt.py +0 -0
  354. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/instruction_completion.py +0 -0
  355. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mem_agent_prompts.py +0 -0
  356. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mem_reader_strategy_prompts.py +0 -0
  357. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mem_scheduler_prompts.py +0 -0
  358. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mem_search_prompts.py +0 -0
  359. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mos_prompts.py +0 -0
  360. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/prefer_complete_prompt.py +0 -0
  361. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/skill_mem_prompt.py +0 -0
  362. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/tool_mem_prompts.py +0 -0
  363. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/tree_reorganize_prompts.py +0 -0
  364. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/__init__.py +0 -0
  365. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/general_types.py +0 -0
  366. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/__init__.py +0 -0
  367. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +0 -0
  368. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +0 -0
  369. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +0 -0
  370. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +0 -0
  371. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +0 -0
  372. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +0 -0
  373. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +0 -0
  374. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +0 -0
  375. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_message_param.py +0 -0
  376. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +0 -0
  377. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +0 -0
  378. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +0 -0
  379. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +0 -0
  380. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/utils.py +0 -0
  381. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/vec_dbs/__init__.py +0 -0
  382. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/vec_dbs/base.py +0 -0
  383. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/vec_dbs/factory.py +0 -0
  384. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/vec_dbs/item.py +0 -0
  385. {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/vec_dbs/milvus.py +0 -0
  386. {memoryos-2.0.24 → memoryos-2.0.25}/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.24
3
+ Version: 2.0.25
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.24"
7
+ version = "2.0.25"
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.24"
1
+ __version__ = "2.0.25"
2
2
 
3
3
  from memos.configs.mem_cube import GeneralMemCubeConfig
4
4
  from memos.configs.mem_os import MOSConfig
@@ -71,6 +71,18 @@ class MemOSClient:
71
71
  if bool(user_id) == bool(agent_id):
72
72
  raise ValueError("exactly one of user_id or agent_id is required")
73
73
 
74
+ @staticmethod
75
+ def _normalize_task_status_response(
76
+ response_data: dict[str, Any], task_id: str
77
+ ) -> dict[str, Any]:
78
+ data = response_data.get("data")
79
+ if not (isinstance(data, list) and len(data) == 1 and isinstance(data[0], dict)):
80
+ return response_data
81
+
82
+ normalized_data = data[0].copy()
83
+ normalized_data.setdefault("task_id", task_id)
84
+ return {**response_data, "data": normalized_data}
85
+
74
86
  def _post_json_dict(
75
87
  self, endpoint: str, payload: dict[str, Any], operation: str
76
88
  ) -> dict[str, Any] | None:
@@ -549,6 +561,7 @@ class MemOSClient:
549
561
  )
550
562
  response.raise_for_status()
551
563
  response_data = response.json()
564
+ response_data = self._normalize_task_status_response(response_data, task_id)
552
565
 
553
566
  return MemOSGetTaskStatusResponse(**response_data)
554
567
  except Exception as e:
@@ -260,13 +260,56 @@ NacosConfigManager.start_watch_if_enabled()
260
260
  class APIConfig:
261
261
  """Centralized configuration management for MemOS APIs."""
262
262
 
263
+ _OPENAI_API_BASE = "https://api.openai.com/v1"
264
+ _QWEN_API_BASE = "https://dashscope.aliyuncs.com/compatible-mode/v1"
265
+
266
+ @staticmethod
267
+ def _is_qwen_model(model_name: str) -> bool:
268
+ normalized_model = model_name.strip().lower()
269
+ return normalized_model.startswith("qwen") or "/qwen" in normalized_model
270
+
263
271
  @staticmethod
264
- def _preference_extractor_extra_body(model_name: str) -> dict[str, Any] | None:
272
+ def _qwen_flash_extra_body(model_name: str) -> dict[str, Any] | None:
265
273
  normalized_model = model_name.strip().lower()
266
274
  if normalized_model.startswith(("qwen3.5", "qwen3.6")):
267
275
  return {"enable_thinking": False}
268
276
  return None
269
277
 
278
+ @staticmethod
279
+ def _build_provider_llm_config(
280
+ model_name: str,
281
+ *,
282
+ temperature: float = 0.6,
283
+ max_tokens: int = 8000,
284
+ top_p: float = 0.95,
285
+ top_k: int = 20,
286
+ remove_think_prefix: bool = True,
287
+ ) -> dict[str, Any]:
288
+ """Build task LLM config from model name plus shared provider credentials.
289
+
290
+ MEMRADER_MODEL remains a dedicated fine-tuned extractor. Other task-specific
291
+ model knobs choose only the model; endpoint credentials come from either
292
+ QWEN_* or OPENAI_* according to the model family.
293
+ """
294
+ is_qwen = APIConfig._is_qwen_model(model_name)
295
+ config = {
296
+ "model_name_or_path": model_name,
297
+ "temperature": temperature,
298
+ "max_tokens": max_tokens,
299
+ "top_p": top_p,
300
+ "top_k": top_k,
301
+ "remove_think_prefix": remove_think_prefix,
302
+ "api_key": os.getenv("QWEN_API_KEY" if is_qwen else "OPENAI_API_KEY", "EMPTY"),
303
+ "api_base": os.getenv(
304
+ "QWEN_API_BASE" if is_qwen else "OPENAI_API_BASE",
305
+ APIConfig._QWEN_API_BASE if is_qwen else APIConfig._OPENAI_API_BASE,
306
+ ),
307
+ }
308
+ extra_body = APIConfig._qwen_flash_extra_body(model_name) if is_qwen else None
309
+ if extra_body is not None:
310
+ config["extra_body"] = extra_body
311
+ return {"backend": "qwen" if is_qwen else "openai", "config": config}
312
+
270
313
  @staticmethod
271
314
  def get_profile_memory_reserved_top_k() -> int:
272
315
  """Get profile-memory MMR reserve count.
@@ -293,7 +336,7 @@ class APIConfig:
293
336
  "top_k": int(os.getenv("MOS_TOP_K", "50")),
294
337
  "remove_think_prefix": True,
295
338
  "api_key": os.getenv("OPENAI_API_KEY", "your-api-key-here"),
296
- "api_base": os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
339
+ "api_base": os.getenv("OPENAI_API_BASE", APIConfig._OPENAI_API_BASE),
297
340
  }
298
341
 
299
342
  @staticmethod
@@ -357,7 +400,7 @@ class APIConfig:
357
400
 
358
401
  @staticmethod
359
402
  def get_memreader_config() -> dict[str, Any]:
360
- """Get MemReader configuration for chat/doc extraction (fine-tuned 0.6B model).
403
+ """Get the main MemReader configuration for text/chat extraction.
361
404
 
362
405
  When MEMREADER_GENERAL_MODEL is configured (i.e. a separate stable LLM exists),
363
406
  the backup client is automatically enabled so that primary failures (self-deployed
@@ -379,15 +422,11 @@ class APIConfig:
379
422
  general_model = os.getenv("MEMREADER_GENERAL_MODEL")
380
423
  enable_backup = os.getenv("MEMREADER_ENABLE_BACKUP", "false").lower() == "true"
381
424
  if general_model and enable_backup:
425
+ backup_config = APIConfig._build_provider_llm_config(general_model)["config"]
382
426
  config["backup_client"] = True
383
427
  config["backup_model_name_or_path"] = general_model
384
- config["backup_api_key"] = os.getenv(
385
- "MEMREADER_GENERAL_API_KEY", os.getenv("OPENAI_API_KEY", "EMPTY")
386
- )
387
- config["backup_api_base"] = os.getenv(
388
- "MEMREADER_GENERAL_API_BASE",
389
- os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
390
- )
428
+ config["backup_api_key"] = backup_config["api_key"]
429
+ config["backup_api_base"] = backup_config["api_base"]
391
430
 
392
431
  return {"backend": "openai", "config": config}
393
432
 
@@ -395,25 +434,17 @@ class APIConfig:
395
434
  def get_qwen_llm_config() -> dict[str, Any] | None:
396
435
  if not os.getenv("QWEN_API_KEY"):
397
436
  return None
398
- return {
399
- "backend": "qwen",
400
- "config": {
401
- "model_name_or_path": os.getenv("QWEN_MODEL", "qwen-flash"),
402
- "temperature": float(os.getenv("QWEN_TEMPERATURE", "0.8")),
403
- "max_tokens": int(os.getenv("QWEN_MAX_TOKENS", "8000")),
404
- "top_p": float(os.getenv("QWEN_TOP_P", "0.9")),
405
- "top_k": int(os.getenv("QWEN_TOP_K", "50")),
406
- "remove_think_prefix": os.getenv("QWEN_REMOVE_THINK_PREFIX", "true").lower()
407
- == "true",
408
- "api_key": os.getenv("QWEN_API_KEY", ""),
409
- "api_base": os.getenv("QWEN_API_BASE", ""),
410
- "model_schema": os.getenv("QWEN_MODEL_SCHEMA", "memos.configs.llm.QwenLLMConfig"),
411
- },
412
- }
437
+ return APIConfig._build_provider_llm_config(
438
+ os.getenv("QWEN_MODEL", "qwen-flash"),
439
+ temperature=0.8,
440
+ max_tokens=8000,
441
+ top_p=0.9,
442
+ top_k=50,
443
+ )
413
444
 
414
445
  @staticmethod
415
446
  def get_memreader_general_llm_config() -> dict[str, Any]:
416
- """Get general LLM configuration for non-chat/doc tasks.
447
+ """Get general LLM configuration for non-primary extraction tasks.
417
448
 
418
449
  Used for: hallucination filter, memory rewrite, memory merge,
419
450
  tool trajectory extraction, skill memory extraction.
@@ -428,24 +459,7 @@ class APIConfig:
428
459
  # Check if specific general model is configured
429
460
  general_model = os.getenv("MEMREADER_GENERAL_MODEL")
430
461
  if general_model:
431
- return {
432
- "backend": os.getenv("MEMREADER_GENERAL_BACKEND", "openai"),
433
- "config": {
434
- "model_name_or_path": general_model,
435
- "temperature": 0.6,
436
- "max_tokens": int(os.getenv("MEMREADER_GENERAL_MAX_TOKENS", "8000")),
437
- "top_p": 0.95,
438
- "top_k": 20,
439
- "api_key": os.getenv(
440
- "MEMREADER_GENERAL_API_KEY", os.getenv("OPENAI_API_KEY", "EMPTY")
441
- ),
442
- "api_base": os.getenv(
443
- "MEMREADER_GENERAL_API_BASE",
444
- os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
445
- ),
446
- "remove_think_prefix": True,
447
- },
448
- }
462
+ return APIConfig._build_provider_llm_config(general_model)
449
463
  # Fallback to memreader config (same behavior as before for users who don't customize)
450
464
  return APIConfig.get_memreader_config()
451
465
 
@@ -460,27 +474,28 @@ class APIConfig:
460
474
  """
461
475
  image_model = os.getenv("IMAGE_PARSER_MODEL")
462
476
  if image_model:
463
- return {
464
- "backend": os.getenv("IMAGE_PARSER_BACKEND", "openai"),
465
- "config": {
466
- "model_name_or_path": image_model,
467
- "temperature": 0.6,
468
- "max_tokens": int(os.getenv("IMAGE_PARSER_MAX_TOKENS", "4096")),
469
- "top_p": 0.95,
470
- "top_k": 20,
471
- "api_key": os.getenv(
472
- "IMAGE_PARSER_API_KEY", os.getenv("OPENAI_API_KEY", "EMPTY")
473
- ),
474
- "api_base": os.getenv(
475
- "IMAGE_PARSER_API_BASE",
476
- os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
477
- ),
478
- "remove_think_prefix": True,
479
- },
480
- }
477
+ return APIConfig._build_provider_llm_config(image_model, max_tokens=4096)
481
478
  # Fallback to general_llm config (which itself falls back to OpenAI)
482
479
  return APIConfig.get_memreader_general_llm_config()
483
480
 
481
+ @staticmethod
482
+ def get_document_parser_llm_config() -> dict[str, Any] | None:
483
+ """Get the dedicated LLM configuration for document extraction.
484
+
485
+ The provider endpoint and credentials are selected from QWEN_* or
486
+ OPENAI_* according to DOCUMENT_PARSER_MODEL.
487
+
488
+ Fallback chain: DOCUMENT_PARSER_MODEL -> MEMREADER_GENERAL_MODEL.
489
+ Returns None when neither model is configured.
490
+ """
491
+ document_model = os.getenv("DOCUMENT_PARSER_MODEL") or os.getenv("MEMREADER_GENERAL_MODEL")
492
+ if not document_model:
493
+ return None
494
+ return APIConfig._build_provider_llm_config(
495
+ document_model,
496
+ temperature=0.8,
497
+ )
498
+
484
499
  @staticmethod
485
500
  def get_preference_extractor_llm_config() -> dict[str, Any]:
486
501
  """Get LLM configuration for preference extraction.
@@ -491,31 +506,23 @@ class APIConfig:
491
506
  """
492
507
  pref_model = os.getenv("PREFERENCE_EXTRACTOR_MODEL")
493
508
  if pref_model:
494
- extra_body = APIConfig._preference_extractor_extra_body(pref_model)
495
- config = {
496
- "model_name_or_path": pref_model,
497
- "temperature": 0.6,
498
- "max_tokens": int(os.getenv("PREFERENCE_EXTRACTOR_MAX_TOKENS", "8000")),
499
- "top_p": 0.95,
500
- "top_k": 20,
501
- "api_key": os.getenv(
502
- "PREFERENCE_EXTRACTOR_API_KEY", os.getenv("OPENAI_API_KEY", "EMPTY")
503
- ),
504
- "api_base": os.getenv(
505
- "PREFERENCE_EXTRACTOR_API_BASE",
506
- os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
507
- ),
508
- "remove_think_prefix": True,
509
- }
510
- if extra_body is not None:
511
- config["extra_body"] = extra_body
512
- return {
513
- "backend": os.getenv("PREFERENCE_EXTRACTOR_BACKEND", "openai"),
514
- "config": config,
515
- }
509
+ return APIConfig._build_provider_llm_config(pref_model)
516
510
  # Fallback to general_llm config (which itself falls back to OpenAI)
517
511
  return APIConfig.get_memreader_general_llm_config()
518
512
 
513
+ @staticmethod
514
+ def get_feedback_llm_config() -> dict[str, Any]:
515
+ """Get LLM configuration for feedback processing.
516
+
517
+ Used for: feedback judgement, semantic add/update decisions, and update safety review.
518
+
519
+ Fallback chain: FEEDBACK_MODEL -> general_llm -> memreader config.
520
+ """
521
+ feedback_model = os.getenv("FEEDBACK_MODEL")
522
+ if feedback_model:
523
+ return APIConfig._build_provider_llm_config(feedback_model, temperature=0.8)
524
+ return APIConfig.get_memreader_general_llm_config()
525
+
519
526
  @staticmethod
520
527
  def get_activation_vllm_config() -> dict[str, Any]:
521
528
  """Get Ollama configuration."""
@@ -1005,6 +1012,8 @@ class APIConfig:
1005
1012
  "general_llm": APIConfig.get_memreader_general_llm_config(),
1006
1013
  # Image parser LLM (requires vision model)
1007
1014
  "image_parser_llm": APIConfig.get_image_parser_llm_config(),
1015
+ # Dedicated LLM for document chunk extraction
1016
+ "document_parser_llm": APIConfig.get_document_parser_llm_config(),
1008
1017
  # Preference extractor LLM. Reader falls back to general_llm when unset.
1009
1018
  "preference_extractor_llm": APIConfig.get_preference_extractor_llm_config()
1010
1019
  if os.getenv("PREFERENCE_EXTRACTOR_MODEL")
@@ -1138,6 +1147,8 @@ class APIConfig:
1138
1147
  "general_llm": APIConfig.get_memreader_general_llm_config(),
1139
1148
  # Image parser LLM (requires vision model)
1140
1149
  "image_parser_llm": APIConfig.get_image_parser_llm_config(),
1150
+ # Dedicated LLM for document chunk extraction
1151
+ "document_parser_llm": APIConfig.get_document_parser_llm_config(),
1141
1152
  # Preference extractor LLM. Reader falls back to general_llm when unset.
1142
1153
  "preference_extractor_llm": APIConfig.get_preference_extractor_llm_config()
1143
1154
  if os.getenv("PREFERENCE_EXTRACTOR_MODEL")
@@ -20,6 +20,7 @@ from memos.api.handlers import (
20
20
  from memos.api.handlers.component_init import init_server
21
21
  from memos.api.handlers.config_builders import (
22
22
  build_embedder_config,
23
+ build_feedback_llm_config,
23
24
  build_graph_db_config,
24
25
  build_internet_retriever_config,
25
26
  build_llm_config,
@@ -39,6 +40,7 @@ from memos.api.handlers.formatters_handler import (
39
40
  __all__ = [
40
41
  "add_handler",
41
42
  "build_embedder_config",
43
+ "build_feedback_llm_config",
42
44
  "build_graph_db_config",
43
45
  "build_internet_retriever_config",
44
46
  "build_llm_config",
@@ -13,6 +13,7 @@ from memos.api.config import APIConfig
13
13
  from memos.api.handlers.config_builders import (
14
14
  build_chat_llm_config,
15
15
  build_embedder_config,
16
+ build_feedback_llm_config,
16
17
  build_feedback_reranker_config,
17
18
  build_graph_db_config,
18
19
  build_internet_retriever_config,
@@ -156,6 +157,7 @@ def init_server() -> dict[str, Any]:
156
157
  # Build component configurations
157
158
  graph_db_config = build_graph_db_config()
158
159
  llm_config = build_llm_config()
160
+ feedback_llm_config = build_feedback_llm_config()
159
161
  chat_llm_config = build_chat_llm_config()
160
162
  playground_chat_llm_config = build_chat_llm_config("PLAYGROUND_CHAT_MODEL_LIST")
161
163
  embedder_config = build_embedder_config()
@@ -170,6 +172,7 @@ def init_server() -> dict[str, Any]:
170
172
  # Create component instances
171
173
  graph_db = GraphStoreFactory.from_config(graph_db_config)
172
174
  llm = LLMFactory.from_config(llm_config)
175
+ feedback_llm = LLMFactory.from_config(feedback_llm_config)
173
176
  chat_llms = (
174
177
  _init_chat_llms(chat_llm_config)
175
178
  if os.getenv("ENABLE_CHAT_API", "false") == "true"
@@ -260,7 +263,7 @@ def init_server() -> dict[str, Any]:
260
263
 
261
264
  # Initialize feedback server
262
265
  feedback_server = SimpleMemFeedback(
263
- llm=llm,
266
+ llm=feedback_llm,
264
267
  embedder=embedder,
265
268
  graph_store=graph_db,
266
269
  memory_manager=memory_manager,
@@ -157,6 +157,16 @@ def build_feedback_reranker_config() -> dict[str, Any]:
157
157
  return RerankerConfigFactory.model_validate(APIConfig.get_feedback_reranker_config())
158
158
 
159
159
 
160
+ def build_feedback_llm_config() -> dict[str, Any]:
161
+ """
162
+ Build feedback LLM configuration.
163
+
164
+ Returns:
165
+ Validated feedback LLM configuration dictionary
166
+ """
167
+ return LLMConfigFactory.model_validate(APIConfig.get_feedback_llm_config())
168
+
169
+
160
170
  def build_internet_retriever_config() -> dict[str, Any]:
161
171
  """
162
172
  Build internet retriever configuration.
@@ -16,7 +16,7 @@ from memos.api.handlers.base_handler import BaseHandler, HandlerDependencies
16
16
  from memos.api.handlers.formatters_handler import rerank_knowledge_mem
17
17
  from memos.api.product_models import APISearchRequest, SearchResponse
18
18
  from memos.dream.contextualization import CONTEXT_MEMORY_TYPE
19
- from memos.log import get_logger
19
+ from memos.log import get_logger, summarize_search_request, summarize_search_results
20
20
  from memos.memories.textual.tree_text_memory.retrieve.retrieve_utils import (
21
21
  cosine_similarity_matrix,
22
22
  )
@@ -32,6 +32,8 @@ logger = get_logger(__name__)
32
32
  _ENV_CONTEXT_RECALL = "MEMOS_DREAM_CONTEXT_RECALL"
33
33
  _ENV_CONTEXT_RECALL_TOP_K = "MEMOS_DREAM_CONTEXT_RECALL_TOP_K"
34
34
  _DEFAULT_CONTEXT_RECALL_TOP_K = 2
35
+ _ENV_MMR_CANDIDATE_PRUNING = "MEMOS_MMR_CANDIDATE_PRUNING_ENABLED"
36
+ _MMR_CANDIDATE_MULTIPLIER = 2
35
37
 
36
38
 
37
39
  def _env_enabled(name: str, default: str = "off") -> bool:
@@ -77,7 +79,10 @@ class SearchHandler(BaseHandler):
77
79
  Returns:
78
80
  SearchResponse with formatted results
79
81
  """
80
- self.logger.info(f"[SearchHandler] Search Req is: {search_req}")
82
+ self.logger.info(
83
+ "[SearchHandler] Search request summary: %s",
84
+ summarize_search_request(search_req),
85
+ )
81
86
 
82
87
  # Use deepcopy to avoid modifying the original request object
83
88
  search_req_local = copy.deepcopy(search_req)
@@ -137,7 +142,8 @@ class SearchHandler(BaseHandler):
137
142
  results = hooked_results
138
143
 
139
144
  self.logger.info(
140
- f"[SearchHandler] Final search results: count={len(results)} results={results}"
145
+ "[SearchHandler] Final search result summary: %s",
146
+ summarize_search_results(results),
141
147
  )
142
148
 
143
149
  return SearchResponse(
@@ -348,6 +354,12 @@ class SearchHandler(BaseHandler):
348
354
  if not text_buckets and not pref_buckets:
349
355
  return results
350
356
 
357
+ self._prune_mmr_candidates_by_bucket(
358
+ results,
359
+ text_top_k=text_top_k,
360
+ pref_top_k=pref_top_k,
361
+ )
362
+
351
363
  # Flatten all memories with their type and scores
352
364
  # flat structure: (memory_type, bucket_idx, mem, score)
353
365
  flat: list[tuple[str, int, dict[str, Any], float]] = []
@@ -552,6 +564,87 @@ class SearchHandler(BaseHandler):
552
564
 
553
565
  return results
554
566
 
567
+ def _prune_mmr_candidates_by_bucket(
568
+ self,
569
+ results: dict[str, Any],
570
+ *,
571
+ text_top_k: int,
572
+ pref_top_k: int,
573
+ ) -> dict[str, Any]:
574
+ """Keep at most twice the final quota for each memory type in each bucket."""
575
+ if not _env_enabled(_ENV_MMR_CANDIDATE_PRUNING, "off"):
576
+ return results
577
+
578
+ total_before = 0
579
+ total_after = 0
580
+ bucket_counts: list[tuple[int, int]] = []
581
+
582
+ for result_key, target_top_k in (
583
+ ("text_mem", text_top_k),
584
+ ("pref_mem", pref_top_k),
585
+ ):
586
+ buckets = results.get(result_key)
587
+ if not isinstance(buckets, list):
588
+ continue
589
+
590
+ candidate_limit = max(0, int(target_top_k)) * _MMR_CANDIDATE_MULTIPLIER
591
+ for bucket in buckets:
592
+ memories = bucket.get("memories") if isinstance(bucket, dict) else None
593
+ if not isinstance(memories, list):
594
+ continue
595
+
596
+ before_count = len(memories)
597
+ total_before += before_count
598
+ memories_by_type: dict[str, list[dict[str, Any]]] = {}
599
+ for memory in memories:
600
+ if not isinstance(memory, dict):
601
+ continue
602
+ metadata = memory.get("metadata")
603
+ memory_type = (
604
+ metadata.get("memory_type") if isinstance(metadata, dict) else None
605
+ )
606
+ memories_by_type.setdefault(str(memory_type or result_key), []).append(memory)
607
+
608
+ selected: list[dict[str, Any]] = []
609
+ if candidate_limit > 0:
610
+ for typed_memories in memories_by_type.values():
611
+ selected.extend(
612
+ sorted(
613
+ typed_memories,
614
+ key=self._mmr_candidate_score,
615
+ reverse=True,
616
+ )[:candidate_limit]
617
+ )
618
+ selected.sort(key=self._mmr_candidate_score, reverse=True)
619
+
620
+ bucket["memories"] = selected
621
+ if "total_nodes" in bucket:
622
+ bucket["total_nodes"] = len(selected)
623
+ total_after += len(selected)
624
+ bucket_counts.append((before_count, len(selected)))
625
+
626
+ self.logger.info(
627
+ "[SearchHandler] MMR candidate pruning: multiplier=%s before=%s after=%s "
628
+ "dropped=%s bucket_counts=%s",
629
+ _MMR_CANDIDATE_MULTIPLIER,
630
+ total_before,
631
+ total_after,
632
+ total_before - total_after,
633
+ bucket_counts,
634
+ )
635
+ return results
636
+
637
+ @staticmethod
638
+ def _mmr_candidate_score(memory: dict[str, Any]) -> float:
639
+ metadata = memory.get("metadata")
640
+ if not isinstance(metadata, dict):
641
+ return 0.0
642
+ score = metadata.get("score", metadata.get("relativity", 0.0))
643
+ try:
644
+ return float(score or 0.0)
645
+ except (TypeError, ValueError):
646
+ return 0.0
647
+
555
648
  @staticmethod
556
649
  def _is_unrelated(
557
650
  index: int,
@@ -25,7 +25,8 @@ class BaseMemReaderConfig(BaseConfig):
25
25
  return value
26
26
 
27
27
  llm: LLMConfigFactory = Field(
28
- ..., description="LLM configuration for chat/doc memory extraction (fine-tuned model)"
28
+ ...,
29
+ description="Main LLM configuration for standard text/chat memory extraction",
29
30
  )
30
31
  general_llm: LLMConfigFactory | None = Field(
31
32
  default=None,
@@ -36,6 +37,10 @@ class BaseMemReaderConfig(BaseConfig):
36
37
  default=None,
37
38
  description="Vision LLM for image parsing. Falls back to general_llm if not set.",
38
39
  )
40
+ document_parser_llm: LLMConfigFactory | None = Field(
41
+ default=None,
42
+ description="Dedicated LLM for document content extraction",
43
+ )
39
44
  preference_extractor_llm: LLMConfigFactory | None = Field(
40
45
  default=None,
41
46
  description="LLM for preference extraction. Falls back to general_llm if not set.",
@@ -212,6 +212,14 @@ class OpenAIConfig(BaseConfig, DictConversionMixin, EnvConfigMixin):
212
212
  base_url: str = Field(default="", description="Base URL for API endpoint")
213
213
  default_model: str = Field(default="", description="Default model to use")
214
214
 
215
+ @classmethod
216
+ def from_env(cls) -> "OpenAIConfig":
217
+ return cls(
218
+ api_key=os.getenv("OPENAI_API_KEY", ""),
219
+ base_url=os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
220
+ default_model=os.getenv("MEMSCHEDULER_OPENAI_DEFAULT_MODEL", "gpt-4o-mini"),
221
+ )
222
+
215
223
 
216
224
  class AuthConfig(BaseConfig, DictConversionMixin):
217
225
  rabbitmq: RabbitMQConfig | None = None
@@ -339,10 +347,16 @@ class AuthConfig(BaseConfig, DictConversionMixin):
339
347
  except (ValueError, Exception) as e:
340
348
  logger.warning(f"Failed to initialize RabbitMQ config from environment: {e}")
341
349
 
342
- # Try to initialize OpenAI config - check if any OpenAI env vars exist
350
+ # Try to initialize OpenAI config - shared credentials plus scheduler model override.
343
351
  try:
344
- openai_prefix = OpenAIConfig.get_env_prefix()
345
- has_openai_env = any(key.startswith(openai_prefix) for key in os.environ)
352
+ has_openai_env = any(
353
+ key in os.environ
354
+ for key in [
355
+ "OPENAI_API_KEY",
356
+ "OPENAI_API_BASE",
357
+ "MEMSCHEDULER_OPENAI_DEFAULT_MODEL",
358
+ ]
359
+ )
346
360
  if has_openai_env:
347
361
  openai_config = OpenAIConfig.from_env()
348
362
  logger.info("Successfully initialized OpenAI configuration")
@@ -375,7 +389,7 @@ class AuthConfig(BaseConfig, DictConversionMixin):
375
389
  # Set environment variables only if openai config is available
376
390
  if self.openai is not None:
377
391
  os.environ["OPENAI_API_KEY"] = self.openai.api_key
378
- os.environ["OPENAI_BASE_URL"] = self.openai.base_url
392
+ os.environ["OPENAI_API_BASE"] = self.openai.base_url
379
393
  os.environ["MODEL"] = self.openai.default_model
380
394
  else:
381
395
  logger = logging.getLogger(__name__)
@@ -17,7 +17,7 @@ class ParserConfigFactory(BaseConfig):
17
17
  """Factory class for creating Parser configurations."""
18
18
 
19
19
  backend: str = Field(..., description="Backend for parser")
20
- config: dict[str, Any] = Field(..., description="Configuration for the parser backend")
20
+ config: BaseParserConfig = Field(..., description="Configuration for the parser backend")
21
21
 
22
22
  backend_to_class: ClassVar[dict[str, Any]] = {
23
23
  "markitdown": MarkItDownParserConfig,
@@ -31,8 +31,23 @@ class ParserConfigFactory(BaseConfig):
31
31
  raise ValueError(f"Invalid backend: {backend}")
32
32
  return backend
33
33
 
34
- @model_validator(mode="after")
35
- def create_config(self) -> "ParserConfigFactory":
36
- config_class = self.backend_to_class[self.backend]
37
- self.config = config_class(**self.config)
38
- return self
34
+ @model_validator(mode="before")
35
+ @classmethod
36
+ def create_config(cls, data: Any) -> Any:
37
+ if not isinstance(data, dict):
38
+ return data
39
+
40
+ if "backend" not in data or "config" not in data:
41
+ return data
42
+
43
+ config_class = cls.backend_to_class.get(data["backend"])
44
+ if config_class is None:
45
+ return data
46
+
47
+ config = data.get("config")
48
+ if isinstance(config, config_class):
49
+ return data
50
+
51
+ data = data.copy()
52
+ data["config"] = config_class.model_validate(config)
53
+ return data
@@ -1,6 +1,6 @@
1
1
  from memos.configs.embedder import ArkEmbedderConfig
2
2
  from memos.dependency import require_python_package
3
- from memos.embedders.base import BaseEmbedder
3
+ from memos.embedders.base import BaseEmbedder, log_embedding_call
4
4
  from memos.log import get_logger
5
5
 
6
6
 
@@ -35,6 +35,7 @@ class ArkEmbedder(BaseEmbedder):
35
35
  # Initialize ark client
36
36
  self.client = Ark(api_key=self.config.api_key, base_url=self.config.api_base)
37
37
 
38
+ @log_embedding_call
38
39
  def embed(self, texts: list[str]) -> list[list[float]]:
39
40
  """
40
41
  Generate embeddings for the given texts.