JeCabrera commited on
Commit
657617d
verified
1 Parent(s): fa342d1

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +231 -48
app.py CHANGED
@@ -105,53 +105,142 @@ for message in st.session_state.messages:
105
  ):
106
  st.markdown(message['content'])
107
 
108
- # React to user input
109
- if prompt := st.chat_input('驴En qu茅 puedo ayudarte hoy?'): # Mensaje m谩s amigable
110
- # Save this as a chat for later
111
- if st.session_state.chat_id not in past_chats.keys():
112
- # Es una nueva conversaci贸n, generemos un t铆tulo basado en el primer mensaje
113
- # Primero, guardamos un t铆tulo temporal
114
- temp_title = f'Sesi贸nChat-{st.session_state.chat_id}'
115
- past_chats[st.session_state.chat_id] = temp_title
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
 
117
- # Generamos un t铆tulo basado en el contenido del mensaje
118
- try:
119
- # Usamos el mismo modelo para generar un t铆tulo corto
120
- title_generator = genai.GenerativeModel('gemini-2.0-flash')
121
- title_response = title_generator.generate_content(
122
- f"Genera un t铆tulo corto (m谩ximo 5 palabras) que describa de qu茅 trata esta consulta, sin usar comillas ni puntuaci贸n: '{prompt}'")
123
-
124
- # Obtenemos el t铆tulo generado
125
- generated_title = title_response.text.strip()
126
-
127
- # Actualizamos el t铆tulo en past_chats
128
- if generated_title:
129
- st.session_state.chat_title = generated_title
130
- past_chats[st.session_state.chat_id] = generated_title
131
- else:
132
- st.session_state.chat_title = temp_title
133
- except Exception as e:
134
- print(f"Error al generar t铆tulo: {e}")
135
- st.session_state.chat_title = temp_title
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
  else:
137
- # Ya existe esta conversaci贸n, usamos el t铆tulo guardado
138
  st.session_state.chat_title = past_chats[st.session_state.chat_id]
139
 
140
  joblib.dump(past_chats, 'data/past_chats_list')
141
 
142
- # Display user message in chat message container
143
- with st.chat_message('user', avatar=USER_AVATAR_ICON): # A帽ade el avatar del usuario
144
- st.markdown(prompt)
145
- # Add user message to chat history
146
- st.session_state.messages.append(
147
- dict(
148
- role='user',
149
- content=prompt,
150
- )
151
- )
152
- ## Send message to AI
153
  response = st.session_state.chat.send_message(
154
- prompt,
155
  stream=True,
156
  )
157
  # Display assistant response in chat message container
@@ -191,11 +280,105 @@ if prompt := st.chat_input('驴En qu茅 puedo ayudarte hoy?'): # Mensaje m谩s ami
191
  )
192
  st.session_state.gemini_history = st.session_state.chat.history
193
  # Save to file
194
- joblib.dump(
195
- st.session_state.messages,
196
- f'data/{st.session_state.chat_id}-st_messages',
197
- )
198
- joblib.dump(
199
- st.session_state.gemini_history,
200
- f'data/{st.session_state.chat_id}-gemini_messages',
201
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  ):
106
  st.markdown(message['content'])
107
 
108
+ # Inicializar variables de estado
109
+ if 'show_examples' not in st.session_state:
110
+ st.session_state.show_examples = True
111
+ if 'selected_persona' not in st.session_state:
112
+ st.session_state.selected_persona = "estratega"
113
+
114
+ # Funci贸n para seleccionar persona
115
+ def select_puv_persona():
116
+ st.sidebar.write("## 馃 Selecciona un Experto")
117
+
118
+ # Inicializar la selecci贸n de persona si no existe
119
+ if 'selected_persona' not in st.session_state:
120
+ st.session_state.selected_persona = "estratega"
121
+
122
+ # Crear botones para cada persona
123
+ cols = st.sidebar.columns(len(PUV_PERSONAS))
124
+ for i, (persona_id, persona) in enumerate(PUV_PERSONAS.items()):
125
+ with cols[i]:
126
+ if st.button(f"{persona['emoji']}\n{persona['nombre']}", key=f"btn_{persona_id}"):
127
+ st.session_state.selected_persona = persona_id
128
+ st.rerun()
129
+
130
+ # Mostrar descripci贸n de la persona seleccionada
131
+ persona_actual = PUV_PERSONAS[st.session_state.selected_persona]
132
+ st.sidebar.markdown(f"**{persona_actual['emoji']} {persona_actual['nombre']}**")
133
+ st.sidebar.markdown(f"_{persona_actual['descripcion']}_")
134
+
135
+ return st.session_state.selected_persona
136
+
137
+ # Funci贸n para modificar el prompt con la personalidad seleccionada
138
+ def apply_persona_to_prompt(prompt, persona_id):
139
+ if persona_id in PUV_PERSONAS:
140
+ persona = PUV_PERSONAS[persona_id]
141
+ return f"{persona['prompt_prefix']}\n\nConsulta original: {prompt}"
142
+ return prompt
143
+
144
+ # Funci贸n para manejar mensajes
145
+ def add_message(role, content, avatar=None):
146
+ message = {
147
+ 'role': role,
148
+ 'content': content
149
+ }
150
+ if avatar:
151
+ message['avatar'] = avatar
152
+ st.session_state.messages.append(message)
153
+ return message
154
+
155
+ # Funci贸n para guardar el estado del chat
156
+ def save_chat_state():
157
+ joblib.dump(
158
+ st.session_state.messages,
159
+ f'data/{st.session_state.chat_id}-st_messages',
160
+ )
161
+ joblib.dump(
162
+ st.session_state.gemini_history,
163
+ f'data/{st.session_state.chat_id}-gemini_messages',
164
+ )
165
+
166
+ # Funci贸n para generar t铆tulo de chat
167
+ def generate_chat_title(prompt):
168
+ temp_title = f'Sesi贸nChat-{st.session_state.chat_id}'
169
+ try:
170
+ title_generator = genai.GenerativeModel('gemini-2.0-flash')
171
+ title_response = title_generator.generate_content(
172
+ f"Genera un t铆tulo corto (m谩ximo 5 palabras) que describa de qu茅 trata esta consulta, sin usar comillas ni puntuaci贸n: '{prompt}'")
173
 
