File size: 2,142 Bytes
38bc0dc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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)