powermem 0.1.0__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.
Files changed (123) hide show
  1. powermem/__init__.py +103 -0
  2. powermem/agent/__init__.py +35 -0
  3. powermem/agent/abstract/__init__.py +22 -0
  4. powermem/agent/abstract/collaboration.py +259 -0
  5. powermem/agent/abstract/context.py +187 -0
  6. powermem/agent/abstract/manager.py +232 -0
  7. powermem/agent/abstract/permission.py +217 -0
  8. powermem/agent/abstract/privacy.py +267 -0
  9. powermem/agent/abstract/scope.py +199 -0
  10. powermem/agent/agent.py +791 -0
  11. powermem/agent/components/__init__.py +18 -0
  12. powermem/agent/components/collaboration_coordinator.py +645 -0
  13. powermem/agent/components/permission_controller.py +586 -0
  14. powermem/agent/components/privacy_protector.py +767 -0
  15. powermem/agent/components/scope_controller.py +685 -0
  16. powermem/agent/factories/__init__.py +16 -0
  17. powermem/agent/factories/agent_factory.py +266 -0
  18. powermem/agent/factories/config_factory.py +308 -0
  19. powermem/agent/factories/memory_factory.py +229 -0
  20. powermem/agent/implementations/__init__.py +16 -0
  21. powermem/agent/implementations/hybrid.py +728 -0
  22. powermem/agent/implementations/multi_agent.py +1040 -0
  23. powermem/agent/implementations/multi_user.py +1020 -0
  24. powermem/agent/types.py +53 -0
  25. powermem/agent/wrappers/__init__.py +14 -0
  26. powermem/agent/wrappers/agent_memory_wrapper.py +427 -0
  27. powermem/agent/wrappers/compatibility_wrapper.py +520 -0
  28. powermem/config_loader.py +318 -0
  29. powermem/configs.py +249 -0
  30. powermem/core/__init__.py +19 -0
  31. powermem/core/async_memory.py +1493 -0
  32. powermem/core/audit.py +258 -0
  33. powermem/core/base.py +165 -0
  34. powermem/core/memory.py +1567 -0
  35. powermem/core/setup.py +162 -0
  36. powermem/core/telemetry.py +215 -0
  37. powermem/integrations/__init__.py +17 -0
  38. powermem/integrations/embeddings/__init__.py +13 -0
  39. powermem/integrations/embeddings/aws_bedrock.py +100 -0
  40. powermem/integrations/embeddings/azure_openai.py +55 -0
  41. powermem/integrations/embeddings/base.py +31 -0
  42. powermem/integrations/embeddings/config/base.py +132 -0
  43. powermem/integrations/embeddings/configs.py +31 -0
  44. powermem/integrations/embeddings/factory.py +48 -0
  45. powermem/integrations/embeddings/gemini.py +39 -0
  46. powermem/integrations/embeddings/huggingface.py +41 -0
  47. powermem/integrations/embeddings/langchain.py +35 -0
  48. powermem/integrations/embeddings/lmstudio.py +29 -0
  49. powermem/integrations/embeddings/mock.py +11 -0
  50. powermem/integrations/embeddings/ollama.py +53 -0
  51. powermem/integrations/embeddings/openai.py +49 -0
  52. powermem/integrations/embeddings/qwen.py +102 -0
  53. powermem/integrations/embeddings/together.py +31 -0
  54. powermem/integrations/embeddings/vertexai.py +54 -0
  55. powermem/integrations/llm/__init__.py +18 -0
  56. powermem/integrations/llm/anthropic.py +87 -0
  57. powermem/integrations/llm/base.py +132 -0
  58. powermem/integrations/llm/config/anthropic.py +56 -0
  59. powermem/integrations/llm/config/azure.py +56 -0
  60. powermem/integrations/llm/config/base.py +62 -0
  61. powermem/integrations/llm/config/deepseek.py +56 -0
  62. powermem/integrations/llm/config/ollama.py +56 -0
  63. powermem/integrations/llm/config/openai.py +79 -0
  64. powermem/integrations/llm/config/qwen.py +68 -0
  65. powermem/integrations/llm/config/qwen_asr.py +46 -0
  66. powermem/integrations/llm/config/vllm.py +56 -0
  67. powermem/integrations/llm/configs.py +26 -0
  68. powermem/integrations/llm/deepseek.py +106 -0
  69. powermem/integrations/llm/factory.py +118 -0
  70. powermem/integrations/llm/gemini.py +201 -0
  71. powermem/integrations/llm/langchain.py +65 -0
  72. powermem/integrations/llm/ollama.py +106 -0
  73. powermem/integrations/llm/openai.py +166 -0
  74. powermem/integrations/llm/openai_structured.py +80 -0
  75. powermem/integrations/llm/qwen.py +207 -0
  76. powermem/integrations/llm/qwen_asr.py +171 -0
  77. powermem/integrations/llm/vllm.py +106 -0
  78. powermem/integrations/rerank/__init__.py +20 -0
  79. powermem/integrations/rerank/base.py +43 -0
  80. powermem/integrations/rerank/config/__init__.py +7 -0
  81. powermem/integrations/rerank/config/base.py +27 -0
  82. powermem/integrations/rerank/configs.py +23 -0
  83. powermem/integrations/rerank/factory.py +68 -0
  84. powermem/integrations/rerank/qwen.py +159 -0
  85. powermem/intelligence/__init__.py +17 -0
  86. powermem/intelligence/ebbinghaus_algorithm.py +354 -0
  87. powermem/intelligence/importance_evaluator.py +361 -0
  88. powermem/intelligence/intelligent_memory_manager.py +284 -0
  89. powermem/intelligence/manager.py +148 -0
  90. powermem/intelligence/plugin.py +229 -0
  91. powermem/prompts/__init__.py +29 -0
  92. powermem/prompts/graph/graph_prompts.py +217 -0
  93. powermem/prompts/graph/graph_tools_prompts.py +469 -0
  94. powermem/prompts/importance_evaluation.py +246 -0
  95. powermem/prompts/intelligent_memory_prompts.py +163 -0
  96. powermem/prompts/templates.py +193 -0
  97. powermem/storage/__init__.py +14 -0
  98. powermem/storage/adapter.py +896 -0
  99. powermem/storage/base.py +109 -0
  100. powermem/storage/config/base.py +13 -0
  101. powermem/storage/config/oceanbase.py +58 -0
  102. powermem/storage/config/pgvector.py +52 -0
  103. powermem/storage/config/sqlite.py +27 -0
  104. powermem/storage/configs.py +159 -0
  105. powermem/storage/factory.py +59 -0
  106. powermem/storage/migration_manager.py +438 -0
  107. powermem/storage/oceanbase/__init__.py +8 -0
  108. powermem/storage/oceanbase/constants.py +162 -0
  109. powermem/storage/oceanbase/oceanbase.py +1384 -0
  110. powermem/storage/oceanbase/oceanbase_graph.py +1441 -0
  111. powermem/storage/pgvector/__init__.py +7 -0
  112. powermem/storage/pgvector/pgvector.py +420 -0
  113. powermem/storage/sqlite/__init__.py +0 -0
  114. powermem/storage/sqlite/sqlite.py +218 -0
  115. powermem/storage/sqlite/sqlite_vector_store.py +311 -0
  116. powermem/utils/__init__.py +35 -0
  117. powermem/utils/utils.py +605 -0
  118. powermem/version.py +23 -0
  119. powermem-0.1.0.dist-info/METADATA +187 -0
  120. powermem-0.1.0.dist-info/RECORD +123 -0
  121. powermem-0.1.0.dist-info/WHEEL +5 -0
  122. powermem-0.1.0.dist-info/licenses/LICENSE +206 -0
  123. powermem-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,318 @@
