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,324 @@
1
+ from typing import Any, ClassVar
2
+
3
+ from pydantic import Field, field_validator, model_validator
4
+
5
+ from memos.configs.base import BaseConfig
6
+ from memos.configs.embedder import EmbedderConfigFactory
7
+ from memos.configs.graph_db import GraphDBConfigFactory
8
+ from memos.configs.internet_retriever import InternetRetrieverConfigFactory
9
+ from memos.configs.llm import LLMConfigFactory
10
+ from memos.configs.mem_reader import MemReaderConfigFactory
11
+ from memos.configs.reranker import RerankerConfigFactory
12
+ from memos.configs.vec_db import VectorDBConfigFactory
13
+ from memos.exceptions import ConfigurationError
14
+ from memos.memories.textual.prefer_text_memory.config import (
15
+ AdderConfigFactory,
16
+ ExtractorConfigFactory,
17
+ RetrieverConfigFactory,
18
+ )
19
+
20
+
21
+ # ─── 1. Global Base Memory Config ─────────────────────────────────────────────
22
+
23
+
24
+ class BaseMemoryConfig(BaseConfig):
25
+ """Base configuration class for memories."""
26
+
27
+ cube_id: str | None = Field(
28
+ None,
29
+ description="Unique identifier for a MemCube that contains this memory",
30
+ )
31
+
32
+
33
+ class UninitializedMemoryConfig(BaseMemoryConfig):
34
+ """Uninitialized memory configuration class."""
35
+
36
+
37
+ # ─── 2.1. Activation Memory Configs ───────────────────────────────────────────
38
+
39
+
40
+ class BaseActMemoryConfig(BaseMemoryConfig):
41
+ """Base configuration class for activation memories."""
42
+
43
+ memory_filename: str = Field(
44
+ "activation_memory.pickle",
45
+ description="Filename for storing memories",
46
+ )
47
+
48
+
49
+ class KVCacheMemoryConfig(BaseActMemoryConfig):
50
+ """LLM KV Cache Memory configuration class."""
51
+
52
+ extractor_llm: LLMConfigFactory = Field(
53
+ ...,
54
+ default_factory=LLMConfigFactory,
55
+ description="LLM configuration for the memory extractor",
56
+ )
57
+
58
+ @field_validator("extractor_llm")
59
+ @classmethod
60
+ def validate_extractor_llm(cls, extractor_llm: LLMConfigFactory) -> LLMConfigFactory:
61
+ """Validate the extractor_llm field."""
62
+ if extractor_llm.backend not in ["huggingface", "huggingface_singleton", "vllm"]:
63
+ raise ConfigurationError(
64
+ f"KVCacheMemoryConfig requires extractor_llm backend to be 'huggingface' or 'huggingface_singleton', got '{extractor_llm.backend}'"
65
+ )
66
+ return extractor_llm
67
+
68
+
69
+ # ─── 2.2. Parametric Memory Configs ───────────────────────────────────────────
70
+
71
+
72
+ class BaseParaMemoryConfig(BaseMemoryConfig):
73
+ """Base configuration class for parametric memories."""
74
+
75
+ memory_filename: str = Field(
76
+ "parametric_memory.adapter",
77
+ description="Filename for storing memories",
78
+ )
79
+
80
+
81
+ class LoRAMemoryConfig(BaseParaMemoryConfig):
82
+ """LoRA memory configuration class."""
83
+
84
+ extractor_llm: LLMConfigFactory = Field(
85
+ ...,
86
+ default_factory=LLMConfigFactory,
87
+ description="LLM configuration for the memory extractor",
88
+ )
89
+
90
+ @field_validator("extractor_llm")
91
+ @classmethod
92
+ def validate_extractor_llm(cls, extractor_llm: LLMConfigFactory) -> LLMConfigFactory:
93
+ """Validate the extractor_llm field."""
94
+ if extractor_llm.backend not in ["huggingface", "huggingface_singleton"]:
95
+ raise ConfigurationError(
96
+ f"LoRAMemoryConfig requires extractor_llm backend to be 'huggingface' or 'huggingface_singleton', got '{extractor_llm.backend}'"
97
+ )
98
+ return extractor_llm
99
+
100
+
101
+ # ─── 2.3. Textual Memory Configs ──────────────────────────────────────────────
102
+
103
+
104
+ class BaseTextMemoryConfig(BaseMemoryConfig):
105
+ """Base configuration class for textual memories."""
106
+
107
+ memory_filename: str = Field(
108
+ "textual_memory.json",
109
+ description="Filename for storing memories",
110
+ )
111
+
112
+
113
+ class NaiveTextMemoryConfig(BaseTextMemoryConfig):
114
+ """Naive textual memory configuration class."""
115
+
116
+ extractor_llm: LLMConfigFactory = Field(
117
+ ...,
118
+ default_factory=LLMConfigFactory,
119
+ description="LLM configuration for the memory extractor",
120
+ )
121
+
122
+
123
+ class GeneralTextMemoryConfig(BaseTextMemoryConfig):
124
+ """General memory configuration class."""
125
+
126
+ extractor_llm: LLMConfigFactory = Field(
127
+ ...,
128
+ default_factory=LLMConfigFactory,
129
+ description="LLM configuration for the memory extractor",
130
+ )
131
+ vector_db: VectorDBConfigFactory = Field(
132
+ ...,
133
+ default_factory=VectorDBConfigFactory,
134
+ description="Vector database configuration for the memory storage",
135
+ )
136
+ embedder: EmbedderConfigFactory = Field(
137
+ ...,
138
+ default_factory=EmbedderConfigFactory,
139
+ description="Embedder configuration for the memory embedding",
140
+ )
141
+
142
+
143
+ class TreeTextMemoryConfig(BaseTextMemoryConfig):
144
+ """Tree text memory configuration class."""
145
+
146
+ extractor_llm: LLMConfigFactory = Field(
147
+ ...,
148
+ default_factory=LLMConfigFactory,
149
+ description="LLM configuration for the memory extractor",
150
+ )
151
+ dispatcher_llm: LLMConfigFactory = Field(
152
+ ...,
153
+ default_factory=LLMConfigFactory,
154
+ description="LLM configuration for the memory dispatcher_llm in retrieve module",
155
+ )
156
+ embedder: EmbedderConfigFactory = Field(
157
+ ...,
158
+ default_factory=EmbedderConfigFactory,
159
+ description="Embedder configuration for the memory embedding",
160
+ )
161
+ reranker: RerankerConfigFactory | None = Field(
162
+ None,
163
+ description="Reranker configuration (optional, defaults to cosine_local).",
164
+ )
165
+ graph_db: GraphDBConfigFactory = Field(
166
+ ...,
167
+ default_factory=GraphDBConfigFactory,
168
+ description="Graph database configuration for the tree-memory storage",
169
+ )
170
+ internet_retriever: InternetRetrieverConfigFactory | None = Field(
171
+ None,
172
+ description="Internet retriever configuration (optional)",
173
+ )
174
+
175
+ reorganize: bool | None = Field(
176
+ False,
177
+ description="Optional description for this memory configuration.",
178
+ )
179
+
180
+ memory_size: dict[str, Any] | None = Field(
181
+ default=None,
182
+ description=(
183
+ "Maximum item counts per memory bucket, e.g.: "
184
+ '{"WorkingMemory": 20, "LongTermMemory": 10000, "UserMemory": 10000}'
185
+ ),
186
+ )
187
+
188
+ search_strategy: dict[str, Any] | None = Field(
189
+ default=None,
190
+ description=(
191
+ 'Set search strategy for this memory configuration.{"bm25": true, "cot": false}'
192
+ ),
193
+ )
194
+
195
+ mode: str | None = Field(
196
+ default="sync",
197
+ description=("whether use asynchronous mode in memory add"),
198
+ )
199
+ include_embedding: bool | None = Field(
200
+ default=False,
201
+ description="Whether to include embedding in the memory retrieval",
202
+ )
203
+
204
+
205
+ class SimpleTreeTextMemoryConfig(TreeTextMemoryConfig):
206
+ """Simple tree text memory configuration class."""
207
+
208
+
209
+ class PreferenceTextMemoryConfig(BaseTextMemoryConfig):
210
+ """Preference memory configuration class."""
211
+
212
+ extractor_llm: LLMConfigFactory = Field(
213
+ ...,
214
+ default_factory=LLMConfigFactory,
215
+ description="LLM configuration for the memory extractor",
216
+ )
217
+ vector_db: VectorDBConfigFactory = Field(
218
+ ...,
219
+ default_factory=VectorDBConfigFactory,
220
+ description="Vector database configuration for the memory storage",
221
+ )
222
+ embedder: EmbedderConfigFactory = Field(
223
+ ...,
224
+ default_factory=EmbedderConfigFactory,
225
+ description="Embedder configuration for the memory embedding",
226
+ )
227
+ reranker: RerankerConfigFactory | None = Field(
228
+ None,
229
+ description="Reranker configuration (optional).",
230
+ )
231
+ extractor: ExtractorConfigFactory = Field(
232
+ ...,
233
+ default_factory=ExtractorConfigFactory,
234
+ description="Extractor configuration for the memory extracting",
235
+ )
236
+ adder: AdderConfigFactory = Field(
237
+ ...,
238
+ default_factory=AdderConfigFactory,
239
+ description="Adder configuration for the memory adding",
240
+ )
241
+ retriever: RetrieverConfigFactory = Field(
242
+ ...,
243
+ default_factory=RetrieverConfigFactory,
244
+ description="Retriever configuration for the memory retrieving",
245
+ )
246
+
247
+
248
+ class MemFeedbackConfig(BaseMemoryConfig):
249
+ """Memory feedback configuration class."""
250
+
251
+ extractor_llm: LLMConfigFactory = Field(
252
+ ...,
253
+ default_factory=LLMConfigFactory,
254
+ description="LLM configuration for the memory extractor",
255
+ )
256
+ embedder: EmbedderConfigFactory = Field(
257
+ ...,
258
+ default_factory=EmbedderConfigFactory,
259
+ description="Embedder configuration for the memory embedding",
260
+ )
261
+ reranker: RerankerConfigFactory | None = Field(
262
+ None,
263
+ description="Reranker configuration (optional).",
264
+ )
265
+ graph_db: GraphDBConfigFactory = Field(
266
+ ...,
267
+ default_factory=GraphDBConfigFactory,
268
+ description="Graph database configuration for the tree-memory storage",
269
+ )
270
+ reorganize: bool | None = Field(
271
+ False,
272
+ description="Optional description for this memory configuration.",
273
+ )
274
+
275
+ memory_size: dict[str, Any] | None = Field(
276
+ default=None,
277
+ description=(
278
+ "Maximum item counts per memory bucket, e.g.: "
279
+ '{"WorkingMemory": 20, "LongTermMemory": 10000, "UserMemory": 10000}'
280
+ ),
281
+ )
282
+
283
+ mem_reader: MemReaderConfigFactory = Field(
284
+ ...,
285
+ default_factory=MemReaderConfigFactory,
286
+ description="MemReader configuration for the Feedback",
287
+ )
288
+
289
+
290
+ # ─── 3. Global Memory Config Factory ──────────────────────────────────────────
291
+
292
+
293
+ class MemoryConfigFactory(BaseConfig):
294
+ """Factory class for creating memory configurations."""
295
+
296
+ backend: str = Field("uninitialized", description="Backend for memory")
297
+ config: dict[str, Any] = Field({}, description="Configuration for the memory backend")
298
+
299
+ backend_to_class: ClassVar[dict[str, Any]] = {
300
+ "naive_text": NaiveTextMemoryConfig,
301
+ "general_text": GeneralTextMemoryConfig,
302
+ "simple_tree_text": SimpleTreeTextMemoryConfig,
303
+ "tree_text": TreeTextMemoryConfig,
304
+ "pref_text": PreferenceTextMemoryConfig,
305
+ "kv_cache": KVCacheMemoryConfig,
306
+ "vllm_kv_cache": KVCacheMemoryConfig, # Use same config as kv_cache
307
+ "lora": LoRAMemoryConfig,
308
+ "uninitialized": UninitializedMemoryConfig,
309
+ "mem_feedback": MemFeedbackConfig,
310
+ }
311
+
312
+ @field_validator("backend")
313
+ @classmethod
314
+ def validate_backend(cls, backend: str) -> str:
315
+ """Validate the backend field."""
316
+ if backend not in cls.backend_to_class:
317
+ raise ConfigurationError(f"Invalid backend: {backend}")
318
+ return backend
319
+
320
+ @model_validator(mode="after")
321
+ def create_config(self) -> "MemoryConfigFactory":
322
+ config_class = self.backend_to_class[self.backend]
323
+ self.config = config_class(**self.config)
324
+ return self
@@ -0,0 +1,38 @@
1
+ from typing import Any, ClassVar
2
+
3
+ from pydantic import Field, field_validator, model_validator
4
+
5
+ from memos.configs.base import BaseConfig
6
+
7
+
8
+ class BaseParserConfig(BaseConfig):
9
+ """Base configuration class for parser models."""
10
+
11
+
12
+ class MarkItDownParserConfig(BaseParserConfig):
13
+ pass
14
+
15
+
16
+ class ParserConfigFactory(BaseConfig):
17
+ """Factory class for creating Parser configurations."""
18
+
19
+ backend: str = Field(..., description="Backend for parser")
20
+ config: dict[str, Any] = Field(..., description="Configuration for the parser backend")
21
+
22
+ backend_to_class: ClassVar[dict[str, Any]] = {
23
+ "markitdown": MarkItDownParserConfig,
24
+ }
25
+
26
+ @field_validator("backend")
27
+ @classmethod
28
+ def validate_backend(cls, backend: str) -> str:
29
+ """Validate the backend field."""
30
+ if backend not in cls.backend_to_class:
31
+ raise ValueError(f"Invalid backend: {backend}")
32
+ return backend
33
+
34
+ @model_validator(mode="after")
35
+ def create_config(self) -> "ParserConfigFactory":
36
+ config_class = self.backend_to_class[self.backend]
37
+ self.config = config_class(**self.config)
38
+ return self
@@ -0,0 +1,18 @@
1
+ # memos/configs/reranker.py
2
+ from __future__ import annotations
3
+
4
+ from typing import Any
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class RerankerConfigFactory(BaseModel):
10
+ """
11
+ {
12
+ "backend": "http_bge" | "cosine_local" | "noop",
13
+ "config": { ... backend-specific ... }
14
+ }
15
+ """
16
+
17
+ backend: str = Field(..., description="Reranker backend id")
18
+ config: dict[str, Any] = Field(default_factory=dict, description="Backend-specific options")
memos/configs/utils.py ADDED
@@ -0,0 +1,8 @@
1
+ import json
2
+
3
+
4
+ def get_json_file_model_schema(json_path: str) -> str:
5
+ """Retrieve the model schema from a JSON file."""
6
+ with open(json_path, encoding="utf-8") as f:
7
+ data = json.load(f)
8
+ return data.get("model_schema", None)
@@ -0,0 +1,80 @@
1
+ from typing import Any, ClassVar, Literal
2
+
3
+ from pydantic import Field, field_validator, model_validator
4
+
5
+ from memos import settings
6
+ from memos.configs.base import BaseConfig
7
+ from memos.log import get_logger
8
+
9
+
10
+ logger = get_logger(__name__)
11
+
12
+
13
+ class BaseVecDBConfig(BaseConfig):
14
+ """Base class for all vector database configurations."""
15
+
16
+ collection_name: str = Field(..., description="Name of the collection")
17
+ vector_dimension: int | None = Field(default=None, description="Dimension of the vectors")
18
+ distance_metric: Literal["cosine", "euclidean", "dot"] | None = Field(
19
+ default=None,
20
+ description="Distance metric for vector similarity calculation. Options: 'cosine', 'euclidean', 'dot'",
21
+ )
22
+
23
+
24
+ class QdrantVecDBConfig(BaseVecDBConfig):
25
+ """Configuration for Qdrant vector database."""
26
+
27
+ host: str | None = Field(default=None, description="Host for Qdrant")
28
+ port: int | None = Field(default=None, description="Port for Qdrant")
29
+ path: str | None = Field(default=None, description="Path for Qdrant")
30
+ url: str | None = Field(default=None, description="Qdrant Cloud/remote endpoint URL")
31
+ api_key: str | None = Field(default=None, description="Qdrant Cloud API key")
32
+
33
+ @model_validator(mode="after")
34
+ def set_default_path(self):
35
+ # Only fall back to embedded/local path when no remote host/port/path/url is provided.
36
+ if all(x is None for x in (self.host, self.port, self.path, self.url)):
37
+ logger.warning(
38
+ "No host, port, or path provided for Qdrant. Defaulting to local path: %s",
39
+ settings.MEMOS_DIR / "qdrant",
40
+ )
41
+ self.path = str(settings.MEMOS_DIR / "qdrant")
42
+ return self
43
+
44
+
45
+ class MilvusVecDBConfig(BaseVecDBConfig):
46
+ """Configuration for Milvus vector database."""
47
+
48
+ uri: str = Field(..., description="URI for Milvus connection")
49
+ collection_name: list[str] = Field(..., description="Name(s) of the collection(s)")
50
+ max_length: int = Field(
51
+ default=65535, description="Maximum length for string fields (varChar type)"
52
+ )
53
+ user_name: str = Field(default="", description="User name for Milvus connection")
54
+ password: str = Field(default="", description="Password for Milvus connection")
55
+
56
+
57
+ class VectorDBConfigFactory(BaseConfig):
58
+ """Factory class for creating vector database configurations."""
59
+
60
+ backend: str = Field(..., description="Backend for vector database")
61
+ config: dict[str, Any] = Field(..., description="Configuration for the vector database backend")
62
+
63
+ backend_to_class: ClassVar[dict[str, Any]] = {
64
+ "qdrant": QdrantVecDBConfig,
65
+ "milvus": MilvusVecDBConfig,
66
+ }
67
+
68
+ @field_validator("backend")
69
+ @classmethod
70
+ def validate_backend(cls, backend: str) -> str:
71
+ """Validate the backend field."""
72
+ if backend not in cls.backend_to_class:
73
+ raise ValueError(f"Invalid vector database backend: {backend}")
74
+ return backend
75
+
76
+ @model_validator(mode="after")
77
+ def create_config(self) -> "VectorDBConfigFactory":
78
+ config_class = self.backend_to_class[self.backend]
79
+ self.config = config_class(**self.config)
80
+ return self