fruitpicker01 commited on
Commit
263c6bc
·
verified ·
1 Parent(s): e2adfdb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +173 -97
app.py CHANGED
@@ -75,15 +75,8 @@ def generate_standard_prompt(description, advantages, *selected_values):
75
  )
76
  return prompt
77
 
78
- # Функции для генерации сообщений с попытками перегенерации
79
- def generate_message_gpt4o_with_retry(prompt, temperature):
80
- for _ in range(10): # Максимум 10 попыток
81
- message = generate_message_gpt4o(prompt, temperature)
82
- if len(message) <= 250:
83
- return message
84
- return message # Возвращаем последнее сгенерированное сообщение, если все попытки не удались
85
-
86
- def generate_message_gpt4o(prompt, temperature):
87
  try:
88
  headers = {
89
  "Content-Type": "application/json",
@@ -92,8 +85,7 @@ def generate_message_gpt4o(prompt, temperature):
92
  data = {
93
  "model": "chatgpt-4o-latest",
94
  "messages": [{"role": "system", "content": prompt}],
95
- "max_tokens": 101,
96
- "temperature": temperature
97
  }
98
  response = requests.post("https://api.openai.com/v1/chat/completions", json=data, headers=headers)
99
  response_data = response.json()
@@ -102,70 +94,74 @@ def generate_message_gpt4o(prompt, temperature):
102
  return f"Ошибка при обращении к ChatGPT-4o-Latest: {e}"
103
 
104
  def clean_message(message):
 
105
  if not message.endswith(('.', '!', '?')):
106
  last_period = message.rfind('.')
107
  if last_period != -1:
108
  message = message[:last_period + 1]
109
  return message
110
 
111
- def generate_message_gigachat_pro_with_retry(prompt, temperature):
112
- for _ in range(10):
113
- message = generate_message_gigachat_pro(prompt, temperature)
114
- if len(message) <= 250:
115
- return message
116
- return message
117
-
118
- def generate_message_gigachat_pro(prompt, temperature):
119
  try:
120
  messages = [SystemMessage(content=prompt)]
121
- chat_pro.max_tokens = 68
122
- chat_pro.temperature = temperature
123
  res = chat_pro(messages)
124
  cleaned_message = clean_message(res.content.strip())
125
  return cleaned_message
126
  except Exception as e:
127
  return f"Ошибка при обращении к GigaChat-Pro: {e}"
128
 
129
- def generate_message_gigachat_lite_with_retry(prompt, temperature):
130
- for _ in range(10):
131
- message = generate_message_gigachat_lite(prompt, temperature)
132
- if len(message) <= 250:
133
- return message
134
- return message
135
-
136
- def generate_message_gigachat_lite(prompt, temperature):
137
  try:
138
  time.sleep(2)
139
  messages = [SystemMessage(content=prompt)]
140
- chat_lite.max_tokens = 68
141
- chat_lite.temperature = temperature
142
  res = chat_lite(messages)
143
  cleaned_message = clean_message(res.content.strip())
144
  return cleaned_message
145
  except Exception as e:
146
  return f"Ошибка при обращении к GigaChat-Lite: {e}"
147
 
148
- def generate_message_gigachat_plus_with_retry(prompt, temperature):
149
- for _ in range(10):
150
- message = generate_message_gigachat_plus(prompt, temperature)
151
- if len(message) <= 250:
152
- return message
153
- return message
154
-
155
- def generate_message_gigachat_plus(prompt, temperature):
156
  try:
157
  time.sleep(2)
158
  messages = [SystemMessage(content=prompt)]
159
- chat_plus.max_tokens = 68
160
- chat_plus.temperature = temperature
161
  res = chat_plus(messages)
162
  cleaned_message = clean_message(res.content.strip())
163
  return cleaned_message
164
  except Exception as e:
165
  return f"Ошибка при обращении к GigaChat-Plus: {e}"
166
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
  # Обновляем генерацию сообщений для отображения в интерфейсе
168
- def generate_messages(description, advantages, gpt4o_temperature, gigachat_pro_temperature, gigachat_lite_temperature, gigachat_plus_temperature, *selected_values):
169
  standard_prompt = generate_standard_prompt(description, advantages, *selected_values)
170
 
171
  results = {
@@ -178,26 +174,26 @@ def generate_messages(description, advantages, gpt4o_temperature, gigachat_pro_t
178
 
179
  yield results["prompt"], "", "", "", "", "Генерация стандартного промпта завершена"
180
 
181
- results["gpt4o"] = generate_message_gpt4o_with_retry(standard_prompt, gpt4o_temperature)
182
  gpt4o_length = len(results["gpt4o"])
183
  gpt4o_display = f"{results['gpt4o']}\n\n------\nКоличество знаков: {gpt4o_length}"
184
  yield results["prompt"], gpt4o_display, "", "", "", "Сообщение GPT-4o сгенерировано"
185
 
186
- results["gigachat_pro"] = generate_message_gigachat_pro_with_retry(standard_prompt, gigachat_pro_temperature)
187
  gigachat_pro_length = len(results["gigachat_pro"])
188
  gigachat_pro_display = f"{results['gigachat_pro']}\n\n------\nКоличество знаков: {gigachat_pro_length}"
189
  yield results["prompt"], gpt4o_display, gigachat_pro_display, "", "", "Сообщение GigaChat-Pro сгенерировано"
190
 
191
  time.sleep(2)
192
-
193
- results["gigachat_lite"] = generate_message_gigachat_lite_with_retry(standard_prompt, gigachat_lite_temperature)
194
  gigachat_lite_length = len(results["gigachat_lite"])
195
  gigachat_lite_display = f"{results['gigachat_lite']}\n\n------\nКоличество знаков: {gigachat_lite_length}"
196
  yield results["prompt"], gpt4o_display, gigachat_pro_display, gigachat_lite_display, "", "Сообщение GigaChat-Lite сгенерировано"
197
 
198
  time.sleep(2)
199
-
200
- results["gigachat_plus"] = generate_message_gigachat_plus_with_retry(standard_prompt, gigachat_plus_temperature)
201
  gigachat_plus_length = len(results["gigachat_plus"])
202
  gigachat_plus_display = f"{results['gigachat_plus']}\n\n------\nКоличество знаков: {gigachat_plus_length}"
203
  yield results["prompt"], gpt4o_display, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, "Все сообщения сгенерированы"
@@ -205,6 +201,7 @@ def generate_messages(description, advantages, gpt4o_temperature, gigachat_pro_t
205
  return results
206
 
207
 
 
208
  # Функция для генерации персонализированного промпта
209
  def generate_personalization_prompt(*selected_values):
210
  prompt = "Адаптируй, не превышая длину сообщения в 250 знаков с пробелами, текст с учетом следующих особенностей:\n"
@@ -222,46 +219,134 @@ def generate_personalization_prompt(*selected_values):
222
  # Функция для выполнения персонализации на основе сгенерированного промпта и сообщения
223
  def perform_personalization(standard_message, personalization_prompt):
224
  full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
225
- return generate_message_gpt4o_with_retry(full_prompt, 1.0) # Заменяем функцию на ту, что поддерживает повторные генерации
226
 
227
  # Также обновляем функции персонализации
228
- def perform_personalization_gigachat(standard_message, personalization_prompt, model, temperature):
229
  full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
230
  if model == "gigachat_pro":
231
- return generate_message_gigachat_pro_with_retry(full_prompt, temperature)
232
  elif model == "gigachat_lite":
233
- return generate_message_gigachat_lite_with_retry(full_prompt, temperature)
234
  elif model == "gigachat_plus":
235
- return generate_message_gigachat_plus_with_retry(full_prompt, temperature)
236
- return "Ошибка: Неверная модель GigaChat."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
237
 
238
  # Обновляем блок персонализации
239
- def personalize_messages_with_yield(gpt4o_message, gigachat_pro_message, gigachat_lite_message, gigachat_plus_message, gpt4o_temperature, gigachat_pro_temperature, gigachat_lite_temperature, gigachat_plus_temperature, *selected_values):
240
  personalization_prompt = generate_personalization_prompt(*selected_values)
241
  yield personalization_prompt, "", "", "", "", "Промпт для персонализации сгенерирован"
242
 
243
- personalized_message_gpt4o = perform_personalization(gpt4o_message, personalization_prompt)
244
  gpt4o_length = len(personalized_message_gpt4o)
245
  gpt4o_display = f"{personalized_message_gpt4o}\n\n------\nКоличество знаков: {gpt4o_length}"
246
  yield personalization_prompt, gpt4o_display, "", "", "", "Персонализированное сообщение GPT-4o сгенерировано"
247
 
248
- personalized_message_gigachat_pro = perform_personalization_gigachat(gigachat_pro_message, personalization_prompt, "gigachat_pro", gigachat_pro_temperature)
249
  gigachat_pro_length = len(personalized_message_gigachat_pro)
250
  gigachat_pro_display = f"{personalized_message_gigachat_pro}\n\n------\nКоличество знаков: {gigachat_pro_length}"
251
  yield personalization_prompt, gpt4o_display, gigachat_pro_display, "", "", "Персонализированное сообщение GigaChat-Pro сгенерировано"
252
 
253
- personalized_message_gigachat_lite = perform_personalization_gigachat(gigachat_lite_message, personalization_prompt, "gigachat_lite", gigachat_lite_temperature)
254
  gigachat_lite_length = len(personalized_message_gigachat_lite)
255
  gigachat_lite_display = f"{personalized_message_gigachat_lite}\n\n------\nКоличество знаков: {gigachat_lite_length}"
256
  yield personalization_prompt, gpt4o_display, gigachat_pro_display, gigachat_lite_display, "", "Персонализированное сообщение GigaChat-Lite сгенерировано"
257
 
258
- personalized_message_gigachat_plus = perform_personalization_gigachat(gigachat_plus_message, personalization_prompt, "gigachat_plus", gigachat_plus_temperature)
259
  gigachat_plus_length = len(personalized_message_gigachat_plus)
260
  gigachat_plus_display = f"{personalized_message_gigachat_plus}\n\n------\nКоличество знаков: {gigachat_plus_length}"
261
  yield personalization_prompt, gpt4o_display, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, "Все персонализированные сообщения сгенерированы"
262
 
263
- # Обновляем функцию сохранения в GitHub с добавлением температуры
264
- 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, temperature):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
265
  # Собираем все данные в один словарь
266
  data_to_save = {
267
  "Модель": model_name,
@@ -277,8 +362,7 @@ def save_to_github(personalized_message, model_name, comment, corrected_message,
277
  "Психотип": psychotype,
278
  "Стадия бизнеса": business_stage,
279
  "Отрасль": industry,
280
- "ОПФ": legal_form,
281
- "Температура": temperature # Добавляем температуру в сохраненные данные
282
  }
283
 
284
  # Преобразуем контент в JSON-строку и кодируем в base64
@@ -300,19 +384,13 @@ def save_to_github(personalized_message, model_name, comment, corrected_message,
300
  # Отправка POST-запроса на GitHub API для создания файла в репозитории
301
  response = requests.put(url, headers=headers, data=json.dumps(data))
302
 
 
303
  # Создание интерфейса Gradio
304
  with gr.Blocks() as demo:
305
  gr.Markdown("# Генерация SMS-сообщений по заданным признакам")
306
-
307
  with gr.Row():
308
  with gr.Column(scale=1):
309
- # Добавляем слайдеры для установки параметра температуры для каждой модели
310
- gpt4o_temperature = gr.Slider(label="GPT-4o: temperature", minimum=0, maximum=2, step=0.01, value=1)
311
- gigachat_pro_temperature = gr.Slider(label="GigaChat-Pro: temperature", minimum=0, maximum=1.7, step=0.01, value=0.87)
312
- gigachat_lite_temperature = gr.Slider(label="GigaChat-Lite: temperature", minimum=0, maximum=1.7, step=0.01, value=0.87)
313
- gigachat_plus_temperature = gr.Slider(label="GigaChat-Plus: temperature", minimum=0, maximum=1.7, step=0.01, value=0.87)
314
-
315
- with gr.Column(scale=2):
316
  description_input = gr.Textbox(
317
  label="Описание предложения (предзаполненный пример можно поменять на свой)",
318
  lines=13,
@@ -341,34 +419,34 @@ with gr.Blocks() as demo:
341
  for feature in features.keys():
342
  selections.append(gr.Dropdown(choices=[None] + list(features[feature].keys()), label=f"Выберите {feature}"))
343
 
344
- submit_btn = gr.Button("1. Создать неперсонализированное сообщение")
345
 
346
  with gr.Column(scale=2):
347
  prompt_display = gr.Textbox(label="Неперсонализированный промпт", lines=20, interactive=False)
348
  output_text_gpt4o = gr.Textbox(label="Неперсонализированное сообщение GPT-4o", lines=3, interactive=False)
349
  output_text_gigachat_pro = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Pro", lines=3, interactive=False)
350
  output_text_gigachat_lite = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite", lines=3, interactive=False)
351
- output_text_gigachat_plus = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Plus", lines=3, interactive=False)
352
-
353
  submit_btn.click(
354
- generate_messages,
355
- inputs=[description_input, advantages_input, gpt4o_temperature, gigachat_pro_temperature, gigachat_lite_temperature, gigachat_plus_temperature] + selections,
356
  outputs=[prompt_display, output_text_gpt4o, output_text_gigachat_pro, output_text_gigachat_lite, output_text_gigachat_plus]
357
  )
358
 
359
  with gr.Row():
360
  personalize_btn = gr.Button("2. Выполнить персонализацию (нажимать только после кнопки 1)", elem_id="personalize_button")
361
-
362
  with gr.Row():
363
  personalize_btn.click(
364
  personalize_messages_with_yield,
365
- inputs=[output_text_gpt4o, output_text_gigachat_pro, output_text_gigachat_lite, output_text_gigachat_plus, gpt4o_temperature, gigachat_pro_temperature, gigachat_lite_temperature, gigachat_plus_temperature] + selections,
366
  outputs=[
367
  gr.Textbox(label="Промпт для персонализации", lines=6, interactive=False),
368
  personalized_output_text_gpt4o := gr.Textbox(label="Персонализированное сообщение GPT-4o", lines=6, interactive=False),
369
  personalized_output_text_gigachat_pro := gr.Textbox(label="Персонализированное сообщение GigaChat-Pro", lines=6, interactive=False),
370
  personalized_output_text_gigachat_lite := gr.Textbox(label="Персонализированное сообщение GigaChat-Lite", lines=6, interactive=False),
371
- personalized_output_text_gigachat_plus := gr.Textbox(label="Персонализированное сообщение GigaChat-Plus", lines=6, interactive=False)
372
  ]
373
  )
374
 
@@ -386,6 +464,7 @@ with gr.Blocks() as demo:
386
  corrected_gigachat_lite = gr.Textbox(label="", lines=3)
387
  corrected_gigachat_plus = gr.Textbox(label="", lines=3)
388
 
 
389
  # Отдельная строка для кнопок с использованием пустой колонки
390
  with gr.Row():
391
  gr.Button("Жми 👍 для сохранения удачного SMS в базу =>")
@@ -396,8 +475,8 @@ with gr.Blocks() as demo:
396
 
397
  # Привязка кнопок к функциям сохранения
398
  save_gpt4o_btn.click(
399
- fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form, temperature:
400
- 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, temperature),
401
  inputs=[
402
  personalized_output_text_gpt4o,
403
  comment_gpt4o,
@@ -411,15 +490,14 @@ with gr.Blocks() as demo:
411
  selections[2], # Психотип
412
  selections[3], # Стадия бизнеса
413
  selections[4], # Отрасль
414
- selections[5], # ОПФ
415
- gpt4o_temperature # Температура
416
  ],
417
  outputs=None
418
  )
419
 
420
  save_gigachat_pro_btn.click(
421
- fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form, temperature:
422
- save_to_github(personalized_message, "GigaChat-Pro", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form, temperature),
423
  inputs=[
424
  personalized_output_text_gigachat_pro,
425
  comment_gigachat_pro,
@@ -433,15 +511,14 @@ with gr.Blocks() as demo:
433
  selections[2], # Психотип
434
  selections[3], # Стадия бизнеса
435
  selections[4], # Отрасль
436
- selections[5], # ОПФ
437
- gigachat_pro_temperature # Температура
438
  ],
439
  outputs=None
440
  )
441
 
442
  save_gigachat_lite_btn.click(
443
- fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form, temperature:
444
- 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, temperature),
445
  inputs=[
446
  personalized_output_text_gigachat_lite,
447
  comment_gigachat_lite,
@@ -455,15 +532,14 @@ with gr.Blocks() as demo:
455
  selections[2], # Психотип
456
  selections[3], # Стадия бизнеса
457
  selections[4], # Отрасль
458
- selections[5], # ОПФ
459
- gigachat_lite_temperature # Температура
460
  ],
461
  outputs=None
462
  )
463
 
464
  save_gigachat_plus_btn.click(
465
- fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form, temperature:
466
- 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, temperature),
467
  inputs=[
468
  personalized_output_text_gigachat_plus,
469
  comment_gigachat_plus,
@@ -477,12 +553,12 @@ with gr.Blocks() as demo:
477
  selections[2], # Психотип
478
  selections[3], # Стадия бизнеса
479
  selections[4], # Отрасль
480
- selections[5], # ОПФ
481
- gigachat_plus_temperature # Температура
482
  ],
483
  outputs=None
484
  )
485
 
 
486
  with gr.Row():
487
  check_errors_btn = gr.Button("3. Проверить текст (нажимать только после кнопки 2) - экспериментальная фича, качество пока крайне низкое", elem_id="check_errors_button")
488
 
@@ -495,9 +571,9 @@ with gr.Blocks() as demo:
495
  gr.Textbox(label="Результат проверки GPT-4o", lines=6),
496
  gr.Textbox(label="Результат проверки GigaChat-Pro", lines=6),
497
  gr.Textbox(label="Результат проверки GigaChat-Lite", lines=6),
498
- gr.Textbox(label="Результат проверки GigaChat-Plus", lines=6)
499
  ]
500
  )
501
 
502
- demo.launch()
503
 
 
 
75
  )
