Spaces:
Runtime error
Runtime error
Upload app.py
Browse files
app.py
CHANGED
@@ -65,178 +65,6 @@ def get_chat_title(messages):
|
|
65 |
# Inicializar el estado de la sesión
|
66 |
if 'chats_in_memory' not in st.session_state:
|
67 |
st.session_state.chats_in_memory = {}
|
68 |
-
|
69 |
-
if 'current_chat_id' not in st.session_state:
|
70 |
-
st.session_state.current_chat_id = str(time.time())
|
71 |
-
|
72 |
-
if 'messages' not in st.session_state:
|
73 |
-
st.session_state.messages = []
|
74 |
-
|
75 |
-
# Importar el diccionario de fórmulas
|
76 |
-
from puv_formulas import puv_formulas
|
77 |
-
|
78 |
-
# Función para obtener descripciones de fórmulas para el prompt
|
79 |
-
def get_formulas_for_prompt():
|
80 |
-
prompt_text = "FÓRMULAS DE PROPUESTAS ÚNICAS DE VALOR (PUVs):\n\n"
|
81 |
-
|
82 |
-
for key, formula in puv_formulas.items():
|
83 |
-
prompt_text += f"FÓRMULA {key}:\n"
|
84 |
-
prompt_text += f"- Descripción: {formula['description']}\n"
|
85 |
-
prompt_text += "- Ejemplos:\n"
|
86 |
-
|
87 |
-
# Añadir algunos ejemplos (limitados para no hacer el prompt demasiado largo)
|
88 |
-
for i, example in enumerate(formula['examples'][:2]):
|
89 |
-
prompt_text += f" * Ejemplo {i+1}: {example['uvp']}\n"
|
90 |
-
|
91 |
-
prompt_text += "\n"
|
92 |
-
|
93 |
-
return prompt_text
|
94 |
-
|
95 |
-
# Definición del prompt multipersona para el sistema
|
96 |
-
SYSTEM_PROMPT = f"""
|
97 |
-
Eres un equipo colaborativo de expertos de clase mundial trabajando juntos para crear Propuestas Únicas de Valor (PUVs) excepcionales que conviertan a la audiencia en clientes.
|
98 |
-
|
99 |
-
EL EQUIPO DE EXPERTOS:
|
100 |
-
1. ESTRATEGA MAESTRO DE MARKETING:
|
101 |
-
- Experto en marcos de propuestas de valor y estrategias de conversión
|
102 |
-
- Asegura que las PUVs sigan la estructura de fórmula seleccionada con precisión
|
103 |
-
- Se enfoca en la colocación estratégica de elementos clave de conversión
|
104 |
-
|
105 |
-
2. COPYWRITER ELITE DE RESPUESTA DIRECTA:
|
106 |
-
- Crea ganchos, historias y elementos persuasivos convincentes
|
107 |
-
- Elabora propuestas de valor irresistibles que impulsan conversiones
|
108 |
-
- Asegura que el lenguaje resuene con la audiencia objetivo
|
109 |
-
|
110 |
-
3. ESPECIALISTA EN PSICOLOGÍA DE AUDIENCIA:
|
111 |
-
- Experto en comprender las motivaciones y objeciones de la audiencia
|
112 |
-
- Crea contenido que construye conexión genuina y confianza
|
113 |
-
- Identifica y aborda miedos y deseos ocultos
|
114 |
-
|
115 |
-
4. MAESTRO DE DIFERENCIACIÓN:
|
116 |
-
- Crea propuestas únicas que destacan entre la competencia
|
117 |
-
- Desarrolla ejemplos y casos de estudio relacionables
|
118 |
-
- Asegura que las PUVs apoyen la transformación que se ofrece
|
119 |
-
|
120 |
-
5. EXPERTO EN CONVERSIÓN:
|
121 |
-
- Se especializa en crear PUVs que mantengan la atención y generen acción
|
122 |
-
- Crea elementos interactivos y ganchos de engagement
|
123 |
-
- Asegura que las PUVs fluyan naturalmente y mantengan el interés alto
|
124 |
-
|
125 |
-
{get_formulas_for_prompt()}
|
126 |
-
|
127 |
-
INSTRUCCIONES PARA CREAR PUVs:
|
128 |
-
1. Si el usuario no ha proporcionado información sobre su producto/servicio y audiencia objetivo, solicítala de manera amable y directa.
|
129 |
-
|
130 |
-
2. Si el usuario ha proporcionado información sobre su producto/servicio y audiencia objetivo, pero no ha elegido una fórmula específica, pregúntale qué fórmula le gustaría utilizar. Presenta las opciones disponibles:
|
131 |
-
- Fórmula Tradicional
|
132 |
-
- Fórmula Anti-tradicional
|
133 |
-
- Contrato Imposible
|
134 |
-
- Reto Ridículo
|
135 |
-
|
136 |
-
3. Una vez que el usuario haya proporcionado toda la información necesaria (producto/servicio, audiencia objetivo y fórmula elegida), procede a:
|
137 |
-
a. Analizar internamente (sin mostrar este análisis) la información del producto/servicio y la audiencia objetivo
|
138 |
-
b. Identificar internamente el problema principal y el beneficio clave
|
139 |
-
c. Crear propuestas de valor utilizando ÚNICAMENTE la fórmula elegida por el usuario
|
140 |
-
d. Presentar SOLO las PUVs, sin explicaciones adicionales sobre por qué son efectivas
|
141 |
-
|
142 |
-
ANÁLISIS INTERNO DEL PÚBLICO OBJETIVO (NO INCLUIR EN LA RESPUESTA):
|
143 |
-
Para cada solicitud, realiza un análisis interno de los siguientes puntos:
|
144 |
-
|
145 |
-
1. ANÁLISIS DEL PÚBLICO OBJETIVO - Punto de Dolor Principal:
|
146 |
-
- ¿Cuál es la frustración específica más importante de esta audiencia?
|
147 |
-
- ¿Cuál es su mayor desafío diario?
|
148 |
-
|
149 |
-
2. ANÁLISIS DEL PRODUCTO/SERVICIO - Beneficio Principal:
|
150 |
-
- ¿Cuál es el resultado tangible más importante que obtienen los clientes?
|
151 |
-
- ¿Cuál es la transformación específica más valiosa que ofrece?
|
152 |
-
|
153 |
-
INSTRUCCIONES CRÍTICAS PARA TODAS LAS FÓRMULAS:
|
154 |
-
- Cada PUV debe enfocarse en UN SOLO problema/dolor principal
|
155 |
-
- Cada PUV debe ofrecer UNA transformación clara y específica
|
156 |
-
- Usa lenguaje natural y conversacional
|
157 |
-
- Evita frases genéricas y palabras de moda
|
158 |
-
- Sé claro y conciso en cada PUV
|
159 |
-
- NO incluyas explicaciones sobre por qué la PUV es efectiva
|
160 |
-
- SOLO presenta la PUV, nada más
|
161 |
-
|
162 |
-
COMPORTAMIENTO COMO AGENTE:
|
163 |
-
- Al final de CADA respuesta, SIEMPRE pregunta al usuario qué más le gustaría hacer
|
164 |
-
- Ofrece opciones específicas como: mejorar las PUVs, refinarlas, cambiar de fórmula, o crear nuevas para otro producto/servicio
|
165 |
-
- Actúa como un agente proactivo que busca satisfacer al usuario
|
166 |
-
- Muestra entusiasmo por ayudar y ofrece sugerencias concretas para continuar
|
167 |
-
- Mantén un tono conversacional y amigable en todo momento
|
168 |
-
|
169 |
-
IMPORTANTE: Cuando el usuario pregunte por tus funciones o capacidades, responde siempre en primera persona singular (yo hago, yo creo, yo analizo) de forma breve y concisa. No menciones que eres un equipo de expertos, sino un asistente especializado en crear PUVs.
|
170 |
-
"""
|
171 |
-
|
172 |
-
# Mensaje de bienvenida mejorado
|
173 |
-
WELCOME_MESSAGE = """
|
174 |
-
# 🚀 ¡Bienvenido! Soy RoboCopy, tu creador de PUVs 🚀
|
175 |
-
|
176 |
-
Soy un experto en crear **Propuestas Únicas de Valor (PUVs)** que transforman visitantes en clientes.
|
177 |
-
|
178 |
-
## 💼 ¿Qué puedo hacer por ti?
|
179 |
-
|
180 |
-
Creo PUVs persuasivas que:
|
181 |
-
- **Capturan la atención** de tu audiencia ideal
|
182 |
-
- **Comunican claramente** el valor de tu oferta
|
183 |
-
- **Convierten visitantes** en clientes leales
|
184 |
-
|
185 |
-
## 📋 Para ayudarte, necesito conocer:
|
186 |
-
|
187 |
-
1️⃣ **Tu producto o servicio**: ¿Qué ofreces exactamente?
|
188 |
-
2️⃣ **Tu audiencia objetivo**: ¿Quiénes son tus clientes ideales?
|
189 |
-
3️⃣ **Fórmula de PUV**: ¿Qué tipo de fórmula prefieres?
|
190 |
-
4️⃣ **Número de ejemplos**: ¿Cuántos ejemplos te gustaría recibir?
|
191 |
-
|
192 |
-
### Fórmulas disponibles:
|
193 |
-
|
194 |
-
- **Fórmula Tradicional**: Comienza con "Yo ayudo a..." seguido de avatar y transformación
|
195 |
-
- **Fórmula Anti-tradicional**: Usa frases como "Yo transformo...", "Me especializo en..."
|
196 |
-
- **Contrato Imposible**: Usa frases como "¿Te imaginas poder...", "Soy el antídoto para..."
|
197 |
-
- **Reto Ridículo**: Usa anécdotas personales y humor para conectar con la audiencia
|
198 |
-
|
199 |
-
**¡Comencemos!** Comparte los detalles de tu producto/servicio y audiencia objetivo.
|
200 |
-
"""
|
201 |
-
|
202 |
-
# Función para mostrar texto con efecto de escritura
|
203 |
-
def mostrar_con_efecto_escritura(mensaje, velocidad=0.05):
|
204 |
-
# Crear un contenedor principal que ocupe todo el ancho
|
205 |
-
main_container = st.container()
|
206 |
-
|
207 |
-
with main_container:
|
208 |
-
with st.chat_message(name=MODEL_ROLE, avatar=AI_AVATAR_ICON):
|
209 |
-
message_placeholder = st.empty()
|
210 |
-
typing_indicator = st.empty()
|
211 |
-
typing_indicator.markdown("*RoboCopy está escribiendo...*")
|
212 |
-
|
213 |
-
full_response = ''
|
214 |
-
for palabra in mensaje.split(' '):
|
215 |
-
full_response += palabra + ' '
|
216 |
-
time.sleep(velocidad)
|
217 |
-
message_placeholder.markdown(full_response + '▌')
|
218 |
-
|
219 |
-
typing_indicator.empty()
|
220 |
-
message_placeholder.markdown(mensaje)
|
221 |
-
|
222 |
-
return mensaje
|
223 |
-
|
224 |
-
# Create a data/ folder if it doesn't already exist
|
225 |
-
try:
|
226 |
-
os.mkdir('data/')
|
227 |
-
except:
|
228 |
-
# data/ folder already exists
|
229 |
-
pass
|
230 |
-
|
231 |
-
# Load past chats (if available)
|
232 |
-
try:
|
233 |
-
past_chats: dict = joblib.load('data/past_chats_list')
|
234 |
-
except:
|
235 |
-
past_chats = {}
|
236 |
-
|
237 |
-
# Inicializar el estado de sesión
|
238 |
-
if 'chats_in_memory' not in st.session_state:
|
239 |
-
st.session_state.chats_in_memory = {}
|
240 |
|
241 |
if 'current_chat_id' not in st.session_state:
|
242 |
st.session_state.current_chat_id = new_chat_id
|
@@ -244,29 +72,32 @@ if 'current_chat_id' not in st.session_state:
|
|
244 |
if 'chat_title' not in st.session_state:
|
245 |
st.session_state.chat_title = 'Nuevo Chat'
|
246 |
|
|
|
|
|
|
|
|
|
|
|
|
|
247 |
# Sidebar allows a list of past chats
|
248 |
with st.sidebar:
|
249 |
-
# Centrar el logo
|
250 |
col1, col2, col3 = st.columns([1, 2, 1])
|
251 |
with col2:
|
252 |
st.image("assets/robocopy_logo.png", width=300)
|
253 |
|
254 |
st.write('# Chats Anteriores')
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
format_func=lambda x: st.session_state.chats_in_memory.get(x, {}).get('title', 'Nuevo Chat') if isinstance(x, str) else 'Nuevo Chat',
|
268 |
-
placeholder='_',
|
269 |
-
)
|
270 |
|
271 |
# Botón para borrar el historial
|
272 |
if st.button('🗑️ Borrar Historial de Chat Actual'):
|
|
|
65 |
# Inicializar el estado de la sesión
|
66 |
if 'chats_in_memory' not in st.session_state:
|
67 |
st.session_state.chats_in_memory = {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
68 |
|
69 |
if 'current_chat_id' not in st.session_state:
|
70 |
st.session_state.current_chat_id = new_chat_id
|
|
|
72 |
if 'chat_title' not in st.session_state:
|
73 |
st.session_state.chat_title = 'Nuevo Chat'
|
74 |
|
75 |
+
if 'messages' not in st.session_state:
|
76 |
+
st.session_state.messages = []
|
77 |
+
|
78 |
+
if 'show_examples' not in st.session_state:
|
79 |
+
st.session_state.show_examples = True
|
80 |
+
|
81 |
# Sidebar allows a list of past chats
|
82 |
with st.sidebar:
|
83 |
+
# Centrar el logo
|
84 |
col1, col2, col3 = st.columns([1, 2, 1])
|
85 |
with col2:
|
86 |
st.image("assets/robocopy_logo.png", width=300)
|
87 |
|
88 |
st.write('# Chats Anteriores')
|
89 |
+
|
90 |
+
# Simplificar la lógica del selector de chat
|
91 |
+
chat_options = [new_chat_id] + list(st.session_state.chats_in_memory.keys())
|
92 |
+
current_index = chat_options.index(st.session_state.current_chat_id) if st.session_state.current_chat_id in chat_options else 0
|
93 |
+
|
94 |
+
st.session_state.current_chat_id = st.selectbox(
|
95 |
+
label='Selecciona un chat anterior',
|
96 |
+
options=chat_options,
|
97 |
+
index=current_index,
|
98 |
+
format_func=lambda x: st.session_state.chats_in_memory.get(x, {}).get('title', 'Nuevo Chat') if x != new_chat_id else 'Nuevo Chat',
|
99 |
+
key='chat_selector'
|
100 |
+
)
|
|
|
|
|
|
|
101 |
|
102 |
# Botón para borrar el historial
|
103 |
if st.button('🗑️ Borrar Historial de Chat Actual'):
|