fruitpicker01 commited on
Commit
187a726
·
verified ·
1 Parent(s): a7b29dc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +23 -47
app.py CHANGED
@@ -10,15 +10,12 @@ client = OpenAI(
10
  base_url="https://api.x.ai/v1",
11
  )
12
 
13
- # Функция для загрузки данных из вкладок Excel
14
  def load_dropdown_data(file_path, sheet_name, column_name):
15
- """Загружает уникальные значения из столбца на заданной вкладке."""
16
  data = pd.read_excel(file_path, sheet_name=sheet_name)
17
  return data[column_name].dropna().unique().tolist()
18
 
19
  file_path = "Исходные данные.xlsx"
20
 
21
- # Загрузка данных
22
  products, data_products = load_dropdown_data(file_path, "Продукты", "Наименование продукта"), pd.read_excel(file_path, sheet_name="Продукты")
23
  genders_data = pd.read_excel(file_path, sheet_name="Пол")
24
  generations_data = pd.read_excel(file_path, sheet_name="Поколение")
@@ -36,7 +33,6 @@ opfs = opfs_data["ОПФ"].dropna().unique().tolist()
36
 
37
  approaches_data = pd.read_excel(file_path, sheet_name="Подход")
38
 
39
- # Словарь подходов
40
  approach_dict = {
41
  "Указание на пользу": {
42
  "prefix": "Начни SMS с указания на пользу продукта. Используй глагол в побудительном наклонении. Не начинай с вопроса",
@@ -87,10 +83,8 @@ def get_approaches(gender, generation, psychotype, approaches_df):
87
  approach_names = [a.strip() for a in str(approaches).split(',')]
88
  approach_list.extend(approach_names)
89
 
90
- # Удаляем дубликаты
91
  approach_list = list(set(approach_list))
92
- selected_approaches_text_content = ', '.join(approach_list)
93
- return selected_approaches_text_content
94
 
95
  def get_instructions_for_param(param_value, df, col):
96
  if not param_value or param_value == "Не выбрано":
@@ -109,7 +103,6 @@ def format_instruction_string(instr):
109
 
110
  def generate_display_prompts(description, product_name, benefits, key_message, chosen_approach,
111
  gender, generation, psychotype, business_stage, industry, opf):
112
- # Формируем промпты для отображения
113
  if chosen_approach == "Подход не найден для выбранных параметров.":
114
  return ("Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода",
115
  "Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода")
@@ -144,18 +137,16 @@ def generate_display_prompts(description, product_name, benefits, key_message, c
144
  if instr1:
145
  chosen_params_instructions.append(instr1)
146
 
147
- if chosen_params_instructions:
148
- lines = []
149
- for i, instr_line in enumerate(chosen_params_instructions, start=1):
150
- formatted_line = format_instruction_string(instr_line)
151
- lines.append(f"{i}. {formatted_line}.")
152
- mandatory_terms = "\n".join(lines)
153
- else:
154
- # Нет персональных параметров
155
  return ("Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода",
156
  "Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода")
157
 
158
- # Если есть персональные параметры
 
 
 
 
 
159
  prompt = f"""Напиши три или четыре предложения. {approach_prefix}.
160
  Напиши рекламное SMS для следующего продукта:
161
  «{description}».
@@ -169,13 +160,11 @@ def generate_display_prompts(description, product_name, benefits, key_message, c
169
  Убедись, что УМЕСТНО использовал КАЖДЫЙ необходимый термин.
170
  Убедись, что в SMS без изменений, синонимов и перестановок слов используется наименование продукта: «{product_name}».
171
  Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
172
-
173
  return prompt, prompt
174
 
175
  def generate_model_prompt(description, product_name, benefits, key_message,
176
  gender, generation, psychotype, business_stage, industry, opf,
177
  single_approach):
178
- # Генерируем промпт для обращения к ��одели, используя только один выбранный подход
179
  prefix = approach_dict[single_approach]["prefix"]
180
  suffix = approach_dict[single_approach]["suffix"]
181
 
@@ -201,7 +190,6 @@ def generate_model_prompt(description, product_name, benefits, key_message,
201
  lines.append(f"{i}. {formatted_line}.")
202
  mandatory_terms = "\n".join(lines)
203
  else:
204
- # Не должно сюда попасться, т.к. мы проверим до вызова модели
205
  mandatory_terms = None
206
 
207
  if mandatory_terms:
@@ -219,7 +207,6 @@ def generate_model_prompt(description, product_name, benefits, key_message,
219
  Убедись, что в SMS без изменений, синонимов и перестановок слов используется наименование продукта: «{product_name}».
220
  Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
221
  else:
222
- # Теоретически сюда не попадём, если проверяем до вызова
223
  model_prompt = ""
224
 
225
  return model_prompt
@@ -236,39 +223,28 @@ def call_model(model_prompt):
236
 
237
  def update_prompts_on_params_change(description, product_name, benefits, key_message,
238
  gender, generation, psychotype, business_stage, industry, opf):
239
- # Обновляем подход и промпты при изменении параметров клиента
240
  chosen_approach = get_approaches(gender, generation, psychotype, approaches_data)
241
  prompt_1, prompt_2 = generate_display_prompts(description, product_name, benefits, key_message,
242
  chosen_approach, gender, generation, psychotype,
243
  business_stage, industry, opf)
244
- # Здесь SMS не генерируем
245
  return chosen_approach, prompt_1, prompt_2
246
 
247
  def generate_personalized_sms(description, product_name, benefits, key_message,
248
  gender, generation, psychotype, business_stage, industry, opf,
249
  chosen_approach, prompt_1, prompt_2):
250
- # Проверяем, есть ли персональный параметр
251
- if "Для формирования промпта выберите хотя бы один личный персональный параметр" in prompt_1:
252
- # Выводим предупреждение
253
- return gr.update(value="Задайте хотя бы один личный персональный параметр для определения подхода"), "", ""
254
- if chosen_approach == "Подход не найден для выбранных параметров.":
255
- return gr.update(value="Задайте хотя бы один личный персональный параметр для определения подхода"), "", ""
256
 
257
  approach_list = [a.strip() for a in chosen_approach.split(',') if a.strip()]
258
  if not approach_list:
259
- return gr.update(value="Задайте хотя бы один личный персональный параметр для определения подхода"), "", ""
 
260
 
261
- # Выбираем случайный подход для model_prompt_1
262
- if len(approach_list) > 1:
263
- chosen_single_approach_1 = random.choice(approach_list)
264
- else:
265
- chosen_single_approach_1 = approach_list[0]
266
-
267
- # Выбираем случайный подход для model_prompt_2
268
- if len(approach_list) > 1:
269
- chosen_single_approach_2 = random.choice(approach_list)
270
- else:
271
- chosen_single_approach_2 = approach_list[0]
272
 
273
  model_prompt_1 = generate_model_prompt(description, product_name, benefits, key_message,
274
  gender, generation, psychotype, business_stage, industry, opf,
@@ -280,8 +256,7 @@ def generate_personalized_sms(description, product_name, benefits, key_message,
280
  sms_1 = call_model(model_prompt_1)
281
  sms_2 = call_model(model_prompt_2)
282
 
283
- # Очистим warning (presence_in_db) если было
284
- return gr.update(value=""), sms_1, sms_2
285
 
286
  with gr.Blocks(theme="default") as demo:
287
  gr.Markdown("**Процент созданных SMS по выбранному продукту**")
@@ -318,7 +293,6 @@ with gr.Blocks(theme="default") as demo:
318
  industry_dropdown = gr.Dropdown(label="Отрасль", choices=["Не выбрано"]+industries, value=None)
319
  opf_dropdown = gr.Dropdown(label="ОПФ", choices=["Не выбрано"]+opfs, value=None)
320
  chosen_approach = gr.Textbox(label="Выбранный подход", lines=1, value="")
321
- presence_in_db = gr.Textbox(label="Комментарий", lines=1, value="", interactive=False)
322
 
323
  with gr.Row():
324
  return_params_btn = gr.Button("Вернуть параметры предыдущего запроса")
@@ -354,7 +328,7 @@ with gr.Blocks(theme="default") as demo:
354
  save_sms_1_btn = gr.Button("Сохранить в базу")
355
  save_sms_2_btn = gr.Button("Сохранить в базу")
356
 
357
- # Обновляем промпты и подход при изменении параметров клиента (без генерации SMS)
358
  client_params = [gender_dropdown, generation_dropdown, psychotype_dropdown, business_stage_dropdown, industry_dropdown, opf_dropdown]
359
  for cp in client_params:
360
  cp.change(
@@ -366,13 +340,15 @@ with gr.Blocks(theme="default") as demo:
366
  )
367
 
368
  # Генерация SMS по нажатию кнопки
 
369
  create_personal_sms_btn.click(
370
  fn=generate_personalized_sms,
371
  inputs=[description, product_name, benefits, key_message,
372
  gender_dropdown, generation_dropdown, psychotype_dropdown,
373
  business_stage_dropdown, industry_dropdown, opf_dropdown,
374
  chosen_approach, prompt_1, prompt_2],
375
- outputs=[presence_in_db, sms_1, sms_2]
376
  )
377
 
378
- demo.launch()
 
 
10
  base_url="https://api.x.ai/v1",
11
  )
12
 
 
13
  def load_dropdown_data(file_path, sheet_name, column_name):
 
14
  data = pd.read_excel(file_path, sheet_name=sheet_name)
15
  return data[column_name].dropna().unique().tolist()
16
 
17
  file_path = "Исходные данные.xlsx"
18
 
 
19
  products, data_products = load_dropdown_data(file_path, "Продукты", "Наименование продукта"), pd.read_excel(file_path, sheet_name="Продукты")
20
  genders_data = pd.read_excel(file_path, sheet_name="Пол")
21
  generations_data = pd.read_excel(file_path, sheet_name="Поколение")
 
33
 
34
  approaches_data = pd.read_excel(file_path, sheet_name="Подход")
35
 
 
36
  approach_dict = {
37
  "Указание на пользу": {
38
  "prefix": "Начни SMS с указания на пользу продукта. Используй глагол в побудительном наклонении. Не начинай с вопроса",
 
83
  approach_names = [a.strip() for a in str(approaches).split(',')]
84
  approach_list.extend(approach_names)
85
 
 
86
  approach_list = list(set(approach_list))
87
+ return ', '.join(approach_list)
 
88
 
89
  def get_instructions_for_param(param_value, df, col):
90
  if not param_value or param_value == "Не выбрано":
 
103
 
104
  def generate_display_prompts(description, product_name, benefits, key_message, chosen_approach,
105
  gender, generation, psychotype, business_stage, industry, opf):
 
106
  if chosen_approach == "Подход не найден для выбранных параметров.":
107
  return ("Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода",
108
  "Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода")
 
137
  if instr1:
138
  chosen_params_instructions.append(instr1)
139
 
140
+ if not chosen_params_instructions:
 
 
 
 
 
 
 
141
  return ("Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода",
142
  "Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода")
143
 
144
+ lines = []
145
+ for i, instr_line in enumerate(chosen_params_instructions, start=1):
146
+ formatted_line = format_instruction_string(instr_line)
147
+ lines.append(f"{i}. {formatted_line}.")
148
+ mandatory_terms = "\n".join(lines)
149
+
150
  prompt = f"""Напиши три или четыре предложения. {approach_prefix}.
151
  Напиши рекламное SMS для следующего продукта:
152
  «{description}».
 
160
  Убедись, что УМЕСТНО использовал КАЖДЫЙ необходимый термин.
161
  Убедись, что в SMS без изменений, синонимов и перестановок слов используется наименование продукта: «{product_name}».
162
  Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
 
163
  return prompt, prompt
164
 
165
  def generate_model_prompt(description, product_name, benefits, key_message,
166
  gender, generation, psychotype, business_stage, industry, opf,
167
  single_approach):
 
168
  prefix = approach_dict[single_approach]["prefix"]
169
  suffix = approach_dict[single_approach]["suffix"]
170
 
 
190
  lines.append(f"{i}. {formatted_line}.")
191
  mandatory_terms = "\n".join(lines)
192
  else:
 
193
  mandatory_terms = None
194
 
195
  if mandatory_terms:
 
207
  Убедись, что в SMS без изменений, синонимов и перестановок слов используется наименование продукта: «{product_name}».
208
  Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
209
  else:
 
210
  model_prompt = ""
211
 
212
  return model_prompt
 
223
 
224
  def update_prompts_on_params_change(description, product_name, benefits, key_message,
225
  gender, generation, psychotype, business_stage, industry, opf):
 
226
  chosen_approach = get_approaches(gender, generation, psychotype, approaches_data)
227
  prompt_1, prompt_2 = generate_display_prompts(description, product_name, benefits, key_message,
228
  chosen_approach, gender, generation, psychotype,
229
  business_stage, industry, opf)
 
230
  return chosen_approach, prompt_1, prompt_2
231
 
232
  def generate_personalized_sms(description, product_name, benefits, key_message,
233
  gender, generation, psychotype, business_stage, industry, opf,
234
  chosen_approach, prompt_1, prompt_2):
235
+ # Если нет персональных параметров или подхода, показываем предупреждение:
236
+ if "Для формирования промпта выберите хотя бы один личный персональный параметр" in prompt_1 or chosen_approach == "Подход не найден для выбранных параметров.":
237
+ gr.Warning("Задайте хотя бы один личный персональный параметр для определения подхода, чтобы был сформирован промпт")
238
+ # Возвращаем пустые результаты для SMS
239
+ return "", ""
 
240
 
241
  approach_list = [a.strip() for a in chosen_approach.split(',') if a.strip()]
242
  if not approach_list:
243
+ gr.Warning("Задайте хотя бы один личный персональный параметр для определения подхода, чтобы был сформирован промпт")
244
+ return "", ""
245
 
246
+ chosen_single_approach_1 = random.choice(approach_list) if len(approach_list) > 1 else approach_list[0]
247
+ chosen_single_approach_2 = random.choice(approach_list) if len(approach_list) > 1 else approach_list[0]
 
 
 
 
 
 
 
 
 
248
 
249
  model_prompt_1 = generate_model_prompt(description, product_name, benefits, key_message,
250
  gender, generation, psychotype, business_stage, industry, opf,
 
256
  sms_1 = call_model(model_prompt_1)
257
  sms_2 = call_model(model_prompt_2)
258
 
259
+ return sms_1, sms_2
 
260
 
261
  with gr.Blocks(theme="default") as demo:
262
  gr.Markdown("**Процент созданных SMS по выбранному продукту**")
 
293
  industry_dropdown = gr.Dropdown(label="Отрасль", choices=["Не выбрано"]+industries, value=None)
294
  opf_dropdown = gr.Dropdown(label="ОПФ", choices=["Не выбрано"]+opfs, value=None)
295
  chosen_approach = gr.Textbox(label="Выбранный подход", lines=1, value="")
 
296
 
297
  with gr.Row():
298
  return_params_btn = gr.Button("Вернуть параметры предыдущего запроса")
 
328
  save_sms_1_btn = gr.Button("Сохранить в базу")
329
  save_sms_2_btn = gr.Button("Сохранить в базу")
330
 
331
+ # Обновляем промпты при изменении параметров клиента
332
  client_params = [gender_dropdown, generation_dropdown, psychotype_dropdown, business_stage_dropdown, industry_dropdown, opf_dropdown]
333
  for cp in client_params:
334
  cp.change(
 
340
  )
341
 
342
  # Генерация SMS по нажатию кнопки
343
+ # Если персональные параметры не выбраны - выдаём gr.Warning
344
  create_personal_sms_btn.click(
345
  fn=generate_personalized_sms,
346
  inputs=[description, product_name, benefits, key_message,
347
  gender_dropdown, generation_dropdown, psychotype_dropdown,
348
  business_stage_dropdown, industry_dropdown, opf_dropdown,
349
  chosen_approach, prompt_1, prompt_2],
350
+ outputs=[sms_1, sms_2]
351
  )
352
 
353
+ # Обязательно включаем очередь:
354
+ demo.queue().launch()