1
+ """
2
+ Configuration loader for powermem
3
+
4
+ This module provides utilities for loading configuration from environment variables
5
+ or other sources. It simplifies the configuration setup process.
6
+ """
7
+
8
+ import os
9
+ from typing import Any, Dict, Optional
10
+
11
+
12
+ def _auto_load_env():
13
+ """Automatically load .env file from common locations"""
14
+ try:
15
+ from dotenv import load_dotenv
16
+
17
+ # Try to load .env from multiple possible locations
18
+ possible_paths = [
19
+ os.path.join(os.getcwd(), '.env'), # Current directory
20
+ os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), '.env'), # Project root
21
+ os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'examples', 'configs', '.env'), # examples/configs
22
+ ]
23
+
24
+ for path in possible_paths:
25
+ if os.path.exists(path):
26
+ load_dotenv(path, override=False) # Don't override existing env vars
27
+ break
28
+ else:
29
+ # Fallback: try to load from default location
30
+ load_dotenv()
31
+
32
+ except ImportError:
33
+ pass # python-dotenv not installed
34
+ except Exception:
35
+ pass # Silently fail if .env doesn't exist
36
+
37
+
38
+ def load_config_from_env() -> Dict[str, Any]:
39
+ """
40
+ Load configuration from environment variables.
41
+
42
+ This function reads configuration from environment variables and builds a config dictionary.
43
+ You can use this when you have .env file set up to avoid manually building config dict.
44
+
45
+ It automatically detects the database provider (sqlite, oceanbase, postgres) and builds
46
+ the appropriate configuration.
47
+
48
+ Returns:
49
+ Configuration dictionary built from environment variables
50
+
51
+ Example:
52
+ ```python
53
+ from dotenv import load_dotenv
54
+ from powermem.config_loader import load_config_from_env
55
+
56
+ # Load .env file
57
+ load_dotenv()
58
+
59
+ # Get config
60
+ config = load_config_from_env()
61
+
62
+ # Use config
63
+ from powermem import Memory
64
+ memory = Memory(config=config)
65
+ ```
66
+ """
67
+ _auto_load_env() # Auto-load .env if available
68
+
69
+ db_provider = os.getenv('DATABASE_PROVIDER', 'oceanbase')
70
+
71
+ # Build database config based on provider
72
+ if db_provider == 'oceanbase':
73
+ # OceanBase configuration
74
+ connection_args = {
75
+ "host": os.getenv('DATABASE_HOST', '127.0.0.1'),
76
+ "port": int(os.getenv('DATABASE_PORT', '2881')),
77
+ "user": os.getenv('DATABASE_USER', 'root@sys'),
78
+ "password": os.getenv('DATABASE_PASSWORD', 'password'),
79
+ "db_name": os.getenv('DATABASE_NAME', 'powermem')
80
+ }
81
+ db_config = {
82
+ 'collection_name': os.getenv('DATABASE_COLLECTION_NAME', 'memories'),
83
+ 'connection_args': connection_args,
84
+ 'vidx_metric_type': os.getenv('DATABASE_VECTOR_METRIC_TYPE', 'cosine'),
85
+ 'index_type': os.getenv('DATABASE_INDEX_TYPE', 'IVF_FLAT'),
86
+ 'embedding_model_dims': int(os.getenv('DATABASE_EMBEDDING_MODEL_DIMS', '1536')),
87
+ 'primary_field': os.getenv('DATABASE_PRIMARY_FIELD', 'id'),
88
+ 'vector_field': os.getenv('DATABASE_VECTOR_FIELD', 'embedding'),
89
+ 'text_field': os.getenv('DATABASE_TEXT_FIELD', 'document'),
90
+ 'metadata_field': os.getenv('DATABASE_METADATA_FIELD', 'metadata'),
91
+ 'vidx_name': os.getenv('DATABASE_VIDX_NAME', 'memories_vidx')
92
+ }
93
+ elif db_provider == 'postgres':
94
+ # PostgreSQL configuration (pgvector)
95
+ db_config = {
96
+ 'collection_name': os.getenv('DATABASE_COLLECTION_NAME', 'memories'),
97
+ 'dbname': os.getenv('DATABASE_NAME', 'powermem'),
98
+ 'host': os.getenv('DATABASE_HOST', 'localhost'),
99
+ 'port': int(os.getenv('DATABASE_PORT', '5432')),
100
+ 'user': os.getenv('DATABASE_USER', 'postgres'),
101
+ 'password': os.getenv('DATABASE_PASSWORD', 'password'),
102
+ 'embedding_model_dims': int(os.getenv('DATABASE_EMBEDDING_MODEL_DIMS', '1536')),
103
+ 'diskann': os.getenv('DATABASE_DISKANN', 'true').lower() == 'true',
104
+ 'hnsw': os.getenv('DATABASE_HNSW', 'true').lower() == 'true',
105
+ }
106
+ else:
107
+ # SQLite configuration (default)
108
+ db_config = {
109
+ 'database_path': os.getenv('DATABASE_PATH', './data/powermem_dev.db'),
110
+ 'collection_name': os.getenv('DATABASE_COLLECTION_NAME', 'memories'),
111
+ 'enable_wal': os.getenv('DATABASE_ENABLE_WAL', 'true').lower() == 'true',
112
+ 'timeout': int(os.getenv('DATABASE_TIMEOUT', '30'))
113
+ }
114
+
115
+ # Build LLM config based on provider
116
+ llm_provider = os.getenv('LLM_PROVIDER', 'qwen')
117
+ llm_config = {
118
+ 'api_key': os.getenv('LLM_API_KEY'),
119
+ 'model': os.getenv('LLM_MODEL', 'qwen-plus' if llm_provider == 'qwen' else 'gpt-4o-mini'),
120
+ 'temperature': float(os.getenv('LLM_TEMPERATURE', '0.7')),
121
+ 'max_tokens': int(os.getenv('LLM_MAX_TOKENS', '1000')),
122
+ 'top_p': float(os.getenv('LLM_TOP_P', '0.8')),
123
+ 'top_k': int(os.getenv('LLM_TOP_K', '50')),
124
+ }
125
+
126
+ # Add provider-specific config
127
+ if llm_provider == 'qwen':
128
+ llm_config['dashscope_base_url'] = os.getenv('LLM_BASE_URL', 'https://dashscope.aliyuncs.com/api/v1')
129
+ llm_config['enable_search'] = os.getenv('LLM_ENABLE_SEARCH', 'false').lower() == 'true'
130
+ elif llm_provider == 'openai':
131
+ base_url = os.getenv('LLM_BASE_URL')
132
+ if base_url:
133
+ llm_config['openai_base_url'] = base_url
134
+
135
+ config = {
136
+ 'vector_store': {
137
+ 'provider': db_provider,
138
+ 'config': db_config
139
+ },
140
+ 'llm': {
141
+ 'provider': llm_provider,
142
+ 'config': llm_config
143
+ },
144
+ 'embedder': {
145
+ 'provider': os.getenv('EMBEDDING_PROVIDER', 'qwen'),
146
+ 'config': {
147
+ 'api_key': os.getenv('EMBEDDING_API_KEY'),
148
+ 'model': os.getenv('EMBEDDING_MODEL', 'text-embedding-v4'),
149
+ 'embedding_dims': int(os.getenv('EMBEDDING_DIMS', '1536'))
150
+ }
151
+ },
152
+ 'intelligent_memory': {
153
+ 'enabled': os.getenv('INTELLIGENT_MEMORY_ENABLED', 'true').lower() == 'true',
154
+ 'initial_retention': float(os.getenv('INTELLIGENT_MEMORY_INITIAL_RETENTION', '1.0')),
155
+ 'decay_rate': float(os.getenv('INTELLIGENT_MEMORY_DECAY_RATE', '0.1')),
156
+ 'reinforcement_factor': float(os.getenv('INTELLIGENT_MEMORY_REINFORCEMENT_FACTOR', '0.3')),
157
+ 'working_threshold': float(os.getenv('INTELLIGENT_MEMORY_WORKING_THRESHOLD', '0.3')),
158
+ 'short_term_threshold': float(os.getenv('INTELLIGENT_MEMORY_SHORT_TERM_THRESHOLD', '0.6')),
159
+ 'long_term_threshold': float(os.getenv('INTELLIGENT_MEMORY_LONG_TERM_THRESHOLD', '0.8'))
160
+ },
161
+ 'agent_memory': {
162
+ 'enabled': os.getenv('AGENT_ENABLED', 'true').lower() == 'true',
163
+ 'mode': os.getenv('AGENT_MEMORY_MODE', 'auto'),
164
+ 'default_scope': os.getenv('AGENT_DEFAULT_SCOPE', 'AGENT'),
165
+ 'default_privacy_level': os.getenv('AGENT_DEFAULT_PRIVACY_LEVEL', 'PRIVATE'),
166
+ 'default_collaboration_level': os.getenv('AGENT_DEFAULT_COLLABORATION_LEVEL', 'READ_ONLY'),
167
+ 'default_access_permission': os.getenv('AGENT_DEFAULT_ACCESS_PERMISSION', 'OWNER_ONLY')
168
+ },
169
+ 'telemetry': {
170
+ 'enable_telemetry': os.getenv('TELEMETRY_ENABLED', 'false').lower() == 'true',
171
+ 'telemetry_endpoint': os.getenv('TELEMETRY_ENDPOINT', 'https://telemetry.powermem.ai'),
172
+ 'telemetry_api_key': os.getenv('TELEMETRY_API_KEY'),
173
+ 'telemetry_batch_size': int(os.getenv('TELEMETRY_BATCH_SIZE', '100')),
174
+ 'telemetry_flush_interval': int(os.getenv('TELEMETRY_FLUSH_INTERVAL', '30'))
175
+ },
176
+ 'audit': {
177
+ 'enabled': os.getenv('AUDIT_ENABLED', 'true').lower() == 'true',
178
+ 'log_file': os.getenv('AUDIT_LOG_FILE', './logs/audit.log'),
179
+ 'log_level': os.getenv('AUDIT_LOG_LEVEL', 'INFO'),
180
+ 'retention_days': int(os.getenv('AUDIT_RETENTION_DAYS', '90'))
181
+ },
182
+ 'logging': {
183
+ 'level': os.getenv('LOGGING_LEVEL', 'DEBUG'),
184
+ 'format': os.getenv('LOGGING_FORMAT', '%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
185
+ 'file': os.getenv('LOGGING_FILE', './logs/powermem.log')
186
+ },
187
+ 'reranker': {
188
+ 'enabled': os.getenv('RERANKER_ENABLED', 'false').lower() == 'true',
189
+ 'provider': os.getenv('RERANKER_PROVIDER', 'qwen'),
190
+ 'config': {
191
+ 'model': os.getenv('RERANKER_MODEL'),
192
+ 'api_key': os.getenv('RERANKER_API_KEY'),
193
+ }
194
+ }
195
+ }
196
+
197
+ return config
198
+
199
+
200
+ def create_config(
201
+ database_provider: str = 'sqlite',
202
+ llm_provider: str = 'qwen',
203
+ embedding_provider: str = 'qwen',
204
+ **kwargs
205
+ ) -> Dict[str, Any]:
206
+ """
207
+ Create a basic configuration dictionary with specified providers.
208
+
209
+ Args:
210
+ database_provider: Database provider ('sqlite', 'oceanbase', 'postgres')
211
+ llm_provider: LLM provider ('qwen', 'openai', etc.)
212
+ embedding_provider: Embedding provider ('qwen', 'openai', etc.)
213
+ **kwargs: Additional configuration parameters
214
+
215
+ Returns:
216
+ Configuration dictionary
217
+
218
+ Example:
219
+ ```python
220
+ from powermem.config_loader import create_config
221
+ from powermem import Memory
222
+
223
+ config = create_config(
224
+ database_provider='sqlite',
225
+ llm_provider='qwen',
226
+ llm_api_key='your_key',
227
+ llm_model='qwen-plus'
228
+ )
229
+
230
+ memory = Memory(config=config)
231
+ ```
232
+ """
233
+ config = {
234
+ 'vector_store': {
235
+ 'provider': database_provider,
236
+ 'config': kwargs.get('database_config', {})
237
+ },
238
+ 'llm': {
239
+ 'provider': llm_provider,
240
+ 'config': {
241
+ 'api_key': kwargs.get('llm_api_key'),
242
+ 'model': kwargs.get('llm_model', 'qwen-plus'),
243
+ 'temperature': kwargs.get('llm_temperature', 0.7),
244
+ 'max_tokens': kwargs.get('llm_max_tokens', 1000),
245
+ **{k: v for k, v in kwargs.items() if k.startswith('llm_') and k != 'llm_api_key' and k != 'llm_model' and k != 'llm_temperature' and k != 'llm_max_tokens'}
246
+ }
247
+ },
248
+ 'embedder': {
249
+ 'provider': embedding_provider,
250
+ 'config': {
251
+ 'api_key': kwargs.get('embedding_api_key'),
252
+ 'model': kwargs.get('embedding_model', 'text-embedding-v4'),
253
+ 'embedding_dims': kwargs.get('embedding_dims', 1536),
254
+ }
255
+ }
256
+ }
257
+
258
+ return config
259
+
260
+
261
+ def validate_config(config: Dict[str, Any]) -> bool:
262
+ """
263
+ Validate a configuration dictionary.
264
+
265
+ Args:
266
+ config: Configuration dictionary to validate
267
+
268
+ Returns:
269
+ True if valid, False otherwise
270
+
271
+ Example:
272
+ ```python
273
+ from powermem.config_loader import load_config_from_env, validate_config
274
+
275
+ config = load_config_from_env()
276
+ if validate_config(config):
277
+ print("Configuration is valid!")
278
+ ```
279
+ """
280
+ required_sections = ['vector_store', 'llm', 'embedder']
281
+
282
+ for section in required_sections:
283
+ if section not in config:
284
+ return False
285
+
286
+ if 'provider' not in config[section]:
287
+ return False
288
+
289
+ if 'config' not in config[section]:
290
+ return False
291
+
292
+ return True
293
+
294
+
295
+ def auto_config() -> Dict[str, Any]:
296
+ """
297
+ Automatically load configuration from environment variables.
298
+
299
+ This is the simplest way to get configuration.
300
+ It automatically loads .env file and returns the config.
301
+
302
+ Returns:
303
+ Configuration dictionary from environment variables
304
+
305
+ Example:
306
+ ```python
307
+ from powermem import Memory
308
+
309
+ # Simplest way - just load from .env
310
+ memory = Memory(config=auto_config())
311
+
312
+ # Or even simpler with create_memory()
313
+ from powermem import create_memory
314
+ memory = create_memory() # Auto loads from .env
315
+ ```
316
+ """
317
+ return load_config_from_env()
318
+
powermem/configs.py ADDED
@@ -0,0 +1,249 @@
1
+ """
2
+ Configuration classes for the memory system.
3
+
4
+ This module provides configuration classes for different components
5
+ of the memory system.
6
+ """
7
+
8
+ from typing import Optional, Dict, Any
9
+ from pydantic import BaseModel, Field
10
+
11
+ from powermem.integrations.embeddings.configs import EmbedderConfig
12
+ from powermem.integrations.llm import LlmConfig
13
+ from powermem.storage.configs import VectorStoreConfig, GraphStoreConfig
14
+ from powermem.integrations.rerank.configs import RerankConfig
15
+
16
+
17
+ class IntelligentMemoryConfig(BaseModel):
18
+ """Configuration for intelligent memory management with Ebbinghaus algorithm."""
19
+
20
+ enabled: bool = Field(
21
+ default=True,
22
+ description="Whether to enable intelligent memory management"
23
+ )
24
+ initial_retention: float = Field(
25
+ default=1.0,
26
+ description="Initial retention strength for new memories"
27
+ )
28
+ decay_rate: float = Field(
29
+ default=0.1,
30
+ description="Rate at which memories decay over time"
31
+ )
32
+ reinforcement_factor: float = Field(
33
+ default=0.3,
34
+ description="Factor by which memories are reinforced when accessed"
35
+ )
36
+ working_threshold: float = Field(
37
+ default=0.3,
38
+ description="Threshold for working memory classification"
39
+ )
40
+ short_term_threshold: float = Field(
41
+ default=0.6,
42
+ description="Threshold for short-term memory classification"
43
+ )
44
+ long_term_threshold: float = Field(
45
+ default=0.8,
46
+ description="Threshold for long-term memory classification"
47
+ )
48
+
49
+
50
+ class TelemetryConfig(BaseModel):
51
+ """Configuration for telemetry and monitoring."""
52
+
53
+ enable_telemetry: bool = Field(
54
+ default=False,
55
+ description="Whether to enable telemetry"
56
+ )
57
+ telemetry_endpoint: str = Field(
58
+ default="https://telemetry.powermem.ai",
59
+ description="Endpoint URL for telemetry data"
60
+ )
61
+ telemetry_api_key: Optional[str] = Field(
62
+ default=None,
63
+ description="API key for telemetry service"
64
+ )
65
+ batch_size: int = Field(
66
+ default=100,
67
+ description="Number of events to batch before sending"
68
+ )
69
+ flush_interval: int = Field(
70
+ default=30,
71
+ description="Interval in seconds to flush telemetry data"
72
+ )
73
+
74
+
75
+ class AuditConfig(BaseModel):
76
+ """Configuration for audit logging."""
77
+
78
+ enabled: bool = Field(
79
+ default=True,
80
+ description="Whether to enable audit logging"
81
+ )
82
+ log_file: str = Field(
83
+ default="./logs/audit.log",
84
+ description="Path to the audit log file"
85
+ )
86
+ log_level: str = Field(
87
+ default="INFO",
88
+ description="Logging level for audit logs"
89
+ )
90
+ retention_days: int = Field(
91
+ default=90,
92
+ description="Number of days to retain audit logs"
93
+ )
94
+
95
+
96
+ class LoggingConfig(BaseModel):
97
+ """Configuration for application logging."""
98
+
99
+ level: str = Field(
100
+ default="DEBUG",
101
+ description="Logging level"
102
+ )
103
+ format: str = Field(
104
+ default="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
105
+ description="Log message format"
106
+ )
107
+ file: str = Field(
108
+ default="./logs/powermem.log",
109
+ description="Path to the log file"
110
+ )
111
+
112
+
113
+ class AgentMemoryConfig(BaseModel):
114
+ """Configuration for agent memory management."""
115
+
116
+ enabled: bool = Field(
117
+ default=True,
118
+ description="Whether to enable agent memory management"
119
+ )
120
+ mode: str = Field(
121
+ default="multi_agent",
122
+ description="Agent memory mode: 'multi_agent', 'multi_user', 'hybrid', or 'auto'"
123
+ )
124
+ default_scope: str = Field(
125
+ default="private",
126
+ description="Default scope for memories: 'private', 'agent_group', 'user_group', 'public', 'restricted' (from MemoryScope enum)"
127
+ )
128
+ default_privacy_level: str = Field(
129
+ default="standard",
130
+ description="Default privacy level: 'standard', 'sensitive', 'confidential' (from PrivacyLevel enum)"
131
+ )
132
+ default_collaboration_level: str = Field(
133
+ default="isolated",
134
+ description="Default collaboration level: 'isolated', 'collaborative' (from CollaborationLevel enum)"
135
+ )
136
+ default_access_permission: str = Field(
137
+ default="read",
138
+ description="Default access permission: 'read', 'write', 'delete', 'admin' (from AccessPermission enum)"
139
+ )
140
+ enable_collaboration: bool = Field(
141
+ default=True,
142
+ description="Whether to enable collaboration features"
143
+ )
144
+
145
+
146
+ class MultiAgentMemoryConfig(BaseModel):
147
+ """Configuration for multi-agent memory management."""
148
+
149
+ enabled: bool = True
150
+ default_scope: str = "private"
151
+ enable_collaboration: bool = True
152
+
153
+
154
+ class MultiUserConfig(BaseModel):
155
+ """Configuration for multi-user memory management."""
156
+
157
+ enabled: bool = True
158
+ default_scope: str = "private"
159
+ enable_collaboration: bool = True
160
+
161
+
162
+ class HybridConfig(BaseModel):
163
+ """Configuration for hybrid memory management."""
164
+
165
+ enabled: bool = True
166
+ primary_mode: str = "multi_user"
167
+ fallback_mode: str = "multi_agent"
168
+ auto_switch_threshold: float = 0.8
169
+
170
+
171
+ class MemoryConfig(BaseModel):
172
+ """Main memory configuration class."""
173
+
174
+ vector_store: VectorStoreConfig = Field(
175
+ description="Configuration for the vector store",
176
+ default_factory=VectorStoreConfig,
177
+ )
178
+ llm: LlmConfig = Field(
179
+ description="Configuration for the language model",
180
+ default_factory=LlmConfig,
181
+ )
182
+ embedder: EmbedderConfig = Field(
183
+ description="Configuration for the embedding model",
184
+ default_factory=EmbedderConfig,
185
+ )
186
+ graph_store: GraphStoreConfig = Field(
187
+ description="Configuration for the graph",
188
+ default_factory=GraphStoreConfig,
189
+ )
190
+ reranker: Optional[RerankConfig] = Field(
191
+ description="Configuration for the reranker",
192
+ default=None,
193
+ )
194
+ version: str = Field(
195
+ description="The version of the API",
196
+ default="v1.1",
197
+ )
198
+ custom_fact_extraction_prompt: Optional[str] = Field(
199
+ description="Custom prompt for the fact extraction",
200
+ default=None,
201
+ )
202
+ custom_update_memory_prompt: Optional[str] = Field(
203
+ description="Custom prompt for the update memory",
204
+ default=None,
205
+ )
206
+ custom_importance_evaluation_prompt: Optional[str] = Field(
207
+ description="Custom prompt for importance evaluation",
208
+ default=None,
209
+ )
210
+ agent_memory: Optional[AgentMemoryConfig] = Field(
211
+ description="Configuration for agent memory management",
212
+ default=None,
213
+ )
214
+ intelligent_memory: Optional[IntelligentMemoryConfig] = Field(
215
+ description="Configuration for intelligent memory management",
216
+ default=None,
217
+ )
218
+ telemetry: Optional[TelemetryConfig] = Field(
219
+ description="Configuration for telemetry and monitoring",
220
+ default=None,
221
+ )
222
+ audit: Optional[AuditConfig] = Field(
223
+ description="Configuration for audit logging",
224
+ default=None,
225
+ )
226
+ logging: Optional[LoggingConfig] = Field(
227
+ description="Configuration for application logging",
228
+ default=None,
229
+ )
230
+ audio_llm: Optional[LlmConfig] = Field(
231
+ description="Configuration for audio language model",
232
+ default=None,
233
+ )
234
+
235
+
236
+ def __init__(self, **data):
237
+ super().__init__(**data)
238
+ if self.agent_memory is None:
239
+ self.agent_memory = AgentMemoryConfig()
240
+ if self.intelligent_memory is None:
241
+ self.intelligent_memory = IntelligentMemoryConfig()
242
+ if self.telemetry is None:
243
+ self.telemetry = TelemetryConfig()
244
+ if self.audit is None:
245
+ self.audit = AuditConfig()
246
+ if self.logging is None:
247
+ self.logging = LoggingConfig()
248
+ if self.reranker is None:
249
+ self.reranker = RerankConfig()
@@ -0,0 +1,19 @@
1
+ """
2
+ Core memory management module
3
+
4
+ This module contains the core memory management classes and interfaces.
5
+ """
6
+
7
+ from .base import MemoryBase
8
+ from .memory import Memory
9
+ from .async_memory import AsyncMemory
10
+ from .telemetry import TelemetryManager
11
+ from .audit import AuditLogger
12
+
13
+ __all__ = [
14
+ "MemoryBase",
15
+ "Memory",
16
+ "AsyncMemory",
17
+ "TelemetryManager",
18
+ "AuditLogger",
19
+ ]