MemoryOS 0.1.13__tar.gz → 0.2.0__tar.gz

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 (128) hide show
  1. {memoryos-0.1.13 → memoryos-0.2.0}/PKG-INFO +14 -25
  2. {memoryos-0.1.13 → memoryos-0.2.0}/README.md +12 -24
  3. {memoryos-0.1.13 → memoryos-0.2.0}/pyproject.toml +2 -1
  4. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/__init__.py +1 -1
  5. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/llm.py +1 -0
  6. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/mem_reader.py +4 -0
  7. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/memory.py +5 -0
  8. memoryos-0.2.0/src/memos/graph_dbs/item.py +46 -0
  9. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/graph_dbs/neo4j.py +72 -5
  10. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/llms/openai.py +1 -0
  11. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_reader/simple_struct.py +11 -6
  12. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/item.py +3 -1
  13. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree.py +5 -1
  14. memoryos-0.2.0/src/memos/memories/textual/tree_text_memory/organize/conflict.py +196 -0
  15. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/organize/manager.py +49 -8
  16. memoryos-0.2.0/src/memos/memories/textual/tree_text_memory/organize/redundancy.py +212 -0
  17. memoryos-0.2.0/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +235 -0
  18. memoryos-0.2.0/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +584 -0
  19. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/templates/mem_reader_prompts.py +42 -15
  20. memoryos-0.2.0/src/memos/templates/tree_reorganize_prompts.py +168 -0
  21. {memoryos-0.1.13 → memoryos-0.2.0}/LICENSE +0 -0
  22. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/api/start_api.py +0 -0
  23. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/chunkers/__init__.py +0 -0
  24. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/chunkers/base.py +0 -0
  25. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/chunkers/factory.py +0 -0
  26. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/chunkers/sentence_chunker.py +0 -0
  27. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/__init__.py +0 -0
  28. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/base.py +0 -0
  29. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/chunker.py +0 -0
  30. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/embedder.py +0 -0
  31. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/graph_db.py +0 -0
  32. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/internet_retriever.py +0 -0
  33. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/mem_chat.py +0 -0
  34. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/mem_cube.py +0 -0
  35. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/mem_os.py +0 -0
  36. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/mem_scheduler.py +0 -0
  37. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/parser.py +0 -0
  38. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/utils.py +0 -0
  39. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/configs/vec_db.py +0 -0
  40. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/deprecation.py +0 -0
  41. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/embedders/__init__.py +0 -0
  42. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/embedders/base.py +0 -0
  43. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/embedders/factory.py +0 -0
  44. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/embedders/ollama.py +0 -0
  45. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/embedders/sentence_transformer.py +0 -0
  46. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/exceptions.py +0 -0
  47. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/graph_dbs/__init__.py +0 -0
  48. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/graph_dbs/base.py +0 -0
  49. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/graph_dbs/factory.py +0 -0
  50. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/hello_world.py +0 -0
  51. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/llms/__init__.py +0 -0
  52. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/llms/base.py +0 -0
  53. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/llms/factory.py +0 -0
  54. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/llms/hf.py +0 -0
  55. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/llms/ollama.py +0 -0
  56. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/llms/utils.py +0 -0
  57. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/log.py +0 -0
  58. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_chat/__init__.py +0 -0
  59. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_chat/base.py +0 -0
  60. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_chat/factory.py +0 -0
  61. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_chat/simple.py +0 -0
  62. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_cube/__init__.py +0 -0
  63. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_cube/base.py +0 -0
  64. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_cube/general.py +0 -0
  65. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_cube/utils.py +0 -0
  66. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_os/client.py +0 -0
  67. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_os/core.py +0 -0
  68. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_os/main.py +0 -0
  69. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_os/product.py +0 -0
  70. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_reader/__init__.py +0 -0
  71. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_reader/base.py +0 -0
  72. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_reader/factory.py +0 -0
  73. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_reader/memory.py +0 -0
  74. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_scheduler/__init__.py +0 -0
  75. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_scheduler/base_scheduler.py +0 -0
  76. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_scheduler/general_scheduler.py +0 -0
  77. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_scheduler/modules/__init__.py +0 -0
  78. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_scheduler/modules/base.py +0 -0
  79. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_scheduler/modules/dispatcher.py +0 -0
  80. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_scheduler/modules/monitor.py +0 -0
  81. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_scheduler/modules/redis_service.py +0 -0
  82. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_scheduler/modules/retriever.py +0 -0
  83. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_scheduler/modules/schemas.py +0 -0
  84. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
  85. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_scheduler/utils.py +0 -0
  86. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/mem_user/user_manager.py +0 -0
  87. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/__init__.py +0 -0
  88. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/activation/__init__.py +0 -0
  89. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/activation/base.py +0 -0
  90. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/activation/item.py +0 -0
  91. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/activation/kv.py +0 -0
  92. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/base.py +0 -0
  93. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/factory.py +0 -0
  94. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/parametric/__init__.py +0 -0
  95. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/parametric/base.py +0 -0
  96. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/parametric/item.py +0 -0
  97. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/parametric/lora.py +0 -0
  98. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/__init__.py +0 -0
  99. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/base.py +0 -0
  100. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/general.py +0 -0
  101. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/naive.py +0 -0
  102. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/__init__.py +0 -0
  103. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
  104. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
  105. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
  106. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +0 -0
  107. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
  108. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +0 -0
  109. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +0 -0
  110. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
  111. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +0 -0
  112. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +0 -0
  113. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +0 -0
  114. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
  115. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/parsers/__init__.py +0 -0
  116. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/parsers/base.py +0 -0
  117. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/parsers/factory.py +0 -0
  118. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/parsers/markitdown.py +0 -0
  119. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/settings.py +0 -0
  120. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/templates/__init__.py +0 -0
  121. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/templates/mem_scheduler_prompts.py +0 -0
  122. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/templates/mos_prompts.py +0 -0
  123. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/types.py +0 -0
  124. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/vec_dbs/__init__.py +0 -0
  125. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/vec_dbs/base.py +0 -0
  126. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/vec_dbs/factory.py +0 -0
  127. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/vec_dbs/item.py +0 -0
  128. {memoryos-0.1.13 → memoryos-0.2.0}/src/memos/vec_dbs/qdrant.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: MemoryOS
