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