| | """ |
| | SkinProAI FastAPI Backend |
| | """ |
| |
|
| | from fastapi import FastAPI |
| | from fastapi.middleware.cors import CORSMiddleware |
| | from fastapi.staticfiles import StaticFiles |
| | from pathlib import Path |
| | import sys |
| |
|
| | |
| | sys.path.insert(0, str(Path(__file__).parent.parent)) |
| |
|
| | from backend.routes import patients, lesions, analysis, chat |
| |
|
| | app = FastAPI(title="SkinProAI API", version="1.0.0") |
| |
|
| | |
| | app.add_middleware( |
| | CORSMiddleware, |
| | allow_origins=["*"], |
| | allow_credentials=True, |
| | allow_methods=["*"], |
| | allow_headers=["*"], |
| | ) |
| |
|
| | |
| | |
| | app.include_router(analysis.router, prefix="/api/patients", tags=["analysis"]) |
| | app.include_router(chat.router, prefix="/api/patients", tags=["chat"]) |
| | app.include_router(patients.router, prefix="/api/patients", tags=["patients"]) |
| | app.include_router(lesions.router, prefix="/api/patients", tags=["lesions"]) |
| |
|
| | |
| | UPLOADS_DIR = Path(__file__).parent.parent / "data" / "uploads" |
| | UPLOADS_DIR.mkdir(parents=True, exist_ok=True) |
| |
|
| | |
| | if UPLOADS_DIR.exists(): |
| | app.mount("/uploads", StaticFiles(directory=str(UPLOADS_DIR)), name="uploads") |
| |
|
| | |
| | BUILD_DIR = Path(__file__).parent.parent / "web" / "dist" |
| | if BUILD_DIR.exists(): |
| | app.mount("/", StaticFiles(directory=str(BUILD_DIR), html=True), name="static") |
| |
|
| |
|
| | @app.on_event("shutdown") |
| | async def shutdown_event(): |
| | from backend.services.analysis_service import get_analysis_service |
| | svc = get_analysis_service() |
| | if svc.agent.mcp_client: |
| | svc.agent.mcp_client.stop() |
| |
|
| |
|
| | @app.get("/api/health") |
| | def health_check(): |
| | return {"status": "ok"} |
| |
|
| |
|
| | if __name__ == "__main__": |
| | import uvicorn |
| | uvicorn.run(app, host="0.0.0.0", port=8000) |
| |
|