174
+ generated_title = title_response.text.strip()
175
+ if generated_title:
176
+ return generated_title
177
+ except Exception as e:
178
+ print(f"Error al generar t铆tulo: {e}")
179
+ return temp_title
180
+
181
+ # Funci贸n para operaciones con manejo de errores
182
+ def safe_operation(operation, default_value, error_message="Error en operaci贸n"):
183
+ try:
184
+ return operation()
185
+ except Exception as e:
186
+ print(f"{error_message}: {e}")
187
+ return default_value
188
+
189
+ # Definici贸n de perfiles de expertos en PUV
190
+ PUV_PERSONAS = {
191
+ "estratega": {
192
+ "nombre": "Estratega de Marketing",
193
+ "descripcion": "Experto en posicionamiento estrat茅gico y diferenciaci贸n de marca",
194
+ "prompt_prefix": "Como estratega de marketing especializado en posicionamiento de marca, voy a ayudarte a crear una PUV que destaque tu ventaja competitiva. ",
195
+ "emoji": "馃幆"
196
+ },
197
+ "copywriter": {
198
+ "nombre": "Copywriter Persuasivo",
199
+ "descripcion": "Especialista en redacci贸n persuasiva y mensajes de alto impacto",
200
+ "prompt_prefix": "Como copywriter especializado en mensajes persuasivos, voy a ayudarte a crear una PUV que conecte emocionalmente con tu audiencia. ",
201
+ "emoji": "鉁嶏笍"
202
+ },
203
+ "analista": {
204
+ "nombre": "Analista de Mercado",
205
+ "descripcion": "Experto en an谩lisis de mercado y comportamiento del consumidor",
206
+ "prompt_prefix": "Como analista de mercado especializado en comportamiento del consumidor, voy a ayudarte a crear una PUV basada en insights de tu audiencia. ",
207
+ "emoji": "馃搳"
208
+ },
209
+ "innovador": {
210
+ "nombre": "Innovador Disruptivo",
211
+ "descripcion": "Especialista en propuestas innovadoras y disruptivas",
212
+ "prompt_prefix": "Como especialista en innovaci贸n disruptiva, voy a ayudarte a crear una PUV que rompa con los paradigmas de tu industria. ",
213
+ "emoji": "馃挕"
214
+ }
215
+ }
216
+
217
+ # Modificar el procesamiento del prompt
218
+ if prompt := st.chat_input('驴En qu茅 puedo ayudarte hoy con tu Propuesta 脷nica de Valor?'):
219
+ # Guardar el prompt original
220
+ original_prompt = prompt
221
+
222
+ # Aplicar la personalidad seleccionada al prompt
223
+ enhanced_prompt = apply_persona_to_prompt(prompt, st.session_state.selected_persona)
224
+
225
+ # Generar t铆tulo para el chat si es nuevo
226
+ if st.session_state.chat_id not in past_chats.keys():
227
+ st.session_state.chat_title = generate_chat_title(original_prompt)
228
+ past_chats[st.session_state.chat_id] = st.session_state.chat_title
229
  else:
 
230
  st.session_state.chat_title = past_chats[st.session_state.chat_id]
231
 
232
  joblib.dump(past_chats, 'data/past_chats_list')
233
 
234
+ # Mostrar mensaje del usuario (siempre el original)
235
+ with st.chat_message('user', avatar=USER_AVATAR_ICON):
236
+ st.markdown(original_prompt)
237
+
238
+ # A帽adir mensaje a la historia
239
+ add_message('user', original_prompt, USER_AVATAR_ICON)
240
+
241
+ # Enviar el prompt mejorado al modelo
 
 
 
242
  response = st.session_state.chat.send_message(
243
+ enhanced_prompt,
244
  stream=True,
245
  )
246
  # Display assistant response in chat message container
 
280
  )
281
  st.session_state.gemini_history = st.session_state.chat.history
282
  # Save to file
