File size: 8,296 Bytes
f63951f
99ad768
 
67da721
99ad768
61ddbf5
f63951f
99ad768
1b96f25
 
 
 
 
 
99ad768
ca2b862
1b96f25
b2e774e
11e1de5
763142e
c0cbb22
 
 
 
 
 
 
 
11e1de5
 
460611e
 
 
 
 
 
 
 
 
 
 
 
 
4259c8a
460611e
 
 
c0cbb22
 
 
 
 
763142e
c0cbb22
 
 
 
11e1de5
 
 
 
c0cbb22
 
 
 
 
 
 
1b96f25
f63951f
99ad768
 
 
 
 
 
 
 
 
 
 
 
 
 
61ddbf5
99ad768
f63951f
1b96f25
 
99ad768
1b96f25
 
99ad768
 
f63951f
99ad768
 
433ad14
 
 
99ad768
433ad14
99ad768
 
40ae102
 
b2e774e
 
99ad768
523d46c
 
6be1b59
fa3d170
523d46c
 
 
 
 
fa3d170
523d46c
6be1b59
b71c7b2
fa3d170
523d46c
b2e774e
99ad768
 
 
4259c8a
99ad768
 
1b96f25
99ad768
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

# Функция для кодирования изображения в 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()