3
- Version: 0.1.13
3
+ Version: 0.2.0
4
4
  Summary: Intelligence Begins with Memory
5
5
  License: Apache-2.0
6
6
  Keywords: memory,llm,language model,memoryOS,agent
@@ -22,6 +22,7 @@ Requires-Dist: ollama (>=0.4.8,<0.5.0)
22
22
  Requires-Dist: openai (>=1.77.0,<2.0.0)
23
23
  Requires-Dist: qdrant-client (>=1.14.2,<2.0.0)
24
24
  Requires-Dist: redis (>=6.2.0,<7.0.0)
25
+ Requires-Dist: schedule (>=1.2.2,<2.0.0)
25
26
  Requires-Dist: sentence-transformers (>=4.1.0,<5.0.0)
26
27
  Requires-Dist: sqlalchemy (>=2.0.41,<3.0.0)
27
28
  Requires-Dist: tenacity (>=9.1.2,<10.0.0)
@@ -31,13 +32,11 @@ Description-Content-Type: text/markdown
31
32
 
32
33
  <div align="center">
33
34
  <a href="https://memos.openmem.net/">
34
- <img src="docs/assets/banner_new.gif" alt="MemOS Banner">
35
+ <img src="https://statics.memtensor.com.cn/memos/memos-banner.gif" alt="MemOS Banner">
35
36
  </a>
36
37
 
37
-
38
-
39
38
  <h1 align="center">
40
- <img src="docs/assets/memos_logo.png" alt="MemOS Logo" width="50"/> MemOS 1.0: 星河 (Stellar) <img src="https://img.shields.io/badge/status-Preview-blue" alt="Preview Badge"/>
39
+ <img src="https://statics.memtensor.com.cn/logo/memos_color_m.png" alt="MemOS Logo" width="50"/> MemOS 1.0: 星河 (Stellar) <img src="https://img.shields.io/badge/status-Preview-blue" alt="Preview Badge"/>
41
40
  </h1>
