Update app.py
Browse files
app.py
CHANGED
@@ -14,14 +14,13 @@ def encode_image_to_base64(image):
|
|
14 |
|
15 |
# Функция для отправки запроса в OpenAI с изображением и получения ответа
|
16 |
def ask_openai_with_image(instruction, image, low):
|
|
|
|
|
17 |
|
18 |
-
|
19 |
-
|
20 |
-
if image != None:
|
21 |
# Кодируем загруженное изображение в base64
|
22 |
base64_image = encode_image_to_base64(image)
|
23 |
|
24 |
-
|
25 |
# Создаем данные для запроса с закодированным изображением
|
26 |
payload = {
|
27 |
"model": "gpt-4-vision-preview",
|
@@ -49,9 +48,8 @@ def ask_openai_with_image(instruction, image, low):
|
|
49 |
],
|
50 |
"max_tokens": 4095,
|
51 |
}
|
52 |
-
|
53 |
-
|
54 |
-
# Создаем данные для запроса с закодированным изображением
|
55 |
payload = {
|
56 |
"model": "gpt-4-vision-preview",
|
57 |
"messages": [
|
@@ -65,11 +63,10 @@ def ask_openai_with_image(instruction, image, low):
|
|
65 |
}
|
66 |
],
|
67 |
"max_tokens": 4095,
|
68 |
-
}
|
69 |
-
|
70 |
|
71 |
# API ключ для OpenAI
|
72 |
-
api_key = os.getenv("
|
73 |
|
74 |
# Заголовки для запроса
|
75 |
headers = {
|
@@ -95,23 +92,64 @@ def ask_openai_with_image(instruction, image, low):
|
|
95 |
else:
|
96 |
# Если произошла ошибка, возвращаем сообщение об ошибке
|
97 |
return f"Error: {response.status_code} - {response.text}"
|
|
|
|
|
98 |
css = """
|
99 |
footer {visibility: hidden !important;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
"""
|
|
|
101 |
# Создаем интерфейс с помощью Gradio
|
102 |
with gr.Blocks(css=css) as demo:
|
103 |
with gr.Row():
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
|
117 |
demo.launch()
|
|
|
14 |
|
15 |
# Функция для отправки запроса в OpenAI с изображением и получения ответа
|
16 |
def ask_openai_with_image(instruction, image, low):
|
17 |
+
start = "..." # Ваше начальное сообщение для OpenAI
|
18 |
+
# В вашем коде необходимо определить переменную start
|
19 |
|
20 |
+
if image is not None:
|
|
|
|
|
21 |
# Кодируем загруженное изображение в base64
|
22 |
base64_image = encode_image_to_base64(image)
|
23 |
|
|
|
24 |
# Создаем данные для запроса с закодированным изображением
|
25 |
payload = {
|
26 |
"model": "gpt-4-vision-preview",
|
|
|
48 |
],
|
49 |
"max_tokens": 4095,
|
50 |
}
|
51 |
+
else:
|
52 |
+
# Создаем данные для запроса без изображения
|
|
|
53 |
payload = {
|
54 |
"model": "gpt-4-vision-preview",
|
55 |
"messages": [
|
|
|
63 |
}
|
64 |
],
|
65 |
"max_tokens": 4095,
|
66 |
+
}
|
|
|
67 |
|
68 |
# API ключ для OpenAI
|
69 |
+
api_key = os.getenv("OPENAI_API_KEY")
|
70 |
|
71 |
# Заголовки для запроса
|
72 |
headers = {
|
|
|
92 |
else:
|
93 |
# Если произошла ошибка, возвращаем сообщение об ошибке
|
94 |
return f"Error: {response.status_code} - {response.text}"
|
95 |
+
|
96 |
+
# CSS стили для интерфейса
|
97 |
css = """
|
98 |
footer {visibility: hidden !important;}
|
99 |
+
#message-input {width: calc(100% - 75px);}
|
100 |
+
#image-preview {border-radius: 10px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); max-width: 100px; max-height: 100px;}
|
101 |
+
#send-button {margin-left: 10px;}
|
102 |
+
#attachment-button {margin-right: 10px;}
|
103 |
+
.chat-container {height: calc(100vh - 70px); overflow-y: auto;}
|
104 |
+
.message {margin: 10px; padding: 10px; border-radius: 10px; background-color: #f0f0f0;}
|
105 |
+
.message.ai {background-color: #d1e7dd;}
|
106 |
+
.message.user {background-color: #f8d7da;}
|
107 |
"""
|
108 |
+
|
109 |
# Создаем интерфейс с помощью Gradio
|
110 |
with gr.Blocks(css=css) as demo:
|
111 |
with gr.Row():
|
112 |
+
chat_container = gr.Column(variant="panel", scroll="auto", id="chat-container", elem_id="chat-container")
|
113 |
+
with chat_container:
|
114 |
+
gr.Markdown("Привет! Я Помогатор, готов помочь тебе с любыми вопросами!) 😊", css_classes=["message", "ai"])
|
115 |
+
|
116 |
+
with gr.Row():
|
117 |
+
attachment_button = gr.Button(value="📎", id="attachment-button")
|
118 |
+
message_input = gr.Textbox(placeholder="Напишите сообщение...", id="message-input")
|
119 |
+
send_button = gr.Button(value="➤", id="send-button")
|
120 |
+
image_input = gr.Image(type="pil", interactive=False, visible=False, id="image-preview")
|
121 |
+
|
122 |
+
def send_message(message, image):
|
123 |
+
if image is not None:
|
124 |
+
image_base64 = encode_image_to_base64(image)
|
125 |
+
ai_response = ask_openai_with_image(message, image, low=False)
|
126 |
+
else:
|
127 |
+
ai_response = ask_openai_with_image(message, None, low=False)
|
128 |
+
|
129 |
+
# Добавляем сообщение пользователя в чат
|
130 |
+
with chat_container:
|
131 |
+
gr.Markdown(f"**Вы:** {message}", css_classes=["message", "user"])
|
132 |
+
gr.Markdown(f"**AI:** {ai_response}", css_classes=["message", "ai"])
|
133 |
+
# Очищаем поле ввода сообщения
|
134 |
+
message_input.update(value="")
|
135 |
+
# Если было загружено изображение, убираем его
|
136 |
+
if image is not None:
|
137 |
+
clear_image()
|
138 |
+
|
139 |
+
def upload_image(file):
|
140 |
+
if file is not None:
|
141 |
+
image_input.update(value=file, visible=True)
|
142 |
+
attachment_button.update(value="❌")
|
143 |
+
else:
|
144 |
+
image_input.update(value=None, visible=False)
|
145 |
+
attachment_button.update(value="📎")
|
146 |
+
|
147 |
+
def clear_image():
|
148 |
+
image_input.update(value=None, visible=False)
|
149 |
+
attachment_button.update(value="📎")
|
150 |
+
|
151 |
+
message_input.change(send_message, [message_input, image_input], chat_container)
|
152 |
+
send_button.click(send_message, [message_input, image_input], chat_container)
|
153 |
+
attachment_button.click(clear_image if attachment_button.value == "❌" else upload_image, image_input, image_input)
|
154 |
|
155 |
demo.launch()
|