File size: 7,746 Bytes
716ba45
50c782f
d911a45
0956e15
716ba45
acd212a
407f4f9
 
 
 
 
 
 
acd212a
92f52a0
407f4f9
 
 
 
 
514bb86
 
407f4f9
0956e15
514bb86
407f4f9
 
0956e15
514bb86
407f4f9
 
0956e15
514bb86
407f4f9
 
0956e15
514bb86
407f4f9
 
0956e15
514bb86
407f4f9
 
 
0956e15
514bb86
407f4f9
 
 
 
 
 
 
0956e15
407f4f9
 
0956e15
407f4f9
 
 
 
61d1412
0956e15
407f4f9
 
61d1412
0956e15
acd212a
 
 
 
 
 
407f4f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
acd212a
407f4f9
 
 
acd212a
 
 
407f4f9
 
acd212a
0956e15
acd212a
 
407f4f9
acd212a
 
 
1a11491
d911a45
407f4f9
 
 
 
 
0956e15
 
 
 
407f4f9
 
 
 
 
 
 
0956e15
 
407f4f9
acd212a
d911a45
407f4f9
23b1f8d
407f4f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d911a45
407f4f9
 
 
 
 
 
0956e15
 
acd212a
407f4f9
 
 
 
 
 
 
 
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
import gradio as gr
from huggingface_hub import InferenceClient
import os
from datetime import datetime

DOCUMENT_TYPES = {
    "resposta_acusacao": "Resposta à Acusação (Art. 396-A do CPP)",
    "habeas_corpus": "Habeas Corpus (Art. 647 do CPP)", 
    "revogacao_preventiva": "Revogação de Prisão Preventiva (Art. 316 do CPP)",
    "liberdade_provisoria": "Liberdade Provisória (Art. 321 do CPP)",
    "relaxamento_prisao": "Relaxamento de Prisão (Art. 5º, LXV, CF)",
    "apelacao": "Recurso de Apelação (Art. 593 do CPP)",
    "embargos": "Embargos de Declaração (Art. 382 do CPP)"
}

TEMPLATE_PENAL = """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}/{estado}

AUTOS Nº {num_processo}

{tipo_peca}

I - QUALIFICAÇÃO DAS PARTES
{nome}, brasileiro(a), {idade} anos, {estado_civil}, {profissao}, RG nº {rg}, CPF nº {cpf}, residente e domiciliado à {endereco}, {cidade}/{estado}, vem, por seu advogado que esta subscreve, com fundamento na legislação aplicável, apresentar {tipo_documento}, pelos fatos e fundamentos a seguir expostos.

II - FUNDAMENTOS JURÍDICOS
1. {fundamentos}
2. {elementos_tipo_penal}

III - JURISPRUDÊNCIA APLICÁVEL
1. {jurisprudencia_1}
2. {jurisprudencia_2}

IV - DOUTRINA APLICÁVEL
1. {doutrina_1}
2. {doutrina_2}

V - PRELIMINARES
1. {preliminar_1}
2. {preliminar_2}

VI - MÉRITO
1. {merito_1}
2. {merito_2}
3. {merito_3}

VII - PEDIDOS
1. PRELIMINARMENTE:
   a) {pedido_preliminar_1}
   b) {pedido_preliminar_2}

2. NO MÉRITO:
   a) {pedido_merito_1}
   b) {pedido_merito_2}

3. PROVAS A PRODUZIR:
   {provas}

{cidade}, {data}

{advogado}
OAB/{estado} {oab}

ROL DE TESTEMUNHAS:
{testemunhas}
"""

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 _format_date(self) -> str:
        return datetime.now().strftime("%d de %B de %Y")

    def _build_prompt(self, doc_type: str, dados: dict) -> str:
        # Instruções base para o modelo
        system_prompt = """Você é um advogado criminalista especialista com anos de experiência.
Ao gerar peças processuais:
1. Use linguagem jurídica formal e técnica
2. Cite jurisprudência atual e relevante
3. Faça referências doutrinárias precisas
4. Desenvolva argumentos específicos para o caso
5. Mantenha coerência em toda a peça
6. Adapte os argumentos ao tipo de documento
7. Use legislação atualizada e pertinente"""

        # Prompt específico para o caso
        case_prompt = f"""TIPO DE PEÇA: {DOCUMENT_TYPES[doc_type]}

DADOS DO CASO:
Cliente: {dados['nome']}
Fatos: {dados['fatos']}
Comarca: {dados['comarca']}
Vara: {dados['vara']}

ELEMENTOS ESPECÍFICOS A INCLUIR:
1. Fundamentos específicos sobre {doc_type}
2. Jurisprudência favorável recente
3. Argumentos técnicos sobre {doc_type}
4. Pedidos adequados ao tipo de peça
5. Provas pertinentes ao caso

BASE PARA GERAÇÃO:
{TEMPLATE_PENAL}"""

        return system_prompt, case_prompt

    def generate(self, doc_type: str, dados: dict) -> str:
        try:
            system_prompt, case_prompt = self._build_prompt(doc_type, dados)
            dados['data'] = self._format_date()
            
            response = self.client.chat.completions.create(
                model="mistralai/Mistral-7B-Instruct-v0.3",
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": case_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_submit(doc_type, fatos, comarca, vara, cliente, oab, proc_num, 
                      idade, estado_civil, profissao, rg, cpf, endereco, testemunhas):
        dados = {
            "tipo_peca": DOCUMENT_TYPES[doc_type],
            "nome": cliente,
            "fatos": fatos,
            "comarca": comarca,
            "vara": vara,
            "oab": oab,
            "num_processo": proc_num,
            "idade": idade,
            "estado_civil": estado_civil,
            "profissao": profissao,
            "rg": rg,
            "cpf": cpf,
            "endereco": endereco,
            "testemunhas": testemunhas
        }
        return LegalDocGenerator().generate(doc_type, dados)

    with gr.Blocks(theme=gr.themes.Soft()) as demo:
        gr.Markdown("# Sistema de Geração de Peças Criminais v2.0")
        
        with gr.Tab("Dados do Processo"):
            with gr.Row():
                tipo = gr.Dropdown(choices=list(DOCUMENT_TYPES.keys()), 
                                 value="resposta_acusacao",
                                 label="Tipo de Peça")
                proc_num = gr.Textbox(label="Número do Processo",
                                    placeholder="0000000-00.0000.0.00.0000")
            
            with gr.Row():
                comarca = gr.Textbox(label="Comarca")
                vara = gr.Textbox(label="Vara Criminal")

        with gr.Tab("Dados do Cliente"):
            with gr.Row():
                cliente = gr.Textbox(label="Nome Completo")
                idade = gr.Number(label="Idade")
                estado_civil = gr.Dropdown(label="Estado Civil",
                                         choices=["Solteiro(a)", "Casado(a)", "Divorciado(a)", "Viúvo(a)"])
            
            with gr.Row():
                profissao = gr.Textbox(label="Profissão")
                rg = gr.Textbox(label="RG")
                cpf = gr.Textbox(label="CPF")
            
            endereco = gr.Textbox(label="Endereço Completo")

        with gr.Tab("Dados do Caso"):
            fatos = gr.TextArea(label="Descrição dos Fatos",
                              placeholder="Descreva detalhadamente a situação...",
                              lines=5)
            
            testemunhas = gr.TextArea(label="Rol de Testemunhas",
                                    placeholder="Nome completo e qualificação de cada testemunha",
                                    lines=3)

        with gr.Tab("Dados do Advogado"):
            oab = gr.Textbox(label="Número da OAB com Estado")

        doc_output = gr.TextArea(label="Documento Gerado",
                               lines=30,
                               show_copy_button=True)
        
        submit_btn = gr.Button("Gerar Peça Processual", variant="primary")
        submit_btn.click(
            fn=process_submit,
            inputs=[tipo, fatos, comarca, vara, cliente, oab, proc_num,
                   idade, estado_civil, profissao, rg, cpf, endereco, testemunhas],
            outputs=doc_output
        )

        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",
             35, "Casado(a)", "Comerciante", "12.345.678-9", "123.456.789-00",
             "Rua das Flores, 123, Centro", 
             "1. Maria Oliveira - Testemunha ocular\n2. José Santos - Empregador do acusado"]
        ], inputs=[tipo, fatos, comarca, vara, cliente, oab, proc_num,
                  idade, estado_civil, profissao, rg, cpf, endereco, testemunhas])

    return demo

if __name__ == "__main__":
    create_interface().launch()