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)