DHEIVER commited on
Commit
61d1412
·
verified ·
1 Parent(s): c660ad9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +63 -316
app.py CHANGED
@@ -10,358 +10,105 @@ class DefenseGenerator:
10
  raise EnvironmentError("HF_API_KEY não configurada")
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
-
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": "I - PRELIMINARES\n\n{preliminares}",
22
- "merito": "II - MÉRITO\n\n{merito}",
23
- "provas": """III - DAS PROVAS\n\nPara provar o alegado, requer-se a produção de todos os meios de prova em direito admitidos, especialmente:\n\n{provas}""",
24
- "pedidos": """IV - DOS PEDIDOS\n\nAnte o exposto, requer:\n\n{pedidos}
25
-
26
- Termos em que,
27
- Pede deferimento.
28
-
29
- {comarca}, {data}
30
-
31
- Advogado(a)
32
- OAB/{estado} {numero_oab}"""
33
- }
34
- },
35
- "habeas_corpus": {
36
- "system": "Você é um advogado criminalista especializado em Habeas Corpus.",
37
- "sections": {
38
- "cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) DESEMBARGADOR(A) DO EGRÉGIO TRIBUNAL DE JUSTIÇA DO ESTADO DE {estado}""",
39
- "qualificacao": """{nome_reu}, {qualificacao}, vem, por seu advogado que esta subscreve, com fundamento no art. 5º, LXVIII, da Constituição Federal e arts. 647 e seguintes do Código de Processo Penal, impetrar
40
-
41
- HABEAS CORPUS
42
- com pedido liminar
43
-
44
- em face de ato coator praticado pelo MM. Juiz de Direito da {vara} Vara Criminal da Comarca de {comarca}, pelos fatos e fundamentos a seguir expostos:""",
45
- "fundamentos": """I - DOS FATOS E FUNDAMENTOS\n\n{fundamentos}""",
46
- "pedidos": """II - DOS PEDIDOS\n\nAnte o exposto, requer:\n\n{pedidos}
47
-
48
- Termos em que,
49
- Pede deferimento.
50
-
51
- {comarca}, {data}
52
-
53
- Advogado(a)
54
- OAB/{estado} {numero_oab}"""
55
- }
56
- },
57
- "liberdade_provisoria": {
58
- "system": "Você é um advogado criminalista especializado em pedidos de liberdade provisória.",
59
- "sections": {
60
- "cabecalho": """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}
61
-
62
- Processo nº: {numero_processo}""",
63
- "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. 321 do Código de Processo Penal, requerer a
64
-
65
- LIBERDADE PROVISÓRIA
66
- com ou sem fiança
67
-
68
- pelos motivos de fato e de direito a seguir expostos:""",
69
- "fundamentos": """I - DOS FATOS E FUNDAMENTOS\n\n{fundamentos}""",
70
- "pedidos": """II - DOS PEDIDOS\n\nAnte o exposto, requer:\n\n{pedidos}
71
-
72
- Termos em que,
73
- Pede deferimento.
74
-
75
- {comarca}, {data}
76
-
77
- Advogado(a)
78
- OAB/{estado} {numero_oab}"""
79
- }
80
- }
81
  }
82
 
83
- self.exemplos = {
84
- "resposta_acusacao": {
85
- "tipo": "resposta_acusacao",
86
- "comarca": "São Paulo",
87
- "vara": "1ª",
88
- "estado": "SP",
89
- "numero_oab": "123456",
90
- "numero_processo": "0000000-11.2024.8.26.0000",
91
- "nome_reu": "João da Silva",
92
- "qualificacao": "",
93
- "fundamentos": "",
94
- "preliminares": """1. Inépcia da denúncia, vez que não descreve adequadamente a conduta imputada ao denunciado;
95
-
96
- 2. Ausência de justa causa para a ação penal, diante da atipicidade da conduta;""",
97
- "merito": """No mérito, deve-se destacar que o denunciado não praticou o crime que lhe é imputado. As testemunhas arroladas pela acusação apresentam contradições em seus depoimentos que demonstram a fragilidade da acusação.
98
-
99
- Além disso, os elementos de prova colhidos na fase investigativa não foram corroborados sob o crivo do contraditório, sendo insuficientes para embasar uma condenação criminal.""",
100
- "provas": """1. Oitiva das testemunhas abaixo arroladas;
101
- 2. Juntada dos documentos em anexo;
102
- 3. Outras provas admitidas em direito.""",
103
- "pedidos": """1. O acolhimento das preliminares arguidas, com o consequente trancamento da ação penal;
104
-
105
- 2. Subsidiariamente, a absolvição do acusado, nos termos do art. 386, incisos III, V ou VII do Código de Processo Penal;
106
-
107
- 3. A produção de todas as provas requeridas."""
108
- },
109
- "habeas_corpus": {
110
- "tipo": "habeas_corpus",
111
- "comarca": "São Paulo",
112
- "vara": "1ª",
113
- "estado": "SP",
114
- "numero_oab": "123456",
115
- "numero_processo": "0000000-11.2024.8.26.0000",
116
- "nome_reu": "João da Silva",
117
- "qualificacao": "brasileiro, casado, comerciante, RG 12.345.678-9 SSP/SP, CPF 123.456.789-00",
118
- "fundamentos": """O paciente encontra-se preso preventivamente desde 10/01/2024, por suposta prática do crime previsto no art. 155, caput, do Código Penal.
119
-
120
- Contudo, a prisão preventiva carece dos requisitos legais previstos no art. 312 do CPP, vez que:
121
-
122
- 1. O paciente é primário, possui bons antecedentes e residência fixa;
123
- 2. Não há elementos que indiquem risco à ordem pública ou à instrução criminal;
124
- 3. A medida é desproporcional ao crime imputado.""",
125
- "preliminares": "",
126
- "merito": "",
127
- "provas": "",
128
- "pedidos": """1. A concessão de liminar para determinar a imediata soltura do paciente;
129
-
130
- 2. No mérito, a concessão definitiva da ordem para revogar a prisão preventiva;
131
-
132
- 3. Subsidiariamente, a substituição da prisão por medidas cautelares diversas."""
133
- },
134
- "liberdade_provisoria": {
135
- "tipo": "liberdade_provisoria",
136
- "comarca": "São Paulo",
137
- "vara": "1ª",
138
- "estado": "SP",
139
- "numero_oab": "123456",
140
- "numero_processo": "0000000-11.2024.8.26.0000",
141
- "nome_reu": "João da Silva",
142
- "qualificacao": "",
143
- "fundamentos": """O requerente foi preso em flagrante no dia 10/01/2024, pela suposta prática do crime previsto no art. 155, caput, do Código Penal.
144
-
145
- Entretanto, estão ausentes os requisitos que autorizam a conversão do flagrante em prisão preventiva, pois:
146
-
147
- 1. Trata-se de réu primário, com bons antecedentes e residência fixa;
148
- 2. O crime imputado tem pena máxima inferior a 4 anos;
149
- 3. Não há indicativos de que, em liberdade, prejudicará a instrução criminal.""",
150
- "preliminares": "",
151
- "merito": "",
152
- "provas": "",
153
- "pedidos": """1. A concessão da liberdade provisória, preferencialmente sem fiança;
154
-
155
- 2. Subsidiariamente, a fixação de fiança em valor compatível com a situação econômica do requerente;
156
-
157
- 3. A aplicação de medidas cautelares diversas da prisão, se necessário."""
158
- }
159
- }
160
-
161
- def generate_section(self, messages: list, section: str) -> str:
162
  try:
163
  response = self.client.chat.completions.create(
164
  model="mistralai/Mistral-7B-Instruct-v0.3",
165
- messages=[*messages, {"role": "user", "content": f"Gere a seção {section}"}],
166
- max_tokens=500,
167
- temperature=0.3
 
 
 
168
  )
169
  return response.choices[0].message["content"]
170
  except Exception as e:
171
- raise Exception(f"Erro na geração da seção {section}: {str(e)}")
172
 
173
- def gerar_documento(self, tipo_documento: str, dados: dict) -> str:
174
- template = self.templates.get(tipo_documento)
175
- if not template:
176
- return "Tipo de documento não encontrado"
177
-
178
- dados['data'] = datetime.now().strftime("%d/%m/%Y")
179
- messages = [
180
- {"role": "system", "content": template["system"]},
181
- {"role": "user", "content": f"Dados para geração de {tipo_documento}:\n{str(dados)}"}
182
- ]
183
-
184
- documento = ""
185
- for section_name, section_template in template["sections"].items():
186
- try:
187
- section_content = section_template.format(**dados)
188
- documento += section_content + "\n\n"
189
- except KeyError:
190
- try:
191
- section_content = self.generate_section(messages, section_name)
192
- documento += section_content + "\n\n"
193
- except Exception as e:
194
- documento += f"[Erro na seção {section_name}: {str(e)}]\n\n"
195
-
196
- return documento
197
 
198
  def interface():
199
  gerador = DefenseGenerator()
200
 
201
  with gr.Blocks() as demo:
202
- gr.Markdown("""# Sistema de Geração de Peças Criminais
203
-
204
- Este sistema auxilia advogados criminalistas na geração de peças processuais.""")
205
 
206
  with gr.Row():
207
- tipo_peca = gr.Dropdown(
208
- choices=list(gerador.templates.keys()),
209
  label="Tipo de Peça",
210
- value="resposta_acusacao",
211
- info="Selecione o tipo de documento que deseja gerar"
212
  )
213
 
214
  with gr.Row():
215
  with gr.Column():
216
- comarca = gr.Textbox(
217
- label="Comarca",
218
- placeholder="Ex: São Paulo"
219
- )
220
- vara = gr.Textbox(
221
- label="Vara",
222
- placeholder="Ex: 1ª"
223
- )
224
- estado = gr.Textbox(
225
- label="Estado",
226
- placeholder="Ex: SP"
227
- )
228
- numero_oab = gr.Textbox(
229
- label="Número OAB",
230
- placeholder="Ex: 123456"
231
- )
232
- numero_processo = gr.Textbox(
233
- label="Número do Processo",
234
- placeholder="Ex: 0000000-00.0000.0.00.0000"
235
- )
236
 
237
  with gr.Column():
238
- nome_reu = gr.Textbox(
239
- label="Nome do(a) Cliente",
240
- placeholder="Ex: João da Silva"
241
- )
242
- qualificacao = gr.Textbox(
243
- label="Qualificação",
244
- placeholder="Ex: brasileiro, casado, comerciante...",
245
- lines=2,
246
- visible=False
247
- )
248
- fundamentos = gr.Textbox(
249
- label="Fundamentos",
250
- placeholder="Descreva os fundamentos do pedido...",
251
- lines=5,
252
- visible=False
253
- )
254
- preliminares = gr.Textbox(
255
- label="Preliminares",
256
- placeholder="Liste as preliminares...",
257
- lines=3
258
- )
259
- merito = gr.Textbox(
260
- label="Mérito",
261
- placeholder="Desenvolva os argumentos de mérito...",
262
- lines=5
263
- )
264
- provas = gr.Textbox(
265
- label="Provas",
266
- placeholder="Liste as provas requeridas...",
267
- lines=3
268
- )
269
- pedidos = gr.Textbox(
270
- label="Pedidos",
271
- placeholder="Liste os pedidos...",
272
- lines=3
273
- )
274
 
275
- def update_fields(tipo):
276
- is_resposta = tipo == "resposta_acusacao"
277
- is_hc = tipo == "habeas_corpus"
278
- is_liberdade = tipo == "liberdade_provisoria"
279
-
280
- return {
281
- qualificacao: gr.update(visible=(is_hc or is_liberdade)),
282
- fundamentos: gr.update(visible=(is_hc or is_liberdade)),
283
- preliminares: gr.update(visible=is_resposta),
284
- merito: gr.update(visible=is_resposta),
285
- provas: gr.update(visible=is_resposta)
286
- }
287
-
288
- tipo_peca.change(
289
- fn=update_fields,
290
- inputs=tipo_peca,
291
- outputs=[qualificacao, fundamentos, preliminares, merito, provas]
292
- )
293
-
294
- def carregar_exemplo(tipo):
295
- exemplo = gerador.exemplos.get(tipo, {})
296
- return [
297
- exemplo.get(campo, "") for campo in [
298
- "comarca", "vara", "estado", "numero_oab", "numero_processo",
299
- "nome_reu", "qualificacao", "fundamentos", "preliminares",
300
- "merito", "provas", "pedidos"
301
- ]
302
- ]
303
-
304
- exemplo_btn = gr.Button("Carregar Exemplo")
305
- exemplo_btn.click(
306
- fn=carregar_exemplo,
307
- inputs=tipo_peca,
308
- outputs=[
309
- comarca, vara, estado, numero_oab, numero_processo,
310
- nome_reu, qualificacao, fundamentos, preliminares,
311
- merito, provas, pedidos
312
- ]
313
  )
314
 
315
- with gr.Row():
316
- submit_btn = gr.Button("Gerar Peça", variant="primary")
317
- clear_btn = gr.Button("Limpar Campos")
318
-
319
- output = gr.Textbox(
320
- label="Documento Gerado",
321
- lines=20,
322
- show_copy_button=True
323
- )
324
 
325
- def process(tipo, comarca, vara, estado, numero_oab, numero_processo,
326
- nome_reu, qualificacao, fundamentos, preliminares, merito,
327
- provas, pedidos):
328
  dados = {
329
  "comarca": comarca,
330
  "vara": vara,
331
- "estado": estado,
332
- "numero_oab": numero_oab,
333
- "numero_processo": numero_processo,
334
- "nome_reu": nome_reu,
335
- "qualificacao": qualificacao,
336
- "fundamentos": fundamentos,
337
- "preliminares": preliminares,
338
- "merito": merito,
339
- "provas": provas,
340
- "pedidos": pedidos
341
  }
342
- return gerador.gerar_documento(tipo, dados)
343
-
344
- def clear():
345
- return [""] * 12
346
 
347
- submit_btn.click(
348
  fn=process,
349
- inputs=[
350
- tipo_peca, comarca, vara, estado, numero_oab, numero_processo,
351
- nome_reu, qualificacao, fundamentos, preliminares, merito,
352
- provas, pedidos
353
- ],
354
  outputs=output
355
  )
356
 
357
- clear_btn.click(
358
- fn=clear,
359
- inputs=None,
360
- outputs=[
361
- comarca, vara, estado, numero_oab, numero_processo,
362
- nome_reu, qualificacao, fundamentos, preliminares,
363
- merito, provas, pedidos
364
- ]
365
  )
366
 
367
  return demo
 
10
  raise EnvironmentError("HF_API_KEY não configurada")
11
  self.client = InferenceClient(api_key=self.api_key)
12
 
13
+ self.document_types = {
14
+ "resposta_acusacao": "Resposta à Acusação",
15
+ "habeas_corpus": "Habeas Corpus",
16
+ "revogacao_preventiva": "Revogação de Prisão Preventiva",
17
+ "liberdade_provisoria": "Liberdade Provisória",
18
+ "relaxamento_prisao": "Relaxamento de Prisão",
19
+ "apelacao": "Recurso de Apelação",
20
+ "embargos": "Embargos de Declaração"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  }
22
 
23
+ def generate_content(self, prompt: str) -> str:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  try:
25
  response = self.client.chat.completions.create(
26
  model="mistralai/Mistral-7B-Instruct-v0.3",
27
+ messages=[
28
+ {"role": "system", "content": "Você é um advogado criminalista experiente."},
29
+ {"role": "user", "content": prompt}
30
+ ],
31
+ max_tokens=2000,
32
+ temperature=0.7
33
  )
34
  return response.choices[0].message["content"]
35
  except Exception as e:
36
+ return f"Erro na geração: {str(e)}"
37
 
38
+ def gerar_documento(self, tipo: str, fatos: str, dados_basicos: dict) -> str:
39
+ prompt = f"""Gere uma peça de {self.document_types[tipo]} completa com base nos seguintes fatos:
40
+
41
+ {fatos}
42
+
43
+ Inclua todos os elementos necessários:
44
+ - Qualificação completa das partes
45
+ - Fundamentos jurídicos pertinentes
46
+ - Jurisprudência relevante
47
+ - Doutrina aplicável
48
+ - Preliminares quando cabíveis
49
+ - Mérito detalhado
50
+ - Pedidos específicos
51
+
52
+ Dados básicos para formatação:
53
+ Comarca: {dados_basicos['comarca']}
54
+ Vara: {dados_basicos['vara']}
55
+ Cliente: {dados_basicos['cliente']}
56
+ OAB: {dados_basicos['oab']}"""
57
+
58
+ return self.generate_content(prompt)
 
 
 
59
 
60
  def interface():
61
  gerador = DefenseGenerator()
62
 
63
  with gr.Blocks() as demo:
64
+ gr.Markdown("# Gerador de Peças Criminais")
 
 
65
 
66
  with gr.Row():
67
+ tipo = gr.Dropdown(
68
+ choices=list(gerador.document_types.keys()),
69
  label="Tipo de Peça",
70
+ value="resposta_acusacao"
 
71
  )
72
 
73
  with gr.Row():
74
  with gr.Column():
75
+ comarca = gr.Textbox(label="Comarca", placeholder="Ex: São Paulo")
76
+ vara = gr.Textbox(label="Vara", placeholder="Ex: 1ª")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
 
78
  with gr.Column():
79
+ cliente = gr.Textbox(label="Nome do Cliente", placeholder="Ex: João da Silva")
80
+ oab = gr.Textbox(label="OAB", placeholder="Ex: SP123456")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
 
82
+ fatos = gr.Textbox(
83
+ label="Descreva os fatos e o que deseja na peça",
84
+ placeholder="Descreva a situação do cliente e o que precisa ser argumentado...",
85
+ lines=5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  )
87
 
88
+ btn = gr.Button("Gerar")
89
+ output = gr.Textbox(label="Peça Gerada", lines=20, show_copy_button=True)
 
 
 
 
 
 
 
90
 
91
+ def process(tipo, fatos, comarca, vara, cliente, oab):
 
 
92
  dados = {
93
  "comarca": comarca,
94
  "vara": vara,
95
+ "cliente": cliente,
96
+ "oab": oab
 
 
 
 
 
 
 
 
97
  }
98
+ return gerador.gerar_documento(tipo, fatos, dados)
 
 
 
99
 
100
+ btn.click(
101
  fn=process,
102
+ inputs=[tipo, fatos, comarca, vara, cliente, oab],
 
 
 
 
103
  outputs=output
104
  )
105
 
106
+ exemplo = gr.Examples(
107
+ examples=[
108
+ ["resposta_acusacao", "Cliente preso em flagrante por furto de celular iPhone 13 da vítima Maria em 10/01/2024. É primário, tem residência fixa e trabalho. A vítima não reconheceu com certeza.", "São Paulo", "1ª", "João Silva", "SP123456"],
109
+ ["habeas_corpus", "Cliente preso preventivamente há 90 dias por tráfico. Apreendidas 10g de maconha, é primário, tem residência e trabalho fixos. Não foram apreendidos outros materiais típicos de tráfico.", "São Paulo", "2ª", "Pedro Santos", "SP654321"]
110
+ ],
111
+ inputs=[tipo, fatos, comarca, vara, cliente, oab]
 
 
112
  )
113
 
114
  return demo