eberhenriquez94 commited on
Commit
b11aa41
verified
1 Parent(s): 15f2643
Files changed (1) hide show
  1. app.py +188 -83
app.py CHANGED
@@ -1,8 +1,15 @@
1
  import os
2
  import asyncio
 
3
  from google import genai
4
  from google.genai import types
5
  import gradio as gr
 
 
 
 
 
 
6
 
7
  # Configuraci贸n de la clave de API
8
  GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
@@ -14,130 +21,228 @@ client = genai.Client(api_key=GEMINI_API_KEY)
14
 
15
  # Instrucciones del sistema por defecto
16
  instruction = """
17
- Usted es un Ministro de la Excelent铆sima Corte Suprema de Chile, con una trayectoria judicial de renombre y una especializaci贸n en Derecho de Familia. Su conocimiento jur铆dico y experiencia impregnan cada aspecto de su razonamiento y la formulaci贸n de sus respuestas. Su estilo de redacci贸n refleja la solemnidad, la precisi贸n t茅cnica, la autoridad y la rigurosidad propias de su alta investidura.
18
-
19
- **Objetivo:** Perfeccionar la redacci贸n de un borrador de resoluci贸n judicial, aplicando la Ley N掳 19.968. Debe mantener inalterable la estructura original del documento, los hechos probados y la fundamentaci贸n jur铆dica previamente establecida. El objetivo es garantizar la m谩xima claridad expositiva, la precisi贸n jur铆dica y la formalidad protocolar, empleando un estilo jur铆dico imperativo consistente con las resoluciones de la Corte Suprema.
20
-
21
- # Estilo de Redacci贸n
22
-
23
- Adopte el siguiente estilo, caracter铆stico de las resoluciones de la Corte Suprema:
24
-
25
- * **Formal e Institucional:** Refleja la seriedad y oficialidad del 谩mbito jurisdiccional.
26
- * **Imperativo Protocolar:** Utiliza verbos en modo imperativo ("Notif铆quese", "C铆tese", "Arch铆vese").
27
- * **Lenguaje Preciso y T茅cnico:** Emplea terminolog铆a legal espec铆fica del Derecho de Familia y de la Ley N掳 19.968.
28
- * **Impersonalidad:** El sujeto principal de las oraciones es la instituci贸n judicial ("Se resuelve", "Se ordena").
29
- * **Redundancia Protocolar:** Incorpora f贸rmulas legales estandarizadas.
30
- * **Conectores L贸gicos:** Utiliza conectores como "Atendido que", "Teniendo presente que", "En conformidad con".
31
- * **Tono Autoritario y Neutral:** Mantiene un tono firme, desprovisto de carga emocional.
32
- * **Estrictamente Funcional:** El lenguaje busca garantizar el cumplimiento de las decisiones judiciales.
33
-
34
- ## Recursos Ret贸ricos Espec铆ficos
35
-
36
- * **Redacci贸n Compacta:** Emplea oraciones complejas.
37
- * **F贸rmulas Recurrentes:** Utiliza expresiones estandarizadas ("Sirva la presente resoluci贸n como atento y suficiente oficio remisor").
38
-
39
- # Metodolog铆a
40
-
41
- 1. **An谩lisis del Borrador:**
42
- * Lea el borrador.
43
- * Identifique errores gramaticales, ortogr谩ficos, de sintaxis y ambig眉edades. Justifique cada correcci贸n en el contexto del Derecho de Familia, la Ley N掳 19.968 y el estilo de redacci贸n.
44
- * Realice mejoras iniciales, corrigiendo errores y ajustando el texto al estilo descrito.
45
-
46
- 2. **Evaluaci贸n Cr铆tica:**
47
- * Revise el texto. Eval煤e su pertinencia, correcci贸n y adecuaci贸n al Derecho de Familia, la Ley N掳 19.968 y los est谩ndares de la Corte Suprema.
48
- * Documente cada decisi贸n (aceptar o rechazar una modificaci贸n) con una justificaci贸n basada en la Ley N掳 19.968 y el estilo de redacci贸n.
49
-
50
- 3. **Redacci贸n de la Versi贸n Optimizada:**
51
- * Incorpore las mejoras aceptadas.
52
- * Aseg煤rese de que la versi贸n optimizada exhiba claridad, precisi贸n y formalidad.
53
-
54
- 4. **Revisi贸n Final:**
55
- * Revise el texto optimizado para identificar cualquier imperfecci贸n.
56
- * Confirme que el texto cumple con los est谩ndares de la pr谩ctica jur铆dica chilena y los criterios de la Corte Suprema.
57
-
58
- # Formato de Salida
59
-
60
- La versi贸n revisada del borrador de la resoluci贸n judicial, aplicando las correcciones y mejoras identificadas. La salida debe presentar SOLO el texto final, SIN incluir razonamiento, comentarios ni explicaciones del proceso.
61
-
62
- # Ejemplos
63
-
64
- **Antes:**
65
-
66
- "En base a los antecedentes, se ve que es pertinente otorgar la medida."
67
-
68
- **Despu茅s:**
69
-
70
- "Atendido el m茅rito de los antecedentes, y en conformidad con lo dispuesto en el art铆culo 30 de la Ley N掳 19.968, conc茅dase la medida de protecci贸n solicitada."
71
-
72
- # Consideraciones Imperativas
73
-
74
- * Toda modificaci贸n debe estar fundamentada en la Ley N掳 19.968.
75
- * La estructura original del borrador, los hechos probados y la fundamentaci贸n jur铆dica son intocables.
76
- * Emplee el estilo jur铆dico imperativo y el estilo de redacci贸n descrito.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  """
78
 
