import gradio as gr import os import sys # Modül yollarını ekle - Hugging Face için düzeltme current_dir = os.path.dirname(os.path.abspath(__file__)) sys.path.append(current_dir) # Modülleri import et try: from vision.detector import mark_dangers from risk.model import predict_risk_with_details from stream.kandilli_feed import get_latest_quakes from rag.chatbot import answer, get_chatbot except ModuleNotFoundError: # Hugging Face için alternatif import yöntemi sys.path.append(os.path.join(current_dir, "vision")) sys.path.append(os.path.join(current_dir, "risk")) sys.path.append(os.path.join(current_dir, "stream")) sys.path.append(os.path.join(current_dir, "rag")) from detector import mark_dangers from model import predict_risk_with_details from kandilli_feed import get_latest_quakes from chatbot import answer, get_chatbot # API anahtarı için global değişken gemini_api_key = None # Ana Gradio uygulaması with gr.Blocks(title="QuakeAware AI") as demo: gr.Markdown("# QuakeAware AI - Deprem Risk Analizi ve Güvenlik Asistanı") with gr.Tab("Görsel Analiz"): gr.Markdown("## Oda Güvenlik Analizi") gr.Markdown("Odanızın fotoğrafını yükleyin, tehlikeli eşyaları işaretleyelim ve en güvenli konumu gösterelim.") with gr.Row(): in_img = gr.Image(label="Oda Fotoğrafı") out_img = gr.Image(label="Analiz Sonucu") analyze_btn = gr.Button("Analiz Et") analyze_btn.click(fn=mark_dangers, inputs=in_img, outputs=out_img) with gr.Tab("Adres Risk Skoru"): gr.Markdown("## Adres Tabanlı Risk Analizi") gr.Markdown("Adresinizi veya il/ilçe bilgisini girin, deprem risk skorunu hesaplayalım.") addr = gr.Textbox(label="Adres veya İl/İlçe") with gr.Row(): with gr.Column(): score = gr.Number(label="Risk Skoru (0-1)", precision=2) category = gr.Textbox(label="Risk Kategorisi") soil_type = gr.Textbox(label="Zemin Türü") building_age = gr.Textbox(label="Tahmini Bina Yaşı") with gr.Column(): explanation = gr.Textbox(label="Risk Açıklaması", lines=5) risk_btn = gr.Button("Risk Hesapla") def process_risk(address): result = predict_risk_with_details(address) if result["success"]: return ( result["risk_score"], result["risk_category"], result["soil_type"], result["building_age"], result["explanation"] ) else: return ( 0, "Hesaplanamadı", "Bilinmiyor", "Bilinmiyor", result["message"] ) risk_btn.click( fn=process_risk, inputs=addr, outputs=[score, category, soil_type, building_age, explanation] ) with gr.Tab("Canlı Depremler"): gr.Markdown("## Gerçek Zamanlı Deprem Takibi") gr.Markdown("Son depremleri Kandilli Rasathanesi verilerine göre haritada görüntüleyin.") with gr.Row(): hours_slider = gr.Slider( minimum=1, maximum=72, value=12, step=1, label="Gösterilecek Saat Aralığı" ) min_mag_slider = gr.Slider( minimum=1.0, maximum=7.0, value=1.0, step=0.1, label="Minimum Büyüklük" ) refresh = gr.Button("Güncelle") quake_map = gr.HTML(label="Deprem Haritası") def update_map(hours, min_mag): return get_latest_quakes(hours=int(hours), min_mag=float(min_mag)) refresh.click(fn=update_map, inputs=[hours_slider, min_mag_slider], outputs=quake_map) # Sayfa yüklendiğinde haritayı otomatik olarak göster demo.load(fn=update_map, inputs=[hours_slider, min_mag_slider], outputs=quake_map) with gr.Tab("Hazırlık Sohbeti"): gr.Markdown("## Deprem Hazırlık Rehberi") gr.Markdown("Deprem hazırlığı konusunda sorularınızı sorun, kişiselleştirilmiş öneriler alın.") # API anahtarı giriş alanı api_key_input = gr.Textbox( label="Gemini API Anahtarı", placeholder="Google Gemini API anahtarınızı buraya girin", type="password" ) api_status = gr.Textbox(label="API Durumu", value="API anahtarı girilmedi") def update_api_key(key): global gemini_api_key if not key or key.strip() == "": gemini_api_key = None return "API anahtarı girilmedi" gemini_api_key = key.strip() # API anahtarını test et chatbot = get_chatbot(gemini_api_key) if chatbot.llm: return "✅ API anahtarı geçerli, Gemini modeli hazır" else: return "❌ API anahtarı geçersiz veya hata oluştu" api_key_input.change(fn=update_api_key, inputs=api_key_input, outputs=api_status) with gr.Row(): chatbot_ui = gr.Chatbot(label="Sohbet", height=400) chat_in = gr.Textbox(label="Sorunuz", placeholder="Örneğin: Deprem çantasında neler bulundurmalıyım?") chat_btn = gr.Button("Sor") def chat(message, history): # Geçmiş sohbeti güncelle history = history or [] # API anahtarı kontrolü if not gemini_api_key: response = "Lütfen önce Gemini API anahtarınızı girin. Hazırlık Sohbeti sekmesinin üst kısmındaki API Anahtarı alanına geçerli bir Gemini API anahtarı girmeniz gerekmektedir." else: response = answer(message, gemini_api_key) history.append((message, response)) return history, "" chat_btn.click( fn=chat, inputs=[chat_in, chatbot_ui], outputs=[chatbot_ui, chat_in], queue=True ) chat_in.submit( fn=chat, inputs=[chat_in, chatbot_ui], outputs=[chatbot_ui, chat_in], queue=True ) gr.Markdown("---") gr.Markdown("© 2025 QuakeAware AI | Deprem güvenliği için yapay zeka çözümleri") # Uygulamayı başlat if __name__ == "__main__": demo.launch()