MemoryOS 2.0.3__py3-none-any.whl

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 (315) hide show
  1. memoryos-2.0.3.dist-info/METADATA +418 -0
  2. memoryos-2.0.3.dist-info/RECORD +315 -0
  3. memoryos-2.0.3.dist-info/WHEEL +4 -0
  4. memoryos-2.0.3.dist-info/entry_points.txt +3 -0
  5. memoryos-2.0.3.dist-info/licenses/LICENSE +201 -0
  6. memos/__init__.py +20 -0
  7. memos/api/client.py +571 -0
  8. memos/api/config.py +1018 -0
  9. memos/api/context/dependencies.py +50 -0
  10. memos/api/exceptions.py +53 -0
  11. memos/api/handlers/__init__.py +62 -0
  12. memos/api/handlers/add_handler.py +158 -0
  13. memos/api/handlers/base_handler.py +194 -0
  14. memos/api/handlers/chat_handler.py +1401 -0
  15. memos/api/handlers/component_init.py +388 -0
  16. memos/api/handlers/config_builders.py +190 -0
  17. memos/api/handlers/feedback_handler.py +93 -0
  18. memos/api/handlers/formatters_handler.py +237 -0
  19. memos/api/handlers/memory_handler.py +316 -0
  20. memos/api/handlers/scheduler_handler.py +497 -0
  21. memos/api/handlers/search_handler.py +222 -0
  22. memos/api/handlers/suggestion_handler.py +117 -0
  23. memos/api/mcp_serve.py +614 -0
  24. memos/api/middleware/request_context.py +101 -0
  25. memos/api/product_api.py +38 -0
  26. memos/api/product_models.py +1206 -0
  27. memos/api/routers/__init__.py +1 -0
  28. memos/api/routers/product_router.py +477 -0
  29. memos/api/routers/server_router.py +394 -0
  30. memos/api/server_api.py +44 -0
  31. memos/api/start_api.py +433 -0
  32. memos/chunkers/__init__.py +4 -0
  33. memos/chunkers/base.py +24 -0
  34. memos/chunkers/charactertext_chunker.py +41 -0
  35. memos/chunkers/factory.py +24 -0
  36. memos/chunkers/markdown_chunker.py +62 -0
  37. memos/chunkers/sentence_chunker.py +54 -0
  38. memos/chunkers/simple_chunker.py +50 -0
  39. memos/cli.py +113 -0
  40. memos/configs/__init__.py +0 -0
  41. memos/configs/base.py +82 -0
  42. memos/configs/chunker.py +59 -0
  43. memos/configs/embedder.py +88 -0
  44. memos/configs/graph_db.py +236 -0
  45. memos/configs/internet_retriever.py +100 -0
  46. memos/configs/llm.py +151 -0
  47. memos/configs/mem_agent.py +54 -0
  48. memos/configs/mem_chat.py +81 -0
  49. memos/configs/mem_cube.py +105 -0
  50. memos/configs/mem_os.py +83 -0
  51. memos/configs/mem_reader.py +91 -0
  52. memos/configs/mem_scheduler.py +385 -0
  53. memos/configs/mem_user.py +70 -0
  54. memos/configs/memory.py +324 -0
  55. memos/configs/parser.py +38 -0
  56. memos/configs/reranker.py +18 -0
  57. memos/configs/utils.py +8 -0
  58. memos/configs/vec_db.py +80 -0
  59. memos/context/context.py +355 -0
  60. memos/dependency.py +52 -0
  61. memos/deprecation.py +262 -0
  62. memos/embedders/__init__.py +0 -0
  63. memos/embedders/ark.py +95 -0
  64. memos/embedders/base.py +106 -0
  65. memos/embedders/factory.py +29 -0
  66. memos/embedders/ollama.py +77 -0
  67. memos/embedders/sentence_transformer.py +49 -0
  68. memos/embedders/universal_api.py +51 -0
  69. memos/exceptions.py +30 -0
  70. memos/graph_dbs/__init__.py +0 -0
  71. memos/graph_dbs/base.py +274 -0
  72. memos/graph_dbs/factory.py +27 -0
  73. memos/graph_dbs/item.py +46 -0
  74. memos/graph_dbs/nebular.py +1794 -0
  75. memos/graph_dbs/neo4j.py +1942 -0
  76. memos/graph_dbs/neo4j_community.py +1058 -0
  77. memos/graph_dbs/polardb.py +5446 -0
  78. memos/hello_world.py +97 -0
  79. memos/llms/__init__.py +0 -0
  80. memos/llms/base.py +25 -0
  81. memos/llms/deepseek.py +13 -0
  82. memos/llms/factory.py +38 -0
  83. memos/llms/hf.py +443 -0
  84. memos/llms/hf_singleton.py +114 -0
  85. memos/llms/ollama.py +135 -0
  86. memos/llms/openai.py +222 -0
  87. memos/llms/openai_new.py +198 -0
  88. memos/llms/qwen.py +13 -0
  89. memos/llms/utils.py +14 -0
  90. memos/llms/vllm.py +218 -0
  91. memos/log.py +237 -0
  92. memos/mem_agent/base.py +19 -0
  93. memos/mem_agent/deepsearch_agent.py +391 -0
  94. memos/mem_agent/factory.py +36 -0
  95. memos/mem_chat/__init__.py +0 -0
  96. memos/mem_chat/base.py +30 -0
  97. memos/mem_chat/factory.py +21 -0
  98. memos/mem_chat/simple.py +200 -0
  99. memos/mem_cube/__init__.py +0 -0
  100. memos/mem_cube/base.py +30 -0
  101. memos/mem_cube/general.py +240 -0
  102. memos/mem_cube/navie.py +172 -0
  103. memos/mem_cube/utils.py +169 -0
  104. memos/mem_feedback/base.py +15 -0
  105. memos/mem_feedback/feedback.py +1192 -0
  106. memos/mem_feedback/simple_feedback.py +40 -0
  107. memos/mem_feedback/utils.py +230 -0
  108. memos/mem_os/client.py +5 -0
  109. memos/mem_os/core.py +1203 -0
  110. memos/mem_os/main.py +582 -0
  111. memos/mem_os/product.py +1608 -0
  112. memos/mem_os/product_server.py +455 -0
  113. memos/mem_os/utils/default_config.py +359 -0
  114. memos/mem_os/utils/format_utils.py +1403 -0
  115. memos/mem_os/utils/reference_utils.py +162 -0
  116. memos/mem_reader/__init__.py +0 -0
  117. memos/mem_reader/base.py +47 -0
  118. memos/mem_reader/factory.py +53 -0
  119. memos/mem_reader/memory.py +298 -0
  120. memos/mem_reader/multi_modal_struct.py +965 -0
  121. memos/mem_reader/read_multi_modal/__init__.py +43 -0
  122. memos/mem_reader/read_multi_modal/assistant_parser.py +311 -0
  123. memos/mem_reader/read_multi_modal/base.py +273 -0
  124. memos/mem_reader/read_multi_modal/file_content_parser.py +826 -0
  125. memos/mem_reader/read_multi_modal/image_parser.py +359 -0
  126. memos/mem_reader/read_multi_modal/multi_modal_parser.py +252 -0
  127. memos/mem_reader/read_multi_modal/string_parser.py +139 -0
  128. memos/mem_reader/read_multi_modal/system_parser.py +327 -0
  129. memos/mem_reader/read_multi_modal/text_content_parser.py +131 -0
  130. memos/mem_reader/read_multi_modal/tool_parser.py +210 -0
  131. memos/mem_reader/read_multi_modal/user_parser.py +218 -0
  132. memos/mem_reader/read_multi_modal/utils.py +358 -0
  133. memos/mem_reader/simple_struct.py +912 -0
  134. memos/mem_reader/strategy_struct.py +163 -0
  135. memos/mem_reader/utils.py +157 -0
  136. memos/mem_scheduler/__init__.py +0 -0
  137. memos/mem_scheduler/analyzer/__init__.py +0 -0
  138. memos/mem_scheduler/analyzer/api_analyzer.py +714 -0
  139. memos/mem_scheduler/analyzer/eval_analyzer.py +219 -0
  140. memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +571 -0
  141. memos/mem_scheduler/analyzer/scheduler_for_eval.py +280 -0
  142. memos/mem_scheduler/base_scheduler.py +1319 -0
  143. memos/mem_scheduler/general_modules/__init__.py +0 -0
  144. memos/mem_scheduler/general_modules/api_misc.py +137 -0
  145. memos/mem_scheduler/general_modules/base.py +80 -0
  146. memos/mem_scheduler/general_modules/init_components_for_scheduler.py +425 -0
  147. memos/mem_scheduler/general_modules/misc.py +313 -0
  148. memos/mem_scheduler/general_modules/scheduler_logger.py +389 -0
  149. memos/mem_scheduler/general_modules/task_threads.py +315 -0
  150. memos/mem_scheduler/general_scheduler.py +1495 -0
  151. memos/mem_scheduler/memory_manage_modules/__init__.py +5 -0
  152. memos/mem_scheduler/memory_manage_modules/memory_filter.py +306 -0
  153. memos/mem_scheduler/memory_manage_modules/retriever.py +547 -0
  154. memos/mem_scheduler/monitors/__init__.py +0 -0
  155. memos/mem_scheduler/monitors/dispatcher_monitor.py +366 -0
  156. memos/mem_scheduler/monitors/general_monitor.py +394 -0
  157. memos/mem_scheduler/monitors/task_schedule_monitor.py +254 -0
  158. memos/mem_scheduler/optimized_scheduler.py +410 -0
  159. memos/mem_scheduler/orm_modules/__init__.py +0 -0
  160. memos/mem_scheduler/orm_modules/api_redis_model.py +518 -0
  161. memos/mem_scheduler/orm_modules/base_model.py +729 -0
  162. memos/mem_scheduler/orm_modules/monitor_models.py +261 -0
  163. memos/mem_scheduler/orm_modules/redis_model.py +699 -0
  164. memos/mem_scheduler/scheduler_factory.py +23 -0
  165. memos/mem_scheduler/schemas/__init__.py +0 -0
  166. memos/mem_scheduler/schemas/analyzer_schemas.py +52 -0
  167. memos/mem_scheduler/schemas/api_schemas.py +233 -0
  168. memos/mem_scheduler/schemas/general_schemas.py +55 -0
  169. memos/mem_scheduler/schemas/message_schemas.py +173 -0
  170. memos/mem_scheduler/schemas/monitor_schemas.py +406 -0
  171. memos/mem_scheduler/schemas/task_schemas.py +132 -0
  172. memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
  173. memos/mem_scheduler/task_schedule_modules/dispatcher.py +740 -0
  174. memos/mem_scheduler/task_schedule_modules/local_queue.py +247 -0
  175. memos/mem_scheduler/task_schedule_modules/orchestrator.py +74 -0
  176. memos/mem_scheduler/task_schedule_modules/redis_queue.py +1385 -0
  177. memos/mem_scheduler/task_schedule_modules/task_queue.py +162 -0
  178. memos/mem_scheduler/utils/__init__.py +0 -0
  179. memos/mem_scheduler/utils/api_utils.py +77 -0
  180. memos/mem_scheduler/utils/config_utils.py +100 -0
  181. memos/mem_scheduler/utils/db_utils.py +50 -0
  182. memos/mem_scheduler/utils/filter_utils.py +176 -0
  183. memos/mem_scheduler/utils/metrics.py +125 -0
  184. memos/mem_scheduler/utils/misc_utils.py +290 -0
  185. memos/mem_scheduler/utils/monitor_event_utils.py +67 -0
  186. memos/mem_scheduler/utils/status_tracker.py +229 -0
  187. memos/mem_scheduler/webservice_modules/__init__.py +0 -0
  188. memos/mem_scheduler/webservice_modules/rabbitmq_service.py +485 -0
  189. memos/mem_scheduler/webservice_modules/redis_service.py +380 -0
  190. memos/mem_user/factory.py +94 -0
  191. memos/mem_user/mysql_persistent_user_manager.py +271 -0
  192. memos/mem_user/mysql_user_manager.py +502 -0
  193. memos/mem_user/persistent_factory.py +98 -0
  194. memos/mem_user/persistent_user_manager.py +260 -0
  195. memos/mem_user/redis_persistent_user_manager.py +225 -0
  196. memos/mem_user/user_manager.py +488 -0
  197. memos/memories/__init__.py +0 -0
  198. memos/memories/activation/__init__.py +0 -0
  199. memos/memories/activation/base.py +42 -0
  200. memos/memories/activation/item.py +56 -0
  201. memos/memories/activation/kv.py +292 -0
  202. memos/memories/activation/vllmkv.py +219 -0
  203. memos/memories/base.py +19 -0
  204. memos/memories/factory.py +42 -0
  205. memos/memories/parametric/__init__.py +0 -0
  206. memos/memories/parametric/base.py +19 -0
  207. memos/memories/parametric/item.py +11 -0
  208. memos/memories/parametric/lora.py +41 -0
  209. memos/memories/textual/__init__.py +0 -0
  210. memos/memories/textual/base.py +92 -0
  211. memos/memories/textual/general.py +236 -0
  212. memos/memories/textual/item.py +304 -0
  213. memos/memories/textual/naive.py +187 -0
  214. memos/memories/textual/prefer_text_memory/__init__.py +0 -0
  215. memos/memories/textual/prefer_text_memory/adder.py +504 -0
  216. memos/memories/textual/prefer_text_memory/config.py +106 -0
  217. memos/memories/textual/prefer_text_memory/extractor.py +221 -0
  218. memos/memories/textual/prefer_text_memory/factory.py +85 -0
  219. memos/memories/textual/prefer_text_memory/retrievers.py +177 -0
  220. memos/memories/textual/prefer_text_memory/spliter.py +132 -0
  221. memos/memories/textual/prefer_text_memory/utils.py +93 -0
  222. memos/memories/textual/preference.py +344 -0
  223. memos/memories/textual/simple_preference.py +161 -0
  224. memos/memories/textual/simple_tree.py +69 -0
  225. memos/memories/textual/tree.py +459 -0
  226. memos/memories/textual/tree_text_memory/__init__.py +0 -0
  227. memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
  228. memos/memories/textual/tree_text_memory/organize/handler.py +184 -0
  229. memos/memories/textual/tree_text_memory/organize/manager.py +518 -0
  230. memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +238 -0
  231. memos/memories/textual/tree_text_memory/organize/reorganizer.py +622 -0
  232. memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
  233. memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +364 -0
  234. memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +186 -0
  235. memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +419 -0
  236. memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +270 -0
  237. memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +102 -0
  238. memos/memories/textual/tree_text_memory/retrieve/reasoner.py +61 -0
  239. memos/memories/textual/tree_text_memory/retrieve/recall.py +497 -0
  240. memos/memories/textual/tree_text_memory/retrieve/reranker.py +111 -0
  241. memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +16 -0
  242. memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +472 -0
  243. memos/memories/textual/tree_text_memory/retrieve/searcher.py +848 -0
  244. memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +135 -0
  245. memos/memories/textual/tree_text_memory/retrieve/utils.py +54 -0
  246. memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +387 -0
  247. memos/memos_tools/dinding_report_bot.py +453 -0
  248. memos/memos_tools/lockfree_dict.py +120 -0
  249. memos/memos_tools/notification_service.py +44 -0
  250. memos/memos_tools/notification_utils.py +142 -0
  251. memos/memos_tools/singleton.py +174 -0
  252. memos/memos_tools/thread_safe_dict.py +310 -0
  253. memos/memos_tools/thread_safe_dict_segment.py +382 -0
  254. memos/multi_mem_cube/__init__.py +0 -0
  255. memos/multi_mem_cube/composite_cube.py +86 -0
  256. memos/multi_mem_cube/single_cube.py +874 -0
  257. memos/multi_mem_cube/views.py +54 -0
  258. memos/parsers/__init__.py +0 -0
  259. memos/parsers/base.py +15 -0
  260. memos/parsers/factory.py +21 -0
  261. memos/parsers/markitdown.py +28 -0
  262. memos/reranker/__init__.py +4 -0
  263. memos/reranker/base.py +25 -0
  264. memos/reranker/concat.py +103 -0
  265. memos/reranker/cosine_local.py +102 -0
  266. memos/reranker/factory.py +72 -0
  267. memos/reranker/http_bge.py +324 -0
  268. memos/reranker/http_bge_strategy.py +327 -0
  269. memos/reranker/noop.py +19 -0
  270. memos/reranker/strategies/__init__.py +4 -0
  271. memos/reranker/strategies/base.py +61 -0
  272. memos/reranker/strategies/concat_background.py +94 -0
  273. memos/reranker/strategies/concat_docsource.py +110 -0
  274. memos/reranker/strategies/dialogue_common.py +109 -0
  275. memos/reranker/strategies/factory.py +31 -0
  276. memos/reranker/strategies/single_turn.py +107 -0
  277. memos/reranker/strategies/singleturn_outmem.py +98 -0
  278. memos/settings.py +10 -0
  279. memos/templates/__init__.py +0 -0
  280. memos/templates/advanced_search_prompts.py +211 -0
  281. memos/templates/cloud_service_prompt.py +107 -0
  282. memos/templates/instruction_completion.py +66 -0
  283. memos/templates/mem_agent_prompts.py +85 -0
  284. memos/templates/mem_feedback_prompts.py +822 -0
  285. memos/templates/mem_reader_prompts.py +1096 -0
  286. memos/templates/mem_reader_strategy_prompts.py +238 -0
  287. memos/templates/mem_scheduler_prompts.py +626 -0
  288. memos/templates/mem_search_prompts.py +93 -0
  289. memos/templates/mos_prompts.py +403 -0
  290. memos/templates/prefer_complete_prompt.py +735 -0
  291. memos/templates/tool_mem_prompts.py +139 -0
  292. memos/templates/tree_reorganize_prompts.py +230 -0
  293. memos/types/__init__.py +34 -0
  294. memos/types/general_types.py +151 -0
  295. memos/types/openai_chat_completion_types/__init__.py +15 -0
  296. memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +56 -0
  297. memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +27 -0
  298. memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +23 -0
  299. memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +43 -0
  300. memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +16 -0
  301. memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +16 -0
  302. memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +27 -0
  303. memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +32 -0
  304. memos/types/openai_chat_completion_types/chat_completion_message_param.py +18 -0
  305. memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +15 -0
  306. memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +36 -0
  307. memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +30 -0
  308. memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +34 -0
  309. memos/utils.py +123 -0
  310. memos/vec_dbs/__init__.py +0 -0
  311. memos/vec_dbs/base.py +117 -0
  312. memos/vec_dbs/factory.py +23 -0
  313. memos/vec_dbs/item.py +50 -0
  314. memos/vec_dbs/milvus.py +654 -0
  315. memos/vec_dbs/qdrant.py +355 -0
