File size: 1,759 Bytes
cdd8fdc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import json
import joblib
import pandas as pd
from pathlib import Path
from flask import Flask, request, jsonify
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

# Model directory in HF Space (root/models/)
MODEL_PATH = Path("models") / "best_model.joblib"

if MODEL_PATH.exists():
    PIPELINE = joblib.load(MODEL_PATH)
else:
    PIPELINE = None


@app.get("/")
def root():
    return jsonify({
        "status": "ok",
        "message": "ExtraaLearn Lead Conversion API",
        "model_loaded": PIPELINE is not None
    })


@app.post("/predict")
def predict_single():
    """Predict for a single JSON input"""
    if PIPELINE is None:
        return jsonify({"error": "Model not loaded"}), 503

    payload = request.get_json(force=True)
    X = pd.DataFrame([payload])

    proba = float(PIPELINE.predict_proba(X)[:, 1][0])
    pred = int(proba >= 0.5)

    return jsonify({
        "probability": proba,
        "prediction": pred
    })


@app.post("/predict-batch")
def predict_batch():
    """Predict for multiple JSON rows"""
    if PIPELINE is None:
        return jsonify({"error": "Model not loaded"}), 503

    payload = request.get_json(force=True)

    if isinstance(payload, dict) and "records" in payload:
        records = payload["records"]
    elif isinstance(payload, list):
        records = payload
    else:
        return jsonify({"error": "Invalid payload format"}), 400

    df = pd.DataFrame(records)
    probas = PIPELINE.predict_proba(df)[:, 1]
    preds = (probas >= 0.5).astype(int)

    df["conversion_proba"] = probas
    df["prediction"] = preds

    return df.to_json(orient="records")


if __name__ == "__main__":
    port = int(os.environ.get("PORT", 7860))
    app.run(host="0.0.0.0", port=port)