Spaces:
Running
Running
eberhenriquez94
commited on
Commit
•
507ff0e
1
Parent(s):
520ee40
app.py
CHANGED
@@ -1,93 +1,133 @@
|
|
1 |
-
import gradio as gr
|
2 |
import os
|
|
|
|
|
3 |
from openai import OpenAI
|
4 |
-
from gradio_agentchatbot import AgentChatbot, ChatMessage
|
5 |
|
6 |
-
#
|
7 |
-
|
8 |
-
|
9 |
-
raise ValueError("La variable de entorno 'API_KEY' no está configurada.")
|
10 |
|
11 |
-
|
12 |
-
|
13 |
|
14 |
-
#
|
15 |
-
|
16 |
-
|
17 |
-
"content": """
|
18 |
-
Actúa como un Ministro de la Corte Suprema de Chile, especializado en Derecho de Familia. Tu tarea es perfeccionar la redacción de un borrador de resolución judicial. Debes lograr claridad, precisión, concisión y formalidad, **sin alterar la sustancia de la decisión.**
|
19 |
|
20 |
-
|
|
|
|
|
|
|
|
|
21 |
|
22 |
-
|
23 |
-
2. **Elimina redundancias y frases innecesarias.** Simplifica las oraciones manteniendo el significado original.
|
24 |
-
3. **Utiliza un tono formal e impersonal.** Evita expresiones subjetivas o coloquiales. Expresa las decisiones de forma objetiva y concisa.
|
25 |
-
4. **Usa expresiones judiciales chilenas estándar, especialmente en conclusiones y firmas.** (ej., "Proveyó y firmó el Juez mediante firma electrónica avanzada").
|
26 |
-
5. **Mantén la estructura original del borrador.** No reordenes párrafos ni secciones.
|
27 |
|
28 |
-
|
|
|
|
|
|
|
|
|
29 |
|
30 |
-
|
31 |
-
Reformular a: "Se establece un régimen de visitas del menor con su padre los fines de semana."
|
32 |
-
- Borrador: "Se ordena pagarle una pensión a la mamá para los gastos del niño."
|
33 |
-
Reformular a: "Se fija una pensión alimenticia a favor de la demandante para la manutención del menor."
|
34 |
-
- Borrador: "El papá tiene que pagar la mitad de los gastos del colegio."
|
35 |
-
Reformular a: "Se establece que ambos padres contribuirán en partes iguales al pago de los gastos educacionales del menor."
|
36 |
-
- Borrador: "Yo creo que lo mejor para el niño es..."
|
37 |
-
Reformular a: "Se considera que la mejor opción para el bienestar del menor es..."
|
38 |
|
39 |
-
|
|
|
|
|
|
|
|
|
|
|
40 |
|
41 |
-
|
42 |
-
- No interpretes ni amplíes el contenido existente.
|
43 |
-
- No incluyas análisis o comentarios personales.
|
44 |
|
45 |
-
|
46 |
|
47 |
-
|
48 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
}
|
50 |
|
51 |
-
|
52 |
-
|
53 |
-
|
|
|
|
|
54 |
|
55 |
-
|
|
|
|
|
56 |
|
|
|
57 |
try:
|
|
|
58 |
completion = client.chat.completions.create(
|
59 |
model="meta/llama-3.1-405b-instruct",
|
60 |
-
messages=[
|
61 |
temperature=0.8,
|
62 |
top_p=0.7,
|
63 |
max_tokens=4000,
|
64 |
-
stream=True,
|
65 |
)
|
66 |
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
response_text += chunk.choices[0].delta.content
|
71 |
-
messages.append(ChatMessage(role="assistant", content=response_text))
|
72 |
-
yield messages, "Procesando..."
|
73 |
|
74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
|
76 |
except Exception as e:
|
77 |
-
|
78 |
-
|
|
|
|
|
79 |
|
80 |
-
#
|
81 |
description = """
|
82 |
-
|
|
|
83 |
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
2. Haz clic en "Submit".
|
89 |
"""
|
90 |
|
|
|
91 |
examples = [
|
92 |
["El juez decide que el papá puede ver a su hijo los fines de semana."],
|
93 |
["Se ordena pagarle una pensión a la mamá para los gastos del niño."],
|
@@ -95,16 +135,47 @@ examples = [
|
|
95 |
["Yo creo que lo mejor para el niño es..."]
|
96 |
]
|
97 |
|
|
|
98 |
with gr.Blocks() as demo:
|
99 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
text_input = gr.Textbox(
|
101 |
lines=10,
|
102 |
label="Borrador de la Resolución",
|
103 |
placeholder="Ingrese el borrador aquí...",
|
104 |
)
|
105 |
-
|
106 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
107 |
)
|
108 |
|
|
|
109 |
if __name__ == "__main__":
|
110 |
-
demo.launch()
|
|
|
|
|
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
|
118 |
|
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."],
|
|
|
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 |
+
)
|
170 |
+
clear_button.click(lambda: ("", []), inputs=None, outputs=[text_input, chatbot])
|
171 |
+
|
172 |
+
# Ejemplos
|
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()
|