marry1908 commited on
Commit
dcc1c63
·
verified ·
1 Parent(s): 6f459ac

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +138 -0
app.py ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import sys
4
+ import os
5
+
6
+ # Добавляем путь для импорта модулей
7
+ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
8
+
9
+ from agents.orchestrator import TravelOrchestrator
10
+ from utils.feedback_learner import FeedbackLearner
11
+
12
+ # Конфигурация страницы
13
+ st.set_page_config(
14
+ page_title="TrendFlow - Умный туристический агент",
15
+ page_icon="🌊",
16
+ layout="wide"
17
+ )
18
+
19
+ # Инициализация состояния сессии
20
+ if 'orchestrator' not in st.session_state:
21
+ st.session_state.orchestrator = TravelOrchestrator()
22
+
23
+ if 'feedback_learner' not in st.session_state:
24
+ st.session_state.feedback_learner = FeedbackLearner()
25
+
26
+ if 'current_itinerary' not in st.session_state:
27
+ st.session_state.current_itinerary = None
28
+
29
+ if 'chat_history' not in st.session_state:
30
+ st.session_state.chat_history = []
31
+
32
+ # Боковая панель
33
+ with st.sidebar:
34
+ st.title("🌊 TrendFlow")
35
+ st.caption("Адаптивный планировщик путешествий")
36
+
37
+ st.divider()
38
+
39
+ # Блок трендов
40
+ st.subheader("📈 Горячие тренды")
41
+ trends = st.session_state.feedback_learner.get_current_trends(limit=5)
42
+
43
+ if trends:
44
+ for place, score in trends:
45
+ st.markdown(f"- {place} (🔥 {score:.1f})")
46
+ else:
47
+ st.info("Ставьте 👍 местам, чтобы появились тренды!")
48
+
49
+ st.divider()
50
+
51
+ # Статистика
52
+ st.subheader("📊 Статистика")
53
+ stats = st.session_state.feedback_learner.get_feedback_stats()
54
+ col1, col2 = st.columns(2)
55
+ col1.metric("Положительных", stats['positive'])
56
+ col2.metric("Всего", stats['total'])
57
+
58
+ if st.button("🔄 Сбросить данные", type="secondary"):
59
+ st.session_state.feedback_learner.reset_database()
60
+ st.session_state.current_itinerary = None
61
+ st.rerun()
62
+
63
+ # Основной контент
64
+ st.title("🧳 Куда отправимся сегодня?")
65
+ st.markdown("Я анализирую актуальные тренды из отзывов других путешественников и создаю идеальный маршрут специально для вас!")
66
+
67
+ # Форма ввода
68
+ with st.form(key="travel_form"):
69
+ col1, col2, col3 = st.columns([3, 1, 1])
70
+ with col1:
71
+ query = st.text_input(
72
+ "Опишите путешествие",
73
+ placeholder="Например: Хочу в Париж на 3 дня, люблю искусство и веганскую кухню",
74
+ label_visibility="collapsed"
75
+ )
76
+ with col2:
77
+ days = st.number_input("Дней", min_value=1, max_value=14, value=3)
78
+ with col3:
79
+ submit = st.form_submit_button("🌊 Найти маршрут", use_container_width=True)
80
+
81
+ # Обработка запроса
82
+ if submit and query:
83
+ with st.spinner("🤖 Агенты ищут лучшие места с учетом трендов..."):
84
+ itinerary = st.session_state.orchestrator.plan_trip(
85
+ query=query,
86
+ num_days=days,
87
+ feedback_learner=st.session_state.feedback_learner
88
+ )
89
+ st.session_state.current_itinerary = itinerary
90
+ st.rerun()
91
+
92
+ # Отображение маршрута
93
+ if st.session_state.current_itinerary:
94
+ itinerary = st.session_state.current_itinerary
95
+
96
+ st.success(f"✅ Ваш маршрут в {itinerary['city']} на {itinerary['num_days']} дней готов!")
97
+
98
+ # Создаем табы для каждого дня
99
+ tabs = st.tabs([f"🏝️ День {i+1}" for i in range(itinerary['num_days'])])
100
+
101
+ for day_idx, tab in enumerate(tabs):
102
+ with tab:
103
+ day_plan = itinerary['days'][day_idx]
104
+
105
+ for activity_idx, activity in enumerate(day_plan['activities']):
106
+ cols = st.columns([1, 4, 1, 1])
107
+
108
+ # Эмодзи для типа
109
+ emoji = "🏨" if activity['type'] == 'hotel' else "🏛️" if activity['type'] == 'attraction' else "🍽️"
110
+
111
+ with cols[0]:
112
+ st.markdown(f"### {emoji}")
113
+ with cols[1]:
114
+ st.markdown(f"**{activity['name']}**")
115
+ if activity.get('is_trending', False):
116
+ st.markdown("🔥 **В тренде!**")
117
+ st.caption(activity.get('description', ''))
118
+ with cols[2]:
119
+ if st.button("👍", key=f"like_{day_idx}_{activity['id']}"):
120
+ st.session_state.
121
+ feedback_learner.record_feedback(
122
+ place_id=activity['id'],
123
+ place_name=activity['name'],
124
+ city=itinerary['city'],
125
+ rating=1
126
+ )
127
+ st.rerun()
128
+ with cols[3]:
129
+ if st.button("👎", key=f"dislike_{day_idx}_{activity['id']}"):
130
+ st.session_state.feedback_learner.record_feedback(
131
+ place_id=activity['id'],
132
+ place_name=activity['name'],
133
+ city=itinerary['city'],
134
+ rating=-1
135
+ )
136
+ st.rerun()
137
+
138
+ st.divider()