API-Stuntify / app.py
Silvio0's picture
Update app.py
f714879 verified
from flask import Flask, request, jsonify
from flask_cors import CORS
import joblib
import numpy as np
import os
# Inisialisasi aplikasi Flask
app = Flask(__name__)
CORS(app)
# --- TAHAP 1: KOSONGKAN AREA GLOBAL ---
# JANGAN LOAD MODEL DI SINI.
# Kita buat variabelnya saja, tapi isinya 'None' (kosong)
# Ini membuat server NYALA INSTAN.
model = None
scaler = None
jk_encoder = None
stunting_encoder = None
# Fungsi untuk memuat model (hanya akan dipanggil 1x)
def load_models():
global model, scaler, jk_encoder, stunting_encoder
try:
if model is None: # Cek, jika masih kosong, baru di-load
print("Mencoba memuat model untuk PERTAMA KALI...")
model = joblib.load("best_model.joblib")
scaler = joblib.load("scaler.joblib")
jk_encoder = joblib.load("Jenis Kelamin_encoder.joblib")
stunting_encoder = joblib.load("Stunting_encoder.joblib")
print("Semua 4 model berhasil dimuat!")
return True
except Exception as e:
print(f"Error saat memuat model: {e}")
return False
# --- TAHAP 2: ENDPOINT PREDIKSI ---
@app.route('/')
def home():
return jsonify({
"status": "OK",
"info": "Welcome to the Stunting Prediction API!",
"how_to_use": "Send POST to /predict with: jenis_kelamin, umur, tinggi, berat"
})
@app.route('/predict', methods=['POST'])
def predict():
global model, scaler, jk_encoder, stunting_encoder
# Panggil fungsi load_models.
# Jika model belum di-load, dia akan di-load sekarang.
# Jika sudah, dia akan dilewati.
if not load_models():
return jsonify({"error": "Model gagal dimuat di server. Cek logs."}), 500
# ... (Sisa kodenya SAMA PERSIS) ...
try:
data = request.get_json()
jk_string = data['jenis_kelamin']
umur = data['umur']
tinggi = data['tinggi']
berat = data['berat']
jk_encoded = jk_encoder.transform([jk_string])[0]
numerical_features = [[umur, tinggi, berat]]
scaled_features = scaler.transform(numerical_features)
umur_scaled = scaled_features[0][0]
tinggi_scaled = scaled_features[0][1]
berat_scaled = scaled_features[0][2]
final_features_list = [jk_encoded, umur_scaled, tinggi_scaled, berat_scaled]
final_features = [np.array(final_features_list)]
prediction_encoded = model.predict(final_features)
prediction_string = stunting_encoder.inverse_transform(prediction_encoded)
output = prediction_string[0]
return jsonify({'prediction': output})
except KeyError as e:
return jsonify({"error": f"Key JSON tidak ditemukan: {str(e)}."}), 400
except Exception as e:
return jsonify({"error": f"Terjadi error saat prediksi: {str(e)}"}), 400
# --- TAHAP 3: SERVER RUN ---
# (Ini sudah benar, JANGAN DIUBAH)
if __name__ == '__main__':
port = int(os.environ.get('PORT', 7860))
app.run(host="0.0.0.0", port=port, debug=False)