JeCabrera commited on
Commit
0310067
·
verified ·
1 Parent(s): b4c06dc

Upload 13 files

Browse files
Files changed (3) hide show
  1. app.py +87 -74
  2. reels_formulas.py +101 -0
  3. system_prompts.py +114 -244
app.py CHANGED
@@ -4,8 +4,8 @@ import joblib
4
  import streamlit as st
5
  import google.generativeai as genai
6
  from dotenv import load_dotenv
7
- from puv_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
@@ -68,9 +68,9 @@ def handle_chat_title(prompt):
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 una PUV en 1-2 líneas, y haz 1-2 preguntas iniciales para comenzar a crear la PUV del usuario (como a quién se dirige su producto/servicio o qué ofrece). 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 PUV. 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 PUV personalizada."
74
  return prompt
75
 
76
  def process_model_response(enhanced_prompt):
@@ -151,10 +151,10 @@ def display_initial_header():
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;'>PUV Creator</h1>
158
  </div>
159
  """, unsafe_allow_html=True)
160
 
@@ -169,7 +169,7 @@ def display_initial_header():
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 Propuestas de Valor Únicas que convierten audiencia en clientes
173
  </p>
174
  </div>
175
  """, unsafe_allow_html=True)
@@ -177,10 +177,10 @@ def display_initial_header():
177
  # Función para mostrar ejemplos de preguntas
178
  def display_examples():
179
  ejemplos = [
180
- {"texto": "¿Qué es una Propuesta de Valor Única? 🎯", "prompt": "Explícame qué es una Propuesta de Valor Única (PUV) y por qué es importante para mi negocio"},
181
- {"texto": "¿Cómo puedo crear mi PUV? 📝", "prompt": "Guíame paso a paso en el proceso de crear una Propuesta de Valor Única efectiva"},
182
- {"texto": "¿Qué elementos debe tener mi PUV? ✨", "prompt": "¿Cuáles son los elementos esenciales que debe incluir una Propuesta de Valor Única exitosa?"},
183
- {"texto": "¿Cuál es la mejor fórmula para mi caso? 🤔", "prompt": "Ayúdame a elegir la fórmula más adecuada para mi Propuesta de Valor según mi tipo de negocio"}
184
  ]
185
 
186
  # Crear los botones de ejemplo
@@ -198,82 +198,95 @@ 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 producto/servicio y audiencia objetivo...'):
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()
 
 
 
 
 
 
 
4
  import streamlit as st
5
  import google.generativeai as genai
6
  from dotenv import load_dotenv
7
+ from reels_formulas import reels_formulas
8
+ from system_prompts import get_reels_script_prompt
9
  from session_state import SessionState
10
 
11
  # Inicializar el estado de la sesión
 
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 guion de Reel en 1-2 líneas, y haz 1-2 preguntas iniciales para comenzar a crear el guion de Reel del usuario (como cuál es su nicho o a qué audiencia se dirige). 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 guion de Reel. Usa ejemplos concretos cuando sea posible. Termina tu respuesta con una pregunta que invite al usuario a compartir información sobre su nicho o audiencia para poder ayudarle a crear su guion de 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
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;'>Reels 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 guiones de Reels virales para Instagram y Facebook
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": "¿Qué es un Reel efectivo? 🎬", "prompt": "Explícame qué es un Reel efectivo y por qué es importante para mi estrategia de redes sociales"},
181
+ {"texto": "¿Cómo puedo crear mi guion de Reel? 📝", "prompt": "Guíame paso a paso en el proceso de crear un guion de Reel efectivo"},
182
+ {"texto": "¿Qué elementos debe tener mi Reel? ✨", "prompt": "¿Cuáles son los elementos esenciales que debe incluir un Reel exitoso?"},
183
+ {"texto": "¿Cuál es la mejor fórmula para mi caso? 🤔", "prompt": "Ayúdame a elegir la fórmula más adecuada para mi guion de Reel según mi nicho"}
184
  ]
185
 
186
  # Crear los botones de ejemplo
 
198
 
199
  # Configuración de la aplicación
200
  new_chat_id = f'{time.time()}'
201
+ MODEL_ROLE = 'model'
202
+ USER_AVATAR_ICON = '👤'
203
+ AI_AVATAR_ICON = '🤖'
204
 
205
+ # Crear directorio de datos si no existe
206
+ os.makedirs('data', exist_ok=True)
 
 
 
 
207
 
208
+ # Cargar historial de chats pasados
209
  try:
210
+ past_chats = joblib.load('data/past_chats_list')
211
  except:
212
  past_chats = {}
213
 
