Spaces:
Build error
Build error
| from fastapi import FastAPI | |
| from fastapi.responses import JSONResponse | |
| from pydantic import BaseModel, Field | |
| from typing import Annotated | |
| import pandas as pd | |
| import joblib | |
| import gradio as gr | |
| from fastapi.middleware.cors import CORSMiddleware | |
| # Load model | |
| model_path = "xgb_model_reg.pkl" | |
| model = joblib.load(model_path) | |
| # FastAPI app | |
| app = FastAPI() | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], # Change to your domain in production | |
| allow_methods=["GET", "POST"], | |
| allow_headers=["*"], | |
| ) | |
| # Pydantic model for API validation | |
| class UserInput(BaseModel): | |
| age: Annotated[int, Field(gt=0)] | |
| albumin_gL: Annotated[float, Field(gt=0)] | |
| creat_umol: Annotated[float, Field(gt=0)] | |
| glucose_mmol: Annotated[float, Field(gt=0)] | |
| lncrp: Annotated[float, Field(gt=0)] | |
| lymph: Annotated[float, Field(gt=0)] | |
| mcv: Annotated[float, Field(gt=0)] | |
| rdw: Annotated[float, Field(gt=0)] | |
| alp: Annotated[float, Field(gt=0)] | |
| wbc: Annotated[float, Field(gt=0)] | |
| # FastAPI endpoint | |
| def predict_api(data: UserInput): | |
| try: | |
| df = pd.DataFrame([data.dict()]) | |
| pred = float(model.predict(df)[0]) | |
| return JSONResponse(status_code=200, content={"Predicted Biological Age": pred}) | |
| except Exception as e: | |
| return JSONResponse(status_code=500, content={"error": str(e)}) | |
| # Gradio prediction function | |
| def predict_gradio(age, albumin_gL, creat_umol, glucose_mmol, lncrp, lymph, mcv, rdw, alp, wbc): | |
| df = pd.DataFrame([{ | |
| "age": age, | |
| "albumin_gL": albumin_gL, | |
| "creat_umol": creat_umol, | |
| "glucose_mmol": glucose_mmol, | |
| "lncrp": lncrp, | |
| "lymph": lymph, | |
| "mcv": mcv, | |
| "rdw": rdw, | |
| "alp": alp, | |
| "wbc": wbc | |
| }]) | |
| pred = float(model.predict(df)[0]) | |
| return f"Predicted Biological Age: {pred:.2f} years" | |
| # Gradio interface | |
| gr_interface = gr.Interface( | |
| fn=predict_gradio, | |
| inputs=[ | |
| gr.Number(label="Age", precision=0), | |
| gr.Number(label="Albumin (g/L)"), | |
| gr.Number(label="Creatinine (µmol/L)"), | |
| gr.Number(label="Glucose (mmol/L)"), | |
| gr.Number(label="ln(CRP)"), | |
| gr.Number(label="Lymph"), | |
| gr.Number(label="MCV"), | |
| gr.Number(label="RDW"), | |
| gr.Number(label="ALP"), | |
| gr.Number(label="WBC"), | |
| ], | |
| outputs="text", | |
| title="Biological Age Predictor", | |
| description="Enter patient lab values to predict biological age." | |
| ) | |
| # Mount Gradio app on FastAPI | |
| app = gr.mount_gradio_app(app, gr_interface, path="/gradio") | |
| # To run locally: | |
| # uvicorn app:app --reload | |