fruitpicker01 commited on
Commit
8a95b50
·
verified ·
1 Parent(s): 28a8355

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +88 -176
app.py CHANGED
@@ -14,9 +14,10 @@ openai_api_key = os.getenv('GPT_KEY')
14
  gc_key = os.getenv('GC_KEY')
15
  token = os.getenv('GITHUB_TOKEN')
16
 
17
- def authenticate_gigachat(model, max_tokens, temperature):
18
- return GigaChat(credentials=gc_key, model=model, max_tokens=max_tokens, temperature=temperature, verify_ssl_certs=False)
19
-
 
20
 
21
  # Загрузка данных из Excel-файла
22
  try:
@@ -74,7 +75,14 @@ def generate_standard_prompt(description, advantages, *selected_values):
74
  )
75
  return prompt
76
 
77
- # Функции для генерации сообщений
 
 
 
 
 
 
 
78
  def generate_message_gpt4o(prompt, temperature):
79
  try:
80
  headers = {
@@ -82,62 +90,24 @@ def generate_message_gpt4o(prompt, temperature):
82
  "Authorization": f"Bearer {openai_api_key}"
83
  }
84
  data = {
85
- "model": "chatgpt-4o-latest", # убедитесь, что модель корректна
86
  "messages": [{"role": "system", "content": prompt}],
87
  "max_tokens": 101,
88
  "temperature": temperature
89
  }
90
  response = requests.post("https://api.openai.com/v1/chat/completions", json=data, headers=headers)
91
  response_data = response.json()
92
-
93
- # Проверка на наличие ошибок в ответе
94
- if response.status_code != 200:
95
- return f"Ошибка от OpenAI: {response_data.get('error', {}).get('message', 'Неизвестная ошибка')}"
96
-
97
- # Проверка наличия поля 'choices' в ответе
98
- if "choices" in response_data and len(response_data["choices"]) > 0:
99
- return clean_message(response_data["choices"][0]["message"]["content"].strip())
100
- else:
101
- return "Ошибка: ответ от API не содержит необходимых данных."
102
  except Exception as e:
103
  return f"Ошибка при обращении к ChatGPT-4o-Latest: {e}"
104
 
105
-
106
  def clean_message(message):
107
- # Если сообщение не заканчивается на точку или восклицательный знак, обрезаем его до последней точки
108
  if not message.endswith(('.', '!', '?')):
109
  last_period = message.rfind('.')
110
  if last_period != -1:
111
  message = message[:last_period + 1]
112
  return message
113
 
114
- # Обновленные функции генерации сообщений с учетом обрезки незаконченных предложений
115
- def generate_message_gigachat_pro(prompt, temperature):
116
- messages = [SystemMessage(content=prompt)]
117
- chat_pro = authenticate_gigachat('GigaChat-Pro', 68, temperature)
118
- res = chat_pro(messages)
119
- return clean_message(res.content.strip())
120
-
121
- def generate_message_gigachat_lite(prompt, temperature):
122
- messages = [SystemMessage(content=prompt)]
123
- chat_lite = authenticate_gigachat('GigaChat', 68, temperature)
124
- res = chat_lite(messages)
125
- return clean_message(res.content.strip())
126
-
127
- def generate_message_gigachat_plus(prompt, temperature):
128
- messages = [SystemMessage(content=prompt)]
129
- chat_plus = authenticate_gigachat('GigaChat-Plus', 68, temperature)
130
- res = chat_plus(messages)
131
- return clean_message(res.content.strip())
132
-
133
-
134
- def generate_message_gpt4o_with_retry(prompt, temperature):
135
- for _ in range(10): # Максимум 10 попыток
136
- message = generate_message_gpt4o(prompt, temperature)
137
- if len(message) <= 250:
138
- return message
139
- return message # Возвращаем последнее сгенерированное сообщение, если все попытки не удались
140
-
141
  def generate_message_gigachat_pro_with_retry(prompt, temperature):
142
  for _ in range(10):
143
  message = generate_message_gigachat_pro(prompt, temperature)
@@ -145,6 +115,17 @@ def generate_message_gigachat_pro_with_retry(prompt, temperature):
145
  return message
