Rooni commited on
Commit
528ec65
·
1 Parent(s): bf68a39

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +49 -125
app.py CHANGED
@@ -1,138 +1,62 @@
 
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()
 
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_TOKEN')
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()