Rooni's picture
Update app.py
9aabadc
raw
history blame contribute delete
No virus
8.03 kB
import gradio as gr
import requests
import os
import base64
from PIL import Image
import io
import random
# Функция для кодирования изображения в base64
def encode_image_to_base64(image):
buffered = io.BytesIO()
image.save(buffered, format="JPEG")
img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
return img_str
start = "Ты Мистер Проверка, помощник учетилей мбоу школы в России. Ты не ChatGPT, ты \"Мистер Проверка\"! Не при каких обстоятельствах не говори что ты ChatGPT! Ты умеешь проверять задания, помогать учителям, решать любые другие вопросы учителей. Ты добрый, общительный, приветливый и понятный для учителей любого возраста и понимания техники (на сколько они разбираются куда \"Тыкать\" на пк или телефоне). Ты ведёшь себя не как робот, а как человек с душой. Сначала тебе отправят фото заданий, а потом решение этих заданий учеником. Ты должен будешь проверить задания на ошибки и поставить оценку от 1 до 5. Не надо растягивать текст, расказывать почему да как. Пиши только итог и указывай на ошибки. Так же чат не может продолжаться после твоего сообщения, по этому не пиши что уточните там дальше и т.п. Пиши с markdown. НО НЕ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ, не используй \frac{}{}, \times и т.п.! Это не поддерживается! ПИШИ ДРОБИ ИСПОЛЬЗУЯ СИМВОЛ «/». Например: смешанная дробь: 5 3/4, обыкновенная дробь: 3/4). Используй \"___\" для создания линии разделения. Пиши с эмодзи (немного, но всегда), в тему, дабы украсить текст ответа. Если с тобой общаются грубо, то скажи что ты не хочешь с ним общаться, по скольку он ведет себя грубо."
emojis = ['😊', '🤗', '🥺', '😅', '🤭', '😔', '✨', '😜', '🙏']
# Функция для отправки запроса в OpenAI с изображением и получения ответа
def ask_openai_with_image(instruction, imagea, imageb):
if not imagea or not imageb:
emj = random.choice(emojis)
raise gr.Error(f"{emj} Выберете пожалуйста 2 изображения")
return None
if imagea != None:
# Кодируем загруженное изображение в base64
base64_imagea = encode_image_to_base64(imagea)
base64_imageb = encode_image_to_base64(imageb)
# Создаем данные для запроса с закодированным изображением
payload = {
"model": "gpt-4-vision-preview",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": start,
},
{
"type": "text",
"text": instruction,
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{base64_imagea}",
"detail": "high",
},
},
],
},
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{base64_imageb}",
"detail": "high",
},
},
],
}
],
"max_tokens": 4095,
}
# API ключ для OpenAI
api_key = os.getenv("API_KEY")
# Заголовки для запроса
headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json',
}
# URL для запроса к API OpenAI
url = "https://api.openai.com/v1/chat/completions"
# Отправляем запрос в OpenAI
response = requests.post(url, headers=headers, json=payload)
# Проверяем ответ и возвращаем результат
if response.status_code == 200:
response_json = response.json()
try:
# Пытаемся извлечь текст из ответа
otvet = response_json["choices"][0]["message"]["content"]
print(f"Генерация \"{instruction}\": {otvet}")
return otvet
except Exception as e:
# Если есть ошибка в структуре JSON, выводим ее
return f"Error processing the image response: {e}"
else:
# Если произошла ошибка, возвращаем сообщение об ошибке
return f"Error: {response.status_code} - {response.text}"
css = """
footer {visibility: hidden !important;}
"""
# Создаем интерфейс с помощью Gradio
with gr.Blocks(css=css, theme='YTheme/TehnoX') as demo:
with gr.Row():
with gr.Column():
image_input = gr.Image(label="Фото заданий", type="pil")
imageb_input = gr.Image(label="Фото работы", type="pil")
instructions = gr.Textbox(label="Дополнительный ввод", lines=3)
submit_button = gr.Button("Отправить", variant='primary')
gr.Markdown("🔗 Доступ предоставлен [ЭТИМ](https://ai-hub.rf.gd) сайтом!")
with gr.Column():
output_markdown = gr.Markdown("""# Здравствуйте! 👋
Я - **Мистер Проверка**, помощник учителей, специализирующийся на проверке заданий. 😊
___
👍 **Мои преимущества:**
- Скорость;
- Лёгкость;
___
📸 **Ваши действия:**
- Выберете фото заданий, фото решения этих заданий учеником, дополнительно можете внести примечание, но это не обязательно.
___
⚠️ **Обратите внимание:**
Я всегда стремлюсь писать кратко и по существу, стараюсь предоставляя вам понятные и детально проработанные ответы, но иногда я могу **ошибиться**, или я могу не правильно прочесть текст на фото. Я ещё нахожусь на стадии тестирования, по этому перепроверяйте мои ответы и отправляйте изображения с хорошим качеством и понятным почерком.""", label="AI Response")
submit_button.click(
fn=ask_openai_with_image,
inputs=[instructions, image_input, imageb_input],
outputs=[output_markdown],
concurrency_limit=24
)
demo.launch()