From 00d5c4f5c98f6bef882cc55a5ed4fe0d71d0f97b Mon Sep 17 00:00:00 2001 From: Ayushman Rai Date: Mon, 13 Oct 2025 14:30:30 +0530 Subject: [PATCH] Added FastAPI server for model predictions --- api/server.py | 59 +++++++++++++++++++++++++++++++++++++++++++++ api/server_flask.py | 38 +++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 api/server.py create mode 100644 api/server_flask.py diff --git a/api/server.py b/api/server.py new file mode 100644 index 0000000..e785787 --- /dev/null +++ b/api/server.py @@ -0,0 +1,59 @@ +from fastapi import FastAPI +from pydantic import BaseModel +from models.decision_tree import DecisionTreeModel +from utils.data_helpers import generate_sample_regression_data +import pandas as pd +import uvicorn + +app = FastAPI(title="ML Simulator API", version="1.0") + +# ----- Request Schema ----- +class ModelRequest(BaseModel): + model: str + task_type: str = "classification" # or regression + features: list + +# ----- Endpoints ----- +@app.get("/") +def home(): + return {"message": "Welcome to the ML Simulator API 🎯"} + +@app.post("/predict") +def predict(req: ModelRequest): + """ + Example Input: + { + "model": "decision_tree", + "task_type": "classification", + "features": [[5.1, 3.5, 1.4, 0.2]] + } + """ + model_name = req.model.lower() + task_type = req.task_type.lower() + + # Load or initialize model + if model_name == "decision_tree": + model = DecisionTreeModel(task_type=task_type) + # Generate training data just for demo + if task_type == "classification": + from sklearn.datasets import make_classification + X, y = make_classification(n_samples=100, n_features=len(req.features[0]), random_state=42) + else: + df = generate_sample_regression_data(n_samples=100, n_features=len(req.features[0])) + X, y = df.iloc[:, :-1], df.iloc[:, -1] + + # Train model + model.train(X, y) + + # Predict + prediction = model.predict(pd.DataFrame(req.features)) + return { + "model_used": f"Decision Tree ({task_type})", + "prediction": prediction.tolist() + } + else: + return {"error": "Model not implemented yet."} + + +if __name__ == "__main__": + uvicorn.run("api.server:app", host="0.0.0.0", port=8000, reload=True) diff --git a/api/server_flask.py b/api/server_flask.py new file mode 100644 index 0000000..8bad11e --- /dev/null +++ b/api/server_flask.py @@ -0,0 +1,38 @@ +from flask import Flask, request, jsonify +from models.decision_tree import DecisionTreeModel +from utils.data_helpers import generate_sample_regression_data +import pandas as pd +from sklearn.datasets import make_classification + +app = Flask(__name__) + +@app.route('/') +def home(): + return jsonify({"message": "Welcome to ML Simulator Flask API"}) + +@app.route('/predict', methods=['POST']) +def predict(): + data = request.get_json() + model_name = data.get('model', 'decision_tree') + task_type = data.get('task_type', 'classification') + features = data.get('features', []) + + if model_name == "decision_tree": + model = DecisionTreeModel(task_type=task_type) + if task_type == "classification": + X, y = make_classification(n_samples=100, n_features=len(features[0]), random_state=42) + else: + df = generate_sample_regression_data(n_samples=100, n_features=len(features[0])) + X, y = df.iloc[:, :-1], df.iloc[:, -1] + + model.train(X, y) + prediction = model.predict(pd.DataFrame(features)) + return jsonify({ + "model_used": f"Decision Tree ({task_type})", + "prediction": prediction.tolist() + }) + else: + return jsonify({"error": "Model not implemented"}), 400 + +if __name__ == '__main__': + app.run(debug=True)