76
  return prompt
77
 
78
+ # Функции для генерации сообщений
79
+ def generate_message_gpt4o(prompt):
 
 
 
 
 
 
 
80
  try:
81
  headers = {
82
  "Content-Type": "application/json",
 
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()
 
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 = {
 
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, "Все сообщения сгенерированы"
 
201
  return results
202
 
203
 
204
+
205
  # Функция для генерации персонализированного промпта
206
  def generate_personalization_prompt(*selected_values):
207
  prompt = "Адаптируй, не превышая длину сообщения в 250 знаков с пробелами, текст с учетом следующих особенностей:\n"
 
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,
 
362
  "Психотип": psychotype,
363
  "Стадия бизнеса": business_stage,
364
  "Отрасль": industry,
365
+ "ОПФ": legal_form
 
366
  }
367
 
368
  # Преобразуем контент в JSON-строку и кодируем в base64
 
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:
390
  gr.Markdown("# Генерация SMS-сообщений по заданным признакам")
391
+
392
  with gr.Row():
393
  with gr.Column(scale=1):
 
 
 
 
 
 
 
394
  description_input = gr.Textbox(
395
  label="Описание предложения (предзаполненный пример можно поменять на свой)",
396
  lines=13,
 
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
 
 
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 в базу =>")
 
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),
480
  inputs=[
481
  personalized_output_text_gpt4o,
482
  comment_gpt4o,
 
490
  selections[2], # Психотип
491
  selections[3], # Стадия бизнеса
492
  selections[4], # Отрасль
493
+ selections[5] # ОПФ
 
494
  ],
495
  outputs=None
496
  )
