TutelaSpace / app.py
jsant2608's picture
Actualizo logic.py y app.py para manejo correcto de PDF y mejoras
6a2ba7e
"""
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()