MemoryOS 2.0.13__tar.gz → 2.0.14__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 (365) hide show
  1. {memoryos-2.0.13 → memoryos-2.0.14}/PKG-INFO +1 -1
  2. {memoryos-2.0.13 → memoryos-2.0.14}/pyproject.toml +1 -1
  3. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/__init__.py +1 -1
  4. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/config.py +26 -2
  5. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/handlers/add_handler.py +2 -0
  6. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/handlers/component_init.py +26 -7
  7. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/handlers/formatters_handler.py +1 -0
  8. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/server_api.py +10 -0
  9. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/chunkers/sentence_chunker.py +1 -0
  10. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/mem_reader.py +8 -1
  11. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/graph_dbs/polardb.py +6 -20
  12. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_feedback/feedback.py +134 -30
  13. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_os/utils/format_utils.py +13 -0
  14. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/multi_modal_struct.py +189 -215
  15. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/simple_struct.py +10 -0
  16. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py +31 -1
  17. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/schemas/task_schemas.py +21 -2
  18. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +3 -0
  19. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_read_handler.py +69 -41
  20. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +6 -4
  21. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +105 -32
  22. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/task_queue.py +6 -0
  23. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/item.py +11 -7
  24. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree.py +38 -0
  25. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/organize/manager.py +8 -0
  26. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/multi_mem_cube/composite_cube.py +13 -7
  27. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/multi_mem_cube/single_cube.py +116 -77
  28. memoryos-2.0.14/src/memos/plugins/__init__.py +20 -0
  29. memoryos-2.0.14/src/memos/plugins/base.py +75 -0
  30. memoryos-2.0.14/src/memos/plugins/component_bootstrap.py +30 -0
  31. memoryos-2.0.14/src/memos/plugins/hook_defs.py +132 -0
  32. memoryos-2.0.14/src/memos/plugins/hooks.py +150 -0
  33. memoryos-2.0.14/src/memos/plugins/manager.py +90 -0
  34. memoryos-2.0.14/src/memos/utils.py +249 -0
  35. memoryos-2.0.13/src/memos/extras/nli_model/client.py +0 -61
  36. memoryos-2.0.13/src/memos/extras/nli_model/server/README.md +0 -69
  37. memoryos-2.0.13/src/memos/extras/nli_model/server/config.py +0 -23
  38. memoryos-2.0.13/src/memos/extras/nli_model/server/handler.py +0 -186
  39. memoryos-2.0.13/src/memos/extras/nli_model/server/serve.py +0 -44
  40. memoryos-2.0.13/src/memos/extras/nli_model/types.py +0 -18
  41. memoryos-2.0.13/src/memos/memories/textual/tree_text_memory/organize/history_manager.py +0 -168
  42. memoryos-2.0.13/src/memos/memories/textual/tree_text_memory/retrieve/pre_update.py +0 -264
  43. memoryos-2.0.13/src/memos/templates/__init__.py +0 -0
  44. memoryos-2.0.13/src/memos/utils.py +0 -123
  45. memoryos-2.0.13/src/memos/vec_dbs/__init__.py +0 -0
  46. {memoryos-2.0.13 → memoryos-2.0.14}/LICENSE +0 -0
  47. {memoryos-2.0.13 → memoryos-2.0.14}/README.md +0 -0
  48. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/README_api.md +0 -0
  49. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/__init__.py +0 -0
  50. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/client.py +0 -0
  51. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/context/dependencies.py +0 -0
  52. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/exceptions.py +0 -0
  53. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/handlers/__init__.py +0 -0
  54. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/handlers/base_handler.py +0 -0
  55. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/handlers/chat_handler.py +0 -0
  56. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/handlers/config_builders.py +0 -0
  57. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/handlers/feedback_handler.py +0 -0
  58. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/handlers/memory_handler.py +0 -0
  59. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/handlers/scheduler_handler.py +0 -0
  60. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/handlers/search_handler.py +0 -0
  61. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/handlers/suggestion_handler.py +0 -0
  62. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/mcp_serve.py +0 -0
  63. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/middleware/__init__.py +0 -0
  64. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/middleware/auth.py +0 -0
  65. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/middleware/rate_limit.py +0 -0
  66. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/middleware/request_context.py +0 -0
  67. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/product_models.py +0 -0
  68. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/routers/__init__.py +0 -0
  69. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/routers/admin_router.py +0 -0
  70. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/routers/server_router.py +0 -0
  71. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/server_api_ext.py +0 -0
  72. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/utils/__init__.py +0 -0
  73. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/api/utils/api_keys.py +0 -0
  74. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/chunkers/__init__.py +0 -0
  75. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/chunkers/base.py +0 -0
  76. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/chunkers/charactertext_chunker.py +0 -0
  77. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/chunkers/factory.py +0 -0
  78. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/chunkers/markdown_chunker.py +0 -0
  79. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/chunkers/simple_chunker.py +0 -0
  80. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/cli.py +0 -0
  81. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/__init__.py +0 -0
  82. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/base.py +0 -0
  83. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/chunker.py +0 -0
  84. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/embedder.py +0 -0
  85. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/graph_db.py +0 -0
  86. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/internet_retriever.py +0 -0
  87. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/llm.py +0 -0
  88. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/mem_agent.py +0 -0
  89. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/mem_chat.py +0 -0
  90. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/mem_cube.py +0 -0
  91. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/mem_os.py +0 -0
  92. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/mem_scheduler.py +0 -0
  93. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/mem_user.py +0 -0
  94. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/memory.py +0 -0
  95. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/parser.py +0 -0
  96. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/reranker.py +0 -0
  97. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/utils.py +0 -0
  98. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/configs/vec_db.py +0 -0
  99. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/context/context.py +0 -0
  100. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/dependency.py +0 -0
  101. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/deprecation.py +0 -0
  102. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/embedders/__init__.py +0 -0
  103. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/embedders/ark.py +0 -0
  104. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/embedders/base.py +0 -0
  105. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/embedders/factory.py +0 -0
  106. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/embedders/ollama.py +0 -0
  107. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/embedders/sentence_transformer.py +0 -0
  108. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/embedders/universal_api.py +0 -0
  109. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/exceptions.py +0 -0
  110. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/extras/__init__.py +0 -0
  111. {memoryos-2.0.13/src/memos/extras/nli_model → memoryos-2.0.14/src/memos/graph_dbs}/__init__.py +0 -0
  112. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/graph_dbs/base.py +0 -0
  113. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/graph_dbs/factory.py +0 -0
  114. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/graph_dbs/item.py +0 -0
  115. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/graph_dbs/neo4j.py +0 -0
  116. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/graph_dbs/neo4j_community.py +0 -0
  117. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/graph_dbs/postgres.py +0 -0
  118. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/hello_world.py +0 -0
  119. {memoryos-2.0.13/src/memos/extras/nli_model/server → memoryos-2.0.14/src/memos/llms}/__init__.py +0 -0
  120. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/llms/base.py +0 -0
  121. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/llms/deepseek.py +0 -0
  122. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/llms/factory.py +0 -0
  123. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/llms/hf.py +0 -0
  124. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/llms/hf_singleton.py +0 -0
  125. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/llms/minimax.py +0 -0
  126. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/llms/ollama.py +0 -0
  127. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/llms/openai.py +0 -0
  128. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/llms/openai_new.py +0 -0
  129. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/llms/qwen.py +0 -0
  130. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/llms/utils.py +0 -0
  131. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/llms/vllm.py +0 -0
  132. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/log.py +0 -0
  133. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_agent/base.py +0 -0
  134. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_agent/deepsearch_agent.py +0 -0
  135. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_agent/factory.py +0 -0
  136. {memoryos-2.0.13/src/memos/graph_dbs → memoryos-2.0.14/src/memos/mem_chat}/__init__.py +0 -0
  137. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_chat/base.py +0 -0
  138. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_chat/factory.py +0 -0
  139. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_chat/simple.py +0 -0
  140. {memoryos-2.0.13/src/memos/llms → memoryos-2.0.14/src/memos/mem_cube}/__init__.py +0 -0
  141. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_cube/base.py +0 -0
  142. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_cube/general.py +0 -0
  143. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_cube/navie.py +0 -0
  144. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_cube/utils.py +0 -0
  145. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_feedback/base.py +0 -0
  146. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_feedback/simple_feedback.py +0 -0
  147. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_feedback/utils.py +0 -0
  148. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_os/core.py +0 -0
  149. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_os/main.py +0 -0
  150. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_os/utils/default_config.py +0 -0
  151. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_os/utils/reference_utils.py +0 -0
  152. {memoryos-2.0.13/src/memos/mem_chat → memoryos-2.0.14/src/memos/mem_reader}/__init__.py +0 -0
  153. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/base.py +0 -0
  154. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/factory.py +0 -0
  155. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/memory.py +0 -0
  156. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_multi_modal/__init__.py +0 -0
  157. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_multi_modal/assistant_parser.py +0 -0
  158. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_multi_modal/base.py +0 -0
  159. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_multi_modal/file_content_parser.py +0 -0
  160. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_multi_modal/image_parser.py +0 -0
  161. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_multi_modal/multi_modal_parser.py +0 -0
  162. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_multi_modal/string_parser.py +0 -0
  163. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_multi_modal/system_parser.py +0 -0
  164. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_multi_modal/text_content_parser.py +0 -0
  165. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_multi_modal/tool_parser.py +0 -0
  166. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_multi_modal/user_parser.py +0 -0
  167. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_multi_modal/utils.py +0 -0
  168. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_pref_memory/process_preference_memory.py +0 -0
  169. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/read_skill_memory/process_skill_memory.py +0 -0
  170. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/strategy_struct.py +0 -0
  171. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_reader/utils.py +0 -0
  172. {memoryos-2.0.13/src/memos/mem_cube → memoryos-2.0.14/src/memos/mem_scheduler}/__init__.py +0 -0
  173. {memoryos-2.0.13/src/memos/mem_reader → memoryos-2.0.14/src/memos/mem_scheduler/analyzer}/__init__.py +0 -0
  174. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/analyzer/api_analyzer.py +0 -0
  175. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/analyzer/eval_analyzer.py +0 -0
  176. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +0 -0
  177. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/analyzer/scheduler_for_eval.py +0 -0
  178. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/base_mixins/__init__.py +0 -0
  179. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/base_mixins/memory_ops.py +0 -0
  180. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/base_mixins/queue_ops.py +0 -0
  181. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/base_mixins/web_log_ops.py +0 -0
  182. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/base_scheduler.py +0 -0
  183. {memoryos-2.0.13/src/memos/mem_scheduler → memoryos-2.0.14/src/memos/mem_scheduler/general_modules}/__init__.py +0 -0
  184. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/general_modules/api_misc.py +0 -0
  185. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/general_modules/base.py +0 -0
  186. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/general_modules/misc.py +0 -0
  187. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/general_modules/scheduler_logger.py +0 -0
  188. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/general_modules/task_threads.py +0 -0
  189. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/general_scheduler.py +0 -0
  190. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/memory_manage_modules/__init__.py +0 -0
  191. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/memory_manage_modules/activation_memory_manager.py +0 -0
  192. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/memory_manage_modules/enhancement_pipeline.py +0 -0
  193. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/memory_manage_modules/filter_pipeline.py +0 -0
  194. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/memory_manage_modules/memory_filter.py +0 -0
  195. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/memory_manage_modules/post_processor.py +0 -0
  196. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/memory_manage_modules/rerank_pipeline.py +0 -0
  197. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/memory_manage_modules/retriever.py +0 -0
  198. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/memory_manage_modules/search_pipeline.py +0 -0
  199. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/memory_manage_modules/search_service.py +0 -0
  200. {memoryos-2.0.13/src/memos/mem_scheduler/analyzer → memoryos-2.0.14/src/memos/mem_scheduler/monitors}/__init__.py +0 -0
  201. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/monitors/dispatcher_monitor.py +0 -0
  202. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/monitors/general_monitor.py +0 -0
  203. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/monitors/task_schedule_monitor.py +0 -0
  204. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/optimized_scheduler.py +0 -0
  205. {memoryos-2.0.13/src/memos/mem_scheduler/general_modules → memoryos-2.0.14/src/memos/mem_scheduler/orm_modules}/__init__.py +0 -0
  206. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/orm_modules/api_redis_model.py +0 -0
  207. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/orm_modules/base_model.py +0 -0
  208. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/orm_modules/monitor_models.py +0 -0
  209. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/orm_modules/redis_model.py +0 -0
  210. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
  211. {memoryos-2.0.13/src/memos/mem_scheduler/monitors → memoryos-2.0.14/src/memos/mem_scheduler/schemas}/__init__.py +0 -0
  212. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/schemas/analyzer_schemas.py +0 -0
  213. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/schemas/api_schemas.py +0 -0
  214. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/schemas/general_schemas.py +0 -0
  215. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/schemas/message_schemas.py +0 -0
  216. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/schemas/monitor_schemas.py +0 -0
  217. {memoryos-2.0.13/src/memos/mem_scheduler/orm_modules → memoryos-2.0.14/src/memos/mem_scheduler/task_schedule_modules}/__init__.py +0 -0
  218. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/base_handler.py +0 -0
  219. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/context.py +0 -0
  220. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/handlers/__init__.py +0 -0
  221. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/handlers/add_handler.py +0 -0
  222. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/handlers/answer_handler.py +0 -0
  223. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/handlers/feedback_handler.py +0 -0
  224. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_reorganize_handler.py +0 -0
  225. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/handlers/memory_update_handler.py +0 -0
  226. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/handlers/pref_add_handler.py +0 -0
  227. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/handlers/query_handler.py +0 -0
  228. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/orchestrator.py +0 -0
  229. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/task_schedule_modules/registry.py +0 -0
  230. {memoryos-2.0.13/src/memos/mem_scheduler/schemas → memoryos-2.0.14/src/memos/mem_scheduler/utils}/__init__.py +0 -0
  231. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/utils/api_utils.py +0 -0
  232. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/utils/config_utils.py +0 -0
  233. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/utils/db_utils.py +0 -0
  234. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/utils/filter_utils.py +0 -0
  235. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/utils/metrics.py +0 -0
  236. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/utils/misc_utils.py +0 -0
  237. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/utils/monitor_event_utils.py +0 -0
  238. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/utils/status_tracker.py +0 -0
  239. {memoryos-2.0.13/src/memos/mem_scheduler/task_schedule_modules → memoryos-2.0.14/src/memos/mem_scheduler/webservice_modules}/__init__.py +0 -0
  240. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +0 -0
  241. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_scheduler/webservice_modules/redis_service.py +0 -0
  242. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_user/factory.py +0 -0
  243. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_user/mysql_persistent_user_manager.py +0 -0
  244. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_user/mysql_user_manager.py +0 -0
  245. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_user/persistent_factory.py +0 -0
  246. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_user/persistent_user_manager.py +0 -0
  247. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_user/redis_persistent_user_manager.py +0 -0
  248. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/mem_user/user_manager.py +0 -0
  249. {memoryos-2.0.13/src/memos/mem_scheduler/utils → memoryos-2.0.14/src/memos/memories}/__init__.py +0 -0
  250. {memoryos-2.0.13/src/memos/mem_scheduler/webservice_modules → memoryos-2.0.14/src/memos/memories/activation}/__init__.py +0 -0
  251. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/activation/base.py +0 -0
  252. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/activation/item.py +0 -0
  253. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/activation/kv.py +0 -0
  254. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/activation/vllmkv.py +0 -0
  255. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/base.py +0 -0
  256. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/factory.py +0 -0
  257. {memoryos-2.0.13/src/memos/memories → memoryos-2.0.14/src/memos/memories/parametric}/__init__.py +0 -0
  258. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/parametric/base.py +0 -0
  259. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/parametric/item.py +0 -0
  260. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/parametric/lora.py +0 -0
  261. {memoryos-2.0.13/src/memos/memories/activation → memoryos-2.0.14/src/memos/memories/textual}/__init__.py +0 -0
  262. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/base.py +0 -0
  263. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/general.py +0 -0
  264. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/naive.py +0 -0
  265. {memoryos-2.0.13/src/memos/memories/parametric → memoryos-2.0.14/src/memos/memories/textual/prefer_text_memory}/__init__.py +0 -0
  266. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/prefer_text_memory/adder.py +0 -0
  267. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/prefer_text_memory/config.py +0 -0
  268. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/prefer_text_memory/extractor.py +0 -0
  269. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/prefer_text_memory/factory.py +0 -0
  270. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/prefer_text_memory/retrievers.py +0 -0
  271. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/prefer_text_memory/spliter.py +0 -0
  272. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/prefer_text_memory/utils.py +0 -0
  273. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/preference.py +0 -0
  274. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/simple_preference.py +0 -0
  275. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/simple_tree.py +0 -0
  276. {memoryos-2.0.13/src/memos/memories/textual → memoryos-2.0.14/src/memos/memories/textual/tree_text_memory}/__init__.py +0 -0
  277. {memoryos-2.0.13/src/memos/memories/textual/prefer_text_memory → memoryos-2.0.14/src/memos/memories/textual/tree_text_memory/organize}/__init__.py +0 -0
  278. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/organize/handler.py +0 -0
  279. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +0 -0
  280. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +0 -0
  281. {memoryos-2.0.13/src/memos/memories/textual/tree_text_memory → memoryos-2.0.14/src/memos/memories/textual/tree_text_memory/retrieve}/__init__.py +0 -0
  282. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +0 -0
  283. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +0 -0
  284. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +0 -0
  285. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
  286. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +0 -0
  287. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
  288. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +0 -0
  289. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +0 -0
  290. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
  291. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +0 -0
  292. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +0 -0
  293. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +0 -0
  294. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/tavilysearch.py +0 -0
  295. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +0 -0
  296. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
  297. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memos_tools/dinding_report_bot.py +0 -0
  298. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memos_tools/lockfree_dict.py +0 -0
  299. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memos_tools/notification_service.py +0 -0
  300. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memos_tools/notification_utils.py +0 -0
  301. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memos_tools/singleton.py +0 -0
  302. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memos_tools/thread_safe_dict.py +0 -0
  303. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/memos_tools/thread_safe_dict_segment.py +0 -0
  304. {memoryos-2.0.13/src/memos/memories/textual/tree_text_memory/organize → memoryos-2.0.14/src/memos/multi_mem_cube}/__init__.py +0 -0
  305. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/multi_mem_cube/views.py +0 -0
  306. {memoryos-2.0.13/src/memos/memories/textual/tree_text_memory/retrieve → memoryos-2.0.14/src/memos/parsers}/__init__.py +0 -0
  307. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/parsers/base.py +0 -0
  308. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/parsers/factory.py +0 -0
  309. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/parsers/markitdown.py +0 -0
  310. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/__init__.py +0 -0
  311. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/base.py +0 -0
  312. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/concat.py +0 -0
  313. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/cosine_local.py +0 -0
  314. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/factory.py +0 -0
  315. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/http_bge.py +0 -0
  316. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/http_bge_strategy.py +0 -0
  317. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/noop.py +0 -0
  318. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/strategies/__init__.py +0 -0
  319. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/strategies/base.py +0 -0
  320. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/strategies/concat_background.py +0 -0
  321. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/strategies/concat_docsource.py +0 -0
  322. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/strategies/dialogue_common.py +0 -0
  323. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/strategies/factory.py +0 -0
  324. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/strategies/single_turn.py +0 -0
  325. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/reranker/strategies/singleturn_outmem.py +0 -0
  326. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/search/__init__.py +0 -0
  327. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/search/search_service.py +0 -0
  328. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/settings.py +0 -0
  329. {memoryos-2.0.13/src/memos/multi_mem_cube → memoryos-2.0.14/src/memos/templates}/__init__.py +0 -0
  330. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/advanced_search_prompts.py +0 -0
  331. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/cloud_service_prompt.py +0 -0
  332. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/instruction_completion.py +0 -0
  333. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/mem_agent_prompts.py +0 -0
  334. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/mem_feedback_prompts.py +0 -0
  335. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/mem_reader_prompts.py +0 -0
  336. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/mem_reader_strategy_prompts.py +0 -0
  337. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/mem_scheduler_prompts.py +0 -0
  338. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/mem_search_prompts.py +0 -0
  339. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/mos_prompts.py +0 -0
  340. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/prefer_complete_prompt.py +0 -0
  341. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/skill_mem_prompt.py +0 -0
  342. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/tool_mem_prompts.py +0 -0
  343. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/templates/tree_reorganize_prompts.py +0 -0
  344. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/__init__.py +0 -0
  345. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/general_types.py +0 -0
  346. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/__init__.py +0 -0
  347. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +0 -0
  348. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +0 -0
  349. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +0 -0
  350. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +0 -0
  351. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +0 -0
  352. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +0 -0
  353. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +0 -0
  354. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +0 -0
  355. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/chat_completion_message_param.py +0 -0
  356. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +0 -0
  357. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +0 -0
  358. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +0 -0
  359. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +0 -0
  360. {memoryos-2.0.13/src/memos/parsers → memoryos-2.0.14/src/memos/vec_dbs}/__init__.py +0 -0
  361. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/vec_dbs/base.py +0 -0
  362. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/vec_dbs/factory.py +0 -0
  363. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/vec_dbs/item.py +0 -0
  364. {memoryos-2.0.13 → memoryos-2.0.14}/src/memos/vec_dbs/milvus.py +0 -0
  365. {memoryos-2.0.13 → memoryos-2.0.14}/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.13
