saindras

aplikasi-dpib-generator-konsep-desain-awal-bangunan.py

Oct 21st, 2025 (edited)
628
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.43 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="Generator Konsep Desain DPIB", page_icon="🏛️", layout="wide")
  7. st.title("🏛️ Generator Konsep Desain Awal 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. def initialize_model():
  15.     global model, api_key_configured
  16.     if model is None and not api_key_configured: # Hanya inisialisasi sekali
  17.         api_key_configured = True # Tandai sudah dicek
  18.         try:
  19.             # Menggunakan GOOGLE_API_KEY
  20.             api_key = os.environ['GOOGLE_API_KEY']
  21.             genai.configure(api_key=api_key)
  22.             # Menggunakan model LLM Gemini
  23.             model = genai.GenerativeModel('models/gemini-2.0-flash-lite')
  24.             st.success("API Key & Model KA berhasil dikonfigurasi.")
  25.             return True # Berhasil
  26.         except KeyError:
  27.             st.error("Error: GOOGLE_API_KEY tidak ditemukan di Replit Secrets.")
  28.             st.info("Pastikan Anda sudah menambahkan GOOGLE_API_KEY ke bagian Secrets di Replit.")
  29.             return False # Gagal
  30.         except Exception as e:
  31.             st.error(f"Error saat mengkonfigurasi atau memuat model KA: {e}")
  32.             return False # Gagal
  33.     elif model is not None:
  34.          return True # Sudah terinisialisasi sebelumnya
  35.     else:
  36.          # Jika api_key_configured True tapi model masih None, berarti gagal sebelumnya
  37.          st.error("Konfigurasi API Key gagal sebelumnya. Periksa Secrets dan refresh halaman.")
  38.          return False
  39.  
  40. # Konfigurasi library genai jika API Key ditemukan
  41. if api_key_configured:
  42.     try:
  43.         # Menggunakan nama model 'gemini-pro-latest'
  44.         model = genai.GenerativeModel('models/gemini-pro-latest')
  45.         st.info("Model Generative KA ('gemini-pro-latest') 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 Konsep Desain ---
  51. def buat_prompt_konsep(gaya, fungsi, lantai):
  52.     # Prompt spesifik untuk konsep desain awal
  53.     return f"""
  54.    Anda adalah seorang asisten arsitek kreatif yang membantu siswa SMK DPIB memvisualisasikan ide desain awal dalam bentuk narasi singkat. Anda bertugas sebagai teman brainstorming.
  55.  
  56.    Parameter Desain yang diberikan Siswa:
  57.    - Gaya Arsitektur: '{gaya}'
  58.    - Fungsi Bangunan: '{fungsi}'
  59.    - Jumlah Lantai: {lantai}
  60.  
  61.    Tugas Anda:
  62.    Buatlah sebuah **deskripsi naratif singkat (sekitar 2-3 paragraf)** mengenai konsep desain awal yang sesuai dengan parameter tersebut. Deskripsi harus membangkitkan imajinasi dan mencakup ide-ide awal tentang:
  63.  
  64.    1.  **Keseluruhan Tampilan & Nuansa:** Bagaimana kesan pertama bangunan tersebut?
  65.    2.  **Tata Ruang (Ide Umum):** Bagaimana kemungkinan penataan ruang utama secara garis besar? Apakah terbuka, tertutup, fungsional?
  66.    3.  **Bentuk Atap (Saran):** Sebutkan satu atau dua ide bentuk atap yang cocok dengan gaya tersebut (misal: atap datar, pelana, limasan, miring sebelah).
  67.    4.  **Material Dominan (Saran):** Sebutkan satu atau dua material utama yang mungkin menonjol sesuai gaya dan fungsi (misal: beton ekspos, kayu, kaca, bata).
  68.    5.  Gunakan bahasa yang deskriptif dan inspiratif, namun tetap relevan dengan parameter yang diberikan.
  69.  
  70.    Format Jawaban (Gunakan Markdown):
  71.  
  72.    ### Konsep Desain Awal
  73.  
  74.    **Gaya:** {gaya} | **Fungsi:** {fungsi} | **Lantai:** {lantai}
  75.  
  76.    [Paragraf 1: Deskripsi tampilan umum dan nuansa bangunan sesuai gaya]
  77.  
  78.    [Paragraf 2: Ide tentang tata ruang utama dan saran bentuk atap yang sesuai]
  79.  
  80.    [Paragraf 3: Saran material dominan yang mendukung konsep dan gaya]
  81.  
  82.    ---
  83.    **Ingat:** Ini hanyalah **konsep awal** untuk inspirasi. Desain detail memerlukan analisis tapak, kebutuhan pengguna yang lebih spesifik, perhitungan struktur, dan pertimbangan lainnya.
  84.    """
  85.  
  86. # --- Interface Pengguna Streamlit ---
  87. st.subheader("Masukkan Parameter Desain:")
  88.  
  89. # Input Kolom Berdampingan
  90. col1, col2, col3 = st.columns(3)
  91. with col1:
  92.     gaya_input = st.text_input("Gaya Arsitektur", placeholder="Minimalis, Tropis Modern, Industrial")
  93. with col2:
  94.     fungsi_input = st.text_input("Fungsi Bangunan", placeholder="Rumah Tinggal, Ruko 2 Lantai, Cafe")
  95. with col3:
  96.     lantai_input = st.number_input("Jumlah Lantai", min_value=1, step=1, format="%d", value=1) # Default 1 lantai
  97.  
  98. buat_konsep_button = st.button("Buat Konsep Desain Awal", type="primary")
  99.  
  100. # --- Logika Saat Tombol Ditekan ---
  101. if buat_konsep_button:
  102.     model_ready = initialize_model()
  103.     # Validasi input
  104.     if not gaya_input:
  105.         st.warning("Mohon masukkan Gaya Arsitektur.")
  106.     elif not fungsi_input:
  107.         st.warning("Mohon masukkan Fungsi Bangunan.")
  108.     elif lantai_input < 1:
  109.         st.warning("Jumlah lantai minimal 1.")
  110.     else:
  111.         # Buat prompt jika input valid
  112.         prompt_final_konsep = buat_prompt_konsep(gaya_input, fungsi_input, lantai_input)
  113.  
  114.         with st.spinner("✨ KA sedang merancang konsep... Menunggu inspirasi..."):
  115.             try:
  116.                 # Kirim ke Gemini
  117.                 response = model.generate_content(prompt_final_konsep)
  118.  
  119.                 # Cek safety
  120.                 if response.parts:
  121.                     jawaban_ai_konsep = response.text
  122.                 else:
  123.                     try:
  124.                         safety_feedback = response.prompt_feedback
  125.                         jawaban_ai_konsep = f"**Permintaan diblokir karena alasan keamanan.**\n\nDetail:\n{safety_feedback}"
  126.                     except Exception:
  127.                          jawaban_ai_konsep = "**Permintaan diblokir karena alasan keamanan.** Tidak ada detail tambahan tersedia."
  128.                          st.warning("Respons AI mungkin diblokir karena kebijakan keamanan.")
  129.  
  130.                 # Tampilkan hasil
  131.                 st.divider() # Garis pemisah
  132.                 st.subheader("💡 Konsep Desain Awal:")
  133.                 st.markdown(jawaban_ai_konsep) # Gunakan markdown
  134.  
  135.             except Exception as e:
  136.                 # Tangani error
  137.                 st.error(f"Terjadi kesalahan saat menghubungi KA: {e}")
  138.                 st.info("Tips: Coba lagi beberapa saat. Pastikan API Key valid dan parameter desain cukup jelas.")
  139.  
  140. # --- Footer ---
  141. st.divider()
  142. st.markdown("Aplikasi DPIB Konsep Desain | Dibuat dengan Streamlit & Google Gemini")
Advertisement
Add Comment
Please, Sign In to add comment