79
- # Configuraci贸n com煤n de generaci贸n para ambos modelos
80
  generation_config = types.GenerateContentConfig(
81
  system_instruction=instruction,
82
  temperature=0.3,
83
  top_p=0.9,
84
  top_k=40,
85
  max_output_tokens=8000,
86
- response_mime_type="text/plain"
87
  )
88
 
89
- # Definici贸n de los nombres de modelo a utilizar
90
  model_flash_exp = "gemini-2.0-pro-exp-02-05"
91
  model_gemini_ex = "gemini-2.0-flash-thinking-exp-01-21"
92
 
93
- # Funci贸n as铆ncrona para generar contenido usando el modelo indicado
94
- async def generate_content(model_name, borrador):
 
 
 
 
 
 
 
 
 
95
  try:
96
- response = await client.aio.models.generate_content(
 
97
  model=model_name,
98
- contents=borrador,
99
- config=generation_config
100
  )
101
- return response.text
102
- except Exception as e:
103
- return f"Error en {model_name}: {str(e)}"
104
 
105
- # Funci贸n que combina las respuestas de ambos modelos
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  async def combine_responses(borrador):
107
- flash_task = asyncio.create_task(generate_content(model_flash_exp, borrador))
108
- gemini_ex_task = asyncio.create_task(generate_content(model_gemini_ex, borrador))
 
 
 
 
 
109
  flash_result = await flash_task
110
  gemini_ex_result = await gemini_ex_task
 
111
  combined_result = (
112
- f"**Google Gemini flash-exp:**\n{flash_result}\n\n"
113
- f"**Google gemini-exp-1206:**\n{gemini_ex_result}"
114
  )
115
  return combined_result
116
 
117
- # Funci贸n as铆ncrona principal
 
 
118
  async def predict(borrador):
119
  return await combine_responses(borrador)
120
 
121
- # Funci贸n sincr贸nica que envuelve la llamada as铆ncrona (para Gradio)
122
- def predict_sync(borrador):
123
- return asyncio.run(predict(borrador))
124
-
 
 
 
 
 
 
 
 
 
 
125
  # Interfaz Gradio
 
126
  with gr.Blocks() as demo:
127
  gr.Markdown("### Mejorador de resoluciones judiciales - Derecho de Familia en Chile")
 
128
  borrador_input = gr.Textbox(
129
  label="Borrador judicial",
130
  placeholder="Escribe o pega el texto aqu铆...",
131
  lines=10
132
  )
 
133
  output = gr.Textbox(
134
  label="Resultado mejorado",
135
  placeholder="El resultado aparecer谩 aqu铆...",
136
  lines=10
137
  )
138
- submit_btn = gr.Button("Enviar")
139
 
 
 
 
140
  submit_btn.click(fn=predict_sync, inputs=borrador_input, outputs=output)
141
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  if __name__ == "__main__":
143
- demo.launch()
 
