DHEIVER commited on
Commit
50c782f
·
verified ·
1 Parent(s): 9b1e761

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +103 -297
app.py CHANGED
@@ -1,10 +1,9 @@
1
- import os
2
  import gradio as gr
3
- from huggingface_hub import InferenceClient
4
  from datetime import datetime
5
- from typing import Dict, Optional
6
 
7
- class LegalDocumentGenerator:
8
  def __init__(self):
9
  self.api_key = os.getenv("HF_API_KEY")
10
  if not self.api_key:
@@ -23,310 +22,117 @@ class LegalDocumentGenerator:
23
  except Exception as e:
24
  raise Exception(f"Erro na geração da seção {section}: {str(e)}")
25
 
26
- def generate_document(self, case_info: str, doc_type: str, client_data: Dict) -> str:
27
- if not all([case_info, doc_type, client_data]):
28
- return "Erro: Dados incompletos"
29
-
30
- templates = {
31
- "habeas corpus": self._get_habeas_corpus_template(),
32
- "defesa prévia": self._get_defesa_previa_template(),
33
- "apelação criminal": self._get_apelacao_template(),
34
- "petição inicial": self._get_peticao_inicial_template()
35
- }
36
-
37
- template = templates.get(doc_type.lower())
38
- if not template:
39
- return "Erro: Tipo de documento não suportado"
40
-
41
- try:
42
- messages = [
43
- {
44
- "role": "system",
45
- "content": (
46
- "Você é um advogado criminalista especializado. Gere uma peça jurídica observando:\n"
47
- "1. Formalidade e técnica jurídica\n"
48
- "2. Fundamentação legal precisa e atualizada\n"
49
- "3. Jurisprudência relevante\n"
50
- "4. Adequação ao caso concreto\n"
51
- f"Tipo de peça: {doc_type}\n"
52
- f"Informações do caso: {case_info}"
53
- )
54
- }
55
- ]
56
-
57
- sections = {}
58
- for section in template["required_sections"]:
59
- sections[section] = self.generate_section(messages, section)
60
-
61
- document = template["structure"].format(
62
- **sections,
63
- **client_data,
64
- data=datetime.now().strftime("%d/%m/%Y")
65
- )
66
-
67
- return document
68
-
69
- except Exception as e:
70
- return f"Erro na geração do documento: {str(e)}"
71
-
72
- def _get_habeas_corpus_template(self):
73
- return {
74
- "structure": (
75
- "EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} DA {comarca}\n\n"
76
- "HABEAS CORPUS COM PEDIDO LIMINAR\n\n"
77
- "QUALIFICAÇÃO DO PACIENTE\n{qualificacao}\n\n"
78
- "DOS FATOS\n{fatos}\n\n"
79
- "DO DIREITO\n{fundamentacao}\n\n"
80
- "DO CONSTRANGIMENTO ILEGAL\n{constrangimento}\n\n"
81
- "DA MEDIDA LIMINAR\n{liminar}\n\n"
82
- "DOS PEDIDOS\n{pedidos}\n\n"
83
- "PROVAS E DOCUMENTOS\n{provas}\n\n"
84
- "{comarca}, {data}\n\n"
85
- "{advogado}\n"
86
- "OAB/{estado} {numero_oab}"
87
- ),
88
- "required_sections": [
89
- "qualificacao", "fatos", "fundamentacao",
90
- "constrangimento", "liminar", "pedidos", "provas"
91
- ]
92
- }
93
-
94
- def _get_defesa_previa_template(self):
95
- return {
96
- "structure": (
97
- "EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} DA {comarca}\n\n"
98
- "DEFESA PRÉVIA\n\n"
99
- "Autos nº {numero_processo}\n\n"
100
- "QUALIFICAÇÃO DO ACUSADO\n{qualificacao}\n\n"
101
- "DOS FATOS\n{fatos}\n\n"
102
- "DO DIREITO\n{fundamentacao}\n\n"
103
- "DAS PRELIMINARES\n{preliminares}\n\n"
104
- "DO MÉRITO\n{merito}\n\n"
105
- "DAS PROVAS\n{provas}\n\n"
106
- "DOS PEDIDOS\n{pedidos}\n\n"
107
- "{comarca}, {data}\n\n"
108
- "{advogado}\n"
109
- "OAB/{estado} {numero_oab}"
110
- ),
111
- "required_sections": [
112
- "qualificacao", "fatos", "fundamentacao", "preliminares",
113
- "merito", "provas", "pedidos"
114
- ]
115
- }
116
-
117
- def _get_apelacao_template(self):
118
- return {
119
- "structure": (
120
- "EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) DESEMBARGADOR(A) RELATOR(A) DO TRIBUNAL DE JUSTIÇA DO ESTADO DE {estado}\n\n"
121
- "RAZÕES DE APELAÇÃO\n\n"
122
- "Autos nº {numero_processo}\n\n"
123
- "QUALIFICAÇÃO DO APELANTE\n{qualificacao}\n\n"
124
- "DOS FATOS\n{fatos}\n\n"
125
- "DAS PRELIMINARES\n{preliminares}\n\n"
126
- "DO MÉRITO\n{merito}\n\n"
127
- "DO DIREITO\n{fundamentacao}\n\n"
128
- "DOS PEDIDOS\n{pedidos}\n\n"
129
- "{comarca}, {data}\n\n"
130
- "{advogado}\n"
131
- "OAB/{estado} {numero_oab}"
132
- ),
133
- "required_sections": [
134
- "qualificacao", "fatos", "preliminares", "merito",
135
- "fundamentacao", "pedidos"
136
- ]
137
- }
138
-
139
- def _get_peticao_inicial_template(self):
140
- return {
141
- "structure": (
142
- "EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) JUIZ(A) DE DIREITO DA {vara} DA {comarca}\n\n"
143
- "PETIÇÃO INICIAL\n\n"
144
- "QUALIFICAÇÃO DO AUTOR\n{qualificacao}\n\n"
145
- "DOS FATOS\n{fatos}\n\n"
146
- "DO DIREITO\n{fundamentacao}\n\n"
147
- "DO PEDIDO LIMINAR\n{liminar}\n\n"
148
- "DOS PEDIDOS\n{pedidos}\n\n"
149
- "DAS PROVAS\n{provas}\n\n"
150
- "DO VALOR DA CAUSA\n{valor_causa}\n\n"
151
- "{comarca}, {data}\n\n"
152
- "{advogado}\n"
153
- "OAB/{estado} {numero_oab}"
154
- ),
155
- "required_sections": [
156
- "qualificacao", "fatos", "fundamentacao", "liminar",
157
- "pedidos", "provas", "valor_causa"
158
- ]
159
- }
160
 
