import streamlit as st
import os
import google.generativeai as genai
# --- Konfigurasi Halaman Streamlit ---
st.set_page_config(page_title="Info Material Bangunan DPIB", page_icon="🧱", layout="wide")
st.title("🧱 Asisten Informasi Material Bangunan")
st.caption("Didukung oleh AI Generatif (Gemini)")
# --- Konfigurasi API Key & Model Gemini ---
api_key_configured = False
model = None
# --- Konfigurasi Awal
try:
# Menggunakan GOOGLE_API_KEY
api_key = os.environ['GOOGLE_API_KEY']
genai.configure(api_key=api_key)
api_key_configured = True
st.success("API Key berhasil dikonfigurasi dari Replit Secrets.")
except KeyError:
st.error("Error: GOOGLE_API_KEY tidak ditemukan di Replit Secrets.")
st.info("Pastikan Anda sudah menambahkan GOOGLE_API_KEY ke bagian Secrets di Replit.")
st.stop()
# Konfigurasi library genai jika API Key ditemukan
if api_key_configured:
try:
# Nama model yang akan digunakan
model = genai.GenerativeModel('models/gemini-pro-latest')
st.info("Model Generative AI ('gemini-pro-latest') siap digunakan.")
except Exception as e:
st.error(f"Error saat mengkonfigurasi atau memuat model AI: {e}")
st.stop()
# --- Fungsi untuk Membuat Prompt Material ---
def buat_prompt_material(nama_material):
# Prompt spesifik untuk informasi material
return f"""
Anda adalah seorang ahli material bangunan dan arsitektur yang bertugas menjelaskan konsep kepada siswa SMK jurusan DPIB (Desain Pemodelan dan Informasi Bangunan). Gunakan bahasa yang jelas, informatif, dan mudah dipahami oleh pemula.
Siswa ingin mengetahui informasi tentang material bangunan berikut: '{nama_material}'
Tugas Anda:
Berikan deskripsi ringkas namun komprehensif tentang material tersebut, mencakup poin-poin berikut:
1. **Deskripsi Umum:** Jelaskan secara singkat apa material itu.
2. **Karakteristik Utama:** Sebutkan 3-4 sifat atau ciri khas utama dari material ini (misal: kekuatan, bobot, ketahanan air, isolasi termal, dll.).
3. **Kelebihan:** Sebutkan 2-3 keuntungan utama menggunakan material ini dalam konstruksi.
4. **Kekurangan:** Sebutkan 2-3 keterbatasan atau kerugian utama dari material ini.
5. **Penggunaan Umum:** Berikan 2-3 contoh aplikasi atau bagian bangunan di mana material ini sering digunakan.
Format Jawaban (Gunakan Markdown):
### Informasi Material: {nama_material}
**1. Deskripsi Umum:**
[Penjelasan singkat material]
**2. Karakteristik Utama:**
* [Karakteristik 1]: [Penjelasan singkat]
* [Karakteristik 2]: [Penjelasan singkat]
* [Karakteristik 3]: [Penjelasan singkat]
* [Karakteristik 4 (jika relevan)]: [Penjelasan singkat]
**3. Kelebihan:**
* [Kelebihan 1]
* [Kelebihan 2]
* [Kelebihan 3 (jika relevan)]
**4. Kekurangan:**
* [Kekurangan 1]
* [Kekurangan 2]
* [Kekurangan 3 (jika relevan)]
**5. Penggunaan Umum:**
* [Contoh penggunaan 1]
* [Contoh penggunaan 2]
* [Contoh penggunaan 3 (jika relevan)]
---
**Catatan Penting:**
* Informasi ini bersifat **umum**. Sifat dan spesifikasi material dapat bervariasi tergantung pada produsen, kualitas, dan standar yang berlaku.
* Selalu rujuk **data teknis (datasheet)** dari produsen dan konsultasikan dengan guru atau profesional untuk pemilihan material pada proyek spesifik.
"""
# --- Interface Pengguna Streamlit ---
st.subheader("Masukkan Nama Material Bangunan:")
material_input = st.text_input("Contoh: Bata Ringan AAC, Baja WF, Kayu Meranti, Kaca Tempered")
cari_info_button = st.button("Cari Informasi Material", type="primary")
# --- Logika Saat Tombol Ditekan ---
if cari_info_button and model:
# Validasi input
if not material_input:
st.warning("Mohon masukkan nama material terlebih dahulu.")
else:
# Buat prompt jika input valid
prompt_final_material = buat_prompt_material(material_input)
with st.spinner(f"🤖 AI sedang mencari informasi tentang {material_input}... Mohon tunggu..."):
try:
# Kirim ke Gemini
response = model.generate_content(prompt_final_material)
# Cek apakah ada potensi diblokir karena safety
if response.parts:
jawaban_ai_material = response.text
else:
# Coba akses safety ratings jika ada, atau berikan pesan umum
try:
safety_feedback = response.prompt_feedback
jawaban_ai_material = f"**Permintaan diblokir karena alasan keamanan.**\n\nDetail:\n{safety_feedback}"
except Exception:
jawaban_ai_material = "**Permintaan diblokir karena alasan keamanan.** Tidak ada detail tambahan tersedia."
st.warning("Respons AI mungkin diblokir karena kebijakan keamanan.")
# Tampilkan hasil
st.divider() # Garis pemisah
st.subheader(f"📄 Informasi Mengenai {material_input}:")
st.markdown(jawaban_ai_material) # Gunakan markdown
except Exception as e:
# Tangani error
st.error(f"Terjadi kesalahan saat menghubungi AI: {e}")
st.info("Tips: Coba lagi beberapa saat. Pastikan API Key valid dan nama material cukup umum dikenal.")
# --- Footer (Opsional) ---
st.divider()
st.markdown("Aplikasi Info Material DPIB | Dibuat dengan Streamlit & Google Gemini")