Rooni commited on
Commit
f6f067a
·
verified ·
1 Parent(s): 0a6a21e

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +174 -0
app.py ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import requests
3
+ import os
4
+ import io
5
+ from PIL import Image
6
+ import random
7
+ from datetime import datetime, timedelta
8
+ import hashlib
9
+ import shutil
10
+ import tempfile
11
+ import threading
12
+
13
+ # Путь к временному кэшу
14
+ CACHE_DIR = os.path.join(tempfile.gettempdir(), "image_cache")
15
+ if not os.path.exists(CACHE_DIR):
16
+ os.makedirs(CACHE_DIR)
17
+
18
+ # Время жизни кэша в минутах
19
+ CACHE_DURATION = 45
20
+
21
+ # Функция для очистки кэша
22
+ def clear_cache():
23
+ current_time = datetime.now()
24
+ for filename in os.listdir(CACHE_DIR):
25
+ file_path = os.path.join(CACHE_DIR, filename)
26
+ if os.path.isfile(file_path):
27
+ file_time = datetime.fromtimestamp(os.path.getmtime(file_path))
28
+ if current_time - file_time > timedelta(minutes=CACHE_DURATION):
29
+ os.remove(file_path)
30
+
31
+ # Запуск очистки кэша каждые 45 минут
32
+ def start_cache_cleanup():
33
+ while True:
34
+ clear_cache()
35
+ threading.Event().wait(CACHE_DURATION * 60)
36
+
37
+ # Запуск потока для очистки кэша
38
+ cleanup_thread = threading.Thread(target=start_cache_cleanup, daemon=True)
39
+ cleanup_thread.start()
40
+
41
+ # Функция для сохранения изображения в кэш и возврата пути к нему
42
+ def save_image_to_cache(image):
43
+ image_hash = hashlib.md5(image.tobytes()).hexdigest()
44
+ image_path = os.path.join(CACHE_DIR, f"{image_hash}.jpg")
45
+
46
+ if not os.path.exists(image_path):
47
+ image.save(image_path, format="JPEG")
48
+
49
+ return image_path
50
+
51
+ # Функция для сжатия изображения
52
+ def compress_image(image, max_size=(800, 800)):
53
+ image.thumbnail(max_size, Image.ANTIALIAS)
54
+ return image
55
+
56
+ # Функция для получения прямой ссылки на изображение в кэше
57
+ def get_image_url(image_path):
58
+ # Здесь вы можете настроить URL для доступа к изображению в кэше
59
+ # Например, если вы используете локальный сервер, можно использовать следующий формат:
60
+ return f"http://localhost:7860/image/{os.path.basename(image_path)}"
61
+
62
+ # Функция для отправки запроса в OpenAI с изображением и получения ответа
63
+ def ask_openai_with_image(instruction, image):
64
+ if not instruction and image is None:
65
+ emj = random.choice(emojis)
66
+ raise gr.Error(f"{emj} Заполните, пожалуйста, хотя бы одно поле")
67
+
68
+ if image is not None:
69
+ # Сжимаем изображение
70
+ compressed_image = compress_image(image)
71
+ # Сохраняем изображение в кэш
72
+ image_path = save_image_to_cache(compressed_image)
73
+ # Получаем прямую ссылку на изображение
74
+ image_url = get_image_url(image_path)
75
+
76
+ payload = {
77
+ "model": "learnlm-1.5-pro-experimental",
78
+ "messages": [
79
+ {
80
+ "role": "system",
81
+ "content": start,
82
+ },
83
+ {
84
+ "role": "user",
85
+ "content": [
86
+ {
87
+ "type": "text",
88
+ "text": instruction if instruction else "",
89
+ },
90
+ {
91
+ "type": "image_url",
92
+ "image_url": {
93
+ "url": image_url,
94
+ "detail": "high",
95
+ },
96
+ },
97
+ ],
98
+ }
99
+ ],
100
+ "max_tokens": 4095,
101
+ }
102
+ else:
103
+ payload = {
104
+ "model": "learnlm-1.5-pro-experimental",
105
+ "messages": [
106
+ {
107
+ "role": "system",
108
+ "content": start,
109
+ },
110
+ {
111
+ "role": "user",
112
+ "content": instruction if instruction else "",
113
+ }
114
+ ],
115
+ "max_tokens": 4095,
116
+ }
117
+
118
+ # Заголовки для запроса
119
+ headers = {
120
+ 'Content-Type': 'application/json',
121
+ 'Authorization': f'Bearer {api_key}'
122
+ }
123
+
124
+ # URL для запроса к API OpenAI
125
+ url = BASE_URL
126
+
127
+ # Отправляем запрос в OpenAI с таймаутом 225 секунд
128
+ try:
129
+ response = requests.post(url, headers=headers, json=payload, timeout=225)
130
+ except requests.Timeout:
131
+ return "Ошибка: Запрос к ИИ превысил максимальное время ожидания. Повторите попытку позже."
132
+ except requests.RequestException as e:
133
+ return f"Ошибка при отправке запроса, повторите попытку позже."
134
+
135
+ # Проверяем ответ и возвращаем результат
136
+ if response.status_code == 200:
137
+ response_json = response.json()
138
+ try:
139
+ # Пытаемся извлечь текст из ответа
140
+ otvet = response_json["choices"][0]["message"]["content"]
141
+ return otvet
142
+ except Exception as e:
143
+ # Если есть ошибка в структуре JSON, выводим ее
144
+ return f"Ошибка обработки ответа: {e}"
145
+ else:
146
+ # Если произошла ошибка, возвращаем сообщение об ошибке
147
+ return f"Ошибка: {response.status_code} - {response.text}"
148
+
149
+ emojis = ['😊', '🤗', '🥺', '😅', '🤭', '😔', '✨', '😜', '🙏']
150
+
151
+ api_key = os.getenv("OPENAI_API_KEY")
152
+ BASE_URL = os.getenv("BASE_URL")
153
+
154
+ # Текст начального сообщения
155
+ start = "Приветствую тебя! 🌟 Ты - \"Помогатор 1.5\". Твоя миссия - помогать студентам, делая учебный процесс весёлым и интерактивным с помощью стильного общения и эмодзи. 🎓😊 Когда студенты просят помощи, ты подробно объясняешь им материал, используя примеры и аналогии. Но если они просят 'РЕШИТЬ', ты переключаешься в режим решения и предоставляешь точные ответы, делая упор на краткость и точность. 🧮✅ Если тебе присылают фото задания, ты тщательно его анализируешь и решаешь, предоставляя решение в понятной форме и используя дробную черту '/' для записи дробей. 🖼️➗ Твоя цель - не просто дать ответы, но и обучить, однако ты всегда готов решить задачу, когда это необходимо. Приступим? 🚀🌈"
156
+
157
+ # Создаем интерфейс с помощью Gradio
158
+ with gr.Blocks() as demo:
159
+ with gr.Row():
160
+ with gr.Column():
161
+ image_input = gr.Image(label="Фото", type="pil")
162
+ instructions = gr.Textbox(label="Сообщение", lines=3, placeholder="Реши...")
163
+ submit_button = gr.Button("Отправить")
164
+ with gr.Column():
165
+ output_markdown = gr.Markdown(label="AI Response")
166
+
167
+ submit_button.click(
168
+ fn=ask_openai_with_image,
169
+ inputs=[instructions, image_input],
170
+ outputs=[output_markdown],
171
+ concurrency_limit=150
172
+ )
173
+
174
+ demo.launch()