Criminal.ai / app.py
DHEIVER's picture
Update app.py
92f52a0 verified
raw
history blame
10.7 kB
import gradio as gr
import os
from datetime import datetime
from huggingface_hub import InferenceClient
class DocumentGenerator:
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 = {
"denuncia": {
"system": """Você é um promotor de justiça experiente, especializado em redigir denúncias criminais.
Seu objetivo é gerar denúncias precisas e tecnicamente corretas.""",
"sections": {
"cabecalho": "EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}",
"qualificacao": """O MINISTÉRIO PÚBLICO DO ESTADO DE {estado}, por seu Promotor de Justiça que esta subscreve, no uso de suas atribuições legais, vem perante Vossa Excelência oferecer DENÚNCIA em face de:
{nome_reu}, {qualificacao_reu}""",
"narrativa": "{narrativa}",
"tipificacao": """Assim agindo, {nome_reu} incorreu nas sanções do artigo {artigo} do Código Penal.""",
"pedido": """Ante o exposto, o Ministério Público requer:
1. O recebimento e autuação da presente denúncia;
2. A citação do denunciado para responder à acusação por escrito, no prazo de 10 (dez) dias;
3. A intimação das testemunhas abaixo arroladas;
4. Ao final, a condenação do denunciado nas penas do artigo {artigo} do Código Penal.
Rol de Testemunhas:
{testemunhas}
{comarca}, {data}
Promotor(a) de Justiça"""
}
},
"alegacoes_finais": {
"system": """Você é um promotor de justiça experiente, especializado em redigir alegações finais criminais.
Seu objetivo é gerar alegações finais precisas e tecnicamente corretas.""",
"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}""",
"relatorio": "{narrativa_processual}",
"fundamentacao": "{fundamentacao}",
"pedido": """Ante o exposto, o Ministério Público requer a {pedido_final}.
{comarca}, {data}
Promotor(a) de Justiça"""
}
}
}
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 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()):
# Se o template tem placeholders, usa os dados fornecidos
section_content = section_template.format(**dados)
else:
# Senão, gera conteúdo via Mistral
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 interface():
gerador = DocumentGenerator()
def processar(tipo_doc, comarca, vara, estado, nome_reu, qualificacao, narrativa, artigo, testemunhas,
numero_processo="", narrativa_processual="", fundamentacao="", pedido_final=""):
dados = {
"comarca": comarca,
"vara": vara,
"estado": estado,
"nome_reu": nome_reu,
"qualificacao_reu": qualificacao,
"narrativa": narrativa,
"artigo": artigo,
"testemunhas": testemunhas,
"numero_processo": numero_processo,
"narrativa_processual": narrativa_processual,
"fundamentacao": fundamentacao,
"pedido_final": pedido_final
}
return gerador.gerar_documento(tipo_doc, dados)
with gr.Blocks(title="Gerador de Peças Jurídicas Criminais") as demo:
gr.Markdown("""# Gerador de Peças Jurídicas Criminais
Preencha os campos abaixo para gerar automaticamente denúncias e alegações finais criminais.""")
with gr.Row():
tipo_documento = gr.Radio(
choices=["denuncia", "alegacoes_finais"],
label="Tipo de Documento",
value="denuncia"
)
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="São Paulo"
)
nome_reu = gr.Textbox(
label="Nome do Réu",
placeholder="João da Silva"
)
qualificacao = gr.Textbox(
label="Qualificação do Réu",
placeholder="brasileiro, casado, comerciante, RG 12.345.678-9 SSP/SP"
)
with gr.Column():
narrativa = gr.Textbox(
label="Narrativa dos Fatos",
lines=5,
placeholder="No dia 10 de janeiro de 2024, por volta das 14h..."
)
artigo = gr.Textbox(
label="Artigo(s) do CP",
placeholder="155, caput"
)
testemunhas = gr.Textbox(
label="Testemunhas",
lines=3,
placeholder="1. Maria Santos - Policial Militar\n2. José Oliveira - Testemunha presencial"
)
with gr.Row(visible=False) as campos_alegacoes:
with gr.Column():
numero_processo = gr.Textbox(
label="Número do Processo",
placeholder="0000000-00.0000.0.00.0000"
)
narrativa_processual = gr.Textbox(
label="Narrativa Processual",
lines=5,
placeholder="Trata-se de ação penal..."
)
fundamentacao = gr.Textbox(
label="Fundamentação",
lines=5,
placeholder="A materialidade delitiva está comprovada..."
)
pedido_final = gr.Textbox(
label="Pedido Final",
placeholder="condenação do réu nas sanções do art. 155, caput, do Código Penal"
)
def atualizar_campos(escolha):
return gr.Row(visible=(escolha == "alegacoes_finais"))
tipo_documento.change(atualizar_campos, tipo_documento, campos_alegacoes)
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 de dados
exemplo_denuncia = {
"tipo_doc": "denuncia",
"comarca": "São Paulo",
"vara": "1ª",
"estado": "São Paulo",
"nome_reu": "João da Silva",
"qualificacao": "brasileiro, casado, comerciante, RG 12.345.678-9 SSP/SP",
"narrativa": "No dia 10 de janeiro de 2024, por volta das 14h, na Rua das Flores, 123, Centro, nesta cidade, o denunciado subtraiu para si um telefone celular iPhone 13, avaliado em R$ 5.000,00, pertencente à vítima Maria Santos.",
"artigo": "155, caput",
"testemunhas": "1. Maria Santos - Vítima\n2. Pedro Oliveira - Policial Militar\n3. Ana Costa - Testemunha presencial",
"numero_processo": "",
"narrativa_processual": "",
"fundamentacao": "",
"pedido_final": ""
}
gr.Examples(
examples=[[exemplo_denuncia[k] for k in [
"tipo_doc", "comarca", "vara", "estado", "nome_reu", "qualificacao",
"narrativa", "artigo", "testemunhas", "numero_processo",
"narrativa_processual", "fundamentacao", "pedido_final"
]]],
inputs=[
tipo_documento, comarca, vara, estado, nome_reu, qualificacao,
narrativa, artigo, testemunhas, numero_processo,
narrativa_processual, fundamentacao, pedido_final
],
label="Exemplos"
)
gerar_btn.click(
processar,
inputs=[
tipo_documento, comarca, vara, estado, nome_reu, qualificacao,
narrativa, artigo, testemunhas, numero_processo,
narrativa_processual, fundamentacao, pedido_final
],
outputs=saida
)
def limpar():
return [""] * 13
limpar_btn.click(
limpar,
inputs=None,
outputs=[
tipo_documento, comarca, vara, estado, nome_reu, qualificacao,
narrativa, artigo, testemunhas, numero_processo,
narrativa_processual, fundamentacao, pedido_final
]
)
return demo
if __name__ == "__main__":
demo = interface()
demo.launch()