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
|