283
+ # Funci贸n para manejar mensajes
284
+ def add_message(role, content, avatar=None):
285
+ message = {
286
+ 'role': role,
287
+ 'content': content
288
+ }
289
+ if avatar:
290
+ message['avatar'] = avatar
291
+ st.session_state.messages.append(message)
292
+ return message
293
+
294
+ # Funci贸n para guardar el estado del chat
295
+ def save_chat_state():
296
+ joblib.dump(
297
+ st.session_state.messages,
298
+ f'data/{st.session_state.chat_id}-st_messages',
299
+ )
300
+ joblib.dump(
301
+ st.session_state.gemini_history,
302
+ f'data/{st.session_state.chat_id}-gemini_messages',
303
+ )
304
+
305
+ # Funci贸n para generar t铆tulo de chat
306
+ def generate_chat_title(prompt):
307
+ temp_title = f'Sesi贸nChat-{st.session_state.chat_id}'
308
+ try:
309
+ title_generator = genai.GenerativeModel('gemini-2.0-flash')
310
+ title_response = title_generator.generate_content(
311
+ f"Genera un t铆tulo corto (m谩ximo 5 palabras) que describa de qu茅 trata esta consulta, sin usar comillas ni puntuaci贸n: '{prompt}'")
312
+
313
+ generated_title = title_response.text.strip()
314
+ if generated_title:
315
+ return generated_title
316
+ except Exception as e:
317
+ print(f"Error al generar t铆tulo: {e}")
318
+ return temp_title
319
+
320
+ # Funci贸n para operaciones con manejo de errores
321
+ def safe_operation(operation, default_value, error_message="Error en operaci贸n"):
322
+ try:
323
+ return operation()
324
+ except Exception as e:
325
+ print(f"{error_message}: {e}")
326
+ return default_value
327
+
328
+ # Definici贸n de perfiles de expertos en PUV
329
+ PUV_PERSONAS = {
330
+ "estratega": {
331
+ "nombre": "Estratega de Marketing",
332
+ "descripcion": "Experto en posicionamiento estrat茅gico y diferenciaci贸n de marca",
333
+ "prompt_prefix": "Como estratega de marketing especializado en posicionamiento de marca, voy a ayudarte a crear una PUV que destaque tu ventaja competitiva. ",
334
+ "emoji": "馃幆"
335
+ },
336
+ "copywriter": {
337
+ "nombre": "Copywriter Persuasivo",
338
+ "descripcion": "Especialista en redacci贸n persuasiva y mensajes de alto impacto",
339
+ "prompt_prefix": "Como copywriter especializado en mensajes persuasivos, voy a ayudarte a crear una PUV que conecte emocionalmente con tu audiencia. ",
340
+ "emoji": "鉁嶏笍"
341
+ },
342
+ "analista": {
343
+ "nombre": "Analista de Mercado",
344
+ "descripcion": "Experto en an谩lisis de mercado y comportamiento del consumidor",
345
+ "prompt_prefix": "Como analista de mercado especializado en comportamiento del consumidor, voy a ayudarte a crear una PUV basada en insights de tu audiencia. ",
346
+ "emoji": "馃搳"
347
+ },
348
+ "innovador": {
349
+ "nombre": "Innovador Disruptivo",
350
+ "descripcion": "Especialista en propuestas innovadoras y disruptivas",
351
+ "prompt_prefix": "Como especialista en innovaci贸n disruptiva, voy a ayudarte a crear una PUV que rompa con los paradigmas de tu industria. ",
352
+ "emoji": "馃挕"
353
+ }
354
+ }
355
+
356
+ # Funci贸n para seleccionar persona
357
+ def select_puv_persona():
358
+ st.sidebar.write("## 馃 Selecciona un Experto")
359
+
360
+ # Inicializar la selecci贸n de persona si no existe
361
+ if 'selected_persona' not in st.session_state:
362
+ st.session_state.selected_persona = "estratega"
363
+
364
+ # Crear botones para cada persona
365
+ cols = st.sidebar.columns(len(PUV_PERSONAS))
366
+ for i, (persona_id, persona) in enumerate(PUV_PERSONAS.items()):
367
+ with cols[i]:
368
+ if st.button(f"{persona['emoji']}\n{persona['nombre']}", key=f"btn_{persona_id}"):
369
+ st.session_state.selected_persona = persona_id
370
+ st.rerun()
371
+
372
+ # Mostrar descripci贸n de la persona seleccionada
373
+ persona_actual = PUV_PERSONAS[st.session_state.selected_persona]
374
+ st.sidebar.markdown(f"**{persona_actual['emoji']} {persona_actual['nombre']}**")
375
+ st.sidebar.markdown(f"_{persona_actual['descripcion']}_")
376
+
377
+ return st.session_state.selected_persona
378
+
379
+ # Funci贸n para modificar el prompt con la personalidad seleccionada
380
+ def apply_persona_to_prompt(prompt, persona_id):
381
+ if persona_id in PUV_PERSONAS:
382
+ persona = PUV_PERSONAS[persona_id]
383
+ return f"{persona['prompt_prefix']}\n\nConsulta original: {prompt}"
384
+ return prompt