3
+ Version: 2.0.14
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.13"
7
+ version = "2.0.14"
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.13"
1
+ __version__ = "2.0.14"
2
2
 
3
3
  from memos.configs.mem_cube import GeneralMemCubeConfig
4
4
  from memos.configs.mem_os import MOSConfig
@@ -369,6 +369,26 @@ class APIConfig:
369
369
 
370
370
  return {"backend": "openai", "config": config}
371
371
 
372
+ @staticmethod
373
+ def get_qwen_llm_config() -> dict[str, Any] | None:
374
+ if not os.getenv("QWEN_API_KEY"):
375
+ return None
376
+ return {
377
+ "backend": "qwen",
378
+ "config": {
379
+ "model_name_or_path": os.getenv("QWEN_MODEL", "qwen-flash"),
380
+ "temperature": float(os.getenv("QWEN_TEMPERATURE", "0.8")),
381
+ "max_tokens": int(os.getenv("QWEN_MAX_TOKENS", "8000")),
382
+ "top_p": float(os.getenv("QWEN_TOP_P", "0.9")),
383
+ "top_k": int(os.getenv("QWEN_TOP_K", "50")),
384
+ "remove_think_prefix": os.getenv("QWEN_REMOVE_THINK_PREFIX", "true").lower()
385
+ == "true",
386
+ "api_key": os.getenv("QWEN_API_KEY", ""),
387
+ "api_base": os.getenv("QWEN_API_BASE", ""),
388
+ "model_schema": os.getenv("QWEN_MODEL_SCHEMA", "memos.configs.llm.QwenLLMConfig"),
389
+ },
390
+ }
391
+
372
392
  @staticmethod
