Criminal.ai / app.py
DHEIVER's picture
Update app.py
9b1e761 verified
raw
history blame
12.9 kB
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()