Rooni commited on
Commit
374d0b6
·
1 Parent(s): 98885ab

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +118 -0
app.py ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import requests
3
+ import os
4
+ import base64
5
+ from PIL import Image
6
+ import io
7
+ import random
8
+
9
+ # Функция для кодирования изображения в base64
10
+ def encode_image_to_base64(image):
11
+ buffered = io.BytesIO()
12
+ image.save(buffered, format="JPEG")
13
+ img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
14
+ return img_str
15
+
16
+ emojis = ['😊', '🤗', '🥺', '😅', '🤭', '😔', '✨', '😜', '🙏']
17
+
18
+ # Функция для отправки запроса в OpenAI с изображением и получения ответа
19
+ def ask_openai_with_image(instruction, image):
20
+ if not instruction and not image:
21
+ emj = random.choice(emojis)
22
+ raise gr.Error(f"{emj} Заполни пожалуйста хотя бы 1 поле")
23
+ return None
24
+ if image:
25
+ # Кодируем загруженное изображение в base64
26
+ base64_image = encode_image_to_base64(image)
27
+
28
+ # Создаем данные для запроса с закодированным изображением
29
+ payload = {
30
+ "model": "gpt-4-vision-preview",
31
+ "messages": [
32
+ {
33
+ "role": "user",
34
+ "content": [
35
+ {
36
+ "type": "text",
37
+ "text": start,
38
+ },
39
+ {
40
+ "type": "text",
41
+ "text": instruction,
42
+ },
43
+ {
44
+ "type": "image_url",
45
+ "image_url": {
46
+ "url": f"data:image/jpeg;base64,{base64_image}",
47
+ "detail": "high",
48
+ },
49
+ },
50
+ ],
51
+ }
52
+ ],
53
+ "max_tokens": 4095,
54
+ }
55
+ else:
56
+ # Создаем данные для запроса без изображения
57
+ payload = {
58
+ "model": "gpt-4-vision-preview",
59
+ "messages": [
60
+ {
61
+ "role": "user",
62
+ "content": start,
63
+ },
64
+ {
65
+ "role": "user",
66
+ "content": instruction,
67
+ }
68
+ ],
69
+ "max_tokens": 4095,
70
+ }
71
+
72
+ # API ключ для OpenAI
73
+ api_key = os.getenv("API_KEY")
74
+
75
+ # Заголовки для запроса
76
+ headers = {
77
+ 'Authorization': f'Bearer {api_key}',
78
+ 'Content-Type': 'application/json',
79
+ }
80
+
81
+ # URL для запроса к API OpenAI
82
+ url = "https://api.openai.com/v1/chat/completions"
83
+
84
+ # Отправляем запрос в OpenAI
85
+ response = requests.post(url, headers=headers, json=payload)
86
+
87
+ # Проверяем ответ и возвращаем результат
88
+ if response.status_code == 200:
89
+ response_json = response.json()
90
+ try:
91
+ # Пытаемся извлечь текст из ответа
92
+ otvet = response_json["choices"][0]["message"]["content"]
93
+ return otvet
94
+ except Exception as e:
95
+ # Если есть ошибка в структуре JSON, выводим ее
96
+ return f"Error processing the image response: {e}"
97
+ else:
98
+ # Если произошла ошибка, возвращаем сообщение об ошибке
99
+ return f"Error: {response.status_code} - {response.text}"
100
+
101
+ # Создаем интерфейс с помощью Gradio
102
+ with gr.Blocks(theme='YTheme/KidsShool') as demo:
103
+ with gr.Row():
104
+ with gr.Column():
105
+ instruction_input = gr.Textbox(label="Сообщение", lines=3, placeholder="Привет!) ...")
106
+ image_input = gr.Image(label="Загрузить изображение", type="pil", tool="select")
107
+ submit_button = gr.Button("Отправить", variant='primary')
108
+ with gr.Column():
109
+ output_markdown = gr.Markdown()
110
+
111
+ # Соединяем кнопку и функцию
112
+ submit_button.click(
113
+ fn=ask_openai_with_image,
114
+ inputs=[instruction_input, image_input],
115
+ outputs=[output_markdown]
116
+ )
117
+
118
+ demo.launch()