Update app.py
Browse files
app.py
CHANGED
@@ -199,34 +199,90 @@ def generate_response(
|
|
199 |
except Exception as e:
|
200 |
return [ChatMessage(role="assistant", content=f"Error: {str(e)}")]
|
201 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
202 |
def actualizar_personajes(pais_seleccionado):
|
203 |
"""Actualiza la galería de personajes según el país seleccionado"""
|
204 |
global current_personajes
|
|
|
|
|
|
|
|
|
205 |
personajes = PERSONAJES_POR_PAIS.get(pais_seleccionado, [])
|
206 |
current_personajes = personajes
|
207 |
|
208 |
if not personajes:
|
209 |
-
return
|
210 |
|
211 |
-
# Crear lista de imágenes para la galería
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
216 |
else:
|
217 |
-
|
218 |
-
|
|
|
219 |
|
220 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
221 |
|
222 |
def crear_prompt_desde_personaje(evt: gr.SelectData):
|
223 |
"""Crea un prompt basado en el personaje seleccionado"""
|
224 |
global current_personajes
|
225 |
|
226 |
try:
|
227 |
-
if evt.index is not None and evt.index < len(current_personajes):
|
228 |
personaje = current_personajes[evt.index]
|
229 |
-
|
|
|
230 |
else:
|
231 |
return "Crea una historia sobre un personaje mítico"
|
232 |
except Exception as e:
|
@@ -278,14 +334,24 @@ with gr.Blocks(title="Iberotales", css=custom_css) as demo:
|
|
278 |
container=False
|
279 |
)
|
280 |
|
|
|
281 |
galeria_personajes = gr.Gallery(
|
282 |
-
value=
|
283 |
-
label="
|
284 |
-
show_label=
|
285 |
elem_id="galeria",
|
286 |
columns=1,
|
287 |
rows=4,
|
288 |
-
height=350
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
289 |
)
|
290 |
|
291 |
# Panel derecho - Chat
|
@@ -320,14 +386,14 @@ with gr.Blocks(title="Iberotales", css=custom_css) as demo:
|
|
320 |
pais_dropdown.change(
|
321 |
fn=actualizar_personajes,
|
322 |
inputs=[pais_dropdown],
|
323 |
-
outputs=[galeria_personajes]
|
324 |
)
|
325 |
|
326 |
# Cargar personajes iniciales
|
327 |
demo.load(
|
328 |
fn=actualizar_personajes,
|
329 |
inputs=[pais_dropdown],
|
330 |
-
outputs=[galeria_personajes]
|
331 |
)
|
332 |
|
333 |
# Crear prompt desde galería
|
|
|
199 |
except Exception as e:
|
200 |
return [ChatMessage(role="assistant", content=f"Error: {str(e)}")]
|
201 |
|
202 |
+
def crear_imagen_placeholder():
|
203 |
+
"""Crea una imagen placeholder simple usando PIL"""
|
204 |
+
try:
|
205 |
+
from PIL import Image, ImageDraw, ImageFont
|
206 |
+
import io
|
207 |
+
import base64
|
208 |
+
|
209 |
+
# Crear imagen simple
|
210 |
+
img = Image.new('RGB', (100, 100), color='lightgray')
|
211 |
+
draw = ImageDraw.Draw(img)
|
212 |
+
|
213 |
+
# Dibujar texto simple
|
214 |
+
draw.text((10, 40), "No Image", fill='black')
|
215 |
+
|
216 |
+
# Convertir a bytes
|
217 |
+
buffer = io.BytesIO()
|
218 |
+
img.save(buffer, format='PNG')
|
219 |
+
img_str = base64.b64encode(buffer.getvalue()).decode()
|
220 |
+
|
221 |
+
return f"data:image/png;base64,{img_str}"
|
222 |
+
except:
|
223 |
+
# Fallback: retornar None si no se puede crear la imagen
|
224 |
+
return None
|
225 |
+
|
226 |
def actualizar_personajes(pais_seleccionado):
|
227 |
"""Actualiza la galería de personajes según el país seleccionado"""
|
228 |
global current_personajes
|
229 |
+
|
230 |
+
if not pais_seleccionado:
|
231 |
+
return gr.Gallery(value=None, visible=False), "Selecciona un país para ver sus personajes"
|
232 |
+
|
233 |
personajes = PERSONAJES_POR_PAIS.get(pais_seleccionado, [])
|
234 |
current_personajes = personajes
|
235 |
|
236 |
if not personajes:
|
237 |
+
return gr.Gallery(value=None, visible=False), "No hay personajes disponibles para este país"
|
238 |
|
239 |
+
# Crear lista de imágenes válidas para la galería
|
240 |
+
imagenes_validas = []
|
241 |
+
|
242 |
+
for i, personaje in enumerate(personajes):
|
243 |
+
imagen_path = personaje["imagen"]
|
244 |
+
|
245 |
+
# Verificar si la imagen existe
|
246 |
+
if os.path.exists(imagen_path) and os.path.isfile(imagen_path):
|
247 |
+
try:
|
248 |
+
# Verificar que es una imagen válida
|
249 |
+
from PIL import Image
|
250 |
+
with Image.open(imagen_path) as img:
|
251 |
+
img.verify() # Verificar que la imagen es válida
|
252 |
+
imagenes_validas.append(imagen_path)
|
253 |
+
except Exception as e:
|
254 |
+
print(f"Error al verificar imagen {imagen_path}: {e}")
|
255 |
+
# Skip esta imagen si hay error
|
256 |
+
continue
|
257 |
else:
|
258 |
+
print(f"Imagen no encontrada: {imagen_path}")
|
259 |
+
# Skip imágenes que no existen
|
260 |
+
continue
|
261 |
|
262 |
+
# Si no hay imágenes válidas, mostrar mensaje
|
263 |
+
if not imagenes_validas:
|
264 |
+
return gr.Gallery(
|
265 |
+
value=None,
|
266 |
+
visible=True,
|
267 |
+
label=f"⚠️ Imágenes no encontradas para {pais_seleccionado}"
|
268 |
+
), f"Las imágenes para {pais_seleccionado} no están disponibles"
|
269 |
+
|
270 |
+
# Actualizar la galería con las imágenes válidas
|
271 |
+
return gr.Gallery(
|
272 |
+
value=imagenes_validas,
|
273 |
+
visible=True,
|
274 |
+
label=f"Personajes de {pais_seleccionado}"
|
275 |
+
), f"Mostrando {len(imagenes_validas)} personajes de {pais_seleccionado}"
|
276 |
|
277 |
def crear_prompt_desde_personaje(evt: gr.SelectData):
|
278 |
"""Crea un prompt basado en el personaje seleccionado"""
|
279 |
global current_personajes
|
280 |
|
281 |
try:
|
282 |
+
if evt.index is not None and 0 <= evt.index < len(current_personajes):
|
283 |
personaje = current_personajes[evt.index]
|
284 |
+
prompt = f"Crea una historia sobre {personaje['nombre']}: {personaje['descripcion']}"
|
285 |
+
return prompt
|
286 |
else:
|
287 |
return "Crea una historia sobre un personaje mítico"
|
288 |
except Exception as e:
|
|
|
334 |
container=False
|
335 |
)
|
336 |
|
337 |
+
# Inicializar la galería vacía
|
338 |
galeria_personajes = gr.Gallery(
|
339 |
+
value=None,
|
340 |
+
label="Selecciona un país",
|
341 |
+
show_label=True,
|
342 |
elem_id="galeria",
|
343 |
columns=1,
|
344 |
rows=4,
|
345 |
+
height=350,
|
346 |
+
type="filepath" # Especificar el tipo explícitamente
|
347 |
+
)
|
348 |
+
|
349 |
+
# Mensaje de estado
|
350 |
+
status_msg = gr.Textbox(
|
351 |
+
value="Selecciona un país para ver sus personajes",
|
352 |
+
show_label=False,
|
353 |
+
interactive=False,
|
354 |
+
container=False
|
355 |
)
|
356 |
|
357 |
# Panel derecho - Chat
|
|
|
386 |
pais_dropdown.change(
|
387 |
fn=actualizar_personajes,
|
388 |
inputs=[pais_dropdown],
|
389 |
+
outputs=[galeria_personajes, status_msg]
|
390 |
)
|
391 |
|
392 |
# Cargar personajes iniciales
|
393 |
demo.load(
|
394 |
fn=actualizar_personajes,
|
395 |
inputs=[pais_dropdown],
|
396 |
+
outputs=[galeria_personajes, status_msg]
|
397 |
)
|
398 |
|
399 |
# Crear prompt desde galería
|