42
41
 
43
42
  <p>
@@ -50,7 +49,7 @@ Description-Content-Type: text/markdown
50
49
  <a href="https://pypi.org/project/MemoryOS">
51
50
  <img src="https://img.shields.io/pypi/pyversions/MemoryOS.svg" alt="Supported Python versions">
52
51
  </a>
53
- <a href="https://memos.openmem.net/docs/home">
52
+ <a href="https://memos-docs.openmem.net/home/overview/">
54
53
  <img src="https://img.shields.io/badge/Documentation-view-blue.svg" alt="Documentation">
55
54
  </a>
56
55
  <a href="https://arxiv.org/abs/2507.03724">
@@ -62,7 +61,7 @@ Description-Content-Type: text/markdown
62
61
  <a href="https://discord.gg/Txbx3gebZR">
63
62
  <img src="https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord" alt="Discord">
64
63
  </a>
65
- <a href="docs/assets/qr_code.png">
64
+ <a href="https://statics.memtensor.com.cn/memos/qr-code.png">
66
65
  <img src="https://img.shields.io/badge/WeChat-Group-07C160.svg?logo=wechat" alt="WeChat Group">
67
66
  </a>
68
67
  <a href="https://opensource.org/license/apache-2-0/">
@@ -73,17 +72,14 @@ Description-Content-Type: text/markdown
73
72
 
74
73
  ---
75
74
 
76
- <a href="https://memos.openmem.net/">
77
- <img src="docs/assets/sota_score.jpg" alt="SOTA SCORE">
78
- </a>
79
-
75
+ <img src="https://statics.memtensor.com.cn/memos/sota_score.jpg" alt="SOTA SCORE">
80
76
 
81
77
  **MemOS** is an operating system for Large Language Models (LLMs) that enhances them with long-term memory capabilities. It allows LLMs to store, retrieve, and manage information, enabling more context-aware, consistent, and personalized interactions.
82
78
 
83
- - **Website**: <a href="https://memos.openmem.net/" target="_blank">https://memos.openmem.net/</a>
84
- - **Documentation**: <a href="https://memos.openmem.net/docs/home" target="_blank">https://memos.openmem.net/docs/home</a>
85
- - **API Reference**: <a href="https://memos.openmem.net/docs/api/info" target="_blank">https://memos.openmem.net/docs/api/info</a>
86
- - **Source Code**: <a href="https://github.com/MemTensor/MemOS" target="_blank">https://github.com/MemTensor/MemOS</a>
79
+ - **Website**: https://memos.openmem.net/
80
+ - **Documentation**: https://memos-docs.openmem.net/home/overview/
81
+ - **API Reference**: https://memos-docs.openmem.net/docs/api/info/
82
+ - **Source Code**: https://github.com/MemTensor/MemOS
87
83
 
88
84
  ## 📈 Performance Benchmark
89
85
 
@@ -97,19 +93,12 @@ MemOS demonstrates significant improvements over baseline memory solutions in mu
97
93
 
98
94
  > 💡 **Temporal reasoning accuracy improved by 159% compared to the OpenAI baseline.**
99
95
 
100
-
101
-
102
96
  ### Details of End-to-End Evaluation on LOCOMO
103
97
 
104
98
  > [!NOTE]
105
99
  > Comparison of LLM Judge Scores across five major tasks in the LOCOMO benchmark. Each bar shows the mean evaluation score judged by LLMs for a given method-task pair, with standard deviation as error bars. MemOS-0630 consistently outperforms baseline methods (LangMem, Zep, OpenAI, Mem0) across all task types, especially in multi-hop and temporal reasoning scenarios.
106
100
 
107
- <a href="https://memos.openmem.net/">
108
- <img src="docs/assets/score_all_end2end.jpg" alt="END2END SCORE">
109
- </a>
110
-
111
-
112
-
101
+ <img src="https://statics.memtensor.com.cn/memos/score_all_end2end.jpg" alt="END2END SCORE">
113
102
 
114
103
  ## ✨ Key Features
115
104
 
