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.

Files changed (63) hide show
  1. memori/__init__.py +3 -3
  2. memori/agents/conscious_agent.py +289 -77
  3. memori/agents/memory_agent.py +19 -9
  4. memori/agents/retrieval_agent.py +138 -63
  5. memori/config/manager.py +7 -7
  6. memori/config/memory_manager.py +25 -25
  7. memori/config/settings.py +13 -6
  8. memori/core/conversation.py +15 -15
  9. memori/core/database.py +14 -13
  10. memori/core/memory.py +438 -123
  11. memori/core/providers.py +25 -25
  12. memori/database/__init__.py +11 -0
  13. memori/database/adapters/__init__.py +11 -0
  14. memori/database/adapters/mongodb_adapter.py +739 -0
  15. memori/database/adapters/mysql_adapter.py +8 -8
  16. memori/database/adapters/postgresql_adapter.py +6 -6
  17. memori/database/adapters/sqlite_adapter.py +6 -6
  18. memori/database/auto_creator.py +8 -9
  19. memori/database/connection_utils.py +5 -5
  20. memori/database/connectors/__init__.py +11 -0
  21. memori/database/connectors/base_connector.py +18 -19
  22. memori/database/connectors/mongodb_connector.py +527 -0
  23. memori/database/connectors/mysql_connector.py +13 -15
  24. memori/database/connectors/postgres_connector.py +12 -12
  25. memori/database/connectors/sqlite_connector.py +11 -11
  26. memori/database/models.py +2 -2
  27. memori/database/mongodb_manager.py +1402 -0
  28. memori/database/queries/base_queries.py +3 -4
  29. memori/database/queries/chat_queries.py +3 -5
  30. memori/database/queries/entity_queries.py +3 -5
  31. memori/database/queries/memory_queries.py +3 -5
  32. memori/database/query_translator.py +11 -11
  33. memori/database/schema_generators/__init__.py +11 -0
  34. memori/database/schema_generators/mongodb_schema_generator.py +666 -0
  35. memori/database/schema_generators/mysql_schema_generator.py +2 -4
  36. memori/database/search/__init__.py +11 -0
  37. memori/database/search/mongodb_search_adapter.py +653 -0
  38. memori/database/search/mysql_search_adapter.py +8 -8
  39. memori/database/search/sqlite_search_adapter.py +6 -6
  40. memori/database/search_service.py +218 -66
  41. memori/database/sqlalchemy_manager.py +72 -25
  42. memori/integrations/__init__.py +1 -1
  43. memori/integrations/anthropic_integration.py +1 -3
  44. memori/integrations/litellm_integration.py +23 -6
  45. memori/integrations/openai_integration.py +31 -3
  46. memori/tools/memory_tool.py +104 -13
  47. memori/utils/exceptions.py +58 -58
  48. memori/utils/helpers.py +11 -12
  49. memori/utils/input_validator.py +10 -12
  50. memori/utils/logging.py +4 -4
  51. memori/utils/pydantic_models.py +57 -57
  52. memori/utils/query_builder.py +20 -20
  53. memori/utils/security_audit.py +28 -28
  54. memori/utils/security_integration.py +9 -9
  55. memori/utils/transaction_manager.py +20 -19
  56. memori/utils/validators.py +6 -6
  57. {memorisdk-2.0.0.dist-info → memorisdk-2.1.0.dist-info}/METADATA +36 -20
  58. memorisdk-2.1.0.dist-info/RECORD +71 -0
  59. memori/scripts/llm_text.py +0 -50
  60. memorisdk-2.0.0.dist-info/RECORD +0 -67
  61. {memorisdk-2.0.0.dist-info → memorisdk-2.1.0.dist-info}/WHEEL +0 -0
  62. {memorisdk-2.0.0.dist-info → memorisdk-2.1.0.dist-info}/licenses/LICENSE +0 -0
  63. {memorisdk-2.0.0.dist-info → memorisdk-2.1.0.dist-info}/top_level.txt +0 -0
@@ -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, Dict, List
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: Dict[str, Any] = field(default_factory=dict)
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: List[ConversationMessage] = field(default_factory=list)
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: Dict[str, Any] = field(default_factory=dict)
36
+ metadata: dict[str, Any] = field(default_factory=dict)
37
37
 
38
- def add_message(self, role: str, content: str, metadata: Dict[str, Any] = None):
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) -> List[Dict[str, str]]:
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: Dict[str, ConversationSession] = {}
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: Dict[str, Any] = None
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: Dict[str, Any] = None
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: List[Dict[str, str]],
164
+ messages: list[dict[str, str]],
165
165
  memori_instance,
166
166
  mode: str = "conscious",
167
- ) -> List[Dict[str, str]]:
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: Dict[str, Any] = None
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: List[Dict[str, Any]]) -> str:
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: List[Dict[str, Any]]) -> str:
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) -> Dict[str, Any]:
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, Dict, List, Optional
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: Optional[Dict[str, Any]] = None,
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: Optional[str] = None,
283
+ session_id: str | None = None,
281
284
  limit: int = 10,
282
- ) -> List[Dict[str, Any]]:
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: Optional[List[str]] = None,
513
+ category_filter: list[str] | None = None,
511
514
  limit: int = 10,
512
- ) -> List[Dict[str, Any]]:
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: Optional[List[str]],
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: List[str], limit: int
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: Optional[List[str]],
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") -> Dict[str, Any]:
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()