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()