373
393
  def get_memreader_general_llm_config() -> dict[str, Any]:
374
394
  """Get general LLM configuration for non-chat/doc tasks.
@@ -639,6 +659,7 @@ class APIConfig:
639
659
 
640
660
  return config
641
661
 
662
+ @staticmethod
642
663
  def get_internet_config() -> dict[str, Any]:
643
664
  """Get internet retriever configuration.
644
665
 
@@ -705,8 +726,9 @@ class APIConfig:
705
726
 
706
727
  @staticmethod
707
728
  def get_nli_config() -> dict[str, Any]:
708
- """Get NLI model configuration."""
729
+ """Get relation-judge configuration for memory-version candidate matching."""
709
730
  return {
731
+ "provider": os.getenv("MEM_VERSION_RELATION_JUDGE_PROVIDER", "llm"),
710
732
  "base_url": os.getenv("NLI_MODEL_BASE_URL", "http://localhost:32532"),
711
733
  }
712
734
 
@@ -872,7 +894,7 @@ class APIConfig:
872
894
  ),
873
895
  "context_window_size": int(os.getenv("MOS_SCHEDULER_CONTEXT_WINDOW_SIZE", "5")),
874
896
  "thread_pool_max_workers": int(
875
- os.getenv("MOS_SCHEDULER_THREAD_POOL_MAX_WORKERS", "200")
897
+ os.getenv("MOS_SCHEDULER_THREAD_POOL_MAX_WORKERS", "50")
876
898
  ),
