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/embedders/ark.py ADDED
@@ -0,0 +1,92 @@
1
+ from memos.configs.embedder import ArkEmbedderConfig
2
+ from memos.dependency import require_python_package
3
+ from memos.embedders.base import BaseEmbedder
4
+ from memos.log import get_logger
5
+
6
+
7
+ logger = get_logger(__name__)
8
+
9
+
10
+ class ArkEmbedder(BaseEmbedder):
11
+ """Ark Embedder class."""
12
+
13
+ @require_python_package(
14
+ import_name="volcenginesdkarkruntime",
15
+ install_command="pip install 'volcengine-python-sdk[ark]'",
16
+ install_link="https://www.volcengine.com/docs/82379/1541595",
17
+ )
18
+ def __init__(self, config: ArkEmbedderConfig):
19
+ from volcenginesdkarkruntime import Ark
20
+
21
+ self.config = config
22
+
23
+ if self.config.embedding_dims is not None:
24
+ logger.warning(
25
+ "Ark does not support specifying embedding dimensions. "
26
+ "The embedding dimensions is determined by the model."
27
+ "`embedding_dims` will be set to None."
28
+ )
29
+ self.config.embedding_dims = None
30
+
31
+ # Default model if not specified
32
+ if not self.config.model_name_or_path:
33
+ self.config.model_name_or_path = "doubao-embedding-vision-250615"
34
+
35
+ # Initialize ark client
36
+ self.client = Ark(api_key=self.config.api_key, base_url=self.config.api_base)
37
+
38
+ def embed(self, texts: list[str]) -> list[list[float]]:
39
+ """
40
+ Generate embeddings for the given texts.
41
+
42
+ Args:
43
+ texts: List of texts to embed.
44
+
45
+ Returns:
46
+ List of embeddings, each represented as a list of floats.
47
+ """
48
+ from volcenginesdkarkruntime.types.multimodal_embedding import (
49
+ MultimodalEmbeddingContentPartTextParam,
50
+ )
51
+
52
+ if self.config.multi_modal:
53
+ texts_input = [
54
+ MultimodalEmbeddingContentPartTextParam(text=text, type="text") for text in texts
55
+ ]
56
+ return self.multimodal_embeddings(inputs=texts_input, chunk_size=self.config.chunk_size)
57
+ return self.text_embedding(texts, chunk_size=self.config.chunk_size)
58
+
59
+ def text_embedding(self, inputs: list[str], chunk_size: int | None = None) -> list[list[float]]:
60
+ chunk_size_ = chunk_size or self.config.chunk_size
61
+ embeddings: list[list[float]] = []
62
+ for i in range(0, len(inputs), chunk_size_):
63
+ response = self.client.embeddings.create(
64
+ model=self.config.model_name_or_path,
65
+ input=inputs[i : i + chunk_size_],
66
+ )
67
+
68
+ data = [response.data] if isinstance(response.data, dict) else response.data
69
+ embeddings.extend(r.embedding for r in data)
70
+
71
+ return embeddings
72
+
73
+ def multimodal_embeddings(
74
+ self, inputs: list, chunk_size: int | None = None
75
+ ) -> list[list[float]]:
76
+ from volcenginesdkarkruntime.types.multimodal_embedding import (
77
+ MultimodalEmbeddingResponse, # noqa: TC002
78
+ )
79
+
80
+ chunk_size_ = chunk_size or self.config.chunk_size
81
+ embeddings: list[list[float]] = []
82
+
83
+ for i in range(0, len(inputs), chunk_size_):
84
+ response: MultimodalEmbeddingResponse = self.client.multimodal_embeddings.create(
85
+ model=self.config.model_name_or_path,
86
+ input=inputs[i : i + chunk_size_],
87
+ )
88
+
89
+ data = [response.data] if isinstance(response.data, dict) else response.data
90
+ embeddings.extend(r["embedding"] for r in data)
91
+
92
+ return embeddings
@@ -1,9 +1,11 @@
1
1
  from typing import Any, ClassVar
2
2
 
3
3
  from memos.configs.embedder import EmbedderConfigFactory
4
+ from memos.embedders.ark import ArkEmbedder
4
5
  from memos.embedders.base import BaseEmbedder
5
6
  from memos.embedders.ollama import OllamaEmbedder
6
7
  from memos.embedders.sentence_transformer import SenTranEmbedder
8
+ from memos.embedders.universal_api import UniversalAPIEmbedder
7
9
 
8
10
 
9
11
  class EmbedderFactory(BaseEmbedder):
@@ -12,6 +14,8 @@ class EmbedderFactory(BaseEmbedder):
12
14
  backend_to_class: ClassVar[dict[str, Any]] = {
13
15
  "ollama": OllamaEmbedder,
14
16
  "sentence_transformer": SenTranEmbedder,
17
+ "ark": ArkEmbedder,
18
+ "universal_api": UniversalAPIEmbedder,
15
19
  }
16
20
 
17
21
  @classmethod
@@ -1,6 +1,5 @@
1
- from sentence_transformers import SentenceTransformer
2
-
3
1
  from memos.configs.embedder import SenTranEmbedderConfig