497
 
498
  save_gigachat_pro_btn.click(
499
+ fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form:
500
+ save_to_github(personalized_message, "GigaChat-Pro", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form),
501
  inputs=[
502
  personalized_output_text_gigachat_pro,
503
  comment_gigachat_pro,
 
511
  selections[2], # Психотип
512
  selections[3], # Стадия бизнеса
513
  selections[4], # Отрасль
514
+ selections[5] # ОПФ
 
515
  ],
516
  outputs=None
517
  )
518
 
519
  save_gigachat_lite_btn.click(
520
+ fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form:
521
+ 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),
522
  inputs=[
523
  personalized_output_text_gigachat_lite,
524
  comment_gigachat_lite,
 
532
  selections[2], # Психотип
533
  selections[3], # Стадия бизнеса
534
  selections[4], # Отрасль
535
+ selections[5] # ОПФ
 
536
  ],
537
  outputs=None
538
  )
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,
 
553
  selections[2], # Психотип
554
  selections[3], # Стадия бизнеса
555
  selections[4], # Отрасль
556
+ selections[5] # ОПФ
 
557
  ],
558
  outputs=None
559
  )
560
 
561
+ # Использование сохраненных переменных в следующем блоке
562
  with gr.Row():
563
  check_errors_btn = gr.Button("3. Проверить текст (нажимать только после кнопки 2) - экспериментальная фича, качество пока крайне низкое", elem_id="check_errors_button")
564
 
 
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()