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
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 07:19 +0800
1from __future__ import annotations
3from typing import Any
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
11logger = get_logger(__name__)
14class AIPipelineOverviewPage:
15 """Management page for /admin/ai/pipeline — AI subsystem overview."""
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
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"
30 if self._config is not None:
31 ai_enabled = self._config.enabled
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"
45 status_value = "Active" if ai_enabled else "Inactive"
46 status_icon = "activity" if ai_enabled else "power"
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 )