DHEIVER commited on
Commit
1c9032d
·
verified ·
1 Parent(s): 92f52a0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +115 -127
app.py CHANGED
@@ -3,7 +3,7 @@ import os
3
  from datetime import datetime
4
  from huggingface_hub import InferenceClient
5
 
6
- class DocumentGenerator:
7
  def __init__(self):
8
  self.api_key = os.getenv("HF_API_KEY")
9
  if not self.api_key:
@@ -11,61 +11,55 @@ class DocumentGenerator:
11
  self.client = InferenceClient(api_key=self.api_key)
12
 
13
  self.templates = {
14
- "denuncia": {
15
- "system": """Você é um promotor de justiça experiente, especializado em redigir denúncias criminais.
16
- Seu objetivo é gerar denúncias precisas e tecnicamente corretas.""",
17
  "sections": {
18
- "cabecalho": "EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}",
19
- "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:
 
 
 
 
 
20
 
21
- {nome_reu}, {qualificacao_reu}""",
22
- "narrativa": "{narrativa}",
23
- "tipificacao": """Assim agindo, {nome_reu} incorreu nas sanções do artigo {artigo} do Código Penal.""",
24
- "pedido": """Ante o exposto, o Ministério Público requer:
25
 
26
- 1. O recebimento e autuação da presente denúncia;
27
- 2. A citação do denunciado para responder à acusação por escrito, no prazo de 10 (dez) dias;
28
- 3. A intimação das testemunhas abaixo arroladas;
29
- 4. Ao final, a condenação do denunciado nas penas do artigo {artigo} do Código Penal.
30
 
31
- Rol de Testemunhas:
32
- {testemunhas}
33
 
34
  {comarca}, {data}
35
 
36
- Promotor(a) de Justiça"""
 
37
  }
38
  },
39
- "alegacoes_finais": {
40
- "system": """Você é um promotor de justiça experiente, especializado em redigir alegações finais criminais.
41
- Seu objetivo é gerar alegações finais precisas e tecnicamente corretas.""",
42
  "sections": {
43
  "cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}
44
 
45
  Processo nº: {numero_processo}""",
46
- "relatorio": "{narrativa_processual}",
47
- "fundamentacao": "{fundamentacao}",
48
- "pedido": """Ante o exposto, o Ministério Público requer a {pedido_final}.
 
 
 
 
 
 
49
 
50
  {comarca}, {data}
51
 
52
- Promotor(a) de Justiça"""
 
53
  }
54
  }
55
  }
56
 
57
- def generate_section(self, messages: list, section: str) -> str:
58
- try:
59
- response = self.client.chat.completions.create(
60
- model="mistralai/Mistral-7B-Instruct-v0.3",
61
- messages=[*messages, {"role": "user", "content": f"Gere a seção {section}"}],
62
- max_tokens=500,
63
- temperature=0.3
64
- )
65
- return response.choices[0].message["content"]
66
- except Exception as e:
67
- raise Exception(f"Erro na geração da seção {section}: {str(e)}")
68
-
69
  def gerar_documento(self, tipo_documento: str, dados: dict) -> str:
70
  template = self.templates.get(tipo_documento)
71
  if not template:
@@ -82,10 +76,8 @@ Promotor(a) de Justiça"""
82
  for section_name, section_template in template["sections"].items():
83
  try:
84
  if any(key in section_template for key in dados.keys()):
85
- # Se o template tem placeholders, usa os dados fornecidos
86
  section_content = section_template.format(**dados)
87
  else:
88
- # Senão, gera conteúdo via Mistral
89
  section_content = self.generate_section(messages, section_name)
90
  documento += section_content + "\n\n"
91
  except Exception as e:
@@ -93,104 +85,106 @@ Promotor(a) de Justiça"""
93
 
94
  return documento
95
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  def interface():
97
- gerador = DocumentGenerator()
98
 