146
  return message
147
 
 
 
 
 
 
 
 
 
 
 
 
148
  def generate_message_gigachat_lite_with_retry(prompt, temperature):
149
  for _ in range(10):
150
  message = generate_message_gigachat_lite(prompt, temperature)
@@ -152,6 +133,18 @@ def generate_message_gigachat_lite_with_retry(prompt, temperature):
152
  return message
153
  return message
154
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  def generate_message_gigachat_plus_with_retry(prompt, temperature):
156
  for _ in range(10):
157
  message = generate_message_gigachat_plus(prompt, temperature)
@@ -159,6 +152,18 @@ def generate_message_gigachat_plus_with_retry(prompt, temperature):
159
  return message
160
  return message
161
 
 
 
 
 
 
 
 
 
 
 
 
 
162
  # Обновляем генерацию сообщений для отображения в интерфейсе
163
  def generate_messages(description, advantages, gpt4o_temperature, gigachat_pro_temperature, gigachat_lite_temperature, gigachat_plus_temperature, *selected_values):
164
  standard_prompt = generate_standard_prompt(description, advantages, *selected_values)
@@ -183,15 +188,20 @@ def generate_messages(description, advantages, gpt4o_temperature, gigachat_pro_t
183
  gigachat_pro_display = f"{results['gigachat_pro']}\n\n------\nКоличество знаков: {gigachat_pro_length}"
184
  yield results["prompt"], gpt4o_display, gigachat_pro_display, "", "", "Сообщение GigaChat-Pro сгенерировано"
185
 
186
- time.sleep(2)
187
 
 
 
 
 
 
188
  results["gigachat_lite"] = generate_message_gigachat_lite_with_retry(standard_prompt, gigachat_lite_temperature)
189
  gigachat_lite_length = len(results["gigachat_lite"])
190
  gigachat_lite_display = f"{results['gigachat_lite']}\n\n------\nКоличество знаков: {gigachat_lite_length}"
191
  yield results["prompt"], gpt4o_display, gigachat_pro_display, gigachat_lite_display, "", "Сообщение GigaChat-Lite сгенерировано"
192
 
193
  time.sleep(2)
194
-
195
  results["gigachat_plus"] = generate_message_gigachat_plus_with_retry(standard_prompt, gigachat_plus_temperature)
196
  gigachat_plus_length = len(results["gigachat_plus"])
197
  gigachat_plus_display = f"{results['gigachat_plus']}\n\n------\nКоличество знаков: {gigachat_plus_length}"
@@ -217,135 +227,45 @@ def generate_personalization_prompt(*selected_values):
217
  # Функция для выполнения персонализации на основе сгенерированного промпта и сообщения
218
  def perform_personalization(standard_message, personalization_prompt):
219
  full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
220
- return generate_message_gpt4o(full_prompt)
221
 
222
  # Также обновляем функции персонализации
223
- def perform_personalization_gigachat(standard_message, personalization_prompt, model):
224
  full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
225
  if model == "gigachat_pro":
226
- result = generate_message_gigachat_pro(full_prompt)
227
  elif model == "gigachat_lite":
228
- result = generate_message_gigachat_lite(full_prompt)
229
  elif model == "gigachat_plus":
230
- result = generate_message_gigachat_plus(full_prompt)
231
- return clean_message(result)
232
-
233
-
234
- def perform_personalization_with_retry(standard_message, personalization_prompt):
235
- for _ in range(10): # Максимум 10 попыток
236
- message = perform_personalization(standard_message, personalization_prompt)
237
- if len(message) <= 250:
238
- return message
239
- return message # Возвращаем последнее сгенерированное сообщение, если все попытки не удались
240
-
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]}", error_check_prompt)
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]}", error_check_prompt, "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]}", error_check_prompt, "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, temperature):
350
  # Собираем все данные в один словарь
351
  data_to_save = {
@@ -385,20 +305,19 @@ def save_to_github(personalized_message, model_name, comment, corrected_message,
385
  # Отправка POST-запроса на GitHub API для создания файла в репозитории
386
  response = requests.put(url, headers=headers, data=json.dumps(data))
387
 
388
-
389
  # Создание интерфейса Gradio
390
  with gr.Blocks() as demo:
391
  gr.Markdown("# Генерация SMS-сообщений по заданным признакам")
392
-
393
- with gr.Column(scale=1):
394
- # Добавляем слайдеры для установки параметра температуры для каждой модели
395
- gpt4o_temperature = gr.Slider(label="GPT-4o: temperature", minimum=0, maximum=2, step=0.01, value=1)
396
- gigachat_pro_temperature = gr.Slider(label="GigaChat-Pro: temperature", minimum=0, maximum=1.7, step=0.01, value=0.87)
397
- gigachat_lite_temperature = gr.Slider(label="GigaChat-Lite: temperature", minimum=0, maximum=1.7, step=0.01, value=0.87)
398
- gigachat_plus_temperature = gr.Slider(label="GigaChat-Plus: temperature", minimum=0, maximum=1.7, step=0.01, value=0.87)
399
 
400
  with gr.Row():
401
  with gr.Column(scale=1):
 
 
 
 
 
 
 
402
  description_input = gr.Textbox(
403
  label="Описание предложения (предзаполненный пример можно поменять на свой)",
404
  lines=13,
@@ -427,34 +346,34 @@ with gr.Blocks() as demo:
427
  for feature in features.keys():
428
  selections.append(gr.Dropdown(choices=[None] + list(features[feature].keys()), label=f"Выберите {feature}"))
429
 
430
- submit_btn = gr.Button("1. Создать неперсонализированное сообщение") # Оранжевая кнопка по умолчанию
431
 
432
  with gr.Column(scale=2):
433
  prompt_display = gr.Textbox(label="Неперсонализированный промпт", lines=20, interactive=False)
434
  output_text_gpt4o = gr.Textbox(label="Неперсонализированное сообщение GPT-4o", lines=3, interactive=False)
435
  output_text_gigachat_pro = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Pro", lines=3, interactive=False)
436
  output_text_gigachat_lite = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite", lines=3, interactive=False)
437
- output_text_gigachat_plus = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite+", lines=3, interactive=False)
438
-
439
  submit_btn.click(
440
- generate_messages,
441
- inputs=[description_input, advantages_input] + selections,
442
  outputs=[prompt_display, output_text_gpt4o, output_text_gigachat_pro, output_text_gigachat_lite, output_text_gigachat_plus]
443
  )
444
 
445
  with gr.Row():
446
  personalize_btn = gr.Button("2. Выполнить персонализацию (нажимать только после кнопки 1)", elem_id="personalize_button")
447
-
448
  with gr.Row():
449
  personalize_btn.click(
450
  personalize_messages_with_yield,
451
- inputs=[output_text_gpt4o, output_text_gigachat_pro, output_text_gigachat_lite, output_text_gigachat_plus] + selections,
452
  outputs=[
453
  gr.Textbox(label="Промпт для персонализации", lines=6, interactive=False),
454
  personalized_output_text_gpt4o := gr.Textbox(label="Персонализированное сообщение GPT-4o", lines=6, interactive=False),
455
  personalized_output_text_gigachat_pro := gr.Textbox(label="Персонализированное сообщение GigaChat-Pro", lines=6, interactive=False),
456
  personalized_output_text_gigachat_lite := gr.Textbox(label="Персонализированное сообщение GigaChat-Lite", lines=6, interactive=False),
457
- personalized_output_text_gigachat_plus := gr.Textbox(label="Персонализированное сообщение GigaChat-Lite+", lines=6, interactive=False)
458
  ]
459
  )
460
 
@@ -472,7 +391,6 @@ with gr.Blocks() as demo:
472
  corrected_gigachat_lite = gr.Textbox(label="", lines=3)
473
  corrected_gigachat_plus = gr.Textbox(label="", lines=3)
474
 
475
-
476
  # Отдельная строка для кнопок с использованием пустой колонки
477
  with gr.Row():
478
  gr.Button("Жми 👍 для сохранения удачного SMS в базу =>")
@@ -483,7 +401,7 @@ with gr.Blocks() as demo:
483
 
484
  # Привязка кнопок к функциям сохранения
485
  save_gpt4o_btn.click(
486
- fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form, temperature:
487
  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),
488
  inputs=[
489
  personalized_output_text_gpt4o,
@@ -504,8 +422,6 @@ with gr.Blocks() as demo:
504
  outputs=None
505
  )
506
 
507
-
508
- # Привязка кнопок к функциям сохранения для GigaChat-Pro
509
  save_gigachat_pro_btn.click(
510
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form, temperature:
511
  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),
@@ -527,8 +443,7 @@ with gr.Blocks() as demo:
527
  ],
528
  outputs=None
529
  )
530
-
531
- # Привязка кнопок к функциям сохранения для GigaChat-Lite
532
  save_gigachat_lite_btn.click(
533
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form, temperature:
534
  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),
@@ -550,8 +465,7 @@ with gr.Blocks() as demo:
550
  ],
551
  outputs=None
552
  )
553
-
554
- # Привязка кнопок к функциям сохранения для GigaChat-Plus
555
  save_gigachat_plus_btn.click(
556
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form, temperature:
557
  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),
@@ -574,8 +488,6 @@ with gr.Blocks() as demo:
574
  outputs=None
575
  )
576
 
577
-
578
- # Использование сохраненных переменных в следующем блоке
579
  with gr.Row():
580
  check_errors_btn = gr.Button("3. Проверить текст (нажимать только после кнопки 2) - экспериментальная фича, качество пока крайне низкое", elem_id="check_errors_button")
581
 
@@ -588,9 +500,9 @@ with gr.Blocks() as demo:
588
  gr.Textbox(label="Результат проверки GPT-4o", lines=6),
589
  gr.Textbox(label="Результат проверки GigaChat-Pro", lines=6),
590
  gr.Textbox(label="Результат проверки GigaChat-Lite", lines=6),
591
- gr.Textbox(label="Результат проверки GigaChat-Lite+", lines=6)
592
  ]
593
  )
594
 
 
595
 
596
- demo.launch()
 
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:
 
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 = {
 
90
  "Authorization": f"Bearer {openai_api_key}"
91
  }
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()
100
+ return response_data["choices"][0]["message"]["content"].strip()
 
 
 
 
 
 
 
 
 
101
  except Exception as e:
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)
 
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)
 
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)
 
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)
 
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.sleepI see that the message was cut off, so I’ll continue from where it left off.
192
 
193
+ ### Обновленный код (продолжение):
194
+
195
+ ```python
196
+ time.sleep(2)
197
+
198
  results["gigachat_lite"] = generate_message_gigachat_lite_with_retry(standard_prompt, gigachat_lite_temperature)
199
  gigachat_lite_length = len(results["gigachat_lite"])
200
  gigachat_lite_display = f"{results['gigachat_lite']}\n\n------\nКоличество знаков: {gigachat_lite_length}"
201
  yield results["prompt"], gpt4o_display, gigachat_pro_display, gigachat_lite_display, "", "Сообщение GigaChat-Lite сгенерировано"
202
 
203
  time.sleep(2)
204
+
205
  results["gigachat_plus"] = generate_message_gigachat_plus_with_retry(standard_prompt, gigachat_plus_temperature)
206
  gigachat_plus_length = len(results["gigachat_plus"])
207
  gigachat_plus_display = f"{results['gigachat_plus']}\n\n------\nКоличество знаков: {gigachat_plus_length}"
 
227
  # Функция для выполнения персонализации на основе сгенерированного промпта и сообщения
228
  def perform_personalization(standard_message, personalization_prompt):
229
  full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
230
+ return generate_message_gpt4o_with_retry(full_prompt, 1.0) # Заменяем функцию на ту, что поддерживает повторные генерации
231
 
232
  # Также обновляем функции персонализации
233
+ def perform_personalization_gigachat(standard_message, personalization_prompt, model, temperature):
234
  full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
235
  if model == "gigachat_pro":
236
+ return generate_message_gigachat_pro_with_retry(full_prompt, temperature)
237
  elif model == "gigachat_lite":
238
+ return generate_message_gigachat_lite_with_retry(full_prompt, temperature)
239
  elif model == "gigachat_plus":
240
+ return generate_message_gigachat_plus_with_retry(full_prompt, temperature)
241
+ return "Ошибка: Неверная модель GigaChat."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
242
 
243
  # Обновляем блок персонализации
244
+ 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):
245
  personalization_prompt = generate_personalization_prompt(*selected_values)
246
  yield personalization_prompt, "", "", "", "", "Промпт для персонализации сгенерирован"
247
 
248
+ personalized_message_gpt4o = perform_personalization(gpt4o_message, personalization_prompt)
249
  gpt4o_length = len(personalized_message_gpt4o)
250
  gpt4o_display = f"{personalized_message_gpt4o}\n\n------\nКоличество знаков: {gpt4o_length}"
251
  yield personalization_prompt, gpt4o_display, "", "", "", "Персонализированное сообщение GPT-4o сгенерировано"
252
 
253
+ personalized_message_gigachat_pro = perform_personalization_gigachat(gigachat_pro_message, personalization_prompt, "gigachat_pro", gigachat_pro_temperature)
254
  gigachat_pro_length = len(personalized_message_gigachat_pro)
255
  gigachat_pro_display = f"{personalized_message_gigachat_pro}\n\n------\nКоличество знаков: {gigachat_pro_length}"
256
  yield personalization_prompt, gpt4o_display, gigachat_pro_display, "", "", "Персонализированное сообщение GigaChat-Pro сгенерировано"
257
 
258
+ personalized_message_gigachat_lite = perform_personalization_gigachat(gigachat_lite_message, personalization_prompt, "gigachat_lite", gigachat_lite_temperature)
259
  gigachat_lite_length = len(personalized_message_gigachat_lite)
260
  gigachat_lite_display = f"{personalized_message_gigachat_lite}\n\n------\nКоличество знаков: {gigachat_lite_length}"
261
  yield personalization_prompt, gpt4o_display, gigachat_pro_display, gigachat_lite_display, "", "Персонализированное сообщение GigaChat-Lite сгенерировано"
262
 
263
+ personalized_message_gigachat_plus = perform_personalization_gigachat(gigachat_plus_message, personalization_prompt, "gigachat_plus", gigachat_plus_temperature)
264
  gigachat_plus_length = len(personalized_message_gigachat_plus)
265
  gigachat_plus_display = f"{personalized_message_gigachat_plus}\n\n------\nКоличество знаков: {gigachat_plus_length}"
266
  yield personalization_prompt, gpt4o_display, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, "Все персонализированные сообщения сгенерированы"
267
 
268
+ # Обновляем функцию сохранения в GitHub с добавлением температуры
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
269
  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):
270
  # Собираем все данные в один словарь
271
  data_to_save = {
 
305
  # Отправка POST-запроса на GitHub API для создания файла в репозитории
306
  response = requests.put(url, headers=headers, data=json.dumps(data))
307
 
 
308
  # Создание интерфейса Gradio
309
  with gr.Blocks() as demo:
310
  gr.Markdown("# Генерация SMS-сообщений по заданным признакам")
 
 
 
 
 
 
 
311
 
312
  with gr.Row():
313
  with gr.Column(scale=1):
314
+ # Добавляем слайдеры для установки параметра температуры для каждой модели
315
+ gpt4o_temperature = gr.Slider(label="GPT-4o: temperature", minimum=0, maximum=2, step=0.01, value=1)
316
+ gigachat_pro_temperature = gr.Slider(label="GigaChat-Pro: temperature", minimum=0, maximum=1.7, step=0.01, value=0.87)
317
+ gigachat_lite_temperature = gr.Slider(label="GigaChat-Lite: temperature", minimum=0, maximum=1.7, step=0.01, value=0.87)
318
+ gigachat_plus_temperature = gr.Slider(label="GigaChat-Plus: temperature", minimum=0, maximum=1.7, step=0.01, value=0.87)
319
+
320
+ with gr.Column(scale=2):
321
  description_input = gr.Textbox(
322
  label="Описание предложения (предзаполненный пример можно поменять на свой)",
323
  lines=13,
 
346
  for feature in features.keys():
347
  selections.append(gr.Dropdown(choices=[None] + list(features[feature].keys()), label=f"Выберите {feature}"))
348
 
349
+ submit_btn = gr.Button("1. Создать неперсонализированное сообщение")
350
 
351
  with gr.Column(scale=2):
352
  prompt_display = gr.Textbox(label="Неперсонализированный промпт", lines=20, interactive=False)
353
  output_text_gpt4o = gr.Textbox(label="Неперсонализированное сообщение GPT-4o", lines=3, interactive=False)
354
  output_text_gigachat_pro = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Pro", lines=3, interactive=False)
355
  output_text_gigachat_lite = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite", lines=3, interactive=False)
356
+ output_text_gigachat_plus = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Plus", lines=3, interactive=False)
357
+
358
  submit_btn.click(
359
+ generate_messages,
360
+ inputs=[description_input, advantages_input, gpt4o_temperature, gigachat_pro_temperature, gigachat_lite_temperature, gigachat_plus_temperature] + selections,
361
  outputs=[prompt_display, output_text_gpt4o, output_text_gigachat_pro, output_text_gigachat_lite, output_text_gigachat_plus]
362
  )
363
 
364
  with gr.Row():
365
  personalize_btn = gr.Button("2. Выполнить персонализацию (нажимать только после кнопки 1)", elem_id="personalize_button")
366
+
367
  with gr.Row():
368
  personalize_btn.click(
369
  personalize_messages_with_yield,
370
+ 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,
371
  outputs=[
372
  gr.Textbox(label="Промпт для персонализации", lines=6, interactive=False),
373
  personalized_output_text_gpt4o := gr.Textbox(label="Персонализированное сообщение GPT-4o", lines=6, interactive=False),
374
  personalized_output_text_gigachat_pro := gr.Textbox(label="Персонализированное сообщение GigaChat-Pro", lines=6, interactive=False),
375
  personalized_output_text_gigachat_lite := gr.Textbox(label="Персонализированное сообщение GigaChat-Lite", lines=6, interactive=False),
376
+ personalized_output_text_gigachat_plus := gr.Textbox(label="Персонализированное сообщение GigaChat-Plus", lines=6, interactive=False)
377
  ]
378
  )
379
 
 
391
  corrected_gigachat_lite = gr.Textbox(label="", lines=3)
392
  corrected_gigachat_plus = gr.Textbox(label="", lines=3)
393
 
 
394
  # Отдельная строка для кнопок с использованием пустой колонки
395
  with gr.Row():
396
  gr.Button("Жми 👍 для сохранения удачного SMS в базу =>")
 
401
 
402
  # Привязка кнопок к функциям сохранения
403
  save_gpt4o_btn.click(
404
+ fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form, temperature:
405
  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),
406
  inputs=[
407
  personalized_output_text_gpt4o,
 
422
  outputs=None
423
  )
424
 
 
 
425
  save_gigachat_pro_btn.click(
426
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form, temperature:
427
  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),
 
443
  ],
444
  outputs=None
445
  )
446
+
 
447
  save_gigachat_lite_btn.click(
448
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form, temperature:
449
  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),
 
465
  ],
466
  outputs=None
467
  )
468
+
 
469
  save_gigachat_plus_btn.click(
470
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form, temperature:
471
  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),
 
488
  outputs=None
489
  )
490
 
 
 
491
  with gr.Row():
492
  check_errors_btn = gr.Button("3. Проверить текст (нажимать только после кнопки 2) - экспериментальная фича, качество пока крайне низкое", elem_id="check_errors_button")
493
 
 
500
  gr.Textbox(label="Результат проверки GPT-4o", lines=6),
501
  gr.Textbox(label="Результат проверки GigaChat-Pro", lines=6),
502
  gr.Textbox(label="Результат проверки GigaChat-Lite", lines=6),
503
+ gr.Textbox(label="Результат проверки GigaChat-Plus", lines=6)
504
  ]
505
  )
506
 
507
+ demo.launch()
508