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
@@ -0,0 +1,352 @@
1
+ """
2
+ Default configuration utilities for MemOS.
3
+ Provides simplified configuration generation for users.
4
+ """
5
+
6
+ from typing import Literal
7
+
8
+ from memos.configs.mem_cube import GeneralMemCubeConfig
9
+ from memos.configs.mem_os import MOSConfig
10
+ from memos.mem_cube.general import GeneralMemCube
11
+
12
+
13
+ def get_default_config(
14
+ openai_api_key: str,
15
+ openai_api_base: str = "https://api.openai.com/v1",
16
+ text_mem_type: Literal["tree_text", "general_text"] = "general_text",
17
+ user_id: str = "default_user",
18
+ **kwargs,
19
+ ) -> MOSConfig:
20
+ """
21
+ Generate a default MOS configuration with minimal user input.
22
+
23
+ Args:
24
+ openai_api_key (str): OpenAI API key
25
+ openai_api_base (str): OpenAI API base URL, defaults to "https://api.openai.com/v1"
26
+ text_mem_type (str): Type of text memory, either "tree_text" or "general_text"
27
+ user_id (str): User ID for the configuration
28
+ **kwargs: Additional configuration overrides
29
+
30
+ Returns:
31
+ MOSConfig: Complete MOS configuration object
32
+
33
+ Example:
34
+ ```python
35
+ config = get_default_config(
36
+ openai_api_key="sk-...",
37
+ openai_api_base="https://api.openai.com/v1",
38
+ text_mem_type="general_text"
39
+ )
40
+ mos = MOS(config)
41
+ ```
42
+ """
43
+
44
+ # Base OpenAI configuration
45
+ openai_config = {
46
+ "model_name_or_path": kwargs.get("model_name", "gpt-4o-mini"),
47
+ "temperature": kwargs.get("temperature", 0.8),
48
+ "max_tokens": kwargs.get("max_tokens", 1024),
49
+ "top_p": kwargs.get("top_p", 0.9),
50
+ "top_k": kwargs.get("top_k", 50),
51
+ "remove_think_prefix": True,
52
+ "api_key": openai_api_key,
53
+ "api_base": openai_api_base,
54
+ }
55
+
56
+ # Universal API embedder configuration (using OpenAI)
57
+ embedder_config = {
58
+ "backend": "universal_api",
59
+ "config": {
60
+ "provider": "openai",
61
+ "api_key": openai_api_key,
62
+ "model_name_or_path": kwargs.get("embedder_model", "text-embedding-3-large"),
63
+ "base_url": openai_api_base,
64
+ },
65
+ }
66
+
67
+ # Base configuration
68
+ config_dict = {
69
+ "user_id": user_id,
70
+ "chat_model": {
71
+ "backend": "openai",
72
+ "config": openai_config,
73
+ },
74
+ "mem_reader": {
75
+ "backend": "simple_struct",
76
+ "config": {
77
+ "llm": {
78
+ "backend": "openai",
79
+ "config": openai_config,
80
+ },
81
+ "embedder": embedder_config,
82
+ "chunker": {
83
+ "backend": "sentence",
84
+ "config": {
85
+ "tokenizer_or_token_counter": "gpt2",
86
+ "chunk_size": kwargs.get("chunk_size", 512),
87
+ "chunk_overlap": kwargs.get("chunk_overlap", 128),
88
+ "min_sentences_per_chunk": 1,
89
+ },
90
+ },
91
+ },
92
+ },
93
+ "enable_textual_memory": True,
94
+ "enable_activation_memory": kwargs.get("enable_activation_memory", False),
95
+ "top_k": kwargs.get("top_k", 5),
96
+ "max_turns_window": kwargs.get("max_turns_window", 20),
97
+ "enable_mem_scheduler": kwargs.get("enable_mem_scheduler", False),
98
+ }
99
+
100
+ # Note: text_mem configuration is handled in get_default_cube_config
101
+ # MOSConfig doesn't have text_mem field, it's only in MemCube config
102
+
103
+ # Add scheduler configuration if enabled
104
+ if config_dict.get("enable_mem_scheduler", False):
105
+ config_dict["mem_scheduler"] = {
106
+ "backend": "general_scheduler",
107
+ "config": {
108
+ "top_k": kwargs.get("scheduler_top_k", 10),
109
+ "top_n": kwargs.get("scheduler_top_n", 5),
110
+ "act_mem_update_interval": kwargs.get("scheduler_act_mem_update_interval", 300),
111
+ "context_window_size": kwargs.get("scheduler_context_window_size", 5),
112
+ "thread_pool_max_workers": kwargs.get("scheduler_thread_pool_max_workers", 10),
113
+ "consume_interval_seconds": kwargs.get("scheduler_consume_interval_seconds", 3),
114
+ "enable_parallel_dispatch": kwargs.get("scheduler_enable_parallel_dispatch", True),
115
+ "enable_act_memory_update": True,
116
+ },
117
+ }
118
+
119
+ # Add activation memory if enabled
120
+ if config_dict.get("enable_activation_memory", False):
121
+ config_dict["act_mem"] = {
122
+ "backend": "kv_cache",
123
+ "config": {
124
+ "memory_filename": kwargs.get(
125
+ "activation_memory_filename", "activation_memory.pickle"
126
+ ),
127
+ "extractor_llm": {
128
+ "backend": "openai",
129
+ "config": openai_config,
130
+ },
131
+ },
132
+ }
133
+
134
+ return MOSConfig(**config_dict)
135
+
136
+
137
+ def get_default_cube_config(
138
+ openai_api_key: str,
139
+ openai_api_base: str = "https://api.openai.com/v1",
140
+ text_mem_type: Literal["tree_text", "general_text"] = "general_text",
141
+ user_id: str = "default_user",
142
+ **kwargs,
143
+ ) -> GeneralMemCubeConfig:
144
+ """
145
+ Generate a default MemCube configuration with minimal user input.
146
+
147
+ Args:
148
+ openai_api_key (str): OpenAI API key
149
+ openai_api_base (str): OpenAI API base URL, defaults to "https://api.openai.com/v1"
150
+ text_mem_type (str): Type of text memory, either "tree_text" or "general_text"
151
+ user_id (str): User ID for the configuration
152
+ **kwargs: Additional configuration overrides
153
+
154
+ Returns:
155
+ GeneralMemCubeConfig: Complete MemCube configuration object
156
+ """
157
+
158
+ # Base OpenAI configuration
159
+ openai_config = {
160
+ "model_name_or_path": kwargs.get("model_name", "gpt-4o-mini"),
161
+ "temperature": kwargs.get("temperature", 0.8),
162
+ "max_tokens": kwargs.get("max_tokens", 1024),
163
+ "top_p": kwargs.get("top_p", 0.9),
164
+ "top_k": kwargs.get("top_k", 50),
165
+ "remove_think_prefix": True,
166
+ "api_key": openai_api_key,
167
+ "api_base": openai_api_base,
168
+ }
169
+
170
+ # Universal API embedder configuration (using OpenAI)
171
+ embedder_config = {
172
+ "backend": "universal_api",
173
+ "config": {
174
+ "provider": "openai",
175
+ "api_key": openai_api_key,
176
+ "model_name_or_path": kwargs.get("embedder_model", "text-embedding-3-large"),
177
+ "base_url": openai_api_base,
178
+ },
179
+ }
180
+
181
+ # Configure text memory based on type
182
+ if text_mem_type == "tree_text":
183
+ # Tree text memory requires Neo4j configuration
184
+ db_name = f"memos{user_id.replace('-', '').replace('_', '')}"
185
+ if not kwargs.get("use_multi_db", False):
186
+ db_name = kwargs.get("neo4j_db_name", "defaultdb")
187
+ neo4j_config = {
188
+ "uri": kwargs.get("neo4j_uri", "bolt://localhost:7687"),
189
+ "user": kwargs.get("neo4j_user", "neo4j"),
190
+ "db_name": db_name,
191
+ "password": kwargs.get("neo4j_password", "12345678"),
192
+ "auto_create": True,
193
+ "use_multi_db": kwargs.get("use_multi_db", False),
194
+ "embedding_dimension": kwargs.get("embedding_dimension", 3072),
195
+ }
196
+ if not kwargs.get("use_multi_db", False):
197
+ neo4j_config["user_name"] = f"memos{user_id.replace('-', '').replace('_', '')}"
198
+
199
+ text_mem_config = {
200
+ "backend": "tree_text",
201
+ "config": {
202
+ "extractor_llm": {"backend": "openai", "config": openai_config},
203
+ "dispatcher_llm": {"backend": "openai", "config": openai_config},
204
+ "graph_db": {
205
+ "backend": "neo4j",
206
+ "config": neo4j_config,
207
+ },
208
+ "embedder": embedder_config,
209
+ "reorganize": kwargs.get("enable_reorganize", False),
210
+ },
211
+ }
212
+
213
+ elif text_mem_type == "general_text":
214
+ # General text memory with file storage
215
+ text_mem_config = {
216
+ "backend": "general_text",
217
+ "config": {
218
+ "cube_id": kwargs.get("cube_id", f"{user_id}_cube"),
219
+ "memory_filename": kwargs.get("memory_filename", "textual_memory.json"),
220
+ "extractor_llm": {"backend": "openai", "config": openai_config},
221
+ "vector_db": {
222
+ "backend": "qdrant",
223
+ "config": {
224
+ "collection_name": kwargs.get("collection_name", f"{user_id}_collection"),
225
+ "vector_dimension": kwargs.get("vector_dimension", 3072),
226
+ "distance_metric": "cosine",
227
+ },
228
+ },
229
+ "embedder": embedder_config,
230
+ },
231
+ }
232
+
233
+ # Configure activation memory if enabled
234
+ act_mem_config = {}
235
+ if kwargs.get("enable_activation_memory", False):
236
+ act_mem_config = {
237
+ "backend": "kv_cache",
238
+ "config": {
239
+ "memory_filename": kwargs.get(
240
+ "activation_memory_filename", "activation_memory.pickle"
241
+ ),
242
+ "extractor_llm": {
243
+ "backend": "openai",
244
+ "config": openai_config,
245
+ },
246
+ },
247
+ }
248
+
249
+ # Create MemCube configuration
250
+ cube_config_dict = {
251
+ "user_id": user_id,
252
+ "cube_id": kwargs.get("cube_id", f"{user_id}_default_cube"),
253
+ "text_mem": text_mem_config,
254
+ "act_mem": act_mem_config,
255
+ "para_mem": {}, # Empty parametric memory by default
256
+ }
257
+
258
+ return GeneralMemCubeConfig.model_validate(cube_config_dict)
259
+
260
+
261
+ def get_default(
262
+ openai_api_key: str,
263
+ openai_api_base: str = "https://api.openai.com/v1",
264
+ text_mem_type: Literal["tree_text", "general_text"] = "general_text",
265
+ user_id: str = "default_user",
266
+ **kwargs,
267
+ ) -> tuple[MOSConfig, GeneralMemCube]:
268
+ """
269
+ Generate both MOS configuration and default MemCube with minimal user input.
270
+
271
+ This is the main convenience function for getting started with MemOS.
272
+
273
+ Args:
274
+ openai_api_key (str): OpenAI API key
275
+ openai_api_base (str): OpenAI API base URL, defaults to "https://api.openai.com/v1"
276
+ text_mem_type (str): Type of text memory, either "tree_text" or "general_text"
277
+ user_id (str): User ID for the configuration
278
+ **kwargs: Additional configuration overrides
279
+
280
+ Returns:
281
+ Tuple[MOSConfig, GeneralMemCube]: Complete MOS configuration and MemCube instance
282
+
283
+ Example:
284
+ ```python
285
+ mos_config, default_cube = get_default(
286
+ openai_api_key="sk-...",
287
+ text_mem_type="general_text"
288
+ )
289
+ memory = MOS(mos_config)
290
+ memory.register_mem_cube(default_cube)
291
+ ```
292
+ """
293
+
294
+ # Generate MOS configuration
295
+ mos_config = get_default_config(
296
+ openai_api_key=openai_api_key,
297
+ openai_api_base=openai_api_base,
298
+ text_mem_type=text_mem_type,
299
+ user_id=user_id,
300
+ **kwargs,
301
+ )
302
+
303
+ # Generate MemCube configuration
304
+ cube_config = get_default_cube_config(
305
+ openai_api_key=openai_api_key,
306
+ openai_api_base=openai_api_base,
307
+ text_mem_type=text_mem_type,
308
+ user_id=user_id,
309
+ **kwargs,
310
+ )
311
+
312
+ # Create MemCube instance
313
+ default_cube = GeneralMemCube(cube_config)
314
+
315
+ return mos_config, default_cube
316
+
317
+
318
+ def get_simple_config(
319
+ openai_api_key: str,
320
+ openai_api_base: str = "https://api.openai.com/v1",
321
+ text_mem_type: Literal["tree_text", "general_text"] = "general_text",
322
+ user_id: str = "default_user",
323
+ ) -> MOSConfig:
324
+ """
325
+ Get a minimal configuration with only essential parameters.
326
+
327
+ This is the simplest way to get started with MemOS.
328
+
329
+ Args:
330
+ openai_api_key (str): OpenAI API key
331
+ openai_api_base (str): OpenAI API base URL
332
+ text_mem_type (str): Type of text memory
333
+ user_id (str): User ID
334
+
335
+ Returns:
336
+ MOSConfig: Basic MOS configuration
337
+
338
+ Example:
339
+ ```python
340
+ config = get_simple_config(
341
+ openai_api_key="sk-...",
342
+ text_mem_type="general_text"
343
+ )
344
+ mos = MOS(config)
345
+ ```
346
+ """
347
+ return get_default_config(
348
+ openai_api_key=openai_api_key,
349
+ openai_api_base=openai_api_base,
350
+ text_mem_type=text_mem_type,
351
+ user_id=user_id,
352
+ )