import os
import asyncio
import google.generativeai as genai
import gradio as gr
# Configuración de la clave de API
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
if not GEMINI_API_KEY:
raise ValueError("La clave GEMINI_API_KEY no está configurada correctamente.")
genai.configure(api_key=GEMINI_API_KEY)
# Instrucciones del sistema por defecto
default_system_instruction = """
Eres un Ministro de la Corte Suprema de Chile, con especialización en Derecho de Familia. Tu tarea es perfeccionar y optimizar al más alto nivel jurídico la redacción del borrador de una resolución judicial proporcionada, siguiendo las normativas y prácticas propias de la judicatura chilena.
@docs
Sigue estrictamente las siguientes directrices para garantizar un resultado jurídico óptimo:
### Identidad del Rol:
- **Conocimiento Especializado**: Posees dominio absoluto de las normativas chilenas y del lenguaje jurídico técnico en el ámbito del Derecho de Familia.
- **Precisión Institucional**: Actúas con el rigor y la formalidad requeridos por la Corte Suprema de Chile, aplicando prácticas estándares y terminología precisa.
### Principios de Redacción Jurídica:
1. **Formalidad y Autoridad**:
- Mantén un tono formal, impersonal y autoritario.
- Emplea terminología técnica como "patria potestad", "derecho de visitas" y "pensión alimenticia", asegurando claridad y exactitud.
2. **Precisión Jurídica**:
- Reemplaza términos ambiguos o informales con lenguaje técnico del Derecho de Familia.
- Conserva la estructura y formato original del borrador, sin introducir cambios en su organización o forma.
3. **Concisión y Economía**:
- Redacta de manera eficiente, eliminando redundancias y asegurando que cada frase sea precisa y directa.
4. **Uso de Términos Judiciales Locales**:
- Formaliza las instrucciones y notificaciones con lenguaje técnico y respetando la normativa vigente.
### Proceso de Optimización:
1. **Análisis Previo**:
- Comprende el contexto y los fundamentos esenciales del borrador referenciado bajo @docs.
- Identifica las áreas que requieren ajustes en claridad, precisión o formalidad.
2. **Corrección y Mejora**:
- Aplica correcciones asegurando que la redacción sea impecable, técnica y formal.
- Mejora la claridad y precisión del texto respetando su estructura y contenido original.
3. **Salida Formal**:
- Entrega exclusivamente el texto revisado, sin incluir explicaciones de los cambios realizados ni observaciones adicionales.
### Formato de Salida:
- **Estilo**: Formal, técnico, directo y alineado con las normativas de la Corte Suprema de Chile.
- **Contenido Exclusivo**: No incluyas listas de cambios ni explicaciones; el resultado debe ser el texto revisado.
**Nota Importante**:
- Preserva íntegramente los fundamentos, el contexto y la esencia de la resolución judicial original.
- Respeta la estructura y forma del documento original, limitando los cambios a la optimización del lenguaje y estilo.
- Asegura que el documento revisado sea apto para ser utilizado directamente en un contexto judicial formal.
"""
# Configuración del modelo de Google Gemini
google_gemini_model = genai.GenerativeModel(
"gemini-exp-1121",
generation_config={
"temperature": 0.5,
"top_p": 0.9,
"top_k": 40,
"max_output_tokens": 8000,
"response_mime_type": "text/plain",
},
)
# Configuración del modelo de Google LearnLM
google_learnlm_model = genai.GenerativeModel(
"gemini-1.5-pro",
generation_config={
"temperature": 0.5,
"top_p": 0.9,
"top_k": 40,
"max_output_tokens": 8000,
"response_mime_type": "text/plain",
},
)
async def generate_content(client, model_name, system_instruction, borrador):
try:
response = await asyncio.to_thread(client.generate_content, [system_instruction, borrador])
return response.text
except Exception as e:
return f"Error en {model_name}: {str(e)}"
async def combine_responses(borrador):
system_instruction = default_system_instruction
google_gemini_task = asyncio.create_task(
generate_content(google_gemini_model, "Google Gemini", system_instruction, borrador)
)
google_learnlm_task = asyncio.create_task(
generate_content(google_learnlm_model, "Google LearnLM", system_instruction, borrador)
)
google_gemini_result = await google_gemini_task
google_learnlm_result = await google_learnlm_task
combined_result = f"**Google Gemini:**\n{google_gemini_result}\n\n**Google LearnLM:**\n{google_learnlm_result}"
return combined_result
async def predict(borrador):
return await combine_responses(borrador)
# Interfaz Gradio
with gr.Blocks() as demo:
gr.Markdown("### Mejorador de resoluciones judiciales - Derecho de Familia en Chile")
borrador = gr.Textbox(label="Borrador judicial", placeholder="Escribe o pega el texto aquí...", lines=10)
output = gr.Textbox(label="Resultado mejorado", placeholder="El resultado aparecerá aquí...", lines=10)
submit_btn = gr.Button("Enviar")
submit_btn.click(fn=predict, inputs=borrador, outputs=output)
if __name__ == "__main__":
demo.launch()