Spaces:
Sleeping
Sleeping
File size: 5,837 Bytes
716ba45 50c782f d911a45 0956e15 716ba45 acd212a 92f52a0 0956e15 514bb86 0956e15 514bb86 0956e15 514bb86 0956e15 514bb86 0956e15 514bb86 0956e15 514bb86 0956e15 514bb86 0956e15 61d1412 0956e15 61d1412 0956e15 acd212a 0956e15 acd212a 0956e15 acd212a 0956e15 acd212a 0956e15 acd212a 1a11491 d911a45 0956e15 acd212a d911a45 0956e15 23b1f8d 3a67a8e 0956e15 23b1f8d 0956e15 d911a45 0956e15 acd212a 0956e15 d911a45 0956e15 d911a45 50c782f 716ba45 acd212a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
import gradio as gr
from huggingface_hub import InferenceClient
import os
from datetime import datetime
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"
}
DEFAULT_SECTIONS = """AUTOS Nº [NUMERO_PROCESSO]
I - QUALIFICAÇÃO DAS PARTES
[Detalhes do acusado e seu advogado]
II - FUNDAMENTOS JURÍDICOS
1. [Base legal específica do caso]
2. [Elementos necessários para configuração do crime]
III - JURISPRUDÊNCIA APLICÁVEL
1. [Precedentes favoráveis]
2. [Entendimentos dos tribunais]
IV - DOUTRINA APLICÁVEL
1. [Citações doutrinárias relevantes]
2. [Posicionamentos doutrinários]
V - PRELIMINARES
1. [Questões processuais]
2. [Nulidades e vícios]
VI - MÉRITO
1. [Argumentos principais]
2. [Provas e contraprovas]
VII - PEDIDOS
1. [Pedido principal]
2. [Pedidos subsidiários]
3. [Provas a produzir]
[CIDADE], [DATA]
[ADVOGADO]
OAB/[ESTADO] [NÚMERO]
ROL DE TESTEMUNHAS:
1. [Nome e qualificação]
2. [Nome e qualificação]
3. [Nome e qualificação]"""
class LegalDocGenerator:
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 _build_prompt(self, doc_type: str, caso: dict) -> str:
return f"""Atue como um advogado criminalista experiente gerando uma peça de {DOCUMENT_TYPES[doc_type]}.
CASO CONCRETO:
- Acusado: {caso['cliente']}
- Fatos: {caso['fatos']}
- Comarca: {caso['comarca']}
- Vara: {caso['vara']} Vara Criminal
- OAB: {caso['oab']}
INSTRUÇÕES ESPECÍFICAS:
1. Use linguagem jurídica formal
2. Cite jurisprudência real e atualizada
3. Fundamente com doutrina pertinente
4. Destaque elementos favoráveis ao acusado
5. Mantenha estrutura com numeração romana para seções principais
6. Inclua elementos de prova mencionados nos fatos
7. Desenvolva argumentos técnicos para cada pedido
8. Mantenha formatação profissional
9. Use artigos corretos do Código Penal e CPP
ESTRUTURA BASE:
{DEFAULT_SECTIONS}"""
def generate(self, doc_type: str, caso: dict) -> str:
try:
prompt = self._build_prompt(doc_type, caso)
response = self.client.chat.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.3",
messages=[
{"role": "system", "content": "Você é um advogado criminalista especialista em gerar peças jurídicas técnicas e bem fundamentadas."},
{"role": "user", "content": prompt}
],
max_tokens=2500,
temperature=0.7
)
return response.choices[0].message["content"]
except Exception as e:
return f"Erro na geração: {str(e)}"
def create_interface():
def process(tipo, fatos, comarca, vara, cliente, oab, num_processo="", testemunhas=""):
caso = {
"cliente": cliente,
"fatos": fatos,
"comarca": comarca,
"vara": vara,
"oab": oab,
"num_processo": num_processo,
"testemunhas": testemunhas
}
return LegalDocGenerator().generate(tipo, caso)
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("# Sistema Criminal.AI - Gerador de Peças Jurídicas")
with gr.Row():
tipo = gr.Dropdown(
choices=list(DOCUMENT_TYPES.keys()),
value="resposta_acusacao",
label="Tipo de Peça"
)
num_processo = gr.Textbox(
label="Número do Processo",
placeholder="Ex: 0000000-00.0000.0.00.0000"
)
with gr.Row():
with gr.Column():
comarca = gr.Textbox(label="Comarca", placeholder="Ex: São Paulo")
vara = gr.Textbox(label="Vara", placeholder="Ex: 1ª")
with gr.Column():
cliente = gr.Textbox(label="Nome do Cliente", placeholder="Ex: João da Silva")
oab = gr.Textbox(label="OAB", placeholder="Ex: SP123456")
fatos = gr.Textbox(
label="Descrição dos Fatos",
placeholder="Descreva detalhadamente a situação do cliente...",
lines=5
)
testemunhas = gr.Textbox(
label="Rol de Testemunhas (opcional)",
placeholder="Nome e qualificação das testemunhas, uma por linha",
lines=3
)
output = gr.TextArea(
label="Peça Gerada",
lines=30,
show_copy_button=True
)
gr.Examples([
[
"resposta_acusacao",
"Cliente preso em flagrante por furto de celular iPhone 13. É primário, tem residência fixa e trabalho lícito comprovado. A vítima não o reconheceu com certeza.",
"São Paulo",
"1ª",
"João Silva",
"SP123456",
"0001234-56.2024.8.26.0000",
"1. Maria Oliveira - Testemunha ocular\n2. José Santos - Empregador do acusado"
],
], inputs=[tipo, fatos, comarca, vara, cliente, oab, num_processo, testemunhas])
gr.Button("Gerar Peça").click(
fn=process,
inputs=[tipo, fatos, comarca, vara, cliente, oab, num_processo, testemunhas],
outputs=output
)
return demo
if __name__ == "__main__":
create_interface().launch() |