manoj112025 commited on
Commit
cdd8fdc
·
1 Parent(s): 5a4fe8b

Moved Dockerfile to root directory

Browse files
Files changed (2) hide show
  1. api_flask/Dockerfile → Dockerfile +0 -0
  2. app.py +75 -0
api_flask/Dockerfile → Dockerfile RENAMED
File without changes
app.py ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import json
3
+ import joblib
4
+ import pandas as pd
5
+ from pathlib import Path
6
+ from flask import Flask, request, jsonify
7
+ from flask_cors import CORS
8
+
9
+ app = Flask(__name__)
10
+ CORS(app)
11
+
12
+ # Model directory in HF Space (root/models/)
13
+ MODEL_PATH = Path("models") / "best_model.joblib"
14
+
15
+ if MODEL_PATH.exists():
16
+ PIPELINE = joblib.load(MODEL_PATH)
17
+ else:
18
+ PIPELINE = None
19
+
20
+
21
+ @app.get("/")
22
+ def root():
23
+ return jsonify({
24
+ "status": "ok",
25
+ "message": "ExtraaLearn Lead Conversion API",
26
+ "model_loaded": PIPELINE is not None
27
+ })
28
+
29
+
30
+ @app.post("/predict")
31
+ def predict_single():
32
+ """Predict for a single JSON input"""
33
+ if PIPELINE is None:
34
+ return jsonify({"error": "Model not loaded"}), 503
35
+
36
+ payload = request.get_json(force=True)
37
+ X = pd.DataFrame([payload])
38
+
39
+ proba = float(PIPELINE.predict_proba(X)[:, 1][0])
40
+ pred = int(proba >= 0.5)
41
+
42
+ return jsonify({
43
+ "probability": proba,
44
+ "prediction": pred
45
+ })
46
+
47
+
48
+ @app.post("/predict-batch")
49
+ def predict_batch():
50
+ """Predict for multiple JSON rows"""
51
+ if PIPELINE is None:
52
+ return jsonify({"error": "Model not loaded"}), 503
53
+
54
+ payload = request.get_json(force=True)
55
+
56
+ if isinstance(payload, dict) and "records" in payload:
57
+ records = payload["records"]
58
+ elif isinstance(payload, list):
59
+ records = payload
60
+ else:
61
+ return jsonify({"error": "Invalid payload format"}), 400
62
+
63
+ df = pd.DataFrame(records)
64
+ probas = PIPELINE.predict_proba(df)[:, 1]
65
+ preds = (probas >= 0.5).astype(int)
66
+
67
+ df["conversion_proba"] = probas
68
+ df["prediction"] = preds
69
+
70
+ return df.to_json(orient="records")
71
+
72
+
73
+ if __name__ == "__main__":
74
+ port = int(os.environ.get("PORT", 7860))
75
+ app.run(host="0.0.0.0", port=port)