Criminal.ai / app.py
DHEIVER's picture
Update app.py
4ae1270 verified
raw
history blame
13.4 kB
import gradio as gr
import os
from datetime import datetime
from huggingface_hub import InferenceClient
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.templates = {
"habeas_corpus": {
"system": "Você é um advogado criminalista especializado em Habeas Corpus.",
"sections": {
"cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) DESEMBARGADOR(A) DO EGRÉGIO TRIBUNAL DE JUSTIÇA DO ESTADO DE {estado}""",
"qualificacao": """{nome_reu}, {qualificacao_reu}, vem, por seu advogado, impetrar HABEAS CORPUS, com fundamento no art. 5º, LXVIII, da Constituição Federal e arts. 647 e seguintes do Código de Processo Penal, em face de ato do MM. Juiz de Direito da {vara} Vara Criminal da Comarca de {comarca}, pelos fatos e fundamentos a seguir expostos:""",
"fundamentos": "{fundamentos}",
"pedidos": """Ante o exposto, requer:
{pedidos}
Termos em que,
Pede deferimento.
{comarca}, {data}
Advogado(a)
OAB/{estado} {numero_oab}"""
}
},
"revogacao_prisao_preventiva": {
"system": "Você é um advogado criminalista especializado em pedidos de revogação de prisão preventiva.",
"sections": {
"cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}
Processo nº: {numero_processo}""",
"qualificacao": """{nome_reu}, já qualificado nos autos do processo em epígrafe, por seu advogado que esta subscreve, vem, respeitosamente, à presença de Vossa Excelência, com fundamento no art. 316 do Código de Processo Penal, requerer a REVOGAÇÃO DA PRISÃO PREVENTIVA, pelos motivos de fato e de direito a seguir expostos:""",
"fundamentos": "{fundamentos}",
"pedidos": """Ante o exposto, requer-se a revogação da prisão preventiva, com a expedição do competente alvará de soltura.
Termos em que,
Pede deferimento.
{comarca}, {data}
Advogado(a)
OAB/{estado} {numero_oab}"""
}
},
"resposta_acusacao": {
"system": "Você é um advogado criminalista experiente, especializado em respostas à acusação.",
"sections": {
"cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}
Processo nº: {numero_processo}""",
"qualificacao": """{nome_reu}, já qualificado nos autos do processo em epígrafe, por seu advogado que esta subscreve, vem, respeitosamente, à presença de Vossa Excelência, apresentar RESPOSTA À ACUSAÇÃO, nos termos do art. 396-A do Código de Processo Penal, pelos fatos e fundamentos a seguir expostos:""",
"preliminares": "{preliminares}",
"merito": "{merito}",
"provas": """Para provar o alegado, requer-se a produção de todos os meios de prova em direito admitidos, especialmente:
{provas}""",
"pedidos": """Ante o exposto, requer:
{pedidos}
Termos em que,
Pede deferimento.
{comarca}, {data}
Advogado(a)
OAB/{estado} {numero_oab}"""
}
},
"alegacoes_defesa": {
"system": "Você é um advogado criminalista experiente, especializado em alegações finais.",
"sections": {
"cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}
Processo nº: {numero_processo}""",
"qualificacao": """{nome_reu}, já qualificado nos autos do processo em epígrafe, por seu advogado que esta subscreve, vem, respeitosamente, à presença de Vossa Excelência, apresentar suas ALEGAÇÕES FINAIS, pelos fatos e fundamentos a seguir expostos:""",
"relatorio": "{relatorio}",
"merito": "{merito}",
"pedidos": """Ante o exposto, requer:
{pedidos}
Termos em que,
Pede deferimento.
{comarca}, {data}
Advogado(a)
OAB/{estado} {numero_oab}"""
}
}
}
def gerar_documento(self, tipo_documento: str, dados: dict) -> str:
template = self.templates.get(tipo_documento)
if not template:
return "Tipo de documento não encontrado"
dados['data'] = datetime.now().strftime("%d/%m/%Y")
messages = [
{"role": "system", "content": template["system"]},
{"role": "user", "content": f"Dados para geração de {tipo_documento}:\n{str(dados)}"}
]
documento = ""
for section_name, section_template in template["sections"].items():
try:
if any(key in section_template for key in dados.keys()):
section_content = section_template.format(**dados)
else:
section_content = self.generate_section(messages, section_name)
documento += section_content + "\n\n"
except Exception as e:
documento += f"[Erro na seção {section_name}: {str(e)}]\n\n"
return documento
def generate_section(self, messages: list, section: str) -> str:
try:
response = self.client.chat.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.3",
messages=[*messages, {"role": "user", "content": f"Gere a seção {section}"}],
max_tokens=500,
temperature=0.3
)
return response.choices[0].message["content"]
except Exception as e:
raise Exception(f"Erro na geração da seção {section}: {str(e)}")
def interface():
gerador = DefenseGenerator()
tipo_peca_descricoes = {
"resposta_acusacao": "Apresentar defesa inicial após o recebimento da denúncia",
"alegacoes_defesa": "Apresentar argumentos finais após a instrução",
"habeas_corpus": "Impetrar HC contra prisão ou ameaça à liberdade",
"recurso_em_sentido_estrito": "Recorrer de decisões interlocutórias",
"apelacao": "Recorrer da sentença",
"embargos_declaracao": "Esclarecer pontos omissos/contraditórios",
"revogacao_prisao_preventiva": "Requerer revogação de prisão preventiva",
"relaxamento_prisao": "Requerer relaxamento de prisão ilegal",
"liberdade_provisoria": "Requerer liberdade provisória"
}
def processar(tipo_doc, comarca, vara, estado, numero_processo, nome_reu,
preliminares, merito, provas, pedidos, relatorio, numero_oab):
dados = {
"comarca": comarca,
"vara": vara,
"estado": estado,
"numero_processo": numero_processo,
"nome_reu": nome_reu,
"preliminares": preliminares,
"merito": merito,
"provas": provas,
"pedidos": pedidos,
"relatorio": relatorio,
"numero_oab": numero_oab
}
return gerador.gerar_documento(tipo_doc, dados)
with gr.Blocks(title="Gerador de Peças da Defesa Criminal") as demo:
gr.Markdown("# Gerador de Peças da Defesa Criminal")
with gr.Row():
gr.Markdown("""### Selecione o tipo de peça que deseja gerar:
Cada opção é adequada para diferentes momentos processuais e estratégias de defesa.""")
with gr.Row():
tipo_peca = gr.Dropdown(
choices=list(tipo_peca_descricoes.keys()),
label="Tipo de Peça",
value="resposta_acusacao",
info="Selecione o tipo específico de peça criminal"
)
with gr.Row():
gr.Markdown(lambda x: f"**Descrição:** {tipo_peca_descricoes.get(x, '')}", every=100)
tipo_peca.change(lambda x: f"**Descrição:** {tipo_peca_descricoes.get(x, '')}", tipo_peca)
with gr.Row():
tipo_documento = gr.Radio(
choices=["resposta_acusacao", "alegacoes_defesa"],
label="Tipo de Documento",
value="resposta_acusacao"
)
with gr.Row():
with gr.Column():
comarca = gr.Textbox(label="Comarca", placeholder="São Paulo")
vara = gr.Textbox(label="Vara", placeholder="1ª")
estado = gr.Textbox(label="Estado", placeholder="SP")
numero_oab = gr.Textbox(label="Número OAB", placeholder="123456")
numero_processo = gr.Textbox(
label="Número do Processo",
placeholder="0000000-00.0000.0.00.0000"
)
nome_reu = gr.Textbox(
label="Nome do(a) Cliente",
placeholder="João da Silva"
)
with gr.Column():
preliminares = gr.Textbox(
label="Preliminares",
lines=3,
placeholder="1. Inépcia da denúncia...",
visible=True
)
merito = gr.Textbox(
label="Mérito",
lines=5,
placeholder="No mérito, deve-se ressaltar que..."
)
provas = gr.Textbox(
label="Provas Requeridas",
lines=3,
placeholder="1. Oitiva das testemunhas...",
visible=True
)
relatorio = gr.Textbox(
label="Relatório",
lines=5,
placeholder="Trata-se de ação penal...",
visible=False
)
pedidos = gr.Textbox(
label="Pedidos",
lines=3,
placeholder="1. Absolvição..."
)
def atualizar_campos(escolha):
return [
gr.Textbox(visible=(escolha == "resposta_acusacao")), # preliminares
gr.Textbox(visible=(escolha == "resposta_acusacao")), # provas
gr.Textbox(visible=(escolha == "alegacoes_defesa")) # relatorio
]
tipo_documento.change(
atualizar_campos,
tipo_documento,
[preliminares, provas, relatorio]
)
with gr.Row():
gerar_btn = gr.Button("Gerar Documento", variant="primary")
limpar_btn = gr.Button("Limpar Campos")
saida = gr.Textbox(
label="Documento Gerado",
lines=15,
show_copy_button=True
)
exemplo_resposta = {
"tipo_doc": "resposta_acusacao",
"comarca": "São Paulo",
"vara": "1ª",
"estado": "SP",
"numero_oab": "123456",
"numero_processo": "0000000-11.2024.8.26.0000",
"nome_reu": "João da Silva",
"preliminares": "1. Inépcia da denúncia, vez que não descreve adequadamente a conduta do denunciado;\n2. Ausência de justa causa para a ação penal.",
"merito": "No mérito, deve-se ressaltar que o denunciado não praticou o crime que lhe é imputado. As testemunhas arroladas pela acusação apresentam contradições em seus depoimentos...",
"provas": "1. Oitiva das testemunhas arroladas;\n2. Juntada de documentos;\n3. Perícia técnica.",
"pedidos": "1. O acolhimento das preliminares, com o consequente trancamento da ação penal;\n2. Subsidiariamente, a absolvição do acusado.",
"relatorio": ""
}
gr.Examples(
examples=[[exemplo_resposta[k] for k in [
"tipo_doc", "comarca", "vara", "estado", "numero_processo", "nome_reu",
"preliminares", "merito", "provas", "pedidos", "relatorio", "numero_oab"
]]],
inputs=[
tipo_documento, comarca, vara, estado, numero_processo, nome_reu,
preliminares, merito, provas, pedidos, relatorio, numero_oab
],
label="Exemplos"
)
gerar_btn.click(
processar,
inputs=[
tipo_documento, comarca, vara, estado, numero_processo, nome_reu,
preliminares, merito, provas, pedidos, relatorio, numero_oab
],
outputs=saida
)
def limpar():
return [""] * 12
limpar_btn.click(
limpar,
inputs=None,
outputs=[
tipo_documento, comarca, vara, estado, numero_processo, nome_reu,
preliminares, merito, provas, pedidos, relatorio, numero_oab
]
)
return demo
if __name__ == "__main__":
demo = interface()
demo.launch()