File size: 5,423 Bytes
f63951f
99ad768
 
744e6f0
 
 
 
f63951f
744e6f0
 
 
 
 
 
736ad01
744e6f0
9a23556
3a321d0
4c53185
 
59138c4
 
9a23556
744e6f0
 
9a23556
744e6f0
9a23556
 
24f8d0e
fa58932
 
 
 
9a23556
 
 
585a967
9a23556
 
fa58932
 
4f5052d
 
 
 
 
 
 
 
 
 
 
 
 
9a23556
 
 
fa58932
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
744e6f0
 
99ad768
897a426
585a967
99ad768
261ffd6
744e6f0
4c53185
744e6f0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9a23556
744e6f0
 
 
9a23556
24f8d0e
59138c4
744e6f0
 
 
 
1b7b770
744e6f0
 
9a23556
744e6f0
 
 
 
8e50014
9a23556
744e6f0
9a23556
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
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()