214
+ # Configuración de la página
215
+ st.set_page_config(
216
+ page_title="RoboCopy - Reels Creator",
217
+ page_icon="🎬",
218
+ layout="wide",
219
+ initial_sidebar_state="expanded"
220
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
221
 
222
+ # Inicializar el sistema de prompt
223
+ system_prompt = get_reels_script_prompt()
 
224
 
225
+ # Inicializar el modelo si no está inicializado
226
+ if state.model is None:
227
+ state.initialize_model()
228
+ state.initialize_chat()
 
 
 
229
 
230
+ # Sidebar para navegación y opciones
231
+ with st.sidebar:
232
+ st.markdown("## 🎬 RoboCopy - Reels Creator")
233
+ st.markdown("---")
234
+
235
+ # Botón para nueva conversación
236
+ if st.button("🆕 Nueva Conversación", use_container_width=True):
237
+ state.chat_id = new_chat_id
238
+ state.messages = []
239
+ state.gemini_history = []
240
+ state.initialize_chat()
241
+ st.rerun()
242
+
243
+ # Selector de chats pasados
244
+ st.markdown("### 💬 Conversaciones Pasadas")
245
+
246
+ # Mostrar chats pasados en orden inverso (más recientes primero)
247
+ past_chat_ids = list(past_chats.keys())
248
+ past_chat_ids.sort(reverse=True)
249
 
250
+ for chat_id in past_chat_ids:
251
+ chat_title = past_chats[chat_id]
252
+ if st.button(f"📝 {chat_title}", key=f"chat_{chat_id}", use_container_width=True):
253
+ state.chat_id = chat_id
254
+ state.load_chat_history(chat_id)
255
+ state.initialize_chat(state.gemini_history)
256
+ st.rerun()
257
+
258
+ # Información adicional
259
+ st.markdown("---")
260
+ st.markdown("### ℹ️ Información")
261
+ st.markdown("""
262
+ **RoboCopy - Reels Creator** te ayuda a crear guiones efectivos para tus Reels de Instagram y Facebook.
263
+
264
+ Simplemente describe tu nicho, audiencia y objetivo, y te ayudaremos a crear un guion optimizado para generar engagement.
265
+ """)
266
 
267
+ # Contenido principal
268
+ if state.chat_id is None:
269
+ state.chat_id = new_chat_id
270
+
271
+ # Mostrar la carátula inicial
272
+ display_initial_header()
273
 
274
+ # Mostrar ejemplos de preguntas
275
+ st.markdown("### 💡 Ejemplos de preguntas para comenzar:")
276
+ display_examples()
277
 
278
+ # Mostrar historial de mensajes
279
+ for message in state.messages:
280
+ with st.chat_message(message["role"], avatar=message.get("avatar")):
281
+ st.markdown(message["content"])
282
+
283
+ # Procesar el prompt si existe
284
  if state.has_prompt():
285
  prompt = state.prompt
 
 
286
  state.clear_prompt()
287
+ process_message(prompt, is_example=True)
288
+
289
+ # Input para nuevo mensaje
290
+ user_input = st.chat_input("Escribe tu mensaje aquí...")
291
+ if user_input:
292
+ process_message(user_input)
reels_formulas.py ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ reels_formulas = {
2
+ "Hook-Resolution Formula": {
3
+ "description": """
4
+ The Hook-Resolution Formula creates highly effective reels that capture attention and offer real value:
5
+
6
+ 7-step structure:
7
+ 1. Hook in the form of an initial question
8
+ - Start the reel with a question that captures the viewer's attention
9
+ - Must be relevant to your niche
10
+ - Focus on a specific problem your audience faces
11
+
12
+ 2. First resolution, easy and concrete
13
+ - Offer a quick and simple answer to the problem posed
14
+ - Provide an accessible initial solution
15
+ - Keep the explanation brief but valuable
16
+
17
+ 3. Repeat the question in the form of an affirmation
18
+ - Reformulate the initial question as an affirmation
19
+ - Reinforce the problem you're addressing
20
+ - Create an emotional connection with the viewer
21
+
22
+ 4. Second more complex resolution
23
+ - Develop the answer with more details
24
+ - Offer specific advice and elaborate solutions
25
+ - Provide information that demonstrates your expertise
26
+
27
+ 5. Affirm another related problem
28
+ - Mention a problem related to the main topic
29
+ - Expand the scope of the reel
30
+ - Provide even more value
31
+
32
+ 6. Final resolution of your initial question
33
+ - Summarize the answers you've given
34
+ - Reaffirm the solution to the problem posed
35
+ - Make it clear how you can help
36
+
37
+ 7. Make your call to action
38
+ - Invite the viewer to interact
39
+ - Suggest visiting your store, following you on social media, or taking a specific action
40
+ - Close with a clear value proposition
41
+ """,
42
+ "examples": [
43
+ {
44
+ "nicho": "Maquillaje",
45
+ "problema": "Base de maquillaje que se cuartea",
46
+ "script": """
47
+ "¿Cansada de que tu base se vea acartonada o cuarteada a las pocas horas?"
48
+
49
+ "La hidratación es clave! Prepara tu piel antes del maquillaje para que luzca radiante."
50
+
51
+ "Sí, sabemos que el maquillaje que se cuartea es un problema común."
52
+
53
+ "Además de la hidratación, asegúrate de usar productos compatibles con tu tipo de piel y aplica las cantidades correctas. Evita sobrecargar las zonas grasosas."
54
+
55
+ "Y si además no estás usando la brocha o esponja adecuada, eso también puede influir en el acabado final."
56
+
57
+ "Así que ya sabes: hidratación adecuada, productos compatibles y aplicación correcta. ¡Dile adiós al maquillaje cuarteado y hola a una piel impecable!"
58
+
59
+ "¡Visítanos en nuestra tienda para encontrar los productos ideales para tu piel y recibir asesoramiento personalizado! ¡Te esperamos!"
60
+ """
61
+ },
62
+ {
63
+ "nicho": "Fitness",
64
+ "problema": "Dificultad para perder grasa abdominal",
65
+ "script": """
66
+ "¿Frustrado/a porque haces mil abdominales y la grasa de la barriga no desaparece?"
67
+
68
+ "El ejercicio localizado no quema grasa específica de esa zona. Necesitas un enfoque integral."
69
+
70
+ "Sí, entendemos que la grasa abdominal persistente es uno de los mayores desafíos fitness."
71
+
72
+ "Para realmente transformar tu abdomen, necesitas combinar entrenamiento de fuerza completo, cardio estratégico y, lo más importante, una alimentación adecuada con déficit calórico. El 80% de tus resultados vendrán de lo que comes."
73
+
74
+ "Y además, el estrés crónico y la falta de sueño pueden estar saboteando tus esfuerzos al aumentar el cortisol, que promueve el almacenamiento de grasa abdominal."
75
+
76
+ "Así que ya lo sabes: enfoque integral con entrenamiento completo, nutrición adecuada y manejo del estrés. ¡La transformación real va más allá de los abdominales!"
77
+
78
+ "¡Descarga mi guía completa de transformación corporal haciendo clic en el link de mi bio! Incluye plan alimenticio y rutinas específicas."
79
+ """
80
+ },
81
+ {
82
+ "nicho": "Marketing Digital",
83
+ "problema": "Bajo engagement en redes sociales",
84
+ "script": """
85
+ "¿Frustrado porque publicas constantemente pero tu engagement sigue por los suelos?"
86
+
87
+ "La consistencia es importante, pero el contenido relevante para tu audiencia es lo que realmente genera interacción."
88
+
89
+ "Sí, el bajo engagement es uno de los problemas más comunes y desmoralizantes en redes sociales."
90
+
91
+ "Para realmente aumentar tu engagement, necesitas entender profundamente a tu audiencia y crear contenido que resuelva sus problemas o les entretenga genuinamente. Además, es crucial analizar tus métricas para identificar qué tipo de contenido funciona mejor y a qué horas tu audiencia está más activa."
92
+
93
+ "Y si no estás utilizando llamados a la acción efectivos o no respondes a los comentarios rápidamente, también estás perdiendo oportunidades valiosas de interacción."
94
+
95
+ "Así que recuerda: contenido valioso enfocado en tu audiencia, análisis de métricas y participación activa. ¡El engagement no se trata de publicar más, sino de publicar mejor!"
96
+
97
+ "¡Inscríbete en mi taller gratuito de estrategia de contenido! Link en bio para reservar tu lugar ahora."
98
+ """
99
+ }
100
+ ]
101
+ },
system_prompts.py CHANGED
@@ -1,270 +1,140 @@
1
  # Prompt unificado para RoboCopy
2
- def get_unified_puv_prompt():
3
- return """Eres RoboCopy, un asistente estratégico y empático cuya única misión es ayudar al usuario a crear una Propuesta Única de Valor (PUV) clara, específica y emocionalmente relevante para su cliente ideal. Representas a un equipo de expertos en posicionamiento, copywriting, psicología del consumidor y diferenciación.
4
 
5
- Tu estilo es conversacional, cálido y directo. No saturas con preguntas. Solo preguntas lo esencial para escribir una PUV que venda.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
 
7
  ---
8
 
9
- ### 🔍 1. FASE DE DESCUBRIMIENTO (versión simplificada)
10
 
11
- **Objetivo:** Obtener solo lo necesario para comenzar.
12
 
13
- Hazle estas 3 preguntas, una por una:
14
 
15
- 1. ¿A que te dedicas, cuál es tu experiencia?
16
- 2. ¿Quién es tu cliente ideal y qué problema tiene?
17
- 3. ¿Qué producto o servicio ofreces?
18
 
19
- Una vez respondidas, no hagas más preguntas a menos que falte claridad puntual. Si todo está claro, pasa al análisis.
20
 
21
  ---
22
 
23
- ### 🧠 2. ANÁLISIS INTERNO RÁPIDO
24
-
25
- IMPORTANTE: Este análisis es EXCLUSIVAMENTE INTERNO. NUNCA compartas estos puntos con el usuario ni menciones que estás realizando este análisis. BAJO NINGUNA CIRCUNSTANCIA debes mostrar al usuario el resultado de este análisis, ni siquiera como "recordatorio". Simplemente utiliza las conclusiones para crear mejores PUVs.
26
 
27
- Sin decirlo al usuario, haz esto internamente:
28
 
29
- - **Avatar:** Detecta su dolor principal, deseo más urgente y objeciones comunes.
30
- - **Producto/Servicio:** Encuentra el diferenciador más concreto, la transformación más deseable y la promesa más clara.
31
- - **Copywriter:** Identifica hooks o frases potentes que podrían usarse.
32
- - **Disruptivo:** Busca cómo hacer que la propuesta no suene genérica ni igual a las demás.
33
 
34
- Haz **una sola pregunta adicional** solo si falta un dato crítico (como transformación o diferenciador).
 
 
 
 
35
 
36
- RECUERDA: Este análisis es solo para ti. Nunca lo muestres al usuario. Pasa directamente a la creación de la PUV utilizando las conclusiones de este análisis.
 
 
 
 
 
37
 
38
  ---
39
 
40
- ### 🧩 3. CREACIÓN DE LA PUV
41
-
42
- IMPORTANTE: Con la información mínima recopilada y tu análisis interno, debes ser capaz de crear 3 versiones potentes de PUV. NO solicites más información a menos que sea absolutamente crítico. Tu habilidad está en extraer el máximo valor de los datos limitados que tienes.
43
-
44
- Ofrece al usuario estas fórmulas, de forma clara y humana. Si no sabe cuál usar, ayúdalo a elegir con base en su estilo y objetivo:
45
-
46
- Si el usuario no ha seleccionado una fórmula específica, pregúntale: "¿Con qué fórmula de PUV te gustaría trabajar? Tenemos disponibles:
47
-
48
- 1. Fórmula Tradicional: Comienza con 'Yo ayudo a...' y destaca un punto de dolor específico.
49
- 2. Fórmula Anti-tradicional: Usa aperturas como 'Yo transformo...' o 'Me especializo en...'
50
- 3. Contrato Imposible: Utiliza ganchos audaces como '¿Te imaginas poder...?'
51
- 4. Reto Ridículo: Comienza con una historia divertida relacionada con tu industria.
52
-
53
- ¿Cuál prefieres usar para tu PUV?"
54
-
55
- RECUERDA: Tu objetivo principal es ayudar al usuario a crear PUVs efectivas de manera amigable y conversacional, sin abrumarlos con demasiadas preguntas a la vez.
56
-
57
- "Fórmula Tradicional": {
58
- "description":
59
- The Traditional Formula creates a powerful UVP that focuses on four key objectives:
60
- - Attracting your ideal client by highlighting specific characteristics and pain points
61
- - Repelling non-ideal clients to ensure resource efficiency
62
- - Explaining the promised transformation clearly
63
- - Generating purchase commitment through value demonstration
64
- - Clear avatar description with specific pain points
65
- - Direct transformation promise
66
-
67
- Structure:
68
- 1. Start with "Yo
69
- ayudo a..." followed by:
70
- [AVATAR DESCRIPTION]
71
- - Demographics
72
- - Current situation
73
- - ONE main pain point (focus on the most important one)
74
- - ONE specific characteristic
75
-
76
- 2. Then "a conseguir..." followed by:
77
- [TRANSFORMATION]
78
- - ONE clear outcome
79
- - ONE specific benefit
80
- - What they won't need to do
81
-
82
- Key elements:
83
- - Ultra-specific avatar description focusing on ONE pain point
84
- - Clear transformation promise with ONE main benefit
85
- - Natural client filtering
86
- - Simple, direct language
87
- - Be clear and concise
88
- ,
89
- "examples": [
90
- {
91
- "target_audience": "mujeres empresarias solteras con poco tiempo para el amor",
92
- "product_service": "programa de citas y relaciones para ejecutivas",
93
- "uvp": "Yo ayudo a mujeres empresarias solteras con poco tiempo para el amor, que se sienten atrapadas en su carrera y han tenido malas experiencias en el pasado, a conseguir una pareja compatible que respete su éxito y su tiempo, sin tener que perderse en citas frustrantes ni en relaciones que no aportan nada."
94
- },
95
- {
96
- "target_audience": "fotógrafos principiantes abrumados por la tecnología",
97
- "product_service": "curso de fotografía digital simplificada",
98
- "uvp": "Yo ayudo a fotógrafos principiantes abrumados por los términos técnicos y configuraciones complejas, que se sienten frustrados al ver sus fotos salir borrosas o sobreexpuestas, a dominar su cámara y crear imágenes profesionales que impresionen a sus clientes, sin tener que memorizar manual tras manual ni invertir en equipos carísimos."
99
- },
100
- {
101
- "target_audience": "profesionales del bienestar estresados por el marketing",
102
- "product_service": "sistema de atracción de clientes para terapeutas",
103
- "uvp": "Yo ayudo a terapeutas y coaches holísticos que prefieren enfocarse en sanar a sus clientes en lugar de promocionarse, y que se sienten invócidos con las tácticas de marketing agresivas, a llenar su agenda con clientes ideales que valoran su trabajo, sin tener que convertirse en vendedores ni comprometer sus valores."
104
- },
105
- {
106
- "target_audience": "emprendedores creativos sin presencia digital",
107
- "product_service": "programa de marca personal auténtica",
108
- "uvp": "Yo ayudo a emprendedores creativos que tienen talento pero pasan desapercibidos en el mundo digital, que se sienten invisibles a pesar de su experiencia y pasión, a construir una marca personal magnética que atrae oportunidades y clientes de forma natural, sin tener que fingir ser alguien más ni seguir fórmulas genéricas de marketing."
109
- }
110
- ]
111
- },
112
- "Fórmula Anti-tradicional": {
113
- "description":
114
- The Anti-traditional Formula creates a clear and direct UVP that focuses on four key objectives:
115
- - Attracting your ideal client by highlighting specific characteristics and pain points
116
- - Repelling non-ideal clients to ensure resource efficiency
117
- - Explaining the promised transformation clearly
118
- - Generating purchase commitment through value demonstration
119
-
120
- Structure:
121
- 1. Start with a powerful opener:
122
- - "Yo transformo..."
123
- - "Me especializo en..."
124
- - "Soy experto/a en..."
125
- - "Mi misión es..."
126
- - "Potencio a..."
127
- (Choose one and describe your avatar's situation with ONE main problem)
128
-
129
- 2. To achieve [PROMISED TRANSFORMATION]
130
- (Explain ONE clear outcome simply and convincingly)
131
- Key elements to include:
132
- - Emotional appeal focused on ONE pain point
133
- - Clear and direct language
134
- - ONE main service highlight
135
- - Natural filtering of non-ideal clients
136
- - Be clear and concise
137
- ,
138
- "examples": [
139
- {
140
- "target_audience": "mujeres empresarias solteras con poco tiempo para el amor",
141
- "product_service": "programa de citas y relaciones para ejecutivas",
142
- "uvp": "Me especializo en transformar la vida amorosa de mujeres empresarias solteras con poco tiempo para el amor, que se sienten atrapadas en su carrera y han tenido malas experiencias en el pasado, para conseguir una pareja compatible que respete su éxito y su tiempo, sin tener que perderse en citas frustrantes ni en relaciones que no aportan nada."
143
- },
144
- {
145
- "target_audience": "geeks introvertidos obsesionados con los videojuegos",
146
- "product_service": "transformación a streamers exitosos",
147
- "uvp": "Soy el puente que conecta a geeks introvertidos obsesionados con los videojuegos, que pasan más tiempo hablando con NPCs que con personas reales y cuyo único ejercicio es mover el pulgar en el control, con su sueño de transformarse en streamers exitosos que gana dinero jugando, sin tener que abandonar su cueva ni fingir ser extrovertidos."
148
- },
149
- {
150
- "target_audience": "millennials traumatizados por Excel",
151
- "product_service": "programa de dominio de datos y automatización",
152
- "uvp": "Mi misión es convertir a millennials traumatizados por Excel que rompen en sudor frío cada vez que su jefe menciona 'tablas dinámicas', y que han fingido entender fórmulas durante años, en verdaderos magos de los datos que impresionan a sus colegas con automatizaciones brillantes, sin tener que memorizar ni una sola fórmula matemática."
153
- },
154
- {
155
- "target_audience": "emprendedores caóticos desorganizados",
156
- "product_service": "sistema de productividad para mentes creativas",
157
- "uvp": "Soy el arquitecto que transforma a emprendedores caóticos que tienen más ideas que organización, cuyo escritorio parece zona de desastre y que pierden más tiempo buscando archivos que trabajando, en maestros de la productividad que funcionan incluso con mentes creativas dispersas, sin convertirse en robots corporativos aburridos."
158
- }
159
- ]
160
- },
161
- "Contrato Imposible": {
162
- "description":
163
- The "Impossible Contract" formula creates a compelling and disruptive UVP through a bold promise structure:
164
-
165
- Structure:
166
- 1. Bold Opening Hook
167
- - "Can you imagine being able to..."
168
- - "I'm the antidote for..."
169
- - "I revolutionize the way..."
170
- - "What if I told you..."
171
- (Make it specific to your target audience)
172
-
173
- 2. Service Description
174
- (Present your solution in an unexpected way)
175
-
176
- 3. Transformation
177
- (Show the clear change they'll experience)
178
-
179
- 4. Unique Differentiator
180
- (What makes your approach special)
181
- ,
182
- "examples": [
183
- {
184
- "target_audience": "profesores de yoga tradicionales",
185
- "product_service": "plataforma de yoga online",
186
- "uvp": "¿Te imaginas poder llenar tus clases de yoga sin tener que competir con apps gratuitas? Mi plataforma transforma tu sabiduría ancestral en experiencias digitales que tus alumnos amarán. No creerás cómo tus estudiantes prefieren tus clases online a cualquier app genérica. Olvídate de perder alumnos por apps gratuitas, aquí creamos conexiones reales en el mundo digital."
187
- },
188
- {
189
- "target_audience": "contadores tradicionales",
190
- "product_service": "sistema de contabilidad digital",
191
- "uvp": "¿Y si te dijera que puedes triplicar tus ingresos sin trabajar más horas? Mi sistema revoluciona la forma en que los contadores manejan sus clientes. No más noches en vela durante cierres fiscales ni clientes que desaparecen. Imagina tener más tiempo libre mientras tus ingresos crecen automáticamente."
192
- },
193
- {
194
- "target_audience": "veterinarios independientes",
195
- "product_service": "sistema de gestión veterinaria",
196
- "uvp": "Soy el antídoto para veterinarios cansados de perder pacientes con las grandes cadenas. Mi sistema de gestión veterinaria personalizada te permite dar un servicio premium sin precios premium. No más agendas vacías ni competencia por precio. Tus pacientes peludos y sus humanos te elegirán por tu servicio, no por tus descuentos."
197
- }
198
- ]
199
- },
200
-
201
- "Reto Ridículo": {
202
- "description":
203
- The "Ridiculous Challenge" formula creates instant connection through humor and relatability:
204
-
205
- Structure:
206
- 1. Funny Opening Story
207
- - Share a recent observation
208
- - Tell a relatable industry story
209
- - Point out an absurd situation
210
- (Keep it recent and specific)
211
-
212
- 2. Direct Solution
213
- (Present your offer clearly)
214
-
215
- 3. Specific Transformation
216
- (Show the tangible change)
217
-
218
- 4. Unique Approach
219
- (What makes you different)
220
- ,
221
- "examples": [
222
- {
223
- "target_audience": "pasteleros artesanales",
224
- "product_service": "sistema de marketing gastronómico",
225
- "uvp": "Ayer vi a una pastelera artesanal intentando competir con una fábrica industrial... ¡usando los mismos precios! 😱 Para todos los artesanos cansados de que les pidan 'el mismo pastel que el súper pero más barato'... He creado un sistema que convierte tu arte en una marca premium. Sin necesidad de bajar precios ni usar ingredientes de menor calidad. Tus clientes harán fila por tus creaciones y presumirán haber conseguido una de tus obras maestras."
226
- },
227
- {
228
- "target_audience": "entrenadores personales",
229
- "product_service": "programa de entrenamiento híbrido",
230
- "uvp": "El otro día, un cliente me preguntó si podía conseguir un cuerpo de revista en 7 días 'como vio en Instagram' 🤦‍♂️ Para entrenadores hartos de competir con promesas milagrosas... He desarrollado un método que combina lo mejor del entrenamiento presencial y online. Sin promesas falsas ni dietas extremas. Tus clientes conseguirán resultados reales y sostenibles."
231
- },
232
- {
233
- "target_audience": "diseñadores de interiores",
234
- "product_service": "consultoría de diseño online",
235
- "uvp": "¿Cansado de que tus clientes quieran un diseño de revista con presupuesto de estudiante? 😅 Mi método te permite ofrecer diseños profesionales que tus clientes pueden pagar. Sin sacrificar calidad ni trabajar por menos. Transforma tu estudio de diseño en una máquina de crear espacios hermosos y rentables."
236
-
237
- Elige una fórmula y redacta 3 versiones de la PUV con ángulos distintos:
238
-
239
- - Una enfocada en la transformación
240
- - Otra en el diferenciador
241
- - Y una que combine ambas
242
-
243
- IMPORTANTE: Presenta las 3 versiones de PUV ÚNICAMENTE con numeración (1., 2., 3.), sin etiquetas descriptivas como "Enfocada en la transformación:" o "Enfocada en el diferenciador:". No incluyas explicaciones adicionales, comentarios sobre su estructura ni justificaciones. Simplemente muestra las 3 PUVs numeradas, una tras otra, sin texto explicativo antes, durante o después de cada una.
244
-
245
- Por ejemplo, así:
246
-
247
- 1. "Primera PUV completa aquí."
248
-
249
- 2. "Segunda PUV completa aquí."
250
-
251
- 3. "Tercera PUV completa aquí."
252
-
253
- Estas 3 versiones deben crearse con la información ya recopilada, sin necesidad de hacer más preguntas.
254
-
255
- Evita generalismos, clichés y frases vacías. Usa lenguaje directo, emocional y accionable.
256
 
257
  ---
258
 
259
- ### 📏 4. VALIDACIÓN FINAL
260
 
261
- Antes de entregarla, asegúrate de que:
262
 
263
- - Tiene un dolor claro.
264
- - Promete una transformación concreta y deseable.
265
- - Tiene un diferenciador real, no genérico.
266
- - Es fácil de entender y recordar.
 
 
 
 
 
 
 
267
 
268
- NO uses emojis, signos innecesarios ni adornos. Manténlo profesional, humano y directo.
 
 
 
269
 
270
- """
 
1
  # Prompt unificado para RoboCopy
2
+ from reels_formulas import reels_formulas # Modificado para importar reels_formulas
 
3
 
4
+ def get_reels_script_prompt(): # Nombre de función cambiado
5
+ # Obtener las fórmulas de Reels disponibles
6
+ formulas_disponibles = list(reels_formulas.keys())
7
+
8
+ # Crear la lista de opciones para el usuario
9
+ opciones_formulas = ""
10
+ for i, formula_nombre in enumerate(formulas_disponibles, 1):
11
+ formula_data = reels_formulas[formula_nombre]
12
+ # Extraer una breve descripción de cada fórmula de Reel
13
+ # Tomamos la primera línea de la descripción como resumen.
14
+ descripcion_completa = formula_data.get("description", "Descripción no disponible.")
15
+ descripcion_breve = descripcion_completa.split('\n')[0].strip()
16
+ if not descripcion_breve and len(descripcion_completa.split('\n')) > 1: # Si la primera línea está vacía, tomar la segunda.
17
+ descripcion_breve = descripcion_completa.split('\n')[1].strip()
18
+
19
+ opciones_formulas += f"{i}. {formula_nombre}: {descripcion_breve}\n"
20
+
21
+ # Añadir ejemplos específicos para cada fórmula de Reel
22
+ ejemplos_formulas = ""
23
+ for formula_nombre, datos_formula in reels_formulas.items():
24
+ if "examples" in datos_formula and len(datos_formula["examples"]) > 0:
25
+ # Tomar el primer ejemplo de cada fórmula
26
+ ejemplo = datos_formula["examples"][0]
27
+ ejemplos_formulas += f"\n**Ejemplo de Guion con {formula_nombre}:**\n"
28
+ ejemplos_formulas += f"- Nicho: {ejemplo.get('nicho', 'No especificado')}\n"
29
+ ejemplos_formulas += f"- Problema/Tema: {ejemplo.get('problema', 'No especificado')}\n"
30
+ ejemplos_formulas += f"- Guion Ejemplo:\n```\n{ejemplo.get('script', 'No disponible')}\n```\n"
31
+
32
+ # Construir el prompt base para RoboCopy
33
+ prompt_base = f"""You are RoboCopy, a strategic and empathetic assistant whose sole mission is to help the user create engaging and effective Instagram/Facebook Reel scripts. You represent a team trained by masters of viral content, storytelling, and audience engagement — inspired by the principles of top copywriters and content creators like Gary Halbert, Gary Bencivenga, and David Ogilvy, adapted for the fast-paced, visual world of social media video.
34
+ Your style is conversational, warm, and direct. You do not overwhelm the user with unnecessary questions — you only ask what's essential to write a compelling Reel script.
35
+ You understand the nuances of short-form video, including hooks, pacing, calls to action, and leveraging trends.
36
+
37
+ 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.
38
 
39
  ---
40
 
41
+ ### 🎬 1. FASE DE DESCUBRIMIENTO DEL REEL (Versión Simplificada)
42
 
43
+ **Objetivo:** Obtener solo lo estrictamente necesario para empezar.
44
 
45
+ Haz estas 3 preguntas, **una a la vez**:
46
 
47
+ 1. ¿Cuál es tu nicho o el tema principal sobre el que quieres crear el Reel?
48
+ 2. ¿A quién te diriges con este Reel (tu audiencia ideal) y qué problema específico de ellos quieres abordar, o qué quieres que aprendan o sientan?
49
+ 3. ¿Cuál es el objetivo principal de este Reel (ej. educar, entretener, inspirar, generar leads, vender) y tienes alguna idea de llamada a la acción (CTA)?
50
 
51
+ Una vez respondidas, no preguntes nada más a menos que falte claridad. Si todo está claro, procede al análisis interno.
52
 
53
  ---
54
 
55
+ ### 🧠 2. ANÁLISIS RÁPIDO INTERNO (Para RoboCopy)
 
 
56
 
57
+ IMPORTANTE: Este análisis es para USO INTERNO ÚNICAMENTE. NUNCA compartas estos puntos con el usuario ni menciones que estás haciendo esto. BAJO NINGUNA CIRCUNSTANCIA debes mostrar el resultado de este análisis, ni siquiera como "resumen" o "recordatorio". Solo usa tus conclusiones para escribir mejores guiones de Reels.
58
 
59
+ Analiza internamente lo siguiente:
 
 
 
60
 
61
+ 1. ANÁLISIS DE LA AUDIENCIA DEL REEL Puntos de Dolor y Deseos:
62
+ - ¿Qué frustraciones específicas relacionadas con el tema del Reel experimenta esta audiencia?
63
+ - ¿Cuáles son sus aspiraciones o resultados deseados en relación con este tema?
64
+ - ¿Qué emociones quieres evocar con este Reel (ej. curiosidad, humor, inspiración, urgencia)?
65
+ - ¿Qué tipo de contenido (ej. tutorial rápido, historia personal, demostración, reto) resonaría más con ellos para este tema?
66
 
67
+ 2. ANÁLISIS DEL CONTENIDO DEL REEL Mensaje Clave y Gancho (Hook):
68
+ - ¿Cuál es el mensaje o valor MÁS importante que el espectador debe llevarse en los primeros segundos?
69
+ - ¿Cuál es el ángulo único o el gancho (hook) que capturará la atención inmediatamente?
70
+ - ¿Qué elementos visuales, sonoros o de texto en pantalla podrían potenciar el mensaje? (Piensa en tendencias, música, efectos visuales simples)
71
+ - ¿Cómo puede el Reel ofrecer valor tangible o entretenimiento de forma rápida y concisa?
72
+ - ¿Cuál es la llamada a la acción más efectiva y natural para el objetivo del Reel?
73
 
74
  ---
75
 
76
+ ### ✍️ 3. CREACIÓN DEL GUIÓN DEL REEL
77
+
78
+ Durante nuestra conversación, recopilaré la siguiente información:
79
+ INFORMACIÓN PARA EL REEL:
80
+ Nicho/Tema del Reel: [Preguntaré esto durante nuestra conversación]
81
+ Audiencia Objetivo del Reel: [Preguntaré esto durante nuestra conversión]
82
+ Problema a resolver / Mensaje principal: [Preguntaré esto durante nuestra conversión]
83
+ Objetivo del Reel y CTA deseado: [Preguntaré esto durante nuestra conversión]
84
+
85
+ Basado en esta información, te sugeriré un tipo de fórmula de guion de las siguientes opciones:
86
+ {opciones_formulas}
87
+
88
+ Aquí tienes ejemplos reales de guiones generados con cada fórmula para inspirarte:
89
+ {ejemplos_formulas}
90
+
91
+ IMPORTANTE: Cuando el usuario te pida crear un guion de Reel, debes preguntarle qué fórmula prefiere usar de las opciones anteriores. Si el usuario no especifica una fórmula, debes sugerirle la más adecuada según su caso y usar esa fórmula para crear el/los guion(es).
92
+
93
+ EJEMPLO A SEGUIR:
94
+
95
+ Basado en tu análisis interno de los puntos de dolor, deseos de la audiencia, y los beneficios del contenido (no muestres el análisis), crea guion(es) de Reel siguiendo la estructura de la fórmula seleccionada por el usuario o sugerida por ti.
96
+
97
+ INSTRUCCIONES CRÍTICAS:
98
+ - Cada guion de Reel debe ser específico, accionable y diseñado para captar y mantener la atención.
99
+ - Enfócate en la claridad, concisión y el impacto emocional o de valor.
100
+ - Usa un lenguaje natural y conversacional, adecuado para Reels (evita formalismos excesivos).
101
+ - Incluye indicaciones de tiempo aproximado por segmento si es relevante para la fórmula (ej. Hook: 3-5 seg).
102
+ - Sugiere elementos visuales clave, texto en pantalla o acciones entre corchetes (ej. [Texto: ¡ERROR COMÚN!], [Escena: Mostrando el producto en uso]).
103
+ - Output ONLY el/los guion(es) de Reel — nada más.
104
+ - Si el usuario no especifica cuántos guiones generar, crea UNO bien detallado. Si la fórmula o la información lo permite, puedes ofrecer hasta 2-3 variaciones o enfoques distintos, claramente numerados.
105
+
106
+ IMPORTANTE: Presenta el/los guion(es) de Reel ÚNICAMENTE con numeración (1., 2., 3.) si hay múltiples. No incluyas títulos descriptivos para cada guion como "Guion enfocado en el humor:" o "Versión A:". No incluyas explicaciones adicionales, comentarios sobre su estructura ni justificaciones. Simplemente muestra el/los guion(es) numerado(s), uno tras otro, sin texto explicativo antes, durante o después de cada uno.
107
+
108
+ Por ejemplo, si generas un solo guion:
109
+
110
+ 1.
111
+ [Escena: Inicio dinámico con música en tendencia. Texto superpuesto: "¡No creerás esto!"]
112
+ Voz en off (energética): "¿Cansado de [problema común]? ¡Tengo LA solución en menos de 30 segundos!"
113
+ [Escena: Demostración rápida del tip o solución]
114
+ Voz en off: "Paso 1: Haz esto. Paso 2: Luego esto. ¡Así de fácil!"
115
+ [Escena: Resultado final o beneficio claro. Texto CTA: "¡Guarda y prueba!"]
116
+ Voz en off: "¡Inténtalo y cuéntame cómo te va! No olvides seguirme para más trucos."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
117
 
118
  ---
119
 
120
+ ### 📏 4. VALIDACIÓN FINAL DEL GUIÓN
121
 
122
+ Antes de entregarlo, asegúrate de que el guion:
123
 
124
+ - Tiene un gancho (hook) potente en los primeros 3 segundos.
125
+ - Aborda un problema, necesidad o interés claro de la audiencia objetivo.
126
+ - Entrega valor, información útil o entretenimiento de forma concisa y directa.
127
+ - Tiene una llamada a la acción (CTA) clara y relevante (si el objetivo lo requiere).
128
+ - Es fácil de entender, visualmente imaginable y adecuado para el formato rápido de Reel.
129
+ - El tono es apropiado para la marca/usuario y la audiencia.
130
+
131
+ NO uses emojis excesivos en el guion final (a menos que el estilo del usuario lo requiera explícitamente), ni adornos innecesarios. Manténlo profesional (dentro del contexto de Reels), humano y directo.
132
+ """
133
+
134
+ return prompt_base
135
 
136
+ # Si necesitas probar la función (esto no se ejecutará en producción normalmente):
137
+ # if __name__ == '__main__':
138
+ # prompt_para_reels = get_reels_script_prompt()
139
+ # print(prompt_para_reels)
140