161
- def create_interface():
162
- generator = LegalDocumentGenerator()
163
 
164
- example_cases = {
165
- "habeas corpus": {
166
- "case_info": "Cliente João da Silva foi preso em flagrante no dia 15/12/2023 por suposto furto em loja, mas há provas em vídeo mostrando que ele estava em outro local no momento do crime.",
167
- "client_data": {
168
- "name": "João da Silva",
169
- "nationality": "Brasileiro",
170
- "profession": "Comerciante",
171
- "id": "12.345.678-9",
172
- "address": "Rua das Flores, 123",
173
- "city": "São Paulo",
174
- "state": "SP",
175
- "zip": "01234-567",
176
- "court": "1ª Vara Criminal",
177
- "jurisdiction": "São Paulo",
178
- "process_number": "0123456-78.2023.8.26.0001",
179
- "lawyer_name": "Dr. Pedro Santos",
180
- "lawyer_oab": "123456",
181
- "lawyer_state": "SP"
182
- }
183
- },
184
- "defesa prévia": {
185
- "case_info": "Cliente Maria Oliveira foi denunciada por tráfico de drogas após revista policial sem mandado em sua residência, onde foram encontradas substâncias ilícitas.",
186
- "client_data": {
187
- "name": "Maria Oliveira",
188
- "nationality": "Brasileira",
189
- "profession": "Professora",
190
- "id": "98.765.432-1",
191
- "address": "Av. Principal, 456",
192
- "city": "São Paulo",
193
- "state": "SP",
194
- "zip": "04321-765",
195
- "court": "2ª Vara Criminal",
196
- "jurisdiction": "São Paulo",
197
- "process_number": "0987654-32.2023.8.26.0002",
198
- "lawyer_name": "Dra. Ana Costa",
199
- "lawyer_oab": "654321",
200
- "lawyer_state": "SP"
201
- }
202
  }
203
- }
 
204
 
205
- with gr.Blocks() as interface:
206
  gr.Markdown("# Gerador de Peças Jurídicas Criminais")
207
 
208
- with gr.Tab("Dados do Caso"):
209
- example_selector = gr.Dropdown(
210
- label="Exemplos",
211
- choices=["Selecione um exemplo...", "Exemplo Habeas Corpus", "Exemplo Defesa Prévia"],
212
- value="Selecione um exemplo..."
213
  )
