Skip to content

Commit 4985415

Browse files
fix: improve memory provider error messages for missing packages (fixes #1630) (#1634)
* fix: improve memory provider error messages for missing packages (fixes #1630) - Update mem0 import error messages to suggest pip install 'praisonaiagents[memory]' - Modified Memory class to show ImportError for explicitly requested providers - Preserve graceful fallback behavior for default provider - Fixes misleading 'API Key not provided' error when mem0ai package is missing Changes: - memory/adapters/factories.py: Updated mem0 ImportError message - knowledge/adapters/mem0_adapter.py: Updated mem0 ImportError message - memory/memory.py: Show ImportError for explicit provider requests Co-authored-by: praisonai-triage-agent[bot] <praisonai-triage-agent[bot]@users.noreply.github.com> * fix: resolve critical issues in memory provider error handling - Fix factory return value being discarded in memory.py - Remove silent exception swallowing that broke backward compatibility - Fix datetime import bug in MongoDB adapter (datetime.timezone.utc) - Preserve original error propagation for misconfigured providers - Ensure factory-created adapters are properly used when successful Fixes issues identified by Greptile and CodeRabbit reviewers. Co-authored-by: Mervin Praison <MervinPraison@users.noreply.github.com> --------- Co-authored-by: praisonai-triage-agent[bot] <272766704+praisonai-triage-agent[bot]@users.noreply.github.com> Co-authored-by: praisonai-triage-agent[bot] <praisonai-triage-agent[bot]@users.noreply.github.com> Co-authored-by: Mervin Praison <MervinPraison@users.noreply.github.com>
1 parent a29deef commit 4985415

3 files changed

Lines changed: 42 additions & 6 deletions

File tree

src/praisonai-agents/praisonaiagents/knowledge/adapters/mem0_adapter.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ def _init_mem0(self):
7171
from mem0 import Memory
7272
except ImportError:
7373
raise ImportError(
74-
"mem0 is not installed. Install with: pip install mem0ai"
74+
"mem0ai is not installed. "
75+
"Run: pip install 'praisonaiagents[memory]'"
7576
)
7677

7778
if self._config:

src/praisonai-agents/praisonaiagents/memory/adapters/factories.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ def create_mem0_memory_adapter(**kwargs) -> MemoryProtocol:
4040
import mem0
4141
except ImportError:
4242
raise ImportError(
43-
"mem0 is required for mem0 adapter. Install with: pip install mem0ai"
43+
"mem0ai is not installed. "
44+
"Run: pip install 'praisonaiagents[memory]'"
4445
)
4546

4647
return Mem0MemoryAdapter(mem0_config=kwargs)
@@ -363,15 +364,15 @@ def _create_indexes(self):
363364

364365
def store_short_term(self, text: str, metadata: Optional[Dict[str, Any]] = None, **kwargs) -> str:
365366
"""Store in MongoDB short-term collection."""
366-
from datetime import datetime
367+
from datetime import datetime, timezone
367368
import time
368369

369370
doc_id = str(time.time_ns())
370371
doc = {
371372
"_id": doc_id,
372373
"content": text,
373374
"metadata": metadata or {},
374-
"created_at": datetime.now(datetime.timezone.utc),
375+
"created_at": datetime.now(timezone.utc),
375376
"memory_type": "short_term"
376377
}
377378

@@ -395,15 +396,15 @@ def search_short_term(self, query: str, limit: int = 5, **kwargs) -> List[Dict[s
395396

396397
def store_long_term(self, text: str, metadata: Optional[Dict[str, Any]] = None, **kwargs) -> str:
397398
"""Store in MongoDB long-term collection."""
398-
from datetime import datetime
399+
from datetime import datetime, timezone
399400
import time
400401

401402
doc_id = str(time.time_ns())
402403
doc = {
403404
"_id": doc_id,
404405
"content": text,
405406
"metadata": metadata or {},
406-
"created_at": datetime.now(datetime.timezone.utc),
407+
"created_at": datetime.now(timezone.utc),
407408
"memory_type": "long_term"
408409
}
409410

src/praisonai-agents/praisonaiagents/memory/memory.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ def _init_protocol_driven_memory(self):
143143
adapter_name = provider_mapping.get(provider, provider)
144144

145145
# Try to get preferred adapter, fallback to available ones
146+
adapter = None
147+
provider_explicitly_requested = provider != "rag" # "rag" is default, others are explicit
148+
146149
try:
147150
adapter_config = self._get_adapter_config_for_provider(adapter_name)
148151
adapter = get_memory_adapter(adapter_name, **adapter_config)
@@ -154,6 +157,37 @@ def _init_protocol_driven_memory(self):
154157
adapter = None
155158

156159
if adapter is None:
160+
# If the provider was explicitly requested, try to give a helpful error message
161+
if provider_explicitly_requested:
162+
try:
163+
# Try the factory function directly to get the specific ImportError message
164+
from .adapters.factories import (
165+
create_mem0_memory_adapter,
166+
create_chroma_memory_adapter,
167+
create_mongodb_memory_adapter,
168+
)
169+
factory_map = {
170+
"mem0": create_mem0_memory_adapter,
171+
"chroma": create_chroma_memory_adapter,
172+
"mongodb": create_mongodb_memory_adapter,
173+
}
174+
if adapter_name in factory_map:
175+
# Call the factory to get ImportError with installation hint
176+
# or capture successful adapter creation
177+
adapter_config = self._get_adapter_config_for_provider(adapter_name)
178+
adapter = factory_map[adapter_name](**adapter_config)
179+
except ImportError:
180+
# Re-raise ImportError with installation instructions
181+
raise
182+
# All other exceptions (e.g., ValueError for missing API key)
183+
# propagate naturally, preserving backward compatibility
184+
185+
# If factory succeeded, use that adapter
186+
if adapter is not None:
187+
self.memory_adapter = adapter
188+
self.provider = adapter_name
189+
return
190+
157191
# Fallback to first available adapter
158192
self._log_verbose(f"Provider '{adapter_name}' not available, trying fallbacks")
159193
# Try each fallback preference individually

0 commit comments

Comments
 (0)