Criminal.ai / app.py
DHEIVER's picture
Update app.py
428cd1d verified
raw
history blame
8.58 kB
import os
import gradio as gr
from huggingface_hub import HfApi, InferenceApi
from datetime import datetime
import logging
from typing import Dict, List
# Configuração do logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class DocumentGenerator:
"""Gerencia a geração de documentos usando LLM"""
def __init__(self):
# Usa a API key do ambiente
self.api = HfApi(token=os.environ.get("HF_TOKEN"))
# Usa modelo otimizado para português
self.model = "NeuralBeagle14-7B"
def generate(self, doc_type: str, context: Dict[str, str]) -> str:
"""Gera o documento usando LLM"""
try:
base_prompt = f"""Atue como um advogado criminalista brasileiro experiente.
Você deve gerar uma peça processual do tipo {doc_type} em português, formato jurídico brasileiro.
DADOS:
- Cliente: {context.get('client_name')}
- Processo: {context.get('process_number')}
- Tribunal: {context.get('court')}
- Comarca: {context.get('jurisdiction')}
FATOS:
{context.get('facts')}
FUNDAMENTOS JURÍDICOS:
{context.get('legal_basis')}
INSTRUÇÕES ESPECÍFICAS:
1. Use linguagem jurídica formal
2. Siga estritamente o formato de peças processuais brasileiras
3. Mantenha a estrutura com endereçamento, qualificação, fatos, direito e pedidos
4. Inclua local e data ao final
5. Use apenas os dados fornecidos
6. Evite repetições desnecessárias
7. Cite corretamente artigos e jurisprudência
8. Use formatação profissional
COMECE A GERAR O DOCUMENTO AGORA:"""
# Faz a chamada à API
inference = InferenceApi(repo_id=f"meta-llama/{self.model}", token=os.environ.get("HF_TOKEN"))
response = inference(
base_prompt,
max_length=4096,
temperature=0.3,
top_p=0.95,
repetition_penalty=1.15,
do_sample=True
)
return self._format_output(response[0]['generated_text'])
except Exception as e:
logger.error(f"Erro na geração: {str(e)}")
return f"Erro na geração do documento: {str(e)}"
def _format_output(self, text: str) -> str:
"""Formata o texto gerado"""
if not text:
return "Erro: Nenhum texto gerado"
# Remove o prompt da resposta
text = text.split("COMECE A GERAR O DOCUMENTO AGORA:")[-1].strip()
# Ajusta formatação
lines = [line.strip() for line in text.split('\n') if line.strip()]
formatted_text = '\n\n'.join(lines)
# Adiciona data se não existir
if "[DATA]" in formatted_text:
current_date = datetime.now().strftime('%d de %B de %Y')
formatted_text = formatted_text.replace("[DATA]", current_date)
return formatted_text
class WebInterface:
"""Interface Gradio para o gerador de documentos"""
def __init__(self):
self.generator = DocumentGenerator()
self.create_interface()
def create_interface(self):
"""Cria a interface web com Gradio"""
with gr.Blocks(theme=gr.themes.Soft()) as self.app:
gr.Markdown("""
# Criminal.ai - Gerador de Peças Processuais
### Sistema Inteligente para Geração de Documentos Jurídicos
""")
with gr.Row():
with gr.Column():
doc_type = gr.Dropdown(
choices=[
"Habeas Corpus",
"Denúncia Criminal",
"Alegações Finais",
"Resposta à Acusação",
"Recurso em Sentido Estrito",
"Apelação Criminal"
],
label="Tipo de Documento",
value="Habeas Corpus"
)
with gr.Group():
gr.Markdown("### Informações do Processo")
client_name = gr.Textbox(
label="Nome do Cliente",
placeholder="Nome completo"
)
process_number = gr.Textbox(
label="Número do Processo",
placeholder="NNNNNNN-NN.NNNN.N.NN.NNNN"
)
court = gr.Textbox(
label="Tribunal",
value="TRIBUNAL DE JUSTIÇA DO ESTADO"
)
jurisdiction = gr.Textbox(
label="Comarca",
placeholder="Nome da comarca"
)
with gr.Group():
gr.Markdown("### Detalhes do Caso")
facts = gr.Textbox(
label="Fatos",
lines=5,
placeholder="Descreva os fatos relevantes..."
)
legal_basis = gr.Textbox(
label="Fundamentos Jurídicos",
lines=3,
placeholder="Fundamentos legais..."
)
generate_btn = gr.Button("📝 Gerar Documento", variant="primary")
with gr.Column():
output = gr.Textbox(
label="Documento Gerado",
lines=30,
show_copy_button=True
)
# Exemplos
gr.Examples(
examples=[
[
"Habeas Corpus",
"João da Silva Santos",
"0000123-45.2024.8.26.0000",
"TRIBUNAL DE JUSTIÇA DO ESTADO DE SÃO PAULO",
"São Paulo",
"Paciente preso em flagrante no dia 25/12/2024 por suposto furto simples (art. 155, caput, CP). O paciente é primário, possui residência fixa no distrito da culpa e ocupação lícita comprovada. Não estão presentes os requisitos autorizadores da prisão preventiva.",
"Art. 5º, LXVIII, CF/88; Art. 647 do CPP; Ausência dos requisitos do Art. 312 do CPP. Súmula 308 STJ."
]
],
inputs=[
doc_type, client_name, process_number,
court, jurisdiction, facts, legal_basis
]
)
# Eventos
generate_btn.click(
fn=self._generate_document,
inputs=[
doc_type, client_name, process_number,
court, jurisdiction, facts, legal_basis
],
outputs=output
)
def _generate_document(
self, doc_type: str, client_name: str,
process_number: str, court: str,
jurisdiction: str, facts: str,
legal_basis: str
) -> str:
"""Gera o documento com os parâmetros fornecidos"""
try:
if not all([client_name, process_number, facts, legal_basis]):
return "Erro: Todos os campos obrigatórios devem ser preenchidos"
context = {
"client_name": client_name,
"process_number": process_number,
"court": court,
"jurisdiction": jurisdiction,
"facts": facts,
"legal_basis": legal_basis
}
return self.generator.generate(doc_type, context)
except Exception as e:
logger.error(f"Erro: {str(e)}")
return f"Erro na geração: {str(e)}"
def launch(self):
"""Inicia a interface web"""
self.app.launch(share=True)
if __name__ == "__main__":
interface = WebInterface()
interface.launch()