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.
- {memoryos-0.2.0.dist-info → memoryos-0.2.2.dist-info}/METADATA +67 -26
- memoryos-0.2.2.dist-info/RECORD +169 -0
- memoryos-0.2.2.dist-info/entry_points.txt +3 -0
- memos/__init__.py +1 -1
- memos/api/config.py +562 -0
- memos/api/context/context.py +147 -0
- memos/api/context/dependencies.py +90 -0
- memos/api/exceptions.py +28 -0
- memos/api/mcp_serve.py +502 -0
- memos/api/product_api.py +35 -0
- memos/api/product_models.py +163 -0
- memos/api/routers/__init__.py +1 -0
- memos/api/routers/product_router.py +386 -0
- memos/chunkers/sentence_chunker.py +8 -2
- memos/cli.py +113 -0
- memos/configs/embedder.py +27 -0
- memos/configs/graph_db.py +132 -3
- memos/configs/internet_retriever.py +6 -0
- memos/configs/llm.py +47 -0
- memos/configs/mem_cube.py +1 -1
- memos/configs/mem_os.py +5 -0
- memos/configs/mem_reader.py +9 -0
- memos/configs/mem_scheduler.py +107 -7
- memos/configs/mem_user.py +58 -0
- memos/configs/memory.py +5 -4
- memos/dependency.py +52 -0
- memos/embedders/ark.py +92 -0
- memos/embedders/factory.py +4 -0
- memos/embedders/sentence_transformer.py +8 -2
- memos/embedders/universal_api.py +32 -0
- memos/graph_dbs/base.py +11 -3
- memos/graph_dbs/factory.py +4 -0
- memos/graph_dbs/nebular.py +1364 -0
- memos/graph_dbs/neo4j.py +333 -124
- memos/graph_dbs/neo4j_community.py +300 -0
- memos/llms/base.py +9 -0
- memos/llms/deepseek.py +54 -0
- memos/llms/factory.py +10 -1
- memos/llms/hf.py +170 -13
- memos/llms/hf_singleton.py +114 -0
- memos/llms/ollama.py +4 -0
- memos/llms/openai.py +67 -1
- memos/llms/qwen.py +63 -0
- memos/llms/vllm.py +153 -0
- memos/log.py +1 -1
- memos/mem_cube/general.py +77 -16
- memos/mem_cube/utils.py +109 -0
- memos/mem_os/core.py +251 -51
- memos/mem_os/main.py +94 -12
- memos/mem_os/product.py +1220 -43
- memos/mem_os/utils/default_config.py +352 -0
- memos/mem_os/utils/format_utils.py +1401 -0
- memos/mem_reader/simple_struct.py +18 -10
- memos/mem_scheduler/base_scheduler.py +441 -40
- memos/mem_scheduler/general_scheduler.py +249 -248
- memos/mem_scheduler/modules/base.py +14 -5
- memos/mem_scheduler/modules/dispatcher.py +67 -4
- memos/mem_scheduler/modules/misc.py +104 -0
- memos/mem_scheduler/modules/monitor.py +240 -50
- memos/mem_scheduler/modules/rabbitmq_service.py +319 -0
- memos/mem_scheduler/modules/redis_service.py +32 -22
- memos/mem_scheduler/modules/retriever.py +167 -23
- memos/mem_scheduler/modules/scheduler_logger.py +255 -0
- memos/mem_scheduler/mos_for_test_scheduler.py +140 -0
- memos/mem_scheduler/schemas/__init__.py +0 -0
- memos/mem_scheduler/schemas/general_schemas.py +43 -0
- memos/mem_scheduler/{modules/schemas.py → schemas/message_schemas.py} +63 -61
- memos/mem_scheduler/schemas/monitor_schemas.py +329 -0
- memos/mem_scheduler/utils/__init__.py +0 -0
- memos/mem_scheduler/utils/filter_utils.py +176 -0
- memos/mem_scheduler/utils/misc_utils.py +61 -0
- memos/mem_user/factory.py +94 -0
- memos/mem_user/mysql_persistent_user_manager.py +271 -0
- memos/mem_user/mysql_user_manager.py +500 -0
- memos/mem_user/persistent_factory.py +96 -0
- memos/mem_user/persistent_user_manager.py +260 -0
- memos/mem_user/user_manager.py +4 -4
- memos/memories/activation/item.py +29 -0
- memos/memories/activation/kv.py +10 -3
- memos/memories/activation/vllmkv.py +219 -0
- memos/memories/factory.py +2 -0
- memos/memories/textual/base.py +1 -1
- memos/memories/textual/general.py +43 -97
- memos/memories/textual/item.py +5 -33
- memos/memories/textual/tree.py +22 -12
- memos/memories/textual/tree_text_memory/organize/conflict.py +9 -5
- memos/memories/textual/tree_text_memory/organize/manager.py +26 -18
- memos/memories/textual/tree_text_memory/organize/redundancy.py +25 -44
- memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +50 -48
- memos/memories/textual/tree_text_memory/organize/reorganizer.py +81 -56
- memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +6 -3
- memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +2 -0
- memos/memories/textual/tree_text_memory/retrieve/recall.py +0 -1
- memos/memories/textual/tree_text_memory/retrieve/reranker.py +2 -2
- memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +2 -0
- memos/memories/textual/tree_text_memory/retrieve/searcher.py +52 -28
- memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +42 -15
- memos/memories/textual/tree_text_memory/retrieve/utils.py +11 -7
- memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +62 -58
- memos/memos_tools/dinding_report_bot.py +422 -0
- memos/memos_tools/notification_service.py +44 -0
- memos/memos_tools/notification_utils.py +96 -0
- memos/parsers/markitdown.py +8 -2
- memos/settings.py +3 -1
- memos/templates/mem_reader_prompts.py +66 -23
- memos/templates/mem_scheduler_prompts.py +126 -43
- memos/templates/mos_prompts.py +87 -0
- memos/templates/tree_reorganize_prompts.py +85 -30
- memos/vec_dbs/base.py +12 -0
- memos/vec_dbs/qdrant.py +46 -20
- memoryos-0.2.0.dist-info/RECORD +0 -128
- memos/mem_scheduler/utils.py +0 -26
- {memoryos-0.2.0.dist-info → memoryos-0.2.2.dist-info}/LICENSE +0 -0
- {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
|
-
|
|
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(
|
|
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.
|
|
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(
|