Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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
|
102 |
-
|
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 =
|
181 |
-
|
182 |
-
|
183 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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="
|
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="
|
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()
|