eberhenriquez94 commited on
Commit
70958f3
verified
1 Parent(s): 9061ed6
Files changed (1) hide show
  1. app.py +59 -97
app.py CHANGED
@@ -1,117 +1,94 @@
1
  import os
2
- import google.generativeai as genai
3
- import gradio as gr
4
  from openai import OpenAI
 
5
  from gradio_agentchatbot import AgentChatbot, ChatMessage, ThoughtMetadata
6
 
7
  # Configuraci贸n de claves de API
8
- OPENAI_API_KEY = os.getenv("API_KEY")
9
- GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
10
-
11
- if not OPENAI_API_KEY or not GOOGLE_API_KEY:
12
- raise ValueError("Las claves de API no est谩n configuradas. Aseg煤rate de establecer 'API_KEY' y 'GOOGLE_API_KEY'.")
13
-
14
- # Configuraci贸n de OpenAI y Google Generative AI
15
- client = OpenAI(base_url="https://integrate.api.nvidia.com/v1", api_key=OPENAI_API_KEY)
16
- genai.configure(api_key=GOOGLE_API_KEY)
17
-
18
- # Inicializaci贸n de modelos
19
- google_model = genai.GenerativeModel(
20
- model_name="gemini-1.5-flash",
21
- system_instruction="""
22
- Asume el rol de Ministro de la Corte Suprema de Chile especializado en Derecho de Familia. Tu prop贸sito es mejorar, perfeccionar y llevar al m谩s alto nivel de redacci贸n jur铆dica el borrador de una resoluci贸n judicial, siguiendo principios de estilo que aseguren claridad, precisi贸n, concisi贸n y formalidad sin modificar la sustancia, fundamentos ni contenido esencial de la decisi贸n. Mant茅n un tono formal, t茅cnico, imparcial y riguroso, propio de la Corte Suprema.
23
-
24
- Identidad y Prop贸sito: Eres un asistente de IA que opera como un Ministro de la Corte Suprema de Chile, especializado en Derecho de Familia. Act煤as con la autoridad y formalidad judicial necesarias para revisar y perfeccionar borradores de resoluciones judiciales. Cada fase del flujo debe cumplir con los est谩ndares de claridad, precisi贸n, concisi贸n y formalidad del lenguaje judicial chileno sin alterar la esencia ni los fundamentos de las decisiones.
25
-
26
- Principios Generales para la Redacci贸n Jur铆dica:
27
- * Tono Formal y T茅cnico: Mant茅n un tono formal, autoritario e impersonal. Emplea el modo imperativo en expresiones de orden y mandato judicial, como 'Notif铆quese', 'Arch铆vese' o 'C铆tese'. Proyecta neutralidad y profesionalismo en todo el texto; evita cualquier tono subjetivo o interpretativo.
28
- * Precisi贸n y Claridad: Usa terminolog铆a jur铆dica espec铆fica del Derecho de Familia, como 'patria potestad', 'derecho de visitas' o 'pensi贸n alimenticia', evitando sin贸nimos menos t茅cnicos. Asegura que cada enunciado sea claro y preciso, sin ambig眉edades que puedan dar lugar a interpretaciones err贸neas.
29
- * Concisi贸n y Econom铆a de Palabras: Emplea una redacci贸n directa, donde cada palabra tenga una funci贸n clara. Evita redundancias y expresiones superfluas para facilitar una comprensi贸n inmediata y sin distracciones.
30
- * Uso de T茅rminos y Expresiones Propios del Derecho Chileno: Utiliza expresiones tradicionales y formales del 谩mbito judicial chileno, como 'Notif铆quese por el estado diario'. En conclusiones y firmas, emplea frases est谩ndar del lenguaje jur铆dico chileno, como 'Provey贸 y firm贸 el Juez mediante firma electr贸nica avanzada'.
31
-
32
- # Pasos
33
-
34
- 1. **Lectura y An谩lisis del Borrador:** Revisa el borrador completo de la resoluci贸n judicial para entender el contexto, los argumentos presentados y la decisi贸n tomada. Identifica 谩reas que requieran mejoras en t茅rminos de claridad, precisi贸n, concisi贸n y formalidad.
35
- 2. **Aplicaci贸n del Tono Formal y T茅cnico:** Aseg煤rate de que el lenguaje utilizado sea apropiado para una resoluci贸n judicial de la Corte Suprema. Utiliza el modo imperativo en los mandatos judiciales. Elimina cualquier expresi贸n coloquial o subjetiva, reemplaz谩ndola con un lenguaje t茅cnico y neutral.
36
- 3. **Mejora de la Precisi贸n y Claridad:** Verifica que la terminolog铆a jur铆dica utilizada sea espec铆fica y correcta, especialmente aquella relacionada con el Derecho de Familia. Revisa cada enunciado para eliminar ambig眉edades y asegurar que la intenci贸n de la corte sea clara e inequ铆voca.
37
- 4. **Asegurar la Concisi贸n y Econom铆a de Palabras:** Revisa cada frase y p谩rrafo para eliminar redundancias y expresiones innecesarias. Simplifica la estructura de las oraciones sin perder la precisi贸n, asegurando que cada palabra contribuya al significado del texto.
38
- 5. **Uso Adecuado de T茅rminos y Expresiones Judiciales Chilenas:** Incorpora o revisa las expresiones formales tradicionales del 谩mbito judicial chileno, asegurando que se utilicen correctamente y en el contexto adecuado. Verifica que las conclusiones y firmas sigan el formato est谩ndar del lenguaje jur铆dico chileno.
39
- 6. **Revisi贸n Final y Correcci贸n:** Realiza una revisi贸n final del documento para asegurar que todas las modificaciones se hayan implementado correctamente y que la resoluci贸n mantenga su coherencia y l贸gica. Corrige cualquier error gramatical o de estilo que pueda haber quedado.
40
-
41
- # Formato de Salida
42
 
43
- La salida ser谩 el borrador de la resoluci贸n judicial revisado y mejorado, presentado en formato de texto. El texto debe mantener el formato y la estructura original del borrador, pero con las mejoras estil铆sticas y de lenguaje implementadas seg煤n las directrices proporcionadas.
 
44
 
45
- # Notas
 
 
 
 
46
 
47
- Es crucial que el asistente de IA se adhiera estrictamente a las instrucciones, sin alterar la sustancia de la decisi贸n judicial. El objetivo es perfeccionar la redacci贸n, no modificar el contenido. Se debe mantener la formalidad y el rigor caracter铆stico de los documentos de la Corte Suprema de Chile.
48
- """.strip(),
49
- generation_config={
50
- "temperature": 0.5,
51
- "top_p": 0.7,
52
- "top_k": 40,
53
- "max_output_tokens": 4000,
54
- "response_mime_type": "text/plain",
55
- },
56
  )
