Spaces:
Sleeping
Sleeping
import gradio as gr | |
from datetime import datetime | |
from huggingface_hub import InferenceClient | |
import os | |
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.document_types = { | |
"resposta_acusacao": "Resposta à Acusação", | |
"habeas_corpus": "Habeas Corpus", | |
"revogacao_preventiva": "Revogação de Prisão Preventiva", | |
"liberdade_provisoria": "Liberdade Provisória", | |
"relaxamento_prisao": "Relaxamento de Prisão", | |
"apelacao": "Recurso de Apelação", | |
"embargos": "Embargos de Declaração" | |
} | |
def generate_content(self, prompt: str) -> str: | |
try: | |
response = self.client.chat.completions.create( | |
model="mistralai/Mistral-7B-Instruct-v0.3", | |
messages=[ | |
{"role": "system", "content": "Você é um advogado criminalista experiente. Gere peças sem usar asteriscos ou marcadores. Use numeração romana para seções principais (I, II, III...) e números arábicos para subitens (1, 2, 3...). Mantenha formatação consistente e profissional."}, | |
{"role": "user", "content": prompt} | |
], | |
max_tokens=2000, | |
temperature=0.7 | |
) | |
return response.choices[0].message["content"] | |
except Exception as e: | |
return f"Erro na geração: {str(e)}" | |
def gerar_documento(self, tipo: str, fatos: str, dados_basicos: dict) -> str: | |
prompt = f"""Gere uma peça de {self.document_types[tipo]} completa, formatada e sem asteriscos, com base nos seguintes fatos: | |
{fatos} | |
A peça deve seguir este formato: | |
EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) [AUTORIDADE] | |
[Título da Peça em Maiúsculas] | |
I - QUALIFICAÇÃO DAS PARTES | |
[Nome e dados completos] | |
II - FUNDAMENTOS JURÍDICOS | |
1. [Primeiro fundamento] | |
2. [Segundo fundamento] | |
[...] | |
III - JURISPRUDÊNCIA APLICÁVEL | |
1. [Primeira jurisprudência] | |
2. [Segunda jurisprudência] | |
[...] | |
IV - DOUTRINA APLICÁVEL | |
[Citações doutrinárias relevantes] | |
V - PRELIMINARES | |
1. [Primeira preliminar] | |
2. [Segunda preliminar] | |
[...] | |
VI - MÉRITO | |
[Desenvolvimento dos argumentos] | |
VII - PEDIDOS | |
1. [Primeiro pedido] | |
2. [Segundo pedido] | |
[...] | |
Local, Data. | |
[Advogado] | |
OAB/[Estado] [Número] | |
Dados para formatação: | |
Comarca: {dados_basicos['comarca']} | |
Vara: {dados_basicos['vara']} | |
Cliente: {dados_basicos['cliente']} | |
OAB: {dados_basicos['oab']}""" | |
return self.generate_content(prompt) | |
def create_interface(): | |
with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
gr.Markdown("# Sistema Criminal.AI", elem_classes="text-center text-2xl font-bold mb-4") | |
with gr.Group(): | |
tipo = gr.Dropdown( | |
choices=list(DefenseGenerator().document_types.keys()), | |
value="resposta_acusacao", | |
label="Tipo de Peça", | |
container=False, | |
scale=1 | |
) | |
with gr.Row(): | |
with gr.Column(scale=1): | |
comarca = gr.Textbox( | |
label="Comarca", | |
placeholder="Ex: São Paulo", | |
container=False | |
) | |
vara = gr.Textbox( | |
label="Vara", | |
placeholder="Ex: 1ª", | |
container=False | |
) | |
with gr.Column(scale=1): | |
cliente = gr.Textbox( | |
label="Nome do Cliente", | |
placeholder="Ex: João da Silva", | |
container=False | |
) | |
oab = gr.Textbox( | |
label="OAB", | |
placeholder="Ex: SP123456", | |
container=False | |
) | |
fatos = gr.Textbox( | |
label="Descreva os fatos", | |
placeholder="Descreva a situação do cliente e o que precisa ser argumentado...", | |
lines=5, | |
container=False | |
) | |
with gr.Row(): | |
gerar_btn = gr.Button("Gerar Peça", variant="primary", scale=2) | |
limpar_btn = gr.Button("Limpar", scale=1) | |
output = gr.TextArea( | |
label="Documento Gerado", | |
lines=20, | |
show_copy_button=True, | |
container=False | |
) | |
def process(tipo, fatos, comarca, vara, cliente, oab): | |
gerador = DefenseGenerator() | |
dados = { | |
"comarca": comarca, | |
"vara": vara, | |
"cliente": cliente, | |
"oab": oab | |
} | |
return gerador.gerar_documento(tipo, fatos, dados) | |
def clear(): | |
return { | |
tipo: "resposta_acusacao", | |
comarca: "", | |
vara: "", | |
cliente: "", | |
oab: "", | |
fatos: "", | |
output: "" | |
} | |
gerar_btn.click( | |
fn=process, | |
inputs=[tipo, fatos, comarca, vara, cliente, oab], | |
outputs=output, | |
api_name="gerar_peca" | |
) | |
limpar_btn.click( | |
fn=clear, | |
outputs=[tipo, comarca, vara, cliente, oab, fatos, output], | |
api_name="limpar" | |
) | |
exemplos = [ | |
["resposta_acusacao", "Cliente preso em flagrante por furto de celular iPhone 13 da vítima Maria em 10/01/2024. É primário, tem residência fixa e trabalho. A vítima não reconheceu com certeza.", "São Paulo", "1ª", "João Silva", "SP123456"], | |
["habeas_corpus", "Cliente preso preventivamente há 90 dias por tráfico. Apreendidas 10g de maconha, é primário, tem residência e trabalho fixos. Não foram apreendidos outros materiais típicos de tráfico.", "São Paulo", "2ª", "Pedro Santos", "SP654321"] | |
] | |
gr.Examples( | |
examples=exemplos, | |
inputs=[tipo, fatos, comarca, vara, cliente, oab], | |
label="Exemplos de Uso" | |
) | |
return demo | |
if __name__ == "__main__": | |
demo = create_interface() | |
demo.launch() |