Spaces:
Running
Running
Refactoriza la interfaz de usuario en `app.py` al envolver `gr.ChatInterface` dentro de `gr.Blocks`, mejorando la estructura del código. Se añade un script de JavaScript para mantener el enfoque en el campo de entrada después de las respuestas, optimizando la experiencia del usuario. Además, se actualiza la función de lanzamiento para utilizar `demo.launch()` en lugar de `chat.launch()`, asegurando una mejor gestión de la interfaz.
Browse files
app.py
CHANGED
|
@@ -344,28 +344,59 @@ def respond(message, history: list[tuple[str, str]]):
|
|
| 344 |
_flush_langsmith()
|
| 345 |
|
| 346 |
|
| 347 |
-
|
| 348 |
-
|
| 349 |
-
|
| 350 |
-
|
| 351 |
-
|
| 352 |
-
|
| 353 |
-
|
| 354 |
-
|
| 355 |
-
|
| 356 |
-
|
| 357 |
-
|
| 358 |
-
|
| 359 |
-
|
| 360 |
-
|
| 361 |
-
|
| 362 |
-
|
| 363 |
-
|
| 364 |
-
|
| 365 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 366 |
|
| 367 |
|
| 368 |
if __name__ == "__main__":
|
| 369 |
-
|
| 370 |
|
| 371 |
|
|
|
|
| 344 |
_flush_langsmith()
|
| 345 |
|
| 346 |
|
| 347 |
+
with gr.Blocks(theme=gr.themes.Monochrome(), css=style) as demo:
|
| 348 |
+
gr.ChatInterface(
|
| 349 |
+
fn=respond,
|
| 350 |
+
# default type keeps string message, keeps compatibility across versions
|
| 351 |
+
title="Gmail & Outlook API Helper",
|
| 352 |
+
description="Chat para guiar en la creación de API Keys.",
|
| 353 |
+
textbox=gr.MultimodalTextbox(
|
| 354 |
+
file_types=["image", ".png", ".jpg", ".jpeg", ".webp", ".gif"],
|
| 355 |
+
placeholder="Escribe o pega (⌘/Ctrl+V) una imagen o arrástrala aquí",
|
| 356 |
+
file_count="multiple",
|
| 357 |
+
),
|
| 358 |
+
multimodal=True,
|
| 359 |
+
fill_height=True,
|
| 360 |
+
examples=[
|
| 361 |
+
"¿Cómo creo una API Key de Gmail?",
|
| 362 |
+
"Guíame para obtener credenciales de OneDrive",
|
| 363 |
+
],
|
| 364 |
+
)
|
| 365 |
+
|
| 366 |
+
|
| 367 |
+
# Front-end helper to keep the input focused after responses
|
| 368 |
+
AUTOFOCUS_JS = """
|
| 369 |
+
() => {
|
| 370 |
+
const container = document.querySelector('.gradio-container');
|
| 371 |
+
if (!container) return;
|
| 372 |
+
const focusInput = () => {
|
| 373 |
+
const ta = container.querySelector('textarea');
|
| 374 |
+
if (ta) ta.focus();
|
| 375 |
+
};
|
| 376 |
+
// Focus on initial load
|
| 377 |
+
focusInput();
|
| 378 |
+
// Re-focus on DOM updates (e.g., after new assistant messages)
|
| 379 |
+
const observer = new MutationObserver((mutations) => {
|
| 380 |
+
for (const m of mutations) {
|
| 381 |
+
if (m.addedNodes && m.addedNodes.length > 0) {
|
| 382 |
+
focusInput();
|
| 383 |
+
break;
|
| 384 |
+
}
|
| 385 |
+
}
|
| 386 |
+
});
|
| 387 |
+
observer.observe(container, { childList: true, subtree: true });
|
| 388 |
+
}
|
| 389 |
+
"""
|
| 390 |
+
|
| 391 |
+
# Run once on load to attach the observer and ensure focus
|
| 392 |
+
try:
|
| 393 |
+
demo.load(None, None, None, js=AUTOFOCUS_JS)
|
| 394 |
+
except Exception:
|
| 395 |
+
# Best-effort: if load hook signature differs by version, ignore
|
| 396 |
+
pass
|
| 397 |
|
| 398 |
|
| 399 |
if __name__ == "__main__":
|
| 400 |
+
demo.launch()
|
| 401 |
|
| 402 |
|