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.
- powermem/__init__.py +103 -0
- powermem/agent/__init__.py +35 -0
- powermem/agent/abstract/__init__.py +22 -0
- powermem/agent/abstract/collaboration.py +259 -0
- powermem/agent/abstract/context.py +187 -0
- powermem/agent/abstract/manager.py +232 -0
- powermem/agent/abstract/permission.py +217 -0
- powermem/agent/abstract/privacy.py +267 -0
- powermem/agent/abstract/scope.py +199 -0
- powermem/agent/agent.py +791 -0
- powermem/agent/components/__init__.py +18 -0
- powermem/agent/components/collaboration_coordinator.py +645 -0
- powermem/agent/components/permission_controller.py +586 -0
- powermem/agent/components/privacy_protector.py +767 -0
- powermem/agent/components/scope_controller.py +685 -0
- powermem/agent/factories/__init__.py +16 -0
- powermem/agent/factories/agent_factory.py +266 -0
- powermem/agent/factories/config_factory.py +308 -0
- powermem/agent/factories/memory_factory.py +229 -0
- powermem/agent/implementations/__init__.py +16 -0
- powermem/agent/implementations/hybrid.py +728 -0
- powermem/agent/implementations/multi_agent.py +1040 -0
- powermem/agent/implementations/multi_user.py +1020 -0
- powermem/agent/types.py +53 -0
- powermem/agent/wrappers/__init__.py +14 -0
- powermem/agent/wrappers/agent_memory_wrapper.py +427 -0
- powermem/agent/wrappers/compatibility_wrapper.py +520 -0
- powermem/config_loader.py +318 -0
- powermem/configs.py +249 -0
- powermem/core/__init__.py +19 -0
- powermem/core/async_memory.py +1493 -0
- powermem/core/audit.py +258 -0
- powermem/core/base.py +165 -0
- powermem/core/memory.py +1567 -0
- powermem/core/setup.py +162 -0
- powermem/core/telemetry.py +215 -0
- powermem/integrations/__init__.py +17 -0
- powermem/integrations/embeddings/__init__.py +13 -0
- powermem/integrations/embeddings/aws_bedrock.py +100 -0
- powermem/integrations/embeddings/azure_openai.py +55 -0
- powermem/integrations/embeddings/base.py +31 -0
- powermem/integrations/embeddings/config/base.py +132 -0
- powermem/integrations/embeddings/configs.py +31 -0
- powermem/integrations/embeddings/factory.py +48 -0
- powermem/integrations/embeddings/gemini.py +39 -0
- powermem/integrations/embeddings/huggingface.py +41 -0
- powermem/integrations/embeddings/langchain.py +35 -0
- powermem/integrations/embeddings/lmstudio.py +29 -0
- powermem/integrations/embeddings/mock.py +11 -0
- powermem/integrations/embeddings/ollama.py +53 -0
- powermem/integrations/embeddings/openai.py +49 -0
- powermem/integrations/embeddings/qwen.py +102 -0
- powermem/integrations/embeddings/together.py +31 -0
- powermem/integrations/embeddings/vertexai.py +54 -0
- powermem/integrations/llm/__init__.py +18 -0
- powermem/integrations/llm/anthropic.py +87 -0
- powermem/integrations/llm/base.py +132 -0
- powermem/integrations/llm/config/anthropic.py +56 -0
- powermem/integrations/llm/config/azure.py +56 -0
- powermem/integrations/llm/config/base.py +62 -0
- powermem/integrations/llm/config/deepseek.py +56 -0
- powermem/integrations/llm/config/ollama.py +56 -0
- powermem/integrations/llm/config/openai.py +79 -0
- powermem/integrations/llm/config/qwen.py +68 -0
- powermem/integrations/llm/config/qwen_asr.py +46 -0
- powermem/integrations/llm/config/vllm.py +56 -0
- powermem/integrations/llm/configs.py +26 -0
- powermem/integrations/llm/deepseek.py +106 -0
- powermem/integrations/llm/factory.py +118 -0
- powermem/integrations/llm/gemini.py +201 -0
- powermem/integrations/llm/langchain.py +65 -0
- powermem/integrations/llm/ollama.py +106 -0
- powermem/integrations/llm/openai.py +166 -0
- powermem/integrations/llm/openai_structured.py +80 -0
- powermem/integrations/llm/qwen.py +207 -0
- powermem/integrations/llm/qwen_asr.py +171 -0
- powermem/integrations/llm/vllm.py +106 -0
- powermem/integrations/rerank/__init__.py +20 -0
- powermem/integrations/rerank/base.py +43 -0
- powermem/integrations/rerank/config/__init__.py +7 -0
- powermem/integrations/rerank/config/base.py +27 -0
- powermem/integrations/rerank/configs.py +23 -0
- powermem/integrations/rerank/factory.py +68 -0
- powermem/integrations/rerank/qwen.py +159 -0
- powermem/intelligence/__init__.py +17 -0
- powermem/intelligence/ebbinghaus_algorithm.py +354 -0
- powermem/intelligence/importance_evaluator.py +361 -0
- powermem/intelligence/intelligent_memory_manager.py +284 -0
- powermem/intelligence/manager.py +148 -0
- powermem/intelligence/plugin.py +229 -0
- powermem/prompts/__init__.py +29 -0
- powermem/prompts/graph/graph_prompts.py +217 -0
- powermem/prompts/graph/graph_tools_prompts.py +469 -0
- powermem/prompts/importance_evaluation.py +246 -0
- powermem/prompts/intelligent_memory_prompts.py +163 -0
- powermem/prompts/templates.py +193 -0
- powermem/storage/__init__.py +14 -0
- powermem/storage/adapter.py +896 -0
- powermem/storage/base.py +109 -0
- powermem/storage/config/base.py +13 -0
- powermem/storage/config/oceanbase.py +58 -0
- powermem/storage/config/pgvector.py +52 -0
- powermem/storage/config/sqlite.py +27 -0
- powermem/storage/configs.py +159 -0
- powermem/storage/factory.py +59 -0
- powermem/storage/migration_manager.py +438 -0
- powermem/storage/oceanbase/__init__.py +8 -0
- powermem/storage/oceanbase/constants.py +162 -0
- powermem/storage/oceanbase/oceanbase.py +1384 -0
- powermem/storage/oceanbase/oceanbase_graph.py +1441 -0
- powermem/storage/pgvector/__init__.py +7 -0
- powermem/storage/pgvector/pgvector.py +420 -0
- powermem/storage/sqlite/__init__.py +0 -0
- powermem/storage/sqlite/sqlite.py +218 -0
- powermem/storage/sqlite/sqlite_vector_store.py +311 -0
- powermem/utils/__init__.py +35 -0
- powermem/utils/utils.py +605 -0
- powermem/version.py +23 -0
- powermem-0.1.0.dist-info/METADATA +187 -0
- powermem-0.1.0.dist-info/RECORD +123 -0
- powermem-0.1.0.dist-info/WHEEL +5 -0
- powermem-0.1.0.dist-info/licenses/LICENSE +206 -0
- 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
|
+
]
|