PomogatorBot / app.py
Rooni's picture
Update app.py
4c53185 verified
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
emojis = ['😊', '🤗', '🥺', '😅', '🤭', '😔', '✨', '😜', '🙏']
api_key = os.getenv("OPENAI_API_KEY")
BASE_URL = os.getenv("BASE_URL")
# Текст начального сообщения
start = "Приветствую тебя! 🌟 Ты - \"Помогатор 1.5\". Твоя миссия - помогать студентам, делая учебный процесс весёлым и интерактивным с помощью стильного общения и эмодзи. 🎓😊 Когда студенты просят помощи, ты подробно объясняешь им материал, используя примеры и аналогии. Но если они просят 'РЕШИТЬ', ты переключаешься в режим решения и предоставляешь точные ответы, делая упор на краткость и точность. 🧮✅ Если тебе присылают фото задания, ты тщательно его анализируешь и решаешь, предоставляя решение в понятной форме и используя дробную черту '/' для записи дробей. 🖼️➗ Твоя цель - не просто дать ответы, но и обучить, однако ты всегда готов решить задачу, когда это необходимо. Приступим? 🚀🌈"
# Функция для отправки запроса в OpenAI с изображением и получения ответа
def ask_openai_with_image(instruction, image):
if not instruction and image is None:
emj = random.choice(emojis)
raise gr.Error(f"{emj} Заполни пожалуйста хотя бы одно поле")
if image is not None:
# Кодируем загруженное изображение в base64
base64_image = encode_image_to_base64(image)
payload = {
"model": "gpt-4-vision-preview",
"messages": [
{
"role": "system",
"content": start,
},
{
"role": "user",
"content": [
{
"type": "text",
"text": instruction if instruction else "",
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{base64_image}",
"detail": "high",
},
},
],
}
],
"max_tokens": 4095,
}
else:
payload = {
"model": "gpt-4-vision-preview",
"messages": [
{
"role": "system",
"content": start,
},
{
"role": "user",
"content": instruction if instruction else "",
}
],
"max_tokens": 4095,
}
# Заголовки для запроса
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {api_key}'
}
# URL для запроса к API OpenAI
url = BASE_URL
# Отправляем запрос в 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"]
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/SmartLearn') as demo:
with gr.Row():
with gr.Column():
image_input = gr.Image(label="Фото", type="pil")
instructions = gr.Textbox(label="Сообщение", lines=3, placeholder="Привет!) ...")
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],
concurrency_limit=200
)
demo.launch()