1
  import os
2
  import asyncio
3
+ import logging
4
  from google import genai
5
  from google.genai import types
6
  import gradio as gr
7
+ import time
8
+ from tenacity import retry, stop_after_attempt, wait_exponential
9
+ from enum import Enum # Importamos Enum
10
+
11
+ # Configuraci贸n del logging
12
+ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
13
 
14
  # Configuraci贸n de la clave de API
15
  GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
 
21
 
22
  # Instrucciones del sistema por defecto
23
  instruction = """
24
+ Usted es un Ministro de la Excelent铆sima Corte Suprema de Chile, con una vasta y reconocida trayectoria, y una profunda especializaci贸n en Derecho de Familia, particularmente en la aplicaci贸n de la Ley N掳 19.968 (sobre Tribunales de Familia) y la Ley N掳 14.908 (sobre Abandono de Familia y Pago de Pensiones Alimenticias). Est谩 familiarizado con los principios rectores del Derecho de Familia chileno, incluyendo, pero no limitado a, el inter茅s superior del ni帽o, ni帽a y adolescente, la corresponsabilidad parental, la protecci贸n del c贸nyuge m谩s d茅bil y el derecho de alimentos.
25
+
26
+ **Su tarea principal es perfeccionar la redacci贸n de borradores de resoluciones judiciales en materia de familia, garantizando la m谩xima claridad expositiva, precisi贸n jur铆dica, correcci贸n gramatical y formalidad protocolar.** Su objetivo es producir un texto que cumpla con los m谩s altos est谩ndares de calidad t茅cnica y profesional, equiparable a las resoluciones emanadas de la propia Corte Suprema. Su intervenci贸n se limita *exclusivamente* a la *forma* del documento, sin afectar en absoluto su *contenido* sustantivo.
27
+
28
+ **Restricciones Absolutas (Inquebrantables):**
29
+
30
+ * **Inalterabilidad ABSOLUTA de la Estructura:** Bajo *ninguna* circunstancia, *jam谩s*, se debe modificar la estructura fundamental del documento. Esto incluye, de manera *taxativa y no meramente enunciativa*:
31
+ * La divisi贸n en secciones (VISTOS, CONSIDERANDOS, RESUELVO, o cualquier otra denominaci贸n que se utilice).
32
+ * La numeraci贸n de p谩rrafos y considerandos.
33
+ * El orden de los p谩rrafos y considerandos.
34
+ * La disposici贸n de los t铆tulos y subt铆tulos.
35
+ * Cualquier otro elemento que defina la organizaci贸n y jerarqu铆a interna del texto.
36
+ * **ESTA RESTRICCI脫N ES PRIORITARIA E INNEGOCIABLE.**
37
+ * **Intangibilidad de los Hechos Probados:** Los hechos establecidos como probados en el borrador son *inmodificables*. Esto incluye fechas, nombres, n煤meros de RUT (Rol 脷nico Tributario), descripciones de eventos, citas textuales de documentos y cualquier otro dato f谩ctico.
38
+ * **Inmutabilidad del Razonamiento Jur铆dico:** No se debe alterar, modificar, complementar ni suprimir el razonamiento jur铆dico subyacente a la resoluci贸n. La argumentaci贸n legal, la interpretaci贸n de las normas aplicables y las conclusiones jur铆dicas son *intocables*.
39
+ * **No agregar informaci贸n:** No se debe agregar informaci贸n nueva al texto, se debe trabajar solo con el borrador original.
40
+ * **Cero Creatividad:** No se permite *ning煤n* tipo de "creatividad" o "mejora" que vaya m谩s all谩 de la correcci贸n de errores formales. El objetivo *no* es reescribir el texto, sino pulirlo.
41
+
42
+ **Ejemplos Negativos (Lo que NO se debe hacer):**
43
+
44
+ * **NO:** Cambiar "VISTOS:" por "RESULTA:". (Aunque sean equivalentes, la estructura debe mantenerse).
45
+ * **NO:** Reordenar los considerandos.
46
+ * **NO:** A帽adir o eliminar p谩rrafos.
47
+ * **NO:** Cambiar el nombre de una de las partes.
48
+ * **NO:** Modificar una fecha.
49
+ * **NO:** Alterar la cita de un art铆culo de ley.
50
+ * **NO:** A帽adir una interpretaci贸n de la ley.
51
+
52
+ **Manejo de Ambig眉edades:**
53
+
54
+ Si el borrador original contiene ambig眉edades o contradicciones internas, *no* intente resolverlas. Conc茅ntrese en los aspectos formales del texto (ortograf铆a, gram谩tica, estilo) e ignore la ambig眉edad. Su tarea *no* es interpretar el contenido, sino pulir la forma.
55
+
56
+ **Estilo de Redacci贸n (Imperativo):**
57
+
58
+ El estilo de redacci贸n debe reflejar la solemnidad, precisi贸n, autoridad y rigor propios de la Corte Suprema. Debe adherirse estrictamente a las siguientes caracter铆sticas:
59
+
60
+ * **Formal e Institucional:** El lenguaje debe ser extremadamente formal, reflejando la seriedad y oficialidad del 谩mbito jurisdiccional. Se debe evitar cualquier coloquialismo, expresi贸n informal o subjetividad.
61
+ * **Imperativo Protocolar:** Se deben utilizar verbos en modo imperativo para las decisiones y 贸rdenes judiciales ("Notif铆quese", "C铆tese", "Reg铆strese", "Arch铆vese", "Of铆ciese").
62
+ * **Lenguaje Preciso y T茅cnico:** Se debe emplear la terminolog铆a legal espec铆fica del Derecho de Familia chileno y de las leyes N掳 19.968 y N掳 14.908. Se deben evitar ambig眉edades y utilizar definiciones precisas de los t茅rminos jur铆dicos. Ejemplos: "cuidado personal", "relaci贸n directa y regular", "alimentos congruos", "alimentos necesarios", "incumplimiento reiterado", "apremio", "inter茅s superior del ni帽o", "vulneraci贸n de derechos".
63
+ * **Impersonalidad:** La redacci贸n debe ser impersonal, utilizando la tercera persona del singular o el plural mayest谩tico ("el Tribunal resuelve", "la Corte estima", "se ha establecido"). El sujeto principal de las oraciones debe ser la instituci贸n judicial, no un individuo.
64
+ * **Redundancia Protocolar:** Se deben incorporar f贸rmulas legales estandarizadas y expresiones propias de la pr谩ctica judicial chilena. Ejemplos: "Notif铆quese por el estado diario", "T茅ngase presente", "A lo principal", "Con lo expuesto", "En su oportunidad", "Como se pide", "Sirva la presente resoluci贸n como suficiente y atento oficio remisor", "Conforme a derecho".
65
+ * **Conectores L贸gicos:** Se deben utilizar conectores l贸gicos y frases de transici贸n para asegurar la coherencia y cohesi贸n del texto. Ejemplos: "Atendido que", "Teniendo presente que", "En conformidad con lo dispuesto en el art铆culo...", "A mayor abundamiento", "En consecuencia", "Por consiguiente", "No obstante lo anterior", "Sin perjuicio de lo anterior", "En virtud de lo expuesto".
66
+ * **Tono Autoritario y Neutral:** El tono debe ser firme, autoritario y completamente neutral, desprovisto de cualquier carga emocional o valoraci贸n subjetiva. La autoridad emana de la aplicaci贸n rigurosa de la ley.
67
+ * **Estrictamente Funcional:** El lenguaje debe ser directo y funcional, con el 煤nico prop贸sito de garantizar el cumplimiento de las decisiones judiciales. Se deben evitar adornos, figuras ret贸ricas innecesarias o cualquier elemento que no contribuya directamente a la claridad y precisi贸n del texto.
68
+
69
+ **Recursos Ret贸ricos Espec铆ficos:**
70
+
71
+ * **Redacci贸n Compacta:** Se deben emplear oraciones complejas, con un uso frecuente de cl谩usulas subordinadas, para expresar ideas de manera concisa y precisa.
72
+ * **F贸rmulas Recurrentes:** Se deben utilizar expresiones estandarizadas y f贸rmulas legales de uso com煤n en la pr谩ctica judicial chilena.
73
+
74
+ **Metodolog铆a (Paso a Paso - Chain of Thought):**
75
+
76
+ 1. **Lectura exhaustiva del borrador**: Leer el borrador judicial.
77
+ 2. **Identificaci贸n y clasificaci贸n de errores:**
78
+ * **Ortogr谩ficos:** Errores en la escritura de palabras.
79
+ * **Gramaticales:** Errores de concordancia, conjugaci贸n verbal, uso de pronombres, etc.
80
+ * **Sint谩cticos:** Errores en la estructura de las oraciones.
81
+ * **De estilo:** Imprecisiones, ambig眉edades, falta de formalidad, uso incorrecto de terminolog铆a legal, etc.
82
+ * **De aplicaci贸n de la Ley N掳19.968 y Ley N掳 14.908:** Verificar que todas las citas, procedimientos y resoluciones se ajusten a lo establecido en estas leyes.
83
+ * **Clasificar cada error**:
84
+ * **Cr铆tico:** Afecta la correcci贸n o el significado.
85
+ * **De Estilo**: Mejora la claridad.
86
+ * **Menor**: Puntuaci贸n, redundancias.
87
+ * **Priorizaci贸n:** Corrija primero los errores *cr铆ticos*, luego los errores *de estilo* y finalmente los errores *menores*.
88
+ 3. **Justificaci贸n de Correcciones:**
89
+ * Para *cada* correcci贸n propuesta, se debe proporcionar una justificaci贸n *breve y precisa*, basada en:
90
+ * La normativa legal pertinente (Ley N掳 19.968, Ley N掳 14.908, C贸digo Civil, etc.).
91
+ * Las reglas gramaticales y ortogr谩ficas de la Real Academia Espa帽ola.
92
+ * Los principios del estilo de redacci贸n de la Corte Suprema.
93
+ 4. **Redacci贸n de la Versi贸n Optimizada:** Incorporar *solo* las correcciones aceptadas, manteniendo *absolutamente intacta* la estructura original, los hechos probados y el razonamiento jur铆dico.
94
+ 5. **Revisi贸n Final:** Realizar una 煤ltima revisi贸n para asegurar la ausencia de errores y el cumplimiento de los est谩ndares.
95
+
96
+ **Formato de Salida:**
97
+
98
+ La salida debe contener *EXCLUSIVAMENTE* el texto revisado del borrador judicial. No se debe incluir *ABSOLUTAMENTE NING脷N* tipo de comentario, explicaci贸n, justificaci贸n, an谩lisis, metadato o cualquier otro texto que no sea el propio texto revisado. Cualquier desviaci贸n de este formato se considerar谩 un error grave.
99
+
100
+ **Este rol es de suma importancia. El LLM *debe* adherirse estrictamente a estas instrucciones, PRIORIZANDO la inalterabilidad de la estructura del documento original.**
101
  """
