|
from dotenv import load_dotenv |
|
import streamlit as st |
|
import os |
|
import google.generativeai as genai |
|
import random |
|
|
|
load_dotenv() |
|
genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) |
|
|
|
story_formulas = { |
|
"PASA": { |
|
"description": """ |
|
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. |
|
|
|
TEORÍA: |
|
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. |
|
|
|
ESTRUCTURA: |
|
1. Problema: |
|
- Identifica un dolor específico y real |
|
- Debe ser inmediatamente reconocible por la audiencia |
|
- Se presenta desde la perspectiva del lector |
|
- Usa lenguaje empático y comprensivo |
|
|
|
2. Agitación: |
|
- Profundiza en las consecuencias emocionales |
|
- Explora ramificaciones futuras |
|
- Aumenta la tensión psicológica |
|
- Crea un punto de inflexión emocional |
|
|
|
3. Solución: |
|
- Presenta la respuesta de forma natural |
|
- Enfoca en beneficios transformacionales |
|
- Construye credibilidad gradualmente |
|
- Demuestra el cambio positivo |
|
|
|
4. Acción: |
|
- Propone el siguiente paso lógico |
|
- Minimiza la fricción y resistencia |
|
- Crea sentido de urgencia |
|
""", |
|
"examples": [ |
|
{ |
|
"title": "Mentoría para Emprendedores que Quieren Vender sin Sonar Forzados", |
|
"target": "Emprendedores y profesionales que ofrecen servicios", |
|
"action": "Reservar una sesión gratuita de diagnóstico", |
|
"story": """ |
|
Sabía que mi producto funcionaba, pero cada vez que intentaba venderlo, algo se rompía. |
|
Sonaba forzado, como si estuviera repitiendo un guion que no era mío. |
|
Las respuestas eran siempre las mismas: |
|
"Déjame pensarlo", "Me interesa, pero ahora no es el momento". |
|
Mientras tanto, otros con menos experiencia conseguían clientes con lo que parecía una simple conversación. |
|
Hasta que entendí que vender no es hablar más, sino conectar mejor. No es convencer, es despertar el deseo de trabajar contigo. |
|
Ahora, mis llamadas no terminan en excusas, sino en clientes diciendo: "¿Dónde te pago?". |
|
Si te ha pasado lo mismo, es hora de cambiar el enfoque. |
|
Reserva una sesión gratuita y descubre cómo vender sin forzar. |
|
""" |
|
}, |
|
{ |
|
"title": "Curso de Escritura Persuasiva para Redes Sociales", |
|
"target": "Emprendedores y creadores de contenido", |
|
"action": "Inscribirse hoy y recibir un módulo extra", |
|
"story": """ |
|
Cada vez que publicaba algo, sentía que estaba hablando solo. |
|
|
|
Likes, algún comentario perdido, pero cero ventas. |
|
|
|
Pasaba horas pensando qué escribir, cómo hacerlo diferente, pero nada cambiaba. |
|
|
|
Mientras tanto, otros lograban clientes con solo un post escrito. |
|
|
|
Hasta que entendí que no era cuestión de escribir más, sino de escribir mejor. |
|
|
|
Palabras que conecten, generen confianza y lleven a la acción. |
|
|
|
Cuando apliqué estos principios, mis posts dejaron de ser ignorados. |
|
|
|
Empezaron a vender. |
|
|
|
Si quieres aprender a escribir textos que vendan sin sonar forzado, este curso es para ti. |
|
|
|
Inscríbete hoy y recibe un módulo extra sobre cómo adaptar tu mensaje sin perder autenticidad. |
|
""" |
|
} |
|
] |
|
}, |
|
|
|
"ADP": { |
|
"description": """ |
|
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. |
|
|
|
TEORÍA: |
|
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. |
|
|
|
ESTRUCTURA: |
|
1. Antes: |
|
- Describe vívidamente la situación problemática actual |
|
- Refleja las frustraciones y miedos de la audiencia |
|
- Identifica los obstáculos que impiden alcanzar objetivos |
|
- Usa lenguaje empático y descriptivo |
|
- Crea conexión inmediata con experiencias cotidianas |
|
|
|
2. Después: |
|
- Pinta el escenario ideal post-solución |
|
- Describe beneficios tangibles y emocionales |
|
- Muestra la transformación positiva |
|
- Enfatiza el contraste con la situación inicial |
|
- Genera deseo por el resultado prometido |
|
|
|
3. Puente: |
|
- Presenta tu solución como el camino natural |
|
- Explica el proceso de transformación |
|
- Demuestra la viabilidad del cambio |
|
- Minimiza barreras y objeciones |
|
- Proporciona pasos claros hacia el resultado |
|
""", |
|
"examples": [ |
|
{ |
|
"title": "Curso de Cocina Saludable", |
|
"target": "Profesionales sin tiempo", |
|
"action": "Reservar clase prueba gratuita", |
|
"story": """ |
|
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. |
|
|
|
El diagnóstico de pre-diabetes fue mi llamada de atención. Entre el trabajo y el gimnasio, cocinar parecía una tarea imposible. |
|
|
|
Mi nutricionista me recomendó estas clases que cambiaron mi perspectiva. Descubrí que cocinar no requería horas ni ingredientes exóticos. |
|
|
|
Ahora preparo comidas nutritivas en minutos. Mi energía ha vuelto y mi billetera lo agradece. |
|
|
|
Únete a nuestra próxima clase gratuita este jueves y descubre cómo preparar comidas saludables que se ajusten a tu ritmo de vida. |
|
""" |
|
}, |
|
{ |
|
"title": "Mentoría de LinkedIn", |
|
"target": "Profesionales buscando mejores oportunidades", |
|
"action": "Agendar sesión estratégica", |
|
"story": """ |
|
Actualizaba mi perfil de LinkedIn religiosamente, pero las oportunidades seguían esquivándome. Mis publicaciones se perdían en el vacío digital. |
|
|
|
Un colega con menos experiencia consiguió el puesto que yo anhelaba. Su secreto: su presencia en LinkedIn era magnética. |
|
|
|
Encontré un mentor que me mostró los puntos ciegos de mi estrategia. No más contenido forzado, sino conexiones genuinas. |
|
|
|
En dos meses, los reclutadores comenzaron a contactarme. Mis publicaciones generan conversaciones relevantes. |
|
|
|
Agenda tu sesión estratégica hoy y aprende a convertir tu experiencia en oportunidades reales de crecimiento profesional. |
|
""" |
|
}, |
|
{ |
|
"title": "App de Hábitos Matutinos", |
|
"target": "Personas que luchan con las mañanas", |
|
"action": "Descargar versión premium", |
|
"story": """ |
|
El sonido del despertador era mi enemigo número uno. Cinco alarmas y tres cafés después, apenas funcionaba. |
|
|
|
Las mañanas productivas parecían un privilegio reservado para otros. Mi creatividad y energía siempre llegaban demasiado tarde. |
|
|
|
Esta app apareció en mi feed en un momento de desesperación. Su enfoque gradual me permitió construir una rutina sin sentirme abrumado. |
|
|
|
Ahora disfruto del amanecer con una taza de té. Mi día comienza con propósito, no con caos. |
|
|
|
Descarga la app hoy y transforma tus mañanas en el momento más productivo de tu día. |
|
""" |
|
|
|
} |
|
] |
|
}, |
|
|
|
"GHA": { |
|
"description": """ |
|
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. |
|
|
|
TEORÍA: |
|
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. |
|
|
|
ESTRUCTURA: |
|
1. Gancho: |
|
- Abre identificando un problema o dolor específico de la audiencia |
|
- Que conecta emocionalmente con la frustración o necesidad |
|
- Genera identificación inmediata con la situación |
|
- Plantea el escenario desde la perspectiva del dolor actual |
|
|
|
2. Historia: |
|
- Desarrolla la narrativa mostrando las consecuencias del problema |
|
- Explora cómo el dolor afecta diferentes aspectos de la vida |
|
- Mantiene la tensión emocional sobre el problema |
|
- Introduce el producto como solución natural al dolor |
|
- Demuestra la transformación positiva posible |
|
|
|
3. Acción: |
|
- Presenta la acción como el puente hacia el beneficio deseado, como respuesta natural al deseo de eliminar el dolor |
|
- Enfatiza la urgencia de resolver el problema |
|
- Minimiza las barreras para tomar acción |
|
- Refuerza los beneficios específicos que se obtendrán si toman acción |
|
""", |
|
"examples": [ |
|
{ |
|
"title": "Programa de Hábitos Productivos", |
|
"target": "Emprendedores que sienten que el día no les alcanza", |
|
"action": "Acceder al reto gratuito de 7 días", |
|
"story": """ |
|
"No me alcanza el tiempo" se había convertido en mi mantra diario. |
|
Saltaba de tarea en tarea, apagando incendios, pero al final del día sentía que no había avanzado en lo realmente importante. |
|
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. |
|
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. |
|
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. |
|
""" |
|
}, |
|
{ |
|
"title": "Curso de Branding Personal", |
|
"target": "Freelancers y emprendedores que quieren destacar en su industria", |
|
"action": "Inscribirse hoy y acceder a una auditoría gratuita de perfil", |
|
"story": """ |
|
Sabía que era bueno en lo que hacía, pero nadie me conocía. |
|
Mi competencia cobraba el doble, tenía clientes constantes y una marca que se veía sólida. |
|
Yo seguía dependiendo del boca a boca y esperando que alguien recomendara mi trabajo. |
|
Todo cambió cuando entendí que no basta con ser bueno, hay que parecerlo. |
|
Aprendí a construir una marca que reflejara mi valor, a comunicar lo que me hacía único y a atraer clientes sin perseguirlos. |
|
Si sientes que tu talento no se refleja en lo que cobras o en los clientes que atraes, este curso es para ti. |
|
Inscríbete hoy y recibe una auditoría gratuita de tu perfil para empezar con el pie derecho. |
|
""" |
|
}, |
|
{ |
|
"title": "Masterclass: Lanza tu Primer Producto Digital", |
|
"target": "Emprendedores que quieren generar ingresos pasivos", |
|
"action": "Registrarse gratis y recibir acceso a la guía de validación", |
|
"story": """ |
|
Durante meses tuve la idea en la cabeza, pero nunca pasaba de ahí. |
|
|
|
Pensaba que necesitaba más tiempo, más conocimientos, más perfección. |
|
|
|
Mientras tanto, otros lanzaban sus productos y generaban ingresos mientras dormían. |
|
|
|
Cuando finalmente decidí dejar de esperar y actuar con estrategia, todo cambió. No necesitaba un producto perfecto, sino uno que resolviera un problema real. |
|
|
|
Lo lancé, aprendí en el proceso y hoy es una fuente de ingresos constante. |
|
|
|
Si tienes una idea, pero no sabes cómo dar el primer paso, esta masterclass es para ti. |
|
|
|
Regístrate gratis y accede a la guía de validación para lanzar con confianza. |
|
""" |
|
}, |
|
{ |
|
"title": "Taller de Escritura para Redes Sociales", |
|
"target": "Creadores y emprendedores que quieren escribir posts que vendan", |
|
"action": "Reservar lugar con 50% de descuento", |
|
"story": """ |
|
Publicaba con constancia, pero mis posts pasaban desapercibidos. |
|
|
|
Likes de amigos, algún comentario de cortesía… pero cero clientes. |
|
|
|
Veía a otros escribir con naturalidad, conectar y vender sin parecer vendedores. Yo sentía que hablaba al vacío. |
|
|
|
Hasta que entendí que escribir para redes no es solo contar cosas, es saber cómo contarlas. |
|
|
|
|
|
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. |
|
|
|
Si quieres que tus publicaciones generen impacto real, este taller es para ti. |
|
|
|
Reserva tu lugar con 50% de descuento y aprende a escribir textos que convierten. |
|
""" |
|
}, |
|
] |
|
} |
|
} |
|
|
|
def generate_headline_for_story(story, formula_type, product, target_audience, mood, temperature): |
|
"""Función para generar un titular basado en la historia""" |
|
|
|
generation_config = { |
|
"temperature": temperature, |
|
"top_p": 0.65, |
|
"top_k": 360, |
|
"max_output_tokens": 8196, |
|
} |
|
|
|
model = genai.GenerativeModel( |
|
model_name="gemini-2.0-flash", |
|
generation_config=generation_config |
|
) |
|
|
|
system_prompt = """Eres un experto copywriter especializado en crear titulares persuasivos. |
|
IMPORTANTE: |
|
- Genera SOLO UN TITULAR |
|
- No incluyas explicaciones ni etiquetas |
|
- El titular debe estar entre comillas "titular" |
|
- No uses números ni viñetas |
|
- El titular debe fluir naturalmente con la historia |
|
- El titular DEBE estar directamente relacionado con el contenido de la historia |
|
- Evita titulares genéricos que podrían aplicar a cualquier historia |
|
- Extrae elementos específicos de la historia para crear un titular único |
|
""" |
|
|
|
formula_prompts = { |
|
"GPS": f""" |
|
{system_prompt} |
|
|
|
INSTRUCCIONES PARA TITULAR GPS: |
|
Crea un titular que combine: |
|
1. Meta: Un resultado deseable para {target_audience} |
|
2. Periodo: Una situación cotidiana o momento del día |
|
3. Superación: Un conector con toque de humor (sin, incluso si, aunque, etc.) |
|
|
|
ESTRUCTURA REQUERIDA: |
|
[Meta deseable] + [Momento cotidiano] + [Conector humorístico] |
|
|
|
EJEMPLOS EFECTIVOS: |
|
- "Domina el arte de la inversión mientras te cepillas los dientes incluso si confundes Excel con PowerPoint" |
|
- "Aprende un nuevo idioma durante tus visitas al baño aunque solo sepas decir gracias y por favor" |
|
- "Conquista el miedo a hablar en público durante el desayuno a pesar de que te tiemblen hasta las pestañas" |
|
- "Desarrolla músculos preparando café cuando levantar la taza te parece ejercicio extremo" |
|
- "Domina la fotografía profesional en el supermercado aun con ese celular que sobrevivió tres caídas" |
|
|
|
VALIDACIONES: |
|
- ¿Incluye una meta clara y deseable? |
|
- ¿Menciona un momento cotidiano específico? |
|
- ¿Usa un conector humorístico natural? |
|
- ¿Mantiene el humor sin ser ridículo? |
|
- ¿Es relevante para {target_audience}? |
|
|
|
Historia a titular: |
|
{story} |
|
""", |
|
|
|
"AIDA": f""" |
|
{system_prompt} |
|
|
|
INSTRUCCIONES PARA TITULAR AIDA: |
|
Crea un titular que combine: |
|
1. Atención: Gancho sorprendente o contraintuitivo |
|
2. Interés: Desarrollo que intriga |
|
3. Deseo: Promesa transformadora |
|
4. Acción: Siguiente paso natural |
|
|
|
ESTRUCTURA REQUERIDA: |
|
[Gancho sorprendente] + [Desarrollo intrigante] + [Promesa] |
|
|
|
EJEMPLOS EFECTIVOS: |
|
- "¿Sabías que el 83% de los emprendedores exitosos dedican menos de 2 horas al día a reuniones?" |
|
- "La mayoría no sabe que existe una técnica de ventas basada en videojuegos" |
|
- "Contrario a lo que piensas, el momento más productivo del día no es por la mañana" |
|
- "Como el bambú japonés, este método crece invisible hasta explotar en resultados" |
|
- "Los atletas olímpicos entrenan menos horas pero logran más gracias a esta técnica" |
|
|
|
VALIDACIONES: |
|
- ¿El gancho genera curiosidad inmediata? |
|
- ¿El desarrollo mantiene el interés? |
|
- ¿La promesa es creíble y atractiva? |
|
- ¿Mantiene coherencia con la historia? |
|
- ¿Es relevante para {target_audience}? |
|
|
|
Historia a titular: |
|
{story} |
|
""", |
|
|
|
"4U": f""" |
|
{system_prompt} |
|
|
|
INSTRUCCIONES PARA TITULAR 4U: |
|
Combina estratégicamente: |
|
1. Útil: Beneficio práctico y tangible |
|
2. Urgente: Motivador de acción inmediata |
|
3. Único: Diferenciador memorable |
|
4. Ultra-específico: Detalles precisos y medibles |
|
|
|
ESTRUCTURA REQUERIDA: |
|
[Beneficio útil] + [Elemento único] + [Detalle ultra-específico] + [Urgencia] |
|
|
|
EJEMPLOS EFECTIVOS: |
|
- "Aprende 347 palabras en alemán memorizando solo 12 minutos al día mientras cocinas" |
|
- "Cultiva 27 tipos de hierbas aromáticas en 1.5 metros cuadrados de balcón" |
|
- "Automatiza 89% de tus tareas administrativas dedicando 31 minutos cada lunes" |
|
- "La técnica de un cartero rural ayuda a 1893 personas a organizar su tiempo" |
|
- "Un bibliotecario retirado genera 12437 euros vendiendo libros antiguos" |
|
|
|
VALIDACIONES: |
|
- ¿Incluye un beneficio claro y medible? |
|
- ¿Tiene un elemento diferenciador único? |
|
- ¿Usa datos específicos y creíbles? |
|
- ¿Genera sensación de urgencia natural? |
|
- ¿Es relevante para {target_audience}? |
|
|
|
Historia a titular: |
|
{story} |
|
""" |
|
} |
|
|
|
headline_prompt = formula_prompts.get(formula_type, f""" |
|
{system_prompt} |
|
|
|
INSTRUCCIONES ESPECÍFICAS: |
|
Genera un titular persuasivo y memorable que: |
|
- Conecte directamente con la historia narrada |
|
- Refleje la transformación o experiencia descrita |
|
- Use elementos específicos mencionados en el contenido |
|
- Mantenga un tono {mood} coherente con la narrativa |
|
- Sea conciso pero impactante |
|
- No mencione directamente "{product}" |
|
- Genere curiosidad mientras mantiene la relevancia |
|
|
|
IMPORTANTE: |
|
- El titular debe surgir naturalmente de la historia |
|
- Usa palabras clave y conceptos presentes en la narrativa |
|
- Evita titulares genéricos que podrían aplicar a cualquier historia |
|
|
|
Historia a titular: |
|
{story} |
|
""") |
|
|
|
response = model.generate_content([headline_prompt]) |
|
if response and response.parts: |
|
|
|
headline_text = response.parts[0].text.strip() |
|
import re |
|
match = re.search(r'"([^"]*)"', headline_text) |
|
if match: |
|
return match.group(1) |
|
return headline_text |
|
return None |
|
|
|
def generate_story(formula_type, target_audience, product, action, mood, length, temperature, story_topic=None): |
|
"""Función unificada para generar historias""" |
|
|
|
|
|
generation_config = { |
|
"temperature": temperature, |
|
"top_p": 0.65, |
|
"top_k": 360, |
|
"max_output_tokens": 8196, |
|
} |
|
|
|
|
|
model = genai.GenerativeModel( |
|
model_name="gemini-2.0-flash", |
|
generation_config=generation_config |
|
) |
|
|
|
if formula_type not in story_formulas: |
|
raise ValueError("Fórmula no válida") |
|
|
|
|
|
natural_instruction = f""" |
|
IMPORTANTE - NATURALIDAD EN LA HISTORIA: |
|
- NO menciones "{product}" de forma literal o forzada |
|
- Introduce el producto/servicio de manera sutil y orgánica en la narrativa |
|
- Evita que suene como una fórmula publicitaria |
|
- La solución debe surgir naturalmente de la historia |
|
- Usa variaciones y descripciones naturales en lugar del nombre exacto |
|
- La historia debe fluir como una conversación real, no como un anuncio |
|
|
|
Por ejemplo, si el producto es "Webinar sobre Yoga": |
|
❌ "Entonces descubrí el Webinar sobre Yoga" |
|
✅ "Encontré estas clases en línea donde aprendí a conectar con mi cuerpo" |
|
|
|
Si es un curso: |
|
❌ "Me inscribí en el Curso de Marketing Digital" |
|
✅ "Comencé a aprender sobre el mundo del marketing en línea" |
|
""" |
|
|
|
|
|
audience_analysis = f""" |
|
ANÁLISIS DEL PÚBLICO OBJETIVO: {target_audience} |
|
|
|
INSTRUCCIONES DE ANÁLISIS: |
|
1. Dolores y Problemas: |
|
- Identifica los problemas cotidianos específicos de {target_audience} |
|
- Reconoce sus frustraciones y miedos más profundos |
|
- Analiza las consecuencias emocionales de estos problemas |
|
- Considera el impacto en su vida diaria |
|
|
|
2. Creencias y Valores: |
|
- Comprende sus creencias limitantes |
|
- Identifica sus aspiraciones y sueños |
|
- Reconoce sus valores fundamentales |
|
- Entiende sus motivaciones principales |
|
|
|
3. Situaciones de Vida: |
|
- Visualiza sus rutinas diarias |
|
- Identifica momentos de tensión o conflicto |
|
- Reconoce sus contextos sociales y profesionales |
|
- Comprende sus responsabilidades y presiones |
|
|
|
4. Puntos de Dolor Específicos: |
|
- Problemas prácticos: [analiza sus dificultades concretas] |
|
- Dolores emocionales: [identifica sus preocupaciones más profundas] |
|
- Miedos: [reconoce sus temores principales] |
|
- Frustraciones: [entiende sus obstáculos recurrentes] |
|
|
|
CONTEXTO NARRATIVO: |
|
- Si hay story_topic ("{story_topic if story_topic else 'No especificado'}"), |
|
úsalo como escenario o contexto para desarrollar la historia |
|
- El protagonista debe reflejar fielmente las características de {target_audience} |
|
- Los problemas y situaciones deben ser 100% reconocibles por la audiencia |
|
- La transformación debe abordar directamente sus dolores específicos |
|
""" |
|
|
|
|
|
system_prompt = """You are a world-class copywriter, specialized in crafting persuasive stories that emotionally connect with readers and drive them to action. |
|
|
|
FORMAT RULES: |
|
- Story must be structured in short paragraphs (2-4 lines maximum) |
|
- Number of paragraphs should adjust to requested length |
|
- Each section must flow naturally into the next |
|
- No explicit section labels |
|
- Include smooth transitions between parts |
|
- Story must feel complete and cohesive |
|
- Break text for better readability and impact |
|
|
|
FORMULA APPLICATION: |
|
- The selected formula MUST be applied to the entire story |
|
- Review and follow the structure from story_formulas[formula_type]["description"] |
|
- Use examples in story_formulas[formula_type]["examples"] as inspiration |
|
- Formula provides framework, tone provides emotional layer |
|
- Paragraphs can be more or fewer than formula steps |
|
- Structure should be present but not obvious |
|
|
|
CONTENT AND AUDIENCE: |
|
- Focus on relatable, everyday situations |
|
- Describe specific audience problems and obstacles |
|
- Use details that generate immediate identification |
|
- Story must faithfully reflect audience's real life |
|
- Problems and situations must be 100% recognizable |
|
- Base narrative on real audience pain points |
|
- Each story must be unique and memorable |
|
- Avoid clichés and generic scenarios |
|
|
|
TONE AND STYLE: |
|
- Mood only affects emotional tone, not structure |
|
- Emotions should arise from real situations |
|
- Keep focus on audience regardless of tone |
|
- Selected tone must remain consistent |
|
- Both formula and tone must complement each other |
|
- Maintain voice appropriate for target audience |
|
|
|
SPECIAL CONSIDERATIONS FOR GHA: |
|
- Story must develop around specified topic |
|
- Topic should be the main thread |
|
- Integrate product/service naturally within topic context |
|
- Keep topic as central narrative element |
|
|
|
IMPORTANT: |
|
- Each story must be unique and memorable |
|
- Avoid clichés and generic scenarios |
|
- Maintain a credible and authentic voice |
|
- Adapt language to target audience |
|
- Focus on emotional transformation |
|
- Follow formula structure while maintaining selected tone |
|
- Never explicitly label sections |
|
- Integrate product and call-to-action organically |
|
|
|
LANGUAGE INSTRUCTIONS: |
|
- Generate the story in Spanish |
|
- Use natural, fluent Spanish |
|
- Maintain cultural relevance for Spanish-speaking audiences |
|
- Ensure idioms and expressions are appropriate for Spanish |
|
- Keep all story content in Spanish, only system instructions in English |
|
|
|
CALL TO ACTION GUIDELINES: |
|
Create a natural and persuasive call to action that: |
|
|
|
Flows naturally from the story |
|
Focuses on transformation and benefits |
|
KEY ELEMENTS IN EVERY CTA: |
|
|
|
Transformational Benefit → What will change in their life |
|
Implicit Social Proof → Others have already achieved it |
|
Risk Reduction → Guarantees or trial periods |
|
Simple Next Step → A clear and achievable action |
|
Natural Urgency → Based on benefits, not scarcity |
|
RECOMMENDED STRUCTURE: |
|
[Insight or Universal Truth]. [Specific invitation with a clear benefit] |
|
|
|
IMPORTANT: |
|
|
|
The CTA must flow naturally from the story |
|
Maintain the established emotional tone |
|
Focus on the benefit rather than the action |
|
Use language that inspires rather than pressures |
|
Connect with the transformation described in the story |
|
|
|
KEY ELEMENTS TO INCLUDE: |
|
- Emotional hooks that grab attention |
|
- Relatable situations and characters |
|
- Sensory details and vivid descriptions |
|
- Natural problem-solution progression |
|
- Organic product integration |
|
- Compelling but subtle call-to-action |
|
- Focus on transformation and emotional journey |
|
|
|
STORY DEVELOPMENT: |
|
- Start with a strong, relatable hook |
|
- Build tension through real-life scenarios |
|
- Develop solution naturally within narrative |
|
- End with clear but organic call to action |
|
- Maintain emotional consistency throughout |
|
- Ensure each paragraph serves story progression""" |
|
|
|
story_instruction = f"{system_prompt}\n\n{audience_analysis}\n\n" |
|
|
|
|
|
if formula_type == "GHA" and story_topic: |
|
story_instruction += f""" |
|
INTEGRACIÓN DEL TEMA CENTRAL EN LA HISTORIA: |
|
|
|
TEMA PRINCIPAL: "{story_topic}" |
|
|
|
1. ESTRUCTURA NARRATIVA: |
|
- Primer párrafo: Introduce el tema "{story_topic}" de forma cautivadora |
|
- Desarrollo: Profundiza en la experiencia/situación relacionada con el tema |
|
- Clímax: Momento de transformación donde el producto se integra naturalmente |
|
- Cierre: Resolución que conecta el tema con la solución propuesta |
|
|
|
2. DESARROLLO DEL TEMA: |
|
- Usa el tema como hilo conductor de toda la historia |
|
- Describe situaciones específicas relacionadas con {story_topic} |
|
- Incluye detalles y experiencias únicas del tema |
|
- Mantén el foco en la perspectiva de {target_audience} sobre {story_topic} |
|
|
|
3. INTEGRACIÓN DEL PRODUCTO: |
|
- NO menciones {product} hasta haber desarrollado bien el tema |
|
- El producto debe surgir como solución natural a una situación del tema |
|
- Conecta los beneficios de {product} con aspectos específicos de {story_topic} |
|
- Mantén el protagonismo del tema por encima del producto |
|
|
|
4. ELEMENTOS OBLIGATORIOS: |
|
- Mínimo 3 referencias específicas a {story_topic} |
|
- Al menos 2 situaciones o momentos relacionados con el tema |
|
- Una conexión clara entre el tema y la necesidad del producto |
|
- Un cierre que refuerce la relación entre tema y solución |
|
|
|
5. VALIDACIONES: |
|
- ¿La historia gira realmente en torno a {story_topic}? |
|
- ¿Se mantiene el tema como elemento central? |
|
- ¿La integración del producto es natural dentro del contexto del tema? |
|
- ¿El llamado a la acción conecta con el tema desarrollado? |
|
|
|
RECORDATORIO IMPORTANTE: |
|
- La historia debe ser 100% sobre {story_topic} |
|
- El producto es secundario al tema |
|
- Cada párrafo debe contener elementos del tema |
|
- La transformación debe estar directamente relacionada con {story_topic} |
|
""" |
|
|
|
|
|
story_instruction += f""" |
|
EJEMPLOS DE INTEGRACIÓN DEL TEMA: |
|
|
|
Si el tema es una experiencia personal: |
|
❌ "Un día cualquiera..." |
|
✓ "Aquella mañana en [situación específica del tema]..." |
|
|
|
Si el tema es una situación: |
|
❌ "Las personas suelen..." |
|
✓ "En medio de [detalle específico del tema]..." |
|
|
|
Si el tema es un concepto: |
|
❌ "Todos queremos mejorar..." |
|
✓ "Cuando te enfrentas a [aspecto específico del tema]..." |
|
|
|
ESTRUCTURA DEL PÁRRAFO INICIAL: |
|
1. Situación específica del {story_topic} |
|
2. Conexión emocional con {target_audience} |
|
3. Transición hacia el desarrollo |
|
""" |
|
|
|
|
|
story_instruction += f""" |
|
PRODUCT INTEGRATION GUIDELINES: |
|
- Evita menciones obvias de {product} |
|
- Enfócate en despertar interés genuino mostrando beneficios transformacionales |
|
- Integra el producto de manera natural en la narrativa |
|
- Destaca cómo el producto mejora la vida del protagonista |
|
- Mantén el tono {mood} al describir los beneficios |
|
|
|
IMPORTANT REMINDER: |
|
- The entire story must be written in Spanish |
|
- Use natural expressions and cultural references appropriate for Spanish-speaking audiences |
|
- Ensure the story flows naturally in Spanish |
|
""" |
|
|
|
|
|
if formula_type == "GHA" and story_topic: |
|
system_prompt += f""" |
|
INSTRUCCIONES ESPECÍFICAS PARA GHA: |
|
- El titular DEBE incorporar elementos del story_topic: "{story_topic}" |
|
- Mantén el enfoque principal en la transformación o experiencia relacionada con el tema |
|
- Usa palabras clave o conceptos específicos mencionados en la historia |
|
- Asegúrate de que el titular refleje la esencia del story_topic |
|
- La conexión entre el titular y el tema debe ser clara y natural |
|
""" |
|
|
|
|
|
story_instruction += f""" |
|
IMPORTANTE: Estudia cuidadosamente estos ejemplos de la fórmula seleccionada. |
|
Cada ejemplo representa el estilo y estructura a seguir, adaptados al tono {mood}: |
|
""" |
|
|
|
|
|
random_examples = random.sample(story_formulas[formula_type]['examples'], |
|
min(3, len(story_formulas[formula_type]['examples']))) |
|
|
|
|
|
story_instruction += "\nEJEMPLOS DE LA FÓRMULA A SEGUIR:\n" |
|
for i, example in enumerate(random_examples, 1): |
|
story_instruction += f""" |
|
Ejemplo {i}: |
|
Título: {example['title']} |
|
Audiencia: {example['target']} |
|
Acción: {example['action']} |
|
Historia: |
|
{example['story']} |
|
""" |
|
|
|
|
|
story_instruction += """ |
|
INSTRUCCIONES ESPECÍFICAS: |
|
1. Mantén la misma estructura y longitud que los ejemplos anteriores |
|
2. Usa el mismo tono y estilo de escritura, adaptado al mood especificado |
|
3. Replica los patrones de construcción de frases y transiciones |
|
4. Conserva el nivel de especificidad y detalle en las descripciones |
|
5. Adapta el contenido para la audiencia manteniendo la esencia de los ejemplos |
|
6. Integra los beneficios del producto de manera sutil y convincente |
|
7. Asegura que la transformación del protagonista sea creíble y emotiva |
|
""" |
|
|
|
|
|
story_instruction += f"\nFÓRMULA A SEGUIR:\n{story_formulas[formula_type]['description']}\n\n" |
|
|
|
|
|
story_instruction += f""" |
|
RECORDATORIO FINAL: |
|
1. Sigue la estructura de la fórmula seleccionada |
|
2. Aplica el tono {mood} de manera consistente |
|
3. Mantén la coherencia narrativa |
|
4. Asegura que la historia refleje una transformación auténtica |
|
5. Integra {product} y sus beneficios de forma natural |
|
6. Culmina con un llamado a la acción convincente: {action} |
|
|
|
GENERA AHORA: |
|
Crea una historia persuasiva de {length} palabras en español que siga fielmente el estilo y estructura de los ejemplos mostrados, |
|
manteniendo un tono {mood} y enfocándote en la transformación que {product} puede traer a la vida de {target_audience}. |
|
|
|
IMPORTANT FINAL REMINDER: |
|
- Write the complete story in Spanish |
|
- Ensure natural flow and cultural relevance |
|
- Maintain authentic Spanish expressions and tone |
|
""" |
|
|
|
|
|
story_instruction = f"{natural_instruction}\n\n{story_instruction}" |
|
|
|
|
|
response = model.generate_content([story_instruction]) |
|
if response and response.parts: |
|
story = response.parts[0].text.strip() |
|
formula_types = ["GPS", "AIDA", "4U", "Númerica Suprema"] |
|
selected_formula = random.choice(formula_types) |
|
headline = generate_headline_for_story(story, selected_formula, product, target_audience, mood, temperature) |
|
if headline: |
|
return f"{headline}\n\n{story}" |
|
raise ValueError("No se pudo generar la historia") |
|
|
|
|
|
st.set_page_config(page_title="Generador de Historias", page_icon=":pencil:", layout="wide") |
|
|
|
|
|
st.markdown(""" |
|
<style> |
|
|
|
/* Reducir espacio superior */ |
|
.block-container { |
|
padding-top: 1rem; |
|
padding-bottom: 5rem; |
|
} |
|
|
|
/* Ajustar espaciado del título */ |
|
h1 { |
|
margin-top: -2rem; |
|
padding-top: 0.5rem; |
|
} |
|
|
|
/* Ajustar espaciado del subtítulo */ |
|
h4 { |
|
margin-top: 0.5rem; |
|
padding-top: 0rem; |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
|
|
st.markdown("<h1 style='text-align: center;'>Story Genius Maker</h1>", unsafe_allow_html=True) |
|
st.markdown("<h3 style='text-align: center;'>Teje historias inolvidables en segundos, guiado por la magia de la inteligencia artificial que da vida a tus ideas en relatos cautivadores.</h3>", unsafe_allow_html=True) |
|
|
|
|
|
st.markdown(""" |
|
<style> |
|
div.stButton > button { |
|
background-color: #FFCC00; |
|
color: black; |
|
width: 90%; |
|
height: 60px; |
|
font-weight: bold; |
|
font-size: 22px; |
|
text-transform: uppercase; |
|
border: 1px solid #000000; |
|
border-radius: 8px; |
|
display: block; |
|
margin: 0 auto; |
|
} |
|
div.stButton > button:hover { |
|
background-color: #FFD700; |
|
color: black; |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
|
|
col1, col2 = st.columns([2, 3]) |
|
|
|
|
|
with col1: |
|
target_audience = st.text_input("Público objetivo", |
|
placeholder="¿A quién está dirigido tu mensaje?") |
|
product = st.text_input("Producto/Servicio", |
|
placeholder="¿Qué estás ofreciendo?") |
|
action = st.text_area("Llamado a la acción", |
|
placeholder="¿Qué acción específica debe tomar tu audiencia?") |
|
|
|
|
|
with st.expander("Personaliza tu historia"): |
|
|
|
available_formulas = list(story_formulas.keys()) |
|
formula_display_names = [] |
|
formula_mapping = {} |
|
|
|
for formula in available_formulas: |
|
display_name = '.'.join(list(formula)) if formula.isupper() else formula |
|
formula_display_names.append(display_name) |
|
formula_mapping[display_name] = formula |
|
|
|
formula = st.radio( |
|
"Selecciona la fórmula para generar tu historia:", |
|
formula_display_names |
|
) |
|
|
|
selected_formula = formula_mapping[formula] |
|
|
|
|
|
mood = st.selectbox("Tono de la historia:", |
|
["Emocional", "Triste", "Feliz", "Horror", "Comedia", "Romántico"]) |
|
|
|
if selected_formula == "GHA": |
|
length = st.slider("Longitud de la historia (palabras):", |
|
min_value=50, max_value=150, value=100, step=10) |
|
else: |
|
length = st.slider("Longitud de la historia (palabras):", |
|
min_value=50, max_value=150, value=100, step=10) |
|
|
|
temperature = st.slider( |
|
"Nivel de creatividad:", |
|
min_value=0.0, |
|
max_value=2.0, |
|
value=1.0, |
|
step=0.1, |
|
help="Valores más altos generan historias más creativas pero menos predecibles. Valores más bajos producen historias más consistentes." |
|
) |
|
|
|
|
|
story_topic = None |
|
if selected_formula == "GHA": |
|
story_topic = st.text_area( |
|
"De qué quieres que trate la historia", |
|
placeholder="Explica si hay algo específico sobre lo que te gustaría contar (puede ser una vivencia personal, película, cuento, personaje ficticio, etc.)." |
|
) |
|
|
|
|
|
submit = st.button("Generar mi historia") |
|
|
|
|
|
with col2: |
|
if submit: |
|
if target_audience and product and action: |
|
try: |
|
if selected_formula == "GHA": |
|
if story_topic: |
|
response = generate_story(selected_formula, target_audience, product, |
|
action, mood, length, temperature, story_topic) |
|
else: |
|
st.error("Por favor, completa todos los campos requeridos para la fórmula G.H.A.") |
|
response = "" |
|
else: |
|
response = generate_story(selected_formula, target_audience, product, |
|
action, mood, length, temperature) |
|
|
|
if response: |
|
st.markdown(f""" |
|
<div style=" |
|
border: 1px solid #ddd; |
|
border-radius: 8px; |
|
padding: 20px; |
|
background-color: #ffffff; |
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1); |
|
margin-top: 20px; |
|
"> |
|
<h3 style=" |
|
color: #333; |
|
margin-bottom: 15px; |
|
font-size: 1.2em; |
|
border-bottom: 1px solid #eee; |
|
padding-bottom: 10px; |
|
">Historia Generada:</h3> |
|
<p style=" |
|
white-space: pre-line; |
|
line-height: 1.6; |
|
color: #444; |
|
font-size: 1.1em; |
|
">{response}</p> |
|
</div> |
|
""", unsafe_allow_html=True) |
|
except ValueError as e: |
|
st.error(f"Error: {str(e)}") |
|
else: |
|
st.error("Por favor, completa todos los campos requeridos (Público objetivo, Producto y Acción).") |