File size: 5,559 Bytes
dcc1c63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import streamlit as st
import pandas as pd
import sys
import os

# Добавляем путь для импорта модулей
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

from agents.orchestrator import TravelOrchestrator
from utils.feedback_learner import FeedbackLearner

# Конфигурация страницы
st.set_page_config(
    page_title="TrendFlow - Умный туристический агент",
    page_icon="🌊",
    layout="wide"
)

# Инициализация состояния сессии
if 'orchestrator' not in st.session_state:
    st.session_state.orchestrator = TravelOrchestrator()

if 'feedback_learner' not in st.session_state:
    st.session_state.feedback_learner = FeedbackLearner()

if 'current_itinerary' not in st.session_state:
    st.session_state.current_itinerary = None

if 'chat_history' not in st.session_state:
    st.session_state.chat_history = []

# Боковая панель
with st.sidebar:
    st.title("🌊 TrendFlow")
    st.caption("Адаптивный планировщик путешествий")
    
    st.divider()
    
    # Блок трендов
    st.subheader("📈 Горячие тренды")
    trends = st.session_state.feedback_learner.get_current_trends(limit=5)
    
    if trends:
        for place, score in trends:
            st.markdown(f"- {place} (🔥 {score:.1f})")
    else:
        st.info("Ставьте 👍 местам, чтобы появились тренды!")
    
    st.divider()
    
    # Статистика
    st.subheader("📊 Статистика")
    stats = st.session_state.feedback_learner.get_feedback_stats()
    col1, col2 = st.columns(2)
    col1.metric("Положительных", stats['positive'])
    col2.metric("Всего", stats['total'])
    
    if st.button("🔄 Сбросить данные", type="secondary"):
        st.session_state.feedback_learner.reset_database()
        st.session_state.current_itinerary = None
        st.rerun()

# Основной контент
st.title("🧳 Куда отправимся сегодня?")
st.markdown("Я анализирую актуальные тренды из отзывов других путешественников и создаю идеальный маршрут специально для вас!")

# Форма ввода
with st.form(key="travel_form"):
    col1, col2, col3 = st.columns([3, 1, 1])
    with col1:
        query = st.text_input(
            "Опишите путешествие",
            placeholder="Например: Хочу в Париж на 3 дня, люблю искусство и веганскую кухню",
            label_visibility="collapsed"
        )
    with col2:
        days = st.number_input("Дней", min_value=1, max_value=14, value=3)
    with col3:
        submit = st.form_submit_button("🌊 Найти маршрут", use_container_width=True)

# Обработка запроса
if submit and query:
    with st.spinner("🤖 Агенты ищут лучшие места с учетом трендов..."):
        itinerary = st.session_state.orchestrator.plan_trip(
            query=query,
            num_days=days,
            feedback_learner=st.session_state.feedback_learner
        )
        st.session_state.current_itinerary = itinerary
        st.rerun()

# Отображение маршрута
if st.session_state.current_itinerary:
    itinerary = st.session_state.current_itinerary
    
    st.success(f"✅ Ваш маршрут в {itinerary['city']} на {itinerary['num_days']} дней готов!")
    
    # Создаем табы для каждого дня
    tabs = st.tabs([f"🏝️ День {i+1}" for i in range(itinerary['num_days'])])
    
    for day_idx, tab in enumerate(tabs):
        with tab:
            day_plan = itinerary['days'][day_idx]
            
            for activity_idx, activity in enumerate(day_plan['activities']):
                cols = st.columns([1, 4, 1, 1])
                
                # Эмодзи для типа
                emoji = "🏨" if activity['type'] == 'hotel' else "🏛️" if activity['type'] == 'attraction' else "🍽️"
                
                with cols[0]:
                    st.markdown(f"### {emoji}")
                with cols[1]:
                    st.markdown(f"**{activity['name']}**")
                    if activity.get('is_trending', False):
                        st.markdown("🔥 **В тренде!**")
                    st.caption(activity.get('description', ''))
                with cols[2]:
                    if st.button("👍", key=f"like_{day_idx}_{activity['id']}"):
                        st.session_state.
feedback_learner.record_feedback(
                            place_id=activity['id'],
                            place_name=activity['name'],
                            city=itinerary['city'],
                            rating=1
                        )
                        st.rerun()
                with cols[3]:
                    if st.button("👎", key=f"dislike_{day_idx}_{activity['id']}"):
                        st.session_state.feedback_learner.record_feedback(
                            place_id=activity['id'],
                            place_name=activity['name'],
                            city=itinerary['city'],
                            rating=-1
                        )
                        st.rerun()
                
                st.divider()