Skip to content

Commit 4c8c72d

Browse files
fix: prevent test collection failures from optional modules
Fixes test collection issues when optional dependencies (praisonaiui, google.generativeai) are not installed in base setup. Changes: - praisonai/inc/models.py: Add try/catch guards around importlib.util.find_spec() calls to handle missing parent packages gracefully - praisonai/ui/_aiui_datastore.py: Move dependency imports to lazy loading in __init__ to allow module import during test collection Resolves #1541 Co-authored-by: praisonai-triage-agent[bot] <praisonai-triage-agent[bot]@users.noreply.github.com>
1 parent 0634923 commit 4c8c72d

2 files changed

Lines changed: 48 additions & 25 deletions

File tree

src/praisonai/praisonai/inc/models.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,22 @@
1616
# Use find_spec for fast availability checks (no actual import)
1717
# This avoids the ~3200ms langchain_openai import at module load
1818
OPENAI_AVAILABLE = importlib.util.find_spec("openai") is not None
19-
GOOGLE_GENAI_AVAILABLE = importlib.util.find_spec("google.generativeai") is not None
20-
ANTHROPIC_AVAILABLE = importlib.util.find_spec("anthropic") is not None
21-
COHERE_AVAILABLE = importlib.util.find_spec("cohere") is not None
19+
20+
# Guard against missing parent packages (fixes test collection in base install)
21+
try:
22+
GOOGLE_GENAI_AVAILABLE = importlib.util.find_spec("google.generativeai") is not None
23+
except (ImportError, AttributeError, ValueError):
24+
GOOGLE_GENAI_AVAILABLE = False
25+
26+
try:
27+
ANTHROPIC_AVAILABLE = importlib.util.find_spec("anthropic") is not None
28+
except (ImportError, AttributeError, ValueError):
29+
ANTHROPIC_AVAILABLE = False
30+
31+
try:
32+
COHERE_AVAILABLE = importlib.util.find_spec("cohere") is not None
33+
except (ImportError, AttributeError, ValueError):
34+
COHERE_AVAILABLE = False
2235

2336
# Lazy import helpers for provider SDKs
2437
def _get_openai_client():

src/praisonai/praisonai/ui/_aiui_datastore.py

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,40 @@
1111

1212
logger = logging.getLogger(__name__)
1313

14-
# Fail loudly on missing optional dependencies per AGENTS.md §4.2
15-
try:
16-
from praisonaiui.datastore import BaseDataStore
17-
except ImportError as e:
18-
raise ImportError(
19-
"praisonaiui is required for PraisonAISessionDataStore. "
20-
"Install with: pip install 'praisonai[ui]'"
21-
) from e
2214

23-
try:
24-
from praisonaiagents.session import SessionStoreProtocol
25-
from praisonaiagents.session import get_hierarchical_session_store
26-
except ImportError as e:
27-
raise ImportError(
28-
"praisonaiagents is required for PraisonAISessionDataStore. "
29-
"Install with: pip install praisonaiagents"
30-
) from e
31-
32-
33-
class PraisonAISessionDataStore(BaseDataStore):
34-
"""Adapter that bridges PraisonAI SessionStoreProtocol to aiui BaseDataStore."""
15+
class PraisonAISessionDataStore:
16+
"""Adapter that bridges PraisonAI SessionStoreProtocol to aiui BaseDataStore.
3517
36-
def __init__(self, store: Optional[SessionStoreProtocol] = None):
37-
"""Initialize with an optional session store, defaults to hierarchical store."""
18+
Note: This class defers dependency imports until instantiation to allow
19+
test collection without optional modules installed.
20+
"""
21+
22+
def __init__(self, store: Optional[Any] = None):
23+
"""Initialize with an optional session store, defaults to hierarchical store.
24+
25+
Args:
26+
store: Optional SessionStoreProtocol implementation
27+
"""
28+
# Lazy import dependencies only when class is instantiated
29+
try:
30+
from praisonaiui.datastore import BaseDataStore
31+
# Make this class inherit from BaseDataStore at runtime
32+
if BaseDataStore not in self.__class__.__bases__:
33+
self.__class__.__bases__ = (BaseDataStore,) + self.__class__.__bases__
34+
except ImportError as e:
35+
raise ImportError(
36+
"praisonaiui is required for PraisonAISessionDataStore. "
37+
"Install with: pip install 'praisonai[ui]'"
38+
) from e
39+
40+
try:
41+
from praisonaiagents.session import get_hierarchical_session_store
42+
except ImportError as e:
43+
raise ImportError(
44+
"praisonaiagents is required for PraisonAISessionDataStore. "
45+
"Install with: pip install praisonaiagents"
46+
) from e
47+
3848
self._store = store or get_hierarchical_session_store()
3949

4050
def _new_id(self) -> str:

0 commit comments

Comments
 (0)