57
 
58
- # Mensaje del sistema para OpenAI
59
- system_message_openai = {
60
  "role": "system",
61
  "content": """
62
- Eres un asistente de IA que act煤a como Ministro de la Corte Suprema de Chile especializado en Derecho de Familia. Tu tarea es revisar y mejorar borradores de resoluciones judiciales, asegurando claridad, precisi贸n y formalidad.
63
- """,
 
64
  }
65
 
66
- # Funci贸n para interactuar con OpenAI
67
- def llama_response(prompt: str, messages: list[ChatMessage]):
68
  if not prompt.strip():
69
  messages.append(ChatMessage(role="assistant", content="Por favor, ingresa un texto v谩lido."))
70
  return messages
71
 
72
  # Agregar mensaje del usuario al historial
73
- metadata_user = ThoughtMetadata(tool_name="OpenAI")
74
  messages.append(ChatMessage(role="user", content=prompt, thought_metadata=metadata_user))
75
 
76
- # Generar respuesta del modelo OpenAI
77
  try:
78
- user_message = {"role": "user", "content": prompt}
79
- completion = client.chat.completions.create(
80
  model="meta/llama-3.1-405b-instruct",
81
- messages=[system_message_openai, user_message],
82
- temperature=0.8,
83
  top_p=0.7,
84
- max_tokens=4000,
 
85
  )
 
 
 
 
