JeCabrera's picture
Update app.py
94eade6 verified
from dotenv import load_dotenv
import streamlit as st
import os
import google.generativeai as genai
from story_formulas import story_formulas
from styles import apply_styles, format_story_output
from story_moods import story_moods # Agregar esta importación al inicio
# Cargar variables de entorno
load_dotenv()
# Configurar API de Google Gemini
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
# Función para obtener la respuesta del modelo Gemini
def get_gemini_response(input_prompt, formula_type, length, mood, target_audience, cta_type, temperature):
if not input_prompt:
return "Por favor, escribe un mensaje para generar contenido."
formula = story_formulas[formula_type]
model = genai.GenerativeModel('gemini-2.0-flash')
full_prompt = f"""
You are a creative storyteller. Write THREE different {mood} stories in Spanish about "{input_prompt}" using everyday words and natural conversation.
Each story should use exactly {length} words.
Target Audience: {target_audience}
Call to Action: {cta_type}
Story Formula: {formula_type}
{formula["description"]}
Keep in mind:
- Write for {target_audience}
- Use simple, clear language
- Tell the story in short paragraphs
- The CTA must be conversational and focus on benefits:
* Instead of: "Inscríbete al curso de marketing"
* Use: "¿Quieres aprender a conseguir más clientes? Acompáñanos este jueves..."
* Instead of: "Reserva tu consulta"
* Use: "Da el primer paso hacia tu transformación aquí..."
CRITICAL INSTRUCTIONS:
- Output ONLY the story text
- DO NOT include any labels like (Problem), (Solution), etc.
- DO NOT include any structural markers or formula explanations
- Write as a continuous narrative with natural paragraph breaks
- The story should flow naturally between sections without any visible structure markers
- Make the CTA feel like a natural part of the conversation, focusing on what the reader will gain
- Avoid promotional language in the CTA
- DO NOT explain or mention the formula parts in the text
- Separate each story with "---"
Format: Three clean story texts with natural paragraphs, separated by "---", no labels, no explanations.
"""
response = model.generate_content([full_prompt], generation_config={"temperature": temperature})
return response.parts[0].text if response and response.parts else "Error al generar contenido."
# Configurar la aplicación Streamlit
st.set_page_config(page_title="Story Generator", page_icon=":pencil:", layout="wide")
st.markdown(apply_styles(), unsafe_allow_html=True) # Add this line here
# Leer y mostrar el manual en el sidebar
with open("manual.md", "r", encoding="utf-8") as file:
manual_content = file.read()
st.sidebar.markdown(manual_content)
# Título de la app
st.markdown("<h1>Story Genius Maker</h1>", unsafe_allow_html=True)
st.markdown("<h3>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)
# Crear dos columnas
col1, col2 = st.columns([1, 1])
# Columna izquierda para inputs
# Remove the benefit input field
with col1:
# Entrada de texto principal
input_prompt = st.text_area("Escribe de qué quieres que trate la historia:", placeholder="Escribe aquí tu idea...")
target_audience = st.text_input("Público Objetivo:", placeholder="Ejemplo: Profesionales de 25-35 años...")
cta_type = st.text_input("Llamado a la acción:", placeholder="Ejemplo: Incribete a nuestro Curso de marketing digital...")
with st.expander("Opciones avanzadas"):
formula_type = st.selectbox(
"Fórmula narrativa:",
options=list(story_formulas.keys()),
)
mood = st.selectbox(
"Ángulo de Historia:",
options=list(story_moods.keys()),
)
length = st.slider("Longitud del texto (palabras):",
min_value=100,
max_value=150,
value=125,
step=5)
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."
)
generate_button = st.button("Generar historia")
# Al inicio de la app
apply_styles()
# En la sección donde muestras la historia generada
with col2:
if generate_button:
response = get_gemini_response(
input_prompt, formula_type, length,
mood, target_audience, cta_type,
temperature
)
stories = response.split("---")
for i, story in enumerate(stories, 1):
st.subheader(f"Historia {i}:")
st.write(story.strip())
st.divider()