memorisdk 1.0.2__py3-none-any.whl → 2.0.1__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 +24 -8
- memori/agents/conscious_agent.py +252 -414
- memori/agents/memory_agent.py +487 -224
- memori/agents/retrieval_agent.py +491 -68
- memori/config/memory_manager.py +323 -0
- memori/core/conversation.py +393 -0
- memori/core/database.py +386 -371
- memori/core/memory.py +1683 -532
- memori/core/providers.py +217 -0
- memori/database/adapters/__init__.py +10 -0
- memori/database/adapters/mysql_adapter.py +331 -0
- memori/database/adapters/postgresql_adapter.py +291 -0
- memori/database/adapters/sqlite_adapter.py +229 -0
- memori/database/auto_creator.py +320 -0
- memori/database/connection_utils.py +207 -0
- memori/database/connectors/base_connector.py +283 -0
- memori/database/connectors/mysql_connector.py +240 -18
- memori/database/connectors/postgres_connector.py +277 -4
- memori/database/connectors/sqlite_connector.py +178 -3
- memori/database/models.py +400 -0
- memori/database/queries/base_queries.py +1 -1
- memori/database/queries/memory_queries.py +91 -2
- memori/database/query_translator.py +222 -0
- memori/database/schema_generators/__init__.py +7 -0
- memori/database/schema_generators/mysql_schema_generator.py +215 -0
- memori/database/search/__init__.py +8 -0
- memori/database/search/mysql_search_adapter.py +255 -0
- memori/database/search/sqlite_search_adapter.py +180 -0
- memori/database/search_service.py +700 -0
- memori/database/sqlalchemy_manager.py +888 -0
- memori/integrations/__init__.py +36 -11
- memori/integrations/litellm_integration.py +340 -6
- memori/integrations/openai_integration.py +506 -240
- memori/tools/memory_tool.py +94 -4
- memori/utils/input_validator.py +395 -0
- memori/utils/pydantic_models.py +138 -36
- memori/utils/query_builder.py +530 -0
- memori/utils/security_audit.py +594 -0
- memori/utils/security_integration.py +339 -0
- memori/utils/transaction_manager.py +547 -0
- {memorisdk-1.0.2.dist-info → memorisdk-2.0.1.dist-info}/METADATA +56 -23
- memorisdk-2.0.1.dist-info/RECORD +66 -0
- memori/scripts/llm_text.py +0 -50
- memorisdk-1.0.2.dist-info/RECORD +0 -44
- memorisdk-1.0.2.dist-info/entry_points.txt +0 -2
- {memorisdk-1.0.2.dist-info → memorisdk-2.0.1.dist-info}/WHEEL +0 -0
- {memorisdk-1.0.2.dist-info → memorisdk-2.0.1.dist-info}/licenses/LICENSE +0 -0
- {memorisdk-1.0.2.dist-info → memorisdk-2.0.1.dist-info}/top_level.txt +0 -0
memori/utils/pydantic_models.py
CHANGED
|
@@ -19,6 +19,26 @@ class MemoryCategoryType(str, Enum):
|
|
|
19
19
|
rule = "rule"
|
|
20
20
|
|
|
21
21
|
|
|
22
|
+
class MemoryClassification(str, Enum):
|
|
23
|
+
"""Enhanced memory classification for long-term storage"""
|
|
24
|
+
|
|
25
|
+
ESSENTIAL = "essential" # Core facts, preferences, skills
|
|
26
|
+
CONTEXTUAL = "contextual" # Project context, ongoing work
|
|
27
|
+
CONVERSATIONAL = "conversational" # Regular chat, questions, discussions
|
|
28
|
+
REFERENCE = "reference" # Code examples, technical references
|
|
29
|
+
PERSONAL = "personal" # User details, relationships, life events
|
|
30
|
+
CONSCIOUS_INFO = "conscious-info" # Direct promotion to short-term context
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class MemoryImportanceLevel(str, Enum):
|
|
34
|
+
"""Memory importance levels"""
|
|
35
|
+
|
|
36
|
+
CRITICAL = "critical" # Must never be lost
|
|
37
|
+
HIGH = "high" # Very important for context
|
|
38
|
+
MEDIUM = "medium" # Useful to remember
|
|
39
|
+
LOW = "low" # Nice to have context
|
|
40
|
+
|
|
41
|
+
|
|
22
42
|
class RetentionType(str, Enum):
|
|
23
43
|
"""Memory retention types"""
|
|
24
44
|
|
|
@@ -122,42 +142,6 @@ class MemoryImportance(BaseModel):
|
|
|
122
142
|
)
|
|
123
143
|
|
|
124
144
|
|
|
125
|
-
class ProcessedMemory(BaseModel):
|
|
126
|
-
"""Complete processed memory with all extracted information"""
|
|
127
|
-
|
|
128
|
-
# Core categorization
|
|
129
|
-
category: MemoryCategory
|
|
130
|
-
|
|
131
|
-
# Entity extraction
|
|
132
|
-
entities: ExtractedEntities
|
|
133
|
-
|
|
134
|
-
# Importance and retention
|
|
135
|
-
importance: MemoryImportance
|
|
136
|
-
|
|
137
|
-
# Content processing
|
|
138
|
-
summary: str = Field(description="Concise, searchable summary of the memory")
|
|
139
|
-
searchable_content: str = Field(
|
|
140
|
-
description="Content optimized for keyword and semantic search"
|
|
141
|
-
)
|
|
142
|
-
key_insights: List[str] = Field(
|
|
143
|
-
default_factory=list, description="Key insights or takeaways"
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
# Storage decision
|
|
147
|
-
should_store: bool = Field(description="Whether this memory should be stored")
|
|
148
|
-
storage_reasoning: str = Field(
|
|
149
|
-
description="Why this memory should or shouldn't be stored"
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
# Metadata (optional fields)
|
|
153
|
-
timestamp: Optional[datetime] = Field(
|
|
154
|
-
default_factory=datetime.now, description="When this memory was processed"
|
|
155
|
-
)
|
|
156
|
-
processing_metadata: Optional[Dict[str, str]] = Field(
|
|
157
|
-
default=None, description="Additional processing metadata"
|
|
158
|
-
)
|
|
159
|
-
|
|
160
|
-
|
|
161
145
|
class MemorySearchQuery(BaseModel):
|
|
162
146
|
"""Structured query for memory search"""
|
|
163
147
|
|
|
@@ -244,6 +228,124 @@ class ConversationContext(BaseModel):
|
|
|
244
228
|
)
|
|
245
229
|
|
|
246
230
|
|
|
231
|
+
class ProcessedMemory(BaseModel):
|
|
232
|
+
"""Legacy processed memory model for backward compatibility"""
|
|
233
|
+
|
|
234
|
+
content: str = Field(description="The actual memory content")
|
|
235
|
+
summary: str = Field(description="Concise summary for search")
|
|
236
|
+
searchable_content: str = Field(description="Optimized content for search")
|
|
237
|
+
should_store: bool = Field(description="Whether this memory should be stored")
|
|
238
|
+
storage_reasoning: str = Field(
|
|
239
|
+
description="Why this memory should or shouldn't be stored"
|
|
240
|
+
)
|
|
241
|
+
timestamp: datetime = Field(default_factory=datetime.now)
|
|
242
|
+
processing_metadata: Optional[Dict[str, str]] = Field(default=None)
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
class ProcessedLongTermMemory(BaseModel):
|
|
246
|
+
"""Enhanced long-term memory with classification and conscious context"""
|
|
247
|
+
|
|
248
|
+
# Core Memory Content
|
|
249
|
+
content: str = Field(description="The actual memory content")
|
|
250
|
+
summary: str = Field(description="Concise summary for search")
|
|
251
|
+
classification: MemoryClassification = Field(description="Type classification")
|
|
252
|
+
importance: MemoryImportanceLevel = Field(description="Importance level")
|
|
253
|
+
|
|
254
|
+
# Context Information
|
|
255
|
+
topic: Optional[str] = Field(default=None, description="Main topic/subject")
|
|
256
|
+
entities: List[str] = Field(
|
|
257
|
+
default_factory=list, description="People, places, technologies mentioned"
|
|
258
|
+
)
|
|
259
|
+
keywords: List[str] = Field(
|
|
260
|
+
default_factory=list, description="Key terms for search"
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
# Conscious Context Flags
|
|
264
|
+
is_user_context: bool = Field(
|
|
265
|
+
default=False, description="Contains user personal info"
|
|
266
|
+
)
|
|
267
|
+
is_preference: bool = Field(default=False, description="User preference/opinion")
|
|
268
|
+
is_skill_knowledge: bool = Field(
|
|
269
|
+
default=False, description="User's abilities/expertise"
|
|
270
|
+
)
|
|
271
|
+
is_current_project: bool = Field(default=False, description="Current work context")
|
|
272
|
+
|
|
273
|
+
# Memory Management
|
|
274
|
+
duplicate_of: Optional[str] = Field(
|
|
275
|
+
default=None, description="Links to original if duplicate"
|
|
276
|
+
)
|
|
277
|
+
supersedes: List[str] = Field(
|
|
278
|
+
default_factory=list, description="Previous memories this replaces"
|
|
279
|
+
)
|
|
280
|
+
related_memories: List[str] = Field(
|
|
281
|
+
default_factory=list, description="Connected memory IDs"
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
# Technical Metadata
|
|
285
|
+
conversation_id: str = Field(description="Source conversation")
|
|
286
|
+
confidence_score: float = Field(
|
|
287
|
+
default=0.8, description="AI confidence in extraction"
|
|
288
|
+
)
|
|
289
|
+
extraction_timestamp: datetime = Field(default_factory=datetime.now)
|
|
290
|
+
last_accessed: Optional[datetime] = Field(default=None)
|
|
291
|
+
access_count: int = Field(default=0)
|
|
292
|
+
|
|
293
|
+
# Classification Reasoning
|
|
294
|
+
classification_reason: str = Field(description="Why this classification was chosen")
|
|
295
|
+
promotion_eligible: bool = Field(
|
|
296
|
+
default=False, description="Should be promoted to short-term"
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
@property
|
|
300
|
+
def importance_score(self) -> float:
|
|
301
|
+
"""Convert importance level to numeric score"""
|
|
302
|
+
return {"critical": 0.9, "high": 0.7, "medium": 0.5, "low": 0.3}.get(
|
|
303
|
+
self.importance, 0.5
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
class UserContextProfile(BaseModel):
|
|
308
|
+
"""Permanent user context for conscious ingestion"""
|
|
309
|
+
|
|
310
|
+
# Core Identity
|
|
311
|
+
name: Optional[str] = None
|
|
312
|
+
pronouns: Optional[str] = None
|
|
313
|
+
location: Optional[str] = None
|
|
314
|
+
timezone: Optional[str] = None
|
|
315
|
+
|
|
316
|
+
# Professional Context
|
|
317
|
+
job_title: Optional[str] = None
|
|
318
|
+
company: Optional[str] = None
|
|
319
|
+
industry: Optional[str] = None
|
|
320
|
+
experience_level: Optional[str] = None
|
|
321
|
+
specializations: List[str] = Field(default_factory=list)
|
|
322
|
+
|
|
323
|
+
# Technical Stack
|
|
324
|
+
primary_languages: List[str] = Field(default_factory=list)
|
|
325
|
+
frameworks: List[str] = Field(default_factory=list)
|
|
326
|
+
tools: List[str] = Field(default_factory=list)
|
|
327
|
+
environment: Optional[str] = None
|
|
328
|
+
|
|
329
|
+
# Behavioral Preferences
|
|
330
|
+
communication_style: Optional[str] = None
|
|
331
|
+
technical_depth: Optional[str] = None
|
|
332
|
+
response_preference: Optional[str] = None
|
|
333
|
+
|
|
334
|
+
# Current Context
|
|
335
|
+
active_projects: List[str] = Field(default_factory=list)
|
|
336
|
+
learning_goals: List[str] = Field(default_factory=list)
|
|
337
|
+
domain_expertise: List[str] = Field(default_factory=list)
|
|
338
|
+
|
|
339
|
+
# Values & Constraints
|
|
340
|
+
code_standards: List[str] = Field(default_factory=list)
|
|
341
|
+
time_constraints: Optional[str] = None
|
|
342
|
+
technology_preferences: List[str] = Field(default_factory=list)
|
|
343
|
+
|
|
344
|
+
# Metadata
|
|
345
|
+
last_updated: datetime = Field(default_factory=datetime.now)
|
|
346
|
+
version: int = 1
|
|
347
|
+
|
|
348
|
+
|
|
247
349
|
class MemoryStats(BaseModel):
|
|
248
350
|
"""Statistics about stored memories"""
|
|
249
351
|
|