File size: 3,212 Bytes
b26c0e7
 
151dd65
27b1242
30234c6
bbbb9f6
30234c6
bbbb9f6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fb6d199
30234c6
bbbb9f6
 
 
 
 
 
30234c6
bbbb9f6
30234c6
bbbb9f6
 
 
 
513792d
c9544f5
 
bbbb9f6
 
 
 
30234c6
c9544f5
bbbb9f6
 
30234c6
 
bbbb9f6
 
 
 
 
 
 
 
 
 
 
9f14943
151dd65
fb6d199
151dd65
 
9f14943
 
bbbb9f6
9f14943
bbbb9f6
 
 
9f14943
 
bbbb9f6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import gradio as gr
import numpy as np
import tensorflow as tf
import joblib
import os
from huggingface_hub import InferenceClient

# === Load model & scaler ===
lstm_model = tf.keras.models.load_model('retrained_lstm_model.h5', compile=False)
lstm_model.compile(optimizer='adam', loss='mse', metrics=['mae'])

scaler_X = joblib.load('scaler_X.joblib')
scaler_y = joblib.load('scaler_y.joblib')
window_size = 7

# === Setup Inference Client for Gemma 2-27B ===
api_key = os.environ.get("hf_")  # Pastikan HF_TOKEN diset di Secrets
client = InferenceClient(
    provider="nebius",
    api_key=api_key
)

def interpret_rainfall_with_gemma2(tavg, rh_avg, rainfall_mm):
    prompt = f"""
    Data cuaca:
    - Temperatur Rata-rata: {tavg}°C
    - Kelembaban Rata-rata: {rh_avg}%
    - Prediksi Curah Hujan: {rainfall_mm:.2f} mm

    Berikan analisis cuaca berdasarkan data di atas. Apakah hujan tergolong ringan, sedang, atau lebat?
    Apa rekomendasi aktivitas harian, terutama jika saya ingin keluar rumah?
    """

    try:
        completion = client.chat.completions.create(
            model="google/gemma-2-27b-it",
            messages=[{"role": "user", "content": prompt}],
            max_tokens=300
        )
        return completion.choices[0].message.content
    except Exception as e:
        return f"Gagal mendapatkan interpretasi: {str(e)}"

# === Gradio App ===
with gr.Blocks(fill_height=True, title="Prediksi Curah Hujan & Interpretasi AI") as demo:
    gr.Markdown("# Prediksi Curah Hujan dengan LSTM + Interpretasi Gemma 2")
    gr.Markdown("Masukkan data cuaca harian dan dapatkan prediksi serta analisis bahasa alami.")

    with gr.Row():
        with gr.Column():
            tavg_input = gr.Number(label="Temperatur Rata-rata (°C)", value=25.0)
            rh_avg_input = gr.Number(label="Kelembaban Rata-rata (%)", value=80.0)
            ss_input = gr.Number(label="Durasi Sinar Matahari (jam)", value=5.0)
            predict_btn = gr.Button("Prediksi Curah Hujan")

        with gr.Column():
            rainfall_output = gr.Textbox(label="Hasil Prediksi (mm)")
            interpretation_output = gr.Textbox(label="Interpretasi AI", lines=12)

    def predict_and_interpret(tavg, rh_avg, ss):
        user_input = np.array([[tavg, rh_avg, ss]] * window_size)
        user_input_scaled = scaler_X.transform(user_input)
        user_input_scaled = user_input_scaled.reshape(1, window_size, 3)

        predicted_scaled = lstm_model.predict(user_input_scaled)
        predicted_rainfall = scaler_y.inverse_transform(predicted_scaled)
        rainfall_mm = float(predicted_rainfall[0][0])

        explanation = interpret_rainfall_with_gemma2(tavg, rh_avg, rainfall_mm)

        return f"{rainfall_mm:.2f}", explanation

    predict_btn.click(
        predict_and_interpret,
        inputs=[tavg_input, rh_avg_input, ss_input],
        outputs=[rainfall_output, interpretation_output]
    )

    gr.Markdown("### Tentang Aplikasi")
    gr.Markdown("""
    Aplikasi ini memanfaatkan:
    - Model LSTM untuk prediksi curah hujan berdasarkan data suhu, kelembaban, dan durasi sinar matahari
    - Model bahasa besar Gemma 2 (27B) untuk menjelaskan hasil prediksi
    """)

demo.launch()