Criminal.ai / app.py
DHEIVER's picture
Update app.py
322c937 verified
raw
history blame
8.42 kB
import os
import gradio as gr
from huggingface_hub import InferenceClient
from datetime import datetime
import logging
from typing import Dict, List, Optional
from pathlib import Path
import json
import dotenv
# Carrega variáveis de ambiente do arquivo .env se existir
dotenv.load_dotenv()
# Configuração do logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
def load_token() -> str:
"""Carrega o token HF de várias fontes possíveis"""
# Prioridade: 1. Variável de ambiente, 2. Arquivo .env, 3. arquivo config.json
# Verifica variável de ambiente
token = os.getenv('HF_TOKEN')
if token:
return token
# Verifica arquivo config.json
config_file = Path('config.json')
if config_file.exists():
try:
with open(config_file, 'r') as f:
config = json.load(f)
return config.get('hf_token', '')
except Exception as e:
logger.error(f"Erro ao ler config.json: {e}")
return ''
# Carrega o token
HF_API_TOKEN = load_token()
class DocumentGenerator:
"""Gerencia a geração de documentos usando HF Inference API"""
def __init__(self, api_key: str):
if not api_key:
raise ValueError("API Key não encontrada. Configure HF_TOKEN nas variáveis de ambiente ou no arquivo config.json")
self.client = InferenceClient(api_key=api_key)
self.model = "mistralai/Mistral-7B-Instruct-v0.2"
def generate(self, doc_type: str, context: Dict[str, str]) -> str:
"""Gera o documento usando o modelo"""
try:
# Prepara as mensagens para o chat
messages = [
{
"role": "system",
"content": """Você é um advogado criminalista brasileiro experiente.
Gere documentos jurídicos formais no formato do direito brasileiro."""
},
{
"role": "user",
"content": f"""Gere um {doc_type} completo com os seguintes dados:
QUALIFICAÇÃO:
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')}
Use formato jurídico adequado, com todas as partes necessárias."""
}
]
# Faz a chamada à API
completion = self.client.chat.completions.create(
model=self.model,
messages=messages,
temperature=0.3,
top_p=0.85,
max_tokens=2048,
)
return self._format_output(completion.choices[0].message.content)
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"
return text.strip()
class WebInterface:
"""Interface Gradio para o gerador de documentos"""
def __init__(self):
self.generator = DocumentGenerator(api_key=HF_API_TOKEN)
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 Documentos Jurídicos
Sistema de geração de peças processuais criminais
""")
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"
)
with gr.Group():
gr.Markdown("### Detalhes do Caso")
facts = gr.Textbox(
label="Fatos",
lines=5,
placeholder="Descreva os fatos..."
)
legal_basis = gr.Textbox(
label="Fundamentos Jurídicos",
lines=3
)
generate_btn = gr.Button("Gerar Documento", variant="primary")
with gr.Column():
output = gr.Textbox(
label="Documento Gerado",
lines=30,
show_copy_button=True
)
status = gr.Textbox(label="Status")
# Eventos
generate_btn.click(
fn=self._generate_document,
inputs=[
doc_type, client_name, process_number,
court, jurisdiction, facts, legal_basis
],
outputs=[output, status]
)
def _generate_document(
self, doc_type: str, client_name: str,
process_number: str, court: str,
jurisdiction: str, facts: str,
legal_basis: str
) -> tuple:
"""Gera o documento com os parâmetros fornecidos"""
try:
if not all([client_name, process_number, facts, legal_basis]):
return "Erro: Preencha todos os campos obrigatórios", "⚠️ Campos incompletos"
context = {
"client_name": client_name,
"process_number": process_number,
"court": court,
"jurisdiction": jurisdiction,
"facts": facts,
"legal_basis": legal_basis
}
result = self.generator.generate(doc_type, context)
return result, "✅ Documento gerado com sucesso"
except Exception as e:
logger.error(f"Erro: {str(e)}")
return "", f"❌ Erro: {str(e)}"
def launch(self):
"""Inicia a interface web"""
self.app.launch(share=True)
if __name__ == "__main__":
# Verifica se o token está configurado
if not HF_API_TOKEN:
print("\n⚠️ Token HF não encontrado!")
print("\nPara configurar o token:")
print("1. Crie um arquivo .env com:")
print(" HF_TOKEN=seu_token_aqui")
print("\nOu")
print("2. Crie um arquivo config.json com:")
print(' {"hf_token": "seu_token_aqui"}')
print("\nOu")
print("3. Configure a variável de ambiente HF_TOKEN")
exit(1)
interface = WebInterface()
interface.launch()