DHEIVER commited on
Commit
23b1f8d
·
verified ·
1 Parent(s): 4ae1270

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +109 -237
app.py CHANGED
@@ -11,37 +11,15 @@ class DefenseGenerator:
11
  self.client = InferenceClient(api_key=self.api_key)
12
 
13
  self.templates = {
14
- "habeas_corpus": {
15
- "system": "Você é um advogado criminalista especializado em Habeas Corpus.",
16
- "sections": {
17
- "cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) DESEMBARGADOR(A) DO EGRÉGIO TRIBUNAL DE JUSTIÇA DO ESTADO DE {estado}""",
18
- "qualificacao": """{nome_reu}, {qualificacao_reu}, vem, por seu advogado, impetrar HABEAS CORPUS, com fundamento no art. 5º, LXVIII, da Constituição Federal e arts. 647 e seguintes do Código de Processo Penal, em face de ato do MM. Juiz de Direito da {vara} Vara Criminal da Comarca de {comarca}, pelos fatos e fundamentos a seguir expostos:""",
19
- "fundamentos": "{fundamentos}",
20
- "pedidos": """Ante o exposto, requer:
21
-
22
- {pedidos}
23
-
24
- Termos em que,
25
- Pede deferimento.
26
-
27
- {comarca}, {data}
28
-
29
- Advogado(a)
30
- OAB/{estado} {numero_oab}"""
31
- }
32
- },
33
- "revogacao_prisao_preventiva": {
34
- "system": "Você é um advogado criminalista especializado em pedidos de revogação de prisão preventiva.",
35
  "sections": {
36
- "cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}
37
-
38
- Processo nº: {numero_processo}""",
39
- "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, com fundamento no art. 316 do Código de Processo Penal, requerer a REVOGAÇÃO DA PRISÃO PREVENTIVA, pelos motivos de fato e de direito a seguir expostos:""",
40
- "fundamentos": "{fundamentos}",
41
- "pedidos": """Ante o exposto, requer-se a revogação da prisão preventiva, com a expedição do competente alvará de soltura.
42
-
43
- Termos em que,
44
- Pede deferimento.
45
 
46
  {comarca}, {data}
47
 
@@ -49,24 +27,14 @@ Advogado(a)
49
  OAB/{estado} {numero_oab}"""
50
  }
51
  },
52
- "resposta_acusacao": {
53
- "system": "Você é um advogado criminalista experiente, especializado em respostas à acusação.",
54
  "sections": {
55
- "cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}
56
-
57
- Processo nº: {numero_processo}""",
58
- "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:""",
59
- "preliminares": "{preliminares}",
60
  "merito": "{merito}",
61
- "provas": """Para provar o alegado, requer-se a produção de todos os meios de prova em direito admitidos, especialmente:
62
-
63
- {provas}""",
64
- "pedidos": """Ante o exposto, requer:
65
-
66
- {pedidos}
67
-
68
- Termos em que,
69
- Pede deferimento.
70
 
71
  {comarca}, {data}
72
 
@@ -74,21 +42,13 @@ Advogado(a)
74
  OAB/{estado} {numero_oab}"""
75
  }
76
  },
77
- "alegacoes_defesa": {
78
- "system": "Você é um advogado criminalista experiente, especializado em alegações finais.",
79
  "sections": {
80
- "cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}
81
-
82
- Processo nº: {numero_processo}""",
83
- "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:""",
84
- "relatorio": "{relatorio}",
85
- "merito": "{merito}",
86
- "pedidos": """Ante o exposto, requer:
87
-
88
- {pedidos}
89
-
90
- Termos em que,
91
- Pede deferimento.
92
 
93
  {comarca}, {data}
94
 
@@ -98,13 +58,24 @@ OAB/{estado} {numero_oab}"""
98
  }
99
  }
100
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  def gerar_documento(self, tipo_documento: str, dados: dict) -> str:
102
  template = self.templates.get(tipo_documento)
103
  if not template:
104
  return "Tipo de documento não encontrado"
105
 
106
  dados['data'] = datetime.now().strftime("%d/%m/%Y")
107
-
108
  messages = [
109
  {"role": "system", "content": template["system"]},
110
  {"role": "user", "content": f"Dados para geração de {tipo_documento}:\n{str(dados)}"}
@@ -113,206 +84,107 @@ OAB/{estado} {numero_oab}"""
113
  documento = ""
114
  for section_name, section_template in template["sections"].items():
115
  try:
116
- if any(key in section_template for key in dados.keys()):
117
- section_content = section_template.format(**dados)
118
- else:
119
- section_content = self.generate_section(messages, section_name)
120
  documento += section_content + "\n\n"
121
- except Exception as e:
122
- documento += f"[Erro na seção {section_name}: {str(e)}]\n\n"
 
 
 
 
123
 
124
  return documento
125
 
126
- def generate_section(self, messages: list, section: str) -> str:
127
- try:
128
- response = self.client.chat.completions.create(
129
- model="mistralai/Mistral-7B-Instruct-v0.3",
130
- messages=[*messages, {"role": "user", "content": f"Gere a seção {section}"}],
131
- max_tokens=500,
132
- temperature=0.3
133
- )
134
- return response.choices[0].message["content"]
135
- except Exception as e:
136
- raise Exception(f"Erro na geração da seção {section}: {str(e)}")
137
-
138
  def interface():
139
  gerador = DefenseGenerator()
140
 
141
- tipo_peca_descricoes = {
142
- "resposta_acusacao": "Apresentar defesa inicial após o recebimento da denúncia",
143
- "alegacoes_defesa": "Apresentar argumentos finais após a instrução",
144
- "habeas_corpus": "Impetrar HC contra prisão ou ameaça à liberdade",
145
- "recurso_em_sentido_estrito": "Recorrer de decisões interlocutórias",
146
- "apelacao": "Recorrer da sentença",
147
- "embargos_declaracao": "Esclarecer pontos omissos/contraditórios",
148
- "revogacao_prisao_preventiva": "Requerer revogação de prisão preventiva",
149
- "relaxamento_prisao": "Requerer relaxamento de prisão ilegal",
150
- "liberdade_provisoria": "Requerer liberdade provisória"
151
- }
152
-
153
- def processar(tipo_doc, comarca, vara, estado, numero_processo, nome_reu,
154
- preliminares, merito, provas, pedidos, relatorio, numero_oab):
155
- dados = {
156
- "comarca": comarca,
157
- "vara": vara,
158
- "estado": estado,
159
- "numero_processo": numero_processo,
160
- "nome_reu": nome_reu,
161
- "preliminares": preliminares,
162
- "merito": merito,
163
- "provas": provas,
164
- "pedidos": pedidos,
165
- "relatorio": relatorio,
166
- "numero_oab": numero_oab
167
- }
168
 
169
- return gerador.gerar_documento(tipo_doc, dados)
170
-
171
- with gr.Blocks(title="Gerador de Peças da Defesa Criminal") as demo:
172
- gr.Markdown("# Gerador de Peças da Defesa Criminal")
173
-
174
- with gr.Row():
175
- gr.Markdown("""### Selecione o tipo de peça que deseja gerar:
176
-
177
- Cada opção é adequada para diferentes momentos processuais e estratégias de defesa.""")
178
-
179
  with gr.Row():
180
  tipo_peca = gr.Dropdown(
181
- choices=list(tipo_peca_descricoes.keys()),
182
- label="Tipo de Peça",
183
- value="resposta_acusacao",
184
- info="Selecione o tipo específico de peça criminal"
185
- )
186
-
187
- with gr.Row():
188
- gr.Markdown(lambda x: f"**Descrição:** {tipo_peca_descricoes.get(x, '')}", every=100)
189
- tipo_peca.change(lambda x: f"**Descrição:** {tipo_peca_descricoes.get(x, '')}", tipo_peca)
190
-
191
- with gr.Row():
192
- tipo_documento = gr.Radio(
193
- choices=["resposta_acusacao", "alegacoes_defesa"],
194
- label="Tipo de Documento",
195
  value="resposta_acusacao"
196
  )
197
-
198
  with gr.Row():
199
  with gr.Column():
200
- comarca = gr.Textbox(label="Comarca", placeholder="São Paulo")
201
- vara = gr.Textbox(label="Vara", placeholder="1ª")
202
- estado = gr.Textbox(label="Estado", placeholder="SP")
203
- numero_oab = gr.Textbox(label="Número OAB", placeholder="123456")
204
- numero_processo = gr.Textbox(
205
- label="Número do Processo",
206
- placeholder="0000000-00.0000.0.00.0000"
207
- )
208
- nome_reu = gr.Textbox(
209
- label="Nome do(a) Cliente",
210
- placeholder="João da Silva"
211
- )
212
 
213
  with gr.Column():
214
- preliminares = gr.Textbox(
215
- label="Preliminares",
216
- lines=3,
217
- placeholder="1. Inépcia da denúncia...",
218
- visible=True
219
- )
220
- merito = gr.Textbox(
221
- label="Mérito",
222
- lines=5,
223
- placeholder="No mérito, deve-se ressaltar que..."
224
- )
225
- provas = gr.Textbox(
226
- label="Provas Requeridas",
227
- lines=3,
228
- placeholder="1. Oitiva das testemunhas...",
229
- visible=True
230
- )
231
- relatorio = gr.Textbox(
232
- label="Relatório",
233
- lines=5,
234
- placeholder="Trata-se de ação penal...",
235
- visible=False
236
- )
237
- pedidos = gr.Textbox(
238
- label="Pedidos",
239
- lines=3,
240
- placeholder="1. Absolvição..."
241
- )
242
-
243
- def atualizar_campos(escolha):
244
- return [
245
- gr.Textbox(visible=(escolha == "resposta_acusacao")), # preliminares
246
- gr.Textbox(visible=(escolha == "resposta_acusacao")), # provas
247
- gr.Textbox(visible=(escolha == "alegacoes_defesa")) # relatorio
248
- ]
249
-
250
- tipo_documento.change(
251
- atualizar_campos,
252
- tipo_documento,
253
- [preliminares, provas, relatorio]
254
- )
255
 
256
  with gr.Row():
257
- gerar_btn = gr.Button("Gerar Documento", variant="primary")
258
- limpar_btn = gr.Button("Limpar Campos")
259
-
260
- saida = gr.Textbox(
261
- label="Documento Gerado",
262
- lines=15,
263
- show_copy_button=True
264
- )
265
-
266
- exemplo_resposta = {
267
- "tipo_doc": "resposta_acusacao",
268
- "comarca": "São Paulo",
269
- "vara": "1ª",
270
- "estado": "SP",
271
- "numero_oab": "123456",
272
- "numero_processo": "0000000-11.2024.8.26.0000",
273
- "nome_reu": "João da Silva",
274
- "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.",
275
- "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...",
276
- "provas": "1. Oitiva das testemunhas arroladas;\n2. Juntada de documentos;\n3. Perícia técnica.",
277
- "pedidos": "1. O acolhimento das preliminares, com o consequente trancamento da ação penal;\n2. Subsidiariamente, a absolvição do acusado.",
278
- "relatorio": ""
279
- }
280
 
281
- gr.Examples(
282
- examples=[[exemplo_resposta[k] for k in [
283
- "tipo_doc", "comarca", "vara", "estado", "numero_processo", "nome_reu",
284
- "preliminares", "merito", "provas", "pedidos", "relatorio", "numero_oab"
285
- ]]],
286
- inputs=[
287
- tipo_documento, comarca, vara, estado, numero_processo, nome_reu,
288
- preliminares, merito, provas, pedidos, relatorio, numero_oab
289
- ],
290
- label="Exemplos"
291
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
292
 
293
- gerar_btn.click(
294
- processar,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  inputs=[
296
- tipo_documento, comarca, vara, estado, numero_processo, nome_reu,
297
- preliminares, merito, provas, pedidos, relatorio, numero_oab
298
  ],
299
- outputs=saida
300
  )
301
 
302
- def limpar():
303
- return [""] * 12
304
-
305
- limpar_btn.click(
306
- limpar,
307
- inputs=None,
308
- outputs=[
309
- tipo_documento, comarca, vara, estado, numero_processo, nome_reu,
310
- preliminares, merito, provas, pedidos, relatorio, numero_oab
311
- ]
312
- )
313
-
314
  return demo
315
 
316
  if __name__ == "__main__":
317
- demo = interface()
318
- demo.launch()
 
11
  self.client = InferenceClient(api_key=self.api_key)
12
 
13
  self.templates = {
14
+ "resposta_acusacao": {
15
+ "system": "Você é um advogado criminalista 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
+ "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:""",
19
+ "preliminares": "{preliminares}",
20
+ "merito": "{merito}",
21
+ "provas": """{provas}""",
22
+ "pedidos": """{pedidos}
 
 
 
23
 
24
  {comarca}, {data}
25
 
 
27
  OAB/{estado} {numero_oab}"""
28
  }
29
  },
