MemoryOS 0.2.1__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 (74) hide show
  1. {memoryos-0.2.1.dist-info → memoryos-0.2.2.dist-info}/METADATA +2 -1
  2. {memoryos-0.2.1.dist-info → memoryos-0.2.2.dist-info}/RECORD +72 -55
  3. memos/__init__.py +1 -1
  4. memos/api/config.py +156 -65
  5. memos/api/context/context.py +147 -0
  6. memos/api/context/dependencies.py +90 -0
  7. memos/api/product_models.py +5 -1
  8. memos/api/routers/product_router.py +54 -26
  9. memos/configs/graph_db.py +49 -1
  10. memos/configs/internet_retriever.py +6 -0
  11. memos/configs/mem_os.py +5 -0
  12. memos/configs/mem_reader.py +9 -0
  13. memos/configs/mem_scheduler.py +18 -4
  14. memos/configs/mem_user.py +58 -0
  15. memos/graph_dbs/base.py +9 -1
  16. memos/graph_dbs/factory.py +2 -0
  17. memos/graph_dbs/nebular.py +1364 -0
  18. memos/graph_dbs/neo4j.py +4 -4
  19. memos/log.py +1 -1
  20. memos/mem_cube/utils.py +13 -6
  21. memos/mem_os/core.py +140 -30
  22. memos/mem_os/main.py +1 -1
  23. memos/mem_os/product.py +266 -152
  24. memos/mem_os/utils/format_utils.py +314 -67
  25. memos/mem_reader/simple_struct.py +13 -5
  26. memos/mem_scheduler/base_scheduler.py +220 -250
  27. memos/mem_scheduler/general_scheduler.py +193 -73
  28. memos/mem_scheduler/modules/base.py +5 -5
  29. memos/mem_scheduler/modules/dispatcher.py +6 -9
  30. memos/mem_scheduler/modules/misc.py +81 -16
  31. memos/mem_scheduler/modules/monitor.py +52 -41
  32. memos/mem_scheduler/modules/rabbitmq_service.py +9 -7
  33. memos/mem_scheduler/modules/retriever.py +108 -191
  34. memos/mem_scheduler/modules/scheduler_logger.py +255 -0
  35. memos/mem_scheduler/mos_for_test_scheduler.py +16 -19
  36. memos/mem_scheduler/schemas/__init__.py +0 -0
  37. memos/mem_scheduler/schemas/general_schemas.py +43 -0
  38. memos/mem_scheduler/schemas/message_schemas.py +148 -0
  39. memos/mem_scheduler/schemas/monitor_schemas.py +329 -0
  40. memos/mem_scheduler/utils/__init__.py +0 -0
  41. memos/mem_scheduler/utils/filter_utils.py +176 -0
  42. memos/mem_scheduler/utils/misc_utils.py +61 -0
  43. memos/mem_user/factory.py +94 -0
  44. memos/mem_user/mysql_persistent_user_manager.py +271 -0
  45. memos/mem_user/mysql_user_manager.py +500 -0
  46. memos/mem_user/persistent_factory.py +96 -0
  47. memos/mem_user/user_manager.py +4 -4
  48. memos/memories/activation/item.py +4 -0
  49. memos/memories/textual/base.py +1 -1
  50. memos/memories/textual/general.py +35 -91
  51. memos/memories/textual/item.py +5 -33
  52. memos/memories/textual/tree.py +13 -7
  53. memos/memories/textual/tree_text_memory/organize/conflict.py +4 -2
  54. memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +47 -43
  55. memos/memories/textual/tree_text_memory/organize/reorganizer.py +8 -5
  56. memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +6 -3
  57. memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +2 -0
  58. memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +2 -0
  59. memos/memories/textual/tree_text_memory/retrieve/searcher.py +46 -23
  60. memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +42 -15
  61. memos/memories/textual/tree_text_memory/retrieve/utils.py +11 -7
  62. memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +62 -58
  63. memos/memos_tools/dinding_report_bot.py +422 -0
  64. memos/memos_tools/notification_service.py +44 -0
  65. memos/memos_tools/notification_utils.py +96 -0
  66. memos/settings.py +3 -1
  67. memos/templates/mem_reader_prompts.py +2 -1
  68. memos/templates/mem_scheduler_prompts.py +41 -7
  69. memos/templates/mos_prompts.py +87 -0
  70. memos/mem_scheduler/modules/schemas.py +0 -328
  71. memos/mem_scheduler/utils.py +0 -75
  72. {memoryos-0.2.1.dist-info → memoryos-0.2.2.dist-info}/LICENSE +0 -0
  73. {memoryos-0.2.1.dist-info → memoryos-0.2.2.dist-info}/WHEEL +0 -0
  74. {memoryos-0.2.1.dist-info → memoryos-0.2.2.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,58 @@
1
+ from typing import Any, ClassVar
2
+
3
+ from pydantic import BaseModel, Field, field_validator, model_validator
4
+
5
+ from memos.configs.base import BaseConfig
6
+
7
+
8
+ class BaseUserManagerConfig(BaseConfig):
9
+ """Base configuration class for user managers."""
10
+
11
+ user_id: str = Field(default="root", description="Default user ID for initialization")
12
+
13
+
14
+ class SQLiteUserManagerConfig(BaseUserManagerConfig):
15
+ """SQLite user manager configuration."""
16
+
17
+ db_path: str | None = Field(
18
+ default=None,
19
+ description="Path to SQLite database file. If None, uses default path in MEMOS_DIR",
20
+ )
21
+
22
+
23
+ class MySQLUserManagerConfig(BaseUserManagerConfig):
24
+ """MySQL user manager configuration."""
25
+
26
+ host: str = Field(default="localhost", description="MySQL server host")
27
+ port: int = Field(default=3306, description="MySQL server port")
28
+ username: str = Field(default="root", description="MySQL username")
29
+ password: str = Field(default="", description="MySQL password")
30
+ database: str = Field(default="memos_users", description="MySQL database name")
31
+ charset: str = Field(default="utf8mb4", description="MySQL charset")
32
+
33
+
34
+ class UserManagerConfigFactory(BaseModel):
35
+ """Factory for user manager configurations."""
36
+
37
+ backend: str = Field(default="sqlite", description="Backend for user manager")
38
+ config: dict[str, Any] = Field(
39
+ default_factory=dict, description="Configuration for the user manager backend"
40
+ )
41
+
42
+ backend_to_class: ClassVar[dict[str, Any]] = {
43
+ "sqlite": SQLiteUserManagerConfig,
44
+ "mysql": MySQLUserManagerConfig,
45
+ }
46
+
47
+ @field_validator("backend")
48
+ @classmethod
49
+ def validate_backend(cls, backend: str) -> str:
50
+ if backend not in cls.backend_to_class:
51
+ raise ValueError(f"Unsupported user manager backend: {backend}")
52
+ return backend
53
+
54
+ @model_validator(mode="after")
55
+ def instantiate_config(self):
56
+ config_class = self.backend_to_class[self.backend]
57
+ self.config = config_class(**self.config)
58
+ return self
memos/graph_dbs/base.py CHANGED
@@ -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,6 +2,7 @@ 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
6
7
  from memos.graph_dbs.neo4j_community import Neo4jCommunityGraphDB
7
8
 
@@ -12,6 +13,7 @@ class GraphStoreFactory(BaseGraphDB):
12
13
  backend_to_class: ClassVar[dict[str, Any]] = {
13
14
  "neo4j": Neo4jGraphDB,
14
15
  "neo4j-community": Neo4jCommunityGraphDB,
16
+ "nebular": NebulaGraphDB,
15
17
  }
16
18
 
17
19
  @classmethod