import math import os import psutil from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from pydantic import BaseModel from scoring_api import evaluate from phase2.optimization import IterativeOptimizer app = FastAPI(title="AI Code Maintainability Scoring Engine API") app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], ) class ScoreRequest(BaseModel): code: str class RefactorRequest(BaseModel): code: str target_score: float = 20.0 max_iterations: int = 3 @app.get("/api/health") def health(): proc = psutil.Process() mem_info = proc.memory_info() sys_mem = psutil.virtual_memory() return { "status": "ok", "service": "AI Code Maintainability Scoring Engine", "memory": { "process_rss_mb": round(mem_info.rss / (1024 * 1024), 2), "process_vms_mb": round(mem_info.vms / (1024 * 1024), 2), "process_memory_percent": round(proc.memory_percent(), 2), "system_total_gb": round(sys_mem.total / (1024**3), 2), "system_available_gb": round(sys_mem.available / (1024**3), 2), "system_used_percent": sys_mem.percent, }, } @app.post("/api/score") def score(request: ScoreRequest): return evaluate(request.code) @app.post("/api/refactor") def refactor(request: RefactorRequest): optimizer = IterativeOptimizer( target_score=request.target_score, max_iterations=request.max_iterations, ) result = optimizer.optimize(request.code) if not math.isfinite(result["final_score"]): result["final_score"] = None return result # Mount frontend dist static files if present frontend_dist = os.path.join(os.path.dirname(__file__), "frontend", "dist") if os.path.exists(frontend_dist): app.mount("/", StaticFiles(directory=frontend_dist, html=True), name="frontend") if __name__ == "__main__": import uvicorn port = int(os.environ.get("PORT", 7860)) uvicorn.run("api_server:app", host="0.0.0.0", port=port)