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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +122 -39
app.py CHANGED
@@ -1,6 +1,7 @@
1
  import gradio as gr
2
  from huggingface_hub import InferenceClient
3
  import os
 
4
 
5
  DOCUMENT_TYPES = {
6
  "resposta_acusacao": "Resposta à Acusação",
@@ -12,51 +13,87 @@ DOCUMENT_TYPES = {
12
  "embargos": "Embargos de Declaração"
13
  }
14
 
15
- PROMPT_TEMPLATE = """Gere uma peça de {doc_type} completa, formatada e sem asteriscos, com base nos seguintes fatos:
16
-
17
- {fatos}
18
-
19
- A peça deve seguir este formato:
20
-
21
- EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) [AUTORIDADE]
22
-
23
- [Título da Peça em Maiúsculas]
24
 
25
  I - QUALIFICAÇÃO DAS PARTES
 
 
26
  II - FUNDAMENTOS JURÍDICOS
 
 
 
27
  III - JURISPRUDÊNCIA APLICÁVEL
 
 
 
28
  IV - DOUTRINA APLICÁVEL
 
 
 
29
  V - PRELIMINARES
 
 
 
30
  VI - MÉRITO
 
 
 
31
  VII - PEDIDOS
 
 
 
 
 
 
 
 
32
 
33
- Dados para formatação:
34
- Comarca: {comarca}
35
- Vara: {vara}
36
- Cliente: {cliente}
37
- OAB: {oab}"""
38
 
39
- class DefenseGenerator:
40
  def __init__(self):
41
  self.api_key = os.getenv("HF_API_KEY")
42
  if not self.api_key:
43
  raise EnvironmentError("HF_API_KEY não configurada")
44
  self.client = InferenceClient(api_key=self.api_key)
45
 
46
- def generate_content(self, doc_type: str, fatos: str, dados: dict) -> str:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  try:
48
- prompt = PROMPT_TEMPLATE.format(
49
- doc_type=DOCUMENT_TYPES[doc_type],
50
- fatos=fatos,
51
- **dados
52
- )
53
  response = self.client.chat.completions.create(
54
  model="mistralai/Mistral-7B-Instruct-v0.3",
55
  messages=[
56
- {"role": "system", "content": "Você é um advogado criminalista experiente. Gere peças sem usar asteriscos ou marcadores."},
57
  {"role": "user", "content": prompt}
58
  ],
59
- max_tokens=2000,
60
  temperature=0.7
61
  )
62
  return response.choices[0].message["content"]
@@ -64,30 +101,76 @@ class DefenseGenerator:
64
  return f"Erro na geração: {str(e)}"
65
 
66
  def create_interface():
67
- def process(tipo, fatos, comarca, vara, cliente, oab):
68
- return DefenseGenerator().generate_content(tipo, fatos,
69
- {"comarca": comarca, "vara": vara, "cliente": cliente, "oab": oab})
 
 
 
 
 
 
 
 
70
 
71
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
72
- gr.Markdown("# Sistema Criminal.AI")
73
-
74
- tipo = gr.Dropdown(choices=list(DOCUMENT_TYPES.keys()), value="resposta_acusacao", label="Tipo de Peça")
75
 
76
  with gr.Row():
77
- comarca = gr.Textbox(label="Comarca", placeholder="Ex: São Paulo")
78
- vara = gr.Textbox(label="Vara", placeholder="Ex: 1ª")
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(label="Descreva os fatos", lines=5)
83
- output = gr.TextArea(label="Documento Gerado", lines=20, show_copy_button=True)
 
 
 
84
 
 
 
 
 
 
 
85
  gr.Examples([
86
- ["resposta_acusacao", "Cliente preso em flagrante por furto de celular iPhone 13.", "São Paulo", "1ª", "João Silva", "SP123456"],
87
- ["habeas_corpus", "Cliente preso preventivamente há 90 dias por tráfico.", "São Paulo", "2ª", "Pedro Santos", "SP654321"]
88
- ], inputs=[tipo, fatos, comarca, vara, cliente, oab])
 
 
 
 
 
 
 
 
89
 
90
- gr.Button("Gerar Peça").click(fn=process, inputs=[tipo, fatos, comarca, vara, cliente, oab], outputs=output)
 
 
 
 
91
 
92
  return demo
93
 
 
1
  import gradio as gr
2
  from huggingface_hub import InferenceClient
3
  import os
4
+ from datetime import datetime
5
 
6
  DOCUMENT_TYPES = {
7
  "resposta_acusacao": "Resposta à Acusaçã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):
58
  self.api_key = os.getenv("HF_API_KEY")
59
  if not self.api_key:
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"]
 
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
+ "1ª",
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