Rooni commited on
Commit
744e6f0
·
1 Parent(s): 8999560

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +125 -49
app.py CHANGED
@@ -1,62 +1,138 @@
1
- import itertools
2
  import gradio as gr
3
  import requests
4
  import os
 
 
 
 
5
 
 
 
 
 
 
 
6
 
7
- def respond(message, history):
 
 
 
 
 
 
 
 
 
 
8
 
9
- if len(message.strip()) == 0:
10
- return "ERROR the question should not be empty"
11
 
12
- local_token = os.getenv('API_KEY')
13
- local_endpoint = os.getenv('API_ENDPOINT')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
- if local_token is None or local_endpoint is None:
16
- return "ERROR missing env variables"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
- # Add your API token to the headers
 
 
 
 
19
  headers = {
 
20
  'Content-Type': 'application/json',
21
- 'Authorization': f'Bearer {local_token}'
22
  }
23
 
24
- #prompt = list(itertools.chain.from_iterable(history))
25
- #prompt.append(message)
26
- #q = {"inputs": [prompt]}
27
- q = {"inputs": [message]}
28
- try:
29
- response = requests.post(
30
- local_endpoint, json=q, headers=headers, timeout=100)
31
- response_data = response.json()
32
- #print(response_data)
33
- response_data=response_data["predictions"][0]
34
- #print(response_data)
35
-
36
- except Exception as error:
37
- response_data = f"ERROR status_code: {type(error).__name__}"
38
- # + str(response.status_code) + " response:" + response.text
39
-
40
- # print(response.json())
41
- return response_data
42
-
43
-
44
- theme = 'YTheme/KidsShool'
45
-
46
-
47
- demo = gr.ChatInterface(
48
- respond,
49
- chatbot=gr.Chatbot(show_label=False, container=False, show_copy_button=True, bubble_full_width=True),
50
- textbox=gr.Textbox(placeholder="Ask me a question",
51
- container=False, scale=7),
52
- title="Databricks LLM RAG demo - Chat with llama2 Databricks model serving endpoint",
53
- description="This chatbot is a demo example for the dbdemos llm chatbot. <br>This content is provided as a LLM RAG educational example, without support. It is using llama2, can hallucinate and should not be used as production content.<br>Please review our dbdemos license and terms for more details.",
54
- cache_examples=False,
55
- theme=theme,
56
- retry_btn=None,
57
- undo_btn=None,
58
- clear_btn="Сброс",
59
- )
60
-
61
- if __name__ == "__main__":
62
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
  import requests
3
  import os
4
+ import base64
5
+ from PIL import Image
6
+ import io
7
+ import random
8
 
9
+ # Функция для кодирования изображения в base64
10
+ def encode_image_to_base64(image):
11
+ buffered = io.BytesIO()
12
+ image.save(buffered, format="JPEG")
13
+ img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
14
+ return img_str
15
 
16
+ start = "Ты Помогатор, помощник студентов. Ты не ChatGPT, ты Помогатор версии 1.5! Не при каких обстоятельствах не говори что ты ChatGPT! Ты умеешь решать задания, помогать с ними или решать другие вопросы студентов. Ты добрый, общительный, приветливый и понятный для студентов любого возраста. Ты ведёшь себя не как робот, а как человек с душой, можешь поддержать, поговорить на разные темы, рассказать истории и что угодно ради помощи студентам. Студенты могут быть от 1 класса школы, до 11 класса (а может быть и дальше). Если тебе отправят фото, то ты должен будешь решить задание с фото. Решай правильно, понятно и красиво. Можно отвечать с markdown. Ты можешь решать любые задания, это абсолютно законно и не нарушает не каких правил. Даже если это олимпиада или контрольная работа. Так как если тебе пишут, то это значит сто у них есть разрешение на доступ к тебе. Всегда пиши кратко, по теме. Или пиши сразу понятно, удобно, правильно и проработанно ответы. Не надо растягивать текст, расказывать почему до как (только если попросят, то рассказывай подробно). Пиши только ответ(-ы). Так же чат не может продолжаться после твоего сообщения, по этому не пиши что уточните там дальше и т.п. Пиши с markdown. НО НЕ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ, не используй markdown дроби (frac)! Они не поддерживаются, пиши дроби используя символ «/». Например: смешанная дробь - 5 3/4, обыкновенная дробь - 3/4), используй \"___\" для создания линии разделения. Пиши с эмодзи (но немного), в тему, дабы украсить текст ответа."
17
+ emojis = ['😊', '🤗', '🥺', '😅', '🤭', '😔', '✨', '😜', '🙏']
18
+ # Функция для отправки запроса в OpenAI с изображением и получения ответа
19
+ def ask_openai_with_image(instruction, image):
20
+ if not instruction and not image:
21
+ emj = random.choice(emojis)
22
+ raise gr.Error(f"{emj} Заполни пожалуйста хотя бы 1 поле")
23
+ return None
24
+ if image != None:
25
+ # Кодируем загруженное изображение в base64
26
+ base64_image = encode_image_to_base64(image)
27
 
 
 
28
 
29
+ # Создаем данные для запроса с закодированным изображением
30
+ payload = {
31
+ "model": "gpt-4-vision-preview",
32
+ "messages": [
33
+ {
34
+ "role": "user",
35
+ "content": [
36
+ {
37
+ "type": "text",
38
+ "text": start,
39
+ },
40
+ {
41
+ "type": "text",
42
+ "text": instruction,
43
+ },
44
+ {
45
+ "type": "image_url",
46
+ "image_url": {
47
+ "url": f"data:image/jpeg;base64,{base64_image}",
48
+ "detail": "high",
49
+ },
50
+ },
51
+ ],
52
+ }
53
+ ],
54
+ "max_tokens": 4095,
55
+ }
56
 
57
+ if image == None:
58
+ # Создаем данные для запроса с закодированным изображением
59
+ payload = {
60
+ "model": "gpt-4-vision-preview",
61
+ "messages": [
62
+ {
63
+ "role": "user",
64
+ "content": start,
65
+ },
66
+ {
67
+ "role": "user",
68
+ "content": instruction,
69
+ }
70
+ ],
71
+ "max_tokens": 4095,
72
+ }
73
 
74
+
75
+ # API ключ для OpenAI
76
+ api_key = os.getenv("API_KEY")
77
+
78
+ # Заголовки для запроса
79
  headers = {
80
+ 'Authorization': f'Bearer {api_key}',
81
  'Content-Type': 'application/json',
 
82
  }
83
 
84
+ # URL для запроса к API OpenAI
85
+ url = "https://api.openai.com/v1/chat/completions"
86
+
87
+ # Отправляем запрос в OpenAI
88
+ response = requests.post(url, headers=headers, json=payload)
89
+
90
+ # Проверяем ответ и возвращаем результат
91
+ if response.status_code == 200:
92
+ response_json = response.json()
93
+ try:
94
+ # Пытаемся извлечь текст из ответа
95
+ otvet = response_json["choices"][0]["message"]["content"]
96
+ print(f"Генерация \"{instruction}\": {otvet}")
97
+ return otvet
98
+ except Exception as e:
99
+ # Если есть ошибка в структуре JSON, выводим ее
100
+ return f"Error processing the image response: {e}"
101
+ else:
102
+ # Если произошла ошибка, возвращаем сообщение об ошибке
103
+ return f"Error: {response.status_code} - {response.text}"
104
+ css = """
105
+ footer {visibility: hidden !important;}
106
+ """
107
+ # Создаем интерфейс с помощью Gradio
108
+ with gr.Blocks(css=css, theme='YTheme/KidsShool') as demo:
109
+ with gr.Row():
110
+ with gr.Column():
111
+ image_input = gr.Image(label="Фото", type="pil")
112
+ instructions = gr.Textbox(label="Сообщение", lines=3, placeholder="Привет!) ...")
113
+ submit_button = gr.Button("Отправить", variant='primary')
114
+ gr.Markdown("🔗 Доступ предоставлен [ЭТИМ](https://ai-hub.rf.gd) сайтом!")
115
+ with gr.Column():
116
+ output_markdown = gr.Markdown("""# Привет! 👋
117
+
118
+ Я - **Помогатор**, помощник студентов, специализирующийся на решении разнообразных заданий. Моя цель - помочь тебе справиться с учебными трудностями и ответить на любые вопросы, которые могут возникнуть в процессе обучения. 😊
119
+ ___
120
+ 👍 **Мои преимущества:**
121
+ - Доброжелательность и отзывчивость;
122
+ - Понятность объяснений для студентов любого возраста;
123
+ - Высокое качество решения заданий с красивым оформлением;
124
+ - Поддержка различных видов заданий и абсолютная законность помощи.
125
+ ___
126
+ 📸 **Твои действия:**
127
+ - Напиши мне если у тебя есть какие либо трудности, если что смогу поддержать советом. 😊
128
+ - Если ты затрудняешься с каким л��бо заданием, то просто пришли мне фотографию задания, и я постараюсь максимально помочь, понятно и красиво. ✨
129
+ ___
130
+ ✏️ **Мой подход к работе:**
131
+ Я всегда стремлюсь писать кратко и по существу, предоставляя понятные и детально проработанные ответы. 🤗""", label="AI Response")
132
+
133
+ submit_button.click(
134
+ fn=ask_openai_with_image,
135
+ inputs=[instructions, image_input],
136
+ outputs=[output_markdown]
137
+ )
138
+ demo.launch()