MemoryOS 2.0.9__tar.gz → 2.0.10__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 (363) hide show
  1. {memoryos-2.0.9 → memoryos-2.0.10}/PKG-INFO +1 -1
  2. {memoryos-2.0.9 → memoryos-2.0.10}/pyproject.toml +20 -1
  3. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/__init__.py +1 -1
  4. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/config.py +35 -16
  5. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/component_init.py +4 -3
  6. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/llm.py +18 -6
  7. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_scheduler.py +4 -1
  8. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/neo4j_community.py +9 -2
  9. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/polardb.py +84 -79
  10. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/ollama.py +1 -1
  11. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/openai.py +60 -25
  12. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_feedback/feedback.py +0 -1
  13. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/core.py +1 -1
  14. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/multi_modal_struct.py +114 -12
  15. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_skill_memory/process_skill_memory.py +31 -3
  16. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py +1 -1
  17. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/general_schemas.py +1 -1
  18. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/organize/manager.py +0 -1
  19. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/multi_mem_cube/single_cube.py +1 -1
  20. {memoryos-2.0.9 → memoryos-2.0.10}/LICENSE +0 -0
  21. {memoryos-2.0.9 → memoryos-2.0.10}/README.md +0 -0
  22. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/README_api.md +0 -0
  23. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/__init__.py +0 -0
  24. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/client.py +0 -0
  25. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/context/dependencies.py +0 -0
  26. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/exceptions.py +0 -0
  27. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/__init__.py +0 -0
  28. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/add_handler.py +0 -0
  29. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/base_handler.py +0 -0
  30. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/chat_handler.py +0 -0
  31. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/config_builders.py +0 -0
  32. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/feedback_handler.py +0 -0
  33. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/formatters_handler.py +0 -0
  34. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/memory_handler.py +0 -0
  35. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/scheduler_handler.py +0 -0
  36. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/search_handler.py +0 -0
  37. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/suggestion_handler.py +0 -0
  38. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/mcp_serve.py +0 -0
  39. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/middleware/__init__.py +0 -0
  40. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/middleware/auth.py +0 -0
  41. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/middleware/rate_limit.py +0 -0
  42. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/middleware/request_context.py +0 -0
  43. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/product_api.py +0 -0
  44. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/product_models.py +0 -0
  45. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/routers/__init__.py +0 -0
  46. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/routers/admin_router.py +0 -0
  47. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/routers/product_router.py +0 -0
  48. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/routers/server_router.py +0 -0
  49. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/server_api.py +0 -0
  50. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/server_api_ext.py +0 -0
  51. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/start_api.py +0 -0
  52. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/utils/__init__.py +0 -0
  53. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/utils/api_keys.py +0 -0
  54. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/__init__.py +0 -0
  55. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/base.py +0 -0
  56. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/charactertext_chunker.py +0 -0
  57. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/factory.py +0 -0
  58. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/markdown_chunker.py +0 -0
  59. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/sentence_chunker.py +0 -0
  60. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/simple_chunker.py +0 -0
  61. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/cli.py +0 -0
  62. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/__init__.py +0 -0
  63. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/base.py +0 -0
  64. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/chunker.py +0 -0
  65. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/embedder.py +0 -0
  66. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/graph_db.py +0 -0
  67. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/internet_retriever.py +0 -0
  68. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_agent.py +0 -0
  69. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_chat.py +0 -0
  70. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_cube.py +0 -0
  71. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_os.py +0 -0
  72. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_reader.py +0 -0
  73. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_user.py +0 -0
  74. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/memory.py +0 -0
  75. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/parser.py +0 -0
  76. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/reranker.py +0 -0
  77. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/utils.py +0 -0
  78. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/vec_db.py +0 -0
  79. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/context/context.py +0 -0
  80. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/dependency.py +0 -0
  81. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/deprecation.py +0 -0
  82. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/__init__.py +0 -0
  83. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/ark.py +0 -0
  84. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/base.py +0 -0
  85. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/factory.py +0 -0
  86. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/ollama.py +0 -0
  87. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/sentence_transformer.py +0 -0
  88. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/universal_api.py +0 -0
  89. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/exceptions.py +0 -0
  90. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/__init__.py +0 -0
  91. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/__init__.py +0 -0
  92. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/client.py +0 -0
  93. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/server/README.md +0 -0
  94. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/server/__init__.py +0 -0
  95. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/server/config.py +0 -0
  96. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/server/handler.py +0 -0
  97. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/server/serve.py +0 -0
  98. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/types.py +0 -0
  99. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/__init__.py +0 -0
  100. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/base.py +0 -0
  101. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/factory.py +0 -0
  102. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/item.py +0 -0
  103. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/nebular.py +0 -0
  104. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/neo4j.py +0 -0
  105. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/postgres.py +0 -0
  106. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/hello_world.py +0 -0
  107. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/__init__.py +0 -0
  108. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/base.py +0 -0
  109. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/deepseek.py +0 -0
  110. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/factory.py +0 -0
  111. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/hf.py +0 -0
  112. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/hf_singleton.py +0 -0
  113. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/openai_new.py +0 -0
  114. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/qwen.py +0 -0
  115. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/utils.py +0 -0
  116. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/vllm.py +0 -0
  117. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/log.py +0 -0
  118. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_agent/base.py +0 -0
  119. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_agent/deepsearch_agent.py +0 -0
  120. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_agent/factory.py +0 -0
  121. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_chat/__init__.py +0 -0
  122. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_chat/base.py +0 -0
  123. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_chat/factory.py +0 -0
  124. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_chat/simple.py +0 -0
  125. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_cube/__init__.py +0 -0
  126. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_cube/base.py +0 -0
  127. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_cube/general.py +0 -0
  128. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_cube/navie.py +0 -0
  129. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_cube/utils.py +0 -0
  130. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_feedback/base.py +0 -0
  131. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_feedback/simple_feedback.py +0 -0
  132. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_feedback/utils.py +0 -0
  133. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/client.py +0 -0
  134. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/main.py +0 -0
  135. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/product.py +0 -0
  136. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/product_server.py +0 -0
  137. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/utils/default_config.py +0 -0
  138. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/utils/format_utils.py +0 -0
  139. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/utils/reference_utils.py +0 -0
  140. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/__init__.py +0 -0
  141. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/base.py +0 -0
  142. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/factory.py +0 -0
  143. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/memory.py +0 -0
  144. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/__init__.py +0 -0
  145. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/assistant_parser.py +0 -0
  146. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/base.py +0 -0
  147. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/file_content_parser.py +0 -0
  148. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/image_parser.py +0 -0
  149. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/multi_modal_parser.py +0 -0
  150. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/string_parser.py +0 -0
  151. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/system_parser.py +0 -0
  152. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/text_content_parser.py +0 -0
  153. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/tool_parser.py +0 -0
  154. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/user_parser.py +0 -0
  155. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/utils.py +0 -0
  156. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_pref_memory/process_preference_memory.py +0 -0
  157. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/simple_struct.py +0 -0
  158. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/strategy_struct.py +0 -0
  159. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/utils.py +0 -0
  160. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/__init__.py +0 -0
  161. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/analyzer/__init__.py +0 -0
  162. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/analyzer/api_analyzer.py +0 -0
  163. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/analyzer/eval_analyzer.py +0 -0
  164. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +0 -0
  165. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/analyzer/scheduler_for_eval.py +0 -0
  166. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/base_mixins/__init__.py +0 -0
  167. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/base_mixins/memory_ops.py +0 -0
  168. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/base_mixins/queue_ops.py +0 -0
  169. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/base_mixins/web_log_ops.py +0 -0
  170. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/base_scheduler.py +0 -0
  171. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/__init__.py +0 -0
  172. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/api_misc.py +0 -0
  173. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/base.py +0 -0
  174. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/misc.py +0 -0
  175. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/scheduler_logger.py +0 -0
  176. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/task_threads.py +0 -0
  177. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_scheduler.py +0 -0
  178. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/__init__.py +0 -0
  179. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/activation_memory_manager.py +0 -0
  180. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/enhancement_pipeline.py +0 -0
  181. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/filter_pipeline.py +0 -0
  182. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/memory_filter.py +0 -0
  183. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/post_processor.py +0 -0
  184. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/rerank_pipeline.py +0 -0
  185. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/retriever.py +0 -0
  186. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/search_pipeline.py +0 -0
  187. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/search_service.py +0 -0
  188. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/monitors/__init__.py +0 -0
  189. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/monitors/dispatcher_monitor.py +0 -0
  190. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/monitors/general_monitor.py +0 -0
  191. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/monitors/task_schedule_monitor.py +0 -0
  192. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/optimized_scheduler.py +0 -0
  193. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/orm_modules/__init__.py +0 -0
  194. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/orm_modules/api_redis_model.py +0 -0
  195. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/orm_modules/base_model.py +0 -0
  196. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/orm_modules/monitor_models.py +0 -0
  197. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/orm_modules/redis_model.py +0 -0
  198. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
  199. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/__init__.py +0 -0
  200. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/analyzer_schemas.py +0 -0
  201. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/api_schemas.py +0 -0
  202. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/message_schemas.py +0 -0
  203. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/monitor_schemas.py +0 -0
  204. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/task_schemas.py +0 -0
  205. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
  206. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/base_handler.py +0 -0
  207. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/context.py +0 -0
  208. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +0 -0
  209. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/__init__.py +0 -0
  210. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/add_handler.py +0 -0
  211. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/answer_handler.py +0 -0
  212. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/feedback_handler.py +0 -0
  213. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_read_handler.py +0 -0
  214. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_reorganize_handler.py +0 -0
  215. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/memory_update_handler.py +0 -0
  216. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/pref_add_handler.py +0 -0
  217. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/query_handler.py +0 -0
  218. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +0 -0
  219. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/orchestrator.py +0 -0
  220. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +0 -0
  221. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/registry.py +0 -0
  222. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/task_queue.py +0 -0
  223. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/__init__.py +0 -0
  224. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/api_utils.py +0 -0
  225. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/config_utils.py +0 -0
  226. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/db_utils.py +0 -0
  227. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/filter_utils.py +0 -0
  228. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/metrics.py +0 -0
  229. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/misc_utils.py +0 -0
  230. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/monitor_event_utils.py +0 -0
  231. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/status_tracker.py +0 -0
  232. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/webservice_modules/__init__.py +0 -0
  233. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +0 -0
  234. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/webservice_modules/redis_service.py +0 -0
  235. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/factory.py +0 -0
  236. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/mysql_persistent_user_manager.py +0 -0
  237. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/mysql_user_manager.py +0 -0
  238. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/persistent_factory.py +0 -0
  239. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/persistent_user_manager.py +0 -0
  240. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/redis_persistent_user_manager.py +0 -0
  241. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/user_manager.py +0 -0
  242. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/__init__.py +0 -0
  243. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/activation/__init__.py +0 -0
  244. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/activation/base.py +0 -0
  245. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/activation/item.py +0 -0
  246. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/activation/kv.py +0 -0
  247. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/activation/vllmkv.py +0 -0
  248. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/base.py +0 -0
  249. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/factory.py +0 -0
  250. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/parametric/__init__.py +0 -0
  251. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/parametric/base.py +0 -0
  252. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/parametric/item.py +0 -0
  253. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/parametric/lora.py +0 -0
  254. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/__init__.py +0 -0
  255. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/base.py +0 -0
  256. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/general.py +0 -0
  257. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/item.py +0 -0
  258. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/naive.py +0 -0
  259. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/__init__.py +0 -0
  260. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/adder.py +0 -0
  261. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/config.py +0 -0
  262. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/extractor.py +0 -0
  263. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/factory.py +0 -0
  264. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/retrievers.py +0 -0
  265. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/spliter.py +0 -0
  266. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/utils.py +0 -0
  267. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/preference.py +0 -0
  268. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/simple_preference.py +0 -0
  269. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/simple_tree.py +0 -0
  270. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree.py +0 -0
  271. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/__init__.py +0 -0
  272. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
  273. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/organize/handler.py +0 -0
  274. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/organize/history_manager.py +0 -0
  275. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +0 -0
  276. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +0 -0
  277. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
  278. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +0 -0
  279. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +0 -0
  280. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +0 -0
  281. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
  282. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +0 -0
  283. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/pre_update.py +0 -0
  284. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
  285. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +0 -0
  286. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +0 -0
  287. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
  288. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +0 -0
  289. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +0 -0
  290. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +0 -0
  291. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +0 -0
  292. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
  293. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/dinding_report_bot.py +0 -0
  294. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/lockfree_dict.py +0 -0
  295. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/notification_service.py +0 -0
  296. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/notification_utils.py +0 -0
  297. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/singleton.py +0 -0
  298. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/thread_safe_dict.py +0 -0
  299. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/thread_safe_dict_segment.py +0 -0
  300. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/multi_mem_cube/__init__.py +0 -0
  301. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/multi_mem_cube/composite_cube.py +0 -0
  302. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/multi_mem_cube/views.py +0 -0
  303. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/parsers/__init__.py +0 -0
  304. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/parsers/base.py +0 -0
  305. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/parsers/factory.py +0 -0
  306. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/parsers/markitdown.py +0 -0
  307. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/__init__.py +0 -0
  308. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/base.py +0 -0
  309. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/concat.py +0 -0
  310. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/cosine_local.py +0 -0
  311. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/factory.py +0 -0
  312. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/http_bge.py +0 -0
  313. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/http_bge_strategy.py +0 -0
  314. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/noop.py +0 -0
  315. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/__init__.py +0 -0
  316. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/base.py +0 -0
  317. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/concat_background.py +0 -0
  318. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/concat_docsource.py +0 -0
  319. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/dialogue_common.py +0 -0
  320. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/factory.py +0 -0
  321. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/single_turn.py +0 -0
  322. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/singleturn_outmem.py +0 -0
  323. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/search/__init__.py +0 -0
  324. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/search/search_service.py +0 -0
  325. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/settings.py +0 -0
  326. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/__init__.py +0 -0
  327. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/advanced_search_prompts.py +0 -0
  328. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/cloud_service_prompt.py +0 -0
  329. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/instruction_completion.py +0 -0
  330. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mem_agent_prompts.py +0 -0
  331. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mem_feedback_prompts.py +0 -0
  332. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mem_reader_prompts.py +0 -0
  333. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mem_reader_strategy_prompts.py +0 -0
  334. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mem_scheduler_prompts.py +0 -0
  335. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mem_search_prompts.py +0 -0
  336. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mos_prompts.py +0 -0
  337. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/prefer_complete_prompt.py +0 -0
  338. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/skill_mem_prompt.py +0 -0
  339. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/tool_mem_prompts.py +0 -0
  340. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/tree_reorganize_prompts.py +0 -0
  341. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/__init__.py +0 -0
  342. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/general_types.py +0 -0
  343. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/__init__.py +0 -0
  344. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +0 -0
  345. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +0 -0
  346. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +0 -0
  347. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +0 -0
  348. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +0 -0
  349. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +0 -0
  350. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +0 -0
  351. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +0 -0
  352. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_message_param.py +0 -0
  353. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +0 -0
  354. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +0 -0
  355. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +0 -0
  356. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +0 -0
  357. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/utils.py +0 -0
  358. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/vec_dbs/__init__.py +0 -0
  359. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/vec_dbs/base.py +0 -0
  360. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/vec_dbs/factory.py +0 -0
  361. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/vec_dbs/item.py +0 -0
  362. {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/vec_dbs/milvus.py +0 -0
  363. {memoryos-2.0.9 → memoryos-2.0.10}/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.9
3
+ Version: 2.0.10
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.9"
7
+ version = "2.0.10"
8
8
  description = "Intelligence Begins with Memory"
9
9
  license = {text = "Apache-2.0"}
10
10
  readme = "README.md"
@@ -170,6 +170,8 @@ optional = true
170
170
  [tool.poetry.group.test.dependencies]
171
171
  pytest = "^8.3.5"
172
172
  pytest-asyncio = "^0.23.5"
173
+ pytest-cov = "^6.1"
174
+ pytest-html = "^4.2"
173
175
  ruff = "^0.11.8"
174
176
 
175
177
  [tool.poetry.group.eval]
@@ -208,6 +210,23 @@ filterwarnings = [
208
210
  ]
209
211
 
210
212
 
213
+ [tool.coverage.run]
214
+ source = ["src/memos"]
215
+ branch = true
216
+
217
+ [tool.coverage.report]
218
+ show_missing = true
219
+ skip_empty = true
220
+ exclude_lines = [
221
+ "pragma: no cover",
222
+ "if TYPE_CHECKING:",
223
+ "if __name__ == .__main__.",
224
+ ]
225
+
226
+ [tool.coverage.html]
227
+ directory = "cov-report"
228
+
229
+
211
230
  [tool.ruff]
212
231
  ##############################################################################
213
232
  # Ruff is a fast Python linter and formatter.
@@ -1,4 +1,4 @@
1
- __version__ = "2.0.9"
1
+ __version__ = "2.0.10"
2
2
 
3
3
  from memos.configs.mem_cube import GeneralMemCubeConfig
4
4
  from memos.configs.mem_os import MOSConfig
@@ -321,23 +321,40 @@ class APIConfig:
321
321
 
322
322
  @staticmethod
323
323
  def get_memreader_config() -> dict[str, Any]:
324
- """Get MemReader configuration for chat/doc extraction (fine-tuned 0.6B model)."""
325
- return {
326
- "backend": "openai",
327
- "config": {
328
- "model_name_or_path": os.getenv("MEMRADER_MODEL", "gpt-4o-mini"),
329
- "temperature": 0.6,
330
- "max_tokens": int(os.getenv("MEMRADER_MAX_TOKENS", "8000")),
331
- "top_p": 0.95,
332
- "top_k": 20,
333
- "api_key": os.getenv("MEMRADER_API_KEY", "EMPTY"),
334
- # Default to OpenAI base URL when env var is not provided to satisfy pydantic
335
- # validation requirements during tests/import.
336
- "api_base": os.getenv("MEMRADER_API_BASE", "https://api.openai.com/v1"),
337
- "remove_think_prefix": True,
338
- },
324
+ """Get MemReader configuration for chat/doc extraction (fine-tuned 0.6B model).
325
+
326
+ When MEMREADER_GENERAL_MODEL is configured (i.e. a separate stable LLM exists),
327
+ the backup client is automatically enabled so that primary failures (self-deployed
328
+ model) fall back to the general LLM.
329
+ """
330
+ config = {
331
+ "model_name_or_path": os.getenv("MEMRADER_MODEL", "gpt-4o-mini"),
332
+ "temperature": 0.6,
333
+ "max_tokens": int(os.getenv("MEMRADER_MAX_TOKENS", "8000")),
334
+ "top_p": 0.95,
335
+ "top_k": 20,
336
+ "api_key": os.getenv("MEMRADER_API_KEY", "EMPTY"),
337
+ # Default to OpenAI base URL when env var is not provided to satisfy pydantic
338
+ # validation requirements during tests/import.
339
+ "api_base": os.getenv("MEMRADER_API_BASE", "https://api.openai.com/v1"),
340
+ "remove_think_prefix": True,
339
341
  }
340
342
 
343
+ general_model = os.getenv("MEMREADER_GENERAL_MODEL")
344
+ enable_backup = os.getenv("MEMREADER_ENABLE_BACKUP", "false").lower() == "true"
345
+ if general_model and enable_backup:
346
+ config["backup_client"] = True
347
+ config["backup_model_name_or_path"] = general_model
348
+ config["backup_api_key"] = os.getenv(
349
+ "MEMREADER_GENERAL_API_KEY", os.getenv("OPENAI_API_KEY", "EMPTY")
350
+ )
351
+ config["backup_api_base"] = os.getenv(
352
+ "MEMREADER_GENERAL_API_BASE",
353
+ os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
354
+ )
355
+
356
+ return {"backend": "openai", "config": config}
357
+
341
358
  @staticmethod
342
359
  def get_memreader_general_llm_config() -> dict[str, Any]:
343
360
  """Get general LLM configuration for non-chat/doc tasks.
@@ -837,7 +854,7 @@ class APIConfig:
837
854
  ),
838
855
  "context_window_size": int(os.getenv("MOS_SCHEDULER_CONTEXT_WINDOW_SIZE", "5")),
839
856
  "thread_pool_max_workers": int(
840
- os.getenv("MOS_SCHEDULER_THREAD_POOL_MAX_WORKERS", "10000")
857
+ os.getenv("MOS_SCHEDULER_THREAD_POOL_MAX_WORKERS", "200")
841
858
  ),
842
859
  "consume_interval_seconds": float(
843
860
  os.getenv("MOS_SCHEDULER_CONSUME_INTERVAL_SECONDS", "0.01")
@@ -850,6 +867,8 @@ class APIConfig:
850
867
  "MOS_SCHEDULER_ENABLE_ACTIVATION_MEMORY", "false"
851
868
  ).lower()
852
869
  == "true",
870
+ "use_redis_queue": os.getenv("MEMSCHEDULER_USE_REDIS_QUEUE", "False").lower()
871
+ == "true",
853
872
  },
854
873
  }
855
874
 
@@ -233,7 +233,7 @@ def init_server() -> dict[str, Any]:
233
233
  searcher: Searcher = tree_mem.get_searcher(
234
234
  manual_close_internet=os.getenv("ENABLE_INTERNET", "true").lower() == "false",
235
235
  moscube=False,
236
- process_llm=mem_reader.llm,
236
+ process_llm=mem_reader.general_llm,
237
237
  )
238
238
  logger.debug("Searcher created")
239
239
 
@@ -255,12 +255,13 @@ def init_server() -> dict[str, Any]:
255
255
  # Initialize Scheduler
256
256
  scheduler_config_dict = APIConfig.get_scheduler_config()
257
257
  scheduler_config = SchedulerConfigFactory(
258
- backend="optimized_scheduler", config=scheduler_config_dict
258
+ backend=scheduler_config_dict["backend"],
259
+ config=scheduler_config_dict["config"],
259
260
  )
260
261
  mem_scheduler: OptimizedScheduler = SchedulerFactory.from_config(scheduler_config)
261
262
  mem_scheduler.initialize_modules(
262
263
  chat_llm=llm,
263
- process_llm=mem_reader.llm,
264
+ process_llm=mem_reader.general_llm,
264
265
  db_engine=BaseDBManager.create_default_sqlite_engine(),
265
266
  mem_reader=mem_reader,
266
267
  redis_client=redis_client,
@@ -28,6 +28,22 @@ class OpenAILLMConfig(BaseLLMConfig):
28
28
  default="https://api.openai.com/v1", description="Base URL for OpenAI API"
29
29
  )
30
30
  extra_body: Any = Field(default=None, description="extra body")
31
+ backup_client: bool = Field(
32
+ default=False,
33
+ description="Whether to enable backup client for fallback on primary failure",
34
+ )
35
+ backup_api_key: str | None = Field(
36
+ default=None, description="API key for backup OpenAI-compatible endpoint"
37
+ )
38
+ backup_api_base: str | None = Field(
39
+ default=None, description="Base URL for backup OpenAI-compatible endpoint"
40
+ )
41
+ backup_model_name_or_path: str | None = Field(
42
+ default=None, description="Model name for backup endpoint"
43
+ )
44
+ backup_headers: dict[str, Any] | None = Field(
45
+ default=None, description="Default headers for backup client requests"
46
+ )
31
47
 
32
48
 
33
49
  class OpenAIResponsesLLMConfig(BaseLLMConfig):
@@ -42,22 +58,18 @@ class OpenAIResponsesLLMConfig(BaseLLMConfig):
42
58
  )
43
59
 
44
60
 
45
- class QwenLLMConfig(BaseLLMConfig):
46
- api_key: str = Field(..., description="API key for DashScope (Qwen)")
61
+ class QwenLLMConfig(OpenAILLMConfig):
47
62
  api_base: str = Field(
48
63
  default="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
49
64
  description="Base URL for Qwen OpenAI-compatible API",
50
65
  )
51
- extra_body: Any = Field(default=None, description="extra body")
52
66
 
53
67
 
54
- class DeepSeekLLMConfig(BaseLLMConfig):
55
- api_key: str = Field(..., description="API key for DeepSeek")
68
+ class DeepSeekLLMConfig(OpenAILLMConfig):
56
69
  api_base: str = Field(
57
70
  default="https://api.deepseek.com",
58
71
  description="Base URL for DeepSeek OpenAI-compatible API",
59
72
  )
60
- extra_body: Any = Field(default=None, description="Extra options for API")
61
73
 
62
74
 
63
75
  class AzureLLMConfig(BaseLLMConfig):
@@ -155,7 +155,10 @@ class SchedulerConfigFactory(BaseConfig):
155
155
  @model_validator(mode="after")
156
156
  def create_config(self) -> "SchedulerConfigFactory":
157
157
  config_class = self.backend_to_class[self.backend]
158
- self.config = config_class(**self.config)
158
+ raw = self.config
159
+ if isinstance(raw, dict) and "config" in raw and "use_redis_queue" not in raw:
160
+ raw = raw["config"]
161
+ self.config = config_class(**raw)
159
162
  return self
160
163
 
161
164
 
@@ -721,6 +721,8 @@ class Neo4jCommunityGraphDB(Neo4jGraphDB):
721
721
  user_name: str | None = None,
722
722
  filter: dict | None = None,
723
723
  knowledgebase_ids: list[str] | None = None,
724
+ user_name_flag: bool = True,
725
+ status: str | None = None,
724
726
  ) -> list[str]:
725
727
  """
726
728
  Retrieve node IDs that match given metadata filters.
@@ -745,15 +747,20 @@ class Neo4jCommunityGraphDB(Neo4jGraphDB):
745
747
  - Can be used for faceted recall or prefiltering before embedding rerank.
746
748
  """
747
749
  logger.info(
748
- f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids}"
750
+ f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids},status: {status}"
749
751
  )
750
752
  print(
751
- f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids}"
753
+ f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids},status: {status}"
752
754
  )
753
755
  user_name = user_name if user_name else self.config.user_name
754
756
  where_clauses = []
755
757
  params = {}
756
758
 
759
+ # Add status filter if provided
760
+ if status:
761
+ where_clauses.append("n.status = $status")
762
+ params["status"] = status
763
+
757
764
  for i, f in enumerate(filters):
758
765
  field = f["field"]
759
766
  op = f.get("op", "=")
@@ -432,14 +432,13 @@ class PolarDBGraphDB(BaseGraphDB):
432
432
  def remove_oldest_memory(
433
433
  self, memory_type: str, keep_latest: int, user_name: str | None = None
434
434
  ) -> None:
435
- """
436
- Remove all WorkingMemory nodes except the latest `keep_latest` entries.
437
-
438
- Args:
439
- memory_type (str): Memory type (e.g., 'WorkingMemory', 'LongTermMemory').
440
- keep_latest (int): Number of latest WorkingMemory entries to keep.
441
- user_name (str, optional): User name for filtering in non-multi-db mode
442
- """
435
+ start_time = time.perf_counter()
436
+ logger.info(
437
+ "remove_oldest_memory by memory_type:%s,keep_latest: %s,user_name:%s",
438
+ memory_type,
439
+ keep_latest,
440
+ user_name,
441
+ )
443
442
  user_name = user_name if user_name else self._get_config_value("user_name")
444
443
 
445
444
  # Use actual OFFSET logic, consistent with nebular.py
@@ -456,6 +455,9 @@ class PolarDBGraphDB(BaseGraphDB):
456
455
  self.format_param_value(user_name),
457
456
  keep_latest,
458
457
  ]
458
+ logger.info(
459
+ f"remove_oldest_memory by select_query:{select_query},select_params:{select_params}"
460
+ )
459
461
  try:
460
462
  with self._get_connection() as conn, conn.cursor() as cursor:
461
463
  # Execute query to get IDs to delete
@@ -482,6 +484,8 @@ class PolarDBGraphDB(BaseGraphDB):
482
484
  f"keeping {keep_latest} latest for user {user_name}, "
483
485
  f"removed ids: {ids_to_delete}"
484
486
  )
487
+ elapsed = (time.perf_counter() - start_time) * 1000.0
488
+ logger.info("remove_oldest_memory internal took %.1f ms", elapsed)
485
489
  except Exception as e:
486
490
  logger.error(f"[remove_oldest_memory] Failed: {e}", exc_info=True)
487
491
  raise
@@ -1840,9 +1844,8 @@ class PolarDBGraphDB(BaseGraphDB):
1840
1844
  **kwargs,
1841
1845
  ) -> list[dict]:
1842
1846
  logger.info(
1843
- "search_by_embedding user_name:%s,filter: %s, knowledgebase_ids: %s,scope:%s,status:%s,search_filter:%s,filter:%s,knowledgebase_ids:%s,return_fields:%s",
1847
+ "search_by_embedding by user_name:%s,knowledgebase_ids: %s,scope:%s,status:%s,search_filter:%s,filter:%s,knowledgebase_ids:%s,return_fields:%s",
1844
1848
  user_name,
1845
- filter,
1846
1849
  knowledgebase_ids,
1847
1850
  scope,
1848
1851
  status,
@@ -1895,20 +1898,21 @@ class PolarDBGraphDB(BaseGraphDB):
1895
1898
  where_clause = f"WHERE {' AND '.join(where_clauses)}" if where_clauses else ""
1896
1899
 
1897
1900
  query = f"""
1901
+ set hnsw.ef_search = 100;set hnsw.iterative_scan = relaxed_order;
1898
1902
  WITH t AS (
1899
1903
  SELECT id,
1900
1904
  properties,
1901
1905
  timeline,
1902
1906
  ag_catalog.agtype_access_operator(properties, '"id"'::agtype) AS old_id,
1903
- (1 - (embedding <=> %s::vector(1024))) AS scope
1907
+ (embedding <=> %s::vector(1024)) AS scope_distance
1904
1908
  FROM "{self.db_name}_graph"."Memory"
1905
1909
  {where_clause}
1906
- ORDER BY scope DESC
1910
+ ORDER BY scope_distance ASC
1907
1911
  LIMIT {top_k}
1908
1912
  )
1909
- SELECT *
1913
+ SELECT *,(1 - scope_distance) AS scope
1910
1914
  FROM t
1911
- WHERE scope > 0.1;
1915
+ WHERE scope_distance < 0.9;
1912
1916
  """
1913
1917
  vector_str = convert_to_vector(vector)
1914
1918
  query = query.replace("%s::vector(1024)", f"'{vector_str}'::vector(1024)")
@@ -1953,7 +1957,7 @@ class PolarDBGraphDB(BaseGraphDB):
1953
1957
  output.append(item)
1954
1958
  elapsed_time = (time.perf_counter() - start_time) * 1000.0
1955
1959
  logger.info(
1956
- "search_by_embedding query embedding completed time took %.1f ms", elapsed_time
1960
+ "search_by_embedding query by embedding completed time took %.1f ms", elapsed_time
1957
1961
  )
1958
1962
  return output[:top_k]
1959
1963
 
@@ -1966,30 +1970,13 @@ class PolarDBGraphDB(BaseGraphDB):
1966
1970
  knowledgebase_ids: list | None = None,
1967
1971
  user_name_flag: bool = True,
1968
1972
  ) -> list[str]:
1969
- """
1970
- Retrieve node IDs that match given metadata filters.
1971
- Supports exact match.
1972
-
1973
- Args:
1974
- filters: List of filter dicts like:
1975
- [
1976
- {"field": "key", "op": "in", "value": ["A", "B"]},
1977
- {"field": "confidence", "op": ">=", "value": 80},
1978
- {"field": "tags", "op": "contains", "value": "AI"},
1979
- ...
1980
- ]
1981
- user_name (str, optional): User name for filtering in non-multi-db mode
1982
-
1983
- Returns:
1984
- list[str]: Node IDs whose metadata match the filter conditions. (AND logic).
1985
- """
1973
+ start_time = time.perf_counter()
1986
1974
  logger.info(
1987
1975
  f" get_by_metadata user_name:{user_name},filter: {filter}, knowledgebase_ids: {knowledgebase_ids},filters:{filters}"
1988
1976
  )
1989
1977
 
1990
1978
  user_name = user_name if user_name else self._get_config_value("user_name")
1991
1979
 
1992
- # Build WHERE conditions for cypher query
1993
1980
  where_conditions = []
1994
1981
 
1995
1982
  for f in filters:
@@ -1997,18 +1984,13 @@ class PolarDBGraphDB(BaseGraphDB):
1997
1984
  op = f.get("op", "=")
1998
1985
  value = f["value"]
1999
1986
 
2000
- # Format value
2001
1987
  if isinstance(value, str):
2002
- # Escape single quotes using backslash when inside $$ dollar-quoted strings
2003
- # In $$ delimiters, Cypher string literals can use \' to escape single quotes
2004
1988
  escaped_str = value.replace("'", "\\'")
2005
1989
  escaped_value = f"'{escaped_str}'"
2006
1990
  elif isinstance(value, list):
2007
- # Handle list values - use double quotes for Cypher arrays
2008
1991
  list_items = []
2009
1992
  for v in value:
2010
1993
  if isinstance(v, str):
2011
- # Escape double quotes in string values for Cypher
2012
1994
  escaped_str = v.replace('"', '\\"')
2013
1995
  list_items.append(f'"{escaped_str}"')
2014
1996
  else:
@@ -2016,7 +1998,6 @@ class PolarDBGraphDB(BaseGraphDB):
2016
1998
  escaped_value = f"[{', '.join(list_items)}]"
2017
1999
  else:
2018
2000
  escaped_value = f"'{value}'" if isinstance(value, str) else str(value)
2019
- # Build WHERE conditions
2020
2001
  if op == "=":
2021
2002
  where_conditions.append(f"n.{field} = {escaped_value}")
2022
2003
  elif op == "in":
@@ -2045,22 +2026,19 @@ class PolarDBGraphDB(BaseGraphDB):
2045
2026
  knowledgebase_ids=knowledgebase_ids,
2046
2027
  default_user_name=self._get_config_value("user_name"),
2047
2028
  )
2048
- logger.info(f"[get_by_metadata] user_name_conditions: {user_name_conditions}")
2029
+ logger.info(f"get_by_metadata user_name_conditions: {user_name_conditions}")
2049
2030
 
2050
- # Add user_name WHERE clause
2051
2031
  if user_name_conditions:
2052
2032
  if len(user_name_conditions) == 1:
2053
2033
  where_conditions.append(user_name_conditions[0])
2054
2034
  else:
2055
2035
  where_conditions.append(f"({' OR '.join(user_name_conditions)})")
2056
2036
 
2057
- # Build filter conditions using common method
2058
2037
  filter_where_clause = self._build_filter_conditions_cypher(filter)
2059
- logger.info(f"[get_by_metadata] filter_where_clause: {filter_where_clause}")
2038
+ logger.info(f"get_by_metadata filter_where_clause: {filter_where_clause}")
2060
2039
 
2061
2040
  where_str = " AND ".join(where_conditions) + filter_where_clause
2062
2041
 
2063
- # Use cypher query
2064
2042
  cypher_query = f"""
2065
2043
  SELECT * FROM cypher('{self.db_name}_graph', $$
2066
2044
  MATCH (n:Memory)
@@ -2070,7 +2048,7 @@ class PolarDBGraphDB(BaseGraphDB):
2070
2048
  """
2071
2049
 
2072
2050
  ids = []
2073
- logger.info(f"[get_by_metadata] cypher_query: {cypher_query}")
2051
+ logger.info(f"get_by_metadata cypher_query: {cypher_query}")
2074
2052
  try:
2075
2053
  with self._get_connection() as conn, conn.cursor() as cursor:
2076
2054
  cursor.execute(cypher_query)
@@ -2078,7 +2056,8 @@ class PolarDBGraphDB(BaseGraphDB):
2078
2056
  ids = [str(item[0]).strip('"') for item in results]
2079
2057
  except Exception as e:
2080
2058
  logger.warning(f"Failed to get metadata: {e}, query is {cypher_query}")
2081
-
2059
+ elapsed = (time.perf_counter() - start_time) * 1000.0
2060
+ logger.info("get_by_metadata internal took %.1f ms", elapsed)
2082
2061
  return ids
2083
2062
 
2084
2063
  @timed
@@ -2165,25 +2144,19 @@ class PolarDBGraphDB(BaseGraphDB):
2165
2144
  params: dict[str, Any] | None = None,
2166
2145
  user_name: str | None = None,
2167
2146
  ) -> list[dict[str, Any]]:
2168
- """
2169
- Count nodes grouped by any fields.
2170
-
2171
- Args:
2172
- group_fields (list[str]): Fields to group by, e.g., ["memory_type", "status"]
2173
- where_clause (str, optional): Extra WHERE condition. E.g.,
2174
- "WHERE n.status = 'activated'"
2175
- params (dict, optional): Parameters for WHERE clause.
2176
- user_name (str, optional): User name for filtering in non-multi-db mode
2177
-
2178
- Returns:
2179
- list[dict]: e.g., [{ 'memory_type': 'WorkingMemory', 'status': 'active', 'count': 10 }, ...]
2180
- """
2147
+ start_time = time.perf_counter()
2148
+ logger.info(
2149
+ "get_grouped_counts by group_fields:%s,where_clause: %s,params:%s,user_name:%s",
2150
+ group_fields,
2151
+ where_clause,
2152
+ params,
2153
+ user_name,
2154
+ )
2181
2155
  if not group_fields:
2182
2156
  raise ValueError("group_fields cannot be empty")
2183
2157
 
2184
2158
  user_name = user_name if user_name else self._get_config_value("user_name")
2185
2159
 
2186
- # Build user clause
2187
2160
  user_clause = f"ag_catalog.agtype_access_operator(properties, '\"user_name\"'::agtype) = '\"{user_name}\"'::agtype"
2188
2161
  if where_clause:
2189
2162
  where_clause = where_clause.strip()
@@ -2194,44 +2167,43 @@ class PolarDBGraphDB(BaseGraphDB):
2194
2167
  else:
2195
2168
  where_clause = f"WHERE {user_clause}"
2196
2169
 
2197
- # Inline parameters if provided
2198
2170
  if params and isinstance(params, dict):
2199
2171
  for key, value in params.items():
2200
- # Handle different value types appropriately
2201
2172
  if isinstance(value, str):
2202
2173
  value = f"'{value}'"
2203
2174
  where_clause = where_clause.replace(f"${key}", str(value))
2204
2175
 
2205
- # Handle user_name parameter in where_clause
2206
2176
  if "user_name = %s" in where_clause:
2207
2177
  where_clause = where_clause.replace(
2208
2178
  "user_name = %s",
2209
2179
  f"ag_catalog.agtype_access_operator(properties, '\"user_name\"'::agtype) = '\"{user_name}\"'::agtype",
2210
2180
  )
2211
2181
 
2212
- # Build return fields and group by fields
2213
- return_fields = []
2214
- group_by_fields = []
2215
-
2182
+ cte_select_list = []
2183
+ aliases = []
2216
2184
  for field in group_fields:
2217
2185
  alias = field.replace(".", "_")
2218
- return_fields.append(
2219
- f"ag_catalog.agtype_access_operator(properties, '\"{field}\"'::agtype)::text AS {alias}"
2220
- )
2221
- group_by_fields.append(
2222
- f"ag_catalog.agtype_access_operator(properties, '\"{field}\"'::agtype)::text"
2186
+ aliases.append(alias)
2187
+ cte_select_list.append(
2188
+ f"ag_catalog.agtype_access_operator(properties, '\"{field}\"'::agtype) AS {alias}"
2223
2189
  )
2224
-
2225
- # Full SQL query construction
2190
+ outer_select = ", ".join(f"{a}::text" for a in aliases)
2191
+ outer_group_by = ", ".join(aliases)
2226
2192
  query = f"""
2227
- SELECT {", ".join(return_fields)}, COUNT(*) AS count
2228
- FROM "{self.db_name}_graph"."Memory"
2229
- {where_clause}
2230
- GROUP BY {", ".join(group_by_fields)}
2193
+ WITH t AS (
2194
+ SELECT {", ".join(cte_select_list)}
2195
+ FROM "{self.db_name}_graph"."Memory"
2196
+ {where_clause}
2197
+ LIMIT 1000
2198
+ )
2199
+ SELECT {outer_select}, count(*) AS count
2200
+ FROM t
2201
+ GROUP BY {outer_group_by}
2231
2202
  """
2203
+ logger.info(f"get_grouped_counts query:{query},params:{params}")
2204
+
2232
2205
  try:
2233
2206
  with self._get_connection() as conn, conn.cursor() as cursor:
2234
- # Handle parameterized query
2235
2207
  if params and isinstance(params, list):
2236
2208
  cursor.execute(query, params)
2237
2209
  else:
@@ -2250,6 +2222,8 @@ class PolarDBGraphDB(BaseGraphDB):
2250
2222
  count_value = row[-1] # Last column is count
2251
2223
  output.append({**group_values, "count": int(count_value)})
2252
2224
 
2225
+ elapsed = (time.perf_counter() - start_time) * 1000.0
2226
+ logger.info("get_grouped_counts internal took %.1f ms", elapsed)
2253
2227
  return output
2254
2228
 
2255
2229
  except Exception as e:
@@ -4667,6 +4641,36 @@ class PolarDBGraphDB(BaseGraphDB):
4667
4641
  condition_parts.append(
4668
4642
  f"ag_catalog.agtype_access_operator(properties, '\"{key}\"'::agtype)::text LIKE '%{op_value}%'"
4669
4643
  )
4644
+ elif op == "nolike":
4645
+ if key.startswith("info."):
4646
+ info_field = key[5:]
4647
+ if isinstance(op_value, str):
4648
+ escaped_value = (
4649
+ escape_sql_string(op_value)
4650
+ .replace("%", "\\%")
4651
+ .replace("_", "\\_")
4652
+ )
4653
+ condition_parts.append(
4654
+ f"ag_catalog.agtype_access_operator(VARIADIC ARRAY[properties, '\"info\"'::ag_catalog.agtype, '\"{info_field}\"'::ag_catalog.agtype])::text NOT LIKE '%{escaped_value}%'"
4655
+ )
4656
+ else:
4657
+ condition_parts.append(
4658
+ f"ag_catalog.agtype_access_operator(VARIADIC ARRAY[properties, '\"info\"'::ag_catalog.agtype, '\"{info_field}\"'::ag_catalog.agtype])::text NOT LIKE '%{op_value}%'"
4659
+ )
4660
+ else:
4661
+ if isinstance(op_value, str):
4662
+ escaped_value = (
4663
+ escape_sql_string(op_value)
4664
+ .replace("%", "\\%")
4665
+ .replace("_", "\\_")
4666
+ )
4667
+ condition_parts.append(
4668
+ f"ag_catalog.agtype_access_operator(properties, '\"{key}\"'::agtype)::text NOT LIKE '%{escaped_value}%'"
4669
+ )
4670
+ else:
4671
+ condition_parts.append(
4672
+ f"ag_catalog.agtype_access_operator(properties, '\"{key}\"'::agtype)::text NOT LIKE '%{op_value}%'"
4673
+ )
4670
4674
  # Check if key starts with "info." prefix (for simple equality)
4671
4675
  elif key.startswith("info."):
4672
4676
  # Extract the field name after "info."
@@ -4756,6 +4760,7 @@ class PolarDBGraphDB(BaseGraphDB):
4756
4760
  "project_id",
4757
4761
  "manager_user_id",
4758
4762
  "delete_time",
4763
+ "related_id",
4759
4764
  }
4760
4765
 
4761
4766
  def process_condition(condition):
@@ -88,7 +88,7 @@ class OllamaLLM(BaseLLM):
88
88
  )
89
89
  str_response = response.message.content
90
90
  if self.config.remove_think_prefix:
91
- return remove_thinking_tags(str_response)
91
+ return remove_thinking_tags(str_response or "")
92
92
  else:
93
93
  return str_thinking + str_response
94
94