86
 
87
- response = completion["choices"][0]["message"]["content"]
88
- metadata_assistant = ThoughtMetadata(tool_name="OpenAI")
89
- messages.append(ChatMessage(role="assistant", content=response, thought_metadata=metadata_assistant))
90
-
91
  except Exception as e:
92
- error_message = f"Error al procesar la solicitud con OpenAI: {e}"
93
  messages.append(ChatMessage(role="assistant", content=error_message))
94
 
95
  return messages
96
 
97
- # Funci贸n para interactuar con Google Generative AI
98
  def gemini_response(prompt: str, messages: list[ChatMessage]):
99
  if not prompt.strip():
100
  messages.append(ChatMessage(role="assistant", content="Por favor, ingresa un texto v谩lido."))
101
  return messages
102
 
103
  # Agregar mensaje del usuario al historial
104
- metadata_user = ThoughtMetadata(tool_name="Google Generative AI")
105
  messages.append(ChatMessage(role="user", content=prompt, thought_metadata=metadata_user))
106
 
107
- # Generar respuesta del modelo Google
108
  try:
109
- response = google_model.generate_content(prompt)
110
- metadata_assistant = ThoughtMetadata(tool_name="Google Generative AI")
111
- messages.append(ChatMessage(role="assistant", content=response.text, thought_metadata=metadata_assistant))
 
 
 
 
 
 
112
 
 
 
113
  except Exception as e:
114
- error_message = f"Error al procesar la solicitud con Google Generative AI: {e}"
115
  messages.append(ChatMessage(role="assistant", content=error_message))
116
 
117
  return messages
@@ -119,51 +96,37 @@ def gemini_response(prompt: str, messages: list[ChatMessage]):
119
  # Descripci贸n de la aplicaci贸n
120
  description = """
121
  # Ministro IA de la Corte Suprema - Derecho de Familia
122
- Este espacio utiliza OpenAI y Google Generative AI para mejorar borradores de resoluciones judiciales en Derecho de Familia chileno.
123
-
124
- ### Instrucciones:
125
- 1. Ingresa el borrador de la resoluci贸n judicial en el cuadro de texto.
126
- 2. Selecciona el modelo que deseas usar (OpenAI o Google).
127
- 3. Haz clic en "Submit" para recibir la versi贸n mejorada.
128
  """
129
 
130
  # Ejemplos
131
  examples = [
132
  ["El juez decide que el pap谩 puede ver a su hijo los fines de semana."],
133
  ["Se ordena pagarle una pensi贸n a la mam谩 para los gastos del ni帽o."],
134
- ["El pap谩 tiene que pagar la mitad de los gastos del colegio."],
135
- ["Yo creo que lo mejor para el ni帽o es..."]
136
  ]
137
 
138
  # Interfaz de usuario con Gradio
139
  with gr.Blocks() as demo:
140
  gr.Markdown(description)
141
-
142
- with gr.Row():
143
- gr.Image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers-logo.png", width=100) # Logo opcional
144
- gr.Markdown("### IA para Mejorar Resoluciones Judiciales")
145
-
146
  chatbot = AgentChatbot(label="Resoluci贸n Mejorada", avatar_images=("user.png", "bot.png"))
147
  text_input = gr.Textbox(
148
  lines=10,
149
  label="Borrador de la Resoluci贸n",
150
  placeholder="Ingrese el borrador aqu铆...",
151
  )
 
 
152
  modelo_selector = gr.Radio(
153
- choices=["OpenAI", "Google Generative AI"],
154
  label="Selecciona el modelo",
155
- value="OpenAI"
156
  )
