Criminal.ai / app.py
DHEIVER's picture
Update app.py
d911a45 verified
raw
history blame
6.37 kB
import gradio as gr
from datetime import datetime
from huggingface_hub import InferenceClient
import os
class DefenseGenerator:
def __init__(self):
self.api_key = os.getenv("HF_API_KEY")
if not self.api_key:
raise EnvironmentError("HF_API_KEY não configurada")
self.client = InferenceClient(api_key=self.api_key)
self.document_types = {
"resposta_acusacao": "Resposta à Acusação",
"habeas_corpus": "Habeas Corpus",
"revogacao_preventiva": "Revogação de Prisão Preventiva",
"liberdade_provisoria": "Liberdade Provisória",
"relaxamento_prisao": "Relaxamento de Prisão",
"apelacao": "Recurso de Apelação",
"embargos": "Embargos de Declaração"
}
def generate_content(self, prompt: str) -> str:
try:
response = self.client.chat.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.3",
messages=[
{"role": "system", "content": "Você é um advogado criminalista experiente. Gere peças sem usar asteriscos ou marcadores. Use numeração romana para seções principais (I, II, III...) e números arábicos para subitens (1, 2, 3...). Mantenha formatação consistente e profissional."},
{"role": "user", "content": prompt}
],
max_tokens=2000,
temperature=0.7
)
return response.choices[0].message["content"]
except Exception as e:
return f"Erro na geração: {str(e)}"
def gerar_documento(self, tipo: str, fatos: str, dados_basicos: dict) -> str:
prompt = f"""Gere uma peça de {self.document_types[tipo]} completa, formatada e sem asteriscos, com base nos seguintes fatos:
{fatos}
A peça deve seguir este formato:
EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) [AUTORIDADE]
[Título da Peça em Maiúsculas]
I - QUALIFICAÇÃO DAS PARTES
[Nome e dados completos]
II - FUNDAMENTOS JURÍDICOS
1. [Primeiro fundamento]
2. [Segundo fundamento]
[...]
III - JURISPRUDÊNCIA APLICÁVEL
1. [Primeira jurisprudência]
2. [Segunda jurisprudência]
[...]
IV - DOUTRINA APLICÁVEL
[Citações doutrinárias relevantes]
V - PRELIMINARES
1. [Primeira preliminar]
2. [Segunda preliminar]
[...]
VI - MÉRITO
[Desenvolvimento dos argumentos]
VII - PEDIDOS
1. [Primeiro pedido]
2. [Segundo pedido]
[...]
Local, Data.
[Advogado]
OAB/[Estado] [Número]
Dados para formatação:
Comarca: {dados_basicos['comarca']}
Vara: {dados_basicos['vara']}
Cliente: {dados_basicos['cliente']}
OAB: {dados_basicos['oab']}"""
return self.generate_content(prompt)
def create_interface():
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("# Sistema Criminal.AI", elem_classes="text-center text-2xl font-bold mb-4")
with gr.Group():
tipo = gr.Dropdown(
choices=list(DefenseGenerator().document_types.keys()),
value="resposta_acusacao",
label="Tipo de Peça",
container=False,
scale=1
)
with gr.Row():
with gr.Column(scale=1):
comarca = gr.Textbox(
label="Comarca",
placeholder="Ex: São Paulo",
container=False
)
vara = gr.Textbox(
label="Vara",
placeholder="Ex: 1ª",
container=False
)
with gr.Column(scale=1):
cliente = gr.Textbox(
label="Nome do Cliente",
placeholder="Ex: João da Silva",
container=False
)
oab = gr.Textbox(
label="OAB",
placeholder="Ex: SP123456",
container=False
)
fatos = gr.Textbox(
label="Descreva os fatos",
placeholder="Descreva a situação do cliente e o que precisa ser argumentado...",
lines=5,
container=False
)
with gr.Row():
gerar_btn = gr.Button("Gerar Peça", variant="primary", scale=2)
limpar_btn = gr.Button("Limpar", scale=1)
output = gr.TextArea(
label="Documento Gerado",
lines=20,
show_copy_button=True,
container=False
)
def process(tipo, fatos, comarca, vara, cliente, oab):
gerador = DefenseGenerator()
dados = {
"comarca": comarca,
"vara": vara,
"cliente": cliente,
"oab": oab
}
return gerador.gerar_documento(tipo, fatos, dados)
def clear():
return {
tipo: "resposta_acusacao",
comarca: "",
vara: "",
cliente: "",
oab: "",
fatos: "",
output: ""
}
gerar_btn.click(
fn=process,
inputs=[tipo, fatos, comarca, vara, cliente, oab],
outputs=output,
api_name="gerar_peca"
)
limpar_btn.click(
fn=clear,
outputs=[tipo, comarca, vara, cliente, oab, fatos, output],
api_name="limpar"
)
exemplos = [
["resposta_acusacao", "Cliente preso em flagrante por furto de celular iPhone 13 da vítima Maria em 10/01/2024. É primário, tem residência fixa e trabalho. A vítima não reconheceu com certeza.", "São Paulo", "1ª", "João Silva", "SP123456"],
["habeas_corpus", "Cliente preso preventivamente há 90 dias por tráfico. Apreendidas 10g de maconha, é primário, tem residência e trabalho fixos. Não foram apreendidos outros materiais típicos de tráfico.", "São Paulo", "2ª", "Pedro Santos", "SP654321"]
]
gr.Examples(
examples=exemplos,
inputs=[tipo, fatos, comarca, vara, cliente, oab],
label="Exemplos de Uso"
)
return demo
if __name__ == "__main__":
demo = create_interface()
demo.launch()