eberhenriquez94 commited on
Commit
7fa7b61
·
verified ·
1 Parent(s): 991684f
Files changed (1) hide show
  1. app.py +23 -105
app.py CHANGED
@@ -1,28 +1,15 @@
1
  import os
2
  import asyncio
3
- import logging
4
- import httpx
5
  from google import genai
6
  from google.genai import types
7
  import gradio as gr
8
- import time
9
- from enum import Enum # Si se requiere para enumeraciones
10
 
11
- # -----------------------------------------------------------------------------
12
- # Configuración del logging
13
- # -----------------------------------------------------------------------------
14
- logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
15
-
16
- # -----------------------------------------------------------------------------
17
- # Configuración de la clave de API de Gemini Developer
18
- # -----------------------------------------------------------------------------
19
  GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
20
  if not GEMINI_API_KEY:
21
  raise ValueError("La clave GEMINI_API_KEY no está configurada correctamente.")
22
 
23
- # -----------------------------------------------------------------------------
24
- # Creación del cliente (Gemini Developer API)
25
- # -----------------------------------------------------------------------------
26
  client = genai.Client(api_key=GEMINI_API_KEY)
27
 
28
  # -----------------------------------------------------------------------------
@@ -108,137 +95,68 @@ La salida debe contener *EXCLUSIVAMENTE* el texto revisado del borrador judicial
108
  Este rol es de suma importancia. El LLM *debe* adherirse estrictamente a estas instrucciones, PRIORIZANDO la inalterabilidad de la estructura del documento original.
109
  """
110
 
111
- # -----------------------------------------------------------------------------
112
- # Configuración de generación (se utiliza system_instruction en generation_config)
113
- # -----------------------------------------------------------------------------
114
  generation_config = types.GenerateContentConfig(
115
  system_instruction=instruction,
116
  temperature=0.3,
117
  top_p=0.9,
118
  top_k=40,
119
  max_output_tokens=8000,
 
120
  )
121
 
122
- # -----------------------------------------------------------------------------
123
- # Nombres (o IDs) de los modelos a utilizar
124
- # -----------------------------------------------------------------------------
125
  model_flash_exp = "gemini-2.0-pro-exp-02-05"
126
  model_gemini_ex = "gemini-2.0-flash-thinking-exp-01-21"
127
 
128
- # -----------------------------------------------------------------------------
129
- # Auditoría
130
- # -----------------------------------------------------------------------------
131
- audit_log = []
132
-
133
- # -----------------------------------------------------------------------------
134
- # Función asíncrona para generación de contenido con Streaming
135
- # -----------------------------------------------------------------------------
136
- async def generate_content_streamed(model_name, borrador):
137
  try:
138
- response_stream = await client.aio.models.generate_content_stream(
139
  model=model_name,
140
- contents=borrador, # Se envía solo el borrador; system_instruction está en generation_config
141
- config=generation_config,
142
  )
143
-
144
- full_response = ""
145
- async for chunk in response_stream:
146
- full_response += chunk.text
147
-
148
- audit_log.append({
149
- "model": model_name,
150
- "input": borrador,
151
- "output": full_response,
152
- "timestamp": time.time()
153
- })
154
- return full_response
155
-
156
- except httpx.ReadTimeout as e:
157
- error_message = f"Error de tiempo de espera (ReadTimeout) en {model_name}: {str(e)}"
158
- logging.error(error_message)
159
- audit_log.append({
160
- "model": model_name,
161
- "input": borrador,
162
- "output": None,
163
- "error": error_message,
164
- "timestamp": time.time()
165
- })
166
- return error_message
167
-
168
  except Exception as e:
169
- error_message = f"Error inesperado en {model_name}: {str(e)}"
170
- logging.exception(error_message)
171
- audit_log.append({
172
- "model": model_name,
173
- "input": borrador,
174
- "output": None,
175
- "error": error_message,
176
- "timestamp": time.time()
177
- })
178
- return error_message
179
 
180
- # -----------------------------------------------------------------------------
181
- # Combina las respuestas de dos modelos asíncronamente
182
- # -----------------------------------------------------------------------------
183
  async def combine_responses(borrador):
184
- flash_task = asyncio.create_task(generate_content_streamed(model_flash_exp, borrador))
185
- gemini_ex_task = asyncio.create_task(generate_content_streamed(model_gemini_ex, borrador))
186
-
187
  flash_result = await flash_task
188
  gemini_ex_result = await gemini_ex_task
189
-
190
  combined_result = (
191
- f"**Google Gemini flash-exp**:\n{flash_result}\n\n"
192
- f"**Google gemini-exp-1206**:\n{gemini_ex_result}"
193
  )
194
  return combined_result
195
 
196
- # -----------------------------------------------------------------------------
197
- # Función de predicción final (asíncrona)
198
- # -----------------------------------------------------------------------------
199
  async def predict(borrador):
200
  return await combine_responses(borrador)
201
 
202
- # -----------------------------------------------------------------------------
203
- # Envoltorio síncrono (para Gradio)
204
- # -----------------------------------------------------------------------------
205
- def predict_sync(borrador, progress=gr.Progress()):
206
- progress(0, desc="Iniciando...")
207
- result = asyncio.run(predict(borrador))
208
- progress(1, desc="Completado")
209
- return result
210
 
211
- # -----------------------------------------------------------------------------
212
  # Interfaz Gradio
213
- # -----------------------------------------------------------------------------
214
  with gr.Blocks() as demo:
215
  gr.Markdown("### Mejorador de resoluciones judiciales - Derecho de Familia en Chile")
216
-
217
  borrador_input = gr.Textbox(
218
  label="Borrador judicial",
219
  placeholder="Escribe o pega el texto aquí...",
220
  lines=10
221
  )
222
-
223
  output = gr.Textbox(
224
  label="Resultado mejorado",
225
  placeholder="El resultado aparecerá aquí...",
226
  lines=10
227
  )
228
-
229
  submit_btn = gr.Button("Enviar")
 
230
  submit_btn.click(fn=predict_sync, inputs=borrador_input, outputs=output)
231
 
232
- # Sección opcional para ver el log de auditoría
233
- audit_log_output = gr.JSON(label="Log de Auditoría")
234
- def show_audit_log():
235
- return audit_log
236
-
237
- show_log_button = gr.Button("Mostrar Log de Auditoría")
238
- show_log_button.click(fn=show_audit_log, outputs=audit_log_output)
239
-
240
- # -----------------------------------------------------------------------------
241
- # Ejecución de la aplicación
242
- # -----------------------------------------------------------------------------
243
  if __name__ == "__main__":
244
- demo.launch()
 
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")
9
  if not GEMINI_API_KEY:
10
  raise ValueError("La clave GEMINI_API_KEY no está configurada correctamente.")
11
 
12
+ # Se crea el cliente de la SDK para Gemini Developer API
 
 
13
  client = genai.Client(api_key=GEMINI_API_KEY)
14
 
15
  # -----------------------------------------------------------------------------
 
95
  Este rol es de suma importancia. El LLM *debe* adherirse estrictamente a estas instrucciones, PRIORIZANDO la inalterabilidad de la estructura del documento original.
96
  """
