myrmidon / python /src /server /api_routes /stats_api.py
tek Atrust
chore(deploy): build monolithic server for Hugging Face
d5ef46f
Raw
History Blame Contribute Delete
6.82 kB
"""
Stats API endpoints for Archon (Refactored - Lean Controller)
Hardened for Phase 4.6.59 - Ensures no 404s for Admin HUD.
"""
from fastapi import APIRouter, Depends
from ..auth.dependencies import requires_permission
from ..auth.permissions import TASK_READ_TEAM
from ..config.logfire_config import get_logger
from ..services.stats import StatsService
from ..utils import get_supabase_client
logger = get_logger(__name__)
router = APIRouter(prefix="/api/stats", tags=["stats"])
stats_service = StatsService()
@router.get("/commander-trends", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_commander_trends():
try:
return await stats_service.get_commander_trends()
except Exception as e:
logger.error(f"Commander trends failed: {e}")
return []
@router.get("/collab-synergy", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_collab_synergy():
try:
return await stats_service.get_collab_synergy()
except Exception as e:
logger.error(f"API: Collab synergy fetch failed: {e}")
return {"nodes": [], "matrix": [], "error": str(e)}
@router.get("/sla-reliability", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_sla_reliability():
try:
return await stats_service.get_sla_reliability()
except Exception as e:
logger.error(f"API: SLA Reliability failed: {e}")
return {"current_sla": 0, "trend": [], "error": str(e)}
@router.get("/force-readiness", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_force_readiness():
try:
return await stats_service.get_force_readiness()
except Exception as e:
logger.error(f"API: Force readiness failed: {e}")
return {"baseline": 0, "trend": [], "error": str(e)}
@router.get("/business-risks", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_business_risks():
try:
return await stats_service.get_business_risks()
except Exception as e:
logger.error(f"API: Business risks fetch failed: {e}")
return []
@router.get("/health-trend", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_health_trend():
try:
from ..services.health_service import HealthService
return await HealthService().get_health_history(days=30)
except Exception as e:
logger.error(f"API: Health trend fetch failed: {e}")
return {"trend": [], "audit": [], "error": str(e)}
@router.get("/system-overview", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_system_overview():
try:
return await stats_service.get_system_health_overview()
except Exception as e:
logger.error(f"Failed system overview: {e}")
return {"status": "unknown", "error": str(e)}
@router.get("/overview", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
@router.get("/ai-usage", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_ai_usage():
try:
return await stats_service.get_detailed_ai_usage(days=30)
except Exception as e:
logger.error(f"Failed to get AI usage: {e}")
return {"total_monthly_tokens": 0, "total_cost_usd": 0, "usage_percentage": 0}
@router.get("/token-usage/details", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_token_usage_details(days: int = 7):
try:
return await stats_service.get_recent_token_usage(limit=100)
except Exception:
return []
@router.get("/token-usage/recent", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_recent_token_usage(limit: int = 20):
try:
return await stats_service.get_recent_token_usage(limit=limit)
except Exception:
return []
@router.get("/knowledge-roi", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_knowledge_roi():
try:
res = await stats_service.get_knowledge_roi()
return res if res else {"roi": 0, "active_nodes": 0}
except Exception:
return {"roi": 0, "active_nodes": 0}
@router.get("/ethics-audit-queue", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_ethics_audit_queue():
try:
return {"violations": [], "status": "clear"}
except Exception:
return {"violations": [], "status": "error"}
@router.get("/tasks-by-status", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_tasks_by_status():
"""Get the count of tasks grouped by status."""
try:
supabase = get_supabase_client()
response = supabase.table("archon_tasks").select("status").execute()
counts: dict[str, int] = {}
for row in response.data:
s = row.get("status", "unknown")
counts[s] = counts.get(s, 0) + 1
return [{"name": k, "value": v} for k, v in counts.items()]
except Exception as e:
logger.error(f"Failed to get task stats: {e}")
return []
@router.get("/member-performance", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_member_performance():
"""Get the count of COMPLETED tasks grouped by assignee."""
try:
return await stats_service.get_member_performance()
except Exception as e:
logger.error(f"Failed to get performance stats: {e}")
return []
@router.get("/agent-xp", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_agent_xp():
"""Agent Experience (XP) & Level Ranking HUD (Phase 4.6.8)."""
try:
return await stats_service.get_agent_xp_stats()
except Exception as e:
logger.error(f"Failed to get agent xp stats: {e}")
return []
@router.get("/consolidated", dependencies=[Depends(requires_permission(TASK_READ_TEAM))])
async def get_consolidated_stats():
"""Consolidated Strategic Nexus dashboard state (Phase 5.5.7)."""
try:
from src.agents.nexus_oracle_agent import NexusDependencies, NexusOracleAgent
agent = NexusOracleAgent()
deps = NexusDependencies(request_id="nexus-consolidated-request")
result = await agent.run(
user_prompt="Analyze the gathered telemetry and operational details. Synthesize them into the ConsolidatedNexusState schema.",
deps=deps
)
return result
except Exception as e:
logger.error(f"Failed to compile consolidated stats: {e}")
return {
"system_status": "YELLOW",
"health_score": 50,
"short_term_kpis": {"error": str(e)},
"long_term_trends": {},
"main_bottleneck": "NexusOracleAgent run execution failed.",
"recommended_actions": []
}