JeCabrera commited on
Commit
29a478c
·
verified ·
1 Parent(s): 6ed421c

Upload 4 files

Browse files
Files changed (4) hide show
  1. app.py +220 -217
  2. cta_formulas.py +144 -0
  3. manual.md +117 -0
  4. styles.py +81 -0
app.py CHANGED
@@ -1,217 +1,220 @@
1
- from dotenv import load_dotenv
2
- import streamlit as st
3
- import os
4
- import google.generativeai as genai
5
- import random
6
-
7
- # Cargar las variables de entorno
8
- load_dotenv()
9
-
10
- # Configurar la API de Google
11
- genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
12
-
13
- # Función para obtener una mención del producto de manera probabilística
14
- def get_random_product_mention():
15
- mentions = ["Directa", "Indirecta", "Metafórica"]
16
- probabilities = [0.35, 0.25, 0.40]
17
- return random.choices(mentions, probabilities)[0]
18
-
19
- # Función para crear el texto introductorio aleatorio
20
- def generate_intro_text():
21
- intros = [
22
- "Y si a ti te gustaría aprender todo esto…",
23
- "Así que si lo que quieres es llevarte todo, entonces...",
24
- "Es momento de tomar el control de tu futuro.",
25
- "No dejes pasar esta oportunidad única para mejorar tu vida.",
26
- "Ahora tienes la oportunidad de hacer algo increíble.",
27
- "El primer paso hacia tus sueños está frente a ti.",
28
- "No lo pienses más, el cambio comienza aquí y ahora."
29
- ]
30
- return random.choice(intros)
31
-
32
- # Crear la instrucción de mención basada en la opción seleccionada
33
- def get_mention_instruction(product_mention, product):
34
- if product_mention == "Directa":
35
- return f"Introduce directamente el producto '{product}' como la solución clara al problema que enfrenta el lector."
36
- elif product_mention == "Indirecta":
37
- return f"Referencia sutilmente el producto '{product}' como una posible solución al problema del lector sin nombrarlo explícitamente."
38
- elif product_mention == "Metafórica":
39
- return f"Introduce el producto '{product}' usando una metáfora, conectándolo simbólicamente a la solución que necesita el lector."
40
- return ""
41
-
42
- # Función para generar postdata (refuerzo del CTA)
43
- def generate_postdata(target_audience, product, call_to_action, temperature, theme_or_focus):
44
- # Instrucción para la generación de postdata
45
- postdata_instruction = (
46
- f"Eres un experto copywriter especializado en escribir mensajes persuasivos. "
47
- f"Tu tarea es generar {number_of_ctas} postdatas en forma de listado, que refuercen el llamado a la acción '{call_to_action}' para el público objetivo '{target_audience}', "
48
- f"relacionado con el producto '{product}'. Las postdatas deben de comenzar siempre con 'P.D.' y debe reforzar la urgencia o deseo de tomar acción. No des explicaciones de nada acerca de las postdatas, ni como las creaste."
49
- f"La postdata debe ser breve, clara y persuasiva, y no debe ser una repetición del CTA. "
50
- f"El tema o enfoque para la postdata es '{theme_or_focus}'."
51
- "Ejemplos de postdata incluyen:\n"
52
- "P.D. No te pierdas la oportunidad de transformar tu futuro, te esperamos en el evento\n"
53
- "P.D. Recuerda que las plazas son limitadas, inscríbete ahora antes de que se agoten"
54
- )
55
-
56
- # Configuración del modelo para generar la postdata
57
- generation_config = {
58
- "temperature": temperature,
59
- "top_p": 0.85,
60
- "top_k": 128,
61
- "max_output_tokens": 8196,
62
- "response_mime_type": "text/plain",
63
- }
64
-
65
- model = genai.GenerativeModel(
66
- model_name="gemini-1.5-flash",
67
- generation_config=generation_config,
68
- system_instruction=postdata_instruction
69
- )
70
-
71
- # Generar la postdata
72
- try:
73
- response = model.generate_content([postdata_instruction])
74
- generated_postdata = response.candidates[0].content.parts[0].text.strip()
75
- return generated_postdata
76
- except Exception as e:
77
- raise ValueError(f"Error al generar la postdata: {str(e)}")
78
-
79
- # Ejemplos de llamados a la acción por tipo
80
- cta_types = {
81
- "directos": [
82
- "asiste a nuestro webinar para convertirte en un padre amoroso.",
83
- "regístrate en nuestro curso para mejorar tu habilidad en ventas.",
84
- "comienza ahora para acceder a contenido exclusivo que transformará tu negocio."
85
- ],
86
- "urgencia": [
87
- "inscríbete ahora antes de que se agoten las plazas para el evento.",
88
- "actúa rápido y comienza tu proceso de transformación hoy mismo."
89
- ],
90
- "descuento": [
91
- "aprovecha este descuento especial y empieza a aprender con nosotros.",
92
- "obtén un descuento exclusivo al registrarte hoy."
93
- ],
94
- "exclusividad": [
95
- "conviértete en parte de nuestro grupo exclusivo de miembros.",
96
- "disfruta de acceso único a herramientas premium con tu suscripción."
97
- ],
98
- "beneficio_claro": [
99
- "mejora tu productividad en solo una semana.",
100
- "transforma tu vida y tus resultados con nuestra metodología probada."
101
- ],
102
- "personalización": [
103
- "descubre cómo puedes personalizar tu experiencia con nuestro curso.",
104
- "elige las opciones que mejor se adapten a tus necesidades y comienza hoy."
105
- ]
106
- }
107
-
108
- # Función para que el modelo elija automáticamente el tipo de CTA y el CTA específico
109
- def get_random_cta():
110
- cta_type = random.choice(list(cta_types.keys())) # Selección aleatoria del tipo de CTA
111
- cta = random.choice(cta_types[cta_type]) # Selección aleatoria del CTA dentro del tipo
112
- return cta
113
-
114
- # Función para generar llamados a la acción
115
- def generate_ctas(number_of_ctas, target_audience, product, call_to_action, temperature):
116
- product_mention = get_random_product_mention()
117
- mention_instruction = get_mention_instruction(product_mention, product)
118
-
119
- # Configuración del modelo
120
- generation_config = {
121
- "temperature": temperature,
122
- "top_p": 0.85,
123
- "top_k": 128,
124
- "max_output_tokens": 2048,
125
- "response_mime_type": "text/plain",
126
- }
127
-
128
- model = genai.GenerativeModel(
129
- model_name="gemini-1.5-flash",
130
- generation_config=generation_config,
131
- system_instruction=(
132
- f"Eres un experto copywriter especializado en escribir mensajes persuasivos para promover {product} a {target_audience}. "
133
- "Tu tarea es ayudarme a escribir llamados a la acción (CTA) para que tomen una acción específica, no des ninguna explicación, solo contesta lo que se te pide. "
134
- f"como {call_to_action}. Asegúrate de que cada llamado a la acción siga la estructura 'Acción + conector + Valor'."
135
- )
136
- )
137
-
138
- selected_types = random.sample(list(cta_types.keys()), min(number_of_ctas, len(cta_types)))
139
- ctas_instruction = (
140
- f"Tu tarea es crear {number_of_ctas} llamados a la acción efectivos dirigidos a {target_audience}, "
141
- f"para promover {call_to_action} usa la siguiente mención: {mention_instruction}."
142
- )
143
-
144
- try:
145
- response = model.generate_content([ctas_instruction])
146
- generated_ctas = response.candidates[0].content.parts[0].text.strip()
147
- return generated_ctas
148
- except Exception as e:
149
- raise ValueError(f"Error al generar los CTA: {str(e)}")
150
-
151
- # Configurar la interfaz de usuario con Streamlit
152
- st.set_page_config(page_title="QuickPrompt", layout="wide")
153
-
154
- st.markdown("<h1 style='text-align: center;'>Quick Prompt</h1>", unsafe_allow_html=True)
155
- st.markdown("<h4 style='text-align: center;'>Transforma tu mensaje en llamados de acción que inspiren a tu audiencia a tomar decisiones al instante.</h4>", unsafe_allow_html=True)
156
-
157
- # Añadir CSS personalizado para el botón
158
- st.markdown("""
159
- <style>
160
- div.stButton > button {
161
- background-color: #FFCC00;
162
- color: black;
163
- width: 90%;
164
- height: 60px;
165
- font-weight: bold;
166
- font-size: 22px;
167
- text-transform: uppercase;
168
- border: 1px solid #000000;
169
- border-radius: 8px;
170
- display: block;
171
- margin: 0 auto;
172
- }
173
- div.stButton > button:hover {
174
- background-color: #FFD700;
175
- color: black;
176
- }
177
- </style>
178
- """, unsafe_allow_html=True)
179
-
180
- # Crear columnas
181
- col1, col2 = st.columns([1, 2])
182
-
183
- # Columnas de entrada
184
- with col1:
185
- target_audience = st.text_input("¿Quién es tu público objetivo?", placeholder="Ejemplo: Estudiantes Universitarios")
186
- product = st.text_input("¿Qué producto tienes en mente?", placeholder="Ejemplo: Curso de Inglés")
187
- call_to_action = st.text_input("¿Qué acción deseas que tomen?", placeholder="Ejemplo: Inscribirse al curso")
188
- theme_or_focus = st.text_input("Tema o enfoque para la postdata", placeholder="Ejemplo: urgencia, beneficio, descuento")
189
- number_of_ctas = st.selectbox("Número de llamados a la acción", options=[1, 2, 3, 4, 5], index=2)
190
- temperature = st.slider("Creatividad", min_value=0.0, max_value=2.0, value=0.8, step=0.1)
191
-
192
- # Botón de enviar
193
- submit = st.button("Generar Llamados a la Acción")
194
-
195
- # Mostrar los llamados a la acción generados
196
- if submit:
197
- if target_audience and product and call_to_action:
198
- try:
199
- intro_text = generate_intro_text() # Generar el texto introductorio
200
- generated_ctas = generate_ctas(number_of_ctas, target_audience, product, call_to_action, temperature)
201
- # Generar la postdata
202
- postdata = generate_postdata(target_audience, product, call_to_action, temperature, theme_or_focus)
203
-
204
- col2.markdown(f"""
205
- <div style="border: 1px solid #000000; padding: 5px; border-radius: 8px; background-color: #ffffff;">
206
- <h4>{intro_text}</h4>
207
- <p>{generated_ctas}</p>
208
- <p><strong>{postdata}</strong></p> <!-- Mostramos la postdata aquí -->
209
- </div>
210
- """, unsafe_allow_html=True)
211
-
212
- except ValueError as e:
213
- col2.error(f"Error: {str(e)}")
214
- except Exception as e:
215
- col2.error(f"Error inesperado: {str(e)}")
216
- else:
217
- col2.error("Por favor, proporciona el público objetivo, el producto y la acción.")
 
 
 
 
1
+ from dotenv import load_dotenv
2
+ import streamlit as st
3
+ import os
4
+ import google.generativeai as genai
5
+ from cta_formulas import cta_formulas
6
+ from postdata_types import postdata_types
7
+ from styles import apply_styles
8
+
9
+ # Cargar variables de entorno
10
+ load_dotenv()
11
+
12
+ # Configurar API de Google Gemini
13
+ genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
14
+
15
+ def get_gemini_response(product_service, target_audience, desired_action, formula_type, postdata_type, postdata_data, include_timezone, temperature):
16
+ if not product_service or not target_audience or not desired_action:
17
+ return "Por favor, completa todos los campos requeridos."
18
+
19
+ formula = cta_formulas[formula_type]
20
+
21
+ model = genai.GenerativeModel('gemini-1.5-flash')
22
+ full_prompt = f"""
23
+ You are an expert copywriter specialized in creating persuasive Calls to Action (CTAs).
24
+ Analyze (internally, don't include in output) the following information:
25
+
26
+ BUSINESS INFORMATION:
27
+ Product/Service: {product_service}
28
+ Target Audience: {target_audience}
29
+ Desired Action: {desired_action}
30
+ CTA Type: {formula_type}
31
+ {formula["description"]}
32
+
33
+ EXAMPLES TO FOLLOW:
34
+ {formula["examples"]}
35
+
36
+ First, analyze (but don't show) these points:
37
+ 1. TARGET AUDIENCE ANALYSIS:
38
+ - What motivates them to take action?
39
+ - What obstacles prevent them from acting?
40
+ - What immediate benefits are they seeking?
41
+ - What fears or doubts do they have?
42
+ - What language and tone resonates with them?
43
+
44
+ 2. DESIRED ACTION ANALYSIS:
45
+ - How complex is the requested action?
46
+ - What immediate benefit do they get from acting?
47
+ - What guarantees or social proof can motivate action?
48
+ - What real urgency or scarcity exists?
49
+ - What specific value will they receive?
50
+
51
+ Based on your internal analysis (don't include it in the output), create FIVE different CTAs in Spanish following the provided formula structure.
52
+
53
+ CRITICAL INSTRUCTIONS:
54
+ - Each CTA must be specific and action-oriented
55
+ - Use powerful imperative verbs
56
+ - Include a clear, measurable benefit
57
+ - Create urgency when appropriate
58
+ - Maximum 2 lines per CTA
59
+ - DO NOT include any analysis in the output
60
+ - ONLY output the five CTAs
61
+ - ALL CTAs MUST BE IN SPANISH
62
+
63
+ Output EXACTLY in this format (no additional text):
64
+ 1. [First CTA in Spanish]
65
+ 2. [Second CTA in Spanish]
66
+ 3. [Third CTA in Spanish]
67
+ 4. [Fourth CTA in Spanish]
68
+ 5. [Fifth CTA in Spanish]
69
+ """
70
+
71
+ # Add postdata information to the prompt
72
+ postdata_info = postdata_types[postdata_type]
73
+
74
+ full_prompt = f"""
75
+ You are an expert copywriter specialized in creating persuasive Calls to Action (CTAs).
76
+ Analyze (internally, don't include in output) the following information:
77
+
78
+ BUSINESS INFORMATION:
79
+ Product/Service: {product_service}
80
+ Target Audience: {target_audience}
81
+ Desired Action: {desired_action}
82
+ CTA Type: {formula_type}
83
+ {formula["description"]}
84
+
85
+ EXAMPLES TO FOLLOW:
86
+ {formula["examples"]}
87
+
88
+ First, analyze (but don't show) these points:
89
+ 1. TARGET AUDIENCE ANALYSIS:
90
+ - What motivates them to take action?
91
+ - What obstacles prevent them from acting?
92
+ - What immediate benefits are they seeking?
93
+ - What fears or doubts do they have?
94
+ - What language and tone resonates with them?
95
+
96
+ 2. DESIRED ACTION ANALYSIS:
97
+ - How complex is the requested action?
98
+ - What immediate benefit do they get from acting?
99
+ - What guarantees or social proof can motivate action?
100
+ - What real urgency or scarcity exists?
101
+ - What specific value will they receive?
102
+
103
+ Based on your internal analysis (don't include it in the output), create FIVE different CTAs in Spanish following the provided formula structure.
104
+
105
+ CRITICAL INSTRUCTIONS:
106
+ - Each CTA must be specific and action-oriented
107
+ - Use powerful imperative verbs
108
+ - Include a clear, measurable benefit
109
+ - Create urgency when appropriate
110
+ - Maximum 2 lines per CTA
111
+ - DO NOT include any analysis in the output
112
+ - ONLY output the five CTAs
113
+ - ALL CTAs MUST BE IN SPANISH
114
+
115
+ Output EXACTLY in this format (no additional text):
116
+ 1. [First CTA in Spanish]
117
+ 2. [Second CTA in Spanish]
118
+ 3. [Third CTA in Spanish]
119
+ 4. [Fourth CTA in Spanish]
120
+ 5. [Fifth CTA in Spanish]
121
+ """
122
+
123
+ response = model.generate_content([full_prompt], generation_config={"temperature": temperature})
124
+ return response.parts[0].text if response and response.parts else "Error al generar contenido."
125
+
126
+ # Configurar la aplicación Streamlit
127
+ st.set_page_config(page_title="CTA Generator", page_icon="🎯", layout="wide")
128
+
129
+ # Aplicar estilos
130
+ st.markdown(apply_styles(), unsafe_allow_html=True)
131
+
132
+ # Título de la app
133
+ st.markdown("<h1>Generador de CTAs Persuasivos</h1>", unsafe_allow_html=True)
134
+ st.markdown("<h3>Crea llamados a la acción que motiven a tu audiencia a dar el siguiente paso.</h3>", unsafe_allow_html=True)
135
+
136
+ # Crear dos columnas
137
+ col1, col2 = st.columns([1, 1])
138
+
139
+ # Columna izquierda para inputs
140
+ with col1:
141
+ target_audience = st.text_area(
142
+ "¿Cuál es tu público objetivo?",
143
+ placeholder="Ejemplo: Emprendedores que buscan automatizar su negocio..."
144
+ )
145
+
146
+ product_service = st.text_area(
147
+ "¿Cuál es tu producto o servicio?",
148
+ placeholder="Ejemplo: Curso de automatización con IA, Software de gestión..."
149
+ )
150
+
151
+ desired_action = st.text_area(
152
+ "¿Qué acción quieres que realicen?",
153
+ placeholder="Ejemplo: Registrarse al webinar, Descargar la guía gratuita..."
154
+ )
155
+
156
+ with st.expander("Opciones avanzadas"):
157
+ formula_type = st.selectbox(
158
+ "Tipo de CTA:",
159
+ options=list(cta_formulas.keys())
160
+ )
161
+
162
+ postdata_type = st.selectbox(
163
+ "Tipo de Postdata:",
164
+ options=list(postdata_types.keys()),
165
+ help="Selecciona el tipo de postdata que quieres incluir"
166
+ )
167
+
168
+ if postdata_type == "Testimonial":
169
+ testimonial_name = st.text_input("Nombre del cliente", placeholder="Ej: María López")
170
+ testimonial_result = st.text_input("Resultado obtenido", placeholder="Ej: duplicó sus ventas en 2 meses")
171
+ testimonial_quote = st.text_input("Cita del testimonio", placeholder="Ej: Este método transformó mi negocio")
172
+ elif postdata_type == "Urgencia":
173
+ urgency_reason = st.text_input("Razón de urgencia", placeholder="Ej: Solo quedan 5 plazas disponibles")
174
+ elif postdata_type == "Beneficio_Extra":
175
+ bonus_description = st.text_input("Descripción del bonus", placeholder="Ej: Guía de headlines que convierten")
176
+ bonus_value = st.number_input("Valor del bonus ($)", min_value=0, value=97)
177
+
178
+ include_timezone = st.checkbox("Incluir tabla de horarios", value=True)
179
+
180
+ temperature = st.slider(
181
+ "Nivel de creatividad:",
182
+ min_value=0.0,
183
+ max_value=2.0,
184
+ value=1.0,
185
+ step=0.1,
186
+ help="Valores más altos generan CTAs más creativos pero menos predecibles."
187
+ )
188
+
189
+ generate_button = st.button("Generar CTAs")
190
+
191
+ # Update the button click handler
192
+ if generate_button:
193
+ # Prepare postdata data based on type
194
+ postdata_data = {}
195
+ if postdata_type == "Testimonial":
196
+ postdata_data = {
197
+ "nombre_cliente": testimonial_name,
198
+ "resultado_específico": testimonial_result,
199
+ "cita_testimonial": testimonial_quote
200
+ }
201
+ elif postdata_type == "Urgencia":
202
+ postdata_data = {"razón_urgencia": urgency_reason}
203
+ elif postdata_type == "Beneficio_Extra":
204
+ postdata_data = {
205
+ "beneficio_sorpresa": bonus_description,
206
+ "precio": bonus_value
207
+ }
208
+
209
+ response = get_gemini_response(
210
+ product_service,
211
+ target_audience,
212
+ desired_action,
213
+ formula_type,
214
+ postdata_type,
215
+ postdata_data,
216
+ include_timezone,
217
+ temperature
218
+ )
219
+ st.write("### Tus Llamados a la Acción")
220
+ st.write(response)
cta_formulas.py ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ cta_formulas = {
2
+ "Directo": {
3
+ "description": """
4
+ Fórmula: [Verbo imperativo + Beneficio inmediato]
5
+ Esta fórmula va directo al grano, indicando exactamente qué hacer y qué obtendrá.
6
+ """,
7
+ "examples": """
8
+ - "Regístrate ahora y obtén acceso instantáneo a 50 plantillas"
9
+ - "Descarga gratis la guía y domina el copywriting en 30 días"
10
+ - "Reserva tu lugar hoy y ahorra 40% en tu entrada VIP"
11
+ """
12
+ },
13
+ "Urgencia": {
14
+ "description": """
15
+ Fórmula: [Límite de tiempo/cantidad + Acción + Beneficio]
16
+ Crea sensación de escasez y motiva la acción inmediata.
17
+ """,
18
+ "examples": """
19
+ - "¡Solo quedan 5 plazas! Asegura tu lugar en el programa"
20
+ - "Última oportunidad: Inscríbete antes del viernes y recibe un bonus exclusivo"
21
+ - "Oferta por 24 horas: Accede al curso con 50% de descuento"
22
+ """
23
+ },
24
+ "Problema-Solución": {
25
+ "description": """
26
+ Fórmula: [¿Problema? + Solución + Acción]
27
+ Conecta con el dolor del lector y ofrece la solución inmediata.
28
+ """,
29
+ "examples": """
30
+ - "¿Cansado de no conseguir clientes? Descubre el método probado aquí"
31
+ - "¿Frustrado con tu marketing? Aprende la estrategia que funciona"
32
+ - "¿Sin tiempo para crear contenido? Accede a nuestro sistema automatizado"
33
+ """
34
+ },
35
+ "Beneficio-Acción": {
36
+ "description": """
37
+ Fórmula: [Beneficio principal + Cómo obtenerlo]
38
+ Enfatiza el resultado deseado y muestra cómo conseguirlo.
39
+ """,
40
+ "examples": """
41
+ - "Duplica tus ingresos en 90 días: Únete al programa ahora"
42
+ - "Domina la persuasión en 4 semanas: Reserva tu plaza aquí"
43
+ - "Consigue tus primeros 1000 suscriptores: Descarga la guía gratuita"
44
+ """
45
+ },
46
+ # In each formula where you want to add postdata variations, update the examples like this:
47
+
48
+ "Cierre-Urgente": {
49
+ "description": """
50
+ Fórmula: [Emoji + Invitación personal + Hora específica + Beneficio claro + Firma personal + (Tabla de horarios/Postdata persuasiva)]
51
+ Crea conexión inmediata con emoji visual, especifica hora exacta y beneficio claro.
52
+ Incluye firma personal para humanizar y una postdata estratégica.
53
+ """,
54
+ "examples": """
55
+ - "👀 Te veo hoy a las 05:00 pm de México para compartirte lo que necesitas saber para conectar, persuadir y vender con tus textos.
56
+
57
+ Hasta entonces,
58
+ Jesús Cabrera
59
+
60
+ P.D. María, una de mis estudiantes, facturó $5,000 en su primer mes aplicando estas técnicas. "El sistema de Jesús cambió mi forma de ver el copywriting para siempre"
61
+
62
+ P.D.2 Si tienes dudas de horarios:
63
+ 05:00 pm: México, El Salvador, Nicaragua"
64
+
65
+ - "🚀 Te espero mañana a las 07:00 pm de México para revelarte las 5 estrategias que multiplicarán tus ventas.
66
+
67
+ ¡Nos vemos!
68
+ Ana Martínez
69
+
70
+ P.D. Solo tengo 20 lugares disponibles y ya hay 15 registrados. Los últimos 5 recibirán una revisión personal de sus textos (valor: $200)"
71
+ """
72
+ },
73
+ "Cierre-Emocional": {
74
+ "description": """
75
+ Fórmula: [Emoji + Expresión emocional + Anticipación de valor + Acción clara + Beneficio aspiracional + Firma personal]
76
+ Crea conexión emocional y genera expectativa, usando tono cercano y amigable.
77
+ Enfatiza el valor futuro y la transformación personal.
78
+ """,
79
+ "examples": """
80
+ - "✨ Estoy tan emocionado por verte para aplicar todos estos conceptos.
81
+
82
+ Haz clic aquí para registrarte al webinar y volverte el copy que todo mundo quiere que les escriba sus textos.
83
+
84
+ Hasta luego,
85
+ Jesús Cabrera"
86
+
87
+ - "🌟 No puedo esperar para compartirte todas las estrategias que he preparado.
88
+
89
+ Reserva tu lugar ahora y conviértete en el experto en ventas que las marcas buscan desesperadamente.
90
+
91
+ ¡Nos vemos pronto!
92
+ María González"
93
+
94
+ - "💫 Me emociona saber que pronto descubrirás todo lo que puedes lograr.
95
+
96
+ Asegura tu acceso al taller y transfórmate en el consultor digital que las empresas necesitan.
97
+
98
+ Con entusiasmo,
99
+ Carlos Mendoza"
100
+ """
101
+ },
102
+ "Cierre-Divertido": {
103
+ "description": """
104
+ Fórmula: [Emoji + Pregunta divertida + Metáfora creativa + Hora específica + Firma con apodo + Tabla de horarios]
105
+ Usa humor y metáforas creativas para generar interés y anticipación.
106
+ Incluye un toque personal con apodo divertido en la firma.
107
+ """,
108
+ "examples": """
109
+ - "🔥 ¿Listo para sacarle chispas a tus textos? Porque esta tarde te enseñaré cómo convertir palabras en armas secretas de persuasión.
110
+
111
+ Te espero a las 05:00 pm de México, no llegues tarde.
112
+
113
+ Hasta entonces,
114
+ Jesús "el transformador de textos" Cabrera
115
+
116
+ P.D. En caso de que necesites confirmar horarios, aquí te dejo una ayudita:
117
+ 05:00 pm: México, El Salvador, Nicaragua, Costa Rica, Honduras"
118
+
119
+ - "⚡ ¿Preparado para hacer que tu Instagram eche humo? Hoy revelaré los trucos ninja del contenido viral.
120
+
121
+ La diversión comienza a las 07:00 pm hora México, ¡no te lo pierdas!
122
+
123
+ Nos vemos al rato,
124
+ Ana "la maga del engagement" Rodríguez
125
+
126
+ P.D. Aquí los horarios para que no te pierdas la fiesta:
127
+ 07:00 pm: México, Guatemala
128
+ 08:00 pm: Colombia, Ecuador
129
+ 10:00 pm: Argentina, Chile"
130
+
131
+ - "🎯 ¿Quieres que tus emails sean tan irresistibles como el último capítulo de tu serie favorita? Prepárate para dominar el arte del email marketing que engancha.
132
+
133
+ La magia sucede a las 06:00 pm Colombia, ¡trae palomitas!
134
+
135
+ ¡Hasta pronto!
136
+ Carlos "el hechicero de emails" Mendoza
137
+
138
+ P.D. Encuentra tu hora mágica aquí:
139
+ 04:00 pm: México, Guatemala
140
+ 06:00 pm: Colombia, Perú
141
+ 08:00 pm: Argentina, Chile"
142
+ """
143
+ }
144
+ }
manual.md ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ **Bienvenid@ Copy Xpert**
2
+
3
+ Crea Propuestas Únicas de Valor (PUV) persuasivas que conecten con tus clientes ideales y comuniquen efectivamente tu valor en el mercado.
4
+
5
+ ### ¿Cómo usar el Generador de PUV?
6
+
7
+ Sigue estos pasos para aprovechar al máximo la herramienta:
8
+
9
+ ### 1. Configuración Básica
10
+
11
+ #### Producto/Servicio
12
+ - Describe tu solución claramente
13
+ - Enfócate en los beneficios principales
14
+ - Ejemplos específicos:
15
+
16
+ - "Curso de LinkedIn Orgánico: De 0 a 10k seguidores en 90 días"
17
+ - "Software de Automatización para Pequeños Negocios"
18
+ - "Programa de Coaching Transformacional de 12 Semanas"
19
+ - "Agencia de Marketing Digital Especializada en E-commerce"
20
+ - "Plataforma de Cursos Online para Creadores"
21
+
22
+ #### Público Objetivo
23
+ - Define quién es tu cliente ideal
24
+ - Incluye sus dolores, deseos y aspiraciones
25
+ - Ejemplos detallados:
26
+
27
+ - "Emprendedores digitales entre 30-45 años que luchan por conseguir clientes en LinkedIn"
28
+ - "Coaches profesionales que quieren destacar en un mercado saturado"
29
+ - "Dueños de pequeños negocios que buscan automatizar sus procesos"
30
+ - "Dueños de tiendas online con ingresos de $10k-50k mensuales"
31
+ - "Creadores de contenido que luchan por monetizar su audiencia"
32
+
33
+ ### 2. Fórmulas Disponibles
34
+
35
+ #### Fórmula Tradicional
36
+ Ideal para:
37
+ - Comunicación clara y directa
38
+ - Servicios profesionales tradicionales
39
+ - Cuando necesitas un enfoque directo y estructurado
40
+ - Mercados que valoran la claridad
41
+ - Servicios B2B establecidos
42
+
43
+ #### Fórmula Anti-tradicional
44
+ Ideal para:
45
+ - Servicios innovadores
46
+ - Cuando buscas diferenciarte
47
+ - Mercados competitivos
48
+ - Propuestas disruptivas
49
+ - Transformaciones profundas
50
+
51
+ #### Contrato Imposible
52
+ Ideal para:
53
+ - Ofertas disruptivas
54
+ - Soluciones innovadoras
55
+ - Desafiar las normas de la industria
56
+ - Productos/servicios de alto ticket
57
+ - Cuando quieres destacar
58
+
59
+ #### Reto Ridículo
60
+ Ideal para:
61
+ - Simplificar soluciones complejas
62
+ - Romper barreras con humor
63
+ - Abordar frustraciones comunes
64
+ - Cuando quieres mostrar facilidad de uso
65
+ - Convertir escépticos con historias
66
+
67
+ ### 3. Mejores Prácticas
68
+
69
+ #### Para Resultados Óptimos
70
+ 1. Sé específico con tu público objetivo
71
+ - ❌ "Emprendedores que quieren vender más"
72
+ - ✅ "Emprendedores de e-commerce que facturan $5k-$10k mensuales y buscan escalar"
73
+
74
+ 2. Enfócate en la transformación
75
+ - ❌ "Un buen curso de marketing"
76
+ - ✅ "Un sistema probado que convierte coaches frustrados en expertos con agenda llena"
77
+
78
+ 3. Usa resultados medibles
79
+ - ❌ "Mejora tu negocio"
80
+ - ✅ "Duplica tu base de clientes en 90 días"
81
+
82
+ 4. Incluye diferenciadores
83
+ - ❌ "Ayudo a negocios a crecer"
84
+ - ✅ "Ayudo a proveedores de servicios a triplicar sus precios sin perder clientes"
85
+
86
+ #### Evitar
87
+ 1. Declaraciones genéricas
88
+ - ❌ "El mejor servicio del mercado"
89
+ - ✅ "La única estrategia de LinkedIn que garantiza 50 leads mensuales"
90
+
91
+ 2. Jerga técnica
92
+ - ❌ "Implementando modelos de atribución multicanal"
93
+ - ✅ "Por fin sabrás exactamente de dónde vienen tus mejores clientes"
94
+
95
+ 3. Promesas vagas
96
+ - ❌ "Obtén mejores resultados"
97
+ - ✅ "Genera tus primeros $10k mensuales en 90 días"
98
+
99
+ ### Consejos Avanzados
100
+
101
+ 1. **Ajuste del Nivel de Creatividad**
102
+ - Bajo (0.0-0.7): Resultados más conservadores y consistentes
103
+ - Medio (0.8-1.2): Balance entre creatividad y confiabilidad
104
+ - Alto (1.3-2.0): Ángulos más innovadores e inesperados
105
+
106
+ 2. **Selección de Fórmula**
107
+ - Fórmula Tradicional: Para comunicación clara y directa
108
+ - Fórmula Anti-tradicional: Para un enfoque más creativo y personal
109
+ - Contrato Imposible: Para disrumpir el mercado
110
+ - Reto Ridículo: Para conectar con humor y autenticidad
111
+
112
+ 3. **Pruebas y Mejora**
113
+ - Prueba diferentes fórmulas para la misma oferta
114
+ - Experimenta con varios niveles de creatividad
115
+ - Mantén lo que resuena con tu audiencia
116
+
117
+ Recuerda: Una gran PUV debe hacer que tu cliente ideal piense, "¡Esto es exactamente lo que estaba buscando!"
styles.py ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+
3
+ def apply_styles():
4
+ return """
5
+ <style>
6
+ h1, h3 {
7
+ text-align: center;
8
+ }
9
+
10
+ .stButton > button {
11
+ background-color: #FFD700 !important;
12
+ color: black !important;
13
+ border: 1px solid black !important;
14
+ font-weight: bold !important;
15
+ width: 80% !important;
16
+ margin-left: 10% !important;
17
+ }
18
+ </style>
19
+ """
20
+ st.markdown("""
21
+ <style>
22
+ .stTextArea > label {
23
+ font-size: 1.2rem;
24
+ font-weight: bold;
25
+ color: #2c3e50;
26
+ }
27
+
28
+ .stSelectbox > label {
29
+ font-size: 1.2rem;
30
+ font-weight: bold;
31
+ color: #2c3e50;
32
+ }
33
+
34
+ .stSlider > label {
35
+ font-size: 1.2rem;
36
+ font-weight: bold;
37
+ color: #2c3e50;
38
+ }
39
+
40
+ .stButton > button {
41
+ background-color: #2c3e50;
42
+ color: white;
43
+ padding: 0.5rem 2rem;
44
+ font-size: 1.1rem;
45
+ font-weight: bold;
46
+ border-radius: 5px;
47
+ }
48
+
49
+ .stButton > button:hover {
50
+ background-color: #34495e;
51
+ }
52
+
53
+ h1 {
54
+ color: #2c3e50;
55
+ font-size: 2.5rem;
56
+ margin-bottom: 1rem;
57
+ }
58
+
59
+ h3 {
60
+ color: #34495e;
61
+ font-size: 1.3rem;
62
+ font-weight: normal;
63
+ margin-bottom: 2rem;
64
+ }
65
+
66
+ .stMarkdown {
67
+ font-size: 1.1rem;
68
+ }
69
+
70
+ .element-container {
71
+ margin-bottom: 1.5rem;
72
+ }
73
+ </style>
74
+ """, unsafe_allow_html=True)
75
+
76
+ def format_story_output(story_text):
77
+ return f"""
78
+ <div class="story-output">
79
+ {story_text}
80
+ </div>
81
+ """