Rooni commited on
Commit
261ffd6
·
1 Parent(s): b7b0641

Update app.py

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