DHEIVER commited on
Commit
407f4f9
·
verified ·
1 Parent(s): 0956e15

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +151 -113
app.py CHANGED
@@ -4,54 +4,65 @@ import os
4
  from datetime import datetime
5
 
6
  DOCUMENT_TYPES = {
7
- "resposta_acusacao": "Resposta à Acusação",
8
- "habeas_corpus": "Habeas Corpus",
9
- "revogacao_preventiva": "Revogação de Prisão Preventiva",
10
- "liberdade_provisoria": "Liberdade Provisória",
11
- "relaxamento_prisao": "Relaxamento de Prisão",
12
- "apelacao": "Recurso de Apelação",
13
- "embargos": "Embargos de Declaração"
14
  }
15
 
16
- DEFAULT_SECTIONS = """AUTOS [NUMERO_PROCESSO]
 
 
 
 
17
 
18
  I - QUALIFICAÇÃO DAS PARTES
19
- [Detalhes do acusado e seu advogado]
20
 
21
  II - FUNDAMENTOS JURÍDICOS
22
- 1. [Base legal específica do caso]
23
- 2. [Elementos necessários para configuração do crime]
24
 
25
  III - JURISPRUDÊNCIA APLICÁVEL
26
- 1. [Precedentes favoráveis]
27
- 2. [Entendimentos dos tribunais]
28
 
29
  IV - DOUTRINA APLICÁVEL
30
- 1. [Citações doutrinárias relevantes]
31
- 2. [Posicionamentos doutrinários]
32
 
33
  V - PRELIMINARES
34
- 1. [Questões processuais]
35
- 2. [Nulidades e vícios]
36
 
37
  VI - MÉRITO
38
- 1. [Argumentos principais]
39
- 2. [Provas e contraprovas]
 
40
 
41
  VII - PEDIDOS
42
- 1. [Pedido principal]
43
- 2. [Pedidos subsidiários]
44
- 3. [Provas a produzir]
 
 
 
 
45
 
46
- [CIDADE], [DATA]
 
47
 
48
- [ADVOGADO]
49
- OAB/[ESTADO] [NÚMERO]
 
 
50
 
51
  ROL DE TESTEMUNHAS:
52
- 1. [Nome e qualificação]
53
- 2. [Nome e qualificação]
54
- 3. [Nome e qualificação]"""
55
 
56
  class LegalDocGenerator:
57
  def __init__(self):
@@ -60,117 +71,144 @@ class LegalDocGenerator:
60
  raise EnvironmentError("HF_API_KEY não configurada")
61
  self.client = InferenceClient(api_key=self.api_key)
62
 
63
- def _build_prompt(self, doc_type: str, caso: dict) -> str:
64
- return f"""Atue como um advogado criminalista experiente gerando uma peça de {DOCUMENT_TYPES[doc_type]}.
65
-
66
- CASO CONCRETO:
67
- - Acusado: {caso['cliente']}
68
- - Fatos: {caso['fatos']}
69
- - Comarca: {caso['comarca']}
70
- - Vara: {caso['vara']} Vara Criminal
71
- - OAB: {caso['oab']}
72
-
73
- INSTRUÇÕES ESPECÍFICAS:
74
- 1. Use linguagem jurídica formal
75
- 2. Cite jurisprudência real e atualizada
76
- 3. Fundamente com doutrina pertinente
77
- 4. Destaque elementos favoráveis ao acusado
78
- 5. Mantenha estrutura com numeração romana para seções principais
79
- 6. Inclua elementos de prova mencionados nos fatos
80
- 7. Desenvolva argumentos técnicos para cada pedido
81
- 8. Mantenha formatação profissional
82
- 9. Use artigos corretos do Código Penal e CPP
83
-
84
- ESTRUTURA BASE:
85
- {DEFAULT_SECTIONS}"""
86
-
87
- def generate(self, doc_type: str, caso: dict) -> str:
 
 
 
 
 
 
 
 
 
 
 
 
88
  try:
