Spaces:
Running
Running
Upload 11 files
Browse files- README.md +3 -3
- ad_objectives.py +45 -0
- ads_formulas.py +214 -0
- app.py +71 -47
- copywriter_personas.py +68 -0
- emotional_angles.py +72 -0
- prompts.py +136 -53
README.md
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
---
|
2 |
license: afl-3.0
|
3 |
-
title:
|
4 |
sdk: streamlit
|
5 |
emoji: 🏆
|
6 |
colorFrom: red
|
7 |
colorTo: yellow
|
8 |
pinned: true
|
9 |
-
sdk_version: 1.
|
10 |
-
short_description:
|
11 |
---
|
|
|
1 |
---
|
2 |
license: afl-3.0
|
3 |
+
title: Bullet_Generator 2G
|
4 |
sdk: streamlit
|
5 |
emoji: 🏆
|
6 |
colorFrom: red
|
7 |
colorTo: yellow
|
8 |
pinned: true
|
9 |
+
sdk_version: 1.42.2
|
10 |
+
short_description: Transform your audience's thoughts into persuasive bullets
|
11 |
---
|
ad_objectives.py
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Diccionario de objetivos de anuncios de Meta
|
2 |
+
ad_objectives = {
|
3 |
+
"ninguno": {
|
4 |
+
"name": "Ninguno",
|
5 |
+
"description": "Sin objetivo específico de campaña",
|
6 |
+
"key_metrics": ["Métricas generales"],
|
7 |
+
"copy_strategy": "Crear un anuncio equilibrado sin enfoque en métricas específicas"
|
8 |
+
},
|
9 |
+
"awareness": {
|
10 |
+
"name": "Reconocimiento",
|
11 |
+
"description": "Aumentar la visibilidad de tu marca y llegar a personas con mayor probabilidad de recordarla",
|
12 |
+
"key_metrics": ["Alcance", "Impresiones", "Mejora de recuerdo del anuncio", "Reproducciones de video"],
|
13 |
+
"copy_strategy": "Utilizar mensajes memorables que destaquen la identidad de marca, crear contenido que genere impacto visual y emocional, y enfatizar lo que hace única a la marca"
|
14 |
+
},
|
15 |
+
"traffic": {
|
16 |
+
"name": "Tráfico",
|
17 |
+
"description": "Dirigir personas a un destino específico como sitio web, página de Facebook, tienda de Instagram o app",
|
18 |
+
"key_metrics": ["Clics en enlaces", "Visualizaciones de página", "Alcance único diario", "Impresiones"],
|
19 |
+
"copy_strategy": "Incluir CTAs claros y directos, crear urgencia para visitar el destino, destacar el valor que encontrarán al hacer clic, y usar lenguaje que invite a la acción inmediata"
|
20 |
+
},
|
21 |
+
"engagement": {
|
22 |
+
"name": "Interacción",
|
23 |
+
"description": "Promover interacciones con tu página, publicaciones, videos o iniciar conversaciones en Messenger",
|
24 |
+
"key_metrics": ["Interacciones con la página", "Interacciones con publicaciones", "Reproducciones de video", "Mensajes"],
|
25 |
+
"copy_strategy": "Formular preguntas intrigantes, invitar a compartir opiniones, crear contenido que genere debate, y utilizar un tono conversacional que fomente la participación"
|
26 |
+
},
|
27 |
+
"leads": {
|
28 |
+
"name": "Clientes potenciales",
|
29 |
+
"description": "Recopilar información de contacto de personas interesadas en tu negocio a través de formularios",
|
30 |
+
"key_metrics": ["Generación de leads", "Mensajes", "Conversiones", "Costo por lead"],
|
31 |
+
"copy_strategy": "Ofrecer valor claro a cambio de la información de contacto, destacar beneficios exclusivos, minimizar la percepción de riesgo, y crear una sensación de oportunidad limitada"
|
32 |
+
},
|
33 |
+
"app_promotion": {
|
34 |
+
"name": "Promoción de la app",
|
35 |
+
"description": "Aumentar las instalaciones y acciones específicas dentro de tu aplicación móvil",
|
36 |
+
"key_metrics": ["Instalaciones de app", "Acciones en la app", "Costo por instalación"],
|
37 |
+
"copy_strategy": "Destacar las funcionalidades únicas de la app, enfatizar la facilidad de uso, mostrar capturas de pantalla atractivas, y comunicar claramente el problema que resuelve la app"
|
38 |
+
},
|
39 |
+
"sales": {
|
40 |
+
"name": "Ventas",
|
41 |
+
"description": "Maximizar las conversiones y ventas en tu sitio web, app o tienda en Facebook o Instagram",
|
42 |
+
"key_metrics": ["Conversiones", "Ventas de catálogo", "Valor de pedido promedio", "ROAS"],
|
43 |
+
"copy_strategy": "Enfatizar ofertas irresistibles, crear sensación de escasez o urgencia, destacar testimonios de clientes satisfechos, y eliminar objeciones de compra con garantías claras"
|
44 |
+
}
|
45 |
+
}
|
ads_formulas.py
ADDED
@@ -0,0 +1,214 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
ads_formulas = {
|
2 |
+
"PASA": {
|
3 |
+
"description": """
|
4 |
+
La fórmula P.A.S.A. es una de las estructuras más efectivas en copywriting, diseñada para crear una conexión emocional profunda que lleva a la acción.
|
5 |
+
TEORÍA:
|
6 |
+
Esta fórmula se basa en la psicología del dolor y el alivio, siguiendo el principio de que las personas están más motivadas a evitar el dolor que a buscar el placer.
|
7 |
+
ESTRUCTURA:
|
8 |
+
1. Problema:
|
9 |
+
- Identifica un dolor específico y real
|
10 |
+
- Debe ser inmediatamente reconocible por la audiencia
|
11 |
+
- Se presenta desde la perspectiva del lector
|
12 |
+
- Usa lenguaje empático y comprensivo
|
13 |
+
2. Agitación:
|
14 |
+
- Profundiza en las consecuencias emocionales
|
15 |
+
- Explora ramificaciones futuras
|
16 |
+
- Aumenta la tensión psicológica
|
17 |
+
- Crea un punto de inflexión emocional
|
18 |
+
3. Solución:
|
19 |
+
- Presenta la respuesta de forma natural
|
20 |
+
- Enfoca en beneficios transformacionales
|
21 |
+
- Construye credibilidad gradualmente
|
22 |
+
- Demuestra el cambio positivo
|
23 |
+
4. Acción:
|
24 |
+
- Propone el siguiente paso lógico
|
25 |
+
- Minimiza la fricción y resistencia
|
26 |
+
- Crea sentido de urgencia
|
27 |
+
""",
|
28 |
+
"examples": [
|
29 |
+
{
|
30 |
+
"title": "Mentoría para Emprendedores que Quieren Vender desde su Autenticidad",
|
31 |
+
"target": "Emprendedores y profesionales que ofrecen servicios",
|
32 |
+
"action": "Reserva tu sesión de 45 minutos y duplica tus ventas siendo tú mismo",
|
33 |
+
"story": """
|
34 |
+
Me quedaba sin palabras en cada llamada de ventas. No porque no supiera de mi trabajo - era porque cada frase sonaba prestada, artificial, como si estuviera leyendo el guion de otra persona.
|
35 |
+
Los potenciales clientes lo sentían. Sus respuestas eran educadas pero distantes: "Necesito pensarlo", "No es el momento", "Te escribo después". El silencio que seguía era ensordecedor.
|
36 |
+
Lo que más me dolía era ver cómo otros, con menos experiencia, conectaban instantáneamente con sus clientes. Sus conversaciones fluían con naturalidad, como si estuvieran charlando con un viejo amigo.
|
37 |
+
La revelación llegó cuando entendí que estaba intentando ser alguien más. Las ventas no se tratan de técnicas perfectas o scripts memorizados - se trata de crear conexiones genuinas.
|
38 |
+
Cuando comencé a ser yo mismo, algo mágico sucedió. Las conversaciones se volvieron fluidas, naturales. Los clientes dejaron de poner excusas y comenzaron a preguntar: "¿Cuándo podemos empezar?"
|
39 |
+
Si te sientes atrapado en un ciclo de conversaciones que no llevan a ninguna parte, hay otra manera.
|
40 |
+
Reserva tu sesión de descubrimiento y en solo 45 minutos descubre cómo tu autenticidad puede ser tu mejor herramienta de ventas.
|
41 |
+
Clic aquí en este link para reservar.
|
42 |
+
"""
|
43 |
+
},
|
44 |
+
{
|
45 |
+
"title": "Curso de Escritura que Transforma Seguidores en Comunidad",
|
46 |
+
"target": "Emprendedores y creadores de contenido",
|
47 |
+
"action": "Descarga la guía 'Escritura que Conecta' y convierte cada post en una máquina de ventas orgánicas",
|
48 |
+
"story": """
|
49 |
+
Cada publicación se sentía como lanzar palabras al vacío. Dedicaba horas puliendo cada frase, solo para ver cómo se perdía en el infinito scroll de las redes sociales. Un like aquí, un comentario allá, pero la conexión real que buscaba nunca llegaba.
|
50 |
+
Lo más frustrante era observar cómo otros creadores, aparentemente sin esfuerzo, construían comunidades vibrantes alrededor de su contenido. Sus palabras resonaban, creaban movimiento, inspiraban acción.
|
51 |
+
La diferencia no estaba en escribir más, ni en seguir las últimas tendencias. Estaba en algo más profundo: la capacidad de transformar experiencias personales en mensajes que tocan el corazón de quien los lee.
|
52 |
+
Cuando dejé de intentar sonar como "experto" y comencé a escribir desde mi verdad, todo cambió. Mis publicaciones dejaron de ser solo contenido y se convirtieron en conversaciones. Los comentarios pasaron de emojis a historias personales. Los seguidores se transformaron en una comunidad conectada por valores compartidos.
|
53 |
+
Si estás cansado de sentir que tus palabras no llegan a donde deberían, si sabes que tienes algo valioso que compartir pero no encuentras cómo expresarlo, hay un camino diferente.
|
54 |
+
Descarga la guía 'Escritura que Conecta' y convierte cada post en una máquina de ventas orgánicas.
|
55 |
+
Para descagar solo da clic aquí.
|
56 |
+
"""
|
57 |
+
}
|
58 |
+
]
|
59 |
+
},
|
60 |
+
|
61 |
+
"ADP": {
|
62 |
+
"description": """
|
63 |
+
La fórmula A.D.P. (Antes/Después/Puente) es una estructura persuasiva que crea una conexión emocional mostrando la transformación desde el problema hasta la solución.
|
64 |
+
TEORÍA:
|
65 |
+
Esta fórmula se basa en el contraste entre la situación actual y el resultado deseado, usando tu solución como el puente natural entre ambos estados.
|
66 |
+
ESTRUCTURA:
|
67 |
+
1. Antes:
|
68 |
+
- Describe vívidamente la situación problemática actual
|
69 |
+
- Refleja las frustraciones y miedos de la audiencia
|
70 |
+
- Identifica los obstáculos que impiden alcanzar objetivos
|
71 |
+
- Usa lenguaje empático y descriptivo
|
72 |
+
- Crea conexión inmediata con experiencias cotidianas
|
73 |
+
2. Después:
|
74 |
+
- Pinta el escenario ideal post-solución
|
75 |
+
- Describe beneficios tangibles y emocionales
|
76 |
+
- Muestra la transformación positiva
|
77 |
+
- Enfatiza el contraste con la situación inicial
|
78 |
+
- Genera deseo por el resultado prometido
|
79 |
+
3. Puente:
|
80 |
+
- Presenta tu solución como el camino natural
|
81 |
+
- Explica el proceso de transformación
|
82 |
+
- Demuestra la viabilidad del cambio
|
83 |
+
- Minimiza barreras y objeciones
|
84 |
+
- Proporciona pasos claros hacia el resultado
|
85 |
+
""",
|
86 |
+
"examples": [
|
87 |
+
{
|
88 |
+
"title": "Curso de Cocina Saludable",
|
89 |
+
"target": "Profesionales sin tiempo",
|
90 |
+
"action": "Reservar clase prueba gratuita",
|
91 |
+
"story": """
|
92 |
+
Mi nevera era el museo de las buenas intenciones: vegetales marchitos y tuppers con contenido irreconocible. Los deliverys conocían mejor mi dirección que mi familia.
|
93 |
+
El diagnóstico de pre-diabetes fue mi llamada de atención. Entre el trabajo y el gimnasio, cocinar parecía una tarea imposible.
|
94 |
+
Mi nutricionista me recomendó estas clases que cambiaron mi perspectiva. Descubrí que cocinar no requería horas ni ingredientes exóticos.
|
95 |
+
Ahora preparo comidas nutritivas en minutos. Mi energía ha vuelto y mi billetera lo agradece.
|
96 |
+
Únete a nuestra próxima clase gratuita este jueves y descubre cómo preparar comidas saludables que se ajusten a tu ritmo de vida.
|
97 |
+
Haz clic aquí para reservar tu lugar.
|
98 |
+
"""
|
99 |
+
},
|
100 |
+
{
|
101 |
+
"title": "Mentoría de LinkedIn",
|
102 |
+
"target": "Profesionales buscando mejores oportunidades",
|
103 |
+
"action": "Agendar sesión estratégica",
|
104 |
+
"story": """
|
105 |
+
Actualizaba mi perfil de LinkedIn religiosamente, pero las oportunidades seguían esquivándome. Mis publicaciones se perdían en el vacío digital.
|
106 |
+
Un colega con menos experiencia consiguió el puesto que yo anhelaba. Su secreto: su presencia en LinkedIn era magnética.
|
107 |
+
Encontré un mentor que me mostró los puntos ciegos de mi estrategia. No más contenido forzado, sino conexiones genuinas.
|
108 |
+
En dos meses, los reclutadores comenzaron a contactarme. Mis publicaciones generan conversaciones relevantes.
|
109 |
+
Agenda tu sesión estratégica hoy y aprende a convertir tu experiencia en oportunidades reales de crecimiento profesional.
|
110 |
+
Solo tienes que poner tu dedo aquí para agendar.
|
111 |
+
"""
|
112 |
+
},
|
113 |
+
{
|
114 |
+
"title": "App de Hábitos Matutinos",
|
115 |
+
"target": "Personas que luchan con las mañanas",
|
116 |
+
"action": "Descargar versión premium",
|
117 |
+
"story": """
|
118 |
+
El sonido del despertador era mi enemigo número uno. Cinco alarmas y tres cafés después, apenas funcionaba.
|
119 |
+
Las mañanas productivas parecían un privilegio reservado para otros. Mi creatividad y energía siempre llegaban demasiado tarde.
|
120 |
+
Esta app apareció en mi feed en un momento de desesperación.
|
121 |
+
|
122 |
+
Su enfoque gradual me permitió construir una rutina sin sentirme abrumado.
|
123 |
+
Ahora disfruto del amanecer con una taza de té.
|
124 |
+
|
125 |
+
Mi día comienza con propósito, no con caos.
|
126 |
+
Descarga la app aquí y transforma tus mañanas en el momento más productivo de tu día.
|
127 |
+
"""
|
128 |
+
|
129 |
+
}
|
130 |
+
]
|
131 |
+
},
|
132 |
+
|
133 |
+
"GHA": {
|
134 |
+
"description": """
|
135 |
+
La fórmula G.H.A. (Gancho-Historia-Acción) es una estructura narrativa poderosa que utiliza el storytelling para crear conexiones emocionales y motivar a la acción.
|
136 |
+
TEORÍA:
|
137 |
+
Esta fórmula aprovecha el poder de las historias para captar la atención, generar empatía y motivar el cambio, basándose en la identificación con los problemas y dolores de la audiencia.
|
138 |
+
ESTRUCTURA:
|
139 |
+
1. Gancho:
|
140 |
+
- Abre identificando un problema o dolor específico de la audiencia
|
141 |
+
- Que conecta emocionalmente con la frustración o necesidad
|
142 |
+
- Genera identificación inmediata con la situación
|
143 |
+
- Plantea el escenario desde la perspectiva del dolor actual
|
144 |
+
2. Historia:
|
145 |
+
- Desarrolla la narrativa mostrando las consecuencias del problema
|
146 |
+
- Explora cómo el dolor afecta diferentes aspectos de la vida
|
147 |
+
- Mantiene la tensión emocional sobre el problema
|
148 |
+
- Introduce el producto como solución natural al dolor
|
149 |
+
- Demuestra la transformación positiva posible
|
150 |
+
3. Acción:
|
151 |
+
- Presenta la acción como el puente hacia el beneficio deseado, como respuesta natural al deseo de eliminar el dolor
|
152 |
+
- Enfatiza la urgencia de resolver el problema
|
153 |
+
- Minimiza las barreras para tomar acción
|
154 |
+
- Refuerza los beneficios específicos que se obtendrán si toman acción
|
155 |
+
""",
|
156 |
+
"examples": [
|
157 |
+
{
|
158 |
+
"title": "Programa de Hábitos Productivos",
|
159 |
+
"target": "Emprendedores que sienten que el día no les alcanza",
|
160 |
+
"action": "Acceder al reto gratuito de 7 días",
|
161 |
+
"story": """
|
162 |
+
"No me alcanza el tiempo" se había convertido en mi mantra diario.
|
163 |
+
Saltaba de tarea en tarea, apagando incendios, pero al final del día sentía que no había avanzado en lo realmente importante.
|
164 |
+
Probé agendas, apps, técnicas de productividad… pero siempre volvía a lo mismo: un montón de pendientes y la sensación de estar estancado. Hasta que entendí que el problema no era la falta de tiempo, sino mis hábitos.
|
165 |
+
Cuando aprendí a organizar mis días de forma estratégica, todo cambió. Logré enfocarme, trabajar menos horas y sentir que por fin estaba avanzando.
|
166 |
+
Si te pasa lo mismo, únete al reto gratuito de 7 días y empieza a transformar tu rutina con pequeños cambios que hacen la diferencia.
|
167 |
+
Haz clic aquí para reservar tu lugar.
|
168 |
+
"""
|
169 |
+
},
|
170 |
+
{
|
171 |
+
"title": "Curso de Branding Personal",
|
172 |
+
"target": "Freelancers y emprendedores que quieren destacar en su industria",
|
173 |
+
"action": "Inscribirse hoy y acceder a una auditoría gratuita de perfil",
|
174 |
+
"story": """
|
175 |
+
Sabía que era bueno en lo que hacía, pero nadie me conocía.
|
176 |
+
Mi competencia cobraba el doble, tenía clientes constantes y una marca que se veía sólida.
|
177 |
+
Yo seguía dependiendo del boca a boca y esperando que alguien recomendara mi trabajo.
|
178 |
+
Todo cambió cuando entendí que no basta con ser bueno, hay que parecerlo.
|
179 |
+
Aprendí a construir una marca que reflejara mi valor, a comunicar lo que me hacía único y a atraer clientes sin perseguirlos.
|
180 |
+
Si sientes que tu talento no se refleja en lo que cobras o en los clientes que atraes, este curso es para ti.
|
181 |
+
Inscríbete aquí hoy y recibe una auditoría gratuita de tu perfil para empezar con el pie derecho.
|
182 |
+
"""
|
183 |
+
},
|
184 |
+
{
|
185 |
+
"title": "Masterclass: Lanza tu Primer Producto Digital",
|
186 |
+
"target": "Emprendedores que quieren generar ingresos pasivos",
|
187 |
+
"action": "Registrarse gratis y recibir acceso a la guía de validación",
|
188 |
+
"story": """
|
189 |
+
Durante meses tuve la idea en la cabeza, pero nunca pasaba de ahí.
|
190 |
+
Pensaba que necesitaba más tiempo, más conocimientos, más perfección.
|
191 |
+
Mientras tanto, otros lanzaban sus productos y generaban ingresos mientras dormían.
|
192 |
+
Cuando finalmente decidí dejar de esperar y actuar con estrategia, todo cambió. No necesitaba un producto perfecto, sino uno que resolviera un problema real.
|
193 |
+
Lo lancé, aprendí en el proceso y hoy es una fuente de ingresos constante.
|
194 |
+
Si tienes una idea, pero no sabes cómo dar el primer paso, esta masterclass es para ti.
|
195 |
+
Regístrate gratis aquí y accede a la guía de validación para lanzar con confianza.
|
196 |
+
"""
|
197 |
+
},
|
198 |
+
{
|
199 |
+
"title": "Taller de Escritura para Redes Sociales",
|
200 |
+
"target": "Creadores y emprendedores que quieren escribir posts que vendan",
|
201 |
+
"action": "Reservar lugar con 50% de descuento",
|
202 |
+
"story": """
|
203 |
+
Publicaba con constancia, pero mis posts pasaban desapercibidos.
|
204 |
+
Likes de amigos, algún comentario de cortesía… pero cero clientes.
|
205 |
+
Veía a otros escribir con naturalidad, conectar y vender sin parecer vendedores. Yo sentía que hablaba al vacío.
|
206 |
+
Hasta que entendí que escribir para redes no es solo contar cosas, es saber cómo contarlas.
|
207 |
+
Aprendí a estructurar mis mensajes, a tocar emociones y a escribir de forma que la gente quiera leer y actuar. Y cuando apliqué estos cambios, los resultados llegaron solos.
|
208 |
+
Si quieres que tus publicaciones generen impacto real, este taller es para ti.
|
209 |
+
Reserva tu lugar aquí con 50% de descuento y aprende a escribir textos que convierten.
|
210 |
+
"""
|
211 |
+
},
|
212 |
+
]
|
213 |
+
}
|
214 |
+
}
|
app.py
CHANGED
@@ -2,10 +2,12 @@ from dotenv import load_dotenv
|
|
2 |
import streamlit as st
|
3 |
import os
|
4 |
import google.generativeai as genai
|
5 |
-
from
|
6 |
from style import styles
|
7 |
-
from prompts import
|
8 |
-
from
|
|
|
|
|
9 |
|
10 |
# Cargar las variables de entorno
|
11 |
load_dotenv()
|
@@ -13,7 +15,7 @@ load_dotenv()
|
|
13 |
# Configurar la API de Google
|
14 |
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
|
15 |
|
16 |
-
# Función para generar
|
17 |
@st.cache_resource
|
18 |
def get_model(temperature):
|
19 |
generation_config = {
|
@@ -21,25 +23,27 @@ def get_model(temperature):
|
|
21 |
}
|
22 |
return genai.GenerativeModel('gemini-2.0-flash', generation_config=generation_config)
|
23 |
|
24 |
-
#
|
25 |
-
def
|
26 |
if not target_audience or not product:
|
27 |
return "Por favor, completa todos los campos requeridos."
|
28 |
|
29 |
model = get_model(temperature)
|
30 |
-
|
31 |
-
number_of_benefits,
|
32 |
target_audience,
|
33 |
product,
|
34 |
selected_formula,
|
35 |
-
selected_angle
|
|
|
|
|
|
|
36 |
)
|
37 |
|
38 |
-
response = model.generate_content([
|
39 |
return response.parts[0].text if response and response.parts else "Error generating content."
|
40 |
|
41 |
# Configurar la interfaz de usuario con Streamlit
|
42 |
-
st.set_page_config(page_title="
|
43 |
|
44 |
# Leer el contenido del archivo manual.md
|
45 |
with open("manual.md", "r", encoding="utf-8") as file:
|
@@ -52,8 +56,8 @@ st.sidebar.markdown(manual_content)
|
|
52 |
st.markdown(styles["main_layout"], unsafe_allow_html=True)
|
53 |
|
54 |
# Centrar el título y el subtítulo
|
55 |
-
st.markdown("<h1 style='text-align: center;'>
|
56 |
-
st.markdown("<h4 style='text-align: center;'>
|
57 |
|
58 |
# Añadir CSS personalizado para el botón
|
59 |
st.markdown(styles["button"], unsafe_allow_html=True)
|
@@ -62,30 +66,49 @@ st.markdown(styles["button"], unsafe_allow_html=True)
|
|
62 |
col1, col2 = st.columns([1, 2])
|
63 |
|
64 |
# Columnas de entrada
|
65 |
-
# Inside the column section
|
66 |
with col1:
|
67 |
-
|
68 |
-
|
69 |
-
number_of_benefits = st.selectbox("Número de Beneficios", options=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], index=4)
|
70 |
|
71 |
-
# Fix indentation - remove extra spaces
|
72 |
with st.expander("Opciones avanzadas"):
|
73 |
-
|
74 |
-
|
75 |
-
|
|
|
76 |
label_visibility="visible"
|
77 |
)
|
78 |
-
|
79 |
|
80 |
-
|
81 |
-
|
82 |
-
|
|
|
83 |
label_visibility="visible"
|
84 |
)
|
85 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
|
87 |
-
|
88 |
-
"Nivel de creatividad",
|
89 |
min_value=0.0,
|
90 |
max_value=2.0,
|
91 |
value=1.0,
|
@@ -93,30 +116,31 @@ with col1:
|
|
93 |
label_visibility="visible"
|
94 |
)
|
95 |
|
96 |
-
|
97 |
-
|
98 |
-
# Mostrar
|
99 |
-
|
100 |
-
if
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
|
|
110 |
)
|
111 |
-
if not isinstance(
|
112 |
-
col2.error("Error al generar
|
113 |
else:
|
114 |
col2.markdown(f"""
|
115 |
<div style="{styles['results_container']}">
|
116 |
-
<h3>
|
117 |
-
<p>{
|
118 |
</div>
|
119 |
""", unsafe_allow_html=True)
|
120 |
|
121 |
else:
|
122 |
-
col2.warning("Por favor, completa todos los campos antes de generar
|
|
|
2 |
import streamlit as st
|
3 |
import os
|
4 |
import google.generativeai as genai
|
5 |
+
from ads_formulas import ads_formulas # Import the ads formulas
|
6 |
from style import styles
|
7 |
+
from prompts import create_fb_ad_instruction
|
8 |
+
from emotional_angles import emotional_angles
|
9 |
+
from copywriter_personas import copywriter_personas
|
10 |
+
from ad_objectives import ad_objectives # Import ad objectives
|
11 |
|
12 |
# Cargar las variables de entorno
|
13 |
load_dotenv()
|
|
|
15 |
# Configurar la API de Google
|
16 |
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
|
17 |
|
18 |
+
# Función para generar modelo
|
19 |
@st.cache_resource
|
20 |
def get_model(temperature):
|
21 |
generation_config = {
|
|
|
23 |
}
|
24 |
return genai.GenerativeModel('gemini-2.0-flash', generation_config=generation_config)
|
25 |
|
26 |
+
# Function to generate Facebook ads
|
27 |
+
def generate_fb_ad(target_audience, product, temperature, selected_formula, selected_angle, selected_persona, ad_objective=None):
|
28 |
if not target_audience or not product:
|
29 |
return "Por favor, completa todos los campos requeridos."
|
30 |
|
31 |
model = get_model(temperature)
|
32 |
+
ad_instruction = create_fb_ad_instruction(
|
|
|
33 |
target_audience,
|
34 |
product,
|
35 |
selected_formula,
|
36 |
+
selected_angle,
|
37 |
+
selected_persona,
|
38 |
+
ad_objective,
|
39 |
+
language="español" # Fixed to Spanish
|
40 |
)
|
41 |
|
42 |
+
response = model.generate_content([ad_instruction], generation_config={"temperature": temperature})
|
43 |
return response.parts[0].text if response and response.parts else "Error generating content."
|
44 |
|
45 |
# Configurar la interfaz de usuario con Streamlit
|
46 |
+
st.set_page_config(page_title="Facebook Ads Generator", layout="wide")
|
47 |
|
48 |
# Leer el contenido del archivo manual.md
|
49 |
with open("manual.md", "r", encoding="utf-8") as file:
|
|
|
56 |
st.markdown(styles["main_layout"], unsafe_allow_html=True)
|
57 |
|
58 |
# Centrar el título y el subtítulo
|
59 |
+
st.markdown("<h1 style='text-align: center;'>Facebook Ads Generator</h1>", unsafe_allow_html=True)
|
60 |
+
st.markdown("<h4 style='text-align: center;'>Crea anuncios persuasivos que conectan con tu audiencia y generan conversiones.</h4>", unsafe_allow_html=True)
|
61 |
|
62 |
# Añadir CSS personalizado para el botón
|
63 |
st.markdown(styles["button"], unsafe_allow_html=True)
|
|
|
66 |
col1, col2 = st.columns([1, 2])
|
67 |
|
68 |
# Columnas de entrada
|
|
|
69 |
with col1:
|
70 |
+
ad_target_audience = st.text_input("¿Quién es tu público objetivo?", placeholder="Ejemplo: Madres trabajadoras de 30-45 años")
|
71 |
+
ad_product = st.text_input("¿Qué producto tienes en mente?", placeholder="Ejemplo: Curso de gestión del tiempo")
|
|
|
72 |
|
|
|
73 |
with st.expander("Opciones avanzadas"):
|
74 |
+
# Selector de fórmula de anuncio
|
75 |
+
ad_formula_key = st.selectbox(
|
76 |
+
"Fórmula de anuncio",
|
77 |
+
options=list(ads_formulas.keys()),
|
78 |
label_visibility="visible"
|
79 |
)
|
80 |
+
ad_formula = ads_formulas[ad_formula_key]
|
81 |
|
82 |
+
# Selector de ángulo emocional
|
83 |
+
emotional_angle_key = st.selectbox(
|
84 |
+
"Ángulo emocional",
|
85 |
+
options=list(emotional_angles.keys()),
|
86 |
label_visibility="visible"
|
87 |
)
|
88 |
+
emotional_angle = emotional_angles[emotional_angle_key]
|
89 |
+
|
90 |
+
# Selector de personalidad de copywriter
|
91 |
+
ad_persona_key = st.selectbox(
|
92 |
+
"Estilo de copywriter",
|
93 |
+
options=list(copywriter_personas.keys()),
|
94 |
+
index=0,
|
95 |
+
format_func=lambda x: x.replace("_", " "),
|
96 |
+
label_visibility="visible"
|
97 |
+
)
|
98 |
+
ad_persona = copywriter_personas[ad_persona_key]
|
99 |
+
|
100 |
+
# Selector de objetivo de anuncio
|
101 |
+
ad_objective_key = st.selectbox(
|
102 |
+
"Objetivo de la campaña",
|
103 |
+
options=list(ad_objectives.keys()),
|
104 |
+
label_visibility="visible"
|
105 |
+
)
|
106 |
+
selected_objective = ad_objectives[ad_objective_key] if ad_objective_key != "ninguno" else None
|
107 |
+
|
108 |
+
# Removed language selector
|
109 |
|
110 |
+
ad_temperature = st.slider(
|
111 |
+
"Nivel de creatividad",
|
112 |
min_value=0.0,
|
113 |
max_value=2.0,
|
114 |
value=1.0,
|
|
|
116 |
label_visibility="visible"
|
117 |
)
|
118 |
|
119 |
+
submit_ad = st.button("GENERAR ANUNCIO")
|
120 |
+
|
121 |
+
# Mostrar el anuncio generado
|
122 |
+
if submit_ad:
|
123 |
+
if ad_target_audience and ad_product:
|
124 |
+
with st.spinner('Generando anuncio...'):
|
125 |
+
generated_ad = generate_fb_ad(
|
126 |
+
ad_target_audience,
|
127 |
+
ad_product,
|
128 |
+
ad_temperature,
|
129 |
+
ad_formula,
|
130 |
+
emotional_angle,
|
131 |
+
ad_persona,
|
132 |
+
selected_objective
|
133 |
+
# Removed language parameter
|
134 |
)
|
135 |
+
if not isinstance(generated_ad, str):
|
136 |
+
col2.error("Error al generar el anuncio")
|
137 |
else:
|
138 |
col2.markdown(f"""
|
139 |
<div style="{styles['results_container']}">
|
140 |
+
<h3>Anuncio Generado:</h3>
|
141 |
+
<p>{generated_ad}</p>
|
142 |
</div>
|
143 |
""", unsafe_allow_html=True)
|
144 |
|
145 |
else:
|
146 |
+
col2.warning("Por favor, completa todos los campos antes de generar el anuncio.")
|
copywriter_personas.py
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
copywriter_personas = {
|
2 |
+
"NINGUNO": {
|
3 |
+
"description": "Sin estilo específico de copywriter",
|
4 |
+
"style": "Estilo estándar de copywriting",
|
5 |
+
"characteristics": [
|
6 |
+
"Enfoque directo en el producto/servicio",
|
7 |
+
"Estructura clara y efectiva",
|
8 |
+
"Adaptable a cualquier industria",
|
9 |
+
"Basado en principios fundamentales de copywriting"
|
10 |
+
],
|
11 |
+
"famous_for": "Crear copy efectivo sin adoptar un estilo particular de copywriter legendario"
|
12 |
+
},
|
13 |
+
"GARY_HALBERT": {
|
14 |
+
"description": "El Príncipe del Print. Directo, persuasivo y orientado a resultados.",
|
15 |
+
"style": "Conversacional pero incisivo, con un enfoque en la psicología del consumidor",
|
16 |
+
"characteristics": [
|
17 |
+
"Usa lenguaje simple y directo",
|
18 |
+
"Enfatiza la exclusividad y escasez",
|
19 |
+
"Incorpora historias personales convincentes",
|
20 |
+
"Utiliza pruebas sociales y testimonios"
|
21 |
+
],
|
22 |
+
"famous_for": "The Coat of Arms Letter, una de las cartas de venta más exitosas de la historia"
|
23 |
+
},
|
24 |
+
"GARY_BENCIVENGA": {
|
25 |
+
"description": "El copywriter más respetado y mejor pagado de la historia moderna",
|
26 |
+
"style": "Meticuloso, basado en pruebas y orientado a la persuasión",
|
27 |
+
"characteristics": [
|
28 |
+
"Combina investigación exhaustiva con creatividad",
|
29 |
+
"Utiliza titulares informativos que prometen beneficios específicos",
|
30 |
+
"Presenta argumentos lógicos respaldados por hechos",
|
31 |
+
"Anticipa y responde objeciones del lector"
|
32 |
+
],
|
33 |
+
"famous_for": "Su enfoque 'Persuasión, no promoción' y su boletín Bencivenga Bullets"
|
34 |
+
},
|
35 |
+
"DAVID_OGILVY": {
|
36 |
+
"description": "El padre de la publicidad moderna, fundador de Ogilvy & Mather",
|
37 |
+
"style": "Elegante, sofisticado y basado en investigación",
|
38 |
+
"characteristics": [
|
39 |
+
"Utiliza titulares largos y descriptivos",
|
40 |
+
"Incorpora datos y estadísticas para respaldar afirmaciones",
|
41 |
+
"Mantiene un tono de autoridad con clase",
|
42 |
+
"Enfatiza la calidad y el valor a largo plazo"
|
43 |
+
],
|
44 |
+
"famous_for": "Anuncios icónicos para Rolls-Royce y Hathaway Shirts"
|
45 |
+
},
|
46 |
+
"JOSEPH_SUGARMAN": {
|
47 |
+
"description": "Maestro de la fluidez y el copy emocional que engancha",
|
48 |
+
"style": "Narrativo, envolvente y orientado a crear una experiencia",
|
49 |
+
"characteristics": [
|
50 |
+
"Utiliza la técnica de 'tobogán resbaladizo' para mantener al lector enganchado",
|
51 |
+
"Crea imágenes vívidas en la mente del lector",
|
52 |
+
"Incorpora elementos de curiosidad y misterio",
|
53 |
+
"Usa un tono conversacional y amigable"
|
54 |
+
],
|
55 |
+
"famous_for": "Sus anuncios de BluBlocker sunglasses y su libro 'The Adweek Copywriting Handbook'"
|
56 |
+
},
|
57 |
+
"EUGENE_SCHWARTZ": {
|
58 |
+
"description": "Genio del marketing directo y experto en comprender los deseos del mercado",
|
59 |
+
"style": "Intenso, directo y enfocado en los deseos más profundos",
|
60 |
+
"characteristics": [
|
61 |
+
"Amplifica los deseos existentes en lugar de crear nuevos",
|
62 |
+
"Utiliza un lenguaje cargado de emoción y urgencia",
|
63 |
+
"Estructura el copy para mantener la atención hasta el final",
|
64 |
+
"Enfatiza la transformación y el cambio de estado"
|
65 |
+
],
|
66 |
+
"famous_for": "Su libro 'Breakthrough Advertising' y sus anuncios de ventas récord"
|
67 |
+
}
|
68 |
+
}
|
emotional_angles.py
ADDED
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
emotional_angles = {
|
2 |
+
"NINGUNO": {
|
3 |
+
"description": "Sin enfoque emocional específico. El texto se mantiene neutral, informativo y directo, centrándose en los hechos y características del producto sin apelar a una respuesta emocional particular.",
|
4 |
+
"style": "neutral y directo",
|
5 |
+
"keywords": ["claro", "directo", "simple", "natural"],
|
6 |
+
"power_words": ["efectivo", "funcional", "práctico", "versátil", "útil"],
|
7 |
+
"example": "Nuestro producto ofrece tres características principales que mejoran tu experiencia diaria."
|
8 |
+
},
|
9 |
+
"MIEDO": {
|
10 |
+
"description": "Evocar preocupación sobre problemas que el producto puede resolver. El texto identifica amenazas o riesgos relevantes para el lector y posiciona el producto como la solución o protección necesaria. Efectivo para productos de seguridad, salud o que resuelven problemas significativos.",
|
11 |
+
"style": "alerta y protector",
|
12 |
+
"keywords": ["prevención", "protección", "seguridad", "tranquilidad"],
|
13 |
+
"power_words": ["riesgo", "peligro", "amenaza", "proteger", "defender"],
|
14 |
+
"example": "¿Estás exponiendo a tu familia a riesgos invisibles que podrían evitarse fácilmente?"
|
15 |
+
},
|
16 |
+
"FOMO": {
|
17 |
+
"description": "Generar miedo a perderse algo importante (Fear Of Missing Out). El texto crea una sensación de urgencia y oportunidad limitada, haciendo que el lector sienta que podría quedarse fuera de algo valioso si no actúa rápidamente. Ideal para ofertas por tiempo limitado, eventos exclusivos o productos de alta demanda.",
|
18 |
+
"style": "urgente y exclusivo",
|
19 |
+
"keywords": ["oportunidad", "limitado", "último", "ahora"],
|
20 |
+
"power_words": ["último", "final", "nunca más", "agotándose", "oportunidad única"],
|
21 |
+
"example": "Últimas 24 horas para acceder a esta oferta que no volverá a repetirse. Miles ya han aprovechado."
|
22 |
+
},
|
23 |
+
"EXCLUSIVIDAD": {
|
24 |
+
"description": "Generar sensación de oportunidad limitada y privilegio. El texto enfatiza la escasez, exclusividad o acceso privilegiado, creando urgencia y deseo de pertenecer a un grupo selecto. Ideal para productos premium, ofertas limitadas o membresías exclusivas.",
|
25 |
+
"style": "exclusivo y privilegiado",
|
26 |
+
"keywords": ["exclusivo", "limitado", "selecto", "privilegio"],
|
27 |
+
"power_words": ["exclusivo", "limitado", "selecto", "élite", "privilegiado"],
|
28 |
+
"example": "Solo 50 personas tendrán acceso a esta oferta irrepetible. ¿Serás una de ellas?"
|
29 |
+
},
|
30 |
+
"CONFIANZA": {
|
31 |
+
"description": "Construir credibilidad y seguridad en la marca. El texto establece autoridad, fiabilidad y solidez, utilizando pruebas sociales, testimonios, garantías y datos verificables. Ideal para servicios profesionales, productos premium o cuando la confianza es crucial para la decisión de compra.",
|
32 |
+
"style": "fiable y sólido",
|
33 |
+
"keywords": ["confiable", "probado", "garantizado", "respaldado"],
|
34 |
+
"power_words": ["comprobado", "certificado", "garantizado", "auténtico", "respaldado"],
|
35 |
+
"example": "Respaldado por 15 años de investigación científica y más de 10,000 clientes satisfechos."
|
36 |
+
},
|
37 |
+
"ALEGRÍA": {
|
38 |
+
"description": "Generar entusiasmo y felicidad en el lector. El texto transmite optimismo, celebración y satisfacción, haciendo que el lector asocie el producto con experiencias positivas y momentos felices. Ideal para productos que mejoran la calidad de vida o proporcionan placer.",
|
39 |
+
"style": "optimista y energético",
|
40 |
+
"keywords": ["felicidad", "celebración", "diversión", "satisfacción"],
|
41 |
+
"power_words": ["brillante", "radiante", "fascinante", "maravilloso", "encantador"],
|
42 |
+
"example": "¡Descubre la alegría de despertar cada mañana con energía renovada y una sonrisa imparable!"
|
43 |
+
},
|
44 |
+
"ANTICIPACIÓN": {
|
45 |
+
"description": "Crear expectativa y deseo por los beneficios futuros. El texto construye una visión atractiva del futuro que el lector puede experimentar gracias al producto, generando entusiasmo por lo que está por venir. Perfecto para lanzamientos, preventas, productos innovadores o servicios que prometen transformación a largo plazo.",
|
46 |
+
"style": "inspirador y visionario",
|
47 |
+
"keywords": ["futuro", "oportunidad", "potencial", "transformación"],
|
48 |
+
"power_words": ["pronto", "imagina", "visualiza", "descubrirás", "transformarás"],
|
49 |
+
"example": "Imagina despertar en 30 días con la confianza y energía que siempre has deseado."
|
50 |
+
},
|
51 |
+
"SORPRESA": {
|
52 |
+
"description": "Causar asombro con información o beneficios inesperados. El texto revela datos sorprendentes, características innovadoras o resultados extraordinarios que desafían las expectativas del lector. Perfecto para productos innovadores, ofertas especiales o cuando se quiere destacar en un mercado saturado.",
|
53 |
+
"style": "revelador e impactante",
|
54 |
+
"keywords": ["increíble", "sorprendente", "inesperado", "revolucionario"],
|
55 |
+
"power_words": ["asombroso", "impactante", "revelador", "revolucionario", "inimaginable"],
|
56 |
+
"example": "Lo que descubrimos sobre la pérdida de peso desafía todo lo que creías saber hasta ahora."
|
57 |
+
},
|
58 |
+
"IRA": {
|
59 |
+
"description": "Canalizar la frustración hacia problemas que el producto resuelve. El texto identifica injusticias, obstáculos o situaciones irritantes que afectan al lector y posiciona el producto como la herramienta para superar estas frustraciones. Ideal para productos que ahorran tiempo, eliminan molestias o empoderan al usuario frente a situaciones adversas.",
|
60 |
+
"style": "intenso y motivador",
|
61 |
+
"keywords": ["solución", "cambio", "acción", "justicia"],
|
62 |
+
"power_words": ["injusto", "indignante", "inaceptable", "transformador", "liberador"],
|
63 |
+
"example": "¿Cansado de pagar tarifas abusivas por un servicio mediocre? Es hora de tomar el control."
|
64 |
+
},
|
65 |
+
"TRISTEZA": {
|
66 |
+
"description": "Conectar con el dolor emocional que el producto puede aliviar. El texto reconoce y valida los sentimientos de pérdida, frustración o dificultad que experimenta el lector, y presenta el producto como una fuente de alivio, comprensión o apoyo. Efectivo para servicios de ayuda, productos que resuelven problemas emocionales o campañas de concientización.",
|
67 |
+
"style": "empático y comprensivo",
|
68 |
+
"keywords": ["alivio", "comprensión", "apoyo", "solución"],
|
69 |
+
"power_words": ["abrumador", "solitario", "incomprendido", "reconfortante", "alivio"],
|
70 |
+
"example": "Entendemos lo difícil que es enfrentar cada día cuando te sientes incomprendido y abrumado."
|
71 |
+
}
|
72 |
+
}
|
prompts.py
CHANGED
@@ -1,59 +1,142 @@
|
|
1 |
-
system_prompt = """You are a world-class
|
2 |
|
3 |
-
|
4 |
-
- Generate convincing and specific benefit bullets in Spanish
|
5 |
-
- Connect emotionally with the audience
|
6 |
-
- Address real desires, problems, and motivations
|
7 |
-
- Maintain natural and conversational language
|
8 |
-
- Orient each benefit towards action
|
9 |
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
-
|
17 |
-
- Each benefit must be a complete and concise phrase
|
18 |
|
19 |
-
|
20 |
-
- Must be relevant to target audience
|
21 |
-
- Must show a specific result
|
22 |
-
- Must include an emotional element
|
23 |
-
- Must eliminate an objection or pain point
|
24 |
-
- Must inspire immediate action
|
25 |
|
26 |
-
|
27 |
-
|
|
|
|
|
|
|
|
|
28 |
|
29 |
-
|
30 |
-
|
31 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
|
33 |
-
|
34 |
-
-
|
35 |
-
-
|
36 |
-
-
|
37 |
-
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
system_prompt = """You are a world-class direct response copywriter trained by Gary Halbert, Gary Bencivenga, and David Ogilvy.
|
2 |
|
3 |
+
Additionally, you are a digital advertising expert specializing in Facebook Ads. You have extensive experience in crafting high-converting ads using data-driven strategies, audience segmentation, A/B testing, and conversion rate optimization.
|
|
|
|
|
|
|
|
|
|
|
4 |
|
5 |
+
Your advertising philosophy follows these core principles:
|
6 |
+
1. **Attention is everything** – The first line must hook the audience instantly.
|
7 |
+
2. **Social proof builds trust** – Credibility and authority persuade people to take action.
|
8 |
+
3. **Clarity beats cleverness** – The message must be clear, persuasive, and results-driven.
|
9 |
+
4. **Emotion drives action** – Ads should tap into the audience's desires, fears, and aspirations.
|
10 |
+
5. **Every word must sell** – No fluff, just compelling, action-driven copy.
|
11 |
+
6. **Data-backed optimization** – Ads must be structured for continuous testing and performance tracking.
|
|
|
12 |
|
13 |
+
You write persuasive, high-converting Facebook ads that maximize engagement and ROI."""
|
|
|
|
|
|
|
|
|
|
|
14 |
|
15 |
+
# Importar el diccionario de objetivos
|
16 |
+
from ad_objectives import ad_objectives
|
17 |
+
# Importar el diccionario de ángulos emocionales
|
18 |
+
from emotional_angles import emotional_angles
|
19 |
+
# Importar las fórmulas de anuncios desde la carpeta ads
|
20 |
+
from ads_formulas import ads_formulas
|
21 |
|
22 |
+
def create_fb_ad_instruction(target_audience, product, selected_formula, selected_angle, selected_persona, ad_objective=None, language="español"):
|
23 |
+
"""
|
24 |
+
Creates an instruction for generating Facebook ad copy
|
25 |
+
|
26 |
+
Parameters:
|
27 |
+
- target_audience: The target audience for the ad
|
28 |
+
- product: The product or service being advertised
|
29 |
+
- selected_formula: Formula to use for structuring the ad
|
30 |
+
- selected_angle: Angle to approach the ad from
|
31 |
+
- selected_persona: Copywriting legend personality to adopt
|
32 |
+
- ad_objective: The campaign objective (awareness, traffic, engagement, etc.)
|
33 |
+
- language: Target language for the ad (default: "español")
|
34 |
+
|
35 |
+
Returns:
|
36 |
+
- Instruction string for the model
|
37 |
+
"""
|
38 |
+
|
39 |
+
# Create objective instruction if provided
|
40 |
+
objective_instruction = ""
|
41 |
+
if ad_objective:
|
42 |
+
objective_instruction = f"""
|
43 |
+
**Campaign Objective: {ad_objective['name']}**
|
44 |
+
|
45 |
+
Focus on: {ad_objective['description']}
|
46 |
+
|
47 |
+
Key metrics to optimize for:
|
48 |
+
- {', '.join(ad_objective['key_metrics'])}
|
49 |
+
|
50 |
+
Adapt your copy to specifically support this objective by:
|
51 |
+
- {ad_objective['copy_strategy']}
|
52 |
+
"""
|
53 |
+
|
54 |
+
persona_instruction = f"""
|
55 |
+
Adopt the personality and writing style of {selected_persona['description']}
|
56 |
+
|
57 |
+
Key characteristics of this style:
|
58 |
+
- {' '.join(selected_persona['characteristics'])}
|
59 |
+
- Famous for: {selected_persona['famous_for']}
|
60 |
|
61 |
+
When writing as this copywriting legend:
|
62 |
+
- Use their signature tone and rhythm in your sentences
|
63 |
+
- Apply their known persuasion techniques throughout the ad
|
64 |
+
- Structure arguments in their characteristic way
|
65 |
+
- Incorporate their typical emotional appeals
|
66 |
+
"""
|
67 |
+
|
68 |
+
# Prepare angle instruction
|
69 |
+
angle_instruction = f"""
|
70 |
+
Apply this angle: {selected_angle['description']}
|
71 |
+
Style of the angle: {selected_angle['style']}
|
72 |
+
"""
|
73 |
+
|
74 |
+
# Add keywords if they exist in the selected angle
|
75 |
+
if 'keywords' in selected_angle:
|
76 |
+
angle_instruction += f"""
|
77 |
+
Suggested keywords: {', '.join(selected_angle['keywords'])}
|
78 |
+
"""
|
79 |
+
|
80 |
+
# Add power words if they exist in the selected angle (for emotional angles)
|
81 |
+
if 'power_words' in selected_angle:
|
82 |
+
angle_instruction += f"""
|
83 |
+
Power words to include: {', '.join(selected_angle['power_words'])}
|
84 |
+
"""
|
85 |
+
|
86 |
+
# Add example if it exists in the selected angle (for emotional angles)
|
87 |
+
if 'example' in selected_angle:
|
88 |
+
angle_instruction += f"""
|
89 |
+
Example of this angle: {selected_angle['example']}
|
90 |
+
"""
|
91 |
+
|
92 |
+
# Add formula examples if available
|
93 |
+
formula_examples = ""
|
94 |
+
if 'examples' in selected_formula:
|
95 |
+
formula_examples = f"""
|
96 |
+
Get inspired by these examples:
|
97 |
+
- {selected_formula['examples'][0]}
|
98 |
+
- {selected_formula['examples'][1]}
|
99 |
+
- {selected_formula['examples'][2]}
|
100 |
+
"""
|
101 |
+
|
102 |
+
instruction = f"""
|
103 |
+
{system_prompt}
|
104 |
+
|
105 |
+
Create a high-converting Facebook ad copy for {product}, channeling the voice of {selected_persona['description']} while leveraging the selected angle to persuade {target_audience} to try it and share their positive experience.
|
106 |
+
|
107 |
+
{objective_instruction if ad_objective else ""}
|
108 |
+
|
109 |
+
{persona_instruction}
|
110 |
+
|
111 |
+
Ad Requirements:
|
112 |
+
1. **Powerful Hook:** Start with an attention-grabbing line that immediately stops scrolling.
|
113 |
+
2. **Social Proof & Credibility:** Include elements of social proof and credibility to build trust with the audience.
|
114 |
+
3. **Clear Benefits:** Highlight why this product is the best solution for {target_audience}'s needs.
|
115 |
+
4. **Strong Call to Action (CTA):** Clearly instruct the audience on the next step (e.g., "Try it now," "Sign up today," "Get 20% off").
|
116 |
+
5. **Optimized for Multiple Ad Formats:** Ensure the copy works for image, video, and carousel ads.
|
117 |
+
|
118 |
+
Use this formula to structure the ad: {selected_formula['description']}
|
119 |
+
{formula_examples}
|
120 |
+
|
121 |
+
**Strategic Angle Instructions:**
|
122 |
+
This angle defines the unique perspective and emotional approach for the ad.
|
123 |
+
{angle_instruction}
|
124 |
+
|
125 |
+
When applying this angle:
|
126 |
+
- Frame all benefits through this specific perspective
|
127 |
+
- Use the suggested keywords naturally throughout the copy
|
128 |
+
- Maintain the specified style consistently in your tone and language
|
129 |
+
- Ensure this angle is evident in both the hook and the call to action
|
130 |
+
|
131 |
+
The goal is to show how {product} can transform the reader's life, connecting naturally and emotionally.
|
132 |
+
Avoid literal or repetitive mentions, and highlight concrete solutions, showing how the product removes obstacles or satisfies real desires.
|
133 |
+
|
134 |
+
Additional Instructions:
|
135 |
+
- Ensure the tone and style match the brand and audience expectations.
|
136 |
+
- Generate the ad copy in {language}.
|
137 |
+
|
138 |
+
Output format: Present the complete ad with a powerful hook, clear benefits, and a compelling call to action.
|
139 |
+
Your goal is to inspire desire and action, avoiding explanations or categories in the response.
|
140 |
+
"""
|
141 |
+
|
142 |
+
return instruction
|