File size: 5,891 Bytes
f03a8aa
86019ac
200fce2
08d0f2d
b11aa41
200fce2
 
 
 
 
 
 
ac6db08
554f4ad
 
 
9b7c3ab
04a4aae
641bac1
127deef
200fce2
 
554f4ad
200fce2
554f4ad
200fce2
 
554f4ad
 
200fce2
 
 
554f4ad
 
57cdf26
200fce2
554f4ad
 
 
200fce2
 
554f4ad
 
 
57cdf26
 
554f4ad
 
 
57cdf26
554f4ad
 
 
 
 
 
57cdf26
554f4ad
 
200fce2
554f4ad
200fce2
554f4ad
200fce2
554f4ad
200fce2
554f4ad
 
 
 
 
 
200fce2
554f4ad
 
 
57cdf26
200fce2
554f4ad
200fce2
554f4ad
 
 
57cdf26
 
554f4ad
57cdf26
554f4ad
 
57cdf26
554f4ad
 
df7a3d1
137edac
57cdf26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
554f4ad
 
57cdf26
 
036fc6f
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
117
118
119
120
121
122
123
124
125
126
127
import os
import asyncio
import requests # Necesario para interactuar con la API de NVIDIA
import gradio as gr

# --- CONFIGURACIÓN DE LA API DE NVIDIA ---
# 1. Obtener la Clave API de NVIDIA de forma segura desde los Secrets del Space
NVIDIA_API_KEY = os.getenv("NVIDIA_API_KEY")
if not NVIDIA_API_KEY:
    print("ADVERTENCIA: La variable de entorno NVIDIA_API_KEY no está configurada en los Secrets del Space.")

NVIDIA_API_URL = "https://integrate.api.nvidia.com/v1/chat/completions"
NVIDIA_MODEL_NAME = "qwen/qwen3-next-80b-a3b-thinking" # El modelo que especificaste


# --- DIRECTIVA DE INSTRUCCIÓN (Rol del Agente) ---
instruction = """
Proporciona únicamente el texto completo del borrador de la resolución judicial, revisado y perfeccionado según todas las instrucciones anteriores. No incluyas comentarios, explicaciones ni encabezados adicionales.
"""

# --- FUNCIÓN PARA LLAMAR A LA API DE NVIDIA ---
async def call_nvidia_api(user_prompt: str, system_instruction: str) -> str:
    """
    Realiza una solicitud a la API de NVIDIA para generar contenido.
    """
    if not NVIDIA_API_KEY:
        return "Error: La clave API de NVIDIA no está configurada. Por favor, añádela a los 'Secrets' de este Space."

    headers = {
        "accept": "application/json",
        "content-type": "application/json",
        "Authorization": f"Bearer {NVIDIA_API_KEY}"
    }

    payload = {
        "model": NVIDIA_MODEL_NAME,
        "temperature": 0.2,
        "top_p": 0.7,
        "max_tokens": 8192,
        "seed": None,
        "stream": False,
        "messages": [
            {"role": "system", "content": system_instruction},
            {"role": "user", "content": user_prompt}
        ]
    }

    try:
        loop = asyncio.get_event_loop()
        response = await loop.run_in_executor(None, lambda: requests.post(NVIDIA_API_URL, json=payload, headers=headers, timeout=60))
        response.raise_for_status()
        data = response.json()

        if data and 'choices' in data and len(data['choices']) > 0 and 'message' in data['choices'][0] and 'content' in data['choices'][0]['message']:
            return data['choices'][0]['message']['content']
        else:
            return f"Error: Formato de respuesta inesperado de la API. Respuesta: {str(data)[:500]}"

    except requests.exceptions.HTTPError as errh:
        return f"Error HTTP de la API de NVIDIA: {errh}\nDetalle: {str(response.text)[:500]}"
    except requests.exceptions.ConnectionError as errc:
        return f"Error de conexión con la API de NVIDIA: {errc}"
    except requests.exceptions.Timeout as errt:
        return f"Tiempo de espera agotado con la API de NVIDIA: {errt}"
    except requests.exceptions.RequestException as err:
        return f"Error al realizar la solicitud a la API de NVIDIA: {err}"
    except Exception as e:
        return f"Error inesperado durante la llamada a la API: {e}"

# --- FUNCIÓN PRINCIPAL DE PREDICCIÓN PARA GRADIO ---
async def predict(borrador: str) -> str:
    """
    Función que recibe el borrador judicial y lo envía a la API de NVIDIA para su perfeccionamiento.
    """
    if not borrador.strip():
        return "Por favor, introduce un borrador judicial para perfeccionar."
    if not NVIDIA_API_KEY:
        return "Error: La clave API de NVIDIA no está configurada en los Secrets del Space. No se puede procesar la solicitud."

    improved_text = await call_nvidia_api(borrador, instruction)
    return improved_text

# --- INTERFAZ DE GRADIO ---
# CORRECCIÓN: Se ha reestructurado completamente esta sección para que sea sintácticamente correcta y funcional.
with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown(
        f"""
        # ⚖️ Perfeccionador de Resoluciones Judiciales (Chile) ⚖️
        **Estilo Excelentísima Corte Suprema**
        Esta herramienta utiliza el modelo `{NVIDIA_MODEL_NAME}` de NVIDIA para refinar la forma de borradores de resoluciones judiciales.
        **Importante:** El contenido sustantivo (hechos, razonamiento, decisión) del borrador original **no será alterado**. La IA se enfoca exclusivamente en el lenguaje, la sintaxis y la formalidad protocolar.
        """
    )

    # CORRECCIÓN: Se usa gr.Row para organizar los elementos uno al lado del otro.
    with gr.Row():
        # CORRECCIÓN: Se define el cuadro de texto de ENTRADA que faltaba.
        # Los parámetros `lines=20` e `interactive=True` se han movido aquí.
        borrador_input = gr.Textbox(
            label="Pega aquí el borrador para perfeccionar",
            placeholder="Ej: VISTOS: A fojas 1, comparece doña JUANA PÉREZ, quien interpone demanda de alimentos...",
            lines=20,
            interactive=True
        )
        # CORRECCIÓN: Se define el cuadro de texto de SALIDA.
        output_text = gr.Textbox(
            label="✨ Resultado perfeccionado (estilo Corte Suprema)",
            placeholder="El texto corregido por el modelo aparecerá aquí...",
            lines=20,
            interactive=False # El usuario no debe poder escribir aquí
        )

    # CORRECCIÓN: Se define el botón de envío que faltaba.
    submit_btn = gr.Button("Perfeccionar Borrador", variant="primary")

    # CORRECCIÓN: El bloque que parecía un intento de `gr.Examples` se ha eliminado
    # para simplificar y corregir el error de sintaxis. Si quieres añadir ejemplos,
    # se puede hacer con la función gr.Examples().

    # CORRECCIÓN: Se conecta la función 'predict' al evento 'click' del botón.
    # 'borrador_input' es la entrada y 'output_text' es la salida.
    submit_btn.click(fn=predict, inputs=borrador_input, outputs=output_text, api_name="predict")

# --- LANZAR LA INTERFAZ DE GRADIO ---
# CORRECCIÓN: Se eliminó el corchete extra `]` al final.
# Se añade `enable_queue=True` para manejar mejor múltiples usuarios en un Space.
demo.launch()