30
+ "alegacoes_finais": {
31
+ "system": "Você é um advogado criminalista especializado em alegações finais.",
32
  "sections": {
33
+ "cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}""",
34
+ "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 ALEGAÇÕES FINAIS, pelos fatos e fundamentos a seguir expostos:""",
35
+ "relatorio": "{relatorio}",
 
 
36
  "merito": "{merito}",
37
+ "pedidos": """{pedidos}
 
 
 
 
 
 
 
 
38
 
39
  {comarca}, {data}
40
 
 
42
  OAB/{estado} {numero_oab}"""
43
  }
44
  },
45
+ "habeas_corpus": {
46
+ "system": "Você é um advogado criminalista especializado em Habeas Corpus.",
47
  "sections": {
48
+ "cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) DESEMBARGADOR(A) DO EGRÉGIO TRIBUNAL DE JUSTIÇA DO ESTADO DE {estado}""",
49
+ "qualificacao": """{nome_reu}, {qualificacao}, vem, por seu advogado, impetrar HABEAS CORPUS, com fundamento no art. 5º, LXVIII, da CF e arts. 647 e ss. do CPP, em face de ato do MM. Juiz de Direito da {vara} Vara Criminal da Comarca de {comarca}, pelos fatos e fundamentos a seguir expostos:""",
50
+ "fundamentos": "{fundamentos}",
51
+ "pedidos": """{pedidos}
 
 
 
 
 
 
 
 
52
 
53
  {comarca}, {data}
54
 
 
58
  }
59
  }
60
 
61
+ def generate_section(self, messages: list, section: str) -> str:
62
+ try:
63
+ response = self.client.chat.completions.create(
64
+ model="mistralai/Mistral-7B-Instruct-v0.3",
65
+ messages=[*messages, {"role": "user", "content": f"Gere a seção {section}"}],
66
+ max_tokens=500,
67
+ temperature=0.3
68
+ )
69
+ return response.choices[0].message["content"]
70
+ except Exception as e:
71
+ raise Exception(f"Erro na geração da seção {section}: {str(e)}")
72
+
73
  def gerar_documento(self, tipo_documento: str, dados: dict) -> str:
74
  template = self.templates.get(tipo_documento)
75
  if not template:
76
  return "Tipo de documento não encontrado"
77
 
78
  dados['data'] = datetime.now().strftime("%d/%m/%Y")
 
79
  messages = [
80
  {"role": "system", "content": template["system"]},
81
  {"role": "user", "content": f"Dados para geração de {tipo_documento}:\n{str(dados)}"}
 
84
  documento = ""
85
  for section_name, section_template in template["sections"].items():
86
  try:
87
+ section_content = section_template.format(**dados)
 
 
 
88
  documento += section_content + "\n\n"
89
+ except KeyError:
90
+ try:
91
+ section_content = self.generate_section(messages, section_name)
92
+ documento += section_content + "\n\n"
93
+ except Exception as e:
94
+ documento += f"[Erro na seção {section_name}: {str(e)}]\n\n"
95
 
96
  return documento
97
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  def interface():
99
  gerador = DefenseGenerator()
100
 
101
+ with gr.Blocks() as demo:
102
+ gr.Markdown("# Sistema de Geração de Peças Criminais")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
 
 
 
 
 
 
 
 
 
 
 
104
  with gr.Row():
105
  tipo_peca = gr.Dropdown(
106
+ choices=[
107
+ "resposta_acusacao",
108
+ "alegacoes_finais",
109
+ "habeas_corpus"
110
+ ],
111
+ label="Selecione o tipo de peça",
 
 
 
 
 
 
 
 
112
  value="resposta_acusacao"
113
  )
114
+
115
  with gr.Row():
116
  with gr.Column():
117
+ comarca = gr.Textbox(label="Comarca")
118
+ vara = gr.Textbox(label="Vara")
119
+ estado = gr.Textbox(label="Estado")
120
+ numero_oab = gr.Textbox(label="Número OAB")
 
 
 
 
 
 
 
 
121
 
122
  with gr.Column():
123
+ nome_reu = gr.Textbox(label="Nome do(a) Cliente")
124
+ qualificacao = gr.Textbox(label="Qualificação", visible=False)
125
+ fundamentos = gr.Textbox(label="Fundamentos", visible=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
 
127
  with gr.Row():
128
+ with gr.Column():
129
+ preliminares = gr.Textbox(label="Preliminares", lines=3)
130
+ merito = gr.Textbox(label="Mérito", lines=5)
131
+ provas = gr.Textbox(label="Provas", lines=3)
132
+ pedidos = gr.Textbox(label="Pedidos", lines=3)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
 
134
+ def update_fields(tipo):
135
+ if tipo == "habeas_corpus":
136
+ return {
137
+ qualificacao: gr.update(visible=True),
138
+ fundamentos: gr.update(visible=True),
139
+ preliminares: gr.update(visible=False),
140
+ merito: gr.update(visible=False),
141
+ provas: gr.update(visible=False)
142
+ }
143
+ else:
144
+ return {
145
+ qualificacao: gr.update(visible=False),
146
+ fundamentos: gr.update(visible=False),
147
+ preliminares: gr.update(visible=True),
148
+ merito: gr.update(visible=True),
149
+ provas: gr.update(visible=True)
150
+ }
151
+
152
+ tipo_peca.change(fn=update_fields, inputs=tipo_peca, outputs=[
153
+ qualificacao, fundamentos, preliminares, merito, provas
154
+ ])
155
+
156
+ with gr.Row():
157
+ submit_btn = gr.Button("Gerar Peça")
158
+
159
+ output = gr.Textbox(label="Documento Gerado", lines=20)
160
 
161
+ def process(tipo, comarca, vara, estado, numero_oab, nome_reu, qualificacao,
162
+ fundamentos, preliminares, merito, provas, pedidos):
163
+ dados = {
164
+ "comarca": comarca,
165
+ "vara": vara,
166
+ "estado": estado,
167
+ "numero_oab": numero_oab,
168
+ "nome_reu": nome_reu,
169
+ "qualificacao": qualificacao,
170
+ "fundamentos": fundamentos,
171
+ "preliminares": preliminares,
172
+ "merito": merito,
173
+ "provas": provas,
174
+ "pedidos": pedidos
175
+ }
176
+ return gerador.gerar_documento(tipo, dados)
177
+
178
+ submit_btn.click(
179
+ fn=process,
180
  inputs=[
181
+ tipo_peca, comarca, vara, estado, numero_oab, nome_reu,
182
+ qualificacao, fundamentos, preliminares, merito, provas, pedidos
183
  ],
184
+ outputs=output
185
  )
186
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  return demo
188
 
189
  if __name__ == "__main__":
190
+ interface().launch()