mmagani/lead_scoring_api
0
1from fastapi import FastAPI, HTTPException2from pydantic import BaseModel3import pickle4import pandas as pd5import numpy as np6import logging7import uvicorn8 9app = FastAPI()10 11# Configure logging12logging.basicConfig(level=logging.INFO)13logger = logging.getLogger(__name__)14 15# Load trained model safely16try:17 model = pickle.load(open("top_tag_model.pkl", "rb"))18 logger.info("✅ Model loaded successfully.")19except FileNotFoundError:20 model = None21 logger.error("❌ Model not found or not loaded.")22 23# Define request model for validation24class PredictionRequest(BaseModel):25 deal_owner: int26 company_name: int27 stage: int28 closed_won_count: int29 30@app.get("/") # Basic health-check route31async def root():32 return {"message": "API is running"}33 34@app.get("/logs") # Prevent 404 errors for logs endpoint35async def get_logs():36 return {"message": "Logging data not available"}37 38@app.post("/predict")39async def predict(request: PredictionRequest):40 try:41 logger.info(f"🔄 Received request data: {request.dict()}")42 43 # Convert request data into Pandas DataFrame44 df = pd.DataFrame([request.dict()])45 46 if not model:47 raise HTTPException(status_code=500, detail="Model not found or not loaded")48 49 # Get probabilities for all tags50 probabilities = model.predict_proba(df)51 52 # Extract top 5 tags with highest probabilities53 top_5_indices = np.argsort(probabilities[0])[-5:][::-1] # Sort in descending order54 top_5_tags = [{"tag_index": int(idx), "probability": float(probabilities[0][idx])} for idx in top_5_indices]55 56 logger.info(f"✅ Top 5 tags predicted: {top_5_tags}")57 return {"top_5_tags": top_5_tags}58 59 except Exception as e:60 logger.error(f"❌ Prediction error: {e}")61 raise HTTPException(status_code=500, detail=str(e))62 63# Run FastAPI server when executed directly64if __name__ == "__main__":65 uvicorn.run(app, host="0.0.0.0", port=7860)