fruitpicker01 commited on
Commit
b89a5cc
1 Parent(s): 1cfc5bc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +72 -69
app.py CHANGED
@@ -18,6 +18,7 @@ import base64
18
  import io
19
  from transformers import AutoTokenizer, AutoModel
20
  from utils import best_text_choice
 
21
 
22
  tokenizer = AutoTokenizer.from_pretrained("ai-forever/ru-en-RoSBERTa")
23
  model = AutoModel.from_pretrained("ai-forever/ru-en-RoSBERTa")
@@ -188,7 +189,7 @@ def clean_message(message):
188
  # except Exception as e:
189
  # return f"Ошибка при обращении к GigaChat-Pro: {e}"
190
 
191
- def generate_message_mistral_generate(prompt, max_retries=5):
192
  #def generate_message_mistral_generate(prompt):
193
  # try:
194
  # messages = [SystemMessage(content=prompt)]
@@ -201,7 +202,7 @@ def generate_message_mistral_generate(prompt, max_retries=5):
201
  retries = 0
202
  while retries < max_retries:
203
  try:
204
- chat_response = client_mistral_generate.chat.complete(
205
  model="mistral-large-latest",
206
  temperature=1.0,
207
  min_tokens=81,
@@ -219,16 +220,16 @@ def generate_message_mistral_generate(prompt, max_retries=5):
219
  error_message = str(e)
220
  if "Status 429" in error_message or "Server disconnected without sending a response" in error_message:
221
  wait_time = 3
222
- print(f"Превышен лимит запросов или сервер не ответил. Ожидание {wait_time} секунд перед повторной попыткой...")
223
- time.sleep(wait_time)
224
  retries += 1
225
  else:
226
- print(f"Ошибка при обращении к Mistral: {e}")
227
  return None
228
- print("Не удалось получить ответ от Mistral после максимального числа попыток.")
229
  return None
230
 
231
- def generate_message_mistral_check(prompt, max_retries=5):
232
  #def generate_message_mistral_check(prompt):
233
  # try:
234
  # messages = [SystemMessage(content=prompt)]
@@ -240,7 +241,7 @@ def generate_message_mistral_check(prompt, max_retries=5):
240
  retries = 0
241
  while retries < max_retries:
242
  try:
243
- chat_response = client_mistral_check.chat.complete(
244
  model="mistral-large-latest",
245
  temperature=0.2,
246
  messages=[
@@ -253,14 +254,17 @@ def generate_message_mistral_check(prompt, max_retries=5):
253
  cleaned_message = clean_message(chat_response.choices[0].message.content.strip())
254
  return cleaned_message
255
  except Exception as e:
256
- if "Status 429" in str(e) or "Server disconnected without sending a response" in str(e):
257
- wait_time = 3 # Можно установить фиксированную задержку
258
- print(f"Превышен лимит запросов. Ожидание {wait_time} секунд перед повторной попыткой...")
259
- time.sleep(wait_time)
260
- retries += 1
261
- else:
262
- print(f"Ошибка при обращении к Mistral: {e}")
263
- return None
 
 
 
264
 
265
  #def generate_check_gigachat_pro(prompt):
266
  # try:
@@ -545,22 +549,22 @@ def notify_failed_checks(checks):
545
  # return last_message
546
 
547
 
548
- def generate_message_mistral_with_retry(prompt, approach_name, description, key_message, product_name, benefits):
549
  global approach_stats
550
  last_message = None
551
  for attempt in range(20):
552
- gr.Info(f"Итерация {attempt + 1}: генерируется сообщение...")
553
- message = generate_message_mistral_generate(prompt)
554
  if message is None:
555
- print("Не удалось получ��ть сообщение от Mistral, повторная попытка...")
556
- time.sleep(1)
557
  continue
558
  message = replace_k_with_thousands(message)
559
  message = correct_dash_usage(message)
560
  message_length = len(message)
561
  if not notify_failed_length(message_length):
562
  last_message = message
563
- time.sleep(1)
564
  continue
565
  checks = perform_checks(message, description, key_message, product_name, benefits)
566
  last_message = message
@@ -576,7 +580,7 @@ def generate_message_mistral_with_retry(prompt, approach_name, description, key_
576
  if all(checks.values()):
577
  return message
578
  prompt = append_errors_to_prompt(prompt, checks)
579
- time.sleep(1)
580
  gr.Info("Не удалось сгенерировать сообщение, соответствующее требованиям, за 20 итераций. Возвращаем последнее сгенерированное сообщение.")
581
  return last_message
582
 
@@ -692,7 +696,7 @@ def clean_prompt_for_display(prompt, prefixes, suffixes):
692
  return cleaned_prompt.strip()
693
 
694
  # Функция для постепенной генерации всех сообщений через yield
695
- def generate_all_messages(desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf, product_name):
696
  standard_prompt = generate_standard_prompt(desc, benefits, key_message)
697
  standard_prompt_for_display = f"Не изменяй название продукта: {product_name}.\n{standard_prompt}\nУбедись, что в готовом тексте без изменений, синонимов и перестановок слов используется наименование продукта: {product_name}.\n"
698
  approach_mapping = {
@@ -1261,7 +1265,7 @@ def cut_message(message):
1261
  return message
1262
 
1263
  # 22. Проверка сложных предложений без логической связи
1264
- def check_disconnected_sentences(message):
1265
  message_clean = cut_message(message)
1266
  print()
1267
  print("Проверка 22: Проверка сложных предложений без логической связи")
@@ -1276,8 +1280,8 @@ def check_disconnected_sentences(message):
1276
  если таких предложений **нет**, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
1277
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь **только** в формате JSON с закрывающими кавычками и скобками.**'''
1278
 
1279
- response = generate_message_mistral_check(prompt)
1280
- time.sleep(3) # Задержка в 3 секунды между запросами
1281
  print("Mistral response:", response) # Выводим полный ответ модели
1282
  result = parse_json_response(response)
1283
  if result is not None:
@@ -1289,7 +1293,7 @@ def check_disconnected_sentences(message):
1289
  return None
1290
 
1291
  # 23. Проверка на близкие по смыслу однородные члены
1292
- def check_synonymous_members(message):
1293
  print()
1294
  print("Проверка 23: Проверка на близкие по смыслу однородные члены")
1295
  print()
@@ -1303,8 +1307,8 @@ def check_synonymous_members(message):
1303
  если таких слов или выражений нет, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
1304
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
1305
 
1306
- response = generate_message_mistral_check(prompt)
1307
- time.sleep(3)
1308
  print("Mistral response:", response)
1309
  result = parse_json_response(response)
1310
  if result is not None:
@@ -1317,7 +1321,7 @@ def check_synonymous_members(message):
1317
 
1318
 
1319
  # 24. Проверка на шокирующие, экстравагантные или кликбейтные фразы
1320
- def check_clickbait_phrases(message, description, benefits):
1321
  message_clean = cut_message(message)
1322
  print()
1323
  print()
@@ -1341,8 +1345,8 @@ def check_clickbait_phrases(message, description, benefits):
1341
 
1342
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
1343
 
1344
- response = generate_message_mistral_check(prompt)
1345
- time.sleep(3)
1346
  print("Mistral response:", response)
1347
  result = parse_json_response(response)
1348
  if result is not None:
@@ -1355,7 +1359,7 @@ def check_clickbait_phrases(message, description, benefits):
1355
 
1356
 
1357
  # 25. Проверка на абстрактные заявления без поддержки фактами
1358
- def check_abstract_claims(message, description, benefits):
1359
  print()
1360
  print("Проверка 25: Проверка на абстрактные заявления без поддержки фактами")
1361
  print()
@@ -1393,8 +1397,8 @@ def check_abstract_claims(message, description, benefits):
1393
 
1394
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
1395
 
1396
- response = generate_message_mistral_check(prompt)
1397
- time.sleep(3)
1398
  print("Mistral response:", response)
1399
  result = parse_json_response(response)
1400
  if result is not None:
@@ -1407,7 +1411,7 @@ def check_abstract_claims(message, description, benefits):
1407
 
1408
 
1409
  # 26. Проверка на узкоспециализированные термины
1410
- def check_specialized_terms(message):
1411
  print()
1412
  print("Проверка 26: Проверка на узкоспециализированные термины")
1413
  print()
@@ -1430,8 +1434,8 @@ def check_specialized_terms(message):
1430
 
1431
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
1432
 
1433
- response = generate_message_mistral_check(prompt)
1434
- time.sleep(3)
1435
  print("Mistral response:", response)
1436
  result = parse_json_response(response)
1437
  if result is not None:
@@ -1443,7 +1447,7 @@ def check_specialized_terms(message):
1443
  return None
1444
 
1445
  # 27. Проверка на двусмысленные или обидные фразы
1446
- def check_offensive_phrases(message):
1447
  print()
1448
  print("Проверка 27: Проверка на двусмысленные или обидные фразы")
1449
  print()
@@ -1459,8 +1463,8 @@ def check_offensive_phrases(message):
1459
  если таких фраз нет, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
1460
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
1461
 
1462
- response = generate_message_mistral_check(prompt)
1463
- time.sleep(3)
1464
  print("Mistral response:", response)
1465
  result = parse_json_response(response)
1466
  if result is not None:
@@ -1472,7 +1476,7 @@ def check_offensive_phrases(message):
1472
  return None
1473
 
1474
  # 28. Проверка на речевые клише, рекламные штампы и канцеляризмы
1475
- def check_cliches_and_bureaucratese(message, description, benefits):
1476
  print()
1477
  print("Проверка 28: Проверка на речевые клише, рекламные штампы и канцеляризмы")
1478
  print()
@@ -1504,8 +1508,8 @@ def check_cliches_and_bureaucratese(message, description, benefits):
1504
  если в тексте **есть** такие выражения, **верни только** JSON {{"decision": true, "explanation": "<пояснение>"}}.
1505
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
1506
 
1507
- response = generate_message_mistral_check(prompt)
1508
- time.sleep(3)
1509
  print("Mistral response:", response)
1510
  result = parse_json_response(response)
1511
  if result is not None:
@@ -1517,7 +1521,7 @@ def check_cliches_and_bureaucratese(message, description, benefits):
1517
  return None
1518
 
1519
  # 29. Проверка на соответствие описанию предложения и ключевому сообщению
1520
- def check_no_contradictions(message, description, key_message):
1521
  print()
1522
  print("Проверка 29: Проверка на отсутствие противоречий с описанием предложения")
1523
  print()
@@ -1533,8 +1537,8 @@ def check_no_contradictions(message, description, key_message):
1533
  Если сообщение содержит факты, которые отсутствуют в описании предложения и ключевом сообщении, **верни только** JSON {{"decision": true, "explanation": "<описание противоречий>"}}.
1534
  **Не добавляй никакого дополнительного текста. Отвечай только в формате JSON с закрывающими кавычками и скобками.**'''
1535
 
1536
- response = generate_message_mistral_check(prompt)
1537
- time.sleep(3)
1538
  print("Mistral response:", response)
1539
  result = parse_json_response(response)
1540
  if result is not None:
@@ -1546,7 +1550,7 @@ def check_no_contradictions(message, description, key_message):
1546
  return None
1547
 
1548
  # 30. Проверка на наличие ключевого сообщения
1549
- def check_contains_key_message(message, key_message):
1550
  print()
1551
  print("Проверка 30: Проверка на наличие ключевого сообщения")
1552
  print()
@@ -1560,8 +1564,8 @@ def check_contains_key_message(message, key_message):
1560
  Если сообщение **не содержит всю** информацию из ключевого текста, **верни только** JSON {{"decision": true, "explanation": "Ключевое текст отсутствует."}}.
1561
  **Не добавляй никакого дополнительного текста. Отвечай только в формате JSON с закрывающими кавычками и скобками.**'''
1562
 
1563
- response = generate_message_mistral_check(prompt)
1564
- time.sleep(3)
1565
  print("Mistral response:", response)
1566
  result = parse_json_response(response)
1567
  if result is not None:
@@ -1573,7 +1577,7 @@ def check_contains_key_message(message, key_message):
1573
  return None
1574
 
1575
  # 31. Проверка на точное совпадение названий продуктов
1576
- def check_product_name_consistency(message, product_name):
1577
  print()
1578
  print("Проверка 31: Проверка на точное совпадение названий продуктов")
1579
  print()
@@ -1590,8 +1594,8 @@ def check_product_name_consistency(message, product_name):
1590
  Если название продукта **не** совпадает, **верни только** JSON {{"decision": true, "explanation": "<описание несоответствия>"}}.
1591
  **Не добавляй никакого дополнительного текста. Ответ должен быть только в формате JSON с закрывающими кавычками и скобками.**'''
1592
 
1593
- response = generate_message_mistral_check(prompt)
1594
- time.sleep(3)
1595
  print("Mistral response:", response)
1596
  result = parse_json_response(response)
1597
  if result is not None:
@@ -1605,15 +1609,14 @@ def check_product_name_consistency(message, product_name):
1605
  # ФУНКЦИИ ПРОВЕРОК (КОНЕЦ)
1606
 
1607
 
1608
- def safe_check(func, *args):
1609
  try:
1610
- return func(*args)
1611
  except Exception as e:
1612
- # Optionally, you can log the exception here if needed
1613
- print(f"Ошибка в {func.__name__}: {e}")
1614
- return None # Indicate that the check could not be performed
1615
 
1616
- def perform_checks(message, description, key_message, product_name, benefits):
1617
  checks = {}
1618
 
1619
  # 2. Morphological checks using pymorphy3
@@ -1659,7 +1662,7 @@ def perform_checks(message, description, key_message, product_name, benefits):
1659
 
1660
  # Perform morphological checks
1661
  for check_name, check_func in morphological_checks:
1662
- result = safe_check(check_func, message)
1663
  checks[check_name] = result
1664
  if result is False:
1665
  return checks # Stop on first failure
@@ -1667,19 +1670,19 @@ def perform_checks(message, description, key_message, product_name, benefits):
1667
  # Perform LLM checks group 1
1668
  for check_name, check_func in llm_checks_group1:
1669
  if check_name == "no_contradictions":
1670
- result = safe_check(check_func, message, description, key_message)
1671
  elif check_name == "contains_key_message":
1672
- result = safe_check(check_func, message, key_message)
1673
  elif check_name == "product_name_consistency":
1674
- result = safe_check(check_func, message, product_name)
1675
  elif check_name == "clickbait_phrases":
1676
- result = safe_check(check_func, message, description, benefits)
1677
  elif check_name == "abstract_claims":
1678
- result = safe_check(check_func, message, description, benefits)
1679
  elif check_name == "cliches_and_bureaucratese":
1680
- result = safe_check(check_func, message, description, benefits)
1681
  else:
1682
- result = safe_check(check_func, message)
1683
  checks[check_name] = result
1684
  if result is False:
1685
  return checks
@@ -1687,7 +1690,7 @@ def perform_checks(message, description, key_message, product_name, benefits):
1687
 
1688
  # Perform remaining LLM checks
1689
  for check_name, check_func in llm_checks_group2:
1690
- result = safe_check(check_func, message)
1691
  checks[check_name] = result
1692
  if result is False:
1693
  return checks # Stop on first failure
 
18
  import io
19
  from transformers import AutoTokenizer, AutoModel
20
  from utils import best_text_choice
21
+ import asyncio
22
 
23
  tokenizer = AutoTokenizer.from_pretrained("ai-forever/ru-en-RoSBERTa")
24
  model = AutoModel.from_pretrained("ai-forever/ru-en-RoSBERTa")
 
189
  # except Exception as e:
190
  # return f"Ошибка при обращении к GigaChat-Pro: {e}"
191
 
192
+ async def generate_message_mistral_generate(prompt, max_retries=5):
193
  #def generate_message_mistral_generate(prompt):
194
  # try:
195
  # messages = [SystemMessage(content=prompt)]
 
202
  retries = 0
203
  while retries < max_retries:
204
  try:
205
+ chat_response = await client_mistral_generate.chat.complete_async(
206
  model="mistral-large-latest",
207
  temperature=1.0,
208
  min_tokens=81,
 
220
  error_message = str(e)
221
  if "Status 429" in error_message or "Server disconnected without sending a response" in error_message:
222
  wait_time = 3
223
+ print(f"Rate limit exceeded or server did not respond. Waiting {wait_time} seconds before retrying...")
224
+ await asyncio.sleep(wait_time)
225
  retries += 1
226
  else:
227
+ print(f"Error calling Mistral: {e}")
228
  return None
229
+ print("Failed to get response from Mistral after maximum retries.")
230
  return None
231
 
232
+ async def generate_message_mistral_check(prompt, max_retries=5):
233
  #def generate_message_mistral_check(prompt):
234
  # try:
235
  # messages = [SystemMessage(content=prompt)]
 
241
  retries = 0
242
  while retries < max_retries:
243
  try:
244
+ chat_response = await client_mistral_check.chat.complete_async(
245
  model="mistral-large-latest",
246
  temperature=0.2,
247
  messages=[
 
254
  cleaned_message = clean_message(chat_response.choices[0].message.content.strip())
255
  return cleaned_message
256
  except Exception as e:
257
+ error_message = str(e)
258
+ if "Status 429" in error_message or "Server disconnected without sending a response" in error_message:
259
+ wait_time = 3
260
+ print(f"Rate limit exceeded or server did not respond. Waiting {wait_time} seconds before retrying...")
261
+ await asyncio.sleep(wait_time)
262
+ retries += 1
263
+ else:
264
+ print(f"Error calling Mistral: {e}")
265
+ return None
266
+ print("Failed to get response from Mistral after maximum retries.")
267
+ return None
268
 
269
  #def generate_check_gigachat_pro(prompt):
270
  # try:
 
549
  # return last_message
550
 
551
 
552
+ async def generate_message_mistral_with_retry(prompt, approach_name, description, key_message, product_name, benefits):
553
  global approach_stats
554
  last_message = None
555
  for attempt in range(20):
556
+ gr.Info(f"Iteration {attempt + 1}: generating message...")
557
+ message = await generate_message_mistral_generate(prompt)
558
  if message is None:
559
+ print("Failed to get message from Mistral, retrying...")
560
+ await asyncio.sleep(1)
561
  continue
562
  message = replace_k_with_thousands(message)
563
  message = correct_dash_usage(message)
564
  message_length = len(message)
565
  if not notify_failed_length(message_length):
566
  last_message = message
567
+ await asyncio.sleep(1)
568
  continue
569
  checks = perform_checks(message, description, key_message, product_name, benefits)
570
  last_message = message
 
580
  if all(checks.values()):
581
  return message
582
  prompt = append_errors_to_prompt(prompt, checks)
583
+ await asyncio.sleep(1)
584
  gr.Info("Не удалось сгенерировать сообщение, соответствующее требованиям, за 20 итераций. Возвращаем последнее сгенерированное сообщение.")
585
  return last_message
586
 
 
696
  return cleaned_prompt.strip()
697
 
698
  # Функция для постепенной генерации всех сообщений через yield
699
+ async def generate_all_messages(desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf, product_name):
700
  standard_prompt = generate_standard_prompt(desc, benefits, key_message)
701
  standard_prompt_for_display = f"Не изменяй название продукта: {product_name}.\n{standard_prompt}\nУбедись, что в готовом тексте без изменений, синонимов и перестановок слов используется наименование продукта: {product_name}.\n"
702
  approach_mapping = {
 
1265
  return message
1266
 
1267
  # 22. Проверка сложных предложений без логической связи
1268
+ async def check_disconnected_sentences(message):
1269
  message_clean = cut_message(message)
1270
  print()
1271
  print("Проверка 22: Проверка сложных предложений без логической связи")
 
1280
  если таких предложений **нет**, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
1281
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь **только** в формате JSON с закрывающими кавычками и скобками.**'''
1282
 
1283
+ response = async generate_message_mistral_check(prompt)
1284
+ await asyncio.sleep(3) # Задержка в 3 секунды между запросами
1285
  print("Mistral response:", response) # Выводим полный ответ модели
1286
  result = parse_json_response(response)
1287
  if result is not None:
 
1293
  return None
1294
 
1295
  # 23. Проверка на близкие по смыслу однородные члены
1296
+ async def check_synonymous_members(message):
1297
  print()
1298
  print("Проверка 23: Проверка на близкие по смыслу однородные члены")
1299
  print()
 
1307
  если таких слов или выражений нет, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
1308
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
1309
 
1310
+ response = async generate_message_mistral_check(prompt)
1311
+ await asyncio.sleep(3)
1312
  print("Mistral response:", response)
1313
  result = parse_json_response(response)
1314
  if result is not None:
 
1321
 
1322
 
1323
  # 24. Проверка на шокирующие, экстравагантные или кликбейтные фразы
1324
+ async def check_clickbait_phrases(message, description, benefits):
1325
  message_clean = cut_message(message)
1326
  print()
1327
  print()
 
1345
 
1346
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
1347
 
1348
+ response = async generate_message_mistral_check(prompt)
1349
+ await asyncio.sleep(3)
1350
  print("Mistral response:", response)
1351
  result = parse_json_response(response)
1352
  if result is not None:
 
1359
 
1360
 
1361
  # 25. Проверка на абстрактные заявления без поддержки фактами
1362
+ async def check_abstract_claims(message, description, benefits):
1363
  print()
1364
  print("Проверка 25: Проверка на абстрактные заявления без поддержки фактами")
1365
  print()
 
1397
 
1398
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
1399
 
1400
+ response = async generate_message_mistral_check(prompt)
1401
+ await asyncio.sleep(3)
1402
  print("Mistral response:", response)
1403
  result = parse_json_response(response)
1404
  if result is not None:
 
1411
 
1412
 
1413
  # 26. Проверка на узкоспециализированные термины
1414
+ async def check_specialized_terms(message):
1415
  print()
1416
  print("Проверка 26: Проверка на узкоспециализированные термины")
1417
  print()
 
1434
 
1435
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
1436
 
1437
+ response = async generate_message_mistral_check(prompt)
1438
+ await asyncio.sleep(3)
1439
  print("Mistral response:", response)
1440
  result = parse_json_response(response)
1441
  if result is not None:
 
1447
  return None
1448
 
1449
  # 27. Проверка на двусмысленные или обидные фразы
1450
+ async def check_offensive_phrases(message):
1451
  print()
1452
  print("Проверка 27: Проверка на двусмысленные или обидные фразы")
1453
  print()
 
1463
  если таких фраз нет, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
1464
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
1465
 
1466
+ response = async generate_message_mistral_check(prompt)
1467
+ await asyncio.sleep(3)
1468
  print("Mistral response:", response)
1469
  result = parse_json_response(response)
1470
  if result is not None:
 
1476
  return None
1477
 
1478
  # 28. Проверка на речевые клише, рекламные штампы и канцеляризмы
1479
+ async def check_cliches_and_bureaucratese(message, description, benefits):
1480
  print()
1481
  print("Проверка 28: Проверка на речевые клише, рекламные штампы и канцеляризмы")
1482
  print()
 
1508
  если в тексте **есть** такие выражения, **верни только** JSON {{"decision": true, "explanation": "<пояснение>"}}.
1509
  **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
1510
 
1511
+ response = async generate_message_mistral_check(prompt)
1512
+ await asyncio.sleep(3)
1513
  print("Mistral response:", response)
1514
  result = parse_json_response(response)
1515
  if result is not None:
 
1521
  return None
1522
 
1523
  # 29. Проверка на соответствие описанию предложения и ключевому сообщению
1524
+ async def check_no_contradictions(message, description, key_message):
1525
  print()
1526
  print("Проверка 29: Проверка на отсутствие противоречий с описанием предложения")
1527
  print()
 
1537
  Если сообщение содержит факты, которые отсутствуют в описании предложения и ключевом сообщении, **верни только** JSON {{"decision": true, "explanation": "<описание противоречий>"}}.
1538
  **Не добавляй никакого дополнительного текста. Отвечай только в формате JSON с закрывающими кавычками и скобками.**'''
1539
 
1540
+ response = async generate_message_mistral_check(prompt)
1541
+ await asyncio.sleep(3)
1542
  print("Mistral response:", response)
1543
  result = parse_json_response(response)
1544
  if result is not None:
 
1550
  return None
1551
 
1552
  # 30. Проверка на наличие ключевого сообщения
1553
+ async def check_contains_key_message(message, key_message):
1554
  print()
1555
  print("Проверка 30: Проверка на наличие ключевого сообщения")
1556
  print()
 
1564
  Если сообщение **не содержит всю** информацию из ключевого текста, **верни только** JSON {{"decision": true, "explanation": "Ключевое текст отсутствует."}}.
1565
  **Не добавляй никакого дополнительного текста. Отвечай только в формате JSON с закрывающими кавычками и скобками.**'''
1566
 
1567
+ response = async generate_message_mistral_check(prompt)
1568
+ await asyncio.sleep(3)
1569
  print("Mistral response:", response)
1570
  result = parse_json_response(response)
1571
  if result is not None:
 
1577
  return None
1578
 
1579
  # 31. Проверка на точное совпадение названий продуктов
1580
+ async def check_product_name_consistency(message, product_name):
1581
  print()
1582
  print("Проверка 31: Проверка на точное совпадение названий продуктов")
1583
  print()
 
1594
  Если название продукта **не** совпадает, **верни только** JSON {{"decision": true, "explanation": "<описание несоответствия>"}}.
1595
  **Не добавляй никакого дополнительного текста. Ответ должен быть только в формате JSON с закрывающими кавычками и скобками.**'''
1596
 
1597
+ response = async generate_message_mistral_check(prompt)
1598
+ await asyncio.sleep(3)
1599
  print("Mistral response:", response)
1600
  result = parse_json_response(response)
1601
  if result is not None:
 
1609
  # ФУНКЦИИ ПРОВЕРОК (КОНЕЦ)
1610
 
1611
 
1612
+ async def safe_check(func, *args):
1613
  try:
1614
+ return await func(*args)
1615
  except Exception as e:
1616
+ print(f"Error in {func.__name__}: {e}")
1617
+ return None
 
1618
 
1619
+ async def perform_checks(message, description, key_message, product_name, benefits):
1620
  checks = {}
1621
 
1622
  # 2. Morphological checks using pymorphy3
 
1662
 
1663
  # Perform morphological checks
1664
  for check_name, check_func in morphological_checks:
1665
+ result = async safe_check(check_func, message)
1666
  checks[check_name] = result
1667
  if result is False:
1668
  return checks # Stop on first failure
 
1670
  # Perform LLM checks group 1
1671
  for check_name, check_func in llm_checks_group1:
1672
  if check_name == "no_contradictions":
1673
+ result = async safe_check(check_func, message, description, key_message)
1674
  elif check_name == "contains_key_message":
1675
+ result = async safe_check(check_func, message, key_message)
1676
  elif check_name == "product_name_consistency":
1677
+ result = async safe_check(check_func, message, product_name)
1678
  elif check_name == "clickbait_phrases":
1679
+ result = async safe_check(check_func, message, description, benefits)
1680
  elif check_name == "abstract_claims":
1681
+ result = async safe_check(check_func, message, description, benefits)
1682
  elif check_name == "cliches_and_bureaucratese":
1683
+ result = async safe_check(check_func, message, description, benefits)
1684
  else:
1685
+ result = async safe_check(check_func, message)
1686
  checks[check_name] = result
1687
  if result is False:
1688
  return checks
 
1690
 
1691
  # Perform remaining LLM checks
1692
  for check_name, check_func in llm_checks_group2:
1693
+ result = async safe_check(check_func, message)
1694
  checks[check_name] = result
1695
  if result is False:
1696
  return checks # Stop on first failure