MemoryOS 0.2.0__py3-none-any.whl → 0.2.2__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.

Potentially problematic release.


This version of MemoryOS might be problematic. Click here for more details.

Files changed (114) hide show
  1. {memoryos-0.2.0.dist-info → memoryos-0.2.2.dist-info}/METADATA +67 -26
  2. memoryos-0.2.2.dist-info/RECORD +169 -0
  3. memoryos-0.2.2.dist-info/entry_points.txt +3 -0
  4. memos/__init__.py +1 -1
  5. memos/api/config.py +562 -0
  6. memos/api/context/context.py +147 -0
  7. memos/api/context/dependencies.py +90 -0
  8. memos/api/exceptions.py +28 -0
  9. memos/api/mcp_serve.py +502 -0
  10. memos/api/product_api.py +35 -0
  11. memos/api/product_models.py +163 -0
  12. memos/api/routers/__init__.py +1 -0
  13. memos/api/routers/product_router.py +386 -0
  14. memos/chunkers/sentence_chunker.py +8 -2
  15. memos/cli.py +113 -0
  16. memos/configs/embedder.py +27 -0
  17. memos/configs/graph_db.py +132 -3
  18. memos/configs/internet_retriever.py +6 -0
  19. memos/configs/llm.py +47 -0
  20. memos/configs/mem_cube.py +1 -1
  21. memos/configs/mem_os.py +5 -0
  22. memos/configs/mem_reader.py +9 -0
  23. memos/configs/mem_scheduler.py +107 -7
  24. memos/configs/mem_user.py +58 -0
  25. memos/configs/memory.py +5 -4
  26. memos/dependency.py +52 -0
  27. memos/embedders/ark.py +92 -0
  28. memos/embedders/factory.py +4 -0
  29. memos/embedders/sentence_transformer.py +8 -2
  30. memos/embedders/universal_api.py +32 -0
  31. memos/graph_dbs/base.py +11 -3
  32. memos/graph_dbs/factory.py +4 -0
  33. memos/graph_dbs/nebular.py +1364 -0
  34. memos/graph_dbs/neo4j.py +333 -124
  35. memos/graph_dbs/neo4j_community.py +300 -0
  36. memos/llms/base.py +9 -0
  37. memos/llms/deepseek.py +54 -0
  38. memos/llms/factory.py +10 -1
  39. memos/llms/hf.py +170 -13
  40. memos/llms/hf_singleton.py +114 -0
  41. memos/llms/ollama.py +4 -0
  42. memos/llms/openai.py +67 -1
  43. memos/llms/qwen.py +63 -0
  44. memos/llms/vllm.py +153 -0
  45. memos/log.py +1 -1
  46. memos/mem_cube/general.py +77 -16
  47. memos/mem_cube/utils.py +109 -0
  48. memos/mem_os/core.py +251 -51
  49. memos/mem_os/main.py +94 -12
  50. memos/mem_os/product.py +1220 -43
  51. memos/mem_os/utils/default_config.py +352 -0
  52. memos/mem_os/utils/format_utils.py +1401 -0
  53. memos/mem_reader/simple_struct.py +18 -10
  54. memos/mem_scheduler/base_scheduler.py +441 -40
  55. memos/mem_scheduler/general_scheduler.py +249 -248
  56. memos/mem_scheduler/modules/base.py +14 -5
  57. memos/mem_scheduler/modules/dispatcher.py +67 -4
  58. memos/mem_scheduler/modules/misc.py +104 -0
  59. memos/mem_scheduler/modules/monitor.py +240 -50
  60. memos/mem_scheduler/modules/rabbitmq_service.py +319 -0
  61. memos/mem_scheduler/modules/redis_service.py +32 -22
  62. memos/mem_scheduler/modules/retriever.py +167 -23
  63. memos/mem_scheduler/modules/scheduler_logger.py +255 -0
  64. memos/mem_scheduler/mos_for_test_scheduler.py +140 -0
  65. memos/mem_scheduler/schemas/__init__.py +0 -0
  66. memos/mem_scheduler/schemas/general_schemas.py +43 -0
  67. memos/mem_scheduler/{modules/schemas.py → schemas/message_schemas.py} +63 -61
  68. memos/mem_scheduler/schemas/monitor_schemas.py +329 -0
  69. memos/mem_scheduler/utils/__init__.py +0 -0
  70. memos/mem_scheduler/utils/filter_utils.py +176 -0
  71. memos/mem_scheduler/utils/misc_utils.py +61 -0
  72. memos/mem_user/factory.py +94 -0
  73. memos/mem_user/mysql_persistent_user_manager.py +271 -0
  74. memos/mem_user/mysql_user_manager.py +500 -0
  75. memos/mem_user/persistent_factory.py +96 -0
  76. memos/mem_user/persistent_user_manager.py +260 -0
  77. memos/mem_user/user_manager.py +4 -4
  78. memos/memories/activation/item.py +29 -0
  79. memos/memories/activation/kv.py +10 -3
  80. memos/memories/activation/vllmkv.py +219 -0
  81. memos/memories/factory.py +2 -0
  82. memos/memories/textual/base.py +1 -1
  83. memos/memories/textual/general.py +43 -97
  84. memos/memories/textual/item.py +5 -33
  85. memos/memories/textual/tree.py +22 -12
  86. memos/memories/textual/tree_text_memory/organize/conflict.py +9 -5
  87. memos/memories/textual/tree_text_memory/organize/manager.py +26 -18
  88. memos/memories/textual/tree_text_memory/organize/redundancy.py +25 -44
  89. memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +50 -48
  90. memos/memories/textual/tree_text_memory/organize/reorganizer.py +81 -56
  91. memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +6 -3
  92. memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +2 -0
  93. memos/memories/textual/tree_text_memory/retrieve/recall.py +0 -1
  94. memos/memories/textual/tree_text_memory/retrieve/reranker.py +2 -2
  95. memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +2 -0
  96. memos/memories/textual/tree_text_memory/retrieve/searcher.py +52 -28
  97. memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +42 -15
  98. memos/memories/textual/tree_text_memory/retrieve/utils.py +11 -7
  99. memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +62 -58
  100. memos/memos_tools/dinding_report_bot.py +422 -0
  101. memos/memos_tools/notification_service.py +44 -0
  102. memos/memos_tools/notification_utils.py +96 -0
  103. memos/parsers/markitdown.py +8 -2
  104. memos/settings.py +3 -1
  105. memos/templates/mem_reader_prompts.py +66 -23
  106. memos/templates/mem_scheduler_prompts.py +126 -43
  107. memos/templates/mos_prompts.py +87 -0
  108. memos/templates/tree_reorganize_prompts.py +85 -30
  109. memos/vec_dbs/base.py +12 -0
  110. memos/vec_dbs/qdrant.py +46 -20
  111. memoryos-0.2.0.dist-info/RECORD +0 -128
  112. memos/mem_scheduler/utils.py +0 -26
  113. {memoryos-0.2.0.dist-info → memoryos-0.2.2.dist-info}/LICENSE +0 -0
  114. {memoryos-0.2.0.dist-info → memoryos-0.2.2.dist-info}/WHEEL +0 -0