214
 
215
- case_info = gr.Textbox(
216
- label="Informações do Caso",
217
- placeholder="Descreva o caso detalhadamente",
218
- lines=5
219
- )
220
- doc_type = gr.Dropdown(
221
- label="Tipo de Peça",
222
- choices=[
223
- "habeas corpus",
224
- "defesa prévia",
225
- "apelação criminal",
226
- "petição inicial"
227
- ]
228
- )
229
-
230
- with gr.Tab("Dados do Cliente"):
231
- with gr.Row():
232
- client_name = gr.Textbox(label="Nome")
233
- client_nationality = gr.Textbox(label="Nacionalidade")
234
- with gr.Row():
235
- client_profession = gr.Textbox(label="Profissão")
236
- client_id = gr.Textbox(label="RG")
237
- with gr.Row():
238
- client_address = gr.Textbox(label="Endereço")
239
- client_city = gr.Textbox(label="Cidade")
240
- with gr.Row():
241
- client_state = gr.Textbox(label="Estado")
242
- client_zip = gr.Textbox(label="CEP")
243
-
244
- with gr.Tab("Dados Processuais"):
245
- with gr.Row():
246
- court = gr.Textbox(label="Vara")
247
- jurisdiction = gr.Textbox(label="Comarca")
248
- with gr.Row():
249
- process_number = gr.Textbox(label="Número do Processo")
250
- lawyer_name = gr.Textbox(label="Nome do Advogado")
251
- with gr.Row():
252
- lawyer_oab = gr.Textbox(label="Número OAB")
253
- lawyer_state = gr.Textbox(label="Estado OAB")
254
-
255
  with gr.Row():
256
- generate_btn = gr.Button("Gerar Documento")
257
- clear_btn = gr.Button("Limpar Campos")
258
-
259
- output = gr.Textbox(
260
- label="Documento Gerado",
261
- lines=20,
262
- placeholder="O documento gerado aparecerá aqui"
263
- )
264
-
265
- def load_example(example_choice):
266
- if example_choice == "Exemplo Habeas Corpus":
267
- data = example_cases["habeas corpus"]
268
- elif example_choice == "Exemplo Defesa Prévia":
269
- data = example_cases["defesa prévia"]
270
- else:
271
- return [""] * 16
272
-
273
- client = data["client_data"]
274
- return [
275
- data["case_info"],
276
- example_choice.lower().replace("exemplo ", ""),
277
- client["name"],
278
- client["nationality"],
279
- client["profession"],
280
- client["id"],
281
- client["address"],
282
- client["city"],
283
- client["state"],
284
- client["zip"],
285
- client["court"],
286
- client["jurisdiction"],
287
- client["process_number"],
288
- client["lawyer_name"],
289
- client["lawyer_oab"],
290
- client["lawyer_state"]
291
- ]
292
-
293
- example_selector.change(
294
- load_example,
295
- inputs=[example_selector],
296
- outputs=[
297
- case_info, doc_type,
298
- client_name, client_nationality, client_profession, client_id,
299
- client_address, client_city, client_state, client_zip,
300
- court, jurisdiction, process_number,
301
- lawyer_name, lawyer_oab, lawyer_state
302
- ]
303
- )
304
-
305
- generate_btn.click(
306
- generator.generate_document,
307
  inputs=[
308
- case_info, doc_type,
309
- client_name, client_nationality, client_profession, client_id,
310
- client_address, client_city, client_state, client_zip,
311
- court, jurisdiction, process_number,
312
- lawyer_name, lawyer_oab, lawyer_state
313
  ],
314
- outputs=output
315
- )
316
-
317
- clear_btn.click(
318
- lambda: [""] * 16,
319
- outputs=[
320
- case_info, doc_type,
321
- client_name, client_nationality, client_profession, client_id,
322
- client_address, client_city, client_state, client_zip,
323
- court, jurisdiction, process_number,
324
- lawyer_name, lawyer_oab, lawyer_state
325
- ]
326
  )
327
-
328
- return interface
329
 
 
 
330
  if __name__ == "__main__":
331
- interface = create_interface()
332
- interface.launch()
 
 
1
  import gradio as gr
2
+ 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:
 
22
  except Exception as e:
23
  raise Exception(f"Erro na geração da seção {section}: {str(e)}")
24
 
