DocSA commited on
Commit
c8ba8e7
·
verified ·
1 Parent(s): 1516c76

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +305 -255
app.py CHANGED
@@ -1,289 +1,339 @@
 
 
 
 
 
1
  import os
2
- import time
3
  import gradio as gr
4
- from google import genai
5
- from google.genai import types
6
- from dotenv import load_dotenv
7
 
8
- # Завантаження змінних оточення
9
- load_dotenv()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
- # Отримання API ключа (спершу з HF_ENVIRON, потім з локального .env)
12
- api_key = os.environ.get("GEMINI_API_KEY")
13
- if not api_key:
14
- api_key = os.getenv("GEMINI_API_KEY")
15
- if not api_key:
16
- raise ValueError("API ключ не знайдено. Перевірте змінні оточення")
17
 
18
- # Налаштування клієнта API
19
- client = genai.Client(api_key=api_key)
 
 
20
 
21
- # Назва моделі
22
- MODEL_NAME = "gemini-2.5-flash-preview-04-17"
 
23
 
24
- def load_menu():
25
- """Функція для зчитування меню з файлу з покращеною обробкою шляхів"""
26
- try:
27
- # Спроба знайти файл відносно поточної директорії
28
- if os.path.exists('menu.txt'):
29
- print("Знайдено menu.txt в поточній директорії")
30
- with open('menu.txt', 'r', encoding='utf-8') as file:
31
- menu_content = file.read()
32
- return menu_content
33
-
34
- # Спроба знайти файл відносно директорії скрипту
35
- script_dir = os.path.dirname(os.path.abspath(__file__))
36
- menu_path = os.path.join(script_dir, 'menu.txt')
37
- if os.path.exists(menu_path):
38
- print(f"Знайдено menu.txt в директорії скрипту: {menu_path}")
39
- with open(menu_path, 'r', encoding='utf-8') as file:
40
- menu_content = file.read()
41
- return menu_content
42
-
43
- # Пошук в різних можливих директоріях (для Hugging Face)
44
- for possible_dir in ['/app', '/home/user', '/content', '/workspace']:
45
- menu_path = os.path.join(possible_dir, 'menu.txt')
46
- if os.path.exists(menu_path):
47
- print(f"Знайдено menu.txt в: {menu_path}")
48
- with open(menu_path, 'r', encoding='utf-8') as file:
49
- menu_content = file.read()
50
- return menu_content
51
-
52
- # Якщо файл не знайдено
53
- print("ПОМИЛКА: Файл menu.txt не знайдено в жодній з директорій")
54
- # Резервний вміст меню для демон��трації
55
- return """# МЕНЮ ПІЦЕРІЇ "СМАЧНА ПІЦА" (РЕЗЕРВНА КОПІЯ)
56
 
57
- ## КЛАСИЧНІ ПІЦИ
 
 
 
 
 
58
 
59
- МАРГАРИТА
60
- Опис: Класична піца з томатним соусом, моцарелою та базиліком
61
- Інгредієнти: томатний соус, сир моцарела, свіжий базилік, оливкова олія
62
- Розмір: 30 см | Ціна: 160 грн
63
- Розмір: 40 см | Ціна: 220 грн
 
64
 
65
- ПЕПЕРОНІ
66
- Опис: Піца з пікантною ковбаскою пепероні
67
- Інгредієнти: томатний соус, сир моцарела, пепероні
68
- Розмір: 30 см | Ціна: 180 грн
69
- Розмір: 40 см | Ціна: 250 грн"""
70
-
71
- except Exception as e:
72
- print(f"Помилка при зчитуванні меню: {str(e)}")
73
- return "Меню тимчасово недоступне. Будь ласка, зверніться до адміністратора."
74
 
75
- # Глобальна змінна для зберігання меню
76
- menu_data = None
77
 
78
- def get_menu():
79
- """Повертає поточне меню, з можливістю оновлення"""
80
- global menu_data
81
- # Перше завантаження або оновлення меню кожну годину
82
- if menu_data is None or not hasattr(get_menu, "last_update") or time.time() - get_menu.last_update > 3600:
83
- menu_data = load_menu()
84
- get_menu.last_update = time.time()
85
 
86
- # Перевірка завантаження меню
87
- if "Меню тимчасово недоступне" in menu_data:
88
- print("УВАГА: Меню не завантажено коректно! Перевірте файл menu.txt")
89
- else:
90
- print(f"Меню успішно завантажено. Розмір: {len(menu_data)} символів")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
 