157
- estado = gr.Label(label="Estado")
158
-
159
- # Botones de interacci贸n
160
- with gr.Row():
161
- submit_button = gr.Button("Submit")
162
- clear_button = gr.Button("Limpiar")
163
 
164
- # L贸gica de los botones
165
  submit_button.click(
166
- lambda prompt, modelo, messages: llama_response(prompt, messages) if modelo == "OpenAI" else gemini_response(prompt, messages),
167
  inputs=[text_input, modelo_selector, chatbot],
168
  outputs=[chatbot],
169
  )
@@ -173,9 +136,8 @@ with gr.Blocks() as demo:
173
  gr.Examples(
174
  examples=examples,
175
  inputs=[text_input],
176
- label="Ejemplos de Borradores",
177
  )
178
 
179
  # Ejecutar la aplicaci贸n
180
  if __name__ == "__main__":
181
- demo.launch()
 
1
  import os
 
 
2
  from openai import OpenAI
3
+ import gradio as gr
4
  from gradio_agentchatbot import AgentChatbot, ChatMessage, ThoughtMetadata
5
 
6
  # Configuraci贸n de claves de API
7
+ NVIDIA_API_KEY = os.getenv("NVIDIA_API_KEY")
8
+ GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
+ if not NVIDIA_API_KEY or not GEMINI_API_KEY:
11
+ raise ValueError("Las claves de API no est谩n configuradas. Aseg煤rate de establecer 'NVIDIA_API_KEY' y 'GEMINI_API_KEY'.")
12
 
13
+ # Configuraci贸n de clientes
14
+ nvidia_client = OpenAI(
15
+ base_url="https://integrate.api.nvidia.com/v1",
16
+ api_key=NVIDIA_API_KEY,
17
+ )
18
 
19
+ gemini_client = OpenAI(
20
+ api_key=GEMINI_API_KEY,
21
+ base_url="https://generativelanguage.googleapis.com/v1beta/openai/",
 
 
 
 
 
 
22
  )
23
 
24
+ # Mensaje de sistema
25
+ system_message = {
26
  "role": "system",
27
  "content": """
28
+ Asume el rol de Ministro de la Corte Suprema de Chile especializado en Derecho de Familia. Tu prop贸sito es mejorar, perfeccionar y llevar al m谩s alto nivel de redacci贸n jur铆dica el borrador de una resoluci贸n judicial, siguiendo principios de estilo que aseguren claridad, precisi贸n, concisi贸n y formalidad sin modificar la sustancia, fundamentos ni contenido esencial de la decisi贸n. Mant茅n un tono formal, t茅cnico, imparcial y riguroso, propio de la Corte Suprema.
29
+ [... m谩s detalles como en el prompt proporcionado ...]
30
+ """.strip(),
31
  }
32
 
33
+ # Funci贸n para interactuar con NVIDIA API
34
+ def nvidia_response(prompt: str, messages: list[ChatMessage]):
35
  if not prompt.strip():
36
  messages.append(ChatMessage(role="assistant", content="Por favor, ingresa un texto v谩lido."))
37
  return messages
38
 
39
  # Agregar mensaje del usuario al historial
40
+ metadata_user = ThoughtMetadata(tool_name="NVIDIA")
41
  messages.append(ChatMessage(role="user", content=prompt, thought_metadata=metadata_user))
42
 
43
+ # Generar respuesta con NVIDIA API
44
  try:
45
+ completion = nvidia_client.chat.completions.create(
 
46
  model="meta/llama-3.1-405b-instruct",
47
+ messages=[system_message, {"role": "user", "content": prompt}],
48
+ temperature=0.2,
49
  top_p=0.7,
50
+ max_tokens=1024,
51
+ stream=True,
52
  )
53
+ response_content = ""
54
+ for chunk in completion:
55
+ if chunk.choices[0].delta.content is not None:
56
+ response_content += chunk.choices[0].delta.content
57
 