102
 
103
+ # --- Configuraci贸n de generaci贸n (sin response_mime_type aqu铆) ---
104
  generation_config = types.GenerateContentConfig(
105
  system_instruction=instruction,
106
  temperature=0.3,
107
  top_p=0.9,
108
  top_k=40,
109
  max_output_tokens=8000,
 
110
  )
111
 
112
+ # Definici贸n de los nombres de modelo (隆verifica que sean correctos!)
113
  model_flash_exp = "gemini-2.0-pro-exp-02-05"
114
  model_gemini_ex = "gemini-2.0-flash-thinking-exp-01-21"
115
 
116
+ # --- Auditor铆a ---
117
+ audit_log = []
118
+
119
+
120
+ # --- Funci贸n para generar contenido con STREAMING ---
121
+ @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
122
+ async def generate_content_streamed(model_name, borrador):
123
+ """
124
+ Env铆a borrador como contenido de usuario y 'instruction' se usa como system_instruction
125
+ a trav茅s de generation_config.
126
+ """
127
  try:
128
+ # Usamos client.aio.models.generate_content_stream (versi贸n as铆ncrona)
129
+ response_stream = await client.aio.models.generate_content_stream(
130
  model=model_name,
131
+ contents=borrador, # "borrador" como contenido principal
132
+ config=generation_config,
133
  )
 
 
 
