eberhenriquez94 commited on
Commit
57cdf26
·
verified ·
1 Parent(s): c16f17e
Files changed (1) hide show
  1. app.py +41 -39
app.py CHANGED
@@ -7,12 +7,7 @@ import gradio as gr
7
  # 1. Obtener la Clave API de NVIDIA de forma segura desde los Secrets del Space
8
  NVIDIA_API_KEY = os.getenv("NVIDIA_API_KEY")
9
  if not NVIDIA_API_KEY:
10
- # En un Space, si la clave no está configurada, la app puede fallar al inicio
11
- # o puedes manejarlo mostrando un mensaje de error en la UI.
12
- # Aquí, simplemente imprimiremos un aviso y la función de API fallará.
13
  print("ADVERTENCIA: La variable de entorno NVIDIA_API_KEY no está configurada en los Secrets del Space.")
14
- # Podrías lanzar un error aquí si prefieres que la app no inicie sin la clave:
15
- # raise ValueError("La clave NVIDIA_API_KEY no está configurada en los Secrets del Space.")
16
 
17
  NVIDIA_API_URL = "https://integrate.api.nvidia.com/v1/chat/completions"
18
  NVIDIA_MODEL_NAME = "qwen/qwen3-next-80b-a3b-thinking" # El modelo que especificaste
@@ -37,8 +32,7 @@ async def call_nvidia_api(user_prompt: str, system_instruction: str) -> str:
37
  "Authorization": f"Bearer {NVIDIA_API_KEY}"
38
  }
39
 
40
- # Asegúrate de que esta línea esté al mismo nivel de indentación que 'headers'
41
- payload = { # <-- AÑADIR esta llave de apertura
42
  "model": NVIDIA_MODEL_NAME,
43
  "temperature": 0.2,
44
  "top_p": 0.7,
@@ -48,23 +42,19 @@ async def call_nvidia_api(user_prompt: str, system_instruction: str) -> str:
48
  "messages": [
49
  {"role": "system", "content": system_instruction},
50
  {"role": "user", "content": user_prompt}
51
- ] # Se cierra la lista 'messages'
52
- } # <-- AÑADIR esta llave de cierre
53
 
54
  try:
55
- # Ejecuta la solicitud síncrona en un hilo separado para no bloquear asyncio
56
  loop = asyncio.get_event_loop()
57
- response = await loop.run_in_executor(None, lambda: requests.post(NVIDIA_API_URL, json=payload, headers=headers, timeout=60)) # Añadido timeout
58
-
59
-
60
-
61
  response.raise_for_status()
62
  data = response.json()
63
 
64
  if data and 'choices' in data and len(data['choices']) > 0 and 'message' in data['choices'][0] and 'content' in data['choices'][0]['message']:
65
  return data['choices'][0]['message']['content']
66
  else:
67
- return f"Error: Formato de respuesta inesperado de la API de NVIDIA. Respuesta: {str(data)[:500]}" # Limita la longitud del error
68
 
69
  except requests.exceptions.HTTPError as errh:
70
  return f"Error HTTP de la API de NVIDIA: {errh}\nDetalle: {str(response.text)[:500]}"
@@ -84,42 +74,54 @@ async def predict(borrador: str) -> str:
84
  """
85
  if not borrador.strip():
86
  return "Por favor, introduce un borrador judicial para perfeccionar."
87
- if not NVIDIA_API_KEY: # Comprobación adicional antes de llamar a la API
88
  return "Error: La clave API de NVIDIA no está configurada en los Secrets del Space. No se puede procesar la solicitud."
89
 
90
  improved_text = await call_nvidia_api(borrador, instruction)
91
  return improved_text
92
 
93
  # --- INTERFAZ DE GRADIO ---
94
- with gr.Blocks(theme=gr.themes.Soft()) as demo: # Puedes probar diferentes temas de Gradio
 
95
  gr.Markdown(
96
- """
97
  # ⚖️ Perfeccionador de Resoluciones Judiciales (Chile) ⚖️
98
  **Estilo Excelentísima Corte Suprema**
99
-
100
- Esta herramienta utiliza el modelo `qwen/qwen3-235b-a22b` de NVIDIA para refinar la forma de borradores de resoluciones judiciales en materia de familia.
101
  **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.
