Spaces:
Running
Running
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() |