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()