Spaces:
Running
Running
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()
|