|
|
|
import os |
|
import gradio as gr |
|
from openai import OpenAI |
|
from dotenv import load_dotenv |
|
|
|
|
|
load_dotenv() |
|
|
|
|
|
client = OpenAI( |
|
api_key=os.getenv("OPENAI_API_KEY") |
|
) |
|
|
|
|
|
SYSTEM_PROMPT = """Eres un abogado penalista español experto en el Código Penal español. |
|
Tu objetivo es responder con precisión, citando la legislación vigente y proporcionando contexto legal actualizado. |
|
### **Instrucciones de Respuesta:** |
|
1. **Cita legal precisa:** |
|
- Menciona siempre los artículos específicos del Código Penal español al inicio. |
|
- Si el delito ha sido modificado en reformas recientes, indica en qué consistió la reforma. |
|
2. **Estructura clara:** |
|
- Define el **tipo básico del delito**. |
|
- Explica los **subtipos agravados y atenuados** si existen. |
|
- Cita los artículos correspondientes. |
|
3. **Jurisprudencia relevante:** |
|
- Menciona sentencias recientes del Tribunal Supremo cuando sea posible. |
|
4. **Advertencia legal:** |
|
- Aclara que es información general y no constituye asesoramiento legal.""" |
|
|
|
|
|
chat_history = [] |
|
|
|
def consulta_penalista(mensaje, tipo_consulta): |
|
"""Procesa una consulta jurídica y devuelve la respuesta del modelo.""" |
|
global chat_history |
|
chat_history.append({"role": "user", "content": f"[{tipo_consulta}] {mensaje}"}) |
|
|
|
try: |
|
respuesta = client.chat.completions.create( |
|
model="gpt-4-turbo", |
|
messages=[{"role": "system", "content": SYSTEM_PROMPT}] + chat_history, |
|
temperature=0.3 |
|
) |
|
|
|
respuesta_texto = respuesta.choices[0].message.content |
|
chat_history.append({"role": "assistant", "content": respuesta_texto}) |
|
|
|
historial_formateado = "\n\n".join([ |
|
f"{'Usuario' if msg['role'] == 'user' else 'Asistente'}: {msg['content']}" |
|
for msg in chat_history |
|
]) |
|
|
|
return respuesta_texto, historial_formateado |
|
|
|
except Exception as e: |
|
return f"Error al procesar la solicitud: {str(e)}", "\n".join(str(m) for m in chat_history) |
|
|
|
def limpiar_historial(): |
|
"""Limpia el historial de conversación.""" |
|
global chat_history |
|
chat_history = [] |
|
return "", "Historial limpiado." |
|
|
|
|
|
interfaz = gr.Blocks() |
|
|
|
with interfaz: |
|
gr.Markdown("# ⚖️ Asistente Jurídico Penal") |
|
gr.Markdown("Realiza consultas sobre derecho penal y recibe respuestas fundamentadas.") |
|
|
|
tipo_consulta = gr.Radio( |
|
choices=["Asesoría General", "Jurisprudencia", "Redacción de Documentos"], |
|
label="Tipo de Consulta", |
|
value="Asesoría General" |
|
) |
|
|
|
entrada_texto = gr.Textbox( |
|
label="Pregunta Jurídica", |
|
placeholder="Escribe tu consulta aquí..." |
|
) |
|
|
|
with gr.Row(): |
|
boton_enviar = gr.Button("Consultar") |
|
boton_limpiar = gr.Button("Limpiar Historial") |
|
|
|
salida_texto = gr.Textbox(label="Respuesta") |
|
historial_texto = gr.Textbox( |
|
label="Historial de Conversación", |
|
interactive=False, |
|
lines=10 |
|
) |
|
|
|
boton_enviar.click( |
|
consulta_penalista, |
|
inputs=[entrada_texto, tipo_consulta], |
|
outputs=[salida_texto, historial_texto] |
|
) |
|
|
|
boton_limpiar.click( |
|
limpiar_historial, |
|
outputs=[salida_texto, historial_texto] |
|
) |
|
|
|
interfaz.launch() |