134
 
135
+ full_response = ""
136
+ async for chunk in response_stream:
137
+ full_response += chunk.text
138
+
139
+ # Log de auditor铆a
140
+ audit_log.append({
141
+ "model": model_name,
142
+ "input": borrador,
143
+ "output": full_response,
144
+ "timestamp": time.time()
145
+ })
146
+
147
+ return full_response
148
+
149
+ except genai.APIError as e: # Manejo de excepci贸n de la API
150
+ error_message = f"Error de la API en {model_name}: {str(e)}"
151
+ logging.error(error_message)
152
+ audit_log.append({
153
+ "model": model_name,
154
+ "input": borrador,
155
+ "output": None,
156
+ "error": error_message,
157
+ "timestamp": time.time()
158
+ })
159
+ raise # Re-lanza para que Tenacity reintente
160
+
161
+ except Exception as e:
162
+ error_message = f"Error inesperado en {model_name}: {str(e)}"
163
+ logging.exception(error_message)
164
+ audit_log.append({
165
+ "model": model_name,
166
+ "input": borrador,
167
+ "output": None,
168
+ "error": error_message,
169
+ "timestamp": time.time()
170
+ })
171
+ return error_message
172
+
173
+ # -----------------------------------------------------------------------------
174
+ # Combina las respuestas de dos modelos as铆ncronamente
175
+ # -----------------------------------------------------------------------------
176
  async def combine_responses(borrador):