89
- prompt = self._build_prompt(doc_type, caso)
 
 
90
  response = self.client.chat.completions.create(
91
  model="mistralai/Mistral-7B-Instruct-v0.3",
92
  messages=[
93
- {"role": "system", "content": "Você é um advogado criminalista especialista em gerar peças jurídicas técnicas e bem fundamentadas."},
94
- {"role": "user", "content": prompt}
95
  ],
96
  max_tokens=2500,
97
  temperature=0.7
98
  )
 
99
  return response.choices[0].message["content"]
100
  except Exception as e:
101
  return f"Erro na geração: {str(e)}"
102
 
103
  def create_interface():
104
- def process(tipo, fatos, comarca, vara, cliente, oab, num_processo="", testemunhas=""):
105
- caso = {
106
- "cliente": cliente,
 
 
107
  "fatos": fatos,
108
  "comarca": comarca,
109
  "vara": vara,
110
  "oab": oab,
111
- "num_processo": num_processo,
 
 
 
 
 
 
112
  "testemunhas": testemunhas
113
  }
114
- return LegalDocGenerator().generate(tipo, caso)
115
 
116
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
117
- gr.Markdown("# Sistema Criminal.AI - Gerador de Peças Jurídicas")
118
-
119
- with gr.Row():
120
- tipo = gr.Dropdown(
121
- choices=list(DOCUMENT_TYPES.keys()),
122
- value="resposta_acusacao",
123
- label="Tipo de Peça"
124
- )
125
- num_processo = gr.Textbox(
126
- label="Número do Processo",
127
- placeholder="Ex: 0000000-00.0000.0.00.0000"
128
- )
129
-
130
- with gr.Row():
131
- with gr.Column():
132
- comarca = gr.Textbox(label="Comarca", placeholder="Ex: São Paulo")
133
- vara = gr.Textbox(label="Vara", placeholder="Ex: 1ª")
134
- with gr.Column():
135
- cliente = gr.Textbox(label="Nome do Cliente", placeholder="Ex: João da Silva")
136
- oab = gr.Textbox(label="OAB", placeholder="Ex: SP123456")
137
-
138
- fatos = gr.Textbox(
139
- label="Descrição dos Fatos",
140
- placeholder="Descreva detalhadamente a situação do cliente...",
141
- lines=5
142
- )
143
 