25
+ def gerar_documento(self, tipo_documento: str, dados: dict) -> str:
26
+ messages = [
27
+ {"role": "system", "content": "Você é um assistente especializado em peças jurídicas criminais."},
28
+ {"role": "user", "content": f"Dados para geração de {tipo_documento}:\n{str(dados)}"}
29
+ ]
30
+
31
+ if tipo_documento == "denuncia":
32
+ sections = ["qualificacao", "narrativa", "tipificacao", "pedido"]
33
+ else:
34
+ sections = ["relatorio", "fundamentacao", "pedido"]
35
+
36
+ documento = ""
37
+ for section in sections:
38
+ documento += self.generate_section(messages, section) + "\n\n"
39
+
40
+ dados['data'] = datetime.now().strftime("%d/%m/%Y")
41
+ return documento
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
 
43
+ def interface():
44
+ gerador = DocumentGenerator()
45
 
46
+ def processar(tipo_doc, comarca, vara, estado, nome_reu, qualificacao, narrativa, artigo, testemunhas,
47
+ numero_processo="", narrativa_processual="", fundamentacao="", pedido_final=""):
48
+ dados = {
49
+ "comarca": comarca,
50
+ "vara": vara,
51
+ "estado": estado,
52
+ "nome_reu": nome_reu,
53
+ "qualificacao_reu": qualificacao,
54
+ "narrativa": narrativa,
55
+ "artigo": artigo,
56
+ "testemunhas": testemunhas,
57
+ "numero_processo": numero_processo,
58
+ "narrativa_processual": narrativa_processual,
59
+ "fundamentacao": fundamentacao,
60
+ "pedido_final": pedido_final
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  }
62
+
63
+ return gerador.gerar_documento(tipo_doc, dados)
64
 
65
+ with gr.Blocks(title="Gerador de Peças Jurídicas Criminais") as demo:
66
  gr.Markdown("# Gerador de Peças Jurídicas Criminais")
67
 
68
+ with gr.Row():
69
+ tipo_documento = gr.Radio(
70
+ choices=["denuncia", "alegacoes_finais"],
71
+ label="Tipo de Documento",
72
+ value="denuncia"
73
  )
74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  with gr.Row():
76
+ with gr.Column():
77
+ comarca = gr.Textbox(label="Comarca")
78
+ vara = gr.Textbox(label="Vara")
79
+ estado = gr.Textbox(label="Estado")
80
+ nome_reu = gr.Textbox(label="Nome do Réu")
81
+ qualificacao = gr.Textbox(
82
+ label="Qualificação do Réu",
83
+ placeholder="brasileiro, casado, etc..."
84
+ )
85
+
86
+ with gr.Column():
87
+ narrativa = gr.Textbox(
88
+ label="Narrativa dos Fatos",
89
+ lines=5
90
+ )
91
+ artigo = gr.Textbox(label="Artigo(s) do CP")
92
+ testemunhas = gr.Textbox(
93
+ label="Testemunhas",
94
+ lines=3,
95
+ placeholder="1. Nome da testemunha\n2. Nome da testemunha"
96
+ )
97
+
98
+ with gr.Row(visible=False) as campos_alegacoes:
99
+ with gr.Column():
100
+ numero_processo = gr.Textbox(label="Número do Processo")
101
+ narrativa_processual = gr.Textbox(
102
+ label="Narrativa Processual",
103
+ lines=5
104
+ )
105
+ fundamentacao = gr.Textbox(
106
+ label="Fundamentação",
107
+ lines=5
108
+ )
109
+ pedido_final = gr.Textbox(
110
+ label="Pedido Final",
111
+ placeholder="condenação do réu nas sanções do art. X..."
112
+ )
113
+
114
+ def atualizar_campos(escolha):
115
+ return gr.Row(visible=(escolha == "alegacoes_finais"))
116
+
117
+ tipo_documento.change(atualizar_campos, tipo_documento, campos_alegacoes)
118
+
119
+ with gr.Row():
120
+ gerar_btn = gr.Button("Gerar Documento")
121
+
122
+ saida = gr.Textbox(label="Documento Gerado", lines=10)
123
+
124
+ gerar_btn.click(
125
+ processar,
 
126
  inputs=[
127
+ tipo_documento, comarca, vara, estado, nome_reu, qualificacao,
128
+ narrativa, artigo, testemunhas, numero_processo,
129
+ narrativa_processual, fundamentacao, pedido_final
 
 
130
  ],
131
+ outputs=saida
 
 
 
 
 
 
 
 
 
 
 
132
  )
 
 
133
 
134
+ return demo
135
+
136
  if __name__ == "__main__":
137
+ demo = interface()
138
+ demo.launch()