fruitpicker01 commited on
Commit
7aee395
1 Parent(s): c2fba02

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +117 -78
app.py CHANGED
@@ -1,3 +1,4 @@
 
1
  import gradio as gr
2
  import os
3
  import pandas as pd
@@ -31,70 +32,124 @@ for sheet_name, df in data.items():
31
  print(f"Ошибка при обработке данных листа {sheet_name}: {e}")
32
  features[sheet_name] = {}
33
 
34
- # Функция для создания спидометра
35
- def create_gauge(value):
36
- fig = go.Figure(go.Indicator(
37
- mode="gauge+number",
38
- value=value,
39
- gauge={
40
- 'axis': {'range': [0, 100]},
41
- 'bar': {'color': "black"}, # Цвет стрелки
42
- 'steps': [
43
- {'range': [0, 40], 'color': "#55efc4"}, # Мягкий зеленый
44
- {'range': [40, 70], 'color': "#ffeaa7"}, # Желтый
45
- {'range': [70, 100], 'color': "#ff7675"} # Мягкий красный
46
- ],
47
- 'threshold': {
48
- 'line': {'color': "black", 'width': 4},
49
- 'thickness': 0.75,
50
- 'value': value
51
- }
52
- },
53
- number={'font': {'size': 48}} # Размер шрифта числа
54
- ))
55
- fig.update_layout(paper_bgcolor="#f8f9fa", font={'color': "#2d3436", 'family': "Arial"}, width=250, height=150)
56
- return fig
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
- # Функция для генерации случайных значений спидометров
59
- def generate_random_gauges():
60
- return create_gauge(random.randint(60, 90)), create_gauge(random.randint(60, 90)), create_gauge(random.randint(60, 90))
 
 
 
61
 
62
- # Функция для смены вкладки
63
- def change_tab(id):
64
- return gr.Tabs(selected=id)
65
 
66
- # Вспомогательная функция для добавления префиксов и суффиксов
67
- def add_prefix_suffix(prompt, prefix, suffix):
68
- return f"{prefix}\n{prompt}\n{suffix}"
 
69
 
70
- # Функция для обрезки сообщения до последнего знака препинания
71
- def clean_message(message):
72
- if not message.endswith(('.', '!', '?')):
73
- last_period = max(message.rfind('.'), message.rfind('!'), message.rfind('?'))
74
- if last_period != -1:
75
- message = message[:last_period + 1]
76
- return message
77
 
78
- # Функция для генерации сообщения с GigaChat Pro
79
- def generate_message_gigachat_pro(prompt):
80
- try:
81
- messages = [SystemMessage(content=prompt)]
82
- res = chat_pro(messages)
83
- cleaned_message = clean_message(res.content.strip())
84
- return cleaned_message
85
- except Exception as e:
86
- return f"Ошибка при обращении к GigaChat-Pro: {e}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
 
88
- # Функция для повторной генерации сообщения, пока оно не станет короче 250 знаков
89
- def generate_message_gigachat_pro_with_retry(prompt):
90
- for _ in range(10):
91
- message = generate_message_gigachat_pro(prompt)
92
- if len(message) <= 250:
93
- return message
94
- return message
95
 
96
  # Функция для постепенной генерации всех сообщений через yield
97
- def generate_all_messages(desc, benefits, key_message):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  # Варианты предложений для начала и конца
99
  prefixes = [
100
  "Начни сообщение с призыва к действию с продуктом.",
@@ -110,32 +165,16 @@ def generate_all_messages(desc, benefits, key_message):
110
  non_personalized_messages = []
111
  personalized_messages = []
112
 
113
- # Формируем общий неперсонализированный текст для использования в сообщениях
114
- non_personalized_prompt = f"{desc}\n\nПреимущества:\n{benefits}\n\nКлючевое сообщение: {key_message}"
115
- personalized_prompt = f"Персонализированное сообщение для клиента: {desc}\n\n{benefits}\n\nКлючевое сообщение: {key_message}"
116
-
117
- # Выводим задание для копирайтера
118
- yield non_personalized_prompt, None, None, None, None, None, None, None
119
-
120
- # Небольшая пауза для демонстрации постепенной генерации
121
- time.sleep(1)
122
-
123
- # Выводим задание для редактора
124
- yield non_personalized_prompt, personalized_prompt, None, None, None, None, None, None
125
-
126
- # Небольшая пауза для демонстрации постепенной генерации
127
- time.sleep(1)
128
-
129
  # Генерация и постепенная подача каждого сообщения
130
  for i in range(3):
131
  # Генерация неперсонализированного сообщения
132
- prompt = add_prefix_suffix(non_personalized_prompt, prefixes[i], suffixes[i])
133
  non_personalized_message = generate_message_gigachat_pro_with_retry(prompt)
134
  non_personalized_messages.append(non_personalized_message)
135
 
136
  # Выводим неперсонализированное сообщение
137
  yield (
138
- non_personalized_prompt, personalized_prompt, # Задания для копирайтера и редактора
139
  non_personalized_messages[0] if i >= 0 else None, # Первое неперсонализированное сообщение
140
  personalized_messages[0] if len(personalized_messages) > 0 else None, # Первое персонализированное сообщение, если оно уже есть
141
  non_personalized_messages[1] if i >= 1 else None, # Второе неперсонализированное сообщение
@@ -145,13 +184,13 @@ def generate_all_messages(desc, benefits, key_message):
145
  )
146
 
147
  # Генерация персонализированного сообщения
148
- full_personalized_prompt = f"{personalized_prompt}\n\nТекст для адаптации: {non_personalized_message}"
149
  personalized_message = generate_message_gigachat_pro_with_retry(full_personalized_prompt)
150
  personalized_messages.append(personalized_message)
151
 
152
  # Выводим персонализированное сообщение
153
  yield (
154
- non_personalized_prompt, personalized_prompt, # Задания для копирайтера и редактора
155
  non_personalized_messages[0] if len(non_personalized_messages) > 0 else None, # Первое неперсонализированное сообщение
156
  personalized_messages[0] if len(personalized_messages) > 0 else None, # Первое персонализированное сообщение
157
  non_personalized_messages[1] if len(non_personalized_messages) > 1 else None, # Второе неперсонализированное сообщение
@@ -249,11 +288,11 @@ with gr.Blocks() as demo:
249
  # Сначала переключаем вкладку, потом запускаем генерацию сообщений
250
  btn_to_prompts.click(
251
  fn=change_tab,
252
- inputs=[gr.Number(value=1, visible=False)], # Переключение на вкладку "Сообщения" (id=1)
253
  outputs=tabs # Обновляем вкладку
254
  ).then(
255
  fn=generate_all_messages,
256
- inputs=[desc, benefits, key_message], # Входные текстовые поля
257
  outputs=[
258
  non_personalized_prompt, personalized_prompt, # Поля для задания копирайтера и редактора (на вкладке "Ассистент")
259
  non_personalized_1, personalized_1, # Сообщения на вкладке "Сообщения"
 
1
+ import re # Добавляем импорт re для возможного редактирования текста
2
  import gradio as gr
3
  import os
4
  import pandas as pd
 
32
  print(f"Ошибка при обработке данных листа {sheet_name}: {e}")
33
  features[sheet_name] = {}
34
 
35
+ # Функция для создания задания для копирайтера
36
+ def generate_standard_prompt(description, advantages, key_message, *selected_values):
37
+ prompt = (
38
+ f"Сгенерируй смс-сообщение для клиента.\n"
39
+ f"Описание предложения: {description}\n"
40
+ f"Преимущества: {advantages}\n"
41
+ тексте смс запрещено использование:\n"
42
+ "- Запрещенные слова: № один, номер один, № 1, вкусный, дешёвый, продукт, спам, доступный, банкротство, долги, займ, срочно, сейчас, лучший, главный, номер 1, гарантия, успех, лидер;\n"
43
+ "- Обращение к клиенту;\n"
44
+ "- Приветствие клиента;\n"
45
+ "- Обещания и гарантии;\n"
46
+ "- Использовать составные конструкции из двух глаголов;\n"
47
+ "- Причастия и причастные обороты;\n"
48
+ "- Деепричастия и деепричастные обороты;\n"
49
+ "- Превосходная степень прилагательных;\n"
50
+ "- Страдательный залог;\n"
51
+ "- Порядковые числительные от 10 прописью;\n"
52
+ "- Цепочки с придаточными предложениями;\n"
53
+ "- Разделительные повторяющиеся союзы;\n"
54
+ "- Вводные конструкции;\n"
55
+ "- Усилители;\n"
56
+ "- Паразиты времени;\n"
57
+ "- Несколько существительных подряд, в том числе отглагольных;\n"
58
+ "- Производные предлоги;\n"
59
+ "- Сложные предложения, в которых нет связи между частями;\n"
60
+ "- Сложноподчинённые предложения;\n"
61
+ "- Даты прописью;\n"
62
+ "- Близкие по смыслу однородные члены предложения;\n"
63
+ "- Шокирующие, экстравагантные, кликбейтные фразы;\n"
64
+ "- Абстрактные заявления без поддержки фактами и отсутствие доказательства пользы для клиента;\n"
65
+ "- Гарантирующие фразы;\n"
66
+ "- Узкоспециализированные термины;\n"
67
+ "- Фразы, способные создать двойственное ощущение, обидеть;\n"
68
+ "- Речевые клише, рекламные штампы, канцеляризмы;\n"
69
+ "Убедись, что в готовом тексте до 250 знаков с пробелами.\n"
70
+ )
71
+ if key_message.strip():
72
+ prompt += f"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
73
+
74
+ return prompt
75
 
76
+ # Функция для создания задания для редактора
77
+ def generate_personalization_prompt(key_message, *selected_values):
78
+ prompt = "Адаптируй, не прев��шая длину сообщения в 250 знаков с пробелами, текст с учетом следующих особенностей:\n"
79
+ gender, generation, psychotype = selected_values[0], selected_values[1], selected_values[2]
80
+ combined_instruction = ""
81
+ additional_instructions = ""
82
 
83
+ print(f"Выбранные значения: Пол={gender}, Поколение={generation}, Психотип={psychotype}")
 
 
84
 
85
+ # Проверяем, выбраны ли все три параметра: Пол, Поколение, Психотип
86
+ if gender and generation and psychotype:
87
+ # Получаем данные с листа "Пол Поколение Психотип"
88
+ sheet = features.get("Пол Поколение Психотип", {})
89
 
90
+ # Ищем ключ, соответствующий комбинации "Пол", "Поколение", "Психотип"
91
+ key = (gender, generation, psychotype)
92
+ if key in sheet:
93
+ combined_instruction = sheet[key]
94
+ print(f"Найдена комбинированная инструкция: {combined_instruction}")
95
+ else:
96
+ print(f"Комбинированная инструкция для ключа {key} не найдена.")
97
 
98
+ # Если не найдена комбинированная инструкция, добавляем индивидуальные инструкции
99
+ if not combined_instruction:
100
+ print("Добавляем индивидуальные инструкции для Пол, Поколение, Психотип.")
101
+ for i, feature in enumerate(["Пол", "Поколение", "Психотип"]):
102
+ if selected_values[i]:
103
+ try:
104
+ instruction = features[feature][selected_values[i]]
105
+ additional_instructions += f"{instruction}\n"
106
+ print(f"Добавлена инструкция из {feature}: {instruction}")
107
+ except KeyError:
108
+ return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
109
+
110
+ # Добавляем инструкции для остальных параметров (например, Отрасль)
111
+ for i, feature in enumerate(features.keys()):
112
+ if feature not in ["Пол", "Поколение", "Психотип", "Пол Поколение Психотип"]:
113
+ if i < len(selected_values) and selected_values[i]:
114
+ try:
115
+ instruction = features[feature][selected_values[i]]
116
+ additional_instructions += f"{instruction}\n"
117
+ print(f"Добавлена инструкция из {feature}: {instruction}")
118
+ except KeyError:
119
+ return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
120
+
121
+ # Формируем итоговый промпт
122
+ if combined_instruction:
123
+ prompt += combined_instruction # Добавляем комбинированную инструкцию, если она есть
124
+ if additional_instructions:
125
+ prompt += additional_instructions # Добавляем остальные инструкции
126
+
127
+ prompt += "Убедись, что в готовом тексте до 250 знаков с пробелами.\n"
128
+
129
+ prompt += f"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
130
+
131
+ if "призыва к действию" в prompt and "минимум прямых призывов к действию" в prompt:
132
+ prompt = re.sub(r"Убедись, что готовый текст начинается с призыва к действию с продуктом.\n", "", prompt)
133
+
134
+ return prompt.strip()
135
 
 
 
 
 
 
 
 
136
 
137
  # Функция для постепенной генерации всех сообщений через yield
138
+ def generate_all_messages(desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf):
139
+ # Генерация задания для копирайтера
140
+ standard_prompt = generate_standard_prompt(desc, benefits, key_message)
141
+ yield standard_prompt, None, None, None, None, None, None, None
142
+
143
+ # Небольшая пауза для демонстрации постепенной генерации
144
+ time.sleep(1)
145
+
146
+ # Генерация задания для редактора
147
+ personalization_prompt = generate_personalization_prompt(key_message, gender, generation, psychotype, business_stage, industry, opf)
148
+ yield standard_prompt, personalization_prompt, None, None, None, None, None, None
149
+
150
+ # Небольшая пауза для демонстрации постепенной генерации
151
+ time.sleep(1)
152
+
153
  # Варианты предложений для начала и конца
154
  prefixes = [
155
  "Начни сообщение с призыва к действию с продуктом.",
 
165
  non_personalized_messages = []
166
  personalized_messages = []
167
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
168
  # Генерация и постепенная подача каждого сообщения
169
  for i in range(3):
170
  # Генерация неперсонализированного сообщения
171
+ prompt = add_prefix_suffix(standard_prompt, prefixes[i], suffixes[i])
172
  non_personalized_message = generate_message_gigachat_pro_with_retry(prompt)
173
  non_personalized_messages.append(non_personalized_message)
174
 
175
  # Выводим неперсонализированное сообщение
176
  yield (
177
+ standard_prompt, personalization_prompt, # Задания для копирайтера и редактора
178
  non_personalized_messages[0] if i >= 0 else None, # Первое неперсонализированное сообщение
179
  personalized_messages[0] if len(personalized_messages) > 0 else None, # Первое персонализированное сообщение, если оно уже есть
180
  non_personalized_messages[1] if i >= 1 else None, # Второе неперсонализированное сообщение
 
184
  )
185
 
186
  # Генерация персонализированного сообщения
187
+ full_personalized_prompt = f"{personalization_prompt}\n\nТекст для адаптации: {non_personalized_message}"
188
  personalized_message = generate_message_gigachat_pro_with_retry(full_personalized_prompt)
189
  personalized_messages.append(personalized_message)
190
 
191
  # Выводим персонализированное сообщение
192
  yield (
193
+ standard_prompt, personalization_prompt, # Задания для копирайтера и редактора
194
  non_personalized_messages[0] if len(non_personalized_messages) > 0 else None, # Первое неперсонализированное сообщение
195
  personalized_messages[0] if len(personalized_messages) > 0 else None, # Первое персонализированное сообщение
196
  non_personalized_messages[1] if len(non_personalized_messages) > 1 else None, # Второе неперсонализированное сообщение
 
288
  # Сначала переключаем вкладку, потом запускаем генерацию сообщений
289
  btn_to_prompts.click(
290
  fn=change_tab,
291
+ inputs=[gr.Number(value=1, visible=False)], # Переключение на вкладку "Ассистент" (id=1)
292
  outputs=tabs # Обновляем вкладку
293
  ).then(
294
  fn=generate_all_messages,
295
+ inputs=[desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf], # Входные текстовые поля
296
  outputs=[
297
  non_personalized_prompt, personalized_prompt, # Поля для задания копирайтера и редактора (на вкладке "Ассистент")
298
  non_personalized_1, personalized_1, # Сообщения на вкладке "Сообщения"