144
- testemunhas = gr.Textbox(
145
- label="Rol de Testemunhas (opcional)",
146
- placeholder="Nome e qualificação das testemunhas, uma por linha",
147
- lines=3
148
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
 
150
- output = gr.TextArea(
151
- label="Peça Gerada",
152
- lines=30,
153
- show_copy_button=True
 
 
154
  )
155
 
156
  gr.Examples([
157
- [
158
- "resposta_acusacao",
159
- "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.",
160
- "São Paulo",
161
- "",
162
- "João Silva",
163
- "SP123456",
164
- "0001234-56.2024.8.26.0000",
165
- "1. Maria Oliveira - Testemunha ocular\n2. José Santos - Empregador do acusado"
166
- ],
167
- ], inputs=[tipo, fatos, comarca, vara, cliente, oab, num_processo, testemunhas])
168
-
169
- gr.Button("Gerar Peça").click(
170
- fn=process,
171
- inputs=[tipo, fatos, comarca, vara, cliente, oab, num_processo, testemunhas],
172
- outputs=output
173
- )
174
 
175
  return demo
176
 
 
4
  from datetime import datetime
5
 
6
  DOCUMENT_TYPES = {
7
+ "resposta_acusacao": "Resposta à Acusação (Art. 396-A do CPP)",
8
+ "habeas_corpus": "Habeas Corpus (Art. 647 do CPP)",
9
+ "revogacao_preventiva": "Revogação de Prisão Preventiva (Art. 316 do CPP)",
10
+ "liberdade_provisoria": "Liberdade Provisória (Art. 321 do CPP)",
11
+ "relaxamento_prisao": "Relaxamento de Prisão (Art. 5º, LXV, CF)",
12
+ "apelacao": "Recurso de Apelação (Art. 593 do CPP)",
13
+ "embargos": "Embargos de Declaração (Art. 382 do CPP)"
14
  }
15
 
16
+ TEMPLATE_PENAL = """EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} VARA CRIMINAL DA COMARCA DE {comarca}/{estado}
17
+
18
+ AUTOS Nº {num_processo}
19
+
20
+ {tipo_peca}
21
 
22
  I - QUALIFICAÇÃO DAS PARTES
23
+ {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.
24
 
25
  II - FUNDAMENTOS JURÍDICOS
26
+ 1. {fundamentos}
27
+ 2. {elementos_tipo_penal}
28
 
29
  III - JURISPRUDÊNCIA APLICÁVEL
30
+ 1. {jurisprudencia_1}
31
+ 2. {jurisprudencia_2}
32
 
33
  IV - DOUTRINA APLICÁVEL
34
+ 1. {doutrina_1}
35
+ 2. {doutrina_2}
36
 
37
  V - PRELIMINARES
38
+ 1. {preliminar_1}
39
+ 2. {preliminar_2}
40
 
41
  VI - MÉRITO
42
+ 1. {merito_1}
43
+ 2. {merito_2}
44
+ 3. {merito_3}
45
 
46
  VII - PEDIDOS
47
+ 1. PRELIMINARMENTE:
48
+ a) {pedido_preliminar_1}
49
+ b) {pedido_preliminar_2}
50
+
51
+ 2. NO MÉRITO:
52
+ a) {pedido_merito_1}
53
+ b) {pedido_merito_2}
54
 
55
+ 3. PROVAS A PRODUZIR:
56
+ {provas}
57
 
58
+ {cidade}, {data}
59
+
60
+ {advogado}
61
+ OAB/{estado} {oab}
62
 
63
  ROL DE TESTEMUNHAS:
64
+ {testemunhas}
65
+ """
 
66
 
67
  class LegalDocGenerator:
68
  def __init__(self):
 
71
  raise EnvironmentError("HF_API_KEY não configurada")
72
  self.client = InferenceClient(api_key=self.api_key)
73
 
74
+ def _format_date(self) -> str:
75
+ return datetime.now().strftime("%d de %B de %Y")
76
+
77
+ def _build_prompt(self, doc_type: str, dados: dict) -> str:
78
+ # Instruções base para o modelo
79
+ system_prompt = """Você é um advogado criminalista especialista com anos de experiência.
80
+ Ao gerar peças processuais:
81
+ 1. Use linguagem jurídica formal e técnica
82
+ 2. Cite jurisprudência atual e relevante
83
+ 3. Faça referências doutrinárias precisas
84
+ 4. Desenvolva argumentos específicos para o caso
85
+ 5. Mantenha coerência em toda a peça
86
+ 6. Adapte os argumentos ao tipo de documento
87
+ 7. Use legislação atualizada e pertinente"""
88
+
89
+ # Prompt específico para o caso
90
+ case_prompt = f"""TIPO DE PEÇA: {DOCUMENT_TYPES[doc_type]}
91
+
92
+ DADOS DO CASO:
93
+ Cliente: {dados['nome']}
94
+ Fatos: {dados['fatos']}
95
+ Comarca: {dados['comarca']}
96
+ Vara: {dados['vara']}
97
+
98
+ ELEMENTOS ESPECÍFICOS A INCLUIR:
99
+ 1. Fundamentos específicos sobre {doc_type}
100
+ 2. Jurisprudência favorável recente
101
+ 3. Argumentos técnicos sobre {doc_type}
102
+ 4. Pedidos adequados ao tipo de peça
103
+ 5. Provas pertinentes ao caso
104
+
105
+ BASE PARA GERAÇÃO:
106
+ {TEMPLATE_PENAL}"""
107
+
108
+ return system_prompt, case_prompt
109
+
110
+ def generate(self, doc_type: str, dados: dict) -> str:
111
  try:
112
+ system_prompt, case_prompt = self._build_prompt(doc_type, dados)
113
+ dados['data'] = self._format_date()
114
+
115
  response = self.client.chat.completions.create(
116
  model="mistralai/Mistral-7B-Instruct-v0.3",
117
  messages=[
118
+ {"role": "system", "content": system_prompt},
119
+ {"role": "user", "content": case_prompt}
120
  ],
121
  max_tokens=2500,
122
  temperature=0.7
123
  )
124
+
125
  return response.choices[0].message["content"]
126
  except Exception as e:
127
  return f"Erro na geração: {str(e)}"
128
 
129
  def create_interface():
130
+ def process_submit(doc_type, fatos, comarca, vara, cliente, oab, proc_num,
131
+ idade, estado_civil, profissao, rg, cpf, endereco, testemunhas):
132
+ dados = {
133
+ "tipo_peca": DOCUMENT_TYPES[doc_type],
134
+ "nome": cliente,
135
  "fatos": fatos,
136
  "comarca": comarca,
137
  "vara": vara,
138
  "oab": oab,
139
+ "num_processo": proc_num,
140
+ "idade": idade,
141
+ "estado_civil": estado_civil,
142
+ "profissao": profissao,
143
+ "rg": rg,
144
+ "cpf": cpf,
145
+ "endereco": endereco,
146
  "testemunhas": testemunhas
147
  }
148
+ return LegalDocGenerator().generate(doc_type, dados)
149
 
150
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
151
+ gr.Markdown("# Sistema de Geração de Peças Criminais v2.0")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
 
153
+ with gr.Tab("Dados do Processo"):
154
+ with gr.Row():
155
+ tipo = gr.Dropdown(choices=list(DOCUMENT_TYPES.keys()),
156
+ value="resposta_acusacao",
157
+ label="Tipo de Peça")
158
+ proc_num = gr.Textbox(label="Número do Processo",
159
+ placeholder="0000000-00.0000.0.00.0000")
160
+
161
+ with gr.Row():
162
+ comarca = gr.Textbox(label="Comarca")
163
+ vara = gr.Textbox(label="Vara Criminal")
164
+
165
+ with gr.Tab("Dados do Cliente"):
166
+ with gr.Row():
167
+ cliente = gr.Textbox(label="Nome Completo")
168
+ idade = gr.Number(label="Idade")
169
+ estado_civil = gr.Dropdown(label="Estado Civil",
170
+ choices=["Solteiro(a)", "Casado(a)", "Divorciado(a)", "Viúvo(a)"])
171
+
172
+ with gr.Row():
173
+ profissao = gr.Textbox(label="Profissão")
174
+ rg = gr.Textbox(label="RG")
175
+ cpf = gr.Textbox(label="CPF")
176
+
177
+ endereco = gr.Textbox(label="Endereço Completo")
178
+
179
+ with gr.Tab("Dados do Caso"):
180
+ fatos = gr.TextArea(label="Descrição dos Fatos",
181
+ placeholder="Descreva detalhadamente a situação...",
182
+ lines=5)
183
+
184
+ testemunhas = gr.TextArea(label="Rol de Testemunhas",
185
+ placeholder="Nome completo e qualificação de cada testemunha",
186
+ lines=3)
187
+
188
+ with gr.Tab("Dados do Advogado"):
189
+ oab = gr.Textbox(label="Número da OAB com Estado")
190
+
191
+ doc_output = gr.TextArea(label="Documento Gerado",
192
+ lines=30,
193
+ show_copy_button=True)
194
 
195
+ submit_btn = gr.Button("Gerar Peça Processual", variant="primary")
196
+ submit_btn.click(
197
+ fn=process_submit,
198
+ inputs=[tipo, fatos, comarca, vara, cliente, oab, proc_num,
199
+ idade, estado_civil, profissao, rg, cpf, endereco, testemunhas],
200
+ outputs=doc_output
201
  )
202
 
203
  gr.Examples([
204
+ ["resposta_acusacao",
205
+ "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.",
206
+ "São Paulo", "1ª", "João Silva", "SP123456", "0001234-56.2024.8.26.0000",
207
+ 35, "Casado(a)", "Comerciante", "12.345.678-9", "123.456.789-00",
208
+ "Rua das Flores, 123, Centro",
209
+ "1. Maria Oliveira - Testemunha ocular\n2. José Santos - Empregador do acusado"]
210
+ ], inputs=[tipo, fatos, comarca, vara, cliente, oab, proc_num,
211
+ idade, estado_civil, profissao, rg, cpf, endereco, testemunhas])
 
 
 
 
 
 
 
 
 
212
 
213
  return demo
214