99
- def processar(tipo_doc, comarca, vara, estado, nome_reu, qualificacao, narrativa, artigo, testemunhas,
100
- numero_processo="", narrativa_processual="", fundamentacao="", pedido_final=""):
101
  dados = {
102
  "comarca": comarca,
103
  "vara": vara,
104
  "estado": estado,
105
- "nome_reu": nome_reu,
106
- "qualificacao_reu": qualificacao,
107
- "narrativa": narrativa,
108
- "artigo": artigo,
109
- "testemunhas": testemunhas,
110
  "numero_processo": numero_processo,
111
- "narrativa_processual": narrativa_processual,
112
- "fundamentacao": fundamentacao,
113
- "pedido_final": pedido_final
 
 
 
 
114
  }
115
 
116
  return gerador.gerar_documento(tipo_doc, dados)
117
 
118
- with gr.Blocks(title="Gerador de Peças Jurídicas Criminais") as demo:
119
- gr.Markdown("""# Gerador de Peças Jurídicas Criminais
120
-
121
- Preencha os campos abaixo para gerar automaticamente denúncias e alegações finais criminais.""")
122
 
123
  with gr.Row():
124
  tipo_documento = gr.Radio(
125
- choices=["denuncia", "alegacoes_finais"],
126
  label="Tipo de Documento",
127
- value="denuncia"
128
  )
129
 
130
  with gr.Row():
131
  with gr.Column():
132
- comarca = gr.Textbox(
133
- label="Comarca",
134
- placeholder="São Paulo"
135
- )
136
- vara = gr.Textbox(
137
- label="Vara",
138
- placeholder=""
139
- )
140
- estado = gr.Textbox(
141
- label="Estado",
142
- placeholder="São Paulo"
143
  )
144
  nome_reu = gr.Textbox(
145
- label="Nome do Réu",
146
  placeholder="João da Silva"
147
  )
148
- qualificacao = gr.Textbox(
149
- label="Qualificação do Réu",
150
- placeholder="brasileiro, casado, comerciante, RG 12.345.678-9 SSP/SP"
151
- )
152
 
153
  with gr.Column():
154
- narrativa = gr.Textbox(
155
- label="Narrativa dos Fatos",
156
- lines=5,
157
- placeholder="No dia 10 de janeiro de 2024, por volta das 14h..."
158
- )
159
- artigo = gr.Textbox(
160
- label="Artigo(s) do CP",
161
- placeholder="155, caput"
162
- )
163
- testemunhas = gr.Textbox(
164
- label="Testemunhas",
165
  lines=3,
166
- placeholder="1. Maria Santos - Policial Militar\n2. José Oliveira - Testemunha presencial"
 
167
  )
168
-
169
- with gr.Row(visible=False) as campos_alegacoes:
170
- with gr.Column():
171
- numero_processo = gr.Textbox(
172
- label="Número do Processo",
173
- placeholder="0000000-00.0000.0.00.0000"
174
- )
175
- narrativa_processual = gr.Textbox(
176
- label="Narrativa Processual",
177
  lines=5,
178
- placeholder="Trata-se de ação penal..."
 
 
 
 
 
 
179
  )
180
- fundamentacao = gr.Textbox(
181
- label="Fundamentação",
182
  lines=5,
183
- placeholder="A materialidade delitiva está comprovada..."
 
184
  )
185
- pedido_final = gr.Textbox(
186
- label="Pedido Final",
187
- placeholder="condenação do réu nas sanções do art. 155, caput, do Código Penal"
 
188
  )
189
 
190
  def atualizar_campos(escolha):
191
- return gr.Row(visible=(escolha == "alegacoes_finais"))
 
 
 
 
192
 
193
- tipo_documento.change(atualizar_campos, tipo_documento, campos_alegacoes)
 
 
 
 
194
 
195
  with gr.Row():
196
  gerar_btn = gr.Button("Gerar Documento", variant="primary")
@@ -202,33 +196,29 @@ Preencha os campos abaixo para gerar automaticamente denúncias e alegações fi
202
  show_copy_button=True
203
  )
204
 
