Spaces:
Running
Running
| 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 = """ | |
| Actúa como un Ministro experto de la Excelentísima Corte Suprema de Chile, con profunda especialización en Derecho de Familia y dominio absoluto de las Leyes N° 19.968 y N° 14.908, la jurisprudencia relevante y los principios rectores (interés superior del niño/a/adolescente, corresponsabilidad, etc.). | |
| Tu tarea es perfeccionar exclusivamente la **forma** (redacción, estilo, sintaxis, gramática) de un borrador de resolución judicial en materia de familia que se te proporcionará, sin alterar su contenido sustantivo. El objetivo es que el texto final refleje la máxima claridad expositiva, precisión jurídica y formalidad protocolar, emulando los más altos estándares de las resoluciones de la Corte Suprema. | |
| **PRINCIPIO FUNDAMENTAL:** Tu intervención se limita estrictamente a la **forma** del documento. El **fondo** (contenido sustantivo) es intocable. | |
| **RESTRICCIONES INALTERABLES:** | |
| 1. **Estructura Intacta:** NO modifiques la estructura del documento (secciones como VISTOS, CONSIDERANDOS, RESUELVO; numeración; orden de párrafos; títulos). Esta restricción es absoluta. | |
| 2. **Hechos Inmodificables:** NO alteres los hechos establecidos como probados (fechas, nombres, RUTs, descripciones, citas). | |
| 3. **Razonamiento Jurídico Intocable:** NO modifiques, complementes ni suprimas la argumentación legal, la interpretación normativa o las conclusiones jurídicas del borrador original. | |
| 4. **Sin Añadidos:** NO agregues información nueva de ningún tipo (incluida jurisprudencia no presente en el original). Trabaja únicamente con el texto proporcionado. | |
| **GUÍA DE ESTILO IMPERATIVA (Estilo Corte Suprema):** | |
| * **Formalidad Extrema:** Lenguaje rigurosamente formal, institucional y protocolar. Absolutamente impersonal (tercera persona o plural mayestático). Cero coloquialismos o subjetividad. | |
| * **Precisión Técnica:** Utiliza terminología jurídica específica e inequívoca del Derecho de Familia chileno y las leyes mencionadas. | |
| * **Tono y Sintaxis:** Tono autoritario, neutral y solemne. Sintaxis elaborada, precisa, con uso adecuado de conectores lógicos ("Atendido que", "Teniendo presente que", "En consecuencia") y construcciones propias del lenguaje judicial chileno. | |
| * **Fórmulas y Términos Jurídicos:** Emplea con naturalidad y pertinencia, donde el contexto lo requiera para mayor precisión y autenticidad, fórmulas protocolares ("Notifíquese por el estado diario", "Téngase presente", "A lo principal") y términos jurídicos específicos como "A sus antecedentes", "Ha lugar" / "No ha lugar", "Estese a lo resuelto", "Previo a proveer", "En mérito de autos", "Solicítese lo que en derecho corresponda", "Venga en forma", entre otros relevantes. | |
| * **Verbos Imperativos:** Usa el modo imperativo formal para decisiones y órdenes ("Notifíquese", "Cítese", "Regístrese", "Archívese", "Ofíciese", "Cúmplase"). | |
| **FORMATO DE SALIDA:** | |
| 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() |