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