Spaces:
Sleeping
Sleeping
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: | |
# Extraer el titular entre comillas si existe | |
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""" | |
# Definir la configuración del modelo | |
generation_config = { | |
"temperature": temperature, | |
"top_p": 0.65, | |
"top_k": 360, | |
"max_output_tokens": 8196, | |
} | |
# Inicializar el modelo con la configuración | |
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") | |
# Añadir instrucciones de naturalidad al inicio del prompt | |
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" | |
""" | |
# Análisis del público objetivo | |
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 | |
""" | |
# Definir el system prompt dentro de la función | |
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" | |
# Instrucciones específicas para GHA cuando hay story_topic | |
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} | |
""" | |
# Añadir ejemplos específicos para el tipo de tema | |
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 | |
""" | |
# Añadir instrucciones sobre el producto y beneficios | |
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 | |
""" | |
# Si es GHA y hay story_topic, añadir instrucciones específicas | |
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 | |
""" | |
# Instrucciones de estudio de ejemplos | |
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}: | |
""" | |
# Seleccionar ejemplos aleatorios | |
random_examples = random.sample(story_formulas[formula_type]['examples'], | |
min(3, len(story_formulas[formula_type]['examples']))) | |
# Agregar ejemplos seleccionados | |
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']} | |
""" | |
# Agregar instrucciones específicas | |
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 | |
""" | |
# Agregar la descripción de la fórmula | |
story_instruction += f"\nFÓRMULA A SEGUIR:\n{story_formulas[formula_type]['description']}\n\n" | |
# Recordatorio final | |
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 | |
""" | |
# Asegúrate de que las instrucciones de naturalidad estén al inicio del prompt | |
story_instruction = f"{natural_instruction}\n\n{story_instruction}" | |
# Generar la historia | |
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") | |
# Inicializar la aplicación Streamlit | |
st.set_page_config(page_title="Generador de Historias", page_icon=":pencil:", layout="wide") | |
# Ocultar elementos de la interfaz | |
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) | |
# Título y subtítulo | |
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) | |
# Añadir CSS personalizado para el botón | |
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) | |
# Crear las columnas para el diseño (40% para la izquierda, 60% para la derecha) | |
col1, col2 = st.columns([2, 3]) | |
# Cambiar el comportamiento del slider cuando se seleccione "GHA" | |
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?") | |
# Personalización adicional | |
with st.expander("Personaliza tu historia"): | |
# Código de selección de fórmula movido aquí | |
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] | |
# Resto de las opciones de personalización | |
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." | |
) | |
# Campo story_topic fuera del expander pero dependiente de la fórmula seleccionada | |
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.)." | |
) | |
# Botón para generar contenido | |
submit = st.button("Generar mi historia") | |
# Mostrar el contenido generado en la columna derecha (col2) | |
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).") |