Spaces:
Sleeping
Sleeping
| 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 --- | |
| 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" | |
| }) | |
| 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) |