877
899
  "consume_interval_seconds": float(
878
900
  os.getenv("MOS_SCHEDULER_CONSUME_INTERVAL_SECONDS", "0.01")
@@ -952,6 +974,7 @@ class APIConfig:
952
974
  "backend": reader_config["backend"],
953
975
  "config": {
954
976
  "llm": APIConfig.get_memreader_config(),
977
+ "qwen_llm": APIConfig.get_qwen_llm_config(),
955
978
  # General LLM for non-chat/doc tasks (hallucination filter, rewrite, merge, etc.)
956
979
  "general_llm": APIConfig.get_memreader_general_llm_config(),
957
980
  # Image parser LLM (requires vision model)
@@ -986,6 +1009,7 @@ class APIConfig:
986
1009
  "SKILLS_LOCAL_DIR", "/tmp/upload_skill_memory/"
987
1010
  ),
988
1011
  },
1012
+ "memory_version_switch": os.getenv("MEM_READER_MEM_VERSION_SWITCH", "off"),
989
1013
  },
990
1014
  },
991
1015
  "enable_textual_memory": True,
@@ -15,6 +15,7 @@ from memos.memories.textual.item import (
15
15
  from memos.multi_mem_cube.composite_cube import CompositeCubeView
16
16
  from memos.multi_mem_cube.single_cube import SingleCubeView
17
17
  from memos.multi_mem_cube.views import MemCubeView
18
+ from memos.plugins.hooks import hookable
18
19
  from memos.types import MessageList
19
20
 
20
21
 
@@ -37,6 +38,7 @@ class AddHandler(BaseHandler):
37
38
  "naive_mem_cube", "mem_reader", "mem_scheduler", "feedback_server"
38
39
  )
