saindras

aplikasi-dpib-informasi-material-bangunan.py

Oct 21st, 2025 (edited)
1,131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.45 KB | None | 0 0
  1. import streamlit as st
  2. import os
  3. import google.generativeai as genai
  4.  
  5. # --- Konfigurasi Halaman Streamlit ---
  6. st.set_page_config(page_title="Info Material Bangunan DPIB", page_icon="🧱", layout="wide")
  7. st.title("🧱 Asisten Informasi Material Bangunan")
  8. st.caption("Didukung oleh KA Generatif (Gemini)")
  9.  
  10. # --- Konfigurasi API Key & Model Gemini ---
  11. api_key_configured = False
  12. model = None
  13.  
  14. # --- Fungsi untuk Inisialisasi Model (Dipanggil saat dibutuhkan) ---
  15. def initialize_model():
  16.     global model, api_key_configured
  17.     if model is None and not api_key_configured: # Hanya inisialisasi sekali
  18.         api_key_configured= True # Tandai sudah dicek
  19.         try:
  20.             # Menggunakan GOOGLE_API_KEY
  21.             api_key = os.environ['GOOGLE_API_KEY']
  22.             genai.configure(api_key=api_key)
  23.             # Menggunakan model LLM Gemini
  24.             model = genai.GenerativeModel('models/gemini-2.0-flash-lite')
  25.             st.success("API Key & Model KA berhasil dikonfigurasi.")
  26.             return True # Berhasil
  27.         except KeyError:
  28.             st.error("Error: GOOGLE_API_KEY tidak ditemukan di Replit Secrets.")
  29.             st.info("Pastikan Anda sudah menambahkan GOOGLE_API_KEY ke bagian Secrets di Replit.")
  30.             return False # Gagal
  31.         except Exception as e:
  32.             st.error(f"Error saat mengkonfigurasi atau memuat model KA: {e}")
  33.             return False # Gagal
  34.     elif model is not None:
  35.          return True # Sudah terinisialisasi sebelumnya
  36.     else:
  37.          # Jika api_key_configuredTrue tapi model masih None, berarti gagal sebelumnya
  38.          st.error("Konfigurasi API Key gagal sebelumnya. Periksa Secrets dan refresh halaman.")
  39.          return False
  40. # Konfigurasi library genai jika API Key ditemukan
  41. if api_key_configured:
  42.     try:
  43.         # Nama model yang akan digunakan
  44.         model = genai.GenerativeModel('models/gemini-2.0-flash-lite')
  45.         st.info("Model Generative KA ('models/gemini-2.0-flash-lite') siap digunakan.")
  46.     except Exception as e:
  47.         st.error(f"Error saat mengkonfigurasi atau memuat model KA: {e}")
  48.         st.stop()
  49.  
  50. # --- Fungsi untuk Membuat Prompt Material ---
  51. def buat_prompt_material(nama_material):
  52.     # Prompt spesifik untuk informasi material
  53.     return f"""
  54.    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.
  55.  
  56.    Siswa ingin mengetahui informasi tentang material bangunan berikut: '{nama_material}'
  57.  
  58.    Tugas Anda:
  59.    Berikan deskripsi ringkas namun komprehensif tentang material tersebut, mencakup poin-poin berikut:
  60.  
  61.    1.  **Deskripsi Umum:** Jelaskan secara singkat apa material itu.
  62.    2.  **Karakteristik Utama:** Sebutkan 3-4 sifat atau ciri khas utama dari material ini (misal: kekuatan, bobot, ketahanan air, isolasi termal, dll.).
  63.    3.  **Kelebihan:** Sebutkan 2-3 keuntungan utama menggunakan material ini dalam konstruksi.
  64.    4.  **Kekurangan:** Sebutkan 2-3 keterbatasan atau kerugian utama dari material ini.
  65.    5.  **Penggunaan Umum:** Berikan 2-3 contoh aplikasi atau bagian bangunan di mana material ini sering digunakan.
  66.  
  67.    Format Jawaban (Gunakan Markdown):
  68.  
  69.    ### Informasi Material: {nama_material}
  70.  
  71.    **1. Deskripsi Umum:**
  72.    [Penjelasan singkat material]
  73.  
  74.    **2. Karakteristik Utama:**
  75.    * [Karakteristik 1]: [Penjelasan singkat]
  76.    * [Karakteristik 2]: [Penjelasan singkat]
  77.    * [Karakteristik 3]: [Penjelasan singkat]
  78.    * [Karakteristik 4 (jika relevan)]: [Penjelasan singkat]
  79.  
  80.    **3. Kelebihan:**
  81.    * [Kelebihan 1]
  82.    * [Kelebihan 2]
  83.    * [Kelebihan 3 (jika relevan)]
  84.  
  85.    **4. Kekurangan:**
  86.    * [Kekurangan 1]
  87.    * [Kekurangan 2]
  88.    * [Kekurangan 3 (jika relevan)]
  89.  
  90.    **5. Penggunaan Umum:**
  91.    * [Contoh penggunaan 1]
  92.    * [Contoh penggunaan 2]
  93.    * [Contoh penggunaan 3 (jika relevan)]
  94.  
  95.    ---
  96.    **Catatan Penting:**
  97.    * Informasi ini bersifat **umum**. Sifat dan spesifikasi material dapat bervariasi tergantung pada produsen, kualitas, dan standar yang berlaku.
  98.    * Selalu rujuk **data teknis (datasheet)** dari produsen dan konsultasikan dengan guru atau profesional untuk pemilihan material pada proyek spesifik.
  99.    """
  100.  
  101. # --- Interface Pengguna Streamlit ---
  102. st.subheader("Masukkan Nama Material Bangunan:")
  103. material_input = st.text_input("Contoh: Bata Ringan AAC, Baja WF, Kayu Meranti, Kaca Tempered")
  104.  
  105. cari_info_button = st.button("Cari Informasi Material", type="primary")
  106.  
  107. # --- Logika Saat Tombol Ditekan ---
  108. if cari_info_button:
  109.     model_ready = initialize_model()
  110.     # Validasi input
  111.     if not material_input:
  112.         st.warning("Mohon masukkan nama material terlebih dahulu.")
  113.     else:
  114.         # Buat prompt jika input valid
  115.         prompt_final_material = buat_prompt_material(material_input)
  116.  
  117.         with st.spinner(f"🤖 KA sedang mencari informasi tentang {material_input}... Mohon tunggu..."):
  118.             try:
  119.                 # Kirim ke Gemini
  120.                 response = model.generate_content(prompt_final_material)
  121.                 # Cek apakah ada potensi diblokir karena safety
  122.                 if response.parts:
  123.                     jawaban_ai_material = response.text
  124.                 else:
  125.                     # Coba akses safety ratings jika ada, atau berikan pesan umum
  126.                     try:
  127.                         safety_feedback = response.prompt_feedback
  128.                         jawaban_ai_material = f"**Permintaan diblokir karena alasan keamanan.**\n\nDetail:\n{safety_feedback}"
  129.                     except Exception:
  130.                          jawaban_ai_material = "**Permintaan diblokir karena alasan keamanan.** Tidak ada detail tambahan tersedia."
  131.                          st.warning("Respons KA mungkin diblokir karena kebijakan keamanan.")
  132.  
  133.                 # Tampilkan hasil
  134.                 st.divider() # Garis pemisah
  135.                 st.subheader(f"📄 Informasi Mengenai {material_input}:")
  136.                 st.markdown(jawaban_ai_material) # Gunakan markdown
  137.  
  138.             except Exception as e:
  139.                 # Tangani error
  140.                 st.error(f"Terjadi kesalahan saat menghubungi KA: {e}")
  141.                 st.info("Tips: Coba lagi beberapa saat. Pastikan API Key valid dan nama material cukup umum dikenal.")
  142.  
  143. # --- Footer (Opsional) ---
  144. st.divider()
  145. st.markdown("Aplikasi DPIB Info Material | Dibuat dengan Streamlit & Google Gemini")
Advertisement
Add Comment
Please, Sign In to add comment