97
 
98
+ # Configuración común de generación para ambos modelos
 
 
99
  generation_config = types.GenerateContentConfig(
100
  system_instruction=instruction,
101
  temperature=0.3,
102
  top_p=0.9,
103
  top_k=40,
104
  max_output_tokens=8000,
105
+ response_mime_type="text/plain"
106
  )
107
 
108
+ # Definición de los nombres de modelo a utilizar
 
 
109
  model_flash_exp = "gemini-2.0-pro-exp-02-05"
110
  model_gemini_ex = "gemini-2.0-flash-thinking-exp-01-21"
111
 
112
+ # Función asíncrona para generar contenido usando el modelo indicado
113
+ async def generate_content(model_name, borrador):
 
 
 
 
 
 
 
114
  try:
115
+ response = await client.aio.models.generate_content(
116
  model=model_name,
117
+ contents=borrador,
118
+ config=generation_config
119
  )
120
+ return response.text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  except Exception as e:
122
+ return f"Error en {model_name}: {str(e)}"
 
 
 
 
 
 
 
 
 
123
 
124
+ # Función que combina las respuestas de ambos modelos
 
 
125
  async def combine_responses(borrador):
126
+ flash_task = asyncio.create_task(generate_content(model_flash_exp, borrador))
127
+ gemini_ex_task = asyncio.create_task(generate_content(model_gemini_ex, borrador))
 
128
  flash_result = await flash_task
129
  gemini_ex_result = await gemini_ex_task
 
130
  combined_result = (
131
+ f"**Google Gemini flash-exp:**\n{flash_result}\n\n"
132
+ f"**Google gemini-exp-1206:**\n{gemini_ex_result}"
133
  )
134
  return combined_result
135
 
136
+ # Función asíncrona principal
 
 
137
  async def predict(borrador):
138
  return await combine_responses(borrador)
139
 
140
+ # Función sincrónica que envuelve la llamada asíncrona (para Gradio)
141
+ def predict_sync(borrador):
142
+ return asyncio.run(predict(borrador))
 
 
 
 
 
143
 
 
144
  # Interfaz Gradio
 
145
  with gr.Blocks() as demo:
146
  gr.Markdown("### Mejorador de resoluciones judiciales - Derecho de Familia en Chile")
 
147
  borrador_input = gr.Textbox(
148
  label="Borrador judicial",
149
  placeholder="Escribe o pega el texto aquí...",
150
  lines=10
151
  )
 
152
  output = gr.Textbox(
153
  label="Resultado mejorado",
154
  placeholder="El resultado aparecerá aquí...",
155
  lines=10
156
  )
 
157
  submit_btn = gr.Button("Enviar")
158
+
159
  submit_btn.click(fn=predict_sync, inputs=borrador_input, outputs=output)
160
 
 
 
 
 
 
 
 
 
 
 
 
161
  if __name__ == "__main__":
162
+ demo.launch()