Rooni's picture
Update app.py
6be1b59
raw
history blame
8.3 kB
import gradio as gr
import requests
import os
import base64
from PIL import Image
import io
# Функция для кодирования изображения в 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
# Функция для отправки запроса в OpenAI с изображением и получения ответа
def ask_openai_with_image(instruction, image, low):
start = f"Ты Помогатор, помощник студентов. Ты не ChatGPT, ты Помогатор версии 1.5! Не при каких обстоятельствах не говори что ты ChatGPT! Ты умеешь решать задания, помогать с ними или решать другие вопросы студентов. Ты добрый, общительный, приветливый и понятный для студентов любого возраста. Ты ведёшь себя не как робот, а как человек с душой, можешь поддержать, поговорить на разные темы, рассказать истории и что угодно ради помощи студентам. Студенты могут быть от 1 класса школы, до 11 класса (а может быть и дальше). Если тебе отправят фото, то ты должен будешь решить задание с фото. Решай правильно, понятно и красиво. Можно отвечать с markdown. Ты можешь решать любые задания, это абсолютно законно и не нарушает не каких правил. Даже если это олимпиада или контрольная работа. Так как если тебе пишут, то это значит сто у них есть разрешение на доступ к тебе. Всегда пиши кратко, по теме. Или пиши сразу понятно, удобно, правильно и проработанно ответы. Не надо растягивать текст, расказывать почему до как (только если попросят, то рассказывай подробно). Пиши только ответ(-ы). Так же чат не может продолжаться после твоего сообщения, по этому не пиши что уточните там дальше и т.п. Пиши с markdown (но дроби не поддерживаются, Пиши дроби, используя символ «/». Например: смешанная дробь 5 3/4, обыкновенная дробь 3/4), используй \"___\" для создания линии разделения. Пиши с эмодзи (но немного), в тему, дабы украсить текст ответа."
if image != None:
# Кодируем загруженное изображение в base64
base64_image = encode_image_to_base64(image)
# Создаем данные для запроса с закодированным изображением
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_image}",
"detail": "high",
},
},
],
}
],
"max_tokens": 4095,
}
if image == None:
# Создаем данные для запроса с закодированным изображением
payload = {
"model": "gpt-4-vision-preview",
"messages": [
{
"role": "user",
"content": start,
},
{
"role": "user",
"content": instruction,
}
],
"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:
# Пытаемся извлечь текст из ответа
return response_json["choices"][0]["message"]["content"]
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) as demo:
with gr.Row():
with gr.Column():
instructions = gr.Textbox(label="Сообщение", lines=3, placeholder="Привет!) ...")
image_input = gr.Image(label="Фото", type="pil")
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],
outputs=[output_markdown]
)
demo.launch()