92
- return menu_data
 
 
 
 
 
93
 
94
- def create_system_prompt():
95
- """Створює системний промпт для моделі з меню піцерії"""
96
- current_menu = get_menu()
97
- return f"""
98
- Ти дружній чат-бот української піцерії "Смачна Піца".
99
- Твоє завдання - допомагати клієнтам дізнатися про меню, ціни, інгредієнти та доставку.
100
-
101
- Дотримуйся цих правил:
102
- 1. Завжди будь ввічливим і дружнім
103
- 2. Відповідай ТІЛЬКИ на основі наданого меню
104
- 3. Якщо клієнт запитує про щось, чого немає в меню, скажи, що такого у меню немає, але можеш запропонувати схожі опції
105
- 4. Завжди пиши українською мовою
106
- 5. Твої відповіді мають бути короткими і по суті
107
- 6. Пам'ятай всю попередню розмову з клієнтом і використовуй цю інформацію
108
- 7. Якщо клієнт раніше цікавився певними піцами, використовуй цю інформацію для рекомендацій
109
-
110
- Ось актуальне меню:
111
-
112
- {current_menu}
113
- """
114
 
115
- def extract_client_preferences(history):
116
- """Аналізує історію розмови та виявляє уподобання клієнта"""
117
- preferences = {
118
- "піци": [],
119
- "розмір": "",
120
- "додатки": [],
121
- "напої": []
122
- }
123
-
124
- # Аналіз історії повідомлень
125
- for human_msg, _ in history:
126
- human_msg = human_msg.lower()
127
 
128
- # Виявлення вподобань щодо піц
129
- for pizza in ["маргарита", "пепероні", "гавайська", "чотири сири", "карбонара", "барбекю", "вегетаріанська", "грибна"]:
130
- if pizza in human_msg and pizza not in preferences["піци"]:
131
- preferences["піци"].append(pizza)
132
 
133
- # Виявлення вподобань щодо розміру
134
- if "30 см" in human_msg:
135
- preferences["розмір"] = "30 см"
136
- if "40 см" in human_msg:
137
- preferences["розмір"] = "40 см"
138
 
139
- # Виявлення вподобань щодо додатків
140
- for addition in ["часниковий соус", "кетчуп", "сирний соус"]:
141
- if addition in human_msg and addition not in preferences["додатки"]:
142
- preferences["додатки"].append(addition)
143
 
144
- # Виявлення вподобань щодо напоїв
145
- for drink in ["кола", "спрайт", "мінеральна вода"]:
146
- if drink in human_msg and drink not in preferences["напої"]:
147
- preferences["напої"].append(drink)
148
-
149
- return preferences
150
 
151
- def enhance_system_prompt(history):
152
- """Створює розширений системний промпт з урахуванням уподобань клієнта"""
153
- base_prompt = create_system_prompt()
154
-
155
- if not history:
156
- return base_prompt
157
-
158
- preferences = extract_client_preferences(history)
159
-
160
- # Додаєм�� інформацію про уподобання клієнта до промпту
161
- preferences_prompt = "\nІнформація про уподобання клієнта на основі історії розмови:\n"
162
-
163
- if preferences["піци"]:
164
- preferences_prompt += f"- Клієнт цікавився такими піцами: {', '.join(preferences['піци'])}\n"
165
-
166
- if preferences["розмір"]:
167
- preferences_prompt += f"- Клієнт цікавився розміром: {preferences['розмір']}\n"
168
-
169
- if preferences["додатки"]:
170
- preferences_prompt += f"- Клієнт цікавився такими додатками: {', '.join(preferences['додатки'])}\n"
171
-
172
- if preferences["напої"]:
173
- preferences_prompt += f"- Клієнт цікавився такими напоями: {', '.join(preferences['напої'])}\n"
174
-
175
- enhanced_prompt = base_prompt + preferences_prompt
176
- return enhanced_prompt
177
 
178
- def chat_with_history(message, history):
179
- """Функція для чату з історією розмови"""
180
- try:
181
- # Перетворюємо історію розмови у формат для API
182
- conversation = []
183
 