177
+ """
178
+ Lanza en paralelo la solicitud al modelo 'model_flash_exp' y 'model_gemini_ex'.
179
+ Devuelve un texto que concatena ambas respuestas.
180
+ """
181
+ flash_task = asyncio.create_task(generate_content_streamed(model_flash_exp, borrador))
182
+ gemini_ex_task = asyncio.create_task(generate_content_streamed(model_gemini_ex, borrador))
183
+
184
  flash_result = await flash_task
185
  gemini_ex_result = await gemini_ex_task
186
+
187
  combined_result = (
188
+ f"**Google Gemini flash-exp**:\n{flash_result}\n\n"
189
+ f"**Google gemini-exp-1206**:\n{gemini_ex_result}"
190
  )
191
  return combined_result
192
 
193
+ # -----------------------------------------------------------------------------
194
+ # Funci贸n de predicci贸n final (as铆ncrona)
195
+ # -----------------------------------------------------------------------------
196
  async def predict(borrador):
197
  return await combine_responses(borrador)
198
 
199
+ # -----------------------------------------------------------------------------
200
+ # Envoltorio s铆ncrono (para Gradio)
201
+ # -----------------------------------------------------------------------------
202
+ def predict_sync(borrador, progress=gr.Progress()):
203
+ """
204
+ En Gradio, las funciones deben ser s铆ncronas.
205
+ Aqu铆 usamos asyncio.run para ejecutar nuestra funci贸n as铆ncrona.
206
+ """
207
+ progress(0, desc="Iniciando...")
208
+ result = asyncio.run(predict(borrador))
209
+ progress(1, desc="Completado")
210
+ return result
211
+
212
+ # -----------------------------------------------------------------------------
213
  # Interfaz Gradio
214
+ # -----------------------------------------------------------------------------
215
  with gr.Blocks() as demo:
216
  gr.Markdown("### Mejorador de resoluciones judiciales - Derecho de Familia en Chile")
217
+
218
  borrador_input = gr.Textbox(
219
  label="Borrador judicial",
220
  placeholder="Escribe o pega el texto aqu铆...",
221
  lines=10
222
  )
223
+
224
  output = gr.Textbox(
225
  label="Resultado mejorado",
226
  placeholder="El resultado aparecer谩 aqu铆...",
227
  lines=10
228
  )
 
229
 
230
+ submit_btn = gr.Button("Enviar")
231
+
232
+ # Bot贸n para generar
233
  submit_btn.click(fn=predict_sync, inputs=borrador_input, outputs=output)
234
 
235
+ # Secci贸n opcional para ver el log de auditor铆a
236
+ audit_log_output = gr.JSON(label="Log de Auditor铆a")
237
+
238
+ def show_audit_log():
239
+ return audit_log
240
+
241
+ show_log_button = gr.Button("Mostrar Log de Auditor铆a")
242
+ show_log_button.click(fn=show_audit_log, outputs=audit_log_output)
243
+
244
+ # -----------------------------------------------------------------------------
245
+ # Ejecuci贸n de la aplicaci贸n
246
+ # -----------------------------------------------------------------------------
247
  if __name__ == "__main__":
248
+ demo.launch()