| from fastapi import FastAPI, HTTPException |
| from fastapi.middleware.cors import CORSMiddleware |
| from pydantic import BaseModel, Field |
| import time |
| import logging |
| import os |
| from typing import Optional |
|
|
| from engine import NexusCoreEngine |
|
|
| logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') |
| logger = logging.getLogger(__name__) |
|
|
| app = FastAPI(title="Nexus-Core API", version="2.0.0") |
| app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"]) |
|
|
| engine = None |
|
|
| class MoveRequest(BaseModel): |
| fen: str |
| depth: Optional[int] = Field(4, ge=1, le=6) |
| time_limit: Optional[int] = Field(3000, ge=1000, le=10000) |
|
|
| class MoveResponse(BaseModel): |
| best_move: str |
| evaluation: float |
| depth_searched: int |
| nodes_evaluated: int |
| time_taken: int |
|
|
| class HealthResponse(BaseModel): |
| status: str |
| model_loaded: bool |
| version: str |
|
|
| @app.on_event("startup") |
| async def startup_event(): |
| global engine |
| logger.info("🚀 Starting Nexus-Core API...") |
| model_path = "/app/models/nexus-core.onnx" |
| try: |
| engine = NexusCoreEngine(model_path=model_path, num_threads=2) |
| logger.info("✅ Nexus-Core engine loaded") |
| except Exception as e: |
| logger.error(f"❌ Failed to load engine: {e}") |
| raise |
|
|
| @app.get("/health", response_model=HealthResponse) |
| async def health_check(): |
| return {"status": "healthy" if engine else "unhealthy", "model_loaded": engine is not None, "version": "2.0.0"} |
|
|
| @app.post("/get-move", response_model=MoveResponse) |
| async def get_move(request: MoveRequest): |
| if not engine: raise HTTPException(503, "Engine not loaded") |
| if not engine.validate_fen(request.fen): raise HTTPException(400, "Invalid FEN") |
| start = time.time() |
| try: |
| result = engine.get_best_move(request.fen, request.depth, request.time_limit) |
| logger.info(f"Move: {result['best_move']} | Eval: {result['evaluation']:+.2f} | Time: {result['time_taken']}ms") |
| return MoveResponse(**result) |
| except Exception as e: |
| logger.error(f"Error: {e}") |
| raise HTTPException(500, str(e)) |
|
|
| @app.get("/") |
| async def root(): |
| return {"name": "Nexus-Core", "version": "2.0.0", "status": "online" if engine else "starting"} |
|
|
| if __name__ == "__main__": |
| import uvicorn |
| uvicorn.run(app, host="0.0.0.0", port=7860, log_level="info") |