205
- # Exemplo de dados
206
- exemplo_denuncia = {
207
- "tipo_doc": "denuncia",
208
  "comarca": "São Paulo",
209
  "vara": "1ª",
210
- "estado": "São Paulo",
 
 
211
  "nome_reu": "João da Silva",
212
- "qualificacao": "brasileiro, casado, comerciante, RG 12.345.678-9 SSP/SP",
213
- "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.",
214
- "artigo": "155, caput",
215
- "testemunhas": "1. Maria Santos - Vítima\n2. Pedro Oliveira - Policial Militar\n3. Ana Costa - Testemunha presencial",
216
- "numero_processo": "",
217
- "narrativa_processual": "",
218
- "fundamentacao": "",
219
- "pedido_final": ""
220
  }
221
 
222
  gr.Examples(
223
- examples=[[exemplo_denuncia[k] for k in [
224
- "tipo_doc", "comarca", "vara", "estado", "nome_reu", "qualificacao",
225
- "narrativa", "artigo", "testemunhas", "numero_processo",
226
- "narrativa_processual", "fundamentacao", "pedido_final"
227
  ]]],
228
  inputs=[
229
- tipo_documento, comarca, vara, estado, nome_reu, qualificacao,
230
- narrativa, artigo, testemunhas, numero_processo,
231
- narrativa_processual, fundamentacao, pedido_final
232
  ],
233
  label="Exemplos"
234
  )
@@ -236,23 +226,21 @@ Preencha os campos abaixo para gerar automaticamente denúncias e alegações fi
236
  gerar_btn.click(
237
  processar,
238
  inputs=[
239
- tipo_documento, comarca, vara, estado, nome_reu, qualificacao,
240
- narrativa, artigo, testemunhas, numero_processo,
241
- narrativa_processual, fundamentacao, pedido_final
242
  ],
243
  outputs=saida
244
  )
245
 
246
  def limpar():
247
- return [""] * 13
248
 
249
  limpar_btn.click(
250
  limpar,
251
  inputs=None,
252
  outputs=[
253
- tipo_documento, comarca, vara, estado, nome_reu, qualificacao,
254
- narrativa, artigo, testemunhas, numero_processo,
255
- narrativa_processual, fundamentacao, pedido_final
256
  ]
257
  )
258
 
 
3
  from datetime import datetime
4
  from huggingface_hub import InferenceClient
5
 
6
+ class DefenseGenerator:
7
  def __init__(self):
8
  self.api_key = os.getenv("HF_API_KEY")
9
  if not self.api_key:
 
11
  self.client = InferenceClient(api_key=self.api_key)
12
 
13
  self.templates = {
14
+ "resposta_acusacao": {
15
+ "system": "Você é um advogado criminalista experiente, especializado em respostas à acusação.",
 
16
  "sections": {
17
+ "cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}
18
+
19
+ Processo nº: {numero_processo}""",
20
+ "qualificacao": """{nome_reu}, já qualificado nos autos do processo em epígrafe, por seu advogado que esta subscreve, vem, respeitosamente, à presença de Vossa Excelência, apresentar RESPOSTA À ACUSAÇÃO, nos termos do art. 396-A do Código de Processo Penal, pelos fatos e fundamentos a seguir expostos:""",
21
+ "preliminares": "{preliminares}",
22
+ "merito": "{merito}",
23
+ "provas": """Para provar o alegado, requer-se a produção de todos os meios de prova em direito admitidos, especialmente:
24
 
25
+ {provas}""",
26
+ "pedidos": """Ante o exposto, requer:
 
 
27
 
28
+ {pedidos}
 
 
 
29
 
30
+ Termos em que,
31
+ Pede deferimento.
32
 
33
  {comarca}, {data}
34
 
35
+ Advogado(a)
36
+ OAB/{estado} {numero_oab}"""
37
  }
38
  },
39
+ "alegacoes_defesa": {
40
+ "system": "Você é um advogado criminalista experiente, especializado em alegações finais.",
 
41
  "sections": {
42
  "cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}
43
 
44
  Processo nº: {numero_processo}""",
45
+ "qualificacao": """{nome_reu}, já qualificado nos autos do processo em epígrafe, por seu advogado que esta subscreve, vem, respeitosamente, à presença de Vossa Excelência, apresentar suas ALEGAÇÕES FINAIS, pelos fatos e fundamentos a seguir expostos:""",
46
+ "relatorio": "{relatorio}",
47
+ "merito": "{merito}",
48
+ "pedidos": """Ante o exposto, requer:
49
+
50
+ {pedidos}
51
+
52
+ Termos em que,
53
+ Pede deferimento.
54
 
55
  {comarca}, {data}
56
 
57
+ Advogado(a)
58
+ OAB/{estado} {numero_oab}"""
59
  }
60
  }
61
  }