184
- # Додаємо попередні повідомлення з історії
185
- for human_msg, bot_msg in history:
186
- conversation.append(
187
- types.Content(
188
- role="user",
189
- parts=[types.Part.from_text(text=human_msg)]
190
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  )
192
- conversation.append(
193
- types.Content(
194
- role="model",
195
- parts=[types.Part.from_text(text=bot_msg)]
 
 
 
 
 
196
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197
  )
198
-
199
- # Додаємо поточне повідомлення
200
- conversation.append(
201
- types.Content(
202
- role="user",
203
- parts=[types.Part.from_text(text=message)]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
204
  )
205
- )
206
-
207
- # Створюємо розширений системний промпт на основі історії
208
- enhanced_prompt = enhance_system_prompt(history)
209
-
210
- # Конфігурація для запиту
211
- generate_content_config = types.GenerateContentConfig(
212
- response_mime_type="text/plain",
213
- system_instruction=[
214
- types.Part.from_text(text=enhanced_prompt),
215
- ],
216
- )
217
-
218
- # Відправляємо запит до моделі
219
- response = client.models.generate_content(
220
- model=MODEL_NAME,
221
- contents=conversation,
222
- config=generate_content_config,
223
- )
224
-
225
- return response.text
226
-
227
- except Exception as e:
228
- error_message = str(e)
229
- print(f"Помилка при зверненні до API: {error_message}")
230
 
231
- # Повертаємо зрозуміле повідомлення про помилку
232
- if "rate limit" in error_message.lower():
233
- return "Вибачте, зараз я отримую забагато запитів. Будь ласка, спробуйте знову через кілька хвилин."
234
- elif "api key" in error_message.lower():
235
- return "Виникла помилка з аутентифікацією. Будь ласка, повідомте адміністратора."
236
- else:
237
- return f"Вибачте, виникла технічна проблема. Спробуйте повторити запитання або зв'яжіться з піцерією за телефоном."
238
-
239
- def display_menu():
240
- """Функція для відображення поточного меню"""
241
- return get_menu()
242
 
243
- # Створюємо розширений інтерфейс з вкладками
244
- with gr.Blocks(theme="soft") as demo:
245
- gr.Markdown("# Чат-бот піцерії 'Смачна Піца'")
246
- gr.Markdown("Вітаю! Я чат-бот піцерії 'Смачна Піца'. Запитайте мене про меню, ціни, інгредієнти або доставку.")
247
 
248
- with gr.Tab("Чат"):
249
- chatbot = gr.ChatInterface(
250
- fn=chat_with_history,
251
- examples=[
252
- "Які у вас є піци?",
253
- "Розкажи про піцу Пепероні",
254
- "Скільки коштує доставка?",
255
- "Які у вас є вегетаріанські піци?",
256
- "Що порадиш з напоїв?",
257
- "О котрій годині ви працюєте?"
258
- ]
259
- )
260
 
261
- with gr.Tab("Меню"):
262
- gr.Markdown(get_menu())
263
 
264
- with gr.Tab("Про нас"):
265
- gr.Markdown("""
266
- # Піцерія "Смачна Піца"
267
-
268
- Ми пропонуємо найсмачнішу піцу в місті, приготовану з найсвіжіших інгредієнтів!
269
-
270
- ## Контактна інформація
271
-
272
- 📞 Телефон: 067-123-4567
273
- 🕒 Години роботи: щодня з 10:00 до 22:00
274
- 🏠 Адреса: вул. Піцерійна, 1
275
-
276
- ## Доставка
277
-
278
- Безкоштовна доставка при замовленні від 300 грн
279
- Час доставки: 30-60 хвилин
280
- Зона доставки: в межах міста
281
- """)
282
-
283
- # Завантажуємо меню перед стартом
284
- print("Ініціалізація програми...")
285
- get_menu()
286
 
 
287
  if __name__ == "__main__":
288
- print("Запуск чат-бота піцерії...")
289
- demo.launch(share=True) # share=True для генерації публічного посилання
 
 
 
 
 
 
1
+ """
2
+ 🍕 Чат-бот для піцерії "Мама Міа" - Hugging Face версія
3
+ Використовує файл menu.txt для завантаження меню
4
+ """
5
+
6
  import os
 
7
  import gradio as gr
8
+ from openai import OpenAI
 
 
9
 
10
+ class PizzaChatBot:
11
+ """Основний клас чат-боту для піцерії"""
12
+
13
+ def __init__(self):
14
+ """Ініціалізація чат-боту"""
15
+ # Отримуємо API ключ з змінних середовища (HF Secrets)
16
+ self.api_key = os.getenv('OPENROUTER_API_KEY')
17
+ self.base_url = "https://openrouter.ai/api/v1"
18
+ self.model = "qwen/qwen3-235b-a22b:free"
19
+ self.restaurant_name = "Піцерія 'Мама Міа'"
20
+ self.menu = self.load_menu()
21
+
22
+ # Ініціалізація OpenAI клієнта для OpenRouter
23
+ if self.api_key and self.api_key != 'your_api_key_here':
24
+ self.client = OpenAI(
25
+ base_url=self.base_url,
26
+ api_key=self.api_key
27
+ )
28
+ print(f"✅ {self.restaurant_name} чат-бот ініціалізовано")
29
+ else:
30
+ self.client = None
31
+ print("⚠️ API ключ не налаштовано - використовується демо режим")
32
+
33
+ def load_menu(self):
34
+ """Завантажує меню з файлу menu.txt"""
35
+ try:
36
+ with open('menu.txt', 'r', encoding='utf-8') as file:
37
+ content = file.read()
38
+ print(f"✅ Меню завантажено з файлу ({len(content)} символів)")
39
+ return content
40
+ except FileNotFoundError:
41
+ print("❌ Файл menu.txt не знайдено - використовується базове меню")
42
+ return self.get_fallback_menu()
43
+ except Exception as e:
44
+ print(f"❌ Помилка завантаження меню: {e}")
45
+ return self.get_fallback_menu()
46
+
47
+ def get_fallback_menu(self):
48
+ """Резервне меню, якщо файл не завантажується"""
49
+ return """🍕 ПІЦЕРІЯ "МАМА МІА" 🍕
50
 
51
+ 📋 ОСНОВНЕ МЕНЮ:
 
 
 
 
 
52
 
53
+ 🍕 Маргарита (30см) - 250 грн
54
+ 🍕 Пепероні (30см) - 320 грн
55
+ 🍕 Барбекю Чікен (30см) - 450 грн
56
+ 🍕 Морська (30см) - 520 грн
57
 
58
+ 🥗 Салат Цезар - 180 грн
59
+ 🥤 Кока-кола - 35 грн
60
+ 🍰 Тірамісу - 120 грн
61
 
62
+ РЕЖИМ РОБОТИ: 11:00 - 23:00
63
+ 🚚 ДОСТАВКА: Безкоштовно від 400 грн
64
+ 📞 ТЕЛЕФОН: +38 (044) 123-45-67"""
65
+
66
+ def get_system_prompt(self):
67
+ """Створює системний промпт для LLM"""
68
+ return f"""Ти - дружелюбний помічник піцерії "{self.restaurant_name}".
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
+ Твоя роль:
71
+ - Допомагати клієнтам з вибором піци та страв з меню
72
+ - Надавати точну інформацію про ціни та інгредієнти
73
+ - Розповідати про режим роботи, доставку та акції
74
+ - Приймати замовлення та відповідати на запитання
75
+ - Бути ввічливим, корисним та дружелюбним
76
 
77
+ Важливі правила:
78
+ - Завжди говори українською мовою
79
+ - Використовуй емодзі для дружнього спілкування 🍕😊
80
+ - Базуйся тільки на інформації з меню
81
+ - Якщо не знаєш відповіді - направляй до телефону
82
+ - Пропонуй популярні страви та акції
83
 
84
+ Ось повне меню та інформація про піцерію:
 
 
 
 
 
 
 
 
85
 
86
+ {self.menu}
 
87
 
88
+ Починай кожну розмову привітно та будь готовий допомогти!"""
89
+
90
+ def chat_response(self, message, history):
91
+ """Обробляє повідомлення користувача та повертає відповідь"""
92
+ # Якщо немає API ключа - демо режим
93
+ if not self.client:
94
+ return self.demo_response(message)
95
 
96
+ try:
97
+ # Формуємо історію розмови для API
98
+ messages = [{"role": "system", "content": self.get_system_prompt()}]
99
+
100
+ # Додаємо історію розмови (останні 10 повідомлень для економії токенів)
101
+ recent_history = history[-10:] if len(history) > 10 else history
102
+ for human, assistant in recent_history:
103
+ if human and assistant:
104
+ messages.append({"role": "user", "content": human})
105
+ messages.append({"role": "assistant", "content": assistant})
106
+
107
+ # Додаємо поточне повідомлення
108
+ messages.append({"role": "user", "content": message})
109
+
110
+ # Отримуємо відповідь від LLM через OpenRouter
111
+ response = self.client.chat.completions.create(
112
+ model=self.model,
113
+ messages=messages,
114
+ max_tokens=800,
115
+ temperature=0.7
116
+ )
117
+
118
+ return response.choices[0].message.content
119
+
120
+ except Exception as e:
121
+ print(f"❌ Помилка API: {e}")
122
+ return f"Вибачте, виникла технічна проблема 😔 Зателефонуйте нам: +38 (044) 123-45-67"
123
 
124
+ def demo_response(self, message):
125
+ """Демо відповіді без API"""
126
+ message_lower = message.lower()
127
+
128
+ if any(word in message_lower for word in ['меню', 'піца', 'страв']):
129
+ return """🍕 Ось наше меню:
130
 
131
+ **ПІЦИ:**
132
+ Маргарита (30см) - 250 грн
133
+ Пепероні (30см) - 320 грн
134
+ Барбекю Чікен (30см) - 450 грн
135
+ Морська (30см) - 520 грн
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
 
137
+ Що вас цікавить? 😊"""
 
 
 
 
 
 
 
 
 
 
 
138
 
139
+ elif any(word in message_lower for word in ['ціна', 'скільки', 'коштує']):
140
+ return "💰 Ціни на піци від 250 до 520 грн. Безкоштовна доставка від 400 грн! Що саме вас цікавить?"
 
 
141
 
142
+ elif any(word in message_lower for word in ['доставка', 'час', 'швидко']):
143
+ return "🚚 Доставка 30-45 хвилин. Безкоштовно від 400 грн, інакше 50 грн. Працюємо з 11:00 до 23:00!"
 
 
 
144
 
145
+ elif any(word in message_lower for word in ['телефон', 'контакт', 'адреса']):
146
+ return "📞 Телефон: +38 (044) 123-45-67\n📍 Адреса: вул. Хрещатик, 25, Київ\n⏰ Режим: 11:00 - 23:00"
 
 
147
 
148
+ else:
149
+ return f"""Привіт! 👋 Я помічник піцерії "Мама Міа".
 
 
 
 
150
 
151
+ Можу допомогти з:
152
+ 🍕 Меню та цінами
153
+ 📞 Інформацією про доставку
154
+ ⏰ Режимом роботи
155
+ 📋 Оформленням замовлення
156
+
157
+ Що вас цікавить? 😊
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
 
159
+ *Примітка: Зараз працює демо-режим. Для повного функціоналу потрібен API ключ.*"""
160
+
161
+ def create_interface(self):
162
+ """Створює Gradio інтерфейс для Hugging Face"""
 
163
 
164
+ # Кастомні стилі
165
+ custom_css = """
166
+ .gradio-container {
167
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
168
+ }
169
+ .header-banner {
170
+ background: linear-gradient(135deg, #ff6b6b, #feca57, #48cab2);
171
+ border-radius: 15px;
172
+ padding: 25px;
173
+ text-align: center;
174
+ margin-bottom: 20px;
175
+ box-shadow: 0 4px 15px rgba(0,0,0,0.1);
176
+ }
177
+ .info-card {
178
+ background-color: #f8f9fa;
179
+ border-radius: 10px;
180
+ padding: 15px;
181
+ margin-top: 15px;
182
+ border-left: 4px solid #ff6b6b;
183
+ }
184
+ """
185
+
186
+ with gr.Blocks(
187
+ css=custom_css,
188
+ title=f"{self.restaurant_name} - AI Чат-бот",
189
+ theme=gr.themes.Soft()
190
+ ) as interface:
191
+
192
+ # Заголовок з градієнтом
193
+ gr.HTML(f"""
194
+ <div class="header-banner">
195
+ <h1 style="color: white; margin: 0; font-size: 2.5em;">🍕 {self.restaurant_name}</h1>
196
+ <h3 style="color: white; margin: 15px 0; font-size: 1.3em;">
197
+ Привіт! Я AI-помічник, готовий допомогти з замовленням 😊
198
+ </h3>
199
+ <p style="color: white; margin: 0; font-size: 1.1em;">
200
+ Запитайте про меню, ціни, доставку або зробіть замовлення!
201
+ </p>
202
+ </div>
203
+ """)
204
+
205
+ # Основний чат
206
+ chatbot = gr.Chatbot(
207
+ height=500,
208
+ placeholder="🍕 Привіт! Що вас цікавить сьогодні?",
209
+ label="💬 Розмова з піца-ботом",
210
+ avatar_images=("👤", "🤖")
211
  )
212
+
213
+ # Поле вводу та кнопка відправки
214
+ with gr.Row():
215
+ msg = gr.Textbox(
216
+ placeholder="Введіть ваше повідомлення тут...",
217
+ label="",
218
+ lines=2,
219
+ scale=4,
220
+ container=False
221
  )
222
+ send_btn = gr.Button(
223
+ "Відправити 📤",
224
+ variant="primary",
225
+ scale=1,
226
+ size="lg"
227
+ )
228
+
229
+ # Додаткові кнопки
230
+ with gr.Row():
231
+ clear_btn = gr.Button("Очистити чат 🗑️", variant="secondary")
232
+
233
+ # Швидкі запитання
234
+ gr.Examples(
235
+ examples=[
236
+ "Покажіть меню піци",
237
+ "Яка найпопулярніша піца?",
238
+ "Скільки коштує доставка?",
239
+ "Режим роботи піцерії",
240
+ "Хочу замовити 2 піци Маргарита",
241
+ "Які у вас акції?"
242
+ ],
243
+ inputs=msg,
244
+ label="💡 Швидкі запитання (натисніть для вибору):"
245
  )
246
+
247
+ # Інформаційна картка
248
+ gr.HTML("""
249
+ <div class="info-card">
250
+ <h4 style="margin-top: 0; color: #333;">📋 Основна інформація:</h4>
251
+ <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px;">
252
+ <div>
253
+ <strong>📍 Адреса:</strong><br>
254
+ вул. Хрещатик, 25, Київ
255
+ </div>
256
+ <div>
257
+ <strong>📞 Телефон:</strong><br>
258
+ +38 (044) 123-45-67
259
+ </div>
260
+ <div>
261
+ <strong>⏰ Режим роботи:</strong><br>
262
+ Щодня 11:00 - 23:00
263
+ </div>
264
+ <div>
265
+ <strong>🚚 Доставка:</strong><br>
266
+ Безкоштовно від 400 грн
267
+ </div>
268
+ </div>
269
+ </div>
270
+ """)
271
+
272
+ # Обробники подій
273
+ def user_message(message, history):
274
+ """Додає повідомлення користувача до чату"""
275
+ if message.strip():
276
+ return "", history + [[message, None]]
277
+ return message, history
278
+
279
+ def bot_response(history):
280
+ """Генерує відповідь бота"""
281
+ if history and history[-1][0]:
282
+ message = history[-1][0]
283
+ response = self.chat_response(message, history[:-1])
284
+ history[-1][1] = response
285
+ return history
286
+
287
+ def clear_chat():
288
+ """Очищає історію чату"""
289
+ return []
290
+
291
+ # Прив'язування подій
292
+ msg.submit(
293
+ user_message,
294
+ [msg, chatbot],
295
+ [msg, chatbot],
296
+ queue=False
297
+ ).then(
298
+ bot_response,
299
+ chatbot,
300
+ chatbot
301
  )
302
+
303
+ send_btn.click(
304
+ user_message,
305
+ [msg, chatbot],
306
+ [msg, chatbot],
307
+ queue=False
308
+ ).then(
309
+ bot_response,
310
+ chatbot,
311
+ chatbot
312
+ )
313
+
314
+ clear_btn.click(clear_chat, None, chatbot, queue=False)
 
 
 
 
 
 
 
 
 
 
 
 
315
 
316
+ return interface
 
 
 
 
 
 
 
 
 
 
317
 
318
+ def main():
319
+ """Головна функція для запуску на Hugging Face Spaces"""
320
+ print("🚀 Ініціалізація піца-чат-боту для Hugging Face...")
 
321
 
322
+ # Створення екземпляру чат-боту
323
+ bot = PizzaChatBot()
 
 
 
 
 
 
 
 
 
 
324
 
325
+ # Створення інтерфейсу
326
+ interface = bot.create_interface()
327
 
328
+ print(" Інтерфейс створено, запускаємо...")
329
+ return interface
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
330
 
331
+ # Запуск для Hugging Face Spaces
332
  if __name__ == "__main__":
333
+ demo = main()
334
+ demo.launch(
335
+ server_name="0.0.0.0", # Для Hugging Face
336
+ server_port=7860, # Стандартний порт HF
337
+ share=False, # HF автоматично надає публічний доступ
338
+ debug=False # Вимкнути debug в продакшені
339
+ )