Spaces:
Build error
Build error
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
| 1 |
-
|
| 2 |
import os
|
| 3 |
import io
|
| 4 |
import base64
|
|
@@ -55,7 +54,11 @@ COLOR_SCHEMES = {
|
|
| 55 |
'sunset': 'Закатный оранжевый',
|
| 56 |
'lavender': 'Лавандовый',
|
| 57 |
'vintage': 'Винтажный',
|
| 58 |
-
'dark': 'Полночь (тёмная)'
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
}
|
| 60 |
|
| 61 |
|
|
@@ -285,7 +288,7 @@ def generate_ai_description_from_image(image_data, language):
|
|
| 285 |
final_prompt = f"{base_prompt}{lang_suffix}"
|
| 286 |
|
| 287 |
try:
|
| 288 |
-
model = genai.GenerativeModel('
|
| 289 |
|
| 290 |
response = model.generate_content([final_prompt, image])
|
| 291 |
|
|
@@ -304,7 +307,7 @@ def generate_ai_description_from_image(image_data, language):
|
|
| 304 |
elif " Billing account not found" in str(e):
|
| 305 |
raise ValueError("Проблема с биллингом аккаунта Google Cloud. Проверьте ваш аккаунт.")
|
| 306 |
elif "Could not find model" in str(e):
|
| 307 |
-
raise ValueError(f"Модель '
|
| 308 |
elif "resource has been exhausted" in str(e).lower():
|
| 309 |
raise ValueError("Квота запросов исчерпана. Попробуйте позже.")
|
| 310 |
elif "content has been blocked" in str(e).lower():
|
|
@@ -374,21 +377,24 @@ def generate_chat_response(message, chat_history_from_client, env_id):
|
|
| 374 |
response = None
|
| 375 |
|
| 376 |
try:
|
| 377 |
-
model = genai.GenerativeModel('
|
|
|
|
|
|
|
| 378 |
|
| 379 |
-
model_chat_history_for_gemini = [
|
| 380 |
-
{'role': 'user', 'parts': [{'text': system_instruction_content}]}
|
| 381 |
-
]
|
| 382 |
for entry in chat_history_from_client:
|
| 383 |
gemini_role = 'model' if entry['role'] == 'ai' else 'user'
|
| 384 |
model_chat_history_for_gemini.append({
|
| 385 |
'role': gemini_role,
|
| 386 |
'parts': [{'text': entry['text']}]
|
| 387 |
})
|
| 388 |
-
|
| 389 |
-
|
| 390 |
-
|
| 391 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 392 |
|
| 393 |
if hasattr(response, 'text'):
|
| 394 |
generated_text = response.text
|
|
@@ -418,6 +424,34 @@ def generate_chat_response(message, chat_history_from_client, env_id):
|
|
| 418 |
else:
|
| 419 |
return f"Извините, произошла ошибка: {e}"
|
| 420 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 421 |
ADMHOSTO_TEMPLATE = '''
|
| 422 |
<!DOCTYPE html>
|
| 423 |
<html lang="ru">
|
|
@@ -563,33 +597,27 @@ CATALOG_TEMPLATE = '''
|
|
| 563 |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/10.2.0/swiper-bundle.min.css">
|
| 564 |
<style>
|
| 565 |
{% if settings.color_scheme == 'forest' %}
|
| 566 |
-
:root {
|
| 567 |
-
--bg-dark: #2F4F4F; --bg-medium: #556B2F; --accent: #90EE90; --accent-hover: #98FB98; --text-light: #F5F5DC; --text-dark: #333; --danger: #CD5C5C; --danger-hover: #F08080;
|
| 568 |
-
}
|
| 569 |
{% elif settings.color_scheme == 'ocean' %}
|
| 570 |
-
:root {
|
| 571 |
-
--bg-dark: #000080; --bg-medium: #1E90FF; --accent: #87CEEB; --accent-hover: #ADD8E6; --text-light: #F0F8FF; --text-dark: #333; --danger: #FF6347; --danger-hover: #FF4500;
|
| 572 |
-
}
|
| 573 |
{% elif settings.color_scheme == 'sunset' %}
|
| 574 |
-
:root {
|
| 575 |
-
--bg-dark: #8B4513; --bg-medium: #D2691E; --accent: #FFA500; --accent-hover: #FFD700; --text-light: #FFF8DC; --text-dark: #333; --danger: #DC143C; --danger-hover: #FF0000;
|
| 576 |
-
}
|
| 577 |
{% elif settings.color_scheme == 'lavender' %}
|
| 578 |
-
:root {
|
| 579 |
-
--bg-dark: #483D8B; --bg-medium: #9370DB; --accent: #E6E6FA; --accent-hover: #D8BFD8; --text-light: #F0F8FF; --text-dark: #333; --danger: #DB7093; --danger-hover: #FFC0CB;
|
| 580 |
-
}
|
| 581 |
{% elif settings.color_scheme == 'vintage' %}
|
| 582 |
-
:root {
|
| 583 |
-
--bg-dark: #5D4037; --bg-medium: #A1887F; --accent: #D7CCC8; --accent-hover: #EFEBE9; --text-light: #F5F5F5; --text-dark: #3E2723; --danger: #BF360C; --danger-hover: #F4511E;
|
| 584 |
-
}
|
| 585 |
{% elif settings.color_scheme == 'dark' %}
|
| 586 |
-
:root {
|
| 587 |
-
|
| 588 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 589 |
{% else %}
|
| 590 |
-
:root {
|
| 591 |
-
--bg-dark: #003C43; --bg-medium: #135D66; --accent: #48D1CC; --accent-hover: #77E4D8; --text-light: #E3FEF7; --text-dark: #333; --danger: #E57373; --danger-hover: #EF5350;
|
| 592 |
-
}
|
| 593 |
{% endif %}
|
| 594 |
|
| 595 |
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
@@ -1291,33 +1319,27 @@ CHAT_TEMPLATE = '''
|
|
| 1291 |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/10.2.0/swiper-bundle.min.css">
|
| 1292 |
<style>
|
| 1293 |
{% if settings.color_scheme == 'forest' %}
|
| 1294 |
-
:root {
|
| 1295 |
-
--bg-dark: #2F4F4F; --bg-medium: #556B2F; --accent: #90EE90; --accent-hover: #98FB98; --text-light: #F5F5DC; --text-dark: #333; --danger: #CD5C5C; --danger-hover: #F08080; --chat-bg: #F5F5DC;
|
| 1296 |
-
}
|
| 1297 |
{% elif settings.color_scheme == 'ocean' %}
|
| 1298 |
-
:root {
|
| 1299 |
-
--bg-dark: #000080; --bg-medium: #1E90FF; --accent: #87CEEB; --accent-hover: #ADD8E6; --text-light: #F0F8FF; --text-dark: #333; --danger: #FF6347; --danger-hover: #FF4500; --chat-bg: #F0F8FF;
|
| 1300 |
-
}
|
| 1301 |
{% elif settings.color_scheme == 'sunset' %}
|
| 1302 |
-
:root {
|
| 1303 |
-
--bg-dark: #8B4513; --bg-medium: #D2691E; --accent: #FFA500; --accent-hover: #FFD700; --text-light: #FFF8DC; --text-dark: #333; --danger: #DC143C; --danger-hover: #FF0000; --chat-bg: #FFF8DC;
|
| 1304 |
-
}
|
| 1305 |
{% elif settings.color_scheme == 'lavender' %}
|
| 1306 |
-
:root {
|
| 1307 |
-
--bg-dark: #483D8B; --bg-medium: #9370DB; --accent: #E6E6FA; --accent-hover: #D8BFD8; --text-light: #F0F8FF; --text-dark: #333; --danger: #DB7093; --danger-hover: #FFC0CB; --chat-bg: #F8F8FF;
|
| 1308 |
-
}
|
| 1309 |
{% elif settings.color_scheme == 'vintage' %}
|
| 1310 |
-
:root {
|
| 1311 |
-
--bg-dark: #5D4037; --bg-medium: #A1887F; --accent: #D7CCC8; --accent-hover: #EFEBE9; --text-light: #F5F5F5; --text-dark: #3E2723; --danger: #BF360C; --danger-hover: #F4511E; --chat-bg: #EFEBE9;
|
| 1312 |
-
}
|
| 1313 |
{% elif settings.color_scheme == 'dark' %}
|
| 1314 |
-
:root {
|
| 1315 |
-
|
| 1316 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1317 |
{% else %}
|
| 1318 |
-
:root {
|
| 1319 |
-
--bg-dark: #003C43; --bg-medium: #135D66; --accent: #48D1CC; --accent-hover: #77E4D8; --text-light: #E3FEF7; --text-dark: #333; --danger: #E57373; --danger-hover: #EF5350; --chat-bg: #f0f2f5;
|
| 1320 |
-
}
|
| 1321 |
{% endif %}
|
| 1322 |
|
| 1323 |
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
@@ -2631,7 +2653,7 @@ ADMIN_TEMPLATE = '''
|
|
| 2631 |
|
| 2632 |
@app.route('/')
|
| 2633 |
def index():
|
| 2634 |
-
return
|
| 2635 |
|
| 2636 |
@app.route('/admhosto', methods=['GET'])
|
| 2637 |
def admhosto():
|
|
|
|
|
|
|
| 1 |
import os
|
| 2 |
import io
|
| 3 |
import base64
|
|
|
|
| 54 |
'sunset': 'Закатный оранжевый',
|
| 55 |
'lavender': 'Лавандовый',
|
| 56 |
'vintage': 'Винтажный',
|
| 57 |
+
'dark': 'Полночь (тёмная)',
|
| 58 |
+
'mint': 'Свежая мята',
|
| 59 |
+
'rose_gold': 'Розовое золото',
|
| 60 |
+
'graphite': 'Графитовый',
|
| 61 |
+
'cosmic': 'Космическая ночь'
|
| 62 |
}
|
| 63 |
|
| 64 |
|
|
|
|
| 288 |
final_prompt = f"{base_prompt}{lang_suffix}"
|
| 289 |
|
| 290 |
try:
|
| 291 |
+
model = genai.GenerativeModel('gemini-1.5-flash')
|
| 292 |
|
| 293 |
response = model.generate_content([final_prompt, image])
|
| 294 |
|
|
|
|
| 307 |
elif " Billing account not found" in str(e):
|
| 308 |
raise ValueError("Проблема с биллингом аккаунта Google Cloud. Проверьте ваш аккаунт.")
|
| 309 |
elif "Could not find model" in str(e):
|
| 310 |
+
raise ValueError(f"Модель 'gemini-1.5-flash' не найдена или недоступна.")
|
| 311 |
elif "resource has been exhausted" in str(e).lower():
|
| 312 |
raise ValueError("Квота запросов исчерпана. Попробуйте позже.")
|
| 313 |
elif "content has been blocked" in str(e).lower():
|
|
|
|
| 377 |
response = None
|
| 378 |
|
| 379 |
try:
|
| 380 |
+
model = genai.GenerativeModel('gemini-1.5-flash')
|
| 381 |
+
|
| 382 |
+
model_chat_history_for_gemini = []
|
| 383 |
|
|
|
|
|
|
|
|
|
|
| 384 |
for entry in chat_history_from_client:
|
| 385 |
gemini_role = 'model' if entry['role'] == 'ai' else 'user'
|
| 386 |
model_chat_history_for_gemini.append({
|
| 387 |
'role': gemini_role,
|
| 388 |
'parts': [{'text': entry['text']}]
|
| 389 |
})
|
| 390 |
+
|
| 391 |
+
full_prompt = [
|
| 392 |
+
{'role': 'user', 'parts': [{'text': system_instruction_content}]},
|
| 393 |
+
*model_chat_history_for_gemini,
|
| 394 |
+
{'role': 'user', 'parts': [{'text': message}]}
|
| 395 |
+
]
|
| 396 |
+
|
| 397 |
+
response = model.generate_content(full_prompt, generation_config={'max_output_tokens': 1000})
|
| 398 |
|
| 399 |
if hasattr(response, 'text'):
|
| 400 |
generated_text = response.text
|
|
|
|
| 424 |
else:
|
| 425 |
return f"Извините, произошла ошибка: {e}"
|
| 426 |
|
| 427 |
+
LANDING_TEMPLATE = '''
|
| 428 |
+
<!DOCTYPE html>
|
| 429 |
+
<html lang="ru">
|
| 430 |
+
<head>
|
| 431 |
+
<meta charset="UTF-8">
|
| 432 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 433 |
+
<title>AI Agent</title>
|
| 434 |
+
<style>
|
| 435 |
+
body, html {
|
| 436 |
+
margin: 0;
|
| 437 |
+
padding: 0;
|
| 438 |
+
overflow: hidden;
|
| 439 |
+
height: 100%;
|
| 440 |
+
width: 100%;
|
| 441 |
+
}
|
| 442 |
+
iframe {
|
| 443 |
+
border: none;
|
| 444 |
+
width: 100%;
|
| 445 |
+
height: 100%;
|
| 446 |
+
}
|
| 447 |
+
</style>
|
| 448 |
+
</head>
|
| 449 |
+
<body>
|
| 450 |
+
<iframe src="https://v0-ai-agent-landing-page-smoky-six.vercel.app/"></iframe>
|
| 451 |
+
</body>
|
| 452 |
+
</html>
|
| 453 |
+
'''
|
| 454 |
+
|
| 455 |
ADMHOSTO_TEMPLATE = '''
|
| 456 |
<!DOCTYPE html>
|
| 457 |
<html lang="ru">
|
|
|
|
| 597 |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/10.2.0/swiper-bundle.min.css">
|
| 598 |
<style>
|
| 599 |
{% if settings.color_scheme == 'forest' %}
|
| 600 |
+
:root { --bg-dark: #2F4F4F; --bg-medium: #556B2F; --accent: #90EE90; --accent-hover: #98FB98; --text-light: #F5F5DC; --text-dark: #333; --danger: #CD5C5C; --danger-hover: #F08080; }
|
|
|
|
|
|
|
| 601 |
{% elif settings.color_scheme == 'ocean' %}
|
| 602 |
+
:root { --bg-dark: #000080; --bg-medium: #1E90FF; --accent: #87CEEB; --accent-hover: #ADD8E6; --text-light: #F0F8FF; --text-dark: #333; --danger: #FF6347; --danger-hover: #FF4500; }
|
|
|
|
|
|
|
| 603 |
{% elif settings.color_scheme == 'sunset' %}
|
| 604 |
+
:root { --bg-dark: #8B4513; --bg-medium: #D2691E; --accent: #FFA500; --accent-hover: #FFD700; --text-light: #FFF8DC; --text-dark: #333; --danger: #DC143C; --danger-hover: #FF0000; }
|
|
|
|
|
|
|
| 605 |
{% elif settings.color_scheme == 'lavender' %}
|
| 606 |
+
:root { --bg-dark: #483D8B; --bg-medium: #9370DB; --accent: #E6E6FA; --accent-hover: #D8BFD8; --text-light: #F0F8FF; --text-dark: #333; --danger: #DB7093; --danger-hover: #FFC0CB; }
|
|
|
|
|
|
|
| 607 |
{% elif settings.color_scheme == 'vintage' %}
|
| 608 |
+
:root { --bg-dark: #5D4037; --bg-medium: #A1887F; --accent: #D7CCC8; --accent-hover: #EFEBE9; --text-light: #F5F5F5; --text-dark: #3E2723; --danger: #BF360C; --danger-hover: #F4511E; }
|
|
|
|
|
|
|
| 609 |
{% elif settings.color_scheme == 'dark' %}
|
| 610 |
+
:root { --bg-dark: #121212; --bg-medium: #1E1E1E; --accent: #BB86FC; --accent-hover: #A764FC; --text-light: #E1E1E1; --text-dark: #FFFFFF; --danger: #CF6679; --danger-hover: #D98899; }
|
| 611 |
+
{% elif settings.color_scheme == 'mint' %}
|
| 612 |
+
:root { --bg-dark: #006A4E; --bg-medium: #50C878; --accent: #98FF98; --accent-hover: #B9FFB9; --text-light: #F0FFF0; --text-dark: #003322; --danger: #E34234; --danger-hover: #FF5733; }
|
| 613 |
+
{% elif settings.color_scheme == 'rose_gold' %}
|
| 614 |
+
:root { --bg-dark: #B76E79; --bg-medium: #D9A7A0; --accent: #FADCD9; --accent-hover: #FDEFEA; --text-light: #FFF8F7; --text-dark: #5C373C; --danger: #C3447A; --danger-hover: #D96291; }
|
| 615 |
+
{% elif settings.color_scheme == 'graphite' %}
|
| 616 |
+
:root { --bg-dark: #2C3E50; --bg-medium: #5D6D7E; --accent: #BDC3C7; --accent-hover: #D6DBDF; --text-light: #ECF0F1; --text-dark: #212F3D; --danger: #E74C3C; --danger-hover: #EC7063; }
|
| 617 |
+
{% elif settings.color_scheme == 'cosmic' %}
|
| 618 |
+
:root { --bg-dark: #0F0C29; --bg-medium: #302B63; --accent: #A770EF; --accent-hover: #D1A7FF; --text-light: #F3EFFF; --text-dark: #FFFFFF; --danger: #F83D5C; --danger-hover: #FA6079; }
|
| 619 |
{% else %}
|
| 620 |
+
:root { --bg-dark: #003C43; --bg-medium: #135D66; --accent: #48D1CC; --accent-hover: #77E4D8; --text-light: #E3FEF7; --text-dark: #333; --danger: #E57373; --danger-hover: #EF5350; }
|
|
|
|
|
|
|
| 621 |
{% endif %}
|
| 622 |
|
| 623 |
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
|
|
| 1319 |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/10.2.0/swiper-bundle.min.css">
|
| 1320 |
<style>
|
| 1321 |
{% if settings.color_scheme == 'forest' %}
|
| 1322 |
+
:root { --bg-dark: #2F4F4F; --bg-medium: #556B2F; --accent: #90EE90; --accent-hover: #98FB98; --text-light: #F5F5DC; --text-dark: #333; --danger: #CD5C5C; --danger-hover: #F08080; --chat-bg: #F5F5DC; }
|
|
|
|
|
|
|
| 1323 |
{% elif settings.color_scheme == 'ocean' %}
|
| 1324 |
+
:root { --bg-dark: #000080; --bg-medium: #1E90FF; --accent: #87CEEB; --accent-hover: #ADD8E6; --text-light: #F0F8FF; --text-dark: #333; --danger: #FF6347; --danger-hover: #FF4500; --chat-bg: #F0F8FF; }
|
|
|
|
|
|
|
| 1325 |
{% elif settings.color_scheme == 'sunset' %}
|
| 1326 |
+
:root { --bg-dark: #8B4513; --bg-medium: #D2691E; --accent: #FFA500; --accent-hover: #FFD700; --text-light: #FFF8DC; --text-dark: #333; --danger: #DC143C; --danger-hover: #FF0000; --chat-bg: #FFF8DC; }
|
|
|
|
|
|
|
| 1327 |
{% elif settings.color_scheme == 'lavender' %}
|
| 1328 |
+
:root { --bg-dark: #483D8B; --bg-medium: #9370DB; --accent: #E6E6FA; --accent-hover: #D8BFD8; --text-light: #F0F8FF; --text-dark: #333; --danger: #DB7093; --danger-hover: #FFC0CB; --chat-bg: #F8F8FF; }
|
|
|
|
|
|
|
| 1329 |
{% elif settings.color_scheme == 'vintage' %}
|
| 1330 |
+
:root { --bg-dark: #5D4037; --bg-medium: #A1887F; --accent: #D7CCC8; --accent-hover: #EFEBE9; --text-light: #F5F5F5; --text-dark: #3E2723; --danger: #BF360C; --danger-hover: #F4511E; --chat-bg: #EFEBE9; }
|
|
|
|
|
|
|
| 1331 |
{% elif settings.color_scheme == 'dark' %}
|
| 1332 |
+
:root { --bg-dark: #1F1F1F; --bg-medium: #333333; --accent: #BB86FC; --accent-hover: #A764FC; --text-light: #E1E1E1; --text-dark: #FFFFFF; --danger: #CF6679; --danger-hover: #D98899; --chat-bg: #121212; }
|
| 1333 |
+
{% elif settings.color_scheme == 'mint' %}
|
| 1334 |
+
:root { --bg-dark: #006A4E; --bg-medium: #50C878; --accent: #98FF98; --accent-hover: #B9FFB9; --text-light: #F0FFF0; --text-dark: #003322; --danger: #E34234; --danger-hover: #FF5733; --chat-bg: #F0FFF0; }
|
| 1335 |
+
{% elif settings.color_scheme == 'rose_gold' %}
|
| 1336 |
+
:root { --bg-dark: #B76E79; --bg-medium: #D9A7A0; --accent: #FADCD9; --accent-hover: #FDEFEA; --text-light: #FFF8F7; --text-dark: #5C373C; --danger: #C3447A; --danger-hover: #D96291; --chat-bg: #FFF8F7; }
|
| 1337 |
+
{% elif settings.color_scheme == 'graphite' %}
|
| 1338 |
+
:root { --bg-dark: #2C3E50; --bg-medium: #5D6D7E; --accent: #BDC3C7; --accent-hover: #D6DBDF; --text-light: #ECF0F1; --text-dark: #212F3D; --danger: #E74C3C; --danger-hover: #EC7063; --chat-bg: #ECF0F1; }
|
| 1339 |
+
{% elif settings.color_scheme == 'cosmic' %}
|
| 1340 |
+
:root { --bg-dark: #0F0C29; --bg-medium: #302B63; --accent: #A770EF; --accent-hover: #D1A7FF; --text-light: #F3EFFF; --text-dark: #FFFFFF; --danger: #F83D5C; --danger-hover: #FA6079; --chat-bg: #1a163a; }
|
| 1341 |
{% else %}
|
| 1342 |
+
:root { --bg-dark: #003C43; --bg-medium: #135D66; --accent: #48D1CC; --accent-hover: #77E4D8; --text-light: #E3FEF7; --text-dark: #333; --danger: #E57373; --danger-hover: #EF5350; --chat-bg: #f0f2f5; }
|
|
|
|
|
|
|
| 1343 |
{% endif %}
|
| 1344 |
|
| 1345 |
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
|
|
| 2653 |
|
| 2654 |
@app.route('/')
|
| 2655 |
def index():
|
| 2656 |
+
return render_template_string(LANDING_TEMPLATE)
|
| 2657 |
|
| 2658 |
@app.route('/admhosto', methods=['GET'])
|
| 2659 |
def admhosto():
|