@@ -227,7 +216,7 @@ Join our community to ask questions, share your projects, and connect with other
227
216
  - **Discord**: Join our <a href="https://discord.gg/Txbx3gebZR" target="_blank">Discord Server</a>.
228
217
  - **WeChat**: Scan the QR code to join our WeChat group.
229
218
 
230
- <img src="docs/assets/qr_code.png" alt="QR Code" width="600">
219
+ <img src="https://statics.memtensor.com.cn/memos/qr-code.png" alt="QR Code" width="600">
231
220
 
232
221
  ## 📜 Citation
233
222
 
@@ -270,7 +259,7 @@ url = {https://global-sci.com/article/91443/memory3-language-modeling-with-expli
270
259
 
271
260
  ## 🙌 Contributing
272
261
 
273
- We welcome contributions from the community! Please read our [contribution guidelines](https://memos.openmem.net/docs/contribution/overview) to get started.
262
+ We welcome contributions from the community! Please read our [contribution guidelines](https://memos-docs.openmem.net/contribution/overview) to get started.
274
263
 
275
264
  ## 📄 License
276
265
 
@@ -1,12 +1,10 @@
1
1
  <div align="center">
2
2
  <a href="https://memos.openmem.net/">
3
- <img src="docs/assets/banner_new.gif" alt="MemOS Banner">
3
+ <img src="https://statics.memtensor.com.cn/memos/memos-banner.gif" alt="MemOS Banner">
4
4
  </a>
5
5
 
6
-
7
-
8
6
  <h1 align="center">
9
- <img src="docs/assets/memos_logo.png" alt="MemOS Logo" width="50"/> MemOS 1.0: 星河 (Stellar) <img src="https://img.shields.io/badge/status-Preview-blue" alt="Preview Badge"/>
7
+ <img src="https://statics.memtensor.com.cn/logo/memos_color_m.png" alt="MemOS Logo" width="50"/> MemOS 1.0: 星河 (Stellar) <img src="https://img.shields.io/badge/status-Preview-blue" alt="Preview Badge"/>
10
8
  </h1>
11
9
 
12
10
  <p>
@@ -19,7 +17,7 @@
19
17
  <a href="https://pypi.org/project/MemoryOS">
20
18
  <img src="https://img.shields.io/pypi/pyversions/MemoryOS.svg" alt="Supported Python versions">
21
19
  </a>
22
- <a href="https://memos.openmem.net/docs/home">
20
+ <a href="https://memos-docs.openmem.net/home/overview/">
23
21
  <img src="https://img.shields.io/badge/Documentation-view-blue.svg" alt="Documentation">
24
22
  </a>
25
23
  <a href="https://arxiv.org/abs/2507.03724">
@@ -31,7 +29,7 @@
31
29
  <a href="https://discord.gg/Txbx3gebZR">
32
30
  <img src="https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord" alt="Discord">
33
31
  </a>
34
- <a href="docs/assets/qr_code.png">
32
+ <a href="https://statics.memtensor.com.cn/memos/qr-code.png">
35
33
  <img src="https://img.shields.io/badge/WeChat-Group-07C160.svg?logo=wechat" alt="WeChat Group">
36
34
  </a>
37
35
  <a href="https://opensource.org/license/apache-2-0/">
@@ -42,17 +40,14 @@
42
40
 
43
41
  ---
44
42
 
45
- <a href="https://memos.openmem.net/">
46
- <img src="docs/assets/sota_score.jpg" alt="SOTA SCORE">
47
- </a>
48
-
43
+ <img src="https://statics.memtensor.com.cn/memos/sota_score.jpg" alt="SOTA SCORE">
49
44
 
50
45
  **MemOS** is an operating system for Large Language Models (LLMs) that enhances them with long-term memory capabilities. It allows LLMs to store, retrieve, and manage information, enabling more context-aware, consistent, and personalized interactions.
51
46
 
52
- - **Website**: <a href="https://memos.openmem.net/" target="_blank">https://memos.openmem.net/</a>
53
- - **Documentation**: <a href="https://memos.openmem.net/docs/home" target="_blank">https://memos.openmem.net/docs/home</a>
54
- - **API Reference**: <a href="https://memos.openmem.net/docs/api/info" target="_blank">https://memos.openmem.net/docs/api/info</a>
55
- - **Source Code**: <a href="https://github.com/MemTensor/MemOS" target="_blank">https://github.com/MemTensor/MemOS</a>
47
+ - **Website**: https://memos.openmem.net/
48
+ - **Documentation**: https://memos-docs.openmem.net/home/overview/
49
+ - **API Reference**: https://memos-docs.openmem.net/docs/api/info/
50
+ - **Source Code**: https://github.com/MemTensor/MemOS
56
51
 
57
52
  ## 📈 Performance Benchmark
58
53
 
@@ -66,19 +61,12 @@ MemOS demonstrates significant improvements over baseline memory solutions in mu
66
61
 
67
62
  > 💡 **Temporal reasoning accuracy improved by 159% compared to the OpenAI baseline.**
68
63
 
69
-
70
-
71
64
  ### Details of End-to-End Evaluation on LOCOMO
72
65
 
73
66
  > [!NOTE]
74
67
  > Comparison of LLM Judge Scores across five major tasks in the LOCOMO benchmark. Each bar shows the mean evaluation score judged by LLMs for a given method-task pair, with standard deviation as error bars. MemOS-0630 consistently outperforms baseline methods (LangMem, Zep, OpenAI, Mem0) across all task types, especially in multi-hop and temporal reasoning scenarios.
75
68
 
76
- <a href="https://memos.openmem.net/">
77
- <img src="docs/assets/score_all_end2end.jpg" alt="END2END SCORE">
78
- </a>
79
-
80
-
81
-
69
+ <img src="https://statics.memtensor.com.cn/memos/score_all_end2end.jpg" alt="END2END SCORE">
82
70
 
83
71
  ## ✨ Key Features
84
72
 
@@ -196,7 +184,7 @@ Join our community to ask questions, share your projects, and connect with other
196
184
  - **Discord**: Join our <a href="https://discord.gg/Txbx3gebZR" target="_blank">Discord Server</a>.
197
185
  - **WeChat**: Scan the QR code to join our WeChat group.
198
186
 
199
- <img src="docs/assets/qr_code.png" alt="QR Code" width="600">
187
+ <img src="https://statics.memtensor.com.cn/memos/qr-code.png" alt="QR Code" width="600">
200
188
 
201
189
  ## 📜 Citation
202
190
 
@@ -239,7 +227,7 @@ url = {https://global-sci.com/article/91443/memory3-language-modeling-with-expli
239
227
 
240
228
  ## 🙌 Contributing
241
229
 
242
- We welcome contributions from the community! Please read our [contribution guidelines](https://memos.openmem.net/docs/contribution/overview) to get started.
230
+ We welcome contributions from the community! Please read our [contribution guidelines](https://memos-docs.openmem.net/contribution/overview) to get started.
243
231
 
244
232
  ## 📄 License
245
233
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  [tool.poetry]
4
4
  name = "MemoryOS"
5
- version = "0.1.13"
5
+ version = "0.2.0"
6
6
  description = "Intelligence Begins with Memory"
7
7
  license = "Apache-2.0"
8
8
  authors = ["MemTensor <lizy@memtensor.cn>"]
@@ -26,6 +26,7 @@ fastapi = {extras = ["all"], version = "^0.115.12"}
26
26
  sentence-transformers = "^4.1.0"
27
27
  sqlalchemy = "^2.0.41"
28
28
  redis = "^6.2.0"
29
+ schedule = "^1.2.2"
29
30
 
30
31
  [tool.poetry.group.dev]
31
32
  optional = false
@@ -1,4 +1,4 @@
1
- __version__ = "0.1.13"
1
+ __version__ = "0.2.0"
2
2
 
3
3
  from memos.configs.mem_cube import GeneralMemCubeConfig
4
4
  from memos.configs.mem_os import MOSConfig
@@ -24,6 +24,7 @@ class OpenAILLMConfig(BaseLLMConfig):
24
24
  api_base: str = Field(
25
25
  default="https://api.openai.com/v1", description="Base URL for OpenAI API"
26
26
  )
27
+ extra_body: Any = Field(default=None, description="extra body")
27
28
 
28
29
 
29
30
  class OllamaLLMConfig(BaseLLMConfig):
@@ -22,6 +22,10 @@ class BaseMemReaderConfig(BaseConfig):
22
22
  chunker: ChunkerConfigFactory = Field(
23
23
  ..., description="Chunker configuration for the MemReader"
24
24
  )
25
+ remove_prompt_example: bool = Field(
26
+ default=False,
27
+ description="whether remove example in memory extraction prompt to save token",
28
+ )
25
29
 
26
30
 
27
31
  class SimpleStructMemReaderConfig(BaseMemReaderConfig):
@@ -161,6 +161,11 @@ class TreeTextMemoryConfig(BaseTextMemoryConfig):
161
161
  description="Internet retriever configuration (optional)",
162
162
  )
163
163
 
164
+ reorganize: bool | None = Field(
165
+ False,
166
+ description="Optional description for this memory configuration.",
167
+ )
168
+
164
169
 
165
170
  # ─── 3. Global Memory Config Factory ──────────────────────────────────────────
166
171
 
@@ -0,0 +1,46 @@
1
+ import uuid
2
+
3
+ from typing import Any, Literal
4
+
5
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
6
+
7
+ from memos.memories.textual.item import TextualMemoryItem
8
+
9
+
10
+ class GraphDBNode(TextualMemoryItem):
11
+ pass
12
+
13
+
14
+ class GraphDBEdge(BaseModel):
15
+ """Represents an edge in a graph database (corresponds to Neo4j relationship)."""
16
+
17
+ id: str = Field(
18
+ default_factory=lambda: str(uuid.uuid4()), description="Unique identifier for the edge"
19
+ )
20
+ source: str = Field(..., description="Source node ID")
21
+ target: str = Field(..., description="Target node ID")
22
+ type: Literal["RELATED", "PARENT"] = Field(
23
+ ..., description="Relationship type (must be one of 'RELATED', 'PARENT')"
24
+ )
25
+ properties: dict[str, Any] | None = Field(
26
+ default=None, description="Additional properties for the edge"
27
+ )
28
+
29
+ model_config = ConfigDict(extra="forbid")
30
+
31
+ @field_validator("id")
32
+ @classmethod
33
+ def validate_id(cls, v):
34
+ """Validate that ID is a valid UUID."""
35
+ if not isinstance(v, str) or not uuid.UUID(v, version=4):
36
+ raise ValueError("ID must be a valid UUID string")
37
+ return v
38
+
39
+ @classmethod
40
+ def from_dict(cls, data: dict[str, Any]) -> "GraphDBEdge":
41
+ """Create GraphDBEdge from dictionary."""
42
+ return cls(**data)
43
+
44
+ def to_dict(self) -> dict[str, Any]:
45
+ """Convert to dictionary format."""
46
+ return self.model_dump(exclude_none=True)
@@ -92,6 +92,16 @@ class Neo4jGraphDB(BaseGraphDB):
92
92
  result = session.run(query, memory_type=memory_type)
93
93
  return result.single()["count"]
94
94
 
95
+ def count_nodes(self, scope: str) -> int:
96
+ query = """
97
+ MATCH (n:Memory)
98
+ WHERE n.memory_type = $scope
99
+ RETURN count(n) AS count
100
+ """
101
+ with self.driver.session(database=self.db_name) as session:
102
+ result = session.run(query, {"scope": scope}).single()
103
+ return result["count"]
104
+
95
105
  def remove_oldest_memory(self, memory_type: str, keep_latest: int) -> None:
96
106
  """
97
107
  Remove all WorkingMemory nodes except the latest `keep_latest` entries.
@@ -336,6 +346,49 @@ class Neo4jGraphDB(BaseGraphDB):
336
346
  """
337
347
  raise NotImplementedError
338
348
 
349
+ def get_neighbors_by_tag(
350
+ self,
351
+ tags: list[str],
352
+ exclude_ids: list[str],
353
+ top_k: int = 5,
354
+ min_overlap: int = 1,
355
+ ) -> list[dict[str, Any]]:
356
+ """
357
+ Find top-K neighbor nodes with maximum tag overlap.
358
+
359
+ Args:
360
+ tags: The list of tags to match.
361
+ exclude_ids: Node IDs to exclude (e.g., local cluster).
362
+ top_k: Max number of neighbors to return.
363
+ min_overlap: Minimum number of overlapping tags required.
364
+
365
+ Returns:
366
+ List of dicts with node details and overlap count.
367
+ """
368
+ query = """
369
+ MATCH (n:Memory)
370
+ WHERE NOT n.id IN $exclude_ids
371
+ AND n.status = 'activated'
372
+ AND n.type <> 'reasoning'
373
+ AND n.memory_type <> 'WorkingMemory'
374
+ WITH n, [tag IN n.tags WHERE tag IN $tags] AS overlap_tags
375
+ WHERE size(overlap_tags) >= $min_overlap
376
+ RETURN n, size(overlap_tags) AS overlap_count
377
+ ORDER BY overlap_count DESC
378
+ LIMIT $top_k
379
+ """
380
+
381
+ params = {
382
+ "tags": tags,
383
+ "exclude_ids": exclude_ids,
384
+ "min_overlap": min_overlap,
385
+ "top_k": top_k,
386
+ }
387
+
388
+ with self.driver.session(database=self.db_name) as session:
389
+ result = session.run(query, params)
390
+ return [_parse_node(dict(record["n"])) for record in result]
391
+
339
392
  def get_children_with_embeddings(self, id: str) -> list[str]:
340
393
  query = """
341
394
  MATCH (p:Memory)-[:PARENT]->(c:Memory)
@@ -386,14 +439,10 @@ class Neo4jGraphDB(BaseGraphDB):
386
439
  record = session.run(query, {"center_id": center_id}).single()
387
440
 
388
441
  if not record:
389
- logger.warning(
390
- f"No active node found for center_id={center_id} with status={center_status}"
391
- )
392
442
  return {"core_node": None, "neighbors": [], "edges": []}
393
443
 
394
444
  centers = record["centers"]
395
445
  if not centers or centers[0] is None:
396
- logger.warning(f"Center node not found or inactive for id={center_id}")
397
446
  return {"core_node": None, "neighbors": [], "edges": []}
398
447
 
399
448
  core_node = _parse_node(dict(centers[0]))
@@ -730,6 +779,24 @@ class Neo4jGraphDB(BaseGraphDB):
730
779
  results = session.run(query, {"scope": scope})
731
780
  return [_parse_node(dict(record["n"])) for record in results]
732
781
 
782
+ def get_structure_optimization_candidates(self, scope: str) -> list[dict]:
783
+ """
784
+ Find nodes that are likely candidates for structure optimization:
785
+ - Isolated nodes, nodes with empty background, or nodes with exactly one child.
786
+ - Plus: the child of any parent node that has exactly one child.
787
+ """
788
+ query = """
789
+ MATCH (n:Memory)
790
+ WHERE n.memory_type = $scope
791
+ AND n.status = 'activated'
792
+ AND NOT ( (n)-[:PARENT]->() OR ()-[:PARENT]->(n) )
793
+ RETURN n.id AS id, n AS node
794
+ """
795
+
796
+ with self.driver.session(database=self.db_name) as session:
797
+ results = session.run(query, {"scope": scope})
798
+ return [_parse_node({"id": record["id"], **dict(record["node"])}) for record in results]
799
+
733
800
  def drop_database(self) -> None:
734
801
  """
735
802
  Permanently delete the entire database this instance is using.
@@ -744,7 +811,7 @@ class Neo4jGraphDB(BaseGraphDB):
744
811
 
745
812
  def _ensure_database_exists(self):
746
813
  with self.driver.session(database="system") as session:
747
- session.run(f"CREATE DATABASE {self.db_name} IF NOT EXISTS")
814
+ session.run(f"CREATE DATABASE $db_name IF NOT EXISTS", db_name=self.db_name)
748
815
 
749
816
  # Wait until the database is available
750
817
  for _ in range(10):
@@ -22,6 +22,7 @@ class OpenAILLM(BaseLLM):
22
22
  response = self.client.chat.completions.create(
23
23
  model=self.config.model_name_or_path,
24
24
  messages=messages,
25
+ extra_body=self.config.extra_body,
25
26
  temperature=self.config.temperature,
26
27
  max_tokens=self.config.max_tokens,
27
28
  top_p=self.config.top_p,
@@ -1,7 +1,7 @@
1
1
  import concurrent.futures
2
2
  import copy
3
3
  import json
4
-
4
+ import re
5
5
  from abc import ABC
6
6
  from typing import Any
7
7
 
@@ -17,6 +17,7 @@ from memos.parsers.factory import ParserFactory
17
17
  from memos.templates.mem_reader_prompts import (
18
18
  SIMPLE_STRUCT_DOC_READER_PROMPT,
19
19
  SIMPLE_STRUCT_MEM_READER_PROMPT,
20
+ SIMPLE_STRUCT_MEM_READER_EXAMPLE,
20
21
  )
21
22
 
22
23
 
@@ -39,11 +40,11 @@ class SimpleStructMemReader(BaseMemReader, ABC):
39
40
  self.chunker = ChunkerFactory.from_config(config.chunker)
40
41
 
41
42
  def _process_chat_data(self, scene_data_info, info):
42
- prompt = (
43
- SIMPLE_STRUCT_MEM_READER_PROMPT.replace("${user_a}", "user")
44
- .replace("${user_b}", "assistant")
45
- .replace("${conversation}", "\n".join(scene_data_info))
43
+ prompt = SIMPLE_STRUCT_MEM_READER_PROMPT.replace(
44
+ "${conversation}", "\n".join(scene_data_info)
46
45
  )
46
+ if self.config.remove_prompt_example:
47
+ prompt = prompt.replace(SIMPLE_STRUCT_MEM_READER_EXAMPLE, "")
47
48
 
48
49
  messages = [{"role": "user", "content": prompt}]
49
50
 
@@ -228,7 +229,11 @@ class SimpleStructMemReader(BaseMemReader, ABC):
228
229
 
229
230
  def parse_json_result(self, response_text):
230
231
  try:
231
- response_text = response_text.replace("```", "").replace("json", "")
232
+ json_start = response_text.find("{")
233
+ response_text = response_text[json_start:]
234
+ response_text = response_text.replace("```", "").strip()
235
+ if response_text[-1] != "}":
236
+ response_text += "}"
232
237
  response_json = json.loads(response_text)
233
238
  return response_json
234
239
  except json.JSONDecodeError as e:
@@ -27,7 +27,9 @@ class TextualMemoryMetadata(BaseModel):
27
27
  default="activated",
28
28
  description="The status of the memory, e.g., 'activated', 'archived', 'deleted'.",
29
29
  )
30
- type: Literal["procedure", "fact", "event", "opinion", "topic"] | None = Field(default=None)
30
+ type: Literal["procedure", "fact", "event", "opinion", "topic", "reasoning"] | None = Field(
31
+ default=None
32
+ )
31
33
  memory_time: str | None = Field(
32
34
  default=None,
33
35
  description='The time the memory occurred or refers to. Must be in standard `YYYY-MM-DD` format. Relative expressions such as "yesterday" or "tomorrow" are not allowed.',
@@ -35,7 +35,11 @@ class TreeTextMemory(BaseTextMemory):
35
35
  self.dispatcher_llm: OpenAILLM | OllamaLLM = LLMFactory.from_config(config.dispatcher_llm)
36
36
  self.embedder: OllamaEmbedder = EmbedderFactory.from_config(config.embedder)
37
37
  self.graph_store: Neo4jGraphDB = GraphStoreFactory.from_config(config.graph_db)
38
- self.memory_manager: MemoryManager = MemoryManager(self.graph_store, self.embedder)
38
+ self.is_reorganize = config.reorganize
39
+
40
+ self.memory_manager: MemoryManager = MemoryManager(
41
+ self.graph_store, self.embedder, self.extractor_llm, is_reorganize=self.is_reorganize
42
+ )
39
43
 
40
44
  # Create internet retriever if configured
41
45
  self.internet_retriever = None