""" AETERNA AI — System & UI Router """ import os from fastapi import APIRouter from fastapi.responses import HTMLResponse, FileResponse import core.model_loader as ml router = APIRouter(tags=["System"]) frontend_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "frontend") @router.get("/", response_class=HTMLResponse) def serve_dashboard(): """Serve the interactive dashboard UI.""" html_path = os.path.join(frontend_dir, "index.html") try: with open(html_path, "r", encoding="utf-8") as f: return HTMLResponse(content=f.read(), status_code=200) except FileNotFoundError: return HTMLResponse(content="

Dashboard HTML not found. Please check your frontend directory.

", status_code=404) @router.get("/style.css") def serve_style(): """Serve style.css directly at root path.""" style_path = os.path.join(frontend_dir, "style.css") if os.path.exists(style_path): return FileResponse(style_path, media_type="text/css") return HTMLResponse(content="/* CSS not found */", status_code=404) @router.get("/app.js") def serve_app_js(): """Serve app.js directly at root path.""" js_path = os.path.join(frontend_dir, "app.js") if os.path.exists(js_path): return FileResponse(js_path, media_type="application/javascript") return HTMLResponse(content="// JS not found", status_code=404) @router.get("/model_actual_vs_predicted.png") def serve_model_png1(): img_path = os.path.join(frontend_dir, "model_actual_vs_predicted.png") if os.path.exists(img_path): return FileResponse(img_path, media_type="image/png") return HTMLResponse(content="Image not found", status_code=404) @router.get("/model_feature_importance.png") def serve_model_png2(): img_path = os.path.join(frontend_dir, "model_feature_importance.png") if os.path.exists(img_path): return FileResponse(img_path, media_type="image/png") return HTMLResponse(content="Image not found", status_code=404) @router.get("/status") def status_check(): """System health check and active model specifications.""" metrics = ml.model_meta.get("metrics", {}) r2_val = metrics.get("r2", 0.8845) * 100 mape_val = metrics.get("mape", 6.12) return { "status": "Online", "system_name": "Aeterna AI Waste Intelligence", "official_website": "https://www.aeternaai.biz.id/", "developer": "Faril Putra Pratama (@FARILtau72)", "github_repository": "https://github.com/FARILtau72/Aeterna-Ai", "linkedin_profile": "https://www.linkedin.com/in/faril-putra-pratama-81561a280/", "model_chronos": "Chronos-T5 Tiny", "model_gbr": f"AETERNA Stacking Regressor (DT+RF+GBR→Ridge) — Synthetic Benchmark: R²={r2_val:.2f}%, MAPE={mape_val:.2f}% (not real-world validation)", "coverage": "44 Kecamatan DKI Jakarta", "dataset": "synthetic_spatial_training_data_2024_2025.csv (SYNTHETIC SIMULATION — not real DLH observations)", "calibrated": False, "research_prototype": True }