58
+ metadata_assistant = ThoughtMetadata(tool_name="NVIDIA")
59
+ messages.append(ChatMessage(role="assistant", content=response_content, thought_metadata=metadata_assistant))
 
 
60
  except Exception as e:
61
+ error_message = f"Error al procesar la solicitud con NVIDIA API: {e}"
62
  messages.append(ChatMessage(role="assistant", content=error_message))
63
 
64
  return messages
65
 
66
+ # Funci贸n para interactuar con Gemini API
67
  def gemini_response(prompt: str, messages: list[ChatMessage]):
68
  if not prompt.strip():
69
  messages.append(ChatMessage(role="assistant", content="Por favor, ingresa un texto v谩lido."))
70
  return messages
71
 
72
  # Agregar mensaje del usuario al historial
73
+ metadata_user = ThoughtMetadata(tool_name="Gemini")
74
  messages.append(ChatMessage(role="user", content=prompt, thought_metadata=metadata_user))
75
 
76
+ # Generar respuesta con Gemini API
77
  try:
78
+ response = gemini_client.chat.completions.create(
79
+ model="gemini-1.5-flash",
80
+ messages=[system_message, {"role": "user", "content": prompt}],
81
+ stream=True,
82
+ )
83
+ response_content = ""
84
+ for chunk in response:
85
+ if chunk.choices[0].delta.content is not None:
86
+ response_content += chunk.choices[0].delta.content
87
 
88
+ metadata_assistant = ThoughtMetadata(tool_name="Gemini")
89
+ messages.append(ChatMessage(role="assistant", content=response_content, thought_metadata=metadata_assistant))
90
  except Exception as e:
91
+ error_message = f"Error al procesar la solicitud con Gemini API: {e}"
92
  messages.append(ChatMessage(role="assistant", content=error_message))
93
 
94
  return messages
 
96
  # Descripci贸n de la aplicaci贸n
97
  description = """
98
  # Ministro IA de la Corte Suprema - Derecho de Familia
99
+ Este espacio utiliza NVIDIA y Gemini APIs para mejorar borradores de resoluciones judiciales en Derecho de Familia chileno.
 
 
 
 
 
100
  """
101
 
102
  # Ejemplos
103
  examples = [
104
  ["El juez decide que el pap谩 puede ver a su hijo los fines de semana."],
105
  ["Se ordena pagarle una pensi贸n a la mam谩 para los gastos del ni帽o."],
 
 
106
  ]
107
 
108
  # Interfaz de usuario con Gradio
109
  with gr.Blocks() as demo:
110
  gr.Markdown(description)
 
 
 
 
 
111
  chatbot = AgentChatbot(label="Resoluci贸n Mejorada", avatar_images=("user.png", "bot.png"))
112
  text_input = gr.Textbox(
113
  lines=10,
114
  label="Borrador de la Resoluci贸n",
115
  placeholder="Ingrese el borrador aqu铆...",
116
  )
117
+
118
+ # Botones y selector
119
  modelo_selector = gr.Radio(
120
+ choices=["NVIDIA", "Gemini"],
121
  label="Selecciona el modelo",
122
+ value="NVIDIA"
123
  )
124
+ submit_button = gr.Button("Submit")
125
+ clear_button = gr.Button("Limpiar")
 
 
 
 
126
 
127
+ # Enlazar acciones a botones
128
  submit_button.click(
129
+ lambda prompt, modelo, messages: nvidia_response(prompt, messages) if modelo == "NVIDIA" else gemini_response(prompt, messages),
130
  inputs=[text_input, modelo_selector, chatbot],
131
  outputs=[chatbot],
132
  )
 
136
  gr.Examples(
137
  examples=examples,
138
  inputs=[text_input],
 
139
  )
140
 
141
  # Ejecutar la aplicaci贸n
142
  if __name__ == "__main__":
143
+ demo.launch()