memos/mem_os/main.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import concurrent.futures
2
2
  import json
3
+ import os
3
4
 
4
5
  from typing import Any
5
6
 
@@ -7,6 +8,7 @@ from memos.configs.mem_os import MOSConfig
7
8
  from memos.llms.factory import LLMFactory
8
9
  from memos.log import get_logger
9
10
  from memos.mem_os.core import MOSCore
11
+ from memos.mem_os.utils.default_config import get_default
10
12
  from memos.memories.textual.base import BaseTextMemory
11
13
  from memos.templates.mos_prompts import (
12
14
  COT_DECOMPOSE_PROMPT,
@@ -24,20 +26,94 @@ class MOS(MOSCore):
24
26
  This class maintains backward compatibility with the original MOS interface.
25
27
  """
26
28
 
27
- def __init__(self, config: MOSConfig):
29
+ def __init__(self, config: MOSConfig | None = None):
30
+ """
31
+ Initialize MOS with optional automatic configuration.
32
+
33
+ Args:
34
+ config (MOSConfig, optional): MOS configuration. If None, will use automatic configuration from environment variables.
35
+ """
36
+ if config is None:
37
+ # Auto-configure if no config provided
38
+ config, default_cube = self._auto_configure()
39
+ self._auto_registered_cube = default_cube
40
+ else:
41
+ self._auto_registered_cube = None
42
+
28
43
  self.enable_cot = config.PRO_MODE
29
44
  if config.PRO_MODE:
30
45
  print(PRO_MODE_WELCOME_MESSAGE)
31
46
  logger.info(PRO_MODE_WELCOME_MESSAGE)
32
47
  super().__init__(config)
33
48
 
34
- def chat(self, query: str, user_id: str | None = None) -> str:
49
+ # Auto-register cube if one was created
50
+ if self._auto_registered_cube is not None:
51
+ self.register_mem_cube(self._auto_registered_cube)
52
+ logger.info(
53
+ f"Auto-registered default cube: {self._auto_registered_cube.config.cube_id}"
54
+ )
55
+
56
+ def _auto_configure(self, **kwargs) -> tuple[MOSConfig, Any]:
57
+ """
58
+ Automatically configure MOS with default settings.
59
+
60
+ Returns:
61
+ tuple[MOSConfig, Any]: MOS configuration and default MemCube
62
+ """
63
+ # Get configuration from environment variables
64
+ openai_api_key = os.getenv("OPENAI_API_KEY")
65
+ openai_api_base = os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1")
66
+ text_mem_type = os.getenv("MOS_TEXT_MEM_TYPE", "general_text")
67
+
68
+ if not openai_api_key:
69
+ raise ValueError("OPENAI_API_KEY environment variable is required")
70
+
71
+ logger.info(f"Auto-configuring MOS with text_mem_type: {text_mem_type}")
72
+ return get_default(
73
+ openai_api_key=openai_api_key,
74
+ openai_api_base=openai_api_base,
75
+ text_mem_type=text_mem_type,
76
+ )
77
+
78
+ @classmethod
79
+ def simple(cls) -> "MOS":
80
+ """
81
+ Create a MOS instance with automatic configuration from environment variables.
82
+
83
+ This is the simplest way to get started with MemOS.
84
+
85
+ Environment variables needed:
86
+ - OPENAI_API_KEY: Your OpenAI API key
87
+ - OPENAI_API_BASE: OpenAI API base URL (optional, defaults to "https://api.openai.com/v1")
88
+ - MOS_TEXT_MEM_TYPE: Text memory type (optional, defaults to "general_text")
89
+
90
+ Returns:
91
+ MOS: Configured MOS instance with auto-registered default cube
92
+
93
+ Example:
94
+ ```python
95
+ # Set environment variables
96
+ export OPENAI_API_KEY="your-api-key"
97
+ export MOS_TEXT_MEM_TYPE="general_text"
98
+
99
+ # Then use
100
+ memory = MOS.simple()
101
+ memory.add_memory("Hello world!")
102
+ response = memory.chat("What did I just say?")
103
+ ```
104
+ """
105
+ return cls()
106
+
107
+ def chat(self, query: str, user_id: str | None = None, base_prompt: str | None = None) -> str:
35
108
  """
36
109
  Enhanced chat method with optional CoT (Chain of Thought) enhancement.
37
110
 
38
111
  Args:
39
112
  query (str): The user's query.
40
113
  user_id (str, optional): User ID for context.
114
+ base_prompt (str, optional): A custom base prompt to use for the chat.
115
+ It can be a template string with a `{memories}` placeholder.
116
+ If not provided, a default prompt is used.
41
117
 
42
118
  Returns:
43
119
  str: The response from the MOS.
@@ -46,12 +122,14 @@ class MOS(MOSCore):
46
122
 
47
123
  if not self.enable_cot:
48
124
  # Use the original chat method from core
49
- return super().chat(query, user_id)
125
+ return super().chat(query, user_id, base_prompt=base_prompt)
50
126
 
51
127
  # Enhanced chat with CoT decomposition
52
- return self._chat_with_cot_enhancement(query, user_id)
128
+ return self._chat_with_cot_enhancement(query, user_id, base_prompt=base_prompt)
53
129
 
54
- def _chat_with_cot_enhancement(self, query: str, user_id: str | None = None) -> str:
130
+ def _chat_with_cot_enhancement(
131
+ self, query: str, user_id: str | None = None, base_prompt: str | None = None
132
+ ) -> str:
55
133
  """
56
134
  Chat with CoT enhancement for complex query decomposition.
57
135
  This method includes all the same validation and processing logic as the core chat method.
@@ -84,7 +162,7 @@ class MOS(MOSCore):
84
162
  # Check if the query is complex and needs decomposition
85
163
  if not decomposition_result.get("is_complex", False):
86
164
  logger.info("🔍 [CoT] Query is not complex, using standard chat")
87
- return super().chat(query, user_id)
165
+ return super().chat(query, user_id, base_prompt=base_prompt)
88
166
 
89
167
  sub_questions = decomposition_result.get("sub_questions", [])
90
168
  logger.info(f"🔍 [CoT] Decomposed into {len(sub_questions)} sub-questions")
@@ -93,7 +171,7 @@ class MOS(MOSCore):
93
171
  search_engine = self._get_search_engine_for_cot_with_validation(user_cube_ids)
94
172
  if not search_engine:
95
173
  logger.warning("🔍 [CoT] No search engine available, using standard chat")
96
- return super().chat(query, user_id)
174
+ return super().chat(query, user_id, base_prompt=base_prompt)
97
175
 
98
176
  # Step 4: Get answers for sub-questions
99
177
  logger.info("🔍 [CoT] Getting answers for sub-questions...")
@@ -115,6 +193,7 @@ class MOS(MOSCore):
115
193
  chat_history=chat_history,
116
194
  user_id=target_user_id,
117
195
  search_engine=search_engine,
196
+ base_prompt=base_prompt,
118
197
  )
119
198
 
120
199
  # Step 6: Update chat history (same as core method)
@@ -129,7 +208,7 @@ class MOS(MOSCore):
129
208
  if self.enable_mem_scheduler and self.mem_scheduler is not None:
130
209
  from datetime import datetime
131
210
 
132
- from memos.mem_scheduler.modules.schemas import (
211
+ from memos.mem_scheduler.schemas import (
133
212
  ANSWER_LABEL,
134
213
  ScheduleMessageItem,
135
214
  )
@@ -149,7 +228,7 @@ class MOS(MOSCore):
149
228
  except Exception as e:
150
229
  logger.error(f"🔍 [CoT] Error in CoT enhancement: {e}")
151
230
  logger.info("🔍 [CoT] Falling back to standard chat")
152
- return super().chat(query, user_id)
231
+ return super().chat(query, user_id, base_prompt=base_prompt)
153
232
 
154
233
  def _get_search_engine_for_cot_with_validation(
155
234
  self, user_cube_ids: list[str]
@@ -183,6 +262,7 @@ class MOS(MOSCore):
183
262
  chat_history: Any,
184
263
  user_id: str | None = None,
185
264
  search_engine: BaseTextMemory | None = None,
265
+ base_prompt: str | None = None,
186
266
  ) -> str:
187
267
  """
188
268
  Generate an enhanced response using sub-questions and their answers, with chat context.
@@ -193,6 +273,8 @@ class MOS(MOSCore):
193
273
  sub_answers (list[str]): List of answers to sub-questions.
194
274
  chat_history: The user's chat history.
195
275
  user_id (str, optional): User ID for context.
276
+ search_engine (BaseTextMemory, optional): Search engine for context retrieval.
277
+ base_prompt (str, optional): A custom base prompt for the chat.
196
278
 
197
279
  Returns:
198
280
  str: The enhanced response.
@@ -213,10 +295,10 @@ class MOS(MOSCore):
213
295
  original_query, top_k=self.config.top_k, mode="fast"
214
296
  )
215
297
  system_prompt = self._build_system_prompt(
216
- search_memories
298
+ search_memories, base_prompt=base_prompt
217
299
  ) # Use the same system prompt builder
218
300
  else:
219
- system_prompt = self._build_system_prompt()
301
+ system_prompt = self._build_system_prompt(base_prompt=base_prompt)
220
302
  current_messages = [
221
303
  {"role": "system", "content": system_prompt + SYNTHESIS_PROMPT.format(qa_text=qa_text)},
222
304
  *chat_history.chat_history,
@@ -261,7 +343,7 @@ class MOS(MOSCore):
261
343
  except Exception as e:
262
344
  logger.error(f"🔍 [CoT] Error generating enhanced response: {e}")
263
345
  # Fallback to standard chat
264
- return super().chat(original_query, user_id)
346
+ return super().chat(original_query, user_id, base_prompt=base_prompt)
265
347
 
266
348
  @classmethod
267
349
  def cot_decompose(