Spaces:
Sleeping
Sleeping
import os | |
import gradio as gr | |
from huggingface_hub import InferenceClient | |
from datetime import datetime | |
from typing import Dict, Optional | |
class LegalDocumentGenerator: | |
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 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 generate_document(self, case_info: str, doc_type: str, client_data: Dict) -> str: | |
if not all([case_info, doc_type, client_data]): | |
return "Erro: Dados incompletos" | |
templates = { | |
"habeas corpus": self._get_habeas_corpus_template(), | |
"defesa prévia": self._get_defesa_previa_template(), | |
"apelação criminal": self._get_apelacao_template(), | |
"petição inicial": self._get_peticao_inicial_template() | |
} | |
template = templates.get(doc_type.lower()) | |
if not template: | |
return "Erro: Tipo de documento não suportado" | |
try: | |
messages = [ | |
{ | |
"role": "system", | |
"content": ( | |
"Você é um advogado criminalista especializado. Gere uma peça jurídica observando:\n" | |
"1. Formalidade e técnica jurídica\n" | |
"2. Fundamentação legal precisa e atualizada\n" | |
"3. Jurisprudência relevante\n" | |
"4. Adequação ao caso concreto\n" | |
f"Tipo de peça: {doc_type}\n" | |
f"Informações do caso: {case_info}" | |
) | |
} | |
] | |
sections = {} | |
for section in template["required_sections"]: | |
sections[section] = self.generate_section(messages, section) | |
document = template["structure"].format( | |
**sections, | |
**client_data, | |
data=datetime.now().strftime("%d/%m/%Y") | |
) | |
return document | |
except Exception as e: | |
return f"Erro na geração do documento: {str(e)}" | |
def _get_habeas_corpus_template(self): | |
return { | |
"structure": ( | |
"EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} DA {comarca}\n\n" | |
"HABEAS CORPUS COM PEDIDO LIMINAR\n\n" | |
"QUALIFICAÇÃO DO PACIENTE\n{qualificacao}\n\n" | |
"DOS FATOS\n{fatos}\n\n" | |
"DO DIREITO\n{fundamentacao}\n\n" | |
"DO CONSTRANGIMENTO ILEGAL\n{constrangimento}\n\n" | |
"DA MEDIDA LIMINAR\n{liminar}\n\n" | |
"DOS PEDIDOS\n{pedidos}\n\n" | |
"PROVAS E DOCUMENTOS\n{provas}\n\n" | |
"{comarca}, {data}\n\n" | |
"{advogado}\n" | |
"OAB/{estado} {numero_oab}" | |
), | |
"required_sections": [ | |
"qualificacao", "fatos", "fundamentacao", | |
"constrangimento", "liminar", "pedidos", "provas" | |
] | |
} | |
def _get_defesa_previa_template(self): | |
return { | |
"structure": ( | |
"EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} DA {comarca}\n\n" | |
"DEFESA PRÉVIA\n\n" | |
"Autos nº {numero_processo}\n\n" | |
"QUALIFICAÇÃO DO ACUSADO\n{qualificacao}\n\n" | |
"DOS FATOS\n{fatos}\n\n" | |
"DO DIREITO\n{fundamentacao}\n\n" | |
"DAS PRELIMINARES\n{preliminares}\n\n" | |
"DO MÉRITO\n{merito}\n\n" | |
"DAS PROVAS\n{provas}\n\n" | |
"DOS PEDIDOS\n{pedidos}\n\n" | |
"{comarca}, {data}\n\n" | |
"{advogado}\n" | |
"OAB/{estado} {numero_oab}" | |
), | |
"required_sections": [ | |
"qualificacao", "fatos", "fundamentacao", "preliminares", | |
"merito", "provas", "pedidos" | |
] | |
} | |
def _get_apelacao_template(self): | |
return { | |
"structure": ( | |
"EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) DESEMBARGADOR(A) RELATOR(A) DO TRIBUNAL DE JUSTIÇA DO ESTADO DE {estado}\n\n" | |
"RAZÕES DE APELAÇÃO\n\n" | |
"Autos nº {numero_processo}\n\n" | |
"QUALIFICAÇÃO DO APELANTE\n{qualificacao}\n\n" | |
"DOS FATOS\n{fatos}\n\n" | |
"DAS PRELIMINARES\n{preliminares}\n\n" | |
"DO MÉRITO\n{merito}\n\n" | |
"DO DIREITO\n{fundamentacao}\n\n" | |
"DOS PEDIDOS\n{pedidos}\n\n" | |
"{comarca}, {data}\n\n" | |
"{advogado}\n" | |
"OAB/{estado} {numero_oab}" | |
), | |
"required_sections": [ | |
"qualificacao", "fatos", "preliminares", "merito", | |
"fundamentacao", "pedidos" | |
] | |
} | |
def _get_peticao_inicial_template(self): | |
return { | |
"structure": ( | |
"EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} DA {comarca}\n\n" | |
"PETIÇÃO INICIAL\n\n" | |
"QUALIFICAÇÃO DO AUTOR\n{qualificacao}\n\n" | |
"DOS FATOS\n{fatos}\n\n" | |
"DO DIREITO\n{fundamentacao}\n\n" | |
"DO PEDIDO LIMINAR\n{liminar}\n\n" | |
"DOS PEDIDOS\n{pedidos}\n\n" | |
"DAS PROVAS\n{provas}\n\n" | |
"DO VALOR DA CAUSA\n{valor_causa}\n\n" | |
"{comarca}, {data}\n\n" | |
"{advogado}\n" | |
"OAB/{estado} {numero_oab}" | |
), | |
"required_sections": [ | |
"qualificacao", "fatos", "fundamentacao", "liminar", | |
"pedidos", "provas", "valor_causa" | |
] | |
} | |
def create_interface(): | |
generator = LegalDocumentGenerator() | |
example_cases = { | |
"habeas corpus": { | |
"case_info": "Cliente João da Silva foi preso em flagrante no dia 15/12/2023 por suposto furto em loja, mas há provas em vídeo mostrando que ele estava em outro local no momento do crime.", | |
"client_data": { | |
"name": "João da Silva", | |
"nationality": "Brasileiro", | |
"profession": "Comerciante", | |
"id": "12.345.678-9", | |
"address": "Rua das Flores, 123", | |
"city": "São Paulo", | |
"state": "SP", | |
"zip": "01234-567", | |
"court": "1ª Vara Criminal", | |
"jurisdiction": "São Paulo", | |
"process_number": "0123456-78.2023.8.26.0001", | |
"lawyer_name": "Dr. Pedro Santos", | |
"lawyer_oab": "123456", | |
"lawyer_state": "SP" | |
} | |
}, | |
"defesa prévia": { | |
"case_info": "Cliente Maria Oliveira foi denunciada por tráfico de drogas após revista policial sem mandado em sua residência, onde foram encontradas substâncias ilícitas.", | |
"client_data": { | |
"name": "Maria Oliveira", | |
"nationality": "Brasileira", | |
"profession": "Professora", | |
"id": "98.765.432-1", | |
"address": "Av. Principal, 456", | |
"city": "São Paulo", | |
"state": "SP", | |
"zip": "04321-765", | |
"court": "2ª Vara Criminal", | |
"jurisdiction": "São Paulo", | |
"process_number": "0987654-32.2023.8.26.0002", | |
"lawyer_name": "Dra. Ana Costa", | |
"lawyer_oab": "654321", | |
"lawyer_state": "SP" | |
} | |
} | |
} | |
with gr.Blocks() as interface: | |
gr.Markdown("# Gerador de Peças Jurídicas Criminais") | |
with gr.Tab("Dados do Caso"): | |
example_selector = gr.Dropdown( | |
label="Exemplos", | |
choices=["Selecione um exemplo...", "Exemplo Habeas Corpus", "Exemplo Defesa Prévia"], | |
value="Selecione um exemplo..." | |
) | |
case_info = gr.Textbox( | |
label="Informações do Caso", | |
placeholder="Descreva o caso detalhadamente", | |
lines=5 | |
) | |
doc_type = gr.Dropdown( | |
label="Tipo de Peça", | |
choices=[ | |
"habeas corpus", | |
"defesa prévia", | |
"apelação criminal", | |
"petição inicial" | |
] | |
) | |
with gr.Tab("Dados do Cliente"): | |
with gr.Row(): | |
client_name = gr.Textbox(label="Nome") | |
client_nationality = gr.Textbox(label="Nacionalidade") | |
with gr.Row(): | |
client_profession = gr.Textbox(label="Profissão") | |
client_id = gr.Textbox(label="RG") | |
with gr.Row(): | |
client_address = gr.Textbox(label="Endereço") | |
client_city = gr.Textbox(label="Cidade") | |
with gr.Row(): | |
client_state = gr.Textbox(label="Estado") | |
client_zip = gr.Textbox(label="CEP") | |
with gr.Tab("Dados Processuais"): | |
with gr.Row(): | |
court = gr.Textbox(label="Vara") | |
jurisdiction = gr.Textbox(label="Comarca") | |
with gr.Row(): | |
process_number = gr.Textbox(label="Número do Processo") | |
lawyer_name = gr.Textbox(label="Nome do Advogado") | |
with gr.Row(): | |
lawyer_oab = gr.Textbox(label="Número OAB") | |
lawyer_state = gr.Textbox(label="Estado OAB") | |
with gr.Row(): | |
generate_btn = gr.Button("Gerar Documento") | |
clear_btn = gr.Button("Limpar Campos") | |
output = gr.Textbox( | |
label="Documento Gerado", | |
lines=20, | |
placeholder="O documento gerado aparecerá aqui" | |
) | |
def load_example(example_choice): | |
if example_choice == "Exemplo Habeas Corpus": | |
data = example_cases["habeas corpus"] | |
elif example_choice == "Exemplo Defesa Prévia": | |
data = example_cases["defesa prévia"] | |
else: | |
return [""] * 16 | |
client = data["client_data"] | |
return [ | |
data["case_info"], | |
example_choice.lower().replace("exemplo ", ""), | |
client["name"], | |
client["nationality"], | |
client["profession"], | |
client["id"], | |
client["address"], | |
client["city"], | |
client["state"], | |
client["zip"], | |
client["court"], | |
client["jurisdiction"], | |
client["process_number"], | |
client["lawyer_name"], | |
client["lawyer_oab"], | |
client["lawyer_state"] | |
] | |
example_selector.change( | |
load_example, | |
inputs=[example_selector], | |
outputs=[ | |
case_info, doc_type, | |
client_name, client_nationality, client_profession, client_id, | |
client_address, client_city, client_state, client_zip, | |
court, jurisdiction, process_number, | |
lawyer_name, lawyer_oab, lawyer_state | |
] | |
) | |
generate_btn.click( | |
generator.generate_document, | |
inputs=[ | |
case_info, doc_type, | |
client_name, client_nationality, client_profession, client_id, | |
client_address, client_city, client_state, client_zip, | |
court, jurisdiction, process_number, | |
lawyer_name, lawyer_oab, lawyer_state | |
], | |
outputs=output | |
) | |
clear_btn.click( | |
lambda: [""] * 16, | |
outputs=[ | |
case_info, doc_type, | |
client_name, client_nationality, client_profession, client_id, | |
client_address, client_city, client_state, client_zip, | |
court, jurisdiction, process_number, | |
lawyer_name, lawyer_oab, lawyer_state | |
] | |
) | |
return interface | |
if __name__ == "__main__": | |
interface = create_interface() | |
interface.launch() |