39
40
 
41
+ @hookable("add")
40
42
  def handle_add_memories(self, add_req: APIADDRequest) -> MemoryResponse:
41
43
  """
42
44
  Main handler for add memories endpoint.
@@ -32,14 +32,14 @@ from memos.mem_reader.factory import MemReaderFactory
32
32
  from memos.mem_scheduler.orm_modules.base_model import BaseDBManager
33
33
  from memos.mem_scheduler.scheduler_factory import SchedulerFactory
34
34
  from memos.memories.textual.simple_tree import SimpleTreeTextMemory
35
- from memos.memories.textual.tree_text_memory.organize.history_manager import MemoryHistoryManager
36
35
  from memos.memories.textual.tree_text_memory.organize.manager import MemoryManager
37
36
  from memos.memories.textual.tree_text_memory.retrieve.retrieve_utils import FastTokenizer
37
+ from memos.plugins.component_bootstrap import build_plugin_context
38
+ from memos.plugins.manager import plugin_manager
38
39
 
39
40
 
40
41
  if TYPE_CHECKING:
41
42
  from memos.memories.textual.tree import TreeTextMemory
42
- from memos.extras.nli_model.client import NLIClient
43
43
  from memos.mem_agent.deepsearch_agent import DeepSearchMemAgent
44
44
  from memos.memories.textual.tree_text_memory.retrieve.internet_retriever_factory import (
45
45
  InternetRetrieverFactory,
@@ -122,6 +122,12 @@ def init_server() -> dict[str, Any]:
122
122
  existing code that uses the components.
123
123
  """
124
124
  logger.info("Initializing MemOS server components...")
125
+ logger.info(
126
+ "[INIT_SERVER] env_MEMSCHEDULER_STREAM_KEY_PREFIX=%s, env_MEMSCHEDULER_REDIS_STREAM_KEY_PREFIX=%s, env_POLAR_DB_DB_NAME=%s",
127
+ os.getenv("MEMSCHEDULER_STREAM_KEY_PREFIX"),
128
+ os.getenv("MEMSCHEDULER_REDIS_STREAM_KEY_PREFIX"),
129
+ os.getenv("POLAR_DB_DB_NAME"),
130
+ )
125
131
 
126
132
  # Initialize Redis client first as it is a core dependency for features like scheduler status tracking
127
133
  if os.getenv("MEMSCHEDULER_USE_REDIS_QUEUE", "False").lower() == "true":
@@ -169,10 +175,25 @@ def init_server() -> dict[str, Any]:
169
175
  else None
170
176
  )
171
177
  embedder = EmbedderFactory.from_config(embedder_config)
172
- nli_client = NLIClient(base_url=nli_client_config["base_url"])
173
- memory_history_manager = MemoryHistoryManager(nli_client=nli_client, graph_db=graph_db)
178
+
179
+ plugin_context = build_plugin_context(
180
+ graph_db=graph_db,
181
+ embedder=embedder,
182
+ default_cube_config=default_cube_config,
183
+ nli_client_config=nli_client_config,
184
+ mem_reader_config=mem_reader_config,
185
+ reranker_config=reranker_config,
186
+ feedback_reranker_config=feedback_reranker_config,
187
+ internet_retriever_config=internet_retriever_config,
188
+ )
189
+ plugin_manager.discover()
190
+ plugin_manager.init_components(plugin_context)
191
+
174
192
  # Pass graph_db to mem_reader for recall operations (deduplication, conflict detection)
175
- mem_reader = MemReaderFactory.from_config(mem_reader_config, graph_db=graph_db)
193
+ mem_reader = MemReaderFactory.from_config(
194
+ mem_reader_config,
195
+ graph_db=graph_db,
196
+ )
176
197
  reranker = RerankerFactory.from_config(reranker_config)
177
198
  feedback_reranker = RerankerFactory.from_config(feedback_reranker_config)
178
199
  internet_retriever = InternetRetrieverFactory.from_config(
@@ -303,6 +324,4 @@ def init_server() -> dict[str, Any]:
303
324
  "feedback_server": feedback_server,
304
325
  "redis_client": redis_client,
305
326
  "deepsearch_agent": deepsearch_agent,
306
- "nli_client": nli_client,
307
- "memory_history_manager": memory_history_manager,
308
327
  }
@@ -141,6 +141,7 @@ def separate_knowledge_and_conversation_mem(memories: list[dict[str, Any]]):
141
141
  sources = item.get("metadata", {}).get("sources", [])
142
142
  if (
143
143
  item["metadata"]["memory_type"] != "RawFileMemory"
144
+ and sources
144
145
  and len(sources) > 0
145
146
  and "type" in sources[0]
146
147
  and sources[0]["type"] == "file"
@@ -9,13 +9,21 @@ from starlette.staticfiles import StaticFiles
9
9
  from memos.api.exceptions import APIExceptionHandler
10
10
  from memos.api.middleware.request_context import RequestContextMiddleware
11
11
  from memos.api.routers.server_router import router as server_router
12
+ from memos.plugins.manager import plugin_manager
12
13
 
13
14
 
14
15
  load_dotenv()
15
16
 
17
+ plugin_manager.discover()
18
+
16
19
  # Configure logging
17
20
  logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
18
21
  logger = logging.getLogger(__name__)
22
+ logger.info(
23
+ "[SERVER_API] load_dotenv completed. env_MEMSCHEDULER_STREAM_KEY_PREFIX=%s, env_MEMSCHEDULER_REDIS_STREAM_KEY_PREFIX=%s",
24
+ os.getenv("MEMSCHEDULER_STREAM_KEY_PREFIX"),
25
+ os.getenv("MEMSCHEDULER_REDIS_STREAM_KEY_PREFIX"),
26
+ )
19
27
 
20
28
  app = FastAPI(
21
29
  title="MemOS Server REST APIs",
@@ -49,6 +57,8 @@ app.exception_handler(HTTPException)(APIExceptionHandler.http_error_handler)
49
57
  # Fallback for unknown errors
50
58
  app.exception_handler(Exception)(APIExceptionHandler.global_exception_handler)
51
59
 
60
+ plugin_manager.init_app(app)
61
+
52
62
 
53
63
  if __name__ == "__main__":
54
64
  import argparse
@@ -53,4 +53,5 @@ class SentenceChunker(BaseChunker):
53
53
  chunks.append(chunk)
54
54
 
55
55
  logger.debug(f"Generated {len(chunks)} chunks from input text")
56
+
56
57
  return chunks
@@ -1,5 +1,5 @@
1
1
  from datetime import datetime
2
- from typing import Any, ClassVar
2
+ from typing import Any, ClassVar, Literal
3
3
 
4
4
  from pydantic import ConfigDict, Field, field_validator, model_validator
5
5
 
@@ -76,6 +76,13 @@ class MultiModalStructMemReaderConfig(BaseMemReaderConfig):
76
76
  default=None,
77
77
  description="Skills directory for the MemReader",
78
78
  )
79
+ memory_version_switch: Literal["on", "off"] = Field(
80
+ default="off",
81
+ description="Turn on memory version or off",
82
+ )
83
+
84
+ # Allow passing additional fields without raising validation errors
85
+ model_config = ConfigDict(extra="allow", strict=True)
79
86
 
80
87
 
81
88
  class StrategyStructMemReaderConfig(BaseMemReaderConfig):
@@ -899,13 +899,7 @@ class PolarDBGraphDB(BaseGraphDB):
899
899
  logger.info(
900
900
  f" polardb [get_node] get_node completed time in {elapsed_time:.2f}s"
901
901
  )
902
- return self._parse_node(
903
- {
904
- "id": id,
905
- "memory": properties.get("memory", ""),
906
- **properties,
907
- }
908
- )
902
+ return self._parse_node(properties)
909
903
  return None
910
904
 
911
905
  except Exception as e:
@@ -976,15 +970,7 @@ class PolarDBGraphDB(BaseGraphDB):
976
970
  properties["embedding"] = embedding
977
971
  except (json.JSONDecodeError, TypeError):
978
972
  logger.warning(f"Failed to parse embedding for node {node_id}")
979
- nodes.append(
980
- self._parse_node(
981
- {
982
- "id": properties.get("id", node_id),
983
- "memory": properties.get("memory", ""),
984
- "metadata": properties,
985
- }
986
- )
987
- )
973
+ nodes.append(self._parse_node(properties))
988
974
  return nodes
989
975
 
990
976
  @timed
@@ -1534,7 +1520,7 @@ class PolarDBGraphDB(BaseGraphDB):
1534
1520
  user_name_conditions = self._build_user_name_and_kb_ids_conditions_sql(
1535
1521
  user_name=user_name,
1536
1522
  knowledgebase_ids=knowledgebase_ids,
1537
- default_user_name=self.config.user_name,
1523
+ default_user_name=self._get_config_value("user_name"),
1538
1524
  )
1539
1525
 
1540
1526
  # Add OR condition if we have any user_name conditions
@@ -1633,7 +1619,7 @@ class PolarDBGraphDB(BaseGraphDB):
1633
1619
  user_name_conditions = self._build_user_name_and_kb_ids_conditions_sql(
1634
1620
  user_name=user_name,
1635
1621
  knowledgebase_ids=knowledgebase_ids,
1636
- default_user_name=self.config.user_name,
1622
+ default_user_name=self._get_config_value("user_name"),
1637
1623
  )
1638
1624
 
1639
1625
  # Add OR condition if we have any user_name conditions
@@ -1751,7 +1737,7 @@ class PolarDBGraphDB(BaseGraphDB):
1751
1737
  user_name_conditions = self._build_user_name_and_kb_ids_conditions_sql(
1752
1738
  user_name=user_name,
1753
1739
  knowledgebase_ids=knowledgebase_ids,
1754
- default_user_name=self.config.user_name,
1740
+ default_user_name=self._get_config_value("user_name"),
1755
1741
  )
1756
1742
 
1757
1743
  if user_name_conditions:
@@ -1873,7 +1859,7 @@ class PolarDBGraphDB(BaseGraphDB):
1873
1859
  user_name_conditions = self._build_user_name_and_kb_ids_conditions_sql(
1874
1860
  user_name=user_name,
1875
1861
  knowledgebase_ids=knowledgebase_ids,
1876
- default_user_name=self.config.user_name,
1862
+ default_user_name=self._get_config_value("user_name"),
1877
1863
  )
1878
1864
 
1879
1865
  if user_name_conditions:
@@ -33,6 +33,8 @@ from memos.memories.textual.tree_text_memory.organize.manager import (
33
33
  extract_working_binding_ids,
34
34
  )
35
35
  from memos.memories.textual.tree_text_memory.retrieve.retrieve_utils import StopwordManager
36
+ from memos.plugins.hook_defs import H
37
+ from memos.plugins.hooks import trigger_single_hook
36
38
 
37
39
 
38
40
  if TYPE_CHECKING:
@@ -245,6 +247,7 @@ class MemFeedback(BaseMemFeedback):
245
247
  datetime.now().isoformat()
246
248
  )
247
249
  to_add_memory.metadata.background = new_memory_item.metadata.background
250
+ to_add_memory.metadata.sources = new_memory_item.metadata.sources
248
251
 
249
252
  added_ids = self._retry_db_operation(
250
253
  lambda: self.memory_manager.add([to_add_memory], user_name=user_name, use_batch=False)
@@ -288,33 +291,43 @@ class MemFeedback(BaseMemFeedback):
288
291
  new_memory_item.memory = operation["text"]
289
292
  new_memory_item.metadata.embedding = self._batch_embed([operation["text"]])[0]
290
293
 
291
- if memory_type == "WorkingMemory":
292
- fields = {
293
- "memory": new_memory_item.memory,
294
- "key": new_memory_item.metadata.key,
295
- "tags": new_memory_item.metadata.tags,
296
- "embedding": new_memory_item.metadata.embedding,
297
- "background": new_memory_item.metadata.background,
298
- "covered_history": old_memory_item.id,
299
- }
300
- self.graph_store.update_node(old_memory_item.id, fields=fields, user_name=user_name)
301
- item_id = old_memory_item.id
302
- else:
303
- done = self._single_add_operation(
304
- old_memory_item, new_memory_item, user_id, user_name, async_mode
294
+ if getattr(self.mem_reader, "memory_version_switch", "off") != "on":
295
+ if memory_type == "WorkingMemory":
296
+ fields = {
297
+ "memory": new_memory_item.memory,
298
+ "key": new_memory_item.metadata.key,
299
+ "tags": new_memory_item.metadata.tags,
300
+ "embedding": new_memory_item.metadata.embedding,
301
+ "background": new_memory_item.metadata.background,
302
+ "covered_history": old_memory_item.id,
303
+ }
304
+ self.graph_store.update_node(old_memory_item.id, fields=fields, user_name=user_name)
305
+ item_id = old_memory_item.id
306
+ else:
307
+ done = self._single_add_operation(
308
+ old_memory_item, new_memory_item, user_id, user_name, async_mode
309
+ )
310
+ item_id = done.get("id")
311
+ self.graph_store.update_node(
312
+ item_id, {"covered_history": old_memory_item.id}, user_name=user_name
313
+ )
314
+ self.graph_store.update_node(
315
+ old_memory_item.id, {"status": "archived"}, user_name=user_name
316
+ )
317
+
318
+ logger.info(
319
+ f"[Memory Feedback UPDATE] New Add:{item_id} | Set archived:{old_memory_item.id} | memory_type: {memory_type}"
305
320
  )
306
- item_id = done.get("id")
307
- self.graph_store.update_node(
308
- item_id, {"covered_history": old_memory_item.id}, user_name=user_name
321
+ else:
322
+ item_id = self._single_update_operation_with_versions(
323
+ old_memory_item=old_memory_item,
324
+ new_memory_item=new_memory_item,
325
+ user_name=user_name,
309
326
  )
310
- self.graph_store.update_node(
311
- old_memory_item.id, {"status": "archived"}, user_name=user_name
327
+ logger.info(
328
+ f"[Memory Feedback UPDATE] Updated:{item_id} | history appended | memory_type: {old_memory_item.metadata.memory_type}"
312
329
  )
313
330
 
314
- logger.info(
315
- f"[Memory Feedback UPDATE] New Add:{item_id} | Set archived:{old_memory_item.id} | memory_type: {memory_type}"
316
- )
317
-
318
331
  return {
319
332
  "id": item_id,
320
333
  "text": new_memory_item.memory,
@@ -323,6 +336,78 @@ class MemFeedback(BaseMemFeedback):
323
336
  "origin_memory": old_memory_item.memory,
324
337
  }
325
338
 
339
+ def _single_update_operation_with_versions(
340
+ self,
341
+ old_memory_item: TextualMemoryItem,
342
+ new_memory_item: TextualMemoryItem,
343
+ user_name: str,
344
+ ) -> str:
345
+ try:
346
+ updated_item, archived_item, archived_metadata, updated_fields = trigger_single_hook(
347
+ H.MEMORY_VERSION_APPLY_FEEDBACK_UPDATE,
348
+ old_item=old_memory_item,
349
+ new_item=new_memory_item,
350
+ user_name=user_name,
351
+ )
352
+ except Exception as e:
353
+ logger.warning(
354
+ "[Memory Feedback UPDATE] history fallback for %s: %s", old_memory_item.id, e
355
+ )
356
+ updated_item = old_memory_item.model_copy(deep=True)
357
+ updated_item.memory = new_memory_item.memory
358
+ updated_item.metadata.key = new_memory_item.metadata.key
359
+ updated_item.metadata.tags = new_memory_item.metadata.tags
360
+ updated_item.metadata.background = new_memory_item.metadata.background
361
+ if getattr(new_memory_item.metadata, "sources", None) is not None:
362
+ current_sources = list(updated_item.metadata.sources or [])
363
+ updated_item.metadata.sources = (
364
+ list(new_memory_item.metadata.sources or []) + current_sources
365
+ )
366
+ if getattr(new_memory_item.metadata, "embedding", None) is not None:
367
+ updated_item.metadata.embedding = new_memory_item.metadata.embedding
368
+ if updated_item.metadata.memory_type == "PreferenceMemory":
369
+ updated_item.metadata.preference = updated_item.memory
370
+ updated_fields = {
371
+ "memory": updated_item.memory,
372
+ "key": updated_item.metadata.key,
373
+ "tags": updated_item.metadata.tags,
374
+ "embedding": updated_item.metadata.embedding,
375
+ "background": updated_item.metadata.background,
376
+ "sources": [
377
+ source.model_dump(exclude_none=True)
378
+ if hasattr(source, "model_dump")
379
+ else source
380
+ for source in (updated_item.metadata.sources or [])
381
+ ],
382
+ "covered_history": old_memory_item.id,
383
+ }
384
+ archived_item = None
385
+ archived_metadata = None
386
+
387
+ if archived_item and archived_metadata:
388
+ try:
389
+ self.graph_store.add_node(
390
+ id=archived_item.id,
391
+ memory=archived_item.memory,
392
+ metadata=archived_metadata,
393
+ user_name=user_name,
394
+ )
395
+ except Exception as e:
396
+ logger.warning(
397
+ "[Memory Feedback UPDATE] archive add failed for %s: %s",
398
+ old_memory_item.id,
399
+ e,
400
+ )
401
+ self._retry_db_operation(
402
+ lambda: self.graph_store.update_node(
403
+ id=updated_item.id,
404
+ fields=updated_fields,
405
+ user_name=user_name,
406
+ )
407
+ )
408
+ self._del_working_binding(user_name, [old_memory_item])
409
+ return updated_item.id
410
+
326
411
  def _del_working_binding(self, user_name, mem_items: list[TextualMemoryItem]) -> set[str]:
327
412
  """Delete working memory bindings"""
328
413
  bindings_to_delete = extract_working_binding_ids(mem_items)
@@ -331,9 +416,7 @@ class MemFeedback(BaseMemFeedback):
331
416
  f"[Memory Feedback UPDATE] Extracted {len(bindings_to_delete)} working_binding ids to cleanup: {list(bindings_to_delete)}"
332
417
  )
333
418
 
334
- delete_ids = []
335
- if bindings_to_delete:
336
- delete_ids = list({bindings_to_delete})
419
+ delete_ids = list(bindings_to_delete)
337
420
 
338
421
  for mid in delete_ids:
339
422
  try:
@@ -346,6 +429,7 @@ class MemFeedback(BaseMemFeedback):
346
429
  logger.warning(
347
430
  f"[0107 Feedback Core:_del_working_binding] TreeTextMemory.delete_hard: failed to delete {mid}: {e}"
348
431
  )
432
+ return bindings_to_delete
349
433
 
350
434
  def semantics_feedback(
351
435
  self,
@@ -476,9 +560,22 @@ class MemFeedback(BaseMemFeedback):
476
560
  f"[0107 Feedback Core: semantics_feedback] Operation failed for {original_op}: {e}",
477
561
  exc_info=True,
478
562
  )
479
- if update_results:
480
- updated_ids = [item["archived_id"] for item in update_results]
481
- self._del_working_binding(updated_ids, user_name)
563
+ if update_results and getattr(self.mem_reader, "memory_version_switch", "off") != "on":
564
+ archived_ids = [item["archived_id"] for item in update_results]
565
+ archived_items = []
566
+ for aid in archived_ids:
567
+ try:
568
+ node = self.graph_store.get_node(aid, user_name=user_name)
569
+ if node:
570
+ archived_items.append(TextualMemoryItem(**node))
571
+ except Exception as e:
572
+ logger.warning(
573
+ "[Memory Feedback] Failed to fetch archived item %s for working_binding cleanup: %s",
574
+ aid,
575
+ e,
576
+ )
577
+ if archived_items:
578
+ self._del_working_binding(user_name, archived_items)
482
579
 
483
580
  return {"record": {"add": add_results, "update": update_results}}
484
581
 
@@ -1066,7 +1163,14 @@ class MemFeedback(BaseMemFeedback):
1066
1163
  tags=tags,
1067
1164
  key=key,
1068
1165
  embedding=embedding,
1069
- sources=[{"type": "chat"}],
1166
+ sources=[
1167
+ {
1168
+ "type": "feedback",
1169
+ "role": "user",
1170
+ "chat_time": feedback_time,
1171
+ "content": feedback_content,
1172
+ }
1173
+ ],
1070
1174
  background=background,
1071
1175
  type="fine",
1072
1176
  info=info,
@@ -1399,5 +1399,18 @@ def clean_json_response(response: str) -> str:
1399
1399
 
1400
1400
  Returns:
1401
1401
  str: Clean JSON string without markdown formatting
1402
+
1403
+ Raises:
1404
+ ValueError: If ``response`` is None. This is almost always an upstream
1405
+ failure (LLM call returned None instead of raising) and surfacing
1406
+ it here is much easier to diagnose than the implicit
1407
+ ``AttributeError: 'NoneType' object has no attribute 'replace'``
1408
+ that would otherwise be thrown.
1402
1409
  """
1410
+ if response is None:
1411
+ raise ValueError(
1412
+ "clean_json_response received None — upstream LLM call likely "
1413
+ "failed silently (check timed_with_status / generate() error "
1414
+ "handling)."
1415
+ )
1403
1416
  return response.replace("```json", "").replace("```", "").strip()