File size: 3,888 Bytes
613de59
 
7fc8e3a
0d6bf83
613de59
7fc8e3a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
613de59
0d6bf83
7fc8e3a
 
 
613de59
7fc8e3a
 
 
 
 
613de59
 
7fc8e3a
 
 
 
 
 
 
 
 
 
 
 
 
613de59
 
7fc8e3a
 
 
613de59
7fc8e3a
 
 
613de59
7fc8e3a
613de59
0d6bf83
7fc8e3a
 
 
613de59
 
0d6bf83
 
7fc8e3a
 
613de59
7646174
7fc8e3a
 
 
 
 
7646174
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
import gradio as gr
import os
from datetime import datetime
from config import STATIONS
from supabase_utils import get_supabase_client
from api_utils import get_tide_data

def view_tide_data_handler(station_id, date):
    """Handler to fetch and display tide data for a specific date."""
    if not station_id or not date:
        return None, None, "관측소와 날짜를 선택해주세요."
    
    date_str = date.strftime('%Y-%m-%d')
    try:
        result = get_tide_data(station_id, start_date=date_str, include_extremes=True, return_plot=True)
        if result['data'].empty:
            return None, None, f"{date_str}에 대한 데이터가 없습니다."
        
        extremes_df = result.get('extremes', None)
        return result['plot'], extremes_df, f"{date_str}의 조위 데이터 조회 완료"
    except Exception as e:
        return None, None, f"오류 발생: {e}"

def create_ui(prediction_handler, chatbot_handler):
    """Gradio UI를 생성하고 반환합니다."""
    with gr.Blocks(title="통합 조위 예측 시스템", theme=gr.themes.Soft()) as demo:
        gr.Markdown("# 🌊 통합 조위 예측 시스템 with Gemini")

        # 연결 상태 표시
        client = get_supabase_client()
        supabase_status = "🟢 연결됨" if client else "🔴 연결 안됨 (환경변수 확인 필요)"
        gemini_status = "🟢 연결됨" if os.getenv("GEMINI_API_KEY") else "🔴 연결 안됨 (환경변수 확인 필요)"
        gr.Markdown(f"**Supabase 상태**: {supabase_status} | **Gemini 상태**: {gemini_status}")

        with gr.Tabs():
            with gr.TabItem("통합 조위 예측"):
                with gr.Row():
                    with gr.Column(scale=1):
                        station_id_input = gr.Dropdown(STATIONS, label="관측소 선택", value="DT_0001")
                        input_csv = gr.File(label="과거 데이터 업로드 (.csv)")
                        predict_btn = gr.Button("예측 실행", variant="primary")
                    with gr.Column(scale=3):
                        output_plot = gr.Plot(label="예측 결과 시각화")
                        output_df = gr.DataFrame(label="예측 결과 데이터")
                output_log = gr.Textbox(label="실행 로그", lines=5, interactive=False)

            with gr.TabItem("데이터 조회 및 분석"):
                gr.Markdown("### 특정 날짜의 조위 데이터 조회")
                with gr.Row():
                    with gr.Column(scale=1):
                        view_station_input = gr.Dropdown(STATIONS, label="관측소 선택", value="DT_0001")
                        view_date_input = gr.DatePicker(label="날짜 선택", value=datetime.now().strftime("%Y-%m-%d"))
                        view_btn = gr.Button("조회 실행", variant="primary")
                    with gr.Column(scale=3):
                        view_output_plot = gr.Plot(label="조위 그래프")
                        view_output_extremes = gr.DataFrame(label="만조 및 간조 정보")
                view_log = gr.Textbox(label="실행 로그", lines=2, interactive=False)

            with gr.TabItem("AI 조위 챗봇"):
                gr.ChatInterface(
                    fn=chatbot_handler,
                    title="AI 조위 챗봇",
                    description="조위에 대해 궁금한 점을 물어보세요. (예: '인천 오늘 현재 조위 알려줘')",
                    #examples=[]
                )

        predict_btn.click(
            fn=prediction_handler,
            inputs=[station_id_input, input_csv],
            outputs=[output_plot, output_df, output_log]
        )

        view_btn.click(
            fn=view_tide_data_handler,
            inputs=[view_station_input, view_date_input],
            outputs=[view_output_plot, view_output_extremes, view_log]
        )
    return demo