File size: 5,109 Bytes
6a2ba7e
 
 
 
 
 
 
42a32b3
 
 
 
6a2ba7e
42a32b3
 
6a2ba7e
 
 
 
 
 
42a32b3
 
 
 
 
6a2ba7e
 
 
 
 
 
 
42a32b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6a2ba7e
42a32b3
 
6a2ba7e
 
 
 
42a32b3
 
 
 
 
6a2ba7e
42a32b3
6a2ba7e
42a32b3
 
 
6a2ba7e
42a32b3
 
6a2ba7e
42a32b3
 
6a2ba7e
 
 
42a32b3
6a2ba7e
42a32b3
 
6a2ba7e
42a32b3
 
 
 
 
 
 
 
6a2ba7e
42a32b3
 
6a2ba7e
42a32b3
 
6a2ba7e
 
 
42a32b3
6a2ba7e
 
 
 
42a32b3
 
 
 
6a2ba7e
42a32b3
6a2ba7e
 
42a32b3
6a2ba7e
42a32b3
6a2ba7e
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116

"""
Este módulo construye y lanza la interfaz de usuario web utilizando Gradio.
Sirve como el punto de entrada de la aplicación y conecta la interfaz con la lógica
de negocio definida en `src/logic.py`.
"""

import gradio as gr
from src.logic import full_workflow, EXAMPLE_PDF_PATH
import os

# --- FUNCIONES AUXILIARES PARA LA INTERFAZ ---

def check_requirements():
    """
    Verifica si los requisitos de configuración (API key y archivo de ejemplo) están presentes.

    Returns:
        Una tupla de booleanos (api_key_present, example_file_present).
    """
    api_key_present = os.environ.get("GEMINI_API_KEY") is not None
    example_file_present = os.path.exists(EXAMPLE_PDF_PATH)
    return api_key_present, example_file_present

def get_info_markdown():
    """
    Genera un texto en formato Markdown para mostrar el estado de la configuración en la UI.
    Esto proporciona retroalimentación en tiempo real al usuario.

    Returns:
        Un string en formato Markdown con el estado de la configuración.
    """
    api_key_ok, example_file_ok = check_requirements()
    
    key_status = "✅ API Key de Gemini encontrada." if api_key_ok else "❌ **Acción Requerida**: Falta la API Key de Gemini. Por favor, configúrala en los secretos del repositorio de Hugging Face con el nombre `GEMINI_API_KEY`."
    
    file_status = f"✅ Archivo de ejemplo (`{EXAMPLE_PDF_PATH}`) encontrado." if example_file_ok else f"❌ **Acción Requerida**: Falta el archivo de ejemplo. Por favor, sube el archivo `{EXAMPLE_PDF_PATH}` a la raíz de este repositorio."
    
    all_ok = api_key_ok and example_file_ok
    
    return f"""
    ### Estado de la Configuración
    {key_status}
    {file_status}
    
    **La aplicación {'está lista para usarse' if all_ok else 'NO funcionará hasta que se resuelvan los puntos anteriores'}.**
    """

# --- DEFINICIÓN DE LA INTERFAZ DE GRADIO ---

def create_interface():
    """
    Crea y devuelve el objeto de la interfaz de Gradio.
    """
    # Se utiliza gr.Blocks para tener un control total sobre el diseño de la interfaz.
    with gr.Blocks(theme=gr.themes.Soft()) as iface:
        gr.Markdown("# 🤖 Asistente de Contestación de Tutelas con IA")
        gr.Markdown("Sube un documento de tutela en formato PDF y la IA generará una propuesta de contestación basada en un documento de ejemplo.")

        with gr.Row():
            # Columna izquierda para entradas y controles.
            with gr.Column(scale=1):
                # Componente para subir el archivo PDF de la tutela.
                pdf_input = gr.File(
                    label="Sube la Tutela", 
                    file_types=[".pdf"],
                    type="filepath"  # Pasa la ruta del archivo a la función, no el contenido.
                )
                
                # Botón principal para iniciar el proceso.
                submit_btn = gr.Button("Generar Contestación", variant="primary")
                
                # Caja de información que muestra el estado de la configuración.
                # Se actualiza cada 5 segundos para reflejar cambios (ej. si el usuario sube el archivo).
                gr.Markdown(get_info_markdown, every=5)

            # Columna derecha para mostrar los resultados.
            with gr.Column(scale=2):
                gr.Markdown("### Borrador de la Contestación")
                # Pestañas para organizar las diferentes secciones de la respuesta.
                with gr.Tabs():
                    with gr.TabItem("Hechos"):
                        hechos_output = gr.Textbox(label="Hechos", lines=10, interactive=True)
                    with gr.TabItem("Fundamentos de Derecho"):
                        fundamentos_output = gr.Textbox(label="Fundamentos de Derecho", lines=10, interactive=True)
                    with gr.TabItem("Peticiones"):
                        peticiones_output = gr.Textbox(label="Peticiones", lines=10, interactive=True)
                
                # Componente para mostrar el enlace de descarga del archivo .docx generado.
                docx_output = gr.File(
                    label="Descargar Documento (.docx)", 
                    interactive=False # El usuario no puede subir un archivo aquí.
                )

        # --- MANEJO DE EVENTOS ---
        
        # Conecta el evento 'click' del botón con la función de lógica de negocio.
        submit_btn.click(
            fn=full_workflow, # La función a ejecutar.
            inputs=[pdf_input], # La lista de componentes de entrada.
            outputs=[hechos_output, fundamentos_output, peticiones_output, docx_output], # La lista de componentes de salida.
            api_name="generate_tutela_response" # Nombre para la API de la interfaz.
        )

    return iface

# --- EJECUCIÓN PRINCIPAL ---

# Crea la interfaz. Usar una variable global `demo` es un patrón común en Hugging Face Spaces.
demo = create_interface()

# Este bloque se ejecuta solo cuando el script se corre directamente.
if __name__ == "__main__":
    # Lanza la aplicación web.
    demo.launch()