Spaces:
Running
Running
import gradio as gr | |
from huggingface_hub import InferenceClient | |
import os | |
from datetime import datetime | |
DOCUMENT_TYPES = { | |
"resposta_acusacao": "Resposta à Acusação (Art. 396-A do CPP)", | |
"habeas_corpus": "Habeas Corpus (Art. 647 do CPP)", | |
"revogacao_preventiva": "Revogação de Prisão Preventiva (Art. 316 do CPP)", | |
"liberdade_provisoria": "Liberdade Provisória (Art. 321 do CPP)", | |
"relaxamento_prisao": "Relaxamento de Prisão (Art. 5º, LXV, CF)", | |
"apelacao": "Recurso de Apelação (Art. 593 do CPP)", | |
"embargos": "Embargos de Declaração (Art. 382 do CPP)" | |
} | |
TEMPLATE_PENAL = """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}/{estado} | |
AUTOS Nº {num_processo} | |
{tipo_peca} | |
I - QUALIFICAÇÃO DAS PARTES | |
{nome}, brasileiro(a), {idade} anos, {estado_civil}, {profissao}, RG nº {rg}, CPF nº {cpf}, residente e domiciliado à {endereco}, {cidade}/{estado}, vem, por seu advogado que esta subscreve, com fundamento na legislação aplicável, apresentar {tipo_documento}, pelos fatos e fundamentos a seguir expostos. | |
II - FUNDAMENTOS JURÍDICOS | |
1. {fundamentos} | |
2. {elementos_tipo_penal} | |
III - JURISPRUDÊNCIA APLICÁVEL | |
1. {jurisprudencia_1} | |
2. {jurisprudencia_2} | |
IV - DOUTRINA APLICÁVEL | |
1. {doutrina_1} | |
2. {doutrina_2} | |
V - PRELIMINARES | |
1. {preliminar_1} | |
2. {preliminar_2} | |
VI - MÉRITO | |
1. {merito_1} | |
2. {merito_2} | |
3. {merito_3} | |
VII - PEDIDOS | |
1. PRELIMINARMENTE: | |
a) {pedido_preliminar_1} | |
b) {pedido_preliminar_2} | |
2. NO MÉRITO: | |
a) {pedido_merito_1} | |
b) {pedido_merito_2} | |
3. PROVAS A PRODUZIR: | |
{provas} | |
{cidade}, {data} | |
{advogado} | |
OAB/{estado} {oab} | |
ROL DE TESTEMUNHAS: | |
{testemunhas} | |
""" | |
class LegalDocGenerator: | |
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) | |
def _format_date(self) -> str: | |
return datetime.now().strftime("%d de %B de %Y") | |
def _build_prompt(self, doc_type: str, dados: dict) -> str: | |
# Instruções base para o modelo | |
system_prompt = """Você é um advogado criminalista especialista com anos de experiência. | |
Ao gerar peças processuais: | |
1. Use linguagem jurídica formal e técnica | |
2. Cite jurisprudência atual e relevante | |
3. Faça referências doutrinárias precisas | |
4. Desenvolva argumentos específicos para o caso | |
5. Mantenha coerência em toda a peça | |
6. Adapte os argumentos ao tipo de documento | |
7. Use legislação atualizada e pertinente""" | |
# Prompt específico para o caso | |
case_prompt = f"""TIPO DE PEÇA: {DOCUMENT_TYPES[doc_type]} | |
DADOS DO CASO: | |
Cliente: {dados['nome']} | |
Fatos: {dados['fatos']} | |
Comarca: {dados['comarca']} | |
Vara: {dados['vara']} | |
ELEMENTOS ESPECÍFICOS A INCLUIR: | |
1. Fundamentos específicos sobre {doc_type} | |
2. Jurisprudência favorável recente | |
3. Argumentos técnicos sobre {doc_type} | |
4. Pedidos adequados ao tipo de peça | |
5. Provas pertinentes ao caso | |
BASE PARA GERAÇÃO: | |
{TEMPLATE_PENAL}""" | |
return system_prompt, case_prompt | |
def generate(self, doc_type: str, dados: dict) -> str: | |
try: | |
system_prompt, case_prompt = self._build_prompt(doc_type, dados) | |
dados['data'] = self._format_date() | |
response = self.client.chat.completions.create( | |
model="mistralai/Mistral-7B-Instruct-v0.3", | |
messages=[ | |
{"role": "system", "content": system_prompt}, | |
{"role": "user", "content": case_prompt} | |
], | |
max_tokens=2500, | |
temperature=0.7 | |
) | |
return response.choices[0].message["content"] | |
except Exception as e: | |
return f"Erro na geração: {str(e)}" | |
def create_interface(): | |
def process_submit(doc_type, fatos, comarca, vara, cliente, oab, proc_num, | |
idade, estado_civil, profissao, rg, cpf, endereco, testemunhas): | |
dados = { | |
"tipo_peca": DOCUMENT_TYPES[doc_type], | |
"nome": cliente, | |
"fatos": fatos, | |
"comarca": comarca, | |
"vara": vara, | |
"oab": oab, | |
"num_processo": proc_num, | |
"idade": idade, | |
"estado_civil": estado_civil, | |
"profissao": profissao, | |
"rg": rg, | |
"cpf": cpf, | |
"endereco": endereco, | |
"testemunhas": testemunhas | |
} | |
return LegalDocGenerator().generate(doc_type, dados) | |
with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
gr.Markdown("# Sistema de Geração de Peças Criminais v2.0") | |
with gr.Tab("Dados do Processo"): | |
with gr.Row(): | |
tipo = gr.Dropdown(choices=list(DOCUMENT_TYPES.keys()), | |
value="resposta_acusacao", | |
label="Tipo de Peça") | |
proc_num = gr.Textbox(label="Número do Processo", | |
placeholder="0000000-00.0000.0.00.0000") | |
with gr.Row(): | |
comarca = gr.Textbox(label="Comarca") | |
vara = gr.Textbox(label="Vara Criminal") | |
with gr.Tab("Dados do Cliente"): | |
with gr.Row(): | |
cliente = gr.Textbox(label="Nome Completo") | |
idade = gr.Number(label="Idade") | |
estado_civil = gr.Dropdown(label="Estado Civil", | |
choices=["Solteiro(a)", "Casado(a)", "Divorciado(a)", "Viúvo(a)"]) | |
with gr.Row(): | |
profissao = gr.Textbox(label="Profissão") | |
rg = gr.Textbox(label="RG") | |
cpf = gr.Textbox(label="CPF") | |
endereco = gr.Textbox(label="Endereço Completo") | |
with gr.Tab("Dados do Caso"): | |
fatos = gr.TextArea(label="Descrição dos Fatos", | |
placeholder="Descreva detalhadamente a situação...", | |
lines=5) | |
testemunhas = gr.TextArea(label="Rol de Testemunhas", | |
placeholder="Nome completo e qualificação de cada testemunha", | |
lines=3) | |
with gr.Tab("Dados do Advogado"): | |
oab = gr.Textbox(label="Número da OAB com Estado") | |
doc_output = gr.TextArea(label="Documento Gerado", | |
lines=30, | |
show_copy_button=True) | |
submit_btn = gr.Button("Gerar Peça Processual", variant="primary") | |
submit_btn.click( | |
fn=process_submit, | |
inputs=[tipo, fatos, comarca, vara, cliente, oab, proc_num, | |
idade, estado_civil, profissao, rg, cpf, endereco, testemunhas], | |
outputs=doc_output | |
) | |
gr.Examples([ | |
["resposta_acusacao", | |
"Cliente preso em flagrante por furto de celular iPhone 13. É primário, tem residência fixa e trabalho lícito comprovado. A vítima não o reconheceu com certeza.", | |
"São Paulo", "1ª", "João Silva", "SP123456", "0001234-56.2024.8.26.0000", | |
35, "Casado(a)", "Comerciante", "12.345.678-9", "123.456.789-00", | |
"Rua das Flores, 123, Centro", | |
"1. Maria Oliveira - Testemunha ocular\n2. José Santos - Empregador do acusado"] | |
], inputs=[tipo, fatos, comarca, vara, cliente, oab, proc_num, | |
idade, estado_civil, profissao, rg, cpf, endereco, testemunhas]) | |
return demo | |
if __name__ == "__main__": | |
create_interface().launch() |