Spaces:
Sleeping
Sleeping
Upload 13 files
Browse files- Readme.md +71 -0
- app.py +86 -123
- reel_formulas.py +368 -0
- session_state.py +1 -10
- system_prompts.py +47 -134
Readme.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Gemini Chatbot Interface with Streamlit
|
| 2 |
+
|
| 3 |
+
## Overview
|
| 4 |
+
|
| 5 |
+
This project is a Streamlit-based chat application that interacts with the Gemini AI model, allowing users to engage in conversations with an artificial intelligence assistant. The application stores chat history, allowing users to revisit and continue previous conversations.
|
| 6 |
+
|
| 7 |
+
<div align="center"><img src="docs/gemini-chatbot.gif" width="800"></div>
|
| 8 |
+
|
| 9 |
+
## Getting Started
|
| 10 |
+
|
| 11 |
+
### Dependencies
|
| 12 |
+
|
| 13 |
+
This code uses the following libraries:
|
| 14 |
+
|
| 15 |
+
- `streamlit`: for building the user interface.
|
| 16 |
+
- `gemini`: for chat
|
| 17 |
+
- Gemini API key: Get it from [Google AI Studio](https://ai.google.dev/tutorials/setup?hl=tr)
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
### Usage
|
| 21 |
+
|
| 22 |
+
Follow these steps to set up and run the project:
|
| 23 |
+
|
| 24 |
+
1. Create a virtual environment:
|
| 25 |
+
```
|
| 26 |
+
python3 -m venv my_env
|
| 27 |
+
source my_env/bin/activate
|
| 28 |
+
.\my_env\Scripts\activate
|
| 29 |
+
```
|
| 30 |
+
|
| 31 |
+
2. Install dependencies:
|
| 32 |
+
```
|
| 33 |
+
pip install -r requirements.txt
|
| 34 |
+
```
|
| 35 |
+
|
| 36 |
+
3. Run the Streamlit server:
|
| 37 |
+
```
|
| 38 |
+
streamlit run app_chat.py
|
| 39 |
+
```
|
| 40 |
+
|
| 41 |
+
4. Access the application in your browser at http://localhost:8501.
|
| 42 |
+
|
| 43 |
+
5. Start chatting with the assistant!
|
| 44 |
+
|
| 45 |
+
## Repository Structure
|
| 46 |
+
```
|
| 47 |
+
repository/
|
| 48 |
+
├── app_chat.py # the code and UI integrated together live here
|
| 49 |
+
├── requirements.txt # the python packages needed to run locally
|
| 50 |
+
├── .streamlit/
|
| 51 |
+
│ └── config.toml # theme info for the UI
|
| 52 |
+
├── data/ # folder for saved chat messages
|
| 53 |
+
├── docs/ # preview for github
|
| 54 |
+
|
| 55 |
+
```
|
| 56 |
+
|
| 57 |
+
## How it Works
|
| 58 |
+
|
| 59 |
+
The app as follows:
|
| 60 |
+
|
| 61 |
+
1. The user enters a question in the input field.
|
| 62 |
+
|
| 63 |
+
2. User messages are sent to the Gemini model for processing.
|
| 64 |
+
|
| 65 |
+
3. The user's input, along with the chat history, is used to generate a response.
|
| 66 |
+
|
| 67 |
+
4. The Gemini model generates a response based on the patterns it learned during training.
|
| 68 |
+
|
| 69 |
+
5. The application saves chat messages and Gemini AI chat history to files for later retrieval.
|
| 70 |
+
|
| 71 |
+
6. A new chat is created if the user initiates a conversation that hasn't been stored before, or user can go back to past chats.
|
app.py
CHANGED
|
@@ -4,41 +4,13 @@ import joblib
|
|
| 4 |
import streamlit as st
|
| 5 |
import google.generativeai as genai
|
| 6 |
from dotenv import load_dotenv
|
| 7 |
-
from
|
| 8 |
-
from system_prompts import
|
| 9 |
from session_state import SessionState
|
| 10 |
|
| 11 |
-
# Configuración de la página - DEBE SER LA PRIMERA LLAMADA A STREAMLIT
|
| 12 |
-
st.set_page_config(
|
| 13 |
-
page_title="RoboCopy - Reels Creator",
|
| 14 |
-
page_icon="🎬",
|
| 15 |
-
layout="wide",
|
| 16 |
-
initial_sidebar_state="expanded"
|
| 17 |
-
)
|
| 18 |
-
|
| 19 |
-
# Cargar variables de entorno
|
| 20 |
-
load_dotenv()
|
| 21 |
-
GOOGLE_API_KEY=os.environ.get('GOOGLE_API_KEY')
|
| 22 |
-
genai.configure(api_key=GOOGLE_API_KEY)
|
| 23 |
-
|
| 24 |
-
# Configuración de la aplicación
|
| 25 |
-
new_chat_id = f'{time.time()}'
|
| 26 |
-
MODEL_ROLE = 'model'
|
| 27 |
-
USER_AVATAR_ICON = '👤'
|
| 28 |
-
AI_AVATAR_ICON = '🤖'
|
| 29 |
-
|
| 30 |
# Inicializar el estado de la sesión
|
| 31 |
state = SessionState()
|
| 32 |
|
| 33 |
-
# Crear directorio de datos si no existe
|
| 34 |
-
os.makedirs('data', exist_ok=True)
|
| 35 |
-
|
| 36 |
-
# Cargar historial de chats pasados
|
| 37 |
-
try:
|
| 38 |
-
past_chats = joblib.load('data/past_chats_list')
|
| 39 |
-
except:
|
| 40 |
-
past_chats = {}
|
| 41 |
-
|
| 42 |
# Función para detectar saludos y generar respuestas personalizadas
|
| 43 |
def is_greeting(text):
|
| 44 |
"""Detecta si el texto es un saludo simple"""
|
|
@@ -95,34 +67,10 @@ def handle_chat_title(prompt):
|
|
| 95 |
|
| 96 |
def get_enhanced_prompt(prompt, is_example):
|
| 97 |
"""Genera el prompt mejorado según el tipo de mensaje"""
|
| 98 |
-
# Importar las preguntas directamente desde system_prompts.py
|
| 99 |
-
from system_prompts import get_discovery_questions
|
| 100 |
-
|
| 101 |
-
# Obtener la lista de preguntas
|
| 102 |
-
discovery_questions = get_discovery_questions()
|
| 103 |
-
|
| 104 |
if is_greeting(prompt):
|
| 105 |
-
return f"El usuario te ha saludado con '{prompt}'. Preséntate brevemente
|
| 106 |
elif is_example:
|
| 107 |
-
return f"El usuario ha seleccionado un ejemplo: '{prompt}'. Responde de manera
|
| 108 |
-
else:
|
| 109 |
-
# Analizar la respuesta del usuario para determinar qué pregunta hacer a continuación
|
| 110 |
-
if "audiencia" in prompt.lower() or "dirigido" in prompt.lower() or "público" in prompt.lower():
|
| 111 |
-
# Si el usuario respondió sobre la audiencia, hacer la segunda pregunta
|
| 112 |
-
return f"Gracias por esa información sobre tu audiencia. Ahora, {discovery_questions[1]}"
|
| 113 |
-
elif "producto" in prompt.lower() or "servicio" in prompt.lower() or "promocionar" in prompt.lower() or "ofreces" in prompt.lower():
|
| 114 |
-
# Si el usuario respondió sobre el producto/servicio, hacer la tercera pregunta
|
| 115 |
-
return f"Entendido. Ahora, {discovery_questions[2]}"
|
| 116 |
-
elif "problema" in prompt.lower() or "duda" in prompt.lower() or "gancho" in prompt.lower():
|
| 117 |
-
# Si el usuario respondió sobre el problema/duda, hacer la cuarta pregunta
|
| 118 |
-
return f"Perfecto. Por último, {discovery_questions[3]}"
|
| 119 |
-
elif "acción" in prompt.lower() or "cta" in prompt.lower() or "comprar" in prompt.lower() or "registrarse" in prompt.lower() or "seguir" in prompt.lower():
|
| 120 |
-
# Si el usuario respondió sobre la acción/CTA, proceder a la creación del guion
|
| 121 |
-
system_prompt = get_reels_script_prompt()
|
| 122 |
-
return f"Gracias por toda la información proporcionada. Ahora vamos a crear un guion de Reel efectivo basado en tus respuestas. {system_prompt}"
|
| 123 |
-
else:
|
| 124 |
-
# Si no se puede determinar en qué parte del proceso estamos, hacer la primera pregunta
|
| 125 |
-
return f"Para crear un guion de Reel efectivo, necesito hacerte algunas preguntas clave. Empecemos: {discovery_questions[0]}"
|
| 126 |
return prompt
|
| 127 |
|
| 128 |
def process_model_response(enhanced_prompt):
|
|
@@ -203,10 +151,10 @@ def display_initial_header():
|
|
| 203 |
""", unsafe_allow_html=True)
|
| 204 |
st.image("robocopy_logo.png", width=300, use_container_width=True)
|
| 205 |
|
| 206 |
-
# Título con diseño responsivo
|
| 207 |
st.markdown("""
|
| 208 |
<div style='text-align: center; margin-top: -35px; width: 100%;'>
|
| 209 |
-
<h1 class='robocopy-title' style='width: 100%; text-align: center; color: white !important; font-size: clamp(2.5em, 5vw, 4em); line-height: 1.2;'>
|
| 210 |
</div>
|
| 211 |
""", unsafe_allow_html=True)
|
| 212 |
|
|
@@ -221,7 +169,7 @@ def display_initial_header():
|
|
| 221 |
st.markdown("""
|
| 222 |
<div style='text-align: center; width: 100%;'>
|
| 223 |
<p style='font-size: 16px; background-color: transparent; padding: 12px; border-radius: 8px; margin-top: -20px; color: white; width: 100%; text-align: center;'>
|
| 224 |
-
|
| 225 |
</p>
|
| 226 |
</div>
|
| 227 |
""", unsafe_allow_html=True)
|
|
@@ -229,10 +177,10 @@ def display_initial_header():
|
|
| 229 |
# Función para mostrar ejemplos de preguntas
|
| 230 |
def display_examples():
|
| 231 |
ejemplos = [
|
| 232 |
-
{"texto": "¿
|
| 233 |
-
{"texto": "
|
| 234 |
-
{"texto": "
|
| 235 |
-
{"texto": "¿
|
| 236 |
]
|
| 237 |
|
| 238 |
# Crear los botones de ejemplo
|
|
@@ -243,74 +191,89 @@ def display_examples():
|
|
| 243 |
state.prompt = ejemplo["prompt"]
|
| 244 |
st.rerun()
|
| 245 |
|
| 246 |
-
#
|
| 247 |
-
|
|
|
|
|
|
|
| 248 |
|
| 249 |
-
#
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
|
|
|
| 253 |
|
| 254 |
-
#
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
if st.button("🆕 Nueva Conversación", use_container_width=True):
|
| 261 |
-
state.chat_id = new_chat_id
|
| 262 |
-
state.messages = []
|
| 263 |
-
state.gemini_history = []
|
| 264 |
-
state.initialize_chat()
|
| 265 |
-
st.rerun()
|
| 266 |
-
|
| 267 |
-
# Selector de chats pasados
|
| 268 |
-
st.markdown("### 💬 Conversaciones Pasadas")
|
| 269 |
-
|
| 270 |
-
# Mostrar chats pasados en orden inverso (más recientes primero)
|
| 271 |
-
past_chat_ids = list(past_chats.keys())
|
| 272 |
-
past_chat_ids.sort(reverse=True)
|
| 273 |
-
|
| 274 |
-
for chat_id in past_chat_ids:
|
| 275 |
-
chat_title = past_chats[chat_id]
|
| 276 |
-
if st.button(f"📝 {chat_title}", key=f"chat_{chat_id}", use_container_width=True):
|
| 277 |
-
state.chat_id = chat_id
|
| 278 |
-
state.load_chat_history(chat_id)
|
| 279 |
-
state.initialize_chat(state.gemini_history)
|
| 280 |
-
st.rerun()
|
| 281 |
-
|
| 282 |
-
# Información adicional
|
| 283 |
-
st.markdown("---")
|
| 284 |
-
st.markdown("### ℹ️ Información")
|
| 285 |
-
st.markdown("""
|
| 286 |
-
**RoboCopy - Reels Creator** te ayuda a crear guiones efectivos para tus Reels de Instagram y Facebook.
|
| 287 |
-
|
| 288 |
-
Simplemente describe tu nicho, audiencia y objetivo, y te ayudaremos a crear un guion optimizado para generar engagement.
|
| 289 |
-
""")
|
| 290 |
|
| 291 |
-
#
|
| 292 |
-
|
| 293 |
-
|
|
|
|
|
|
|
| 294 |
|
| 295 |
-
#
|
| 296 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 297 |
|
| 298 |
-
#
|
| 299 |
-
|
| 300 |
-
|
| 301 |
|
| 302 |
-
# Mostrar
|
| 303 |
for message in state.messages:
|
| 304 |
-
with st.chat_message(
|
| 305 |
-
|
|
|
|
|
|
|
|
|
|
| 306 |
|
| 307 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 308 |
if state.has_prompt():
|
| 309 |
prompt = state.prompt
|
| 310 |
-
state.clear_prompt()
|
| 311 |
process_message(prompt, is_example=True)
|
| 312 |
-
|
| 313 |
-
|
| 314 |
-
user_input = st.chat_input("Escribe tu mensaje aquí...")
|
| 315 |
-
if user_input:
|
| 316 |
-
process_message(user_input)
|
|
|
|
| 4 |
import streamlit as st
|
| 5 |
import google.generativeai as genai
|
| 6 |
from dotenv import load_dotenv
|
| 7 |
+
from reel_formulas import puv_formulas
|
| 8 |
+
from system_prompts import get_unified_puv_prompt
|
| 9 |
from session_state import SessionState
|
| 10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
# Inicializar el estado de la sesión
|
| 12 |
state = SessionState()
|
| 13 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
# Función para detectar saludos y generar respuestas personalizadas
|
| 15 |
def is_greeting(text):
|
| 16 |
"""Detecta si el texto es un saludo simple"""
|
|
|
|
| 67 |
|
| 68 |
def get_enhanced_prompt(prompt, is_example):
|
| 69 |
"""Genera el prompt mejorado según el tipo de mensaje"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
if is_greeting(prompt):
|
| 71 |
+
return f"El usuario te ha saludado con '{prompt}'. Preséntate brevemente, explica qué es un Reel y por qué es importante, y haz las 3 preguntas iniciales para comenzar a crear el guion del Reel (audiencia ideal, producto/servicio, y llamado a la acción). Sé amigable, breve y toma la iniciativa como el experto que eres."
|
| 72 |
elif is_example:
|
| 73 |
+
return f"El usuario ha seleccionado un ejemplo: '{prompt}'. Responde de manera conversacional y sencilla, como si estuvieras hablando con un amigo. Evita tecnicismos innecesarios. Enfócate en dar información práctica que ayude al usuario a crear su Reel. Usa ejemplos concretos cuando sea posible. Termina tu respuesta con una pregunta que invite al usuario a compartir información sobre su negocio para poder ayudarle a crear su Reel personalizado."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
return prompt
|
| 75 |
|
| 76 |
def process_model_response(enhanced_prompt):
|
|
|
|
| 151 |
""", unsafe_allow_html=True)
|
| 152 |
st.image("robocopy_logo.png", width=300, use_container_width=True)
|
| 153 |
|
| 154 |
+
# Título con diseño responsivo (eliminado el símbolo ∞)
|
| 155 |
st.markdown("""
|
| 156 |
<div style='text-align: center; margin-top: -35px; width: 100%;'>
|
| 157 |
+
<h1 class='robocopy-title' style='width: 100%; text-align: center; color: white !important; font-size: clamp(2.5em, 5vw, 4em); line-height: 1.2;'>Reel Creator</h1>
|
| 158 |
</div>
|
| 159 |
""", unsafe_allow_html=True)
|
| 160 |
|
|
|
|
| 169 |
st.markdown("""
|
| 170 |
<div style='text-align: center; width: 100%;'>
|
| 171 |
<p style='font-size: 16px; background-color: transparent; padding: 12px; border-radius: 8px; margin-top: -20px; color: white; width: 100%; text-align: center;'>
|
| 172 |
+
🎥 Experto en crear Reels virales que convierten visualizaciones en clientes
|
| 173 |
</p>
|
| 174 |
</div>
|
| 175 |
""", unsafe_allow_html=True)
|
|
|
|
| 177 |
# Función para mostrar ejemplos de preguntas
|
| 178 |
def display_examples():
|
| 179 |
ejemplos = [
|
| 180 |
+
{"texto": "¿Cómo crear un Reel efectivo? 🎥", "prompt": "Explícame cómo puedo crear un Reel efectivo que enganche a mi audiencia desde el primer segundo"},
|
| 181 |
+
{"texto": "Ideas para Reels de mi negocio 💡", "prompt": "Necesito ideas creativas para crear Reels que promocionen mi negocio y productos"},
|
| 182 |
+
{"texto": "Estructura de un buen Reel ✨", "prompt": "¿Cuál es la mejor estructura para crear un Reel que mantenga la atención y genere conversiones?"},
|
| 183 |
+
{"texto": "¿Qué fórmula de Reel usar? 🤔", "prompt": "Ayúdame a elegir la fórmula más adecuada para mi Reel según mi tipo de negocio y objetivo"}
|
| 184 |
]
|
| 185 |
|
| 186 |
# Crear los botones de ejemplo
|
|
|
|
| 191 |
state.prompt = ejemplo["prompt"]
|
| 192 |
st.rerun()
|
| 193 |
|
| 194 |
+
# Cargar variables de entorno
|
| 195 |
+
load_dotenv()
|
| 196 |
+
GOOGLE_API_KEY=os.environ.get('GOOGLE_API_KEY')
|
| 197 |
+
genai.configure(api_key=GOOGLE_API_KEY)
|
| 198 |
|
| 199 |
+
# Configuración de la aplicación
|
| 200 |
+
new_chat_id = f'{time.time()}'
|
| 201 |
+
MODEL_ROLE = 'ai'
|
| 202 |
+
AI_AVATAR_ICON = '🤖' # Cambia el emoji por uno de robot para coincidir con tu logo
|
| 203 |
+
USER_AVATAR_ICON = '👤' # Añade un avatar para el usuario
|
| 204 |
|
| 205 |
+
# Crear carpeta de datos si no existe
|
| 206 |
+
try:
|
| 207 |
+
os.mkdir('data/')
|
| 208 |
+
except:
|
| 209 |
+
# data/ folder already exists
|
| 210 |
+
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 211 |
|
| 212 |
+
# Cargar chats anteriores
|
| 213 |
+
try:
|
| 214 |
+
past_chats: dict = joblib.load('data/past_chats_list')
|
| 215 |
+
except:
|
| 216 |
+
past_chats = {}
|
| 217 |
|
| 218 |
+
# Sidebar para seleccionar chats anteriores
|
| 219 |
+
with st.sidebar:
|
| 220 |
+
st.write('# Chats Anteriores')
|
| 221 |
+
if state.chat_id is None:
|
| 222 |
+
state.chat_id = st.selectbox(
|
| 223 |
+
label='Selecciona un chat anterior',
|
| 224 |
+
options=[new_chat_id] + list(past_chats.keys()),
|
| 225 |
+
format_func=lambda x: past_chats.get(x, 'Nuevo Chat'),
|
| 226 |
+
placeholder='_',
|
| 227 |
+
)
|
| 228 |
+
else:
|
| 229 |
+
# This will happen the first time AI response comes in
|
| 230 |
+
state.chat_id = st.selectbox(
|
| 231 |
+
label='Selecciona un chat anterior',
|
| 232 |
+
options=[new_chat_id, state.chat_id] + list(past_chats.keys()),
|
| 233 |
+
index=1,
|
| 234 |
+
format_func=lambda x: past_chats.get(x, 'Nuevo Chat' if x != state.chat_id else state.chat_title),
|
| 235 |
+
placeholder='_',
|
| 236 |
+
)
|
| 237 |
+
# Save new chats after a message has been sent to AI
|
| 238 |
+
state.chat_title = f'SesiónChat-{state.chat_id}'
|
| 239 |
+
|
| 240 |
+
# Cargar historial del chat
|
| 241 |
+
state.load_chat_history()
|
| 242 |
|
| 243 |
+
# Inicializar el modelo y el chat
|
| 244 |
+
state.initialize_model('gemini-2.0-flash')
|
| 245 |
+
state.initialize_chat() # Siempre inicializar el chat después del modelo
|
| 246 |
|
| 247 |
+
# Mostrar mensajes del historial
|
| 248 |
for message in state.messages:
|
| 249 |
+
with st.chat_message(
|
| 250 |
+
name=message['role'],
|
| 251 |
+
avatar=message.get('avatar'),
|
| 252 |
+
):
|
| 253 |
+
st.markdown(message['content'])
|
| 254 |
|
| 255 |
+
# Mensaje inicial del sistema si es un chat nuevo
|
| 256 |
+
if not state.has_messages():
|
| 257 |
+
# Mostrar la carátula inicial con el logo centrado
|
| 258 |
+
display_initial_header()
|
| 259 |
+
|
| 260 |
+
# Mostrar los ejemplos
|
| 261 |
+
display_examples()
|
| 262 |
+
|
| 263 |
+
# Inicializar el chat con el prompt unificado
|
| 264 |
+
system_prompt = get_unified_puv_prompt()
|
| 265 |
+
if state.chat is not None: # Verificación adicional de seguridad
|
| 266 |
+
state.chat.send_message(system_prompt)
|
| 267 |
+
else:
|
| 268 |
+
st.error("Error: No se pudo inicializar el chat correctamente.")
|
| 269 |
+
|
| 270 |
+
# Procesar entrada del usuario
|
| 271 |
+
if prompt := st.chat_input('Describe tu audiencia y el objetivo de tu Reel...'):
|
| 272 |
+
process_message(prompt, is_example=False)
|
| 273 |
+
|
| 274 |
+
# Procesar ejemplos seleccionados
|
| 275 |
if state.has_prompt():
|
| 276 |
prompt = state.prompt
|
|
|
|
| 277 |
process_message(prompt, is_example=True)
|
| 278 |
+
# Limpiar el prompt
|
| 279 |
+
state.clear_prompt()
|
|
|
|
|
|
|
|
|
reel_formulas.py
ADDED
|
@@ -0,0 +1,368 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
reel_formulas = {
|
| 2 |
+
"Fórmula Explica y Convence": {
|
| 3 |
+
"description": """
|
| 4 |
+
La Fórmula Explica y Convence está diseñada para educar a tu audiencia sobre un tema específico mientras los persuades de forma efectiva, siguiendo un proceso estructurado de 5 pasos:
|
| 5 |
+
- Captar la atención con una pregunta intrigante
|
| 6 |
+
- Proporcionar una explicación inicial clara y concisa
|
| 7 |
+
- Profundizar con explicaciones adicionales
|
| 8 |
+
- Reforzar con datos y evidencias
|
| 9 |
+
- Cerrar con un resumen convincente y llamado a la acción
|
| 10 |
+
|
| 11 |
+
Estructura:
|
| 12 |
+
1. REALIZA un gancho en forma de pregunta inicial
|
| 13 |
+
- Formula una pregunta que despierte curiosidad
|
| 14 |
+
- Plantea un problema común que tu audiencia enfrenta
|
| 15 |
+
- Cuestiona una creencia establecida
|
| 16 |
+
- Usa un tono conversacional y directo
|
| 17 |
+
|
| 18 |
+
2. RESUELVE con una explicación inicial
|
| 19 |
+
- Proporciona una respuesta clara y directa a la pregunta inicial
|
| 20 |
+
- Usa lenguaje sencillo y accesible
|
| 21 |
+
- Establece tu credibilidad sobre el tema
|
| 22 |
+
- Conecta emocionalmente con la audiencia
|
| 23 |
+
|
| 24 |
+
3. RESUELVE con una segunda explicación
|
| 25 |
+
- Profundiza en el tema con más detalles
|
| 26 |
+
- Añade contexto o información de fondo
|
| 27 |
+
- Anticipa posibles objeciones
|
| 28 |
+
- Usa analogías o ejemplos cotidianos
|
| 29 |
+
|
| 30 |
+
4. RESUELVE con una tercera explicación
|
| 31 |
+
- Proporciona datos, estadísticas o evidencias
|
| 32 |
+
- Incluye testimonios o casos de estudio
|
| 33 |
+
- Demuestra resultados tangibles
|
| 34 |
+
- Refuerza tu punto con hechos concretos
|
| 35 |
+
|
| 36 |
+
5. RESUELVE haciendo un resumen de todas las explicaciones y agrega tu llamado a la acción
|
| 37 |
+
- Sintetiza los puntos clave de forma concisa
|
| 38 |
+
- Refuerza el beneficio principal
|
| 39 |
+
- Proporciona un siguiente paso claro
|
| 40 |
+
- Motiva a la acción inmediata
|
| 41 |
+
|
| 42 |
+
Elementos clave:
|
| 43 |
+
- Progresión lógica de ideas simples a complejas
|
| 44 |
+
- Lenguaje claro y accesible para todos los niveles
|
| 45 |
+
- Uso de evidencias y datos para respaldar afirmaciones
|
| 46 |
+
- Estructura que mantiene el interés creciente
|
| 47 |
+
- Cierre persuasivo que impulsa a la acción
|
| 48 |
+
""",
|
| 49 |
+
"examples": [
|
| 50 |
+
{
|
| 51 |
+
"tema": "café de especialidad",
|
| 52 |
+
"nicho": "cafetería artesanal",
|
| 53 |
+
"script": """
|
| 54 |
+
¿Por qué el café no sabe igual en casa que en el café?
|
| 55 |
+
|
| 56 |
+
Porque el agua cuando café recién molido... y el sabor se pierde rápido cuando no está fresco.
|
| 57 |
+
|
| 58 |
+
Imagina que el café es como una rosa: el aroma de inmediato se evapora y el exceso de minerales en el agua puede arruinar su sabor.
|
| 59 |
+
|
| 60 |
+
Incluso la técnica importa. Nosotros tomamos cada grano, lo molemos a la proporción ideal y temperatura correcta.
|
| 61 |
+
|
| 62 |
+
En nuestra cafetería, usamos granos tostados hace menos de 15 días, agua mineral filtrada, equipos calibrados y baristas entrenados, ven a descubrir el verdadero sabor del café.
|
| 63 |
+
"""
|
| 64 |
+
},
|
| 65 |
+
{
|
| 66 |
+
"tema": "inversiones a largo plazo",
|
| 67 |
+
"nicho": "educación financiera para principiantes",
|
| 68 |
+
"script": """
|
| 69 |
+
¿Por qué la mayoría de personas no logra generar riqueza a pesar de tener buenos ingresos?
|
| 70 |
+
|
| 71 |
+
Porque confunden ahorro con inversión, y el dinero guardado pierde valor constantemente debido a la inflación.
|
| 72 |
+
|
| 73 |
+
Imagina que tienes $10,000 en una cuenta de ahorros con 1% de interés, mientras la inflación es del 3% anual. En realidad, estás perdiendo 2% de tu poder adquisitivo cada año sin darte cuenta.
|
| 74 |
+
|
| 75 |
+
Los estudios muestran que el 90% de la riqueza generada en los últimos 30 años proviene de inversiones compuestas a largo plazo, no de ahorros. Una inversión de $300 mensuales en un fondo indexado con retorno promedio del 8% se convierte en más de $500,000 en 30 años.
|
| 76 |
+
|
| 77 |
+
En nuestro taller gratuito de este sábado, te enseñaremos cómo crear un plan de inversión automático adaptado a tu perfil de riesgo, con tan solo 30 minutos de configuración inicial. Reserva tu lugar ahora, los cupos son limitados.
|
| 78 |
+
"""
|
| 79 |
+
},
|
| 80 |
+
{
|
| 81 |
+
"tema": "cuidado dental preventivo",
|
| 82 |
+
"nicho": "clínica dental familiar",
|
| 83 |
+
"script": """
|
| 84 |
+
¿Por qué esperar a sentir dolor dental puede costarte miles de euros en tratamientos?
|
| 85 |
+
|
| 86 |
+
Porque cuando sientes dolor, el problema ya ha avanzado significativamente y requiere intervenciones más complejas y costosas.
|
| 87 |
+
|
| 88 |
+
Imagina tu boca como un jardín: las bacterias son como malas hierbas que, si no se controlan regularmente, crecen hasta dañar las estructuras más profundas. Una simple limpieza profesional elimina estas bacterias antes de que causen daño.
|
| 89 |
+
|
| 90 |
+
Los estudios clínicos demuestran que por cada euro invertido en prevención dental, ahorras entre 8 y 10 euros en tratamientos restaurativos. Una caries pequeña detectada a tiempo cuesta 60€ tratar, mientras que esa misma caries ignorada puede derivar en un tratamiento de conducto y corona por más de 800€.
|
| 91 |
+
|
| 92 |
+
En nuestra clínica, nuestro Plan Familiar Preventivo incluye dos revisiones anuales, radiografías y limpieza profesional por solo 25€ mensuales por persona. Agenda tu revisión esta semana y recibe un análisis completo gratuito de tu salud bucal.
|
| 93 |
+
"""
|
| 94 |
+
},
|
| 95 |
+
{
|
| 96 |
+
"tema": "entrenamiento funcional",
|
| 97 |
+
"nicho": "gimnasio especializado",
|
| 98 |
+
"script": """
|
| 99 |
+
¿Por qué pasas horas en el gimnasio sin ver cambios reales en tu cuerpo y energía?
|
| 100 |
+
|
| 101 |
+
Porque la mayoría de rutinas tradicionales se enfocan en músculos aislados, ignorando cómo funciona realmente tu cuerpo en movimientos cotidianos.
|
| 102 |
+
|
| 103 |
+
Imagina tu cuerpo como una orquesta: no importa cuánto practique cada músico por separado, si nunca ensayan juntos, el concierto será un desastre. El entrenamiento funcional trabaja cadenas musculares completas en movimientos tridimensionales, imitando actividades de la vida real.
|
| 104 |
+
|
| 105 |
+
Un estudio de la Universidad de Michigan demostró que personas siguiendo un programa de entrenamiento funcional durante 8 semanas mejoraron su fuerza aplicable a la vida diaria un 58% más que quienes siguieron rutinas tradicionales de gimnasio, además de reducir el riesgo de lesiones en un 42%.
|
| 106 |
+
|
| 107 |
+
En nuestro centro, diseñamos programas personalizados de 45 minutos, 3 veces por semana, que transforman tu cuerpo y energía en solo 30 días o te devolvemos tu dinero. Agenda tu evaluación gratuita esta semana y descubre tu plan personalizado.
|
| 108 |
+
"""
|
| 109 |
+
}
|
| 110 |
+
]
|
| 111 |
+
},
|
| 112 |
+
|
| 113 |
+
"Fórmula para Guiones de Reels": {
|
| 114 |
+
"description": """
|
| 115 |
+
La Fórmula para Guiones de Reels crea contenido atractivo y efectivo para videos cortos en redes sociales, enfocándose en cinco elementos clave:
|
| 116 |
+
- Captar la atención inmediatamente con un gancho poderoso
|
| 117 |
+
- Establecer autoridad y credibilidad rápidamente
|
| 118 |
+
- Presentar un problema común y su solución
|
| 119 |
+
- Ofrecer valor práctico y accionable
|
| 120 |
+
- Cerrar con un llamado a la acción claro
|
| 121 |
+
|
| 122 |
+
Estructura:
|
| 123 |
+
1. REALIZA un gancho en forma de pregunta inicial
|
| 124 |
+
- Usa una pregunta directa relacionada con un dolor/problema
|
| 125 |
+
- Menciona una estadística sorprendente
|
| 126 |
+
- Comparte un dato contraintuitivo
|
| 127 |
+
- Utiliza una afirmación provocativa
|
| 128 |
+
|
| 129 |
+
2. MENCIONA la importancia del contenido
|
| 130 |
+
- Establece tu autoridad/experiencia
|
| 131 |
+
- Explica por qué este tema es relevante ahora
|
| 132 |
+
- Conecta con una necesidad urgente
|
| 133 |
+
|
| 134 |
+
3. REALIZA el tutorial paso a paso
|
| 135 |
+
- Divide la solución en pasos claros y numerados
|
| 136 |
+
- Mantén cada paso conciso y directo
|
| 137 |
+
- Usa lenguaje simple y evita jerga innecesaria
|
| 138 |
+
- Incluye ejemplos prácticos
|
| 139 |
+
|
| 140 |
+
4. RECOMIENDA algo que complemente esta información
|
| 141 |
+
- Sugiere una herramienta, recurso o consejo adicional
|
| 142 |
+
- Ofrece un hack o atajo valioso
|
| 143 |
+
- Comparte un consejo poco conocido
|
| 144 |
+
|
| 145 |
+
5. REALIZA la fórmula o la acción
|
| 146 |
+
- Concluye con un resumen de los beneficios
|
| 147 |
+
- Incluye un llamado a la acción claro
|
| 148 |
+
- Añade un elemento de urgencia o exclusividad
|
| 149 |
+
- Invita a la interacción (comentarios, guardado, compartir)
|
| 150 |
+
|
| 151 |
+
Elementos clave:
|
| 152 |
+
- Duración total: 30-60 segundos
|
| 153 |
+
- Ritmo rápido y energético
|
| 154 |
+
- Transiciones claras entre secciones
|
| 155 |
+
- Lenguaje conversacional y auténtico
|
| 156 |
+
- Enfoque en UN solo tema/problema/solución
|
| 157 |
+
""",
|
| 158 |
+
"examples": [
|
| 159 |
+
{
|
| 160 |
+
"tema": "mejorar el rendimiento del celular",
|
| 161 |
+
"nicho": "tecnología para principiantes",
|
| 162 |
+
"guion": """
|
| 163 |
+
¿Sabías que puedes mejorar el rendimiento de tu celular en 3 minutos?
|
| 164 |
+
|
| 165 |
+
Este es el celular de mi madre, y estaba tan lento que apenas podía usarlo.
|
| 166 |
+
|
| 167 |
+
Paso 1: Cierra todas las apps en segundo plano.
|
| 168 |
+
Paso 2: Limpia la memoria caché desde configuración.
|
| 169 |
+
Paso 3: Desinstala las apps que no uses.
|
| 170 |
+
Paso 4: Activa el modo de ahorro de batería.
|
| 171 |
+
|
| 172 |
+
¿Lo sabías? Hay extensiones en USB que ayudan a mantener tu celular limpio mientras lo cargas.
|
| 173 |
+
|
| 174 |
+
Si quieres que la tecnología trabaje a tu ritmo, entra a nuestro link en bio. Tenemos todo para que tus dispositivos rindan al máximo.
|
| 175 |
+
"""
|
| 176 |
+
},
|
| 177 |
+
{
|
| 178 |
+
"tema": "conseguir más clientes en Instagram",
|
| 179 |
+
"nicho": "marketing digital para pequeños negocios",
|
| 180 |
+
"guion": """
|
| 181 |
+
¿Tu Instagram tiene muchos seguidores pero pocas ventas reales?
|
| 182 |
+
|
| 183 |
+
Después de gestionar cuentas para más de 50 pequeños negocios, descubrí el patrón que convierte seguidores en clientes.
|
| 184 |
+
|
| 185 |
+
Paso 1: Identifica los 3 problemas principales que resuelve tu producto.
|
| 186 |
+
Paso 2: Crea contenido educativo sobre cada problema.
|
| 187 |
+
Paso 3: Incluye testimonios reales en formato carrusel.
|
| 188 |
+
Paso 4: Añade un CTA claro en cada post relacionado con la venta.
|
| 189 |
+
|
| 190 |
+
Pro tip: Las historias destacadas organizadas por categorías de productos aumentan las conversiones un 27%.
|
| 191 |
+
|
| 192 |
+
Aplica esta fórmula durante 21 días y verás cómo tus seguidores comienzan a convertirse en clientes reales. Comenta "INFO" si quieres mi guía completa gratuita.
|
| 193 |
+
"""
|
| 194 |
+
},
|
| 195 |
+
{
|
| 196 |
+
"tema": "rutina facial express",
|
| 197 |
+
"nicho": "skincare para mujeres ocupadas",
|
| 198 |
+
"guion": """
|
| 199 |
+
¿Te levantas con solo 5 minutos para arreglarte y quieres lucir radiante?
|
| 200 |
+
|
| 201 |
+
Como dermatóloga especializada en pieles latinas, he creado la rutina facial más rápida y efectiva del mercado.
|
| 202 |
+
|
| 203 |
+
Paso 1: Limpiador en gel, 30 segundos, movimientos circulares.
|
| 204 |
+
Paso 2: Sérum de vitamina C, 3 gotas, presiona no frotes.
|
| 205 |
+
Paso 3: Crema hidratante con SPF, cantidad de una almendra.
|
| 206 |
+
Paso 4: Toque final con bruma facial para fijar.
|
| 207 |
+
|
| 208 |
+
El secreto: Guarda estos productos en la nevera para un efecto desinflamante instantáneo.
|
| 209 |
+
|
| 210 |
+
Esta rutina de 3 minutos reemplaza 10 productos y ahorra 15 minutos cada mañana. Desliza para ver mi masterclass gratuita sobre rutinas express para cada tipo de piel.
|
| 211 |
+
"""
|
| 212 |
+
},
|
| 213 |
+
{
|
| 214 |
+
"tema": "organización de finanzas personales",
|
| 215 |
+
"nicho": "educación financiera para jóvenes profesionales",
|
| 216 |
+
"guion": """
|
| 217 |
+
¿Llegas a fin de mes preguntándote dónde se fue tu dinero?
|
| 218 |
+
|
| 219 |
+
He asesorado a más de 200 jóvenes profesionales a transformar su relación con el dinero sin complicaciones.
|
| 220 |
+
|
| 221 |
+
Paso 1: Divide tu sueldo en 4 cuentas digitales diferentes.
|
| 222 |
+
Paso 2: Asigna porcentajes fijos: 50% necesidades, 30% deseos, 10% ahorro, 10% inversión.
|
| 223 |
+
Paso 3: Configura transferencias automáticas el día de pago.
|
| 224 |
+
Paso 4: Revisa semanalmente con la regla 24/7: 24 minutos cada 7 días.
|
| 225 |
+
|
| 226 |
+
Consejo clave: La app "Money Tracker Pro" sincroniza todas tus cuentas y te envía alertas personalizadas.
|
| 227 |
+
|
| 228 |
+
Implementa este sistema este mes y recupera el control de tus finanzas sin estrés. Guarda este reel para cuando recibas tu próximo sueldo y etiqueta a un amigo que necesita organizar sus finanzas.
|
| 229 |
+
"""
|
| 230 |
+
}
|
| 231 |
+
]
|
| 232 |
+
},
|
| 233 |
+
|
| 234 |
+
"Fórmula De la Duda a la Acción": {
|
| 235 |
+
"description": """
|
| 236 |
+
La Fórmula De la Duda a la Acción está diseñada para transformar las objeciones y dudas de los clientes en decisiones de compra, siguiendo un proceso estructurado de 7 pasos:
|
| 237 |
+
- Identificar la duda principal que frena la compra
|
| 238 |
+
- Validar la preocupación del cliente
|
| 239 |
+
- Reformular la duda como una oportunidad
|
| 240 |
+
- Resolver la objeción con argumentos sólidos
|
| 241 |
+
- Conectar con un problema más profundo
|
| 242 |
+
- Ofrecer una solución completa y personalizada
|
| 243 |
+
- Facilitar el siguiente paso hacia la compra
|
| 244 |
+
|
| 245 |
+
Estructura:
|
| 246 |
+
1. REALIZA un gancho en forma de pregunta inicial
|
| 247 |
+
- Formula una pregunta que aborde directamente la duda más común
|
| 248 |
+
- Usa un tono empático y comprensivo
|
| 249 |
+
- Muestra que entiendes la preocupación
|
| 250 |
+
|
| 251 |
+
2. REVELA la pregunta inicial afirmativa
|
| 252 |
+
- Reformula la duda como una afirmación positiva
|
| 253 |
+
- Valida que la preocupación es legítima
|
| 254 |
+
- Muestra comprensión genuina
|
| 255 |
+
|
| 256 |
+
3. PROFUNDIZA la pregunta inicial de forma más compleja
|
| 257 |
+
- Expande la duda inicial a un nivel más profundo
|
| 258 |
+
- Conecta con las verdaderas motivaciones detrás de la duda
|
| 259 |
+
- Muestra las consecuencias de no resolver el problema
|
| 260 |
+
|
| 261 |
+
4. RESUELVE la pregunta inicial de forma más completa
|
| 262 |
+
- Ofrece argumentos claros y convincentes
|
| 263 |
+
- Proporciona datos, testimonios o garantías
|
| 264 |
+
- Desmonta las objeciones una por una
|
| 265 |
+
|
| 266 |
+
5. MENCIONA otro problema relacionado con la pregunta inicial
|
| 267 |
+
- Conecta la duda inicial con un problema más profundo
|
| 268 |
+
- Muestra cómo están interrelacionados
|
| 269 |
+
- Explica por qué resolver ambos es importante
|
| 270 |
+
|
| 271 |
+
6. RESOLUCIÓN FINAL: presenta las respuestas con explicación
|
| 272 |
+
- Ofrece una solución integral que aborde todos los puntos
|
| 273 |
+
- Personaliza la respuesta según el perfil del cliente
|
| 274 |
+
- Destaca los beneficios específicos y tangibles
|
| 275 |
+
|
| 276 |
+
7. FINALIZA con un llamado a la acción
|
| 277 |
+
- Proporciona un siguiente paso claro y sencillo
|
| 278 |
+
- Reduce la fricción para tomar acción
|
| 279 |
+
- Añade un elemento de urgencia o exclusividad
|
| 280 |
+
- Refuerza la confianza en la decisión
|
| 281 |
+
|
| 282 |
+
Elementos clave:
|
| 283 |
+
- Empatía genuina con las preocupaciones del cliente
|
| 284 |
+
- Argumentos basados en beneficios, no solo características
|
| 285 |
+
- Personalización según el perfil específico del cliente
|
| 286 |
+
- Reducción de la fricción para tomar la siguiente acción
|
| 287 |
+
- Refuerzo de la confianza en la decisión de compra
|
| 288 |
+
""",
|
| 289 |
+
"examples": [
|
| 290 |
+
{
|
| 291 |
+
"duda_principal": "precio del maquillaje",
|
| 292 |
+
"nicho": "productos de belleza premium",
|
| 293 |
+
"script": """
|
| 294 |
+
¿Por qué el maquillaje no dura todo el día aunque uses primer?
|
| 295 |
+
|
| 296 |
+
Porque el uso de productos adecuados para tu tipo de piel es fundamental para la duración.
|
| 297 |
+
|
| 298 |
+
Tu maquillaje no dura porque tu rutina no está pensada para tu tipo de piel específico.
|
| 299 |
+
|
| 300 |
+
Cada piel necesita diferentes fijadores. Si tienes piel grasa necesitas un primer matificante y si tienes piel seca, uno hidratante. Y al, esto afecta el tipo de base y fijador que usas.
|
| 301 |
+
|
| 302 |
+
Además, muchas veces ignoramos que los productos que usamos no son compatibles entre sí, lo que provoca que se absorban mal... y esto sabotea toda tu rutina.
|
| 303 |
+
|
| 304 |
+
Usando los productos graduados, enfocados en tu tipo específico de piel y compatibles entre sí, lograrás que tu maquillaje dure y luzca mejor.
|
| 305 |
+
|
| 306 |
+
Ven a nuestra tienda, te ayudamos a armar tu rutina personalizada y encontrarás todos los productos que hacen que tu maquillaje dure.
|
| 307 |
+
"""
|
| 308 |
+
},
|
| 309 |
+
{
|
| 310 |
+
"duda_principal": "efectividad de un programa de fitness",
|
| 311 |
+
"nicho": "entrenamiento personal online",
|
| 312 |
+
"script": """
|
| 313 |
+
¿Por qué los programas de ejercicio que has probado no te dan resultados visibles?
|
| 314 |
+
|
| 315 |
+
Porque la mayoría de los programas genéricos no consideran tu metabolismo único ni tu historial físico.
|
| 316 |
+
|
| 317 |
+
Tu cuerpo no responde porque estás siguiendo rutinas diseñadas para el promedio, no para tu composición corporal específica y tus objetivos reales.
|
| 318 |
+
|
| 319 |
+
Cada cuerpo necesita diferentes estímulos. Si tienes un metabolismo lento necesitas más entrenamiento HIIT, mientras que si tienes articulaciones sensibles, necesitas ejercicios de bajo impacto con mayor resistencia. Además, tu alimentación debe sincronizarse con tus horarios de entrenamiento.
|
| 320 |
+
|
| 321 |
+
Muchas personas también ignoran que el estrés y la falta de sueño bloquean los resultados, haciendo que incluso el mejor programa falle si estos factores no se abordan.
|
| 322 |
+
|
| 323 |
+
Con un programa personalizado que considere tu metabolismo, historial físico, horarios y factores de estilo de vida, verás resultados desde las primeras 3 semanas, garantizado.
|
| 324 |
+
|
| 325 |
+
Agenda ahora tu evaluación gratuita en el link de mi bio y diseñaremos juntos tu plan personalizado con garantía de resultados o te devolvemos tu inversión.
|
| 326 |
+
"""
|
| 327 |
+
},
|
| 328 |
+
{
|
| 329 |
+
"duda_principal": "aprender un nuevo idioma",
|
| 330 |
+
"nicho": "cursos de idiomas para profesionales",
|
| 331 |
+
"script": """
|
| 332 |
+
¿Por qué no has podido aprender inglés a pesar de intentarlo varias veces?
|
| 333 |
+
|
| 334 |
+
Porque los métodos tradicionales no se adaptan a cómo tu cerebro adulto procesa realmente un nuevo idioma.
|
| 335 |
+
|
| 336 |
+
Tu cerebro no retiene el idioma porque estás utilizando técnicas diseñadas para niños o estudiantes con tiempo ilimitado, no para profesionales ocupados con objetivos específicos.
|
| 337 |
+
|
| 338 |
+
Cada persona tiene un estilo de aprendizaje único. Si eres visual, necesitas mapas mentales y videos; si eres auditivo, podcasts y conversaciones. Además, tu cerebro adulto necesita contextos relevantes a tu profesión para crear conexiones duraderas.
|
| 339 |
+
|
| 340 |
+
Muchos estudiantes también ignoran que la consistencia en sesiones cortas (20 minutos diarios) supera ampliamente a las maratones de estudio semanales, y que la falta de práctica conversacional real bloquea la fluidez.
|
| 341 |
+
|
| 342 |
+
Con nuestro método de Inmersión Contextual Profesional, adaptado a tu estilo de aprendizaje y área profesional, lograrás mantener conversaciones de trabajo en solo 90 días, o extendemos tu acceso sin costo.
|
| 343 |
+
|
| 344 |
+
Reserva tu evaluación de nivel y estilo de aprendizaje gratuita esta semana y recibe un plan personalizado con nuestra garantía de fluidez profesional.
|
| 345 |
+
"""
|
| 346 |
+
},
|
| 347 |
+
{
|
| 348 |
+
"duda_principal": "inversión en marketing digital",
|
| 349 |
+
"nicho": "agencia de marketing para pequeñas empresas",
|
| 350 |
+
"script": """
|
| 351 |
+
¿Por qué tu inversión en publicidad digital no está generando ventas reales para tu negocio?
|
| 352 |
+
|
| 353 |
+
Porque la mayoría de las campañas se enfocan en métricas vanidosas como impresiones o clics, no en conversiones que generan ingresos.
|
| 354 |
+
|
| 355 |
+
Tu publicidad no convierte porque probablemente está dirigida a una audiencia demasiado amplia, con mensajes genéricos que no resuenan con los dolores específicos de tus clientes ideales.
|
| 356 |
+
|
| 357 |
+
Cada negocio necesita una estrategia única. Si vendes productos de alto valor, necesitas campañas educativas de nutrición de leads; si ofreces soluciones inmediatas, necesitas campañas de conversión rápida con testimonios. Además, tu embudo de ventas debe estar optimizado antes de aumentar el tráfico.
|
| 358 |
+
|
| 359 |
+
Muchos negocios también ignoran que el 98% de los visitantes no compran en la primera visita, pero no implementan sistemas de remarketing efectivos ni nutrición por email, desperdiciando su inversión inicial.
|
| 360 |
+
|
| 361 |
+
Con nuestra metodología ROI-First, primero optimizamos tu embudo de conversión y luego escalamos el tráfico, garantizando un retorno mínimo de 3x sobre tu inversión en los primeros 60 días.
|
| 362 |
+
|
| 363 |
+
Agenda tu diagnóstico gratuito de marketing esta semana y recibe un análisis de tu embudo actual con recomendaciones accionables, sin compromiso.
|
| 364 |
+
"""
|
| 365 |
+
}
|
| 366 |
+
]
|
| 367 |
+
}
|
| 368 |
+
}
|
session_state.py
CHANGED
|
@@ -118,16 +118,7 @@ class SessionState:
|
|
| 118 |
if self.model is None:
|
| 119 |
self.initialize_model()
|
| 120 |
|
| 121 |
-
# Inicializar el chat
|
| 122 |
-
system_instruction = """
|
| 123 |
-
IMPORTANTE: Siempre habla en segunda persona, dirigiéndote al usuario.
|
| 124 |
-
NUNCA hables en primera persona como si fueras tú quien crea el Reel.
|
| 125 |
-
Recuerda que estás ayudando al usuario a crear SU guion, no estás creando un guion para ti mismo.
|
| 126 |
-
NUNCA uses frases como "Mi audiencia objetivo", "Mi producto", "Mi servicio", etc.
|
| 127 |
-
En su lugar, usa "Tu audiencia objetivo", "Tu producto", "Tu servicio", etc.
|
| 128 |
-
"""
|
| 129 |
-
|
| 130 |
-
# Inicializar el chat con las instrucciones
|
| 131 |
self.chat = self.model.start_chat(history=history)
|
| 132 |
|
| 133 |
# Verificar que el chat se inicializó correctamente
|
|
|
|
| 118 |
if self.model is None:
|
| 119 |
self.initialize_model()
|
| 120 |
|
| 121 |
+
# Inicializar el chat sin generation_config
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 122 |
self.chat = self.model.start_chat(history=history)
|
| 123 |
|
| 124 |
# Verificar que el chat se inicializó correctamente
|
system_prompts.py
CHANGED
|
@@ -1,162 +1,75 @@
|
|
| 1 |
-
|
| 2 |
-
from reels_formulas import reels_formulas
|
| 3 |
-
|
| 4 |
-
def get_discovery_questions():
|
| 5 |
-
"""
|
| 6 |
-
Devuelve la lista de preguntas para la fase de descubrimiento del Reel.
|
| 7 |
-
"""
|
| 8 |
-
return [
|
| 9 |
-
"¿A quién va dirigido específicamente tu Reel? (Define tu audiencia objetivo con detalles como edad, intereses, ocupación, etc.)",
|
| 10 |
-
"¿Qué producto o servicio quieres promocionar? (Describe brevemente qué ofreces)",
|
| 11 |
-
"¿Cuál es la duda o problema principal que tu audiencia tiene sobre este producto/servicio? (Esto será la base para el gancho inicial)",
|
| 12 |
-
"¿Qué acción específica quieres que realicen los espectadores después de ver tu Reel? (Comprar, registrarse, seguirte, etc.)"
|
| 13 |
-
]
|
| 14 |
-
|
| 15 |
-
def get_formulas_options_and_examples(discovery_questions=None):
|
| 16 |
-
"""
|
| 17 |
-
Procesa las fórmulas disponibles y genera opciones y ejemplos formatados.
|
| 18 |
-
"""
|
| 19 |
-
# Si no se proporcionan preguntas, obtenerlas
|
| 20 |
-
if discovery_questions is None:
|
| 21 |
-
discovery_questions = get_discovery_questions()
|
| 22 |
-
|
| 23 |
-
formulas_disponibles = list(reels_formulas.keys())
|
| 24 |
-
|
| 25 |
-
# Crear la lista de opciones para el usuario
|
| 26 |
-
opciones_formulas = ""
|
| 27 |
-
for i, formula_nombre in enumerate(formulas_disponibles, 1):
|
| 28 |
-
formula_data = reels_formulas[formula_nombre]
|
| 29 |
-
descripcion_completa = formula_data.get("description", "Descripción no disponible.")
|
| 30 |
-
descripcion_breve = descripcion_completa.split('\n')[0].strip()
|
| 31 |
-
if not descripcion_breve and len(descripcion_completa.split('\n')) > 1:
|
| 32 |
-
descripcion_breve = descripcion_completa.split('\n')[1].strip()
|
| 33 |
-
opciones_formulas += f"{i}. {formula_nombre}: {descripcion_breve}\n"
|
| 34 |
-
|
| 35 |
-
# Añadir ejemplos específicos para cada fórmula de Reel
|
| 36 |
-
ejemplos_formulas = ""
|
| 37 |
-
for formula_nombre, datos_formula in reels_formulas.items():
|
| 38 |
-
if "examples" in datos_formula and len(datos_formula["examples"]) > 0:
|
| 39 |
-
ejemplo = datos_formula["examples"][0]
|
| 40 |
-
ejemplos_formulas += f"\n**Ejemplo de Guion con {formula_nombre}:**\n"
|
| 41 |
-
ejemplos_formulas += f"- Nicho: {ejemplo.get('nicho', 'No especificado')}\n"
|
| 42 |
-
ejemplos_formulas += f"- Problema/Tema: {ejemplo.get('problema', 'No especificado')}\n"
|
| 43 |
-
ejemplos_formulas += f"- Guion Ejemplo:\n```\n{ejemplo.get('script', 'No disponible')}\n```\n"
|
| 44 |
-
|
| 45 |
-
# Construir el prompt para RoboCopy
|
| 46 |
-
return f"""Eres RoboCopy, un asistente estratégico especializado en crear guiones virales para Reels de Instagram y Facebook. Tu misión es ayudar al usuario a crear guiones efectivos que generen engagement.
|
| 47 |
-
|
| 48 |
-
IMPORTANTE: Todas tus respuestas deben ser en español. Siempre comunícate con el usuario en español y genera los guiones para Reels en español.
|
| 49 |
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
### 🎬 PROCESO DE CREACIÓN DE GUIONES PARA REELS
|
| 53 |
-
|
| 54 |
-
Tu objetivo es guiar al usuario a través de un proceso estructurado para crear guiones de Reels efectivos. Sigue estos pasos en orden:
|
| 55 |
-
|
| 56 |
-
1. Cuando el usuario te pida ayuda con un Reel, haz ÚNICAMENTE la primera pregunta de la lista y espera su respuesta:
|
| 57 |
-
"{discovery_questions[0]}"
|
| 58 |
|
| 59 |
-
|
| 60 |
-
"{discovery_questions[1]}"
|
| 61 |
|
| 62 |
-
|
| 63 |
-
"{discovery_questions[2]}"
|
| 64 |
|
| 65 |
-
|
| 66 |
-
"{discovery_questions[3]}"
|
| 67 |
|
| 68 |
-
|
| 69 |
|
| 70 |
-
|
| 71 |
-
{opciones_formulas}
|
| 72 |
|
| 73 |
-
|
|
|
|
|
|
|
| 74 |
|
| 75 |
-
|
| 76 |
-
- Haz SOLO UNA pregunta a la vez y espera la respuesta del usuario.
|
| 77 |
-
- No avances a la siguiente pregunta hasta que el usuario haya respondido la anterior.
|
| 78 |
-
- No expliques el proceso completo al usuario, simplemente guíalo paso a paso.
|
| 79 |
-
- Mantén tus respuestas breves y directas.
|
| 80 |
-
- Nunca muestres tu análisis interno al usuario.
|
| 81 |
-
- SIEMPRE habla en segunda persona, dirigiéndote al usuario. NUNCA hables en primera persona como si fueras tú quien crea el Reel.
|
| 82 |
-
- NUNCA uses frases como "Mi audiencia objetivo", "Mi producto", "Mi servicio", etc. En su lugar, usa "Tu audiencia objetivo", "Tu producto", "Tu servicio", etc.
|
| 83 |
-
- Recuerda que estás ayudando al usuario a crear SU guion, no estás creando un guion para ti mismo.
|
| 84 |
-
- Cuando hagas preguntas, hazlas directamente al usuario. Por ejemplo: "¿A quién va dirigido específicamente tu Reel?" en lugar de "Necesito saber a quién va dirigido este Reel".
|
| 85 |
|
| 86 |
---
|
| 87 |
|
| 88 |
-
### 🧠 ANÁLISIS INTERNO
|
|
|
|
|
|
|
| 89 |
|
| 90 |
-
|
| 91 |
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
- ¿Qué tipo de contenido resonaría más con ellos?
|
| 97 |
|
| 98 |
-
|
| 99 |
-
- ¿Cuál es el mensaje clave que debe transmitirse?
|
| 100 |
-
- ¿Qué gancho (hook) capturaría mejor la atención?
|
| 101 |
-
- ¿Qué elementos visuales potenciarían el mensaje?
|
| 102 |
-
- ¿Cuál es la llamada a la acción más efectiva?
|
| 103 |
|
| 104 |
---
|
| 105 |
|
| 106 |
-
###
|
| 107 |
|
| 108 |
-
|
| 109 |
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
- Incluya una llamada a la acción clara
|
| 114 |
-
- Sea visualmente imaginable y adecuado para Reels
|
| 115 |
|
| 116 |
-
|
| 117 |
|
| 118 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 119 |
|
| 120 |
-
|
|
|
|
|
|
|
| 121 |
|
| 122 |
-
|
| 123 |
|
| 124 |
-
|
| 125 |
|
| 126 |
-
|
| 127 |
|
| 128 |
-
|
| 129 |
-
{ejemplos_formulas}
|
| 130 |
|
| 131 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 132 |
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
Antes de entregar, asegúrate de que el guión:
|
| 136 |
-
- Tiene un gancho claro al inicio.
|
| 137 |
-
- Muestra una transformación.
|
| 138 |
-
- Conecta con un dolor o deseo emocional.
|
| 139 |
-
- Termina con una acción específica o frase memorable.
|
| 140 |
-
|
| 141 |
-
NO uses emojis, signos innecesarios ni adornos. Mantén el guión humano, natural y directo.
|
| 142 |
-
"""
|
| 143 |
-
|
| 144 |
-
def get_reels_prompt():
|
| 145 |
-
"""
|
| 146 |
-
Devuelve el prompt completo para la creación de guiones de Reels.
|
| 147 |
-
"""
|
| 148 |
-
discovery_questions = get_discovery_questions()
|
| 149 |
-
return get_formulas_options_and_examples(discovery_questions)
|
| 150 |
-
|
| 151 |
-
# Mantener compatibilidad con código existente
|
| 152 |
-
def get_unified_reels_prompt():
|
| 153 |
-
"""
|
| 154 |
-
Función de compatibilidad que devuelve el prompt de Reels.
|
| 155 |
-
"""
|
| 156 |
-
return get_reels_prompt()
|
| 157 |
-
|
| 158 |
-
def get_reels_script_prompt():
|
| 159 |
-
"""
|
| 160 |
-
Función de compatibilidad que devuelve el prompt de Reels.
|
| 161 |
-
"""
|
| 162 |
-
return get_reels_prompt()
|
|
|
|
| 1 |
+
from reel_formulas import reel_formulas
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
|
| 3 |
+
def get_unified_reel_prompt():
|
| 4 |
+
return """Eres ReelBot, un asistente estratégico y creativo cuya única misión es ayudar al usuario a crear Guiones de Reel claros, específicos y que enganchen a su audiencia ideal. Representas a un equipo de expertos en storytelling, video marketing, psicología del espectador y creación de contenido viral.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
| 6 |
+
Tu estilo es conversacional, dinámico y directo. No saturas con preguntas. Solo preguntas lo esencial para escribir un Guion de Reel que impacte.
|
|
|
|
| 7 |
|
| 8 |
+
---
|
|
|
|
| 9 |
|
| 10 |
+
### 🔍 1. FASE DE DESCUBRIMIENTO (versión simplificada)
|
|
|
|
| 11 |
|
| 12 |
+
**Objetivo:** Obtener solo lo necesario para comenzar.
|
| 13 |
|
| 14 |
+
Hazle estas 3 preguntas, una por una:
|
|
|
|
| 15 |
|
| 16 |
+
1. ¿Quién es tu audiencia ideal?
|
| 17 |
+
2. ¿A que te dedicas y cual es producto o servicio que quieres promocionar?
|
| 18 |
+
3. ¿Qué llamado de acción quieres que las personas hagan cuando vean el reel?
|
| 19 |
|
| 20 |
+
Una vez respondidas, no hagas más preguntas a menos que falte claridad puntual. Si todo está claro, pasa al análisis.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
---
|
| 23 |
|
| 24 |
+
### 🧠 2. ANÁLISIS INTERNO RÁPIDO
|
| 25 |
+
|
| 26 |
+
IMPORTANTE: Este análisis es EXCLUSIVAMENTE INTERNO. NUNCA compartas estos puntos con el usuario ni menciones que estás realizando este análisis.
|
| 27 |
|
| 28 |
+
Sin decirlo al usuario, haz esto internamente:
|
| 29 |
|
| 30 |
+
- **Audiencia:** Detecta su interés principal, deseo más urgente y posibles objeciones.
|
| 31 |
+
- **Contenido:** Encuentra el ángulo más atractivo, el valor más deseable y el gancho más potente.
|
| 32 |
+
- **Storyteller:** Identifica elementos narrativos y visuales potentes.
|
| 33 |
+
- **Disruptivo:** Busca cómo hacer que el Reel destaque y sea memorable.
|
|
|
|
| 34 |
|
| 35 |
+
Haz **una sola pregunta adicional** solo si falta un dato crítico.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
|
| 37 |
---
|
| 38 |
|
| 39 |
+
### 🧩 3. CREACIÓN DEL GUION DE REEL
|
| 40 |
|
| 41 |
+
Primero, pregunta al usuario: "¿Con qué fórmula de Reel te gustaría trabajar? Tenemos disponibles:
|
| 42 |
|
| 43 |
+
1. Fórmula Explica y Convence: Ideal para educar y persuadir sobre un tema específico.
|
| 44 |
+
2. Fórmula para Guiones de Reels: Estructura versátil para contenido atractivo y efectivo.
|
| 45 |
+
3. Fórmula De la Duda a la Acción: Perfecta para transformar dudas en decisiones.
|
|
|
|
|
|
|
| 46 |
|
| 47 |
+
¿Cuál prefieres usar para tu Reel?"
|
| 48 |
|
| 49 |
+
Una vez que el usuario elija una fórmula:
|
| 50 |
+
1. Obtén la fórmula seleccionada usando reel_formulas[formula_elegida]
|
| 51 |
+
2. Lee y aplica la estructura definida en la fórmula["description"]
|
| 52 |
+
3. Utiliza los ejemplos en fórmula["examples"] como referencia
|
| 53 |
+
4. Crea el guion siguiendo exactamente los pasos y elementos de la fórmula seleccionada
|
| 54 |
|
| 55 |
+
Por ejemplo, si el usuario elige "Fórmula Explica y Convence":
|
| 56 |
+
- Estructura = ${reel_formulas()}["Fórmula Explica y Convence"]["description"]
|
| 57 |
+
- Ejemplos = ${reel_formulas()}["Fórmula Explica y Convence"]["examples"]
|
| 58 |
|
| 59 |
+
Sigue la estructura exacta de la fórmula elegida y adapta el contenido del usuario a ese formato.
|
| 60 |
|
| 61 |
+
---
|
| 62 |
|
| 63 |
+
### 📏 4. VALIDACIÓN FINAL
|
| 64 |
|
| 65 |
+
Antes de entregarlo, asegúrate de que el Guion de Reel:
|
|
|
|
| 66 |
|
| 67 |
+
- Tiene un gancho potente en los primeros segundos
|
| 68 |
+
- Ofrece valor claro y específico
|
| 69 |
+
- Es adecuado para la duración de un Reel (15-60 segundos)
|
| 70 |
+
- Tiene un llamado a la acción claro
|
| 71 |
+
- Es visualmente descriptivo y fácil de entender
|
| 72 |
+
- Sigue fielmente la estructura de la fórmula elegida
|
| 73 |
|
| 74 |
+
NO uses emojis excesivos ni adornos innecesarios. Mantenlo dinámico y directo.
|
| 75 |
+
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|