File size: 10,725 Bytes
716ba45
50c782f
1a11491
50c782f
716ba45
50c782f
1a11491
 
 
 
 
 
92f52a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1a11491
 
 
 
 
 
 
 
 
 
 
70a99c2
50c782f
92f52a0
 
 
 
 
 
50c782f
92f52a0
50c782f
 
 
 
92f52a0
 
 
 
 
 
 
 
 
 
 
 
50c782f
1a11491
50c782f
 
9b1e761
50c782f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9b1e761
50c782f
 
ff31e97
50c782f
92f52a0
 
 
2552fb1
50c782f
 
 
 
 
9b1e761
 
3a67a8e
50c782f
92f52a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50c782f
 
92f52a0
50c782f
 
 
 
 
92f52a0
 
 
 
 
 
50c782f
 
 
 
92f52a0
50c782f
 
 
 
92f52a0
 
 
 
50c782f
 
92f52a0
 
50c782f
 
 
92f52a0
 
50c782f
 
 
92f52a0
50c782f
 
 
 
 
 
 
 
92f52a0
 
50c782f
92f52a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50c782f
 
 
1a11491
50c782f
 
 
1a11491
50c782f
3a67a8e
92f52a0
 
 
 
 
 
 
 
 
 
 
 
 
9b1e761
50c782f
 
716ba45
50c782f
 
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
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
import gradio as gr
import os
from datetime import datetime
from huggingface_hub import InferenceClient

class DocumentGenerator:
    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)
        
        self.templates = {
            "denuncia": {
                "system": """Você é um promotor de justiça experiente, especializado em redigir denúncias criminais.
                Seu objetivo é gerar denúncias precisas e tecnicamente corretas.""",
                "sections": {
                    "cabecalho": "EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}",
                    "qualificacao": """O MINISTÉRIO PÚBLICO DO ESTADO DE {estado}, por seu Promotor de Justiça que esta subscreve, no uso de suas atribuições legais, vem perante Vossa Excelência oferecer DENÚNCIA em face de:

{nome_reu}, {qualificacao_reu}""",
                    "narrativa": "{narrativa}",
                    "tipificacao": """Assim agindo, {nome_reu} incorreu nas sanções do artigo {artigo} do Código Penal.""",
                    "pedido": """Ante o exposto, o Ministério Público requer:

1. O recebimento e autuação da presente denúncia;
2. A citação do denunciado para responder à acusação por escrito, no prazo de 10 (dez) dias;
3. A intimação das testemunhas abaixo arroladas;
4. Ao final, a condenação do denunciado nas penas do artigo {artigo} do Código Penal.

Rol de Testemunhas:
{testemunhas}

{comarca}, {data}

Promotor(a) de Justiça"""
                }
            },
            "alegacoes_finais": {
                "system": """Você é um promotor de justiça experiente, especializado em redigir alegações finais criminais.
                Seu objetivo é gerar alegações finais precisas e tecnicamente corretas.""",
                "sections": {
                    "cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}

Processo nº: {numero_processo}""",
                    "relatorio": "{narrativa_processual}",
                    "fundamentacao": "{fundamentacao}",
                    "pedido": """Ante o exposto, o Ministério Público requer a {pedido_final}.

{comarca}, {data}

Promotor(a) de Justiça"""
                }
            }
        }

    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 gerar_documento(self, tipo_documento: str, dados: dict) -> str:
        template = self.templates.get(tipo_documento)
        if not template:
            return "Tipo de documento não encontrado"
            
        dados['data'] = datetime.now().strftime("%d/%m/%Y")
        
        messages = [
            {"role": "system", "content": template["system"]},
            {"role": "user", "content": f"Dados para geração de {tipo_documento}:\n{str(dados)}"}
        ]
        
        documento = ""
        for section_name, section_template in template["sections"].items():
            try:
                if any(key in section_template for key in dados.keys()):
                    # Se o template tem placeholders, usa os dados fornecidos
                    section_content = section_template.format(**dados)
                else:
                    # Senão, gera conteúdo via Mistral
                    section_content = self.generate_section(messages, section_name)
                documento += section_content + "\n\n"
            except Exception as e:
                documento += f"[Erro na seção {section_name}: {str(e)}]\n\n"
                
        return documento

def interface():
    gerador = DocumentGenerator()
    
    def processar(tipo_doc, comarca, vara, estado, nome_reu, qualificacao, narrativa, artigo, testemunhas, 
                 numero_processo="", narrativa_processual="", fundamentacao="", pedido_final=""):
        dados = {
            "comarca": comarca,
            "vara": vara,
            "estado": estado,
            "nome_reu": nome_reu,
            "qualificacao_reu": qualificacao,
            "narrativa": narrativa,
            "artigo": artigo,
            "testemunhas": testemunhas,
            "numero_processo": numero_processo,
            "narrativa_processual": narrativa_processual,
            "fundamentacao": fundamentacao,
            "pedido_final": pedido_final
        }
        
        return gerador.gerar_documento(tipo_doc, dados)

    with gr.Blocks(title="Gerador de Peças Jurídicas Criminais") as demo:
        gr.Markdown("""# Gerador de Peças Jurídicas Criminais
        
Preencha os campos abaixo para gerar automaticamente denúncias e alegações finais criminais.""")
        
        with gr.Row():
            tipo_documento = gr.Radio(
                choices=["denuncia", "alegacoes_finais"],
                label="Tipo de Documento",
                value="denuncia"
            )
            
        with gr.Row():
            with gr.Column():
                comarca = gr.Textbox(
                    label="Comarca",
                    placeholder="São Paulo"
                )
                vara = gr.Textbox(
                    label="Vara",
                    placeholder="1ª"
                )
                estado = gr.Textbox(
                    label="Estado",
                    placeholder="São Paulo"
                )
                nome_reu = gr.Textbox(
                    label="Nome do Réu",
                    placeholder="João da Silva"
                )
                qualificacao = gr.Textbox(
                    label="Qualificação do Réu",
                    placeholder="brasileiro, casado, comerciante, RG 12.345.678-9 SSP/SP"
                )
                
            with gr.Column():
                narrativa = gr.Textbox(
                    label="Narrativa dos Fatos",
                    lines=5,
                    placeholder="No dia 10 de janeiro de 2024, por volta das 14h..."
                )
                artigo = gr.Textbox(
                    label="Artigo(s) do CP",
                    placeholder="155, caput"    
                )
                testemunhas = gr.Textbox(
                    label="Testemunhas",
                    lines=3,
                    placeholder="1. Maria Santos - Policial Militar\n2. José Oliveira - Testemunha presencial"
                )

        with gr.Row(visible=False) as campos_alegacoes:
            with gr.Column():
                numero_processo = gr.Textbox(
                    label="Número do Processo",
                    placeholder="0000000-00.0000.0.00.0000"
                )
                narrativa_processual = gr.Textbox(
                    label="Narrativa Processual",
                    lines=5,
                    placeholder="Trata-se de ação penal..."
                )
                fundamentacao = gr.Textbox(
                    label="Fundamentação",
                    lines=5,
                    placeholder="A materialidade delitiva está comprovada..."
                )
                pedido_final = gr.Textbox(
                    label="Pedido Final",
                    placeholder="condenação do réu nas sanções do art. 155, caput, do Código Penal"
                )

        def atualizar_campos(escolha):
            return gr.Row(visible=(escolha == "alegacoes_finais"))

        tipo_documento.change(atualizar_campos, tipo_documento, campos_alegacoes)
        
        with gr.Row():
            gerar_btn = gr.Button("Gerar Documento", variant="primary")
            limpar_btn = gr.Button("Limpar Campos")
            
        saida = gr.Textbox(
            label="Documento Gerado",
            lines=15,
            show_copy_button=True
        )

        # Exemplo de dados
        exemplo_denuncia = {
            "tipo_doc": "denuncia",
            "comarca": "São Paulo",
            "vara": "1ª",
            "estado": "São Paulo",
            "nome_reu": "João da Silva",
            "qualificacao": "brasileiro, casado, comerciante, RG 12.345.678-9 SSP/SP",
            "narrativa": "No dia 10 de janeiro de 2024, por volta das 14h, na Rua das Flores, 123, Centro, nesta cidade, o denunciado subtraiu para si um telefone celular iPhone 13, avaliado em R$ 5.000,00, pertencente à vítima Maria Santos.",
            "artigo": "155, caput",
            "testemunhas": "1. Maria Santos - Vítima\n2. Pedro Oliveira - Policial Militar\n3. Ana Costa - Testemunha presencial",
            "numero_processo": "",
            "narrativa_processual": "",
            "fundamentacao": "",
            "pedido_final": ""
        }
        
        gr.Examples(
            examples=[[exemplo_denuncia[k] for k in [
                "tipo_doc", "comarca", "vara", "estado", "nome_reu", "qualificacao",
                "narrativa", "artigo", "testemunhas", "numero_processo",
                "narrativa_processual", "fundamentacao", "pedido_final"
            ]]],
            inputs=[
                tipo_documento, comarca, vara, estado, nome_reu, qualificacao,
                narrativa, artigo, testemunhas, numero_processo,
                narrativa_processual, fundamentacao, pedido_final
            ],
            label="Exemplos"
        )
        
        gerar_btn.click(
            processar,
            inputs=[
                tipo_documento, comarca, vara, estado, nome_reu, qualificacao,
                narrativa, artigo, testemunhas, numero_processo,
                narrativa_processual, fundamentacao, pedido_final
            ],
            outputs=saida
        )
        
        def limpar():
            return [""] * 13
            
        limpar_btn.click(
            limpar,
            inputs=None,
            outputs=[
                tipo_documento, comarca, vara, estado, nome_reu, qualificacao,
                narrativa, artigo, testemunhas, numero_processo,
                narrativa_processual, fundamentacao, pedido_final
            ]
        )
    
    return demo

if __name__ == "__main__":
    demo = interface()
    demo.launch()