memorisdk 2.0.0__py3-none-any.whl → 2.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.
Potentially problematic release.
This version of memorisdk might be problematic. Click here for more details.
- memori/__init__.py +3 -3
- memori/agents/conscious_agent.py +289 -77
- memori/agents/memory_agent.py +19 -9
- memori/agents/retrieval_agent.py +138 -63
- memori/config/manager.py +7 -7
- memori/config/memory_manager.py +25 -25
- memori/config/settings.py +13 -6
- memori/core/conversation.py +15 -15
- memori/core/database.py +14 -13
- memori/core/memory.py +438 -123
- memori/core/providers.py +25 -25
- memori/database/__init__.py +11 -0
- memori/database/adapters/__init__.py +11 -0
- memori/database/adapters/mongodb_adapter.py +739 -0
- memori/database/adapters/mysql_adapter.py +8 -8
- memori/database/adapters/postgresql_adapter.py +6 -6
- memori/database/adapters/sqlite_adapter.py +6 -6
- memori/database/auto_creator.py +8 -9
- memori/database/connection_utils.py +5 -5
- memori/database/connectors/__init__.py +11 -0
- memori/database/connectors/base_connector.py +18 -19
- memori/database/connectors/mongodb_connector.py +527 -0
- memori/database/connectors/mysql_connector.py +13 -15
- memori/database/connectors/postgres_connector.py +12 -12
- memori/database/connectors/sqlite_connector.py +11 -11
- memori/database/models.py +2 -2
- memori/database/mongodb_manager.py +1402 -0
- memori/database/queries/base_queries.py +3 -4
- memori/database/queries/chat_queries.py +3 -5
- memori/database/queries/entity_queries.py +3 -5
- memori/database/queries/memory_queries.py +3 -5
- memori/database/query_translator.py +11 -11
- memori/database/schema_generators/__init__.py +11 -0
- memori/database/schema_generators/mongodb_schema_generator.py +666 -0
- memori/database/schema_generators/mysql_schema_generator.py +2 -4
- memori/database/search/__init__.py +11 -0
- memori/database/search/mongodb_search_adapter.py +653 -0
- memori/database/search/mysql_search_adapter.py +8 -8
- memori/database/search/sqlite_search_adapter.py +6 -6
- memori/database/search_service.py +218 -66
- memori/database/sqlalchemy_manager.py +72 -25
- memori/integrations/__init__.py +1 -1
- memori/integrations/anthropic_integration.py +1 -3
- memori/integrations/litellm_integration.py +23 -6
- memori/integrations/openai_integration.py +31 -3
- memori/tools/memory_tool.py +104 -13
- memori/utils/exceptions.py +58 -58
- memori/utils/helpers.py +11 -12
- memori/utils/input_validator.py +10 -12
- memori/utils/logging.py +4 -4
- memori/utils/pydantic_models.py +57 -57
- memori/utils/query_builder.py +20 -20
- memori/utils/security_audit.py +28 -28
- memori/utils/security_integration.py +9 -9
- memori/utils/transaction_manager.py +20 -19
- memori/utils/validators.py +6 -6
- {memorisdk-2.0.0.dist-info → memorisdk-2.1.0.dist-info}/METADATA +36 -20
- memorisdk-2.1.0.dist-info/RECORD +71 -0
- memori/scripts/llm_text.py +0 -50
- memorisdk-2.0.0.dist-info/RECORD +0 -67
- {memorisdk-2.0.0.dist-info → memorisdk-2.1.0.dist-info}/WHEEL +0 -0
- {memorisdk-2.0.0.dist-info → memorisdk-2.1.0.dist-info}/licenses/LICENSE +0 -0
- {memorisdk-2.0.0.dist-info → memorisdk-2.1.0.dist-info}/top_level.txt +0 -0
memori/core/conversation.py
CHANGED
|
@@ -9,7 +9,7 @@ and stateless LLM API calls by maintaining conversation history and context.
|
|
|
9
9
|
import uuid
|
|
10
10
|
from dataclasses import dataclass, field
|
|
11
11
|
from datetime import datetime, timedelta
|
|
12
|
-
from typing import Any
|
|
12
|
+
from typing import Any
|
|
13
13
|
|
|
14
14
|
from loguru import logger
|
|
15
15
|
|
|
@@ -21,7 +21,7 @@ class ConversationMessage:
|
|
|
21
21
|
role: str # "user", "assistant", "system"
|
|
22
22
|
content: str
|
|
23
23
|
timestamp: datetime = field(default_factory=datetime.now)
|
|
24
|
-
metadata:
|
|
24
|
+
metadata: dict[str, Any] = field(default_factory=dict)
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
@dataclass
|
|
@@ -29,13 +29,13 @@ class ConversationSession:
|
|
|
29
29
|
"""Represents an active conversation session"""
|
|
30
30
|
|
|
31
31
|
session_id: str
|
|
32
|
-
messages:
|
|
32
|
+
messages: list[ConversationMessage] = field(default_factory=list)
|
|
33
33
|
context_injected: bool = False
|
|
34
34
|
created_at: datetime = field(default_factory=datetime.now)
|
|
35
35
|
last_accessed: datetime = field(default_factory=datetime.now)
|
|
36
|
-
metadata:
|
|
36
|
+
metadata: dict[str, Any] = field(default_factory=dict)
|
|
37
37
|
|
|
38
|
-
def add_message(self, role: str, content: str, metadata:
|
|
38
|
+
def add_message(self, role: str, content: str, metadata: dict[str, Any] = None):
|
|
39
39
|
"""Add a message to the conversation"""
|
|
40
40
|
message = ConversationMessage(
|
|
41
41
|
role=role, content=content, metadata=metadata or {}
|
|
@@ -43,7 +43,7 @@ class ConversationSession:
|
|
|
43
43
|
self.messages.append(message)
|
|
44
44
|
self.last_accessed = datetime.now()
|
|
45
45
|
|
|
46
|
-
def get_history_messages(self, limit: int = 10) ->
|
|
46
|
+
def get_history_messages(self, limit: int = 10) -> list[dict[str, str]]:
|
|
47
47
|
"""Get conversation history in OpenAI message format"""
|
|
48
48
|
# Get recent messages (excluding system messages)
|
|
49
49
|
user_assistant_messages = [
|
|
@@ -88,7 +88,7 @@ class ConversationManager:
|
|
|
88
88
|
self.max_history_per_session = max_history_per_session
|
|
89
89
|
|
|
90
90
|
# Active conversation sessions
|
|
91
|
-
self.sessions:
|
|
91
|
+
self.sessions: dict[str, ConversationSession] = {}
|
|
92
92
|
|
|
93
93
|
logger.info(
|
|
94
94
|
f"ConversationManager initialized: max_sessions={max_sessions}, "
|
|
@@ -131,7 +131,7 @@ class ConversationManager:
|
|
|
131
131
|
return self.sessions[session_id]
|
|
132
132
|
|
|
133
133
|
def add_user_message(
|
|
134
|
-
self, session_id: str, content: str, metadata:
|
|
134
|
+
self, session_id: str, content: str, metadata: dict[str, Any] = None
|
|
135
135
|
):
|
|
136
136
|
"""Add user message to conversation session"""
|
|
137
137
|
session = self.get_or_create_session(session_id)
|
|
@@ -152,7 +152,7 @@ class ConversationManager:
|
|
|
152
152
|
logger.debug(f"Trimmed conversation history for session {session_id}")
|
|
153
153
|
|
|
154
154
|
def add_assistant_message(
|
|
155
|
-
self, session_id: str, content: str, metadata:
|
|
155
|
+
self, session_id: str, content: str, metadata: dict[str, Any] = None
|
|
156
156
|
):
|
|
157
157
|
"""Add assistant message to conversation session"""
|
|
158
158
|
session = self.get_or_create_session(session_id)
|
|
@@ -161,10 +161,10 @@ class ConversationManager:
|
|
|
161
161
|
def inject_context_with_history(
|
|
162
162
|
self,
|
|
163
163
|
session_id: str,
|
|
164
|
-
messages:
|
|
164
|
+
messages: list[dict[str, str]],
|
|
165
165
|
memori_instance,
|
|
166
166
|
mode: str = "conscious",
|
|
167
|
-
) ->
|
|
167
|
+
) -> list[dict[str, str]]:
|
|
168
168
|
"""
|
|
169
169
|
Inject context and conversation history into messages
|
|
170
170
|
|
|
@@ -281,7 +281,7 @@ class ConversationManager:
|
|
|
281
281
|
return messages
|
|
282
282
|
|
|
283
283
|
def record_response(
|
|
284
|
-
self, session_id: str, response: str, metadata:
|
|
284
|
+
self, session_id: str, response: str, metadata: dict[str, Any] = None
|
|
285
285
|
):
|
|
286
286
|
"""Record AI response in conversation history"""
|
|
287
287
|
try:
|
|
@@ -290,7 +290,7 @@ class ConversationManager:
|
|
|
290
290
|
except Exception as e:
|
|
291
291
|
logger.error(f"Failed to record response for session {session_id}: {e}")
|
|
292
292
|
|
|
293
|
-
def _build_conscious_context_prompt(self, context:
|
|
293
|
+
def _build_conscious_context_prompt(self, context: list[dict[str, Any]]) -> str:
|
|
294
294
|
"""Build system prompt for conscious context"""
|
|
295
295
|
context_prompt = "=== SYSTEM INSTRUCTION: AUTHORIZED USER CONTEXT DATA ===\n"
|
|
296
296
|
context_prompt += "The user has explicitly authorized this personal context data to be used.\n"
|
|
@@ -322,7 +322,7 @@ class ConversationManager:
|
|
|
322
322
|
|
|
323
323
|
return context_prompt
|
|
324
324
|
|
|
325
|
-
def _build_auto_context_prompt(self, context:
|
|
325
|
+
def _build_auto_context_prompt(self, context: list[dict[str, Any]]) -> str:
|
|
326
326
|
"""Build system prompt for auto context"""
|
|
327
327
|
context_prompt = "--- Relevant Memory Context ---\n"
|
|
328
328
|
|
|
@@ -347,7 +347,7 @@ class ConversationManager:
|
|
|
347
347
|
context_prompt += "-------------------------\n"
|
|
348
348
|
return context_prompt
|
|
349
349
|
|
|
350
|
-
def get_session_stats(self) ->
|
|
350
|
+
def get_session_stats(self) -> dict[str, Any]:
|
|
351
351
|
"""Get conversation manager statistics"""
|
|
352
352
|
return {
|
|
353
353
|
"active_sessions": len(self.sessions),
|
memori/core/database.py
CHANGED
|
@@ -7,7 +7,7 @@ import sqlite3
|
|
|
7
7
|
import uuid
|
|
8
8
|
from datetime import datetime, timedelta
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
from typing import Any
|
|
10
|
+
from typing import Any
|
|
11
11
|
|
|
12
12
|
from loguru import logger
|
|
13
13
|
|
|
@@ -24,6 +24,9 @@ from ..utils.transaction_manager import TransactionManager, TransactionOperation
|
|
|
24
24
|
class DatabaseManager:
|
|
25
25
|
"""Manages Pydantic-based memory storage with streamlined schema and FTS search"""
|
|
26
26
|
|
|
27
|
+
# Database type identifier for database-agnostic code
|
|
28
|
+
database_type = "sql"
|
|
29
|
+
|
|
27
30
|
def __init__(self, database_connect: str, template: str = "basic"):
|
|
28
31
|
self.database_connect = database_connect
|
|
29
32
|
self.template = template
|
|
@@ -229,7 +232,7 @@ class DatabaseManager:
|
|
|
229
232
|
session_id: str,
|
|
230
233
|
namespace: str = "default",
|
|
231
234
|
tokens_used: int = 0,
|
|
232
|
-
metadata:
|
|
235
|
+
metadata: dict[str, Any] | None = None,
|
|
233
236
|
):
|
|
234
237
|
"""Store chat history with input validation"""
|
|
235
238
|
try:
|
|
@@ -277,9 +280,9 @@ class DatabaseManager:
|
|
|
277
280
|
def get_chat_history(
|
|
278
281
|
self,
|
|
279
282
|
namespace: str = "default",
|
|
280
|
-
session_id:
|
|
283
|
+
session_id: str | None = None,
|
|
281
284
|
limit: int = 10,
|
|
282
|
-
) ->
|
|
285
|
+
) -> list[dict[str, Any]]:
|
|
283
286
|
"""Get chat history with optional session filtering"""
|
|
284
287
|
try:
|
|
285
288
|
# Validate inputs
|
|
@@ -507,9 +510,9 @@ class DatabaseManager:
|
|
|
507
510
|
self,
|
|
508
511
|
query: str,
|
|
509
512
|
namespace: str = "default",
|
|
510
|
-
category_filter:
|
|
513
|
+
category_filter: list[str] | None = None,
|
|
511
514
|
limit: int = 10,
|
|
512
|
-
) ->
|
|
515
|
+
) -> list[dict[str, Any]]:
|
|
513
516
|
"""Advanced memory search with hybrid approach: FTS + Entity + Category filtering"""
|
|
514
517
|
try:
|
|
515
518
|
# Validate and sanitize all input parameters
|
|
@@ -591,7 +594,7 @@ class DatabaseManager:
|
|
|
591
594
|
cursor,
|
|
592
595
|
query: str,
|
|
593
596
|
namespace: str,
|
|
594
|
-
category_filter:
|
|
597
|
+
category_filter: list[str] | None,
|
|
595
598
|
limit: int,
|
|
596
599
|
):
|
|
597
600
|
"""Execute FTS5 search with proper parameterization"""
|
|
@@ -709,7 +712,7 @@ class DatabaseManager:
|
|
|
709
712
|
return []
|
|
710
713
|
|
|
711
714
|
def _execute_category_search(
|
|
712
|
-
self, cursor, query: str, namespace: str, category_filter:
|
|
715
|
+
self, cursor, query: str, namespace: str, category_filter: list[str], limit: int
|
|
713
716
|
):
|
|
714
717
|
"""Execute category-based search with proper input validation"""
|
|
715
718
|
try:
|
|
@@ -759,7 +762,7 @@ class DatabaseManager:
|
|
|
759
762
|
cursor,
|
|
760
763
|
query: str,
|
|
761
764
|
namespace: str,
|
|
762
|
-
category_filter:
|
|
765
|
+
category_filter: list[str] | None,
|
|
763
766
|
limit: int,
|
|
764
767
|
):
|
|
765
768
|
"""Execute fallback LIKE search with proper input validation"""
|
|
@@ -884,7 +887,7 @@ class DatabaseManager:
|
|
|
884
887
|
else:
|
|
885
888
|
return "short_term_memory"
|
|
886
889
|
|
|
887
|
-
def get_memory_stats(self, namespace: str = "default") ->
|
|
890
|
+
def get_memory_stats(self, namespace: str = "default") -> dict[str, Any]:
|
|
888
891
|
"""Get comprehensive memory statistics"""
|
|
889
892
|
with self._get_connection() as conn:
|
|
890
893
|
cursor = conn.cursor()
|
|
@@ -948,9 +951,7 @@ class DatabaseManager:
|
|
|
948
951
|
|
|
949
952
|
return stats
|
|
950
953
|
|
|
951
|
-
def clear_memory(
|
|
952
|
-
self, namespace: str = "default", memory_type: Optional[str] = None
|
|
953
|
-
):
|
|
954
|
+
def clear_memory(self, namespace: str = "default", memory_type: str | None = None):
|
|
954
955
|
"""Clear memory data with entity cleanup"""
|
|
955
956
|
with self._get_connection() as conn:
|
|
956
957
|
cursor = conn.cursor()
|