new-space / app.py
eberhenriquez94's picture
a
036fc6f verified
raw
history blame
5.89 kB
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()