2
+ from memos.dependency import require_python_package
4
3
  from memos.embedders.base import BaseEmbedder
5
4
  from memos.log import get_logger
6
5
 
@@ -11,7 +10,14 @@ logger = get_logger(__name__)
11
10
  class SenTranEmbedder(BaseEmbedder):
12
11
  """Sentence Transformer Embedder class."""
13
12
 
13
+ @require_python_package(
14
+ import_name="sentence_transformers",
15
+ install_command="pip install sentence-transformers",
16
+ install_link="https://www.sbert.net/docs/installation.html",
17
+ )
14
18
  def __init__(self, config: SenTranEmbedderConfig):
19
+ from sentence_transformers import SentenceTransformer
20
+
15
21
  self.config = config
16
22
  self.model = SentenceTransformer(
17
23
  self.config.model_name_or_path, trust_remote_code=self.config.trust_remote_code
@@ -0,0 +1,32 @@
1
+ from openai import AzureOpenAI as AzureClient
2
+ from openai import OpenAI as OpenAIClient
3
+
4
+ from memos.configs.embedder import UniversalAPIEmbedderConfig
5
+ from memos.embedders.base import BaseEmbedder
6
+
7
+
8
+ class UniversalAPIEmbedder(BaseEmbedder):
9
+ def __init__(self, config: UniversalAPIEmbedderConfig):
10
+ self.provider = config.provider
11
+ self.config = config
12
+
13
+ if self.provider == "openai":
14
+ self.client = OpenAIClient(api_key=config.api_key, base_url=config.base_url)
15
+ elif self.provider == "azure":
16
+ self.client = AzureClient(
17
+ azure_endpoint=config.base_url,
18
+ api_version="2024-03-01-preview",
19
+ api_key=config.api_key,
20
+ )
21
+ else:
22
+ raise ValueError(f"Unsupported provider: {self.provider}")
23
+
24
+ def embed(self, texts: list[str]) -> list[list[float]]:
25
+ if self.provider == "openai" or self.provider == "azure":
26
+ response = self.client.embeddings.create(
27
+ model=getattr(self.config, "model_name_or_path", "text-embedding-3-large"),
28
+ input=texts,
29
+ )
30
+ return [r.embedding for r in response.data]
31
+ else:
32
+ raise ValueError(f"Unsupported provider: {self.provider}")
memos/graph_dbs/base.py CHANGED
@@ -9,12 +9,12 @@ class BaseGraphDB(ABC):
9
9
 
10
10
  # Node (Memory) Management
11
11
  @abstractmethod
12
- def add_node(self, id: str, content: str, metadata: dict[str, Any]) -> None:
12
+ def add_node(self, id: str, memory: str, metadata: dict[str, Any]) -> None:
13
13
  """
14
14
  Add a memory node to the graph.
15
15
  Args:
16
16
  id: Unique identifier for the memory node.
17
- content: Raw memory content (e.g., text).
17
+ memory: Raw memory content (e.g., text).
18
18
  metadata: Dictionary of metadata (e.g., timestamp, tags, source).
19
19
  """
20
20
 
@@ -146,7 +146,7 @@ class BaseGraphDB(ABC):
146
146
  """
147
147
 
148
148
  @abstractmethod
149
- def get_by_metadata(self, filters: dict[str, Any]) -> list[str]:
149
+ def get_by_metadata(self, filters: list[dict[str, Any]]) -> list[str]:
150
150
  """
151
151
  Retrieve node IDs that match given metadata filters.
152
152
 
@@ -162,6 +162,14 @@ class BaseGraphDB(ABC):
162
162
  - Can be used for faceted recall or prefiltering before embedding rerank.
163
163
  """
164
164
 
165
+ @abstractmethod
166
+ def get_structure_optimization_candidates(self, scope: str) -> list[dict]:
167
+ """
168
+ Find nodes that are likely candidates for structure optimization:
169
+ - Isolated nodes, nodes with empty background, or nodes with exactly one child.
170
+ - Plus: the child of any parent node that has exactly one child.
171
+ """
172
+
165
173
  # Structure Maintenance
166
174
  @abstractmethod
167
175
  def deduplicate_nodes(self) -> None:
@@ -2,7 +2,9 @@ from typing import Any, ClassVar
2
2
 
3
3
  from memos.configs.graph_db import GraphDBConfigFactory
4
4
  from memos.graph_dbs.base import BaseGraphDB
5
+ from memos.graph_dbs.nebular import NebulaGraphDB
5
6
  from memos.graph_dbs.neo4j import Neo4jGraphDB
7
+ from memos.graph_dbs.neo4j_community import Neo4jCommunityGraphDB
6
8
 
7
9
 
8
10
  class GraphStoreFactory(BaseGraphDB):
@@ -10,6 +12,8 @@ class GraphStoreFactory(BaseGraphDB):
10
12
 
11
13
  backend_to_class: ClassVar[dict[str, Any]] = {
12
14
  "neo4j": Neo4jGraphDB,
15
+ "neo4j-community": Neo4jCommunityGraphDB,
16
+ "nebular": NebulaGraphDB,
13
17
  }
14
18
 
15
19
  @classmethod