102
  """
103
  )
104
- lines=20,
105
- interactive=True
106
- )
107
- with gr.Column(scale=3): # Damos más espacio a la salida
108
- output_text = gr.Textbox(
109
- label="✨ Resultado perfeccionado (estilo Corte Suprema)",
110
- placeholder="El texto corregido por el modelo aparecerá aquí...",
111
- ],
112
- inputs=borrador_input,
113
- outputs=output_text,
114
- fn=predict, # La función que se llamará con los ejemplos
115
- cache_examples=False, # Desactiva el cache si los resultados pueden variar o para asegurar la última versión del prompt
116
- )
117
 
118
- submit_btn.click(fn=predict, inputs=borrador_input, outputs=output_text, api_name="predict_sync") # api_name opcional
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
 
120
  # --- LANZAR LA INTERFAZ DE GRADIO ---
121
- # Cuando se ejecuta en Hugging Face Spaces, no necesitas if __name__ == "__main__":
122
- # Gradio lo maneja automáticamente.
123
- # demo.launch() sin argumentos es suficiente para Spaces.
124
- # Si quisieras habilitar la cola para manejar múltiples usuarios: demo.launch(enable_queue=True)
125
- demo.launch()
 
7
  # 1. Obtener la Clave API de NVIDIA de forma segura desde los Secrets del Space
8
  NVIDIA_API_KEY = os.getenv("NVIDIA_API_KEY")
9
  if not NVIDIA_API_KEY:
 
 
 
10
  print("ADVERTENCIA: La variable de entorno NVIDIA_API_KEY no está configurada en los Secrets del Space.")
 
 
11
 
12
  NVIDIA_API_URL = "https://integrate.api.nvidia.com/v1/chat/completions"
13
  NVIDIA_MODEL_NAME = "qwen/qwen3-next-80b-a3b-thinking" # El modelo que especificaste
 
32
  "Authorization": f"Bearer {NVIDIA_API_KEY}"
33
  }
34
 
35
+ payload = {
 
36
  "model": NVIDIA_MODEL_NAME,
37
  "temperature": 0.2,
38
  "top_p": 0.7,
 
42
  "messages": [
43
  {"role": "system", "content": system_instruction},
44
  {"role": "user", "content": user_prompt}
45
+ ]
46
+ }
47
 
48
  try:
 
49
  loop = asyncio.get_event_loop()
50
+ response = await loop.run_in_executor(None, lambda: requests.post(NVIDIA_API_URL, json=payload, headers=headers, timeout=60))
 
 
 
51
  response.raise_for_status()
52
  data = response.json()
53
 
54
  if data and 'choices' in data and len(data['choices']) > 0 and 'message' in data['choices'][0] and 'content' in data['choices'][0]['message']:
55
  return data['choices'][0]['message']['content']
56
  else:
57
+ return f"Error: Formato de respuesta inesperado de la API. Respuesta: {str(data)[:500]}"
58
 
59
  except requests.exceptions.HTTPError as errh:
60
  return f"Error HTTP de la API de NVIDIA: {errh}\nDetalle: {str(response.text)[:500]}"
 
74
  """
75
  if not borrador.strip():
76
  return "Por favor, introduce un borrador judicial para perfeccionar."
77
+ if not NVIDIA_API_KEY:
78
  return "Error: La clave API de NVIDIA no está configurada en los Secrets del Space. No se puede procesar la solicitud."
79
 
80
  improved_text = await call_nvidia_api(borrador, instruction)
81
  return improved_text
82
 
83
  # --- INTERFAZ DE GRADIO ---
84
+ # CORRECCIÓN: Se ha reestructurado completamente esta sección para que sea sintácticamente correcta y funcional.
85
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
86
  gr.Markdown(
87
+ f"""
88
  # ⚖️ Perfeccionador de Resoluciones Judiciales (Chile) ⚖️
89
  **Estilo Excelentísima Corte Suprema**
90
+ Esta herramienta utiliza el modelo `{NVIDIA_MODEL_NAME}` de NVIDIA para refinar la forma de borradores de resoluciones judiciales.
 
91
  **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.
92
  """
93
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
94
 
95
+ # CORRECCIÓN: Se usa gr.Row para organizar los elementos uno al lado del otro.
96
+ with gr.Row():
97
+ # CORRECCIÓN: Se define el cuadro de texto de ENTRADA que faltaba.
98
+ # Los parámetros `lines=20` e `interactive=True` se han movido aquí.
99
+ borrador_input = gr.Textbox(
100
+ label="Pega aquí el borrador para perfeccionar",
101
+ placeholder="Ej: VISTOS: A fojas 1, comparece doña JUANA PÉREZ, quien interpone demanda de alimentos...",
102
+ lines=20,
103
+ interactive=True
104
+ )
105
+ # CORRECCIÓN: Se define el cuadro de texto de SALIDA.
106
+ output_text = gr.Textbox(
107
+ label="✨ Resultado perfeccionado (estilo Corte Suprema)",
108
+ placeholder="El texto corregido por el modelo aparecerá aquí...",
109
+ lines=20,
110
+ interactive=False # El usuario no debe poder escribir aquí
111
+ )
112
+
113
+ # CORRECCIÓN: Se define el botón de envío que faltaba.
114
+ submit_btn = gr.Button("Perfeccionar Borrador", variant="primary")
115
+
116
+ # CORRECCIÓN: El bloque que parecía un intento de `gr.Examples` se ha eliminado
117
+ # para simplificar y corregir el error de sintaxis. Si quieres añadir ejemplos,
118
+ # se puede hacer con la función gr.Examples().
119
+
120
+ # CORRECCIÓN: Se conecta la función 'predict' al evento 'click' del botón.
121
+ # 'borrador_input' es la entrada y 'output_text' es la salida.
122
+ submit_btn.click(fn=predict, inputs=borrador_input, outputs=output_text, api_name="predict")
123
 
124
  # --- LANZAR LA INTERFAZ DE GRADIO ---
125
+ # CORRECCIÓN: Se eliminó el corchete extra `]` al final.
126
+ # Se añade `enable_queue=True` para manejar mejor múltiples usuarios en un Space.
127
+ demo.launch(enable_queue=True)