@@ -0,0 +1,388 @@
1
+ """
2
+ Server component initialization module.
3
+
4
+ This module handles the initialization of all MemOS server components
5
+ including databases, LLMs, memory systems, and schedulers.
6
+ """
7
+
8
+ import os
9
+
10
+ from typing import TYPE_CHECKING, Any
11
+
12
+ from memos.api.config import APIConfig
13
+ from memos.api.handlers.config_builders import (
14
+ build_chat_llm_config,
15
+ build_embedder_config,
16
+ build_feedback_reranker_config,
17
+ build_graph_db_config,
18
+ build_internet_retriever_config,
19
+ build_llm_config,
20
+ build_mem_reader_config,
21
+ build_pref_adder_config,
22
+ build_pref_extractor_config,
23
+ build_pref_retriever_config,
24
+ build_reranker_config,
25
+ build_vec_db_config,
26
+ )
27
+ from memos.configs.mem_scheduler import SchedulerConfigFactory
28
+ from memos.embedders.factory import EmbedderFactory
29
+ from memos.graph_dbs.factory import GraphStoreFactory
30
+ from memos.llms.factory import LLMFactory
31
+ from memos.log import get_logger
32
+ from memos.mem_cube.navie import NaiveMemCube
33
+ from memos.mem_feedback.simple_feedback import SimpleMemFeedback
34
+ from memos.mem_os.product_server import MOSServer
35
+ from memos.mem_reader.factory import MemReaderFactory
36
+ from memos.mem_scheduler.orm_modules.base_model import BaseDBManager
37
+ from memos.mem_scheduler.scheduler_factory import SchedulerFactory
38
+ from memos.memories.textual.prefer_text_memory.factory import (
39
+ AdderFactory,
40
+ ExtractorFactory,
41
+ RetrieverFactory,
42
+ )
43
+ from memos.memories.textual.simple_preference import SimplePreferenceTextMemory
44
+ from memos.memories.textual.simple_tree import SimpleTreeTextMemory
45
+ from memos.memories.textual.tree_text_memory.organize.manager import MemoryManager
46
+ from memos.memories.textual.tree_text_memory.retrieve.retrieve_utils import FastTokenizer
47
+
48
+
49
+ if TYPE_CHECKING:
50
+ from memos.memories.textual.tree import TreeTextMemory
51
+ from memos.mem_agent.deepsearch_agent import DeepSearchMemAgent
52
+ from memos.memories.textual.tree_text_memory.retrieve.internet_retriever_factory import (
53
+ InternetRetrieverFactory,
54
+ )
55
+ from memos.reranker.factory import RerankerFactory
56
+ from memos.vec_dbs.factory import VecDBFactory
57
+
58
+
59
+ if TYPE_CHECKING:
60
+ from memos.mem_scheduler.optimized_scheduler import OptimizedScheduler
61
+ from memos.memories.textual.tree_text_memory.retrieve.searcher import Searcher
62
+ logger = get_logger(__name__)
63
+
64
+
65
+ def _get_default_memory_size(cube_config: Any) -> dict[str, int]:
66
+ """
67
+ Get default memory size configuration.
68
+
69
+ Attempts to retrieve memory size from cube config, falls back to defaults
70
+ if not found.
71
+
72
+ Args:
73
+ cube_config: The cube configuration object
74
+
75
+ Returns:
76
+ Dictionary with memory sizes for different memory types
77
+ """
78
+ return getattr(cube_config.text_mem.config, "memory_size", None) or {
79
+ "WorkingMemory": 20,
80
+ "LongTermMemory": 1500,
81
+ "UserMemory": 480,
82
+ }
83
+
84
+
85
+ def _init_chat_llms(chat_llm_configs: list[dict]) -> dict[str, Any]:
86
+ """
87
+ Initialize chat language models from configuration.
88
+
89
+ Args:
90
+ chat_llm_configs: List of chat LLM configuration dictionaries
91
+
92
+ Returns:
93
+ Dictionary mapping model names to initialized LLM instances
94
+ """
95
+
96
+ def _list_models(client):
97
+ try:
98
+ models = (
99
+ [model.id for model in client.models.list().data]
100
+ if client.models.list().data
101
+ else client.models.list().models
102
+ )
103
+ except Exception as e:
104
+ logger.error(f"Error listing models: {e}")
105
+ models = []
106
+ return models
107
+
108
+ model_name_instrance_maping = {}
109
+ for cfg in chat_llm_configs:
110
+ llm = LLMFactory.from_config(cfg["config_class"])
111
+ if cfg["support_models"]:
112
+ for model_name in cfg["support_models"]:
113
+ model_name_instrance_maping[model_name] = llm
114
+ return model_name_instrance_maping
115
+
116
+
117
+ def init_server() -> dict[str, Any]:
118
+ """
119
+ Initialize all server components and configurations.
120
+
121
+ This function orchestrates the creation and initialization of all components
122
+ required by the MemOS server, including:
123
+ - Database connections (graph DB, vector DB)
124
+ - Language models and embedders
125
+ - Memory systems (text, preference)
126
+ - Scheduler and related modules
127
+
128
+ Returns:
129
+ A dictionary containing all initialized components with descriptive keys.
130
+ This approach allows easy addition of new components without breaking
131
+ existing code that uses the components.
132
+ """
133
+ logger.info("Initializing MemOS server components...")
134
+
135
+ # Initialize Redis client first as it is a core dependency for features like scheduler status tracking
136
+ if os.getenv("MEMSCHEDULER_USE_REDIS_QUEUE", "False").lower() == "true":
137
+ try:
138
+ from memos.mem_scheduler.orm_modules.api_redis_model import APIRedisDBManager
139
+
140
+ redis_client = APIRedisDBManager.load_redis_engine_from_env()
141
+ if redis_client:
142
+ logger.info("Redis client initialized successfully.")
143
+ else:
144
+ logger.error(
145
+ "Failed to initialize Redis client. Check REDIS_HOST etc. in environment variables."
146
+ )
147
+ except Exception as e:
148
+ logger.error(f"Failed to initialize Redis client: {e}", exc_info=True)
149
+ redis_client = None # Ensure redis_client exists even on failure
150
+ else:
151
+ redis_client = None
152
+
153
+ # Get default cube configuration
154
+ default_cube_config = APIConfig.get_default_cube_config()
155
+
156
+ # Get online bot setting
157
+ dingding_enabled = APIConfig.is_dingding_bot_enabled()
158
+
159
+ # Build component configurations
160
+ graph_db_config = build_graph_db_config()
161
+ llm_config = build_llm_config()
162
+ chat_llm_config = build_chat_llm_config()
163
+ embedder_config = build_embedder_config()
164
+ mem_reader_config = build_mem_reader_config()
165
+ reranker_config = build_reranker_config()
166
+ feedback_reranker_config = build_feedback_reranker_config()
167
+ internet_retriever_config = build_internet_retriever_config()
168
+ vector_db_config = build_vec_db_config()
169
+ pref_extractor_config = build_pref_extractor_config()
170
+ pref_adder_config = build_pref_adder_config()
171
+ pref_retriever_config = build_pref_retriever_config()
172
+
173
+ logger.debug("Component configurations built successfully")
174
+
175
+ # Create component instances
176
+ graph_db = GraphStoreFactory.from_config(graph_db_config)
177
+ vector_db = (
178
+ VecDBFactory.from_config(vector_db_config)
179
+ if os.getenv("ENABLE_PREFERENCE_MEMORY", "false") == "true"
180
+ else None
181
+ )
182
+ llm = LLMFactory.from_config(llm_config)
183
+ chat_llms = (
184
+ _init_chat_llms(chat_llm_config)
185
+ if os.getenv("ENABLE_CHAT_API", "false") == "true"
186
+ else None
187
+ )
188
+ embedder = EmbedderFactory.from_config(embedder_config)
189
+ # Pass graph_db to mem_reader for recall operations (deduplication, conflict detection)
190
+ mem_reader = MemReaderFactory.from_config(mem_reader_config, graph_db=graph_db)
191
+ reranker = RerankerFactory.from_config(reranker_config)
192
+ feedback_reranker = RerankerFactory.from_config(feedback_reranker_config)
193
+ internet_retriever = InternetRetrieverFactory.from_config(
194
+ internet_retriever_config, embedder=embedder
195
+ )
196
+
197
+ # Initialize chat llms
198
+
199
+ logger.debug("Core components instantiated")
200
+
201
+ # Initialize memory manager
202
+ memory_manager = MemoryManager(
203
+ graph_db,
204
+ embedder,
205
+ llm,
206
+ memory_size=_get_default_memory_size(default_cube_config),
207
+ is_reorganize=getattr(default_cube_config.text_mem.config, "reorganize", False),
208
+ )
209
+
210
+ logger.debug("Memory manager initialized")
211
+ tokenizer = FastTokenizer()
212
+ # Initialize text memory
213
+ text_mem = SimpleTreeTextMemory(
214
+ llm=llm,
215
+ embedder=embedder,
216
+ mem_reader=mem_reader,
217
+ graph_db=graph_db,
218
+ reranker=reranker,
219
+ memory_manager=memory_manager,
220
+ config=default_cube_config.text_mem.config,
221
+ internet_retriever=internet_retriever,
222
+ tokenizer=tokenizer,
223
+ include_embedding=bool(os.getenv("INCLUDE_EMBEDDING", "false") == "true"),
224
+ )
225
+
226
+ logger.debug("Text memory initialized")
227
+
228
+ # Initialize preference memory components
229
+ pref_extractor = (
230
+ ExtractorFactory.from_config(
231
+ config_factory=pref_extractor_config,
232
+ llm_provider=llm,
233
+ embedder=embedder,
234
+ vector_db=vector_db,
235
+ )
236
+ if os.getenv("ENABLE_PREFERENCE_MEMORY", "false") == "true"
237
+ else None
238
+ )
239
+
240
+ pref_adder = (
241
+ AdderFactory.from_config(
242
+ config_factory=pref_adder_config,
243
+ llm_provider=llm,
244
+ embedder=embedder,
245
+ vector_db=vector_db,
246
+ text_mem=text_mem,
247
+ )
248
+ if os.getenv("ENABLE_PREFERENCE_MEMORY", "false") == "true"
249
+ else None
250
+ )
251
+
252
+ pref_retriever = (
253
+ RetrieverFactory.from_config(
254
+ config_factory=pref_retriever_config,
255
+ llm_provider=llm,
256
+ embedder=embedder,
257
+ reranker=feedback_reranker,
258
+ vector_db=vector_db,
259
+ )
260
+ if os.getenv("ENABLE_PREFERENCE_MEMORY", "false") == "true"
261
+ else None
262
+ )
263
+
264
+ logger.debug("Preference memory components initialized")
265
+
266
+ # Initialize preference memory
267
+ pref_mem = (
268
+ SimplePreferenceTextMemory(
269
+ extractor_llm=llm,
270
+ vector_db=vector_db,
271
+ embedder=embedder,
272
+ reranker=feedback_reranker,
273
+ extractor=pref_extractor,
274
+ adder=pref_adder,
275
+ retriever=pref_retriever,
276
+ )
277
+ if os.getenv("ENABLE_PREFERENCE_MEMORY", "false") == "true"
278
+ else None
279
+ )
280
+
281
+ logger.debug("Preference memory initialized")
282
+
283
+ # Initialize MOS Server
284
+ mos_server = MOSServer(
285
+ mem_reader=mem_reader,
286
+ llm=llm,
287
+ online_bot=False,
288
+ )
289
+
290
+ logger.debug("MOS server initialized")
291
+
292
+ # Create MemCube with pre-initialized memory instances
293
+ naive_mem_cube = NaiveMemCube(
294
+ text_mem=text_mem,
295
+ pref_mem=pref_mem,
296
+ act_mem=None,
297
+ para_mem=None,
298
+ )
299
+
300
+ logger.debug("MemCube created")
301
+
302
+ tree_mem: TreeTextMemory = naive_mem_cube.text_mem
303
+ searcher: Searcher = tree_mem.get_searcher(
304
+ manual_close_internet=os.getenv("ENABLE_INTERNET", "true").lower() == "false",
305
+ moscube=False,
306
+ process_llm=mem_reader.llm,
307
+ )
308
+ logger.debug("Searcher created")
309
+
310
+ # Initialize feedback server
311
+ feedback_server = SimpleMemFeedback(
312
+ llm=llm,
313
+ embedder=embedder,
314
+ graph_store=graph_db,
315
+ memory_manager=memory_manager,
316
+ mem_reader=mem_reader,
317
+ searcher=searcher,
318
+ reranker=feedback_reranker,
319
+ pref_mem=pref_mem,
320
+ )
321
+
322
+ # Initialize Scheduler
323
+ scheduler_config_dict = APIConfig.get_scheduler_config()
324
+ scheduler_config = SchedulerConfigFactory(
325
+ backend="optimized_scheduler", config=scheduler_config_dict
326
+ )
327
+ mem_scheduler: OptimizedScheduler = SchedulerFactory.from_config(scheduler_config)
328
+ mem_scheduler.initialize_modules(
329
+ chat_llm=llm,
330
+ process_llm=mem_reader.llm,
331
+ db_engine=BaseDBManager.create_default_sqlite_engine(),
332
+ mem_reader=mem_reader,
333
+ redis_client=redis_client,
334
+ )
335
+ mem_scheduler.init_mem_cube(
336
+ mem_cube=naive_mem_cube, searcher=searcher, feedback_server=feedback_server
337
+ )
338
+ logger.debug("Scheduler initialized")
339
+
340
+ # Initialize SchedulerAPIModule
341
+ api_module = mem_scheduler.api_module
342
+
343
+ # Start scheduler if enabled
344
+ if os.getenv("API_SCHEDULER_ON", "true").lower() == "true":
345
+ mem_scheduler.start()
346
+ logger.info("Scheduler started")
347
+
348
+ logger.info("MemOS server components initialized successfully")
349
+
350
+ # Initialize online bot if enabled
351
+ online_bot = None
352
+ if dingding_enabled:
353
+ from memos.memos_tools.notification_service import get_online_bot_function
354
+
355
+ online_bot = get_online_bot_function() if dingding_enabled else None
356
+ logger.info("DingDing bot is enabled")
357
+
358
+ deepsearch_agent = DeepSearchMemAgent(
359
+ llm=llm,
360
+ memory_retriever=tree_mem,
361
+ )
362
+ # Return all components as a dictionary for easy access and extension
363
+ return {
364
+ "graph_db": graph_db,
365
+ "mem_reader": mem_reader,
366
+ "llm": llm,
367
+ "chat_llms": chat_llms,
368
+ "embedder": embedder,
369
+ "reranker": reranker,
370
+ "internet_retriever": internet_retriever,
371
+ "memory_manager": memory_manager,
372
+ "default_cube_config": default_cube_config,
373
+ "mos_server": mos_server,
374
+ "mem_scheduler": mem_scheduler,
375
+ "naive_mem_cube": naive_mem_cube,
376
+ "searcher": searcher,
377
+ "api_module": api_module,
378
+ "vector_db": vector_db,
379
+ "pref_extractor": pref_extractor,
380
+ "pref_adder": pref_adder,
381
+ "pref_retriever": pref_retriever,
382
+ "text_mem": text_mem,
383
+ "pref_mem": pref_mem,
384
+ "online_bot": online_bot,
385
+ "feedback_server": feedback_server,
386
+ "redis_client": redis_client,
387
+ "deepsearch_agent": deepsearch_agent,
388
+ }
@@ -0,0 +1,190 @@
1
+ """
2
+ Configuration builders for server handlers.
3
+
4
+ This module contains factory functions that build configurations for various
5
+ components used by the MemOS server. Each function constructs and validates
6
+ a configuration dictionary using the appropriate ConfigFactory.
7
+ """
8
+
9
+ import json
10
+ import os
11
+
12
+ from typing import Any
13
+
14
+ from memos.api.config import APIConfig
15
+ from memos.configs.embedder import EmbedderConfigFactory
16
+ from memos.configs.graph_db import GraphDBConfigFactory
17
+ from memos.configs.internet_retriever import InternetRetrieverConfigFactory
18
+ from memos.configs.llm import LLMConfigFactory
19
+ from memos.configs.mem_reader import MemReaderConfigFactory
20
+ from memos.configs.reranker import RerankerConfigFactory
21
+ from memos.configs.vec_db import VectorDBConfigFactory
22
+ from memos.memories.textual.prefer_text_memory.config import (
23
+ AdderConfigFactory,
24
+ ExtractorConfigFactory,
25
+ RetrieverConfigFactory,
26
+ )
27
+
28
+
29
+ def build_graph_db_config(user_id: str = "default") -> dict[str, Any]:
30
+ """
31
+ Build graph database configuration.
32
+
33
+ Args:
34
+ user_id: User ID for configuration context (default: "default")
35
+
36
+ Returns:
37
+ Validated graph database configuration dictionary
38
+ """
39
+ graph_db_backend_map = {
40
+ "neo4j-community": APIConfig.get_neo4j_community_config(user_id=user_id),
41
+ "neo4j": APIConfig.get_neo4j_config(user_id=user_id),
42
+ "nebular": APIConfig.get_nebular_config(user_id=user_id),
43
+ "polardb": APIConfig.get_polardb_config(user_id=user_id),
44
+ }
45
+
46
+ graph_db_backend = os.getenv("NEO4J_BACKEND", "nebular").lower()
47
+ return GraphDBConfigFactory.model_validate(
48
+ {
49
+ "backend": graph_db_backend,
50
+ "config": graph_db_backend_map[graph_db_backend],
51
+ }
52
+ )
53
+
54
+
55
+ def build_vec_db_config() -> dict[str, Any]:
56
+ """
57
+ Build vector database configuration.
58
+
59
+ Returns:
60
+ Validated vector database configuration dictionary
61
+ """
62
+ return VectorDBConfigFactory.model_validate(
63
+ {
64
+ "backend": "milvus",
65
+ "config": APIConfig.get_milvus_config(),
66
+ }
67
+ )
68
+
69
+
70
+ def build_llm_config() -> dict[str, Any]:
71
+ """
72
+ Build LLM configuration.
73
+
74
+ Returns:
75
+ Validated LLM configuration dictionary
76
+ """
77
+ return LLMConfigFactory.model_validate(
78
+ {
79
+ "backend": "openai",
80
+ "config": APIConfig.get_openai_config(),
81
+ }
82
+ )
83
+
84
+
85
+ def build_chat_llm_config() -> list[dict[str, Any]]:
86
+ """
87
+ Build chat LLM configuration.
88
+
89
+ Returns:
90
+ Validated chat LLM configuration dictionary
91
+ """
92
+ configs = json.loads(os.getenv("CHAT_MODEL_LIST", "[]"))
93
+ return [
94
+ {
95
+ "config_class": LLMConfigFactory.model_validate(
96
+ {
97
+ "backend": cfg.get("backend", "openai"),
98
+ "config": (
99
+ {k: v for k, v in cfg.items() if k not in ["backend", "support_models"]}
100
+ )
101
+ if cfg
102
+ else APIConfig.get_openai_config(),
103
+ }
104
+ ),
105
+ "support_models": cfg.get("support_models", None),
106
+ }
107
+ for cfg in configs
108
+ ]
109
+
110
+
111
+ def build_embedder_config() -> dict[str, Any]:
112
+ """
113
+ Build embedder configuration.
114
+
115
+ Returns:
116
+ Validated embedder configuration dictionary
117
+ """
118
+ return EmbedderConfigFactory.model_validate(APIConfig.get_embedder_config())
119
+
120
+
121
+ def build_mem_reader_config() -> dict[str, Any]:
122
+ """
123
+ Build memory reader configuration.
124
+
125
+ Returns:
126
+ Validated memory reader configuration dictionary
127
+ """
128
+ return MemReaderConfigFactory.model_validate(
129
+ APIConfig.get_product_default_config()["mem_reader"]
130
+ )
131
+
132
+
133
+ def build_reranker_config() -> dict[str, Any]:
134
+ """
135
+ Build reranker configuration.
136
+
137
+ Returns:
138
+ Validated reranker configuration dictionary
139
+ """
140
+ return RerankerConfigFactory.model_validate(APIConfig.get_reranker_config())
141
+
142
+
143
+ def build_feedback_reranker_config() -> dict[str, Any]:
144
+ """
145
+ Build reranker configuration.
146
+
147
+ Returns:
148
+ Validated reranker configuration dictionary
149
+ """
150
+ return RerankerConfigFactory.model_validate(APIConfig.get_feedback_reranker_config())
151
+
152
+
153
+ def build_internet_retriever_config() -> dict[str, Any]:
154
+ """
155
+ Build internet retriever configuration.
156
+
157
+ Returns:
158
+ Validated internet retriever configuration dictionary
159
+ """
160
+ return InternetRetrieverConfigFactory.model_validate(APIConfig.get_internet_config())
161
+
162
+
163
+ def build_pref_extractor_config() -> dict[str, Any]:
164
+ """
165
+ Build preference memory extractor configuration.
166
+
167
+ Returns:
168
+ Validated extractor configuration dictionary
169
+ """
170
+ return ExtractorConfigFactory.model_validate({"backend": "naive", "config": {}})
171
+
172
+
173
+ def build_pref_adder_config() -> dict[str, Any]:
174
+ """
175
+ Build preference memory adder configuration.
176
+
177
+ Returns:
178
+ Validated adder configuration dictionary
179
+ """
180
+ return AdderConfigFactory.model_validate({"backend": "naive", "config": {}})
181
+
182
+
183
+ def build_pref_retriever_config() -> dict[str, Any]:
184
+ """
185
+ Build preference memory retriever configuration.
186
+
187
+ Returns:
188
+ Validated retriever configuration dictionary
189
+ """
190
+ return RetrieverConfigFactory.model_validate({"backend": "naive", "config": {}})
@@ -0,0 +1,93 @@
1
+ """
2
+ Feeback handler for memory add/update functionality.
3
+ """
4
+
5
+ from memos.api.handlers.base_handler import BaseHandler, HandlerDependencies
6
+ from memos.api.product_models import APIFeedbackRequest, MemoryResponse
7
+ from memos.log import get_logger
8
+ from memos.multi_mem_cube.composite_cube import CompositeCubeView
9
+ from memos.multi_mem_cube.single_cube import SingleCubeView
10
+ from memos.multi_mem_cube.views import MemCubeView
11
+
12
+
13
+ logger = get_logger(__name__)
14
+
15
+
16
+ class FeedbackHandler(BaseHandler):
17
+ """
18
+ Handler for memory feedback operations.
19
+
20
+ Provides fast, fine-grained, and mixture-based feedback modes.
21
+ """
22
+
23
+ def __init__(self, dependencies: HandlerDependencies):
24
+ """
25
+ Initialize feedback handler.
26
+
27
+ Args:
28
+ dependencies: HandlerDependencies instance
29
+ """
30
+ super().__init__(dependencies)
31
+ self._validate_dependencies("mem_reader", "mem_scheduler", "searcher", "reranker")
32
+
33
+ def handle_feedback_memories(self, feedback_req: APIFeedbackRequest) -> MemoryResponse:
34
+ """
35
+ Main handler for feedback memories endpoint.
36
+
37
+ Args:
38
+ feedback_req: feedback request containing content and parameters
39
+
40
+ Returns:
41
+ MemoryResponse with formatted results
42
+ """
43
+ cube_view = self._build_cube_view(feedback_req)
44
+
45
+ process_record = cube_view.feedback_memories(feedback_req)
46
+
47
+ self.logger.info(f"[FeedbackHandler] Final feedback results count={len(process_record)}")
48
+
49
+ return MemoryResponse(
50
+ message="Memory feedback successfully",
51
+ data=[process_record],
52
+ )
53
+
54
+ def _resolve_cube_ids(self, feedback_req: APIFeedbackRequest) -> list[str]:
55
+ """
56
+ Normalize target cube ids from feedback_req.
57
+ """
58
+ if feedback_req.writable_cube_ids:
59
+ return list(dict.fromkeys(feedback_req.writable_cube_ids))
60
+
61
+ return [feedback_req.user_id]
62
+
63
+ def _build_cube_view(self, feedback_req: APIFeedbackRequest) -> MemCubeView:
64
+ cube_ids = self._resolve_cube_ids(feedback_req)
65
+
66
+ if len(cube_ids) == 1:
67
+ cube_id = cube_ids[0]
68
+ return SingleCubeView(
69
+ cube_id=cube_id,
70
+ naive_mem_cube=None,
71
+ mem_reader=None,
72
+ mem_scheduler=self.mem_scheduler,
73
+ logger=self.logger,
74
+ searcher=None,
75
+ feedback_server=self.feedback_server,
76
+ )
77
+ else:
78
+ single_views = [
79
+ SingleCubeView(
80
+ cube_id=cube_id,
81
+ naive_mem_cube=None,
82
+ mem_reader=None,
83
+ mem_scheduler=self.mem_scheduler,
84
+ logger=self.logger,
85
+ searcher=None,
86
+ feedback_server=self.feedback_server,
87
+ )
88
+ for cube_id in cube_ids
89
+ ]
90
+ return CompositeCubeView(
91
+ cube_views=single_views,
92
+ logger=self.logger,
93
+ )