Coverage for src/lexigram/ai/admin/pages/overview.py: 0%

32 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-25 07:19 +0800

1from __future__ import annotations 

2 

3from typing import Any 

4 

5from lexigram.ai.config import AIConfig 

6from lexigram.contracts.admin import PageContent 

7from lexigram.contracts.admin.widget_content import Stat, StatContent 

8from lexigram.contracts.ai.providers import ProviderRegistryProtocol 

9from lexigram.logging import get_logger 

10 

11logger = get_logger(__name__) 

12 

13 

14class AIPipelineOverviewPage: 

15 """Management page for /admin/ai/pipeline — AI subsystem overview.""" 

16 

17 def __init__( 

18 self, 

19 config: AIConfig | None = None, 

20 registry: ProviderRegistryProtocol | None = None, 

21 ) -> None: 

22 self._config = config 

23 self._registry = registry 

24 

25 async def handle(self, request: Any) -> PageContent: 

26 ai_enabled: bool = False 

27 provider_count: str | int = "N/A" 

28 model_count: str | int = "N/A" 

29 

30 if self._config is not None: 

31 ai_enabled = self._config.enabled 

32 

33 if self._registry is not None: 

34 try: 

35 providers = self._registry.list_providers() 

36 provider_count = len(providers) 

37 except Exception: 

38 provider_count = "N/A" 

39 try: 

40 models = self._registry.list_models() 

41 model_count = len(models) 

42 except Exception: 

43 model_count = "N/A" 

44 

45 status_value = "Active" if ai_enabled else "Inactive" 

46 status_icon = "activity" if ai_enabled else "power" 

47 

48 return PageContent( 

49 title="AI Pipeline", 

50 body=StatContent( 

51 stats=( 

52 Stat(label="Pipeline Status", value=status_value, icon=status_icon), 

53 Stat(label="Providers", value=str(provider_count), icon="server"), 

54 Stat(label="Models", value=str(model_count), icon="cpu"), 

55 ) 

56 ), 

57 )