62
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  def gerar_documento(self, tipo_documento: str, dados: dict) -> str:
64
  template = self.templates.get(tipo_documento)
65
  if not template:
 
76
  for section_name, section_template in template["sections"].items():
77
  try:
78
  if any(key in section_template for key in dados.keys()):
 
79
  section_content = section_template.format(**dados)
80
  else:
 
81
  section_content = self.generate_section(messages, section_name)
82
  documento += section_content + "\n\n"
83
  except Exception as e:
 
85
 
86
  return documento
87
 
88
+ def generate_section(self, messages: list, section: str) -> str:
89
+ try:
90
+ response = self.client.chat.completions.create(
91
+ model="mistralai/Mistral-7B-Instruct-v0.3",
92
+ messages=[*messages, {"role": "user", "content": f"Gere a seção {section}"}],
93
+ max_tokens=500,
94
+ temperature=0.3
95
+ )
96
+ return response.choices[0].message["content"]
97
+ except Exception as e:
98
+ raise Exception(f"Erro na geração da seção {section}: {str(e)}")
99
+
100
  def interface():
101
+ gerador = DefenseGenerator()
102
 
103
+ def processar(tipo_doc, comarca, vara, estado, numero_processo, nome_reu,
104
+ preliminares, merito, provas, pedidos, relatorio, numero_oab):
105
  dados = {
106
  "comarca": comarca,
107
  "vara": vara,
108
  "estado": estado,
 
 
 
 
 
109
  "numero_processo": numero_processo,
110
+ "nome_reu": nome_reu,
111
+ "preliminares": preliminares,
112
+ "merito": merito,
113
+ "provas": provas,
114
+ "pedidos": pedidos,
115
+ "relatorio": relatorio,
116
+ "numero_oab": numero_oab
117
  }
118
 
119
  return gerador.gerar_documento(tipo_doc, dados)
120
 
121
+ with gr.Blocks(title="Gerador de Peças da Defesa Criminal") as demo:
122
+ gr.Markdown("# Gerador de Peças da Defesa Criminal")
 
 
123
 
124
  with gr.Row():
125
  tipo_documento = gr.Radio(
126
+ choices=["resposta_acusacao", "alegacoes_defesa"],
127
  label="Tipo de Documento",
128
+ value="resposta_acusacao"
129
  )
130
 
131
  with gr.Row():
132
  with gr.Column():
133
+ comarca = gr.Textbox(label="Comarca", placeholder="São Paulo")
134
+ vara = gr.Textbox(label="Vara", placeholder="1ª")
135
+ estado = gr.Textbox(label="Estado", placeholder="SP")
136
+ numero_oab = gr.Textbox(label="Número OAB", placeholder="123456")
137
+ numero_processo = gr.Textbox(
138
+ label="Número do Processo",
139
+ placeholder="0000000-00.0000.0.00.0000"
 
 
 
 
140
  )
141
  nome_reu = gr.Textbox(
142
+ label="Nome do(a) Cliente",
143
  placeholder="João da Silva"
144
  )
 
 
 
 
145
 
146
  with gr.Column():
147
+ preliminares = gr.Textbox(
148
+ label="Preliminares",
 
 
 
 
 
 
 
 
 
149
  lines=3,
150
+ placeholder="1. Inépcia da denúncia...",
151
+ visible=True
152
  )
153
+ merito = gr.Textbox(
154
+ label="Mérito",
 
 
 
 
 
 
 
155
  lines=5,
156
+ placeholder="No mérito, deve-se ressaltar que..."
157
+ )
158
+ provas = gr.Textbox(
159
+ label="Provas Requeridas",
160
+ lines=3,
161
+ placeholder="1. Oitiva das testemunhas...",
162
+ visible=True
163
  )
164
+ relatorio = gr.Textbox(
165
+ label="Relatório",
166
  lines=5,
167
+ placeholder="Trata-se de ação penal...",
168
+ visible=False
169
  )
170
+ pedidos = gr.Textbox(
171
+ label="Pedidos",
172
+ lines=3,
173
+ placeholder="1. Absolvição..."
174
  )
175
 
176
  def atualizar_campos(escolha):
177
+ return [
178
+ gr.Textbox(visible=(escolha == "resposta_acusacao")), # preliminares
179
+ gr.Textbox(visible=(escolha == "resposta_acusacao")), # provas
180
+ gr.Textbox(visible=(escolha == "alegacoes_defesa")) # relatorio
181
+ ]
182
 
183
+ tipo_documento.change(
184
+ atualizar_campos,
185
+ tipo_documento,
186
+ [preliminares, provas, relatorio]
187
+ )
188
 
189
  with gr.Row():
190
  gerar_btn = gr.Button("Gerar Documento", variant="primary")
 
196
  show_copy_button=True
197
  )
198
 
199
+ exemplo_resposta = {
200
+ "tipo_doc": "resposta_acusacao",
 
201
  "comarca": "São Paulo",
202
  "vara": "1ª",
203
+ "estado": "SP",
204
+ "numero_oab": "123456",
205
+ "numero_processo": "0000000-11.2024.8.26.0000",
206
  "nome_reu": "João da Silva",
207
+ "preliminares": "1. Inépcia da denúncia, vez que não descreve adequadamente a conduta do denunciado;\n2. Ausência de justa causa para a ação penal.",
208
+ "merito": "No mérito, deve-se ressaltar que o denunciado não praticou o crime que lhe é imputado. As testemunhas arroladas pela acusação apresentam contradições em seus depoimentos...",
209
+ "provas": "1. Oitiva das testemunhas arroladas;\n2. Juntada de documentos;\n3. Perícia técnica.",
210
+ "pedidos": "1. O acolhimento das preliminares, com o consequente trancamento da ação penal;\n2. Subsidiariamente, a absolvição do acusado.",
211
+ "relatorio": ""
 
 
 
212
  }
213
 
214
  gr.Examples(
215
+ examples=[[exemplo_resposta[k] for k in [
216
+ "tipo_doc", "comarca", "vara", "estado", "numero_processo", "nome_reu",
217
+ "preliminares", "merito", "provas", "pedidos", "relatorio", "numero_oab"
 
218
  ]]],
219
  inputs=[
220
+ tipo_documento, comarca, vara, estado, numero_processo, nome_reu,
221
+ preliminares, merito, provas, pedidos, relatorio, numero_oab
 
222
  ],
223
  label="Exemplos"
224
  )
 
226
  gerar_btn.click(
227
  processar,
228
  inputs=[
229
+ tipo_documento, comarca, vara, estado, numero_processo, nome_reu,
230
+ preliminares, merito, provas, pedidos, relatorio, numero_oab
 
231
  ],
232
  outputs=saida
233
  )
234
 
235
  def limpar():
236
+ return [""] * 12
237
 
238
  limpar_btn.click(
239
  limpar,
240
  inputs=None,
241
  outputs=[
242
+ tipo_documento, comarca, vara, estado, numero_processo, nome_reu,
243
+ preliminares, merito, provas, pedidos, relatorio, numero_oab
 
244
  ]
245
  )
246