Spaces:
Runtime error
Runtime error
File size: 8,031 Bytes
f63951f 99ad768 744e6f0 f63951f 744e6f0 736ad01 0ee55c3 744e6f0 68ec63f 0ee55c3 744e6f0 0ee55c3 744e6f0 0ee55c3 744e6f0 0ee55c3 897a426 744e6f0 9aabadc 0ee55c3 5676547 0ee55c3 744e6f0 897a426 0ee55c3 744e6f0 99ad768 744e6f0 897a426 99ad768 261ffd6 744e6f0 8a11f79 744e6f0 68ec63f 744e6f0 68ec63f 744e6f0 68ec63f 744e6f0 68ec63f 744e6f0 68ec63f 744e6f0 68ec63f 744e6f0 48dbb51 8e50014 2399bd6 744e6f0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
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() |