JeCabrera commited on
Commit
e3c2758
·
verified ·
1 Parent(s): aa2dee9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +154 -99
app.py CHANGED
@@ -13,7 +13,7 @@ genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
13
  # Función para obtener una mención del producto de manera probabilística
14
  def get_random_product_mention():
15
  mentions = ["Indirecta", "Metafórica"]
16
- probabilities = [0.50, 0.50]
17
  return random.choices(mentions, probabilities)[0]
18
 
19
  # Crear la instrucción de mención basada en la opción seleccionada
@@ -24,6 +24,14 @@ def get_mention_instruction(product_mention, product):
24
  return f"Introduce el producto '{product}' usando una metáfora, conectándolo simbólicamente a la solución que necesita el lector."
25
  return ""
26
 
 
 
 
 
 
 
 
 
27
  # Fórmulas con ejemplos y explicaciones
28
  benefits_formulas = {
29
  "plantilla": {
@@ -41,164 +49,211 @@ benefits_formulas = {
41
  },
42
  "formula_suprema_istvanova": {
43
  "description": """
44
- La estructura de la fórmula Suprema de Istvanova es: Números + Adjetivo + Palabra Clave + Razón + Promesa.
45
- Crea bullets points o beneficios con beneficios específicos y atractivos que conectan emocionalmente con {target_audience} y cumple con estos elementos:
46
- 1. **Números**: Se escriben con el fin de declarar que existen cierto números de artículos.
47
- 2. **Adjetivo**: Añaden emoción y atractivo al mensaje.
48
- 3. **Palabra Clave**: Reflejan el beneficio principal o tema clave.
49
- 4. **Razón**: Justifican el beneficio o valor del producto.
50
- 5. **Promesa**: Muestran el resultado o beneficio que el lector puede esperar.
51
- Cada uno de estos elementos se integra de manera natural y no forzada cuando se crean los bullets points así como los examples.
52
  """,
53
  "examples": [
54
  "5 métodos simples para duplicar tus ventas en menos de 30 días.",
55
  "8 trucos secretos para que tu perro obedezca en una semana.",
56
  "10 técnicas fáciles que mejorarán tu relación antes de un mes."
57
  ]
58
- },
59
- "formula_aida": {
60
- "description": """
61
- La estructura de la fórmula AIDA para crear bullets points con beneficios es: Atención + Interés + Deseo + Acción.
62
- Crea bullets points o beneficios que sigan estos pasos:
63
- - **Atención**: Captura de inmediato el interés o atención de {target_audience} por medio de un dato insólito o increíble, le habla de una situación problemática o un deseo de {target_audience}.
64
- - **Interés**: Detalla cómo el beneficio del {product} soluciona un problema específico o cómo facilita la obtención de un deseo de {target_audience}.
65
- - **Deseo**: Despierta el anhelo por lograr el resultado prometido.
66
- - **Acción**: Inspira al lector a actuar para obtener el beneficio.
67
- Todos estos elementos se integran de manera natural y no forzada al crear los bullets points o beneficios. Los bullets points están escritos de una manera conversacional y natural como en "examples".
68
- """,
69
- "examples": [
70
- "Descubre cómo atraer clientes automáticamente, sin experiencia previa.",
71
- "Imagina tener un cuerpo en forma disfrutando lo que te gusta comer.",
72
- "Empieza hoy mismo y experimenta resultados en solo 7 días."
73
- ]
74
- },
75
- "formula_3_en_1": {
76
- "description": """
77
- La fórmula 3 en 1 para empezar a conectar con las personas combina:
78
- 1. **Característica**: Describe las propiedades tangibles del producto o servicio. Por ejemplo, "Este software tiene una función de automatización única".
79
- 2. **Para qué**: El beneficio inmediato que resuelve un problema o cumple una necesidad. Por ejemplo, "Para que puedas enfocarte en tareas más importantes sin distracciones".
80
- 3. **Con lo que**: El impacto emocional o práctico a largo plazo que obtiene el cliente. Por ejemplo, "Con lo que podrás disfrutar de un día más productivo y menos estresante".
81
- Crea bullets points que integren estos elementos para mostrar beneficios de forma clara, emocional y conectada al producto.
82
- """,
83
- "examples": [
84
- "Una batería de larga duración para que puedas trabajar todo el día con lo que mantienes tu productividad sin interrupciones.",
85
- "Un sistema de seguridad avanzado para que duermas tranquilo con lo que proteges lo que más valoras.",
86
- "Un diseño intuitivo para que aprendas rápido con lo que ahorras tiempo y esfuerzos innecesarios."
87
- ]
88
  }
89
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
 
91
- # Función para generar bullets de beneficios
92
- def generate_benefits(number_of_benefits, target_audience, product, temperature, selected_formula):
93
  product_mention = get_random_product_mention()
94
  mention_instruction = get_mention_instruction(product_mention, product)
95
 
96
  # Crear la configuración del modelo
97
  generation_config = {
98
  "temperature": temperature,
99
- "top_p": 0.65, # Considerar un poco menos de palabras probables
100
- "top_k": 360, # Aumentar las palabras candidatas para más variedad
101
- "max_output_tokens": 8196, # Mantenerlo igual, pero puedes aumentar si deseas más detalle
102
  "response_mime_type": "text/plain",
103
  }
104
 
105
  model = genai.GenerativeModel(
106
  model_name="gemini-1.5-flash",
107
  generation_config=generation_config,
108
- system_instruction="You are a world-class copywriter, with expertise in crafting benefits that connect emotionally and address the desires, problems, and motivations of {target_audience}. Your task is to generate compelling and specific benefit bullets in Spanish based on a given formula. Always respond with a numbered list format, and ensure each benefit is relevant, concise, action-oriented with a natural language and conversational way. Do not include explanations or categories in your output. Never include these symbols : when you create bullets"
109
  )
110
 
111
- # Crear un mensaje para el modelo, destacando la audiencia, el producto, la fórmula seleccionada y los ejemplos
112
- benefits_instruction = (
113
- f"Tu tarea es crear {number_of_benefits} beneficios irresistibles diseñados para {target_audience}. "
114
  f"El objetivo es mostrar cómo {product} puede transformar la vida del lector, conectando de forma natural y emocional. "
115
- f"Evita usar menciones literales o repetitivas, y destaca soluciones concretas, mostrando cómo el producto elimina obstáculos o satisface deseos reales. "
116
- f"Usa la fórmula seleccionada como guía:\n\n{selected_formula['description']}\n\n"
117
  f"Inspírate en estos ejemplos:\n"
118
  f"- {selected_formula['examples'][0]}\n"
119
  f"- {selected_formula['examples'][1]}\n"
120
  f"- {selected_formula['examples'][2]}\n\n"
121
- f"Y no olvides integrar esta instrucción de manera fluida: {mention_instruction}. "
122
- f"Tu objetivo es inspirar deseo y acción, evitando explicaciones o categorías en la respuesta."
123
  )
124
 
125
  chat_session = model.start_chat(
126
  history=[
127
- {
128
- "role": "user",
129
- "parts": [benefits_instruction],
130
- },
131
  ]
132
  )
133
 
134
- response = chat_session.send_message("Genera los beneficios") # Enviar mensaje para obtener la respuesta
135
- return response.text # Regresar la respuesta directamente
136
 
137
  # Configurar la interfaz de usuario con Streamlit
138
  st.set_page_config(page_title="Bullet Benefits Generator", layout="wide")
139
 
140
  # Centrar el título y el subtítulo
141
  st.markdown("<h1 style='text-align: center;'>Bullet Benefits Generator</h1>", unsafe_allow_html=True)
142
- st.markdown("<h4 style='text-align: center;'>Transforma características en beneficios irresistibles que conectan emocionalmente con tu audiencia.</h4>", unsafe_allow_html=True)
143
-
144
- # Añadir CSS personalizado para el botón
145
- st.markdown("""
146
- <style>
147
- div.stButton > button {
148
- background-color: #FFCC00;
149
- color: black;
150
- width: 90%;
151
- height: 60px;
152
- font-weight: bold;
153
- font-size: 22px;
154
- text-transform: uppercase;
155
- border: 1px solid #000000;
156
- border-radius: 8px;
157
- display: block;
158
- margin: 0 auto;
159
- }
160
- div.stButton > button:hover {
161
- background-color: #FFD700;
162
- color: black;
163
- }
164
- </style>
165
- """, unsafe_allow_html=True)
166
 
167
  # Crear columnas
168
- col1, col2 = st.columns([1, 2])
169
 
170
  # Columnas de entrada
171
  with col1:
172
  target_audience = st.text_input("¿Quién es tu público objetivo?", placeholder="Ejemplo: Estudiantes Universitarios")
173
  product = st.text_input("¿Qué producto tienes en mente?", placeholder="Ejemplo: Curso de Inglés")
174
- number_of_benefits = st.selectbox("Número de Beneficios", options=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], index=4)
175
 
176
- # Crear un único acordeón para fórmula y creatividad
177
  with st.expander("Personaliza tus beneficios"):
178
  temperature = st.slider("Creatividad", min_value=0.0, max_value=1.0, value=0.5, step=0.1)
179
-
180
- selected_formula_key = st.selectbox(
181
- "Selecciona una fórmula para tus beneficios",
182
- options=list(benefits_formulas.keys())
183
- )
184
  selected_formula = benefits_formulas[selected_formula_key]
185
 
 
 
 
186
  # Botón de enviar
187
- submit = st.button("Generar Beneficios")
188
 
189
- # Mostrar los beneficios generados
190
  if submit:
191
- if target_audience and product and selected_formula:
192
  try:
193
- # Obtener la respuesta del modelo
194
- generated_benefits = generate_benefits(number_of_benefits, target_audience, product, temperature, selected_formula)
 
 
 
 
 
 
 
195
  col2.markdown(f"""
196
  <div style="padding: 10px; border: 1px solid #ddd; border-radius: 8px;">
197
- <h3>Beneficios Generados:</h3>
198
- <p>{generated_benefits}</p>
199
  </div>
200
  """, unsafe_allow_html=True)
201
  except Exception as e:
202
- col2.error(f"Error al generar beneficios: {e}")
203
  else:
204
- col2.warning("Por favor, completa todos los campos antes de generar beneficios.")
 
13
  # Función para obtener una mención del producto de manera probabilística
14
  def get_random_product_mention():
15
  mentions = ["Indirecta", "Metafórica"]
16
+ probabilities = [0.50, 0.50]
17
  return random.choices(mentions, probabilities)[0]
18
 
19
  # Crear la instrucción de mención basada en la opción seleccionada
 
24
  return f"Introduce el producto '{product}' usando una metáfora, conectándolo simbólicamente a la solución que necesita el lector."
25
  return ""
26
 
27
+ # Ángulos adicionales para generar bullets
28
+ angles = {
29
+ "Curiosidad": "Crea bullets que despierten el interés del lector dejándolos enganchados y queriendo saber más.",
30
+ "Casi Imposible": "Crea bullets que suenen difíciles de creer pero plausibles, asombrando al lector.",
31
+ "Autoridad y Credibilidad": "Crea bullets respaldados por datos o referencias que generen confianza.",
32
+ "Contraste": "Crea bullets que presenten ideas opuestas o conceptos inesperados, captando atención con contraste."
33
+ }
34
+
35
  # Fórmulas con ejemplos y explicaciones
36
  benefits_formulas = {
37
  "plantilla": {
 
49
  },
50
  "formula_suprema_istvanova": {
51
  "description": """
52
+ La estructura de la fórmula Suprema de Istvanova es: Números + Adjetivo + Palabra Clave + Razón + Promesa.
53
+ Crea bullets con beneficios específicos y atractivos que conectan emocionalmente con {target_audience}.
 
 
 
 
 
 
54
  """,
55
  "examples": [
56
  "5 métodos simples para duplicar tus ventas en menos de 30 días.",
57
  "8 trucos secretos para que tu perro obedezca en una semana.",
58
  "10 técnicas fáciles que mejorarán tu relación antes de un mes."
59
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  }
61
  }
62
+ def generate_bullets_with_angles(angle, number_of_bullets, target_audience, product, temperature):
63
+ """
64
+ Genera bullets utilizando diferentes ángulos específicos.
65
+
66
+ Args:
67
+ angle (str): Ángulo seleccionado (Curiosidad, Casi Imposible, Autoridad y Credibilidad, Contraste).
68
+ number_of_bullets (int): Número de bullets a generar.
69
+ target_audience (str): Público objetivo.
70
+ product (str): Producto para el cual se generan los bullets.
71
+ temperature (float): Temperatura para controlar la creatividad del modelo
72
+
73
+ Returns:
74
+ str: Texto con los bullets generados.
75
+ """
76
+ angles_descriptions = {
77
+ "Curiosidad": (
78
+ "Crea bullets que despierten el interés del lector dejándolos enganchados y queriendo saber más. "
79
+ "El objetivo es que piensen '¿Qué será eso?' o 'Necesito saber más'."
80
+ ),
81
+ "Casi Imposible": (
82
+ "Crea bullets que suenen difíciles de creer o 'casi imposibles', pero que sean plausibles. "
83
+ "El lector debería tener una reacción de asombro y querer probar si es posible."
84
+ ),
85
+ "Autoridad y Credibilidad": (
86
+ "Crea bullets que respalden la información con autoridad, incluyendo referencias a expertos, datos, o ejemplos relevantes. "
87
+ "Construye contexto para generar confianza."
88
+ ),
89
+ "Contraste": (
90
+ "Crea bullets que presenten ideas opuestas o conceptos inesperados, forzando al lector a detenerse y reconsiderar. "
91
+ "El objetivo es captar la atención al confrontar ideas tradicionales."
92
+ ),
93
+ }
94
+
95
+ # Ejemplos inspiradores para cada ángulo
96
+ examples = {
97
+ "Curiosidad": [
98
+ "La bebida que probablemente estás tomando todos los días y que podría estar agotando tu energía.",
99
+ "El error número 1 que el 90% de los freelancers comete sin saberlo.",
100
+ "Las 3 preguntas que los reclutadores usan para decidir si contratarte o no (sin decirte).",
101
+ ],
102
+ "Casi Imposible": [
103
+ "Cómo duplicar tus ingresos trabajando menos de 4 horas al día.",
104
+ "La forma en que puedes aprender un nuevo idioma en menos de 30 días sin gastar un centavo.",
105
+ "Cómo arreglar tu computadora en casa sin ningún conocimiento técnico.",
106
+ ],
107
+ "Autoridad y Credibilidad": [
108
+ "El secreto que Steve Jobs usaba para convencer a millones (y cómo puedes aplicarlo hoy).",
109
+ "Lo que Einstein recomendaba hacer cada mañana para resolver problemas más rápido.",
110
+ "La técnica de respiración usada por los monjes tibetanos para reducir el estrés en 5 minutos.",
111
+ ],
112
+ "Contraste": [
113
+ "El hábito 'saludable' que podría estar saboteando tu pérdida de peso.",
114
+ "Por qué un simple cambio en tu rutina puede ahorrarte miles de dólares al año.",
115
+ "El alimento 'sano' que podría ser peor que el azúcar para tu cuerpo.",
116
+ ],
117
+ }
118
+
119
+ # Validar el ángulo seleccionado
120
+ if angle not in angles_descriptions:
121
+ raise ValueError(f"Ángulo no válido. Selecciona entre: {list(angles_descriptions.keys())}")
122
+
123
+ product_mention = get_random_product_mention()
124
+ mention_instruction = get_mention_instruction(product_mention, product)
125
+
126
+ # Crear la instrucción para el modelo
127
+ angle_instruction = (
128
+ f"Ángulo seleccionado: {angle}\n\n"
129
+ f"Descripción: {angles_descriptions[angle]}\n\n"
130
+ f"Inspírate en estos ejemplos:\n"
131
+ + "\n".join(f"- {example}" for example in examples[angle])
132
+ )
133
+
134
+ # Crear configuración de generación para el modelo
135
+ generation_config = {
136
+ "temperature": temperature,
137
+ "top_p": 0.65,
138
+ "top_k": 360,
139
+ "max_output_tokens": 8196,
140
+ "response_mime_type": "text/plain",
141
+ }
142
+
143
+ # Crear el prompt para el modelo
144
+ prompt = (
145
+ f"Genera {number_of_bullets} bullets en español diseñados para {target_audience} sobre {product}. "
146
+ f"Cada bullet debe seguir el ángulo '{angle}' explicado a continuación:\n\n{angle_instruction}\n\n"
147
+ f"Asegúrate de que cada bullet sea relevante, convincente, y conecte emocionalmente con la audiencia."
148
+ f"Integrando esta instrucción: {mention_instruction}."
149
+ )
150
+
151
+ # Usar el modelo de generación
152
+ model = genai.GenerativeModel(
153
+ model_name="gemini-1.5-flash",
154
+ generation_config=generation_config,
155
+ system_instruction="You are a world-class copywriter, with expertise in crafting bullets that connect emotionally."
156
+ )
157
+
158
+ chat_session = model.start_chat(history=[])
159
+ response = chat_session.send_message(prompt)
160
+
161
+ # Regresar los bullets generados como texto
162
+ return response.text
163
+
164
+ # Función para generar bullets
165
+ def generate_bullets(number_of_bullets, target_audience, product, temperature, selected_formula, selected_angle):
166
+ # Usar la función generate_bullets_with_angles si se ha seleccionado un ángulo
167
+ if selected_angle:
168
+ return generate_bullets_with_angles(selected_angle, number_of_bullets, target_audience, product, temperature)
169
 
 
 
170
  product_mention = get_random_product_mention()
171
  mention_instruction = get_mention_instruction(product_mention, product)
172
 
173
  # Crear la configuración del modelo
174
  generation_config = {
175
  "temperature": temperature,
176
+ "top_p": 0.65,
177
+ "top_k": 360,
178
+ "max_output_tokens": 8196,
179
  "response_mime_type": "text/plain",
180
  }
181
 
182
  model = genai.GenerativeModel(
183
  model_name="gemini-1.5-flash",
184
  generation_config=generation_config,
185
+ system_instruction="You are a world-class copywriter, with expertise in crafting bullets that connect emotionally."
186
  )
187
 
188
+ # Crear un mensaje para el modelo
189
+ bullets_instruction = (
190
+ f"Tu tarea es crear {number_of_bullets} bullets diseñados para {target_audience}. "
191
  f"El objetivo es mostrar cómo {product} puede transformar la vida del lector, conectando de forma natural y emocional. "
192
+ f"Usa la fórmula seleccionada: \n\n{selected_formula['description']}\n\n"
 
193
  f"Inspírate en estos ejemplos:\n"
194
  f"- {selected_formula['examples'][0]}\n"
195
  f"- {selected_formula['examples'][1]}\n"
196
  f"- {selected_formula['examples'][2]}\n\n"
197
+ f"Integrando esta instrucción: {mention_instruction}."
 
198
  )
199
 
200
  chat_session = model.start_chat(
201
  history=[
202
+ {"role": "user", "parts": [bullets_instruction]},
 
 
 
203
  ]
204
  )
205
 
206
+ response = chat_session.send_message("Genera los bullets")
207
+ return response.text
208
 
209
  # Configurar la interfaz de usuario con Streamlit
210
  st.set_page_config(page_title="Bullet Benefits Generator", layout="wide")
211
 
212
  # Centrar el título y el subtítulo
213
  st.markdown("<h1 style='text-align: center;'>Bullet Benefits Generator</h1>", unsafe_allow_html=True)
214
+ st.markdown("<h4 style='text-align: center;'>Transforma características en beneficios irresistibles.</h4>", unsafe_allow_html=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
215
 
216
  # Crear columnas
217
+ col1, col2 = st.columns([1, 2])
218
 
219
  # Columnas de entrada
220
  with col1:
221
  target_audience = st.text_input("¿Quién es tu público objetivo?", placeholder="Ejemplo: Estudiantes Universitarios")
222
  product = st.text_input("¿Qué producto tienes en mente?", placeholder="Ejemplo: Curso de Inglés")
223
+ number_of_bullets = st.selectbox("Número de Bullets", options=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], index=4)
224
 
225
+ # Crear acordeones
226
  with st.expander("Personaliza tus beneficios"):
227
  temperature = st.slider("Creatividad", min_value=0.0, max_value=1.0, value=0.5, step=0.1)
228
+ selected_formula_key = st.selectbox("Selecciona una fórmula", options=list(benefits_formulas.keys()))
 
 
 
 
229
  selected_formula = benefits_formulas[selected_formula_key]
230
 
231
+ with st.expander("Selecciona un ángulo adicional"):
232
+ selected_angle = st.selectbox("Selecciona un ángulo", options=["Ninguno"] + list(angles.keys())) # Opción "Ninguno" añadida
233
+
234
  # Botón de enviar
235
+ submit = st.button("Generar Bullets")
236
 
237
+ # Mostrar los bullets generados
238
  if submit:
239
+ if target_audience and product:
240
  try:
241
+ # Si no se selecciona un ángulo, usar la función original
242
+ if selected_angle == "Ninguno":
243
+ generated_bullets = generate_bullets(
244
+ number_of_bullets, target_audience, product, temperature, selected_formula, "" # Ángulo vacío para la función original
245
+ )
246
+ else:
247
+ generated_bullets = generate_bullets_with_angles(
248
+ selected_angle, number_of_bullets, target_audience, product, temperature
249
+ )
250
  col2.markdown(f"""
251
  <div style="padding: 10px; border: 1px solid #ddd; border-radius: 8px;">
252
+ <h3>Bullets Generados:</h3>
253
+ <p>{generated_bullets}</p>
254
  </div>
255
  """, unsafe_allow_html=True)
256
  except Exception as e:
257
+ col2.error(f"Error al generar bullets: {e}")
258
  else:
259
+ col2.warning("Por favor, completa todos los campos antes de generar bullets.")