mdb-engine 0.7.4__tar.gz → 0.7.5__tar.gz
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.
- {mdb_engine-0.7.4/mdb_engine.egg-info → mdb_engine-0.7.5}/PKG-INFO +1 -1
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/__init__.py +1 -1
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/cli/main.py +1 -1
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/memory/README.md +86 -6
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/memory/base.py +30 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/memory/service.py +97 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5/mdb_engine.egg-info}/PKG-INFO +1 -1
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/pyproject.toml +1 -1
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/setup.py +1 -1
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/LICENSE +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/MANIFEST.in +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/README.md +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/README.md +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/ARCHITECTURE.md +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/README.md +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/__init__.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/audit.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/base.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/casbin_factory.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/casbin_models.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/config_defaults.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/config_helpers.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/cookie_utils.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/csrf.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/decorators.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/dependencies.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/helpers.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/integration.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/jwt.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/middleware.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/oso_factory.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/provider.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/rate_limiter.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/restrictions.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/session_manager.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/shared_middleware.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/shared_users.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/token_lifecycle.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/token_store.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/users.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/utils.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/websocket_sessions.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/auth/websocket_tickets.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/cli/__init__.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/cli/commands/__init__.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/cli/commands/generate.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/cli/commands/migrate.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/cli/commands/show.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/cli/commands/validate.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/cli/utils.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/config.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/constants.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/core/README.md +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/core/__init__.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/core/app_registration.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/core/app_secrets.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/core/connection.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/core/encryption.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/core/engine.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/core/index_management.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/core/manifest.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/core/ray_integration.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/core/seeding.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/core/service_initialization.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/core/types.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/database/README.md +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/database/__init__.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/database/abstraction.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/database/connection.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/database/query_validator.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/database/resource_limiter.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/database/scoped_wrapper.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/dependencies.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/di/__init__.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/di/container.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/di/providers.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/di/scopes.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/embeddings/README.md +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/embeddings/__init__.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/embeddings/dependencies.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/embeddings/service.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/exceptions.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/indexes/README.md +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/indexes/__init__.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/indexes/helpers.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/indexes/manager.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/memory/__init__.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/observability/README.md +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/observability/__init__.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/observability/health.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/observability/logging.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/observability/metrics.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/repositories/__init__.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/repositories/base.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/repositories/mongo.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/repositories/unit_of_work.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/routing/README.md +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/routing/__init__.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/routing/websockets.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/utils/__init__.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine/utils/mongo.py +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine.egg-info/SOURCES.txt +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine.egg-info/dependency_links.txt +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine.egg-info/entry_points.txt +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine.egg-info/requires.txt +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/mdb_engine.egg-info/top_level.txt +0 -0
- {mdb_engine-0.7.4 → mdb_engine-0.7.5}/setup.cfg +0 -0
|
@@ -16,6 +16,14 @@ The memory service now uses an abstract base class pattern, enabling future memo
|
|
|
16
16
|
- **📝 Type Safety**: Better IDE support and type checking with abstract base class
|
|
17
17
|
- **🎯 Consistent API**: All memory providers implement the same interface
|
|
18
18
|
|
|
19
|
+
### v0.7.5 Enhancements
|
|
20
|
+
|
|
21
|
+
**Memory Injection and Enhanced Delete Capabilities!**
|
|
22
|
+
|
|
23
|
+
- **💉 Inject Method**: New `inject()` method for manual memory insertion without LLM inference - perfect for adding facts, preferences, or structured data directly
|
|
24
|
+
- **🗑️ Enhanced Delete**: Comprehensive delete functionality with improved documentation and user experience
|
|
25
|
+
- **🧠 Memory Explorer UI**: Added memory explorer interface in chit_chat example with inject and delete buttons
|
|
26
|
+
|
|
19
27
|
### v0.7.4 Enhancements
|
|
20
28
|
|
|
21
29
|
**Enhanced Mem0 Integration - Production Ready!**
|
|
@@ -169,6 +177,45 @@ memories = await memory_service.add_all(
|
|
|
169
177
|
)
|
|
170
178
|
```
|
|
171
179
|
|
|
180
|
+
### Inject Memory (Manual Insertion)
|
|
181
|
+
|
|
182
|
+
Manually inject memories without LLM inference. This is useful when you want to directly add facts, preferences, or structured data without going through the inference pipeline:
|
|
183
|
+
|
|
184
|
+
```python
|
|
185
|
+
# Inject memory as a string
|
|
186
|
+
memory = await memory_service.inject(
|
|
187
|
+
memory="The user prefers dark mode interfaces",
|
|
188
|
+
user_id="user123",
|
|
189
|
+
metadata={"source": "manual", "category": "preference"}
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
# Inject memory as a dict
|
|
193
|
+
memory = await memory_service.inject(
|
|
194
|
+
memory={"memory": "Project deadline is next Friday", "category": "work"},
|
|
195
|
+
user_id="user123",
|
|
196
|
+
metadata={"source": "manual", "type": "deadline"}
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
# Returns: {"id": "...", "memory": "...", "metadata": {...}, ...}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Key Differences from `add()`:**
|
|
203
|
+
- **`inject()`**: Direct insertion without LLM inference (faster, no API costs)
|
|
204
|
+
- **`add()`**: Uses LLM inference to extract facts from messages (slower, costs API calls)
|
|
205
|
+
- **`inject()`**: Returns a single memory dict
|
|
206
|
+
- **`add()`**: Returns a list of extracted memories
|
|
207
|
+
|
|
208
|
+
**When to use `inject()`:**
|
|
209
|
+
- Adding known facts or preferences directly
|
|
210
|
+
- Importing structured data
|
|
211
|
+
- When you want to avoid LLM inference costs
|
|
212
|
+
- When you have pre-formatted memory content
|
|
213
|
+
|
|
214
|
+
**When to use `add()`:**
|
|
215
|
+
- Extracting memories from conversations
|
|
216
|
+
- When you want the LLM to identify key facts
|
|
217
|
+
- Processing unstructured text into memories
|
|
218
|
+
|
|
172
219
|
### Search Memories
|
|
173
220
|
|
|
174
221
|
Semantic search across stored memories:
|
|
@@ -278,16 +325,48 @@ updated = memory_service.update(
|
|
|
278
325
|
|
|
279
326
|
### Delete Memory
|
|
280
327
|
|
|
281
|
-
Remove memories:
|
|
328
|
+
Remove memories from storage. Both methods return `True` on success, `False` on failure:
|
|
282
329
|
|
|
283
330
|
```python
|
|
284
|
-
# Delete single memory
|
|
285
|
-
await memory_service.delete(memory_id="memory_123", user_id="user123")
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
331
|
+
# Delete single memory by ID
|
|
332
|
+
success = await memory_service.delete(memory_id="memory_123", user_id="user123")
|
|
333
|
+
if success:
|
|
334
|
+
print("Memory deleted successfully")
|
|
335
|
+
else:
|
|
336
|
+
print("Failed to delete memory (may not exist)")
|
|
337
|
+
|
|
338
|
+
# Delete all memories for a user (use with caution!)
|
|
339
|
+
success = await memory_service.delete_all(user_id="user123")
|
|
340
|
+
if success:
|
|
341
|
+
print("All memories deleted successfully")
|
|
342
|
+
|
|
343
|
+
# Delete with error handling
|
|
344
|
+
try:
|
|
345
|
+
success = await memory_service.delete(memory_id="memory_123", user_id="user123")
|
|
346
|
+
if not success:
|
|
347
|
+
logger.warning(f"Memory {memory_id} not found or already deleted")
|
|
348
|
+
except Mem0MemoryServiceError as e:
|
|
349
|
+
logger.error(f"Error deleting memory: {e}")
|
|
289
350
|
```
|
|
290
351
|
|
|
352
|
+
**Key Features:**
|
|
353
|
+
- **User Scoping**: Both methods respect `user_id` for security
|
|
354
|
+
- **Safe Deletion**: Returns `False` if memory doesn't exist (doesn't raise exception)
|
|
355
|
+
- **Bulk Deletion**: `delete_all()` removes all memories for a user
|
|
356
|
+
- **Idempotent**: Safe to call multiple times (returns `False` if already deleted)
|
|
357
|
+
|
|
358
|
+
**When to use `delete()`:**
|
|
359
|
+
- Removing a specific memory by ID
|
|
360
|
+
- Cleaning up outdated or incorrect memories
|
|
361
|
+
- User-initiated memory removal
|
|
362
|
+
|
|
363
|
+
**When to use `delete_all()`:**
|
|
364
|
+
- Resetting user memory (e.g., account deletion)
|
|
365
|
+
- Clearing test data
|
|
366
|
+
- Bulk cleanup operations
|
|
367
|
+
|
|
368
|
+
**Note**: Deletion is permanent and cannot be undone. Consider implementing soft deletes if you need to recover deleted memories.
|
|
369
|
+
|
|
291
370
|
### Bucket Organization
|
|
292
371
|
|
|
293
372
|
Organize memories into buckets for better management:
|
|
@@ -481,6 +560,7 @@ memory_service = get_memory_service(
|
|
|
481
560
|
#### Methods
|
|
482
561
|
|
|
483
562
|
- `add(messages, user_id, metadata=None, bucket_id=None, bucket_type=None, store_raw_content=False, raw_content=None)` - Add single memory with optional bucket and raw content storage
|
|
563
|
+
- `inject(memory, user_id, metadata=None)` - Manually inject a memory without LLM inference
|
|
484
564
|
- `add_with_raw_content(messages, raw_content, user_id, bucket_id=None, bucket_type=None)` - Store both extracted facts and raw content
|
|
485
565
|
- `get_buckets(user_id, bucket_type=None, limit=None)` - Get all buckets for a user
|
|
486
566
|
- `get_bucket_memories(bucket_id, user_id, include_raw_content=False, limit=None)` - Get all memories in a bucket
|
|
@@ -57,6 +57,36 @@ class BaseMemoryService(ABC):
|
|
|
57
57
|
"""
|
|
58
58
|
pass
|
|
59
59
|
|
|
60
|
+
@abstractmethod
|
|
61
|
+
def inject(
|
|
62
|
+
self,
|
|
63
|
+
memory: str | dict[str, Any],
|
|
64
|
+
user_id: str | None = None,
|
|
65
|
+
metadata: dict[str, Any] | None = None,
|
|
66
|
+
**kwargs,
|
|
67
|
+
) -> dict[str, Any]:
|
|
68
|
+
"""
|
|
69
|
+
Manually inject a memory without LLM inference.
|
|
70
|
+
|
|
71
|
+
This method allows direct insertion of memories without going through
|
|
72
|
+
the inference pipeline. Useful for manually adding facts, preferences,
|
|
73
|
+
or other structured data.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
memory: Memory content as a string or dict with memory/text/content key
|
|
77
|
+
user_id: User ID for scoping (optional but recommended)
|
|
78
|
+
metadata: Additional metadata to store with the memory
|
|
79
|
+
**kwargs: Additional provider-specific arguments
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
Created memory object with ID and metadata
|
|
83
|
+
|
|
84
|
+
Raises:
|
|
85
|
+
MemoryServiceError: If injection operation fails
|
|
86
|
+
ValueError: If memory content is invalid or empty
|
|
87
|
+
"""
|
|
88
|
+
pass
|
|
89
|
+
|
|
60
90
|
@abstractmethod
|
|
61
91
|
def get_all(
|
|
62
92
|
self,
|
|
@@ -4,6 +4,9 @@ Production-ready wrapper for Mem0.ai with strict metadata schema for MongoDB.
|
|
|
4
4
|
|
|
5
5
|
v0.7.4: Enhanced with hybrid update pattern and direct MongoDB access for reliable
|
|
6
6
|
memory operations. Properly handles Mem0's MongoDB structure (_id, payload).
|
|
7
|
+
|
|
8
|
+
v0.7.5: Added inject() method for manual memory insertion without LLM inference,
|
|
9
|
+
and enhanced delete functionality with comprehensive documentation.
|
|
7
10
|
"""
|
|
8
11
|
|
|
9
12
|
import logging
|
|
@@ -419,6 +422,100 @@ class Mem0MemoryService(BaseMemoryService):
|
|
|
419
422
|
logger.exception("Mem0 Add Failed")
|
|
420
423
|
raise Mem0MemoryServiceError(f"Add failed: {e}") from e
|
|
421
424
|
|
|
425
|
+
def inject(
|
|
426
|
+
self,
|
|
427
|
+
memory: str | dict[str, Any],
|
|
428
|
+
user_id: str | None = None,
|
|
429
|
+
metadata: dict[str, Any] | None = None,
|
|
430
|
+
**kwargs,
|
|
431
|
+
) -> dict[str, Any]:
|
|
432
|
+
"""
|
|
433
|
+
Manually inject a memory without LLM inference.
|
|
434
|
+
|
|
435
|
+
This method allows direct insertion of memories without going through
|
|
436
|
+
the inference pipeline. Useful for manually adding facts, preferences,
|
|
437
|
+
or other structured data.
|
|
438
|
+
|
|
439
|
+
Args:
|
|
440
|
+
memory: Memory content as a string or dict with memory/text/content key
|
|
441
|
+
user_id: User ID for scoping (optional but recommended)
|
|
442
|
+
metadata: Additional metadata to store with the memory
|
|
443
|
+
**kwargs: Additional provider-specific arguments
|
|
444
|
+
|
|
445
|
+
Returns:
|
|
446
|
+
Created memory object with ID and metadata
|
|
447
|
+
|
|
448
|
+
Raises:
|
|
449
|
+
Mem0MemoryServiceError: If injection operation fails
|
|
450
|
+
ValueError: If memory content is invalid or empty
|
|
451
|
+
"""
|
|
452
|
+
# Normalize input: convert dict to string if needed
|
|
453
|
+
if isinstance(memory, dict):
|
|
454
|
+
# Extract memory content from dict (support multiple key formats)
|
|
455
|
+
memory_content = (
|
|
456
|
+
memory.get("memory") or memory.get("text") or memory.get("content") or str(memory)
|
|
457
|
+
)
|
|
458
|
+
if not memory_content or not isinstance(memory_content, str):
|
|
459
|
+
raise ValueError(
|
|
460
|
+
"Memory dict must contain 'memory', 'text', or 'content' key with string value"
|
|
461
|
+
)
|
|
462
|
+
# Merge any metadata from the dict
|
|
463
|
+
if "metadata" in memory and isinstance(memory["metadata"], dict):
|
|
464
|
+
final_metadata = dict(metadata) if metadata else {}
|
|
465
|
+
final_metadata.update(memory["metadata"])
|
|
466
|
+
metadata = final_metadata
|
|
467
|
+
elif isinstance(memory, str):
|
|
468
|
+
memory_content = memory.strip()
|
|
469
|
+
if not memory_content:
|
|
470
|
+
raise ValueError("Memory content cannot be empty")
|
|
471
|
+
else:
|
|
472
|
+
raise TypeError(f"Memory must be a string or dict, got {type(memory).__name__}")
|
|
473
|
+
|
|
474
|
+
# Convert to messages format for add() method
|
|
475
|
+
messages = [{"role": "user", "content": memory_content}]
|
|
476
|
+
|
|
477
|
+
try:
|
|
478
|
+
# Call add() with infer=False to bypass LLM inference
|
|
479
|
+
logger.debug(
|
|
480
|
+
f"Injecting memory without inference for user_id={user_id}, "
|
|
481
|
+
f"memory_length={len(memory_content)}"
|
|
482
|
+
)
|
|
483
|
+
result = self.add(
|
|
484
|
+
messages=messages,
|
|
485
|
+
user_id=user_id,
|
|
486
|
+
metadata=metadata,
|
|
487
|
+
infer=False, # Explicitly disable inference
|
|
488
|
+
**kwargs,
|
|
489
|
+
)
|
|
490
|
+
|
|
491
|
+
# Return the first created memory (normalized format)
|
|
492
|
+
if result and isinstance(result, list) and len(result) > 0:
|
|
493
|
+
injected_memory = result[0]
|
|
494
|
+
logger.info(
|
|
495
|
+
f"Successfully injected memory with id={injected_memory.get('id')} "
|
|
496
|
+
f"for user_id={user_id}"
|
|
497
|
+
)
|
|
498
|
+
return injected_memory
|
|
499
|
+
else:
|
|
500
|
+
# This shouldn't happen, but handle gracefully
|
|
501
|
+
logger.warning(
|
|
502
|
+
f"add() returned empty result for inject() call. "
|
|
503
|
+
f"user_id={user_id}, memory_length={len(memory_content)}"
|
|
504
|
+
)
|
|
505
|
+
raise Mem0MemoryServiceError("Failed to inject memory: add() returned empty result")
|
|
506
|
+
except (ValueError, TypeError):
|
|
507
|
+
# Re-raise validation errors as-is
|
|
508
|
+
raise
|
|
509
|
+
except (
|
|
510
|
+
ConnectionError,
|
|
511
|
+
OSError,
|
|
512
|
+
AttributeError,
|
|
513
|
+
RuntimeError,
|
|
514
|
+
KeyError,
|
|
515
|
+
) as e:
|
|
516
|
+
logger.exception("Mem0 inject failed")
|
|
517
|
+
raise Mem0MemoryServiceError(f"Inject failed: {e}") from e
|
|
518
|
+
|
|
422
519
|
def get_all(
|
|
423
520
|
self,
|
|
424
521
|
user_id: str | None = None,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|