fruitpicker01 commited on
Commit
62a5b25
·
verified ·
1 Parent(s): c348b7e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +330 -109
app.py CHANGED
@@ -9,63 +9,31 @@ from langchain_community.chat_models.gigachat import GigaChat
9
  from openpyxl import load_workbook
10
  import base64
11
 
12
- # Установка ключей API для OpenAI, GigaChat и GitHub
13
  openai_api_key = os.getenv('GPT_KEY')
14
  gc_key = os.getenv('GC_KEY')
15
  token = os.getenv('GITHUB_TOKEN')
16
 
17
- # Класс конфигурации модели
18
- class ModelConfig:
19
- def __init__(self, temperature):
20
- self.max_tokens = 68 # фиксированное значение
21
- self.temperature = temperature
22
-
23
- # Класс для генерации сообщений
24
- class MessageGenerator:
25
- def __init__(self, config: ModelConfig):
26
- self.config = config
27
- self.chat_pro = self.authenticate_gigachat('GigaChat-Pro')
28
- self.chat_lite = self.authenticate_gigachat('GigaChat')
29
- self.chat_plus = self.authenticate_gigachat('GigaChat-Plus')
30
-
31
- def authenticate_gigachat(self, model):
32
- return GigaChat(credentials=gc_key, model=model, max_tokens=self.config.max_tokens, temperature=self.config.temperature, verify_ssl_certs=False)
33
-
34
- def clean_message(self, message):
35
- if not message.endswith(('.', '!', '?')):
36
- last_period = message.rfind('.')
37
- if last_period != -1:
38
- message = message[:last_period + 1]
39
- return message
40
-
41
- def generate_message_gpt4o(self, prompt):
42
- headers = {
43
- "Content-Type": "application/json",
44
- "Authorization": f"Bearer {openai_api_key}"
45
- }
46
- data = {
47
- "model": "chatgpt-4o-latest",
48
- "messages": [{"role": "system", "content": prompt}],
49
- "max_tokens": self.config.max_tokens,
50
- "temperature": self.config.temperature
51
- }
52
- response = requests.post("https://api.openai.com/v1/chat/completions", json=data, headers=headers)
53
- response_data = response.json()
54
- return self.clean_message(response_data["choices"][0]["message"]["content"].strip())
55
-
56
- def generate_message_gigachat(self, prompt, model):
57
- messages = [SystemMessage(content=prompt)]
58
- if model == 'GigaChat-Pro':
59
- res = self.chat_pro(messages)
60
- elif model == 'GigaChat':
61
- res = self.chat_lite(messages)
62
- elif model == 'GigaChat-Plus':
63
- res = self.chat_plus(messages)
64
- return self.clean_message(res.content.strip())
65
 
66
  # Загрузка данных из Excel-файла
67
- data = pd.read_excel('Признаки.xlsx', sheet_name=None)
68
- features = {sheet_name: df.set_index(df.columns[0]).to_dict()[df.columns[1]] for sheet_name, df in data.items()}
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
  # Функция для генерации стандартного промпта
71
  def generate_standard_prompt(description, advantages, *selected_values):
@@ -107,65 +75,279 @@ def generate_standard_prompt(description, advantages, *selected_values):
107
  )
108
  return prompt
109
 
110
- # Функция для генерации сообщений с учетом повторных попыток
111
- def generate_message_with_retry(generator, prompt, model):
112
- for _ in range(10):
113
- message = generator.generate_message_gigachat(prompt, model)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  if len(message) <= 250:
115
  return message
116
  return message # Возвращаем последнее сгенерированное сообщение, если все попытки не удались
117
 
118
- # Обновление интерфейса для отображения сообщений
119
- def generate_messages(description, advantages, config, *selected_values):
120
- generator = MessageGenerator(config)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  standard_prompt = generate_standard_prompt(description, advantages, *selected_values)
122
 
123
  results = {
124
  "prompt": standard_prompt,
125
- "gpt4o": generator.generate_message_gpt4o(standard_prompt),
126
- "gigachat_pro": generate_message_with_retry(generator, standard_prompt, 'GigaChat-Pro'),
127
- "gigachat_lite": generate_message_with_retry(generator, standard_prompt, 'GigaChat'),
128
- "gigachat_plus": generate_message_with_retry(generator, standard_prompt, 'GigaChat-Plus')
129
  }
130
 
131
- return results["prompt"], results["gpt4o"], results["gigachat_pro"], results["gigachat_lite"], results["gigachat_plus"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
 
133
  # Функция для генерации персонализированного промпта
134
  def generate_personalization_prompt(*selected_values):
135
  prompt = "Адаптируй, не превышая длину сообщения в 250 знаков с пробелами, текст с учетом следующих особенностей:\n"
136
  for i, feature in enumerate(features.keys()):
137
  if selected_values[i]:
138
- prompt += f"{features[feature][selected_values[i]]}\n"
 
 
 
 
139
  prompt += "Убедись, что в готовом тексте до 250 знаков с пробелами."
 
140
  return prompt.strip()
141
 
142
  # Функция для выполнения персонализации на основе сгенерированного промпта и сообщения
143
- def perform_personalization(standard_message, personalization_prompt, generator):
 
 
 
 
 
144
  full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
145
- return generator.generate_message_gpt4o(full_prompt)
 
 
 
 
 
 
 
 
 
 
 
 
 
146
 
147
- # Функция для выполнения персонализации с учетом повторных попыток
148
- def perform_personalization_with_retry(standard_message, personalization_prompt, generator, model):
149
  for _ in range(10):
150
- message = perform_personalization(standard_message, personalization_prompt, generator)
151
  if len(message) <= 250:
152
  return message
153
  return message
154
 
155
- # Обновление интерфейса для персонализации сообщений
156
- def personalize_messages(gpt4o_message, gigachat_pro_message, gigachat_lite_message, gigachat_plus_message, config, *selected_values):
157
- generator = MessageGenerator(config)
158
  personalization_prompt = generate_personalization_prompt(*selected_values)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
159
 
160
- personalized_gpt4o = perform_personalization_with_retry(gpt4o_message, personalization_prompt, generator, "GPT-4o")
161
- personalized_gigachat_pro = perform_personalization_with_retry(gigachat_pro_message, personalization_prompt, generator, "GigaChat-Pro")
162
- personalized_gigachat_lite = perform_personalization_with_retry(gigachat_lite_message, personalization_prompt, generator, "GigaChat")
163
- personalized_gigachat_plus = perform_personalization_with_retry(gigachat_plus_message, personalization_prompt, generator, "GigaChat-Plus")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
 
165
- return personalization_prompt, personalized_gpt4o, personalized_gigachat_pro, personalized_gigachat_lite, personalized_gigachat_plus
166
 
167
- # Функция для сохранения данных на GitHub
168
  def save_to_github(personalized_message, model_name, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form):
 
169
  data_to_save = {
170
  "Модель": model_name,
171
  "Персонализированное сообщение": personalized_message,
@@ -182,7 +364,11 @@ def save_to_github(personalized_message, model_name, comment, corrected_message,
182
  "Отрасль": industry,
183
  "ОПФ": legal_form
184
  }
 
 
185
  file_content_encoded = base64.b64encode(json.dumps(data_to_save).encode()).decode()
 
 
186
  repo = "fruitpicker01/Storage_1"
187
  path = f"file_{int(time.time())}.json"
188
  url = f"https://api.github.com/repos/{repo}/contents/{path}"
@@ -194,7 +380,10 @@ def save_to_github(personalized_message, model_name, comment, corrected_message,
194
  "message": f"Добавлен новый файл {path}",
195
  "content": file_content_encoded
196
  }
197
- requests.put(url, headers=headers, data=json.dumps(data))
 
 
 
198
 
199
  # Создание интерфейса Gradio
200
  with gr.Blocks() as demo:
@@ -202,53 +391,64 @@ with gr.Blocks() as demo:
202
 
203
  with gr.Row():
204
  with gr.Column(scale=1):
205
- temperature_slider = gr.Slider(label="Температура", minimum=0, maximum=2, step=0.01, value=1)
206
-
207
  description_input = gr.Textbox(
208
- label="Описание предложения",
209
- lines=5,
210
- value="Необходимо предложить клиенту оформить дебетовую премиальную бизнес-карту Mastercard Preffered..."
 
 
 
 
 
 
 
 
211
  )
212
  advantages_input = gr.Textbox(
213
- label="Преимущества",
214
- lines=5,
215
- value="Предложение по бесплатному обслуживанию — бессрочное..."
 
 
 
 
 
 
216
  )
217
-
218
  selections = []
219
  for feature in features.keys():
220
  selections.append(gr.Dropdown(choices=[None] + list(features[feature].keys()), label=f"Выберите {feature}"))
221
 
222
- submit_btn = gr.Button("Создать неперсонализированное сообщение")
223
 
224
  with gr.Column(scale=2):
225
- prompt_display = gr.Textbox(label="Неперсонализированный промпт", lines=10, interactive=False)
226
  output_text_gpt4o = gr.Textbox(label="Неперсонализированное сообщение GPT-4o", lines=3, interactive=False)
227
  output_text_gigachat_pro = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Pro", lines=3, interactive=False)
228
  output_text_gigachat_lite = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite", lines=3, interactive=False)
229
- output_text_gigachat_plus = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Plus", lines=3, interactive=False)
230
-
231
  submit_btn.click(
232
- fn=generate_messages,
233
- inputs=[description_input, advantages_input, gr.State(lambda: ModelConfig(temperature_slider.value))] + selections,
234
  outputs=[prompt_display, output_text_gpt4o, output_text_gigachat_pro, output_text_gigachat_lite, output_text_gigachat_plus]
235
  )
236
 
237
  with gr.Row():
238
- personalize_btn = gr.Button("Выполнить персонализацию")
239
-
240
- with gr.Column(scale=2):
241
- personalization_prompt_display = gr.Textbox(label="Промпт для персонализации", lines=6, interactive=False)
242
- personalized_output_text_gpt4o = gr.Textbox(label="Персонализированное сообщение GPT-4o", lines=6, interactive=False)
243
- personalized_output_text_gigachat_pro = gr.Textbox(label="Персонализированное сообщение GigaChat-Pro", lines=6, interactive=False)
244
- personalized_output_text_gigachat_lite = gr.Textbox(label="Персонализированное сообщение GigaChat-Lite", lines=6, interactive=False)
245
- personalized_output_text_gigachat_plus = gr.Textbox(label="Персонализированное сообщение GigaChat-Plus", lines=6, interactive=False)
246
-
247
- personalize_btn.click(
248
- fn=personalize_messages,
249
- inputs=[output_text_gpt4o, output_text_gigachat_pro, output_text_gigachat_lite, output_text_gigachat_plus, gr.State(lambda: ModelConfig(temperature_slider.value))] + selections,
250
- outputs=[personalization_prompt_display, personalized_output_text_gpt4o, personalized_output_text_gigachat_pro, personalized_output_text_gigachat_lite, personalized_output_text_gigachat_plus]
251
- )
252
 
253
  with gr.Row():
254
  gr.Markdown("*Комментарий (опционально):*")
@@ -264,6 +464,8 @@ with gr.Blocks() as demo:
264
  corrected_gigachat_lite = gr.Textbox(label="", lines=3)
265
  corrected_gigachat_plus = gr.Textbox(label="", lines=3)
266
 
 
 
267
  with gr.Row():
268
  gr.Button("Жми 👍 для сохранения удачного SMS в базу =>")
269
  save_gpt4o_btn = gr.Button("👍")
@@ -271,6 +473,7 @@ with gr.Blocks() as demo:
271
  save_gigachat_lite_btn = gr.Button("👍")
272
  save_gigachat_plus_btn = gr.Button("👍")
273
 
 
274
  save_gpt4o_btn.click(
275
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form:
276
  save_to_github(personalized_message, "GPT-4o", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form),
@@ -336,7 +539,7 @@ with gr.Blocks() as demo:
336
 
337
  save_gigachat_plus_btn.click(
338
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form:
339
- save_to_github(personalized_message, "GigaChat-Plus", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form),
340
  inputs=[
341
  personalized_output_text_gigachat_plus,
342
  comment_gigachat_plus,
@@ -355,4 +558,22 @@ with gr.Blocks() as demo:
355
  outputs=None
356
  )
357
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
358
  demo.launch()
 
9
  from openpyxl import load_workbook
10
  import base64
11
 
12
+ # Установка ключа API для OpenAI и GigaChat
13
  openai_api_key = os.getenv('GPT_KEY')
14
  gc_key = os.getenv('GC_KEY')
15
  token = os.getenv('GITHUB_TOKEN')
16
 
17
+ # Авторизация в сервисе GigaChat
18
+ chat_pro = GigaChat(credentials=gc_key, model='GigaChat-Pro', max_tokens=68, verify_ssl_certs=False)
19
+ chat_lite = GigaChat(credentials=gc_key, model='GigaChat', max_tokens=68, verify_ssl_certs=False)
20
+ chat_plus = GigaChat(credentials=gc_key, model='GigaChat-Plus', max_tokens=68, verify_ssl_certs=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
  # Загрузка данных из Excel-файла
23
+ try:
24
+ data = pd.read_excel('Признаки.xlsx', sheet_name=None)
25
+ except Exception as e:
26
+ print(f"Ошибка при загрузке Excel-файла: {e}")
27
+ data = {}
28
+
29
+ # Создание списка признаков и их значений
30
+ features = {}
31
+ for sheet_name, df in data.items():
32
+ try:
33
+ features[sheet_name] = df.set_index(df.columns[0]).to_dict()[df.columns[1]]
34
+ except Exception as e:
35
+ print(f"Ошибка при обработке данных листа {sheet_name}: {e}")
36
+ features[sheet_name] = {}
37
 
38
  # Функция для генерации стандартного промпта
39
  def generate_standard_prompt(description, advantages, *selected_values):
 
75
  )
76
  return prompt
77
 
78
+ # Функции для генерации сообщений
79
+ def generate_message_gpt4o(prompt):
80
+ try:
81
+ headers = {
82
+ "Content-Type": "application/json",
83
+ "Authorization": f"Bearer {openai_api_key}"
84
+ }
85
+ data = {
86
+ "model": "chatgpt-4o-latest",
87
+ "messages": [{"role": "system", "content": prompt}],
88
+ "max_tokens": 101
89
+ }
90
+ response = requests.post("https://api.openai.com/v1/chat/completions", json=data, headers=headers)
91
+ response_data = response.json()
92
+ return response_data["choices"][0]["message"]["content"].strip()
93
+ except Exception as e:
94
+ return f"Ошибка при обращении к ChatGPT-4o-Latest: {e}"
95
+
96
+ def clean_message(message):
97
+ # Если сообщение не заканчивается на точку или восклицательный знак, обрезаем его до последней точки
98
+ if not message.endswith(('.', '!', '?')):
99
+ last_period = message.rfind('.')
100
+ if last_period != -1:
101
+ message = message[:last_period + 1]
102
+ return message
103
+
104
+ # Обновленные функции генерации сообщений с учетом обрезки незаконченных предложений
105
+ def generate_message_gigachat_pro(prompt):
106
+ try:
107
+ messages = [SystemMessage(content=prompt)]
108
+ res = chat_pro(messages)
109
+ cleaned_message = clean_message(res.content.strip())
110
+ return cleaned_message
111
+ except Exception as e:
112
+ return f"Ошибка при обращении к GigaChat-Pro: {e}"
113
+
114
+ def generate_message_gigachat_lite(prompt):
115
+ try:
116
+ time.sleep(2)
117
+ messages = [SystemMessage(content=prompt)]
118
+ res = chat_lite(messages)
119
+ cleaned_message = clean_message(res.content.strip())
120
+ return cleaned_message
121
+ except Exception as e:
122
+ return f"Ошибка при обращении к GigaChat-Lite: {e}"
123
+
124
+ def generate_message_gigachat_plus(prompt):
125
+ try:
126
+ time.sleep(2)
127
+ messages = [SystemMessage(content=prompt)]
128
+ res = chat_plus(messages)
129
+ cleaned_message = clean_message(res.content.strip())
130
+ return cleaned_message
131
+ except Exception as e:
132
+ return f"Ошибка при обращении к GigaChat-Plus: {e}"
133
+
134
+ def generate_message_gpt4o_with_retry(prompt):
135
+ for _ in range(10): # Максимум 10 попыток
136
+ message = generate_message_gpt4o(prompt)
137
  if len(message) <= 250:
138
  return message
139
  return message # Возвращаем последнее сгенерированное сообщение, если все попытки не удались
140
 
141
+ def generate_message_gigachat_pro_with_retry(prompt):
142
+ for _ in range(10):
143
+ message = generate_message_gigachat_pro(prompt)
144
+ if len(message) <= 250:
145
+ return message
146
+ return message
147
+
148
+ def generate_message_gigachat_lite_with_retry(prompt):
149
+ for _ in range(10):
150
+ message = generate_message_gigachat_lite(prompt)
151
+ if len(message) <= 250:
152
+ return message
153
+ return message
154
+
155
+ def generate_message_gigachat_plus_with_retry(prompt):
156
+ for _ in range(10):
157
+ message = generate_message_gigachat_plus(prompt)
158
+ if len(message) <= 250:
159
+ return message
160
+ return message
161
+
162
+
163
+ # Обновляем генерацию сообщений для отображения в интерфейсе
164
+ def generate_messages(description, advantages, *selected_values):
165
  standard_prompt = generate_standard_prompt(description, advantages, *selected_values)
166
 
167
  results = {
168
  "prompt": standard_prompt,
169
+ "gpt4o": None,
170
+ "gigachat_pro": None,
171
+ "gigachat_lite": None,
172
+ "gigachat_plus": None
173
  }
174
 
175
+ yield results["prompt"], "", "", "", "", "Генерация стандартного промпта завершена"
176
+
177
+ results["gpt4o"] = generate_message_gpt4o_with_retry(standard_prompt)
178
+ gpt4o_length = len(results["gpt4o"])
179
+ gpt4o_display = f"{results['gpt4o']}\n\n------\nКоличество знаков: {gpt4o_length}"
180
+ yield results["prompt"], gpt4o_display, "", "", "", "Сообщение GPT-4o сгенерировано"
181
+
182
+ results["gigachat_pro"] = generate_message_gigachat_pro_with_retry(standard_prompt)
183
+ gigachat_pro_length = len(results["gigachat_pro"])
184
+ gigachat_pro_display = f"{results['gigachat_pro']}\n\n------\nКоличество знаков: {gigachat_pro_length}"
185
+ yield results["prompt"], gpt4o_display, gigachat_pro_display, "", "", "Сообщение GigaChat-Pro сгенерировано"
186
+
187
+ time.sleep(2)
188
+
189
+ results["gigachat_lite"] = generate_message_gigachat_lite_with_retry(standard_prompt)
190
+ gigachat_lite_length = len(results["gigachat_lite"])
191
+ gigachat_lite_display = f"{results['gigachat_lite']}\n\n------\nКоличество знаков: {gigachat_lite_length}"
192
+ yield results["prompt"], gpt4o_display, gigachat_pro_display, gigachat_lite_display, "", "Сообщение GigaChat-Lite сгенерировано"
193
+
194
+ time.sleep(2)
195
+
196
+ results["gigachat_plus"] = generate_message_gigachat_plus_with_retry(standard_prompt)
197
+ gigachat_plus_length = len(results["gigachat_plus"])
198
+ gigachat_plus_display = f"{results['gigachat_plus']}\n\n------\nКоличество знаков: {gigachat_plus_length}"
199
+ yield results["prompt"], gpt4o_display, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, "Все сообщения сгенерированы"
200
+
201
+ return results
202
+
203
+
204
 
205
  # Функция для генерации персонализированного промпта
206
  def generate_personalization_prompt(*selected_values):
207
  prompt = "Адаптируй, не превышая длину сообщения в 250 знаков с пробелами, текст с учетом следующих особенностей:\n"
208
  for i, feature in enumerate(features.keys()):
209
  if selected_values[i]:
210
+ try:
211
+ prompt += f"{features[feature][selected_values[i]]}\n"
212
+ except KeyError:
213
+ return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
214
+
215
  prompt += "Убедись, что в готовом тексте до 250 знаков с пробелами."
216
+
217
  return prompt.strip()
218
 
219
  # Функция для выполнения персонализации на основе сгенерированного промпта и сообщения
220
+ def perform_personalization(standard_message, personalization_prompt):
221
+ full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
222
+ return generate_message_gpt4o(full_prompt)
223
+
224
+ # Также обновляем функции персонализации
225
+ def perform_personalization_gigachat(standard_message, personalization_prompt, model):
226
  full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
227
+ if model == "gigachat_pro":
228
+ result = generate_message_gigachat_pro(full_prompt)
229
+ elif model == "gigachat_lite":
230
+ result = generate_message_gigachat_lite(full_prompt)
231
+ elif model == "gigachat_plus":
232
+ result = generate_message_gigachat_plus(full_prompt)
233
+ return clean_message(result)
234
+
235
+ def perform_personalization_with_retry(standard_message, personalization_prompt):
236
+ for _ in range(10): # Максимум 10 попыток
237
+ message = perform_personalization(standard_message, personalization_prompt)
238
+ if len(message) <= 250:
239
+ return message
240
+ return message # Возвращаем последнее сгенерированное сообщение, если все попытки не удались
241
 
242
+ def perform_personalization_gigachat_with_retry(standard_message, personalization_prompt, model):
 
243
  for _ in range(10):
244
+ message = perform_personalization_gigachat(standard_message, personalization_prompt, model)
245
  if len(message) <= 250:
246
  return message
247
  return message
248
 
249
+
250
+ # Обновляем блок персонализации
251
+ def personalize_messages_with_yield(gpt4o_message, gigachat_pro_message, gigachat_lite_message, gigachat_plus_message, *selected_values):
252
  personalization_prompt = generate_personalization_prompt(*selected_values)
253
+ yield personalization_prompt, "", "", "", "", "Промпт для персонализации сгенерирован"
254
+
255
+ personalized_message_gpt4o = perform_personalization_with_retry(gpt4o_message, personalization_prompt)
256
+ gpt4o_length = len(personalized_message_gpt4o)
257
+ gpt4o_display = f"{personalized_message_gpt4o}\n\n------\nКоличество знаков: {gpt4o_length}"
258
+ yield personalization_prompt, gpt4o_display, "", "", "", "Персонализированное сообщение GPT-4o сгенерировано"
259
+
260
+ personalized_message_gigachat_pro = perform_personalization_gigachat_with_retry(gigachat_pro_message, personalization_prompt, "gigachat_pro")
261
+ gigachat_pro_length = len(personalized_message_gigachat_pro)
262
+ gigachat_pro_display = f"{personalized_message_gigachat_pro}\n\n------\nКоличество знаков: {gigachat_pro_length}"
263
+ yield personalization_prompt, gpt4o_display, gigachat_pro_display, "", "", "Персонализированное сообщение GigaChat-Pro сгенерировано"
264
+
265
+ personalized_message_gigachat_lite = perform_personalization_gigachat_with_retry(gigachat_lite_message, personalization_prompt, "gigachat_lite")
266
+ gigachat_lite_length = len(personalized_message_gigachat_lite)
267
+ gigachat_lite_display = f"{personalized_message_gigachat_lite}\n\n------\nКоличество знаков: {gigachat_lite_length}"
268
+ yield personalization_prompt, gpt4o_display, gigachat_pro_display, gigachat_lite_display, "", "Персонализированное сообщение GigaChat-Lite сгенерировано"
269
+
270
+ personalized_message_gigachat_plus = perform_personalization_gigachat_with_retry(gigachat_plus_message, personalization_prompt, "gigachat_plus")
271
+ gigachat_plus_length = len(personalized_message_gigachat_plus)
272
+ gigachat_plus_display = f"{personalized_message_gigachat_plus}\n\n------\nКоличество знаков: {gigachat_plus_length}"
273
+ yield personalization_prompt, gpt4o_display, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, "Все персонализированные сообщения сгенерированы"
274
+
275
+
276
+ # Функция для генерации промпта проверки текста
277
+ def generate_error_check_prompt():
278
+ prompt = (
279
+ "Проверь текст SMS-сообщения на соответствие установленным правилам и ограничениям, касающимся его формирования. На основе выявленных несоответствий предоставь рекомендации по исправлению текста. "
280
+ "Особое внимание удели проверке: количества символов в тексте SMS-сообщения, орфографическим и пунктуационным ошибкам, определению частей речи (причастия, деепричастия, причастный оборот, деепричастный оборот). "
281
+ "Анализируй только текст SMS-сообщения, ничего не придумывай и не добавляй лишнего. "
282
+ "Правила и ограничения, которым должен соответствовать текст SMS-сообщения:\n"
283
+ "1. Количество символов в SMS-сообщении должно быть до 250 знаков с учетом пробелов.\n"
284
+ "2. В тексте должен быть призыв к действию с использованием глагола в повелительном наклонении (например: оформите, получите, разместите, размещайте, откройте, подключите, подайте заявку).\n"
285
+ "3. Должно соблюдаться соответствие фактов о продукте.\n"
286
+ "4. В генерациях смс запрещено использовать обещания и гарантии.\n"
287
+ "5. В генерациях смс запрещено использовать составные конструкции из двух глаголов.\n"
288
+ "6. В генерациях смс запрещено использовать причастия и причастные обороты.\n"
289
+ "7. В генерациях смс запрещено использовать деепричастия и деепричастные обороты.\n"
290
+ "8. В генерациях смс запрещено использовать превосходную степень прилагательных.\n"
291
+ "9. В генерациях смс запрещено использовать страдательный залог.\n"
292
+ "10. В генерациях смс запрещено использовать порядковые числительные от 10 прописью.\n"
293
+ "11. В генерациях смс запрещено использовать цепочки с придаточными предложениями.\n"
294
+ "12. В генерациях смс запрещено использовать разделительные повторяющиеся союзы.\n"
295
+ "13. В генерациях смс запрещено использовать вводные конструкции.\n"
296
+ "14. В генерациях смс запрещено использовать усилители.\n"
297
+ "15. В генерациях смс запрещено использовать паразиты времени.\n"
298
+ "16. В генерациях смс запрещено использовать несколько существительных подряд, в том числе отглагольных.\n"
299
+ "17. В генерациях смс запрещено использовать производные предлоги.\n"
300
+ "18. В генерациях смс запрещено использовать сложные предложения, в которых нет связи между частями.\n"
301
+ "19. В генерациях смс запрещено использовать сложноподчинённые предложения.\n"
302
+ "20. В генерациях смс запрещено использовать даты прописью.\n"
303
+ "21. В генерациях смс запрещено использовать близкие по смыслу однородные члены.\n"
304
+ "22. В генерациях смс запрещено использовать шокирующие, экстравагантные, кликбейтные фразы.\n"
305
+ "23. В генерациях смс запрещено использовать абстрактные заявления без поддержки фактами и отсутствие доказательства пользы для клиента.\n"
306
+ "24. В генерациях смс запрещено использовать гарантирующие фразы.\n"
307
+ "25. В генерациях смс запрещено использовать узкоспециализированные термины.\n"
308
+ "26. В генерациях смс запрещено использовать фразы, способные создать двойственное ощущение, обидеть.\n"
309
+ "27. В генерациях смс запрещено использовать речевые клише, рекламные штампы, канцеляризмы.\n"
310
+ "28. В генерациях смс запрещено использовать запрещенные слова: № один, номер один, № 1, вкусный, дешёвый, продукт, спам, банкротство, долги, займ, срочно, лучший, главный, номер 1, успех, лидер.\n"
311
+ "29. Сообщение должно быть написано без орфографических и грамматических ошибок.\n"
312
+ "30. Запрещены повторы слов.\n"
313
+ "31. В тексте должны использоваться правильные знаки препинания.\n"
314
+ "32. Если в тексте используются кавычки, они должны быть в форме «кавычки-ёлочки».\n"
315
+ "33. В тексте SMS сообщения должны обязательно присутствовать: название продукта, условия использования продукта / Преимущества продукта / Шаги для подключения или начала использования / Условия акции (если предложение по продукту акционное).\n"
316
+ "Форма ответа: [Ответ должен быть кратким, должен содержать только рекомендации по устранению найденных несоответствий, соответствия каждому пункту правил описывать категорически запрещено]."
317
+ )
318
+ return prompt
319
+
320
 
321
+ # Функция для выполнения проверки текста с использованием yield
322
+ def check_errors_with_yield(*personalized_messages):
323
+ if len(personalized_messages) < 4:
324
+ yield "", "", "", "", "", "Ошибка: недостаточно сообщений для проверки"
325
+ return
326
+
327
+ error_check_prompt = generate_error_check_prompt()
328
+ yield error_check_prompt, "", "", "", "", "Промпт для проверки текста сгенерирован"
329
+
330
+ error_message_gpt4o = perform_personalization(f"{error_check_prompt}\n\n{personalized_messages[0]}", "")
331
+ yield error_check_prompt, error_message_gpt4o, "", "", "", "Результат проверки GPT-4o сгенерирован"
332
+
333
+ error_message_gigachat_pro = perform_personalization_gigachat(f"{error_check_prompt}\n\n{personalized_messages[1]}", "", "gigachat_pro")
334
+ yield error_check_prompt, error_message_gpt4o, error_message_gigachat_pro, "", "", "Результат проверки GigaChat-Pro сгенерирован"
335
+
336
+ time.sleep(3)
337
+ error_message_gigachat_lite = perform_personalization_gigachat(f"{error_check_prompt}\n\n{personalized_messages[2]}", "", "gigachat_lite")
338
+ yield error_check_prompt, error_message_gpt4o, error_message_gigachat_pro, error_message_gigachat_lite, "", "Результат проверки GigaChat-Lite сгенерирован"
339
+
340
+ try:
341
+ time.sleep(3)
342
+ error_message_gigachat_plus = perform_personalization_gigachat(f"{error_check_prompt}\n\n{personalized_messages[3]}", "", "gigachat_plus")
343
+ except Exception as e:
344
+ error_message_gigachat_plus = f"Ошибка при обработке GigaChat-Plus: {e}"
345
+
346
+ yield error_check_prompt, error_message_gpt4o, error_message_gigachat_pro, error_message_gigachat_lite, error_message_gigachat_plus, "Все результаты проверки сгенерированы"
347
 
 
348
 
 
349
  def save_to_github(personalized_message, model_name, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form):
350
+ # Собираем все данные в один словарь
351
  data_to_save = {
352
  "Модель": model_name,
353
  "Персонализированное сообщение": personalized_message,
 
364
  "Отрасль": industry,
365
  "ОПФ": legal_form
366
  }
367
+
368
+ # Преобразуем контент в JSON-строку и кодируем в base64
369
  file_content_encoded = base64.b64encode(json.dumps(data_to_save).encode()).decode()
370
+
371
+ # Параметры для GitHub API
372
  repo = "fruitpicker01/Storage_1"
373
  path = f"file_{int(time.time())}.json"
374
  url = f"https://api.github.com/repos/{repo}/contents/{path}"
 
380
  "message": f"Добавлен новый файл {path}",
381
  "content": file_content_encoded
382
  }
383
+
384
+ # Отправка POST-запроса на GitHub API для создания файла в репозитории
385
+ response = requests.put(url, headers=headers, data=json.dumps(data))
386
+
387
 
388
  # Создание интерфейса Gradio
389
  with gr.Blocks() as demo:
 
391
 
392
  with gr.Row():
393
  with gr.Column(scale=1):
 
 
394
  description_input = gr.Textbox(
395
+ label="Описание предложения (предзаполненный пример можно поменять на свой)",
396
+ lines=13,
397
+ value=(
398
+ "Необходимо предложить клиенту оформить дебетовую премиальную бизнес-карту Mastercard Preffered. "
399
+ "Обслуживание карты стоит 700 рублей в месяц, но клиент может пользоваться ей бесплатно. "
400
+ "Что необходимо сделать, чтобы воспользоваться предложением:\n"
401
+ "1. Оформить премиальную бизнес-карту в офисе банка или онлайн в интернет-банке СберБизнес.\n"
402
+ "2. Забрать карту.\n"
403
+ "3. В течение календарного месяца совершить по ней покупки на сумму от 100 000 рублей.\n"
404
+ "4. В течение следующего месяца пользоваться ей бесплатно."
405
+ )
406
  )
407
  advantages_input = gr.Textbox(
408
+ label="Преимущества (предзаполненный пример можно поменять на свой)",
409
+ lines=6,
410
+ value=(
411
+ "Предложение по бесплатному обслуживанию — бессрочное.\n"
412
+ "Оплата покупок без отчётов и платёжных поручений.\n"
413
+ "Платёжные документы без комиссии.\n"
414
+ "Лимиты на расходы сотрудников.\n"
415
+ "Мгновенные переводы на карты любых банков."
416
+ )
417
  )
 
418
  selections = []
419
  for feature in features.keys():
420
  selections.append(gr.Dropdown(choices=[None] + list(features[feature].keys()), label=f"Выберите {feature}"))
421
 
422
+ submit_btn = gr.Button("1. Создать неперсонализированное сообщение") # Оранжевая кнопка по умолчанию
423
 
424
  with gr.Column(scale=2):
425
+ prompt_display = gr.Textbox(label="Неперсонализированный промпт", lines=20, interactive=False)
426
  output_text_gpt4o = gr.Textbox(label="Неперсонализированное сообщение GPT-4o", lines=3, interactive=False)
427
  output_text_gigachat_pro = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Pro", lines=3, interactive=False)
428
  output_text_gigachat_lite = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite", lines=3, interactive=False)
429
+ output_text_gigachat_plus = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite+", lines=3, interactive=False)
430
+
431
  submit_btn.click(
432
+ generate_messages,
433
+ inputs=[description_input, advantages_input] + selections,
434
  outputs=[prompt_display, output_text_gpt4o, output_text_gigachat_pro, output_text_gigachat_lite, output_text_gigachat_plus]
435
  )
436
 
437
  with gr.Row():
438
+ personalize_btn = gr.Button("2. Выполнить персонализацию (нажимать только после кнопки 1)", elem_id="personalize_button")
439
+
440
+ with gr.Row():
441
+ personalize_btn.click(
442
+ personalize_messages_with_yield,
443
+ inputs=[output_text_gpt4o, output_text_gigachat_pro, output_text_gigachat_lite, output_text_gigachat_plus] + selections,
444
+ outputs=[
445
+ gr.Textbox(label="Промпт для персонализации", lines=6, interactive=False),
446
+ personalized_output_text_gpt4o := gr.Textbox(label="Персонализированное сообщение GPT-4o", lines=6, interactive=False),
447
+ personalized_output_text_gigachat_pro := gr.Textbox(label="Персонализированное сообщение GigaChat-Pro", lines=6, interactive=False),
448
+ personalized_output_text_gigachat_lite := gr.Textbox(label="Персонализированное сообщение GigaChat-Lite", lines=6, interactive=False),
449
+ personalized_output_text_gigachat_plus := gr.Textbox(label="Персонализированное сообщение GigaChat-Lite+", lines=6, interactive=False)
450
+ ]
451
+ )
452
 
453
  with gr.Row():
454
  gr.Markdown("*Комментарий (опционально):*")
 
464
  corrected_gigachat_lite = gr.Textbox(label="", lines=3)
465
  corrected_gigachat_plus = gr.Textbox(label="", lines=3)
466
 
467
+
468
+ # Отдельная строка для кнопок с использованием пустой колонки
469
  with gr.Row():
470
  gr.Button("Жми 👍 для сохранения удачного SMS в базу =>")
471
  save_gpt4o_btn = gr.Button("👍")
 
473
  save_gigachat_lite_btn = gr.Button("👍")
474
  save_gigachat_plus_btn = gr.Button("👍")
475
 
476
+ # Привязка кнопок к функциям сохранения
477
  save_gpt4o_btn.click(
478
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form:
479
  save_to_github(personalized_message, "GPT-4o", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form),
 
539
 
540
  save_gigachat_plus_btn.click(
541
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form:
542
+ save_to_github(personalized_message, "GigaChat-Lite+", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form),
543
  inputs=[
544
  personalized_output_text_gigachat_plus,
545
  comment_gigachat_plus,
 
558
  outputs=None
559
  )
560
 
561
+ # Использование сохраненных переменных в следующем блоке
562
+ with gr.Row():
563
+ check_errors_btn = gr.Button("3. Проверить текст (нажимать только после кнопки 2) - экспериментальная фича, качество пока крайне низкое", elem_id="check_errors_button")
564
+
565
+ with gr.Row():
566
+ check_errors_btn.click(
567
+ check_errors_with_yield,
568
+ inputs=[personalized_output_text_gpt4o, personalized_output_text_gigachat_pro, personalized_output_text_gigachat_lite, personalized_output_text_gigachat_plus],
569
+ outputs=[
570
+ gr.Textbox(label="Промпт для проверки текста", lines=6, interactive=False),
571
+ gr.Textbox(label="Результат проверки GPT-4o", lines=6),
572
+ gr.Textbox(label="Результат проверки GigaChat-Pro", lines=6),
573
+ gr.Textbox(label="Результат проверки GigaChat-Lite", lines=6),
574
+ gr.Textbox(label="Результат проверки GigaChat-Lite+", lines=6)
575
+ ]
576
+ )
577
+
578
+
579
  demo.launch()