fruitpicker01 commited on
Commit
7934a24
·
verified ·
1 Parent(s): 231fcad

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +126 -0
app.py ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import requests
3
+ import os
4
+ import pandas as pd
5
+ import time
6
+ from langchain.schema import SystemMessage
7
+ from langchain.chat_models.gigachat import GigaChat
8
+ from PIL import Image, ImageDraw, ImageFont
9
+
10
+ # Установка ключа API для OpenAI и GigaChat
11
+ openai_api_key = os.getenv('GPT_KEY')
12
+ gc_key = os.getenv('GC_KEY')
13
+
14
+ # Авторизация в сервисе GigaChat
15
+ chat_pro = GigaChat(credentials=gc_key, model='GigaChat-Pro', verify_ssl_certs=False)
16
+ chat_lite = GigaChat(credentials=gc_key, model='GigaChat', verify_ssl_certs=False)
17
+
18
+ # Загрузка данных из Excel-файла
19
+ try:
20
+ data = pd.read_excel('Признаки.xlsx', sheet_name=None)
21
+ except Exception as e:
22
+ print(f"Ошибка при загрузке Excel-файла: {e}")
23
+ data = {}
24
+
25
+ # Создание списка признаков и их значений
26
+ features = {}
27
+ for sheet_name, df in data.items():
28
+ try:
29
+ features[sheet_name] = df.set_index(df.columns[0]).to_dict()[df.columns[1]]
30
+ except Exception as e:
31
+ print(f"Ошибка при обработке данных листа {sheet_name}: {e}")
32
+ features[sheet_name] = {}
33
+
34
+ # Функция для генерации промпта
35
+ def generate_prompt(*selected_values):
36
+ prompt = "Напиши типичное рекламное SMS-сообщение от ПАО Сбербанк, но с учетом следующих правил (длина сообщения не должна превышать 250 знаков с учетом пробелов):\n"
37
+ for i, feature in enumerate(features.keys()):
38
+ if selected_values[i]:
39
+ try:
40
+ prompt += f"{features[feature][selected_values[i]]}\n"
41
+ except KeyError:
42
+ return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
43
+ return prompt.strip()
44
+
45
+ # Функция для генерации сообщения с помощью GPT-4o
46
+ def generate_message_gpt4o(prompt):
47
+ try:
48
+ headers = {
49
+ "Content-Type": "application/json",
50
+ "Authorization": f"Bearer {openai_api_key}"
51
+ }
52
+ data = {
53
+ "model": "gpt-4o",
54
+ "messages": [{"role": "system", "content": prompt}],
55
+ "max_tokens": 700
56
+ }
57
+ response = requests.post("https://api.openai.com/v1/chat/completions", json=data, headers=headers)
58
+ response_data = response.json()
59
+ return response_data["choices"][0]["message"]["content"].strip()
60
+ except Exception as e:
61
+ return f"Ошибка при обращении к GPT-4o: {e}"
62
+
63
+ # Функция для генерации сообщения с помощью GigaChat-Pro
64
+ def generate_message_gigachat_pro(prompt):
65
+ try:
66
+ messages = [SystemMessage(content=prompt)]
67
+ res = chat_pro(messages)
68
+ return res.content.strip()
69
+ except Exception as e:
70
+ return f"Ошибка при обращении к GigaChat-Pro: {e}"
71
+
72
+ # Функция для генерации сообщения с помощью GigaChat
73
+ def generate_message_gigachat_lite(prompt):
74
+ try:
75
+ time.sleep(2) # Задержка 2 секунды перед запросом к GigaChat
76
+ messages = [SystemMessage(content=prompt)]
77
+ res = chat_lite(messages)
78
+ return res.content.strip()
79
+ except Exception as e:
80
+ return f"Ошибка при обращении к GigaChat-Lite: {e}"
81
+
82
+ # Функция для добавления текста на изображение
83
+ def add_text_to_image(image_path, prompt, gpt4o_message, gigachat_pro_message, gigachat_lite_message):
84
+ img = Image.open(image_path)
85
+ draw = ImageDraw.Draw(img)
86
+ font = ImageFont.truetype("arial.ttf", 20)
87
+
88
+ # Определите позиции, где будут отображаться ваши сообщения
89
+ prompt_position = (50, 50)
90
+ gpt4o_position = (50, 150)
91
+ gigachat_pro_position = (50, 250)
92
+ gigachat_lite_position = (50, 350)
93
+
94
+ draw.text(prompt_position, prompt, font=font, fill="black")
95
+ draw.text(gpt4o_position, gpt4o_message, font=font, fill="black")
96
+ draw.text(gigachat_pro_position, gigachat_pro_message, font=font, fill="black")
97
+ draw.text(gigachat_lite_position, gigachat_lite_message, font=font, fill="black")
98
+
99
+ img.save("output_pipeline.png")
100
+ return "output_pipeline.png"
101
+
102
+ # Функция для обработки нажатия кнопки Submit
103
+ def generate_messages(*selected_values):
104
+ prompt = generate_prompt(*selected_values)
105
+ if "Ошибка" in prompt:
106
+ return prompt, "", "", "", None
107
+ message_gpt4o = generate_message_gpt4o(prompt)
108
+ message_gigachat_pro = generate_message_gigachat_pro(prompt)
109
+ message_gigachat_lite = generate_message_gigachat_lite(prompt)
110
+
111
+ # Добавление текста на изображение
112
+ image_path = add_text_to_image('pipeline.png', prompt, message_gpt4o, message_gigachat_pro, message_gigachat_lite)
113
+
114
+ return prompt, message_gpt4o, message_gigachat_pro, message_gigachat_lite, image_path
115
+
116
+ # Создание интерфейса Gradio
117
+ with gr.Blocks() as demo:
118
+ gr.Markdown("# Генерация SMS-сообщений по заданным признакам")
119
+
120
+ with gr.Row():
121
+ with gr.Column(scale=1):
122
+ selections = []
123
+ for feature in features.keys():
124
+ selections.append(gr.Dropdown(choices=[None] + list(features[feature].keys()), label=f"Выберите {feature}"))
125
+
126
+ submit_btn = gr.Button("Submit") # Оранжевая кнопка