fruitpicker01 commited on
Commit
72426c9
·
verified ·
1 Parent(s): 751942d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +123 -13
app.py CHANGED
@@ -1,5 +1,14 @@
1
  import gradio as gr
2
  import pandas as pd
 
 
 
 
 
 
 
 
 
3
 
4
  # Функция для загрузки данных из вкладок Excel
5
  def load_dropdown_data(file_path, sheet_name, column_name):
@@ -98,9 +107,9 @@ def format_instruction_string(instr):
98
  terms = [t.strip() for t in instr.split(',') if t.strip()]
99
  return " или ".join(terms) if terms else ""
100
 
101
- def generate_prompts(description, product_name, benefits, key_message, chosen_approach,
102
- gender, generation, psychotype, business_stage, industry, opf):
103
- # Если подход не определён
104
  if chosen_approach == "Подход не найден для выбранных параметров.":
105
  return ("Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода",
106
  "Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода")
@@ -159,7 +168,6 @@ def generate_prompts(description, product_name, benefits, key_message, chosen_ap
159
  Убедись, что в SMS без изменений, синонимов и перестановок слов используется наименование продукта: «{product_name}».
160
  Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
161
  else:
162
- # Нет персональных параметров — нет обязательных терминов
163
  prompt = f"""Напиши три или четыре предложения. {approach_prefix}. Напиши рекламное SMS для следующего продукта:
164
  «{description}».
165
  Не изменяй название продукта: «{product_name}».
@@ -172,15 +180,117 @@ def generate_prompts(description, product_name, benefits, key_message, chosen_ap
172
 
173
  return prompt, prompt
174
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
175
  def update_all_params(description, product_name, benefits, key_message,
176
  gender, generation, psychotype, business_stage, industry, opf):
177
  # Сначала определяем подход
178
  chosen_approach = get_approaches(gender, generation, psychotype, approaches_data)
179
- # Затем формируем промпты
180
- prompt_1, prompt_2 = generate_prompts(description, product_name, benefits, key_message,
181
- chosen_approach, gender, generation, psychotype,
182
- business_stage, industry, opf)
183
- return chosen_approach, prompt_1, prompt_2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
 
185
  with gr.Blocks(theme="default") as demo:
186
  gr.Markdown("**Процент созданных SMS по выбранному продукту**")
@@ -225,12 +335,12 @@ with gr.Blocks(theme="default") as demo:
225
 
226
  with gr.Row():
227
  with gr.Column():
228
- model_1_name = gr.Textbox(label="Модель 1", value="Скрыто для слепого тестирования", interactive=False)
229
  prompt_1 = gr.Textbox(label="Промпт 1", value="", interactive=False, lines=10)
230
  sms_1 = gr.Textbox(label="SMS 1", lines=3, value="")
231
 
232
  with gr.Column():
233
- model_2_name = gr.Textbox(label="Модель 2", value="Скрыто для слепого тестирования", interactive=False)
234
  prompt_2 = gr.Textbox(label="Промпт 2", value="", interactive=False, lines=10)
235
  sms_2 = gr.Textbox(label="SMS 2", lines=3, value="")
236
 
@@ -252,7 +362,7 @@ with gr.Blocks(theme="default") as demo:
252
  save_sms_1_btn = gr.Button("Сохранить в базу")
253
  save_sms_2_btn = gr.Button("Сохранить в базу")
254
 
255
- # Обновляем промпты и подход при изменении параметров клиента
256
  client_params = [gender_dropdown, generation_dropdown, psychotype_dropdown, business_stage_dropdown, industry_dropdown, opf_dropdown]
257
  for cp in client_params:
258
  cp.change(
@@ -260,7 +370,7 @@ with gr.Blocks(theme="default") as demo:
260
  inputs=[description, product_name, benefits, key_message,
261
  gender_dropdown, generation_dropdown, psychotype_dropdown,
262
  business_stage_dropdown, industry_dropdown, opf_dropdown],
263
- outputs=[chosen_approach, prompt_1, prompt_2]
264
  )
265
 
266
  demo.launch()
 
1
  import gradio as gr
2
  import pandas as pd
3
+ import os
4
+ import random
5
+ from openai import OpenAI
6
+
7
+ XAI_API_KEY = os.getenv("XAI_API_KEY")
8
+ client = OpenAI(
9
+ api_key=XAI_API_KEY,
10
+ base_url="https://api.x.ai/v1",
11
+ )
12
 
13
  # Функция для загрузки данных из вкладок Excel
14
  def load_dropdown_data(file_path, sheet_name, column_name):
 
107
  terms = [t.strip() for t in instr.split(',') if t.strip()]
108
  return " или ".join(terms) if terms else ""
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
  "Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода")
 
168
  Убедись, что в SMS без изменений, синонимов и перестановок слов используется наименование продукта: «{product_name}».
169
  Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
170
  else:
 
171
  prompt = f"""Напиши три или четыре предложения. {approach_prefix}. Напиши рекламное SMS для следующего продукта:
172
  «{description}».
173
  Не изменяй название продукта: «{product_name}».
 
180
 
181
  return prompt, prompt
182
 
183
+ def generate_model_prompt(description, product_name, benefits, key_message,
184
+ gender, generation, psychotype, business_stage, industry, opf,
185
+ single_approach):
186
+ # Генерируем промпт для обращения к модели, используя только один выбранный подход (single_approach)
187
+ prefix = approach_dict[single_approach]["prefix"]
188
+ suffix = approach_dict[single_approach]["suffix"]
189
+
190
+ instructions_data = [
191
+ (gender, genders_data, "Пол"),
192
+ (generation, generations_data, "Поколение"),
193
+ (psychotype, psychotypes_data, "Психотип"),
194
+ (business_stage, business_stages_data, "Стадия бизнеса"),
195
+ (industry, industries_data, "Отрасль"),
196
+ (opf, opfs_data, "ОПФ")
197
+ ]
198
+
199
+ chosen_params_instructions = []
200
+ for (param_value, df, col) in instructions_data:
201
+ instr1 = get_instructions_for_param(param_value, df, col)
202
+ if instr1:
203
+ chosen_params_instructions.append(instr1)
204
+
205
+ if chosen_params_instructions:
206
+ lines = []
207
+ for i, instr_line in enumerate(chosen_params_instructions, start=1):
208
+ formatted_line = format_instruction_string(instr_line)
209
+ lines.append(f"{i}. {formatted_line}.")
210
+ mandatory_terms = "\n".join(lines)
211
+ else:
212
+ mandatory_terms = None
213
+
214
+ if mandatory_terms:
215
+ model_prompt = f"""Напиши три или четыре предложения. {prefix}.
216
+ Напиши рекламное SMS для следующего продукта:
217
+ «{description}».
218
+ Не изменяй название продукта: «{product_name}».
219
+ Преимущества:
220
+ «{benefits}».
221
+ ОБЯЗАТЕЛЬНО используй в SMS КАЖДЫЙ из следующих терминов:
222
+ {mandatory_terms}
223
+ Убедись, что написал не меньше трех и не больше четырех предложений.
224
+ {suffix}.
225
+ Убедись, что УМЕСТНО использовал КАЖДЫЙ необходимый термин.
226
+ Убедись, что в SMS без изменений, синонимов и перестановок слов используется наименование продукта: «{product_name}».
227
+ Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
228
+ else:
229
+ model_prompt = f"""Напиши три или четыре предложения. {prefix}. Напиши рекламное SMS для следующего продукта:
230
+ «{description}».
231
+ Не изменяй название продукта: «{product_name}».
232
+ Преимущества:
233
+ «{benefits}».
234
+ Убедись, что написал не меньше трех и не больше четырех предложений.
235
+ {suffix}.
236
+ Убедись, что в SMS без изменений, синонимов и перестановок слов используется наименование продукта: «{product_name}».
237
+ Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
238
+
239
+ return model_prompt
240
+
241
+ def call_model(model_prompt):
242
+ completion = client.chat.completions.create(
243
+ model="grok-2-1212",
244
+ messages=[
245
+ {"role": "system", "content": "You are a world-class expert in creating personalized SMS who returns only the SMS and nothing else."},
246
+ {"role": "user", "content": model_prompt},
247
+ ],
248
+ )
249
+ return completion.choices[0].message.content.strip()
250
+
251
  def update_all_params(description, product_name, benefits, key_message,
252
  gender, generation, psychotype, business_stage, industry, opf):
253
  # Сначала определяем подход
254
  chosen_approach = get_approaches(gender, generation, psychotype, approaches_data)
255
+ # Затем формируем промпты для отображения
256
+ prompt_1, prompt_2 = generate_display_prompts(description, product_name, benefits, key_message,
257
+ chosen_approach, gender, generation, psychotype,
258
+ business_stage, industry, opf)
259
+
260
+ # Если подход не найден или нет персональных параметров – показываем тексты как есть без генерации SMS
261
+ if chosen_approach == "Подход не найден для выбранных параметров." or "Для формирования промпта выберите" in prompt_1:
262
+ sms_1 = ""
263
+ sms_2 = ""
264
+ return chosen_approach, prompt_1, prompt_2, sms_1, sms_2
265
+
266
+ # Если подход есть
267
+ approach_list = [a.strip() for a in chosen_approach.split(',') if a.strip()]
268
+
269
+ # Выбираем случайный подход для model_prompt_1
270
+ if len(approach_list) > 1:
271
+ chosen_single_approach_1 = random.choice(approach_list)
272
+ else:
273
+ chosen_single_approach_1 = approach_list[0]
274
+
275
+ # Выбираем случайный подход для model_prompt_2
276
+ if len(approach_list) > 1:
277
+ chosen_single_approach_2 = random.choice(approach_list)
278
+ else:
279
+ chosen_single_approach_2 = approach_list[0]
280
+
281
+ model_prompt_1 = generate_model_prompt(description, product_name, benefits, key_message,
282
+ gender, generation, psychotype, business_stage, industry, opf,
283
+ chosen_single_approach_1)
284
+
285
+ model_prompt_2 = generate_model_prompt(description, product_name, benefits, key_message,
286
+ gender, generation, psychotype, business_stage, industry, opf,
287
+ chosen_single_approach_2)
288
+
289
+ # Вызываем модель для получения SMS
290
+ sms_1 = call_model(model_prompt_1)
291
+ sms_2 = call_model(model_prompt_2)
292
+
293
+ return chosen_approach, prompt_1, prompt_2, sms_1, sms_2
294
 
295
  with gr.Blocks(theme="default") as demo:
296
  gr.Markdown("**Процент созданных SMS по выбранному продукту**")
 
335
 
336
  with gr.Row():
337
  with gr.Column():
338
+ model_1_name = gr.Textbox(label="Модель 1", value="Grok-2-1212", interactive=False)
339
  prompt_1 = gr.Textbox(label="Промпт 1", value="", interactive=False, lines=10)
340
  sms_1 = gr.Textbox(label="SMS 1", lines=3, value="")
341
 
342
  with gr.Column():
343
+ model_2_name = gr.Textbox(label="Модель 2", value="Grok-2-1212", interactive=False)
344
  prompt_2 = gr.Textbox(label="Промпт 2", value="", interactive=False, lines=10)
345
  sms_2 = gr.Textbox(label="SMS 2", lines=3, value="")
346
 
 
362
  save_sms_1_btn = gr.Button("Сохранить в базу")
363
  save_sms_2_btn = gr.Button("Сохранить в базу")
364
 
365
+ # Обновляем промпты, подход и генерируем SMS при изменении параметров клиента
366
  client_params = [gender_dropdown, generation_dropdown, psychotype_dropdown, business_stage_dropdown, industry_dropdown, opf_dropdown]
367
  for cp in client_params:
368
  cp.change(
 
370
  inputs=[description, product_name, benefits, key_message,
371
  gender_dropdown, generation_dropdown, psychotype_dropdown,
372
  business_stage_dropdown, industry_dropdown, opf_dropdown],
373
+ outputs=[chosen_approach, prompt_1, prompt_2, sms_1, sms_2]
374
  )
375
 
376
  demo.launch()