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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +58 -159
app.py CHANGED
@@ -1,42 +1,18 @@
1
  import gradio as gr
2
- from datetime import datetime
3
  from huggingface_hub import InferenceClient
4
  import os
5
 
6
- class DefenseGenerator:
7
- def __init__(self):
8
- self.api_key = os.getenv("HF_API_KEY")
9
- if not self.api_key:
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. Gere peças sem usar asteriscos ou marcadores. Use numeração romana para seções principais (I, II, III...) e números arábicos para subitens (1, 2, 3...). Mantenha formatação consistente e profissional."},
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, formatada e sem asteriscos, com base nos seguintes fatos:
40
 
41
  {fatos}
42
 
@@ -47,150 +23,73 @@ EXCELENTÍSSIMO(A) SENHOR(A) DOUTOR(A) [AUTORIDADE]
47
  [Título da Peça em Maiúsculas]
48
 
49
  I - QUALIFICAÇÃO DAS PARTES
50
- [Nome e dados completos]
51
-
52
  II - FUNDAMENTOS JURÍDICOS
53
- 1. [Primeiro fundamento]
54
- 2. [Segundo fundamento]
55
- [...]
56
-
57
  III - JURISPRUDÊNCIA APLICÁVEL
58
- 1. [Primeira jurisprudência]
59
- 2. [Segunda jurisprudência]
60
- [...]
61
-
62
  IV - DOUTRINA APLICÁVEL
63
- [Citações doutrinárias relevantes]
64
-
65
  V - PRELIMINARES
66
- 1. [Primeira preliminar]
67
- 2. [Segunda preliminar]
68
- [...]
69
-
70
  VI - MÉRITO
71
- [Desenvolvimento dos argumentos]
72
-
73
  VII - PEDIDOS
74
- 1. [Primeiro pedido]
75
- 2. [Segundo pedido]
76
- [...]
77
-
78
- Local, Data.
79
-
80
- [Advogado]
81
- OAB/[Estado] [Número]
82
 
83
  Dados para formatação:
84
- Comarca: {dados_basicos['comarca']}
85
- Vara: {dados_basicos['vara']}
86
- Cliente: {dados_basicos['cliente']}
87
- OAB: {dados_basicos['oab']}"""
88
 
89
- return self.generate_content(prompt)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
 
91
  def create_interface():
 
 
 
 
92
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
93
- gr.Markdown("# Sistema Criminal.AI", elem_classes="text-center text-2xl font-bold mb-4")
94
 
95
- with gr.Group():
96
- tipo = gr.Dropdown(
97
- choices=list(DefenseGenerator().document_types.keys()),
98
- value="resposta_acusacao",
99
- label="Tipo de Peça",
100
- container=False,
101
- scale=1
102
- )
103
 
104
  with gr.Row():
105
- with gr.Column(scale=1):
106
- comarca = gr.Textbox(
107
- label="Comarca",
108
- placeholder="Ex: São Paulo",
109
- container=False
110
- )
111
- vara = gr.Textbox(
112
- label="Vara",
113
- placeholder="Ex: 1ª",
114
- container=False
115
- )
116
-
117
- with gr.Column(scale=1):
118
- cliente = gr.Textbox(
119
- label="Nome do Cliente",
120
- placeholder="Ex: João da Silva",
121
- container=False
122
- )
123
- oab = gr.Textbox(
124
- label="OAB",
125
- placeholder="Ex: SP123456",
126
- container=False
127
- )
128
-
129
- fatos = gr.Textbox(
130
- label="Descreva os fatos",
131
- placeholder="Descreva a situação do cliente e o que precisa ser argumentado...",
132
- lines=5,
133
- container=False
134
- )
135
 
136
- with gr.Row():
137
- gerar_btn = gr.Button("Gerar Peça", variant="primary", scale=2)
138
- limpar_btn = gr.Button("Limpar", scale=1)
139
-
140
- output = gr.TextArea(
141
- label="Documento Gerado",
142
- lines=20,
143
- show_copy_button=True,
144
- container=False
145
- )
146
-
147
- def process(tipo, fatos, comarca, vara, cliente, oab):
148
- gerador = DefenseGenerator()
149
- dados = {
150
- "comarca": comarca,
151
- "vara": vara,
152
- "cliente": cliente,
153
- "oab": oab
154
- }
155
- return gerador.gerar_documento(tipo, fatos, dados)
156
-
157
- def clear():
158
- return {
159
- tipo: "resposta_acusacao",
160
- comarca: "",
161
- vara: "",
162
- cliente: "",
163
- oab: "",
164
- fatos: "",
165
- output: ""
166
- }
167
-
168
- gerar_btn.click(
169
- fn=process,
170
- inputs=[tipo, fatos, comarca, vara, cliente, oab],
171
- outputs=output,
172
- api_name="gerar_peca"
173
- )
174
 
175
- limpar_btn.click(
176
- fn=clear,
177
- outputs=[tipo, comarca, vara, cliente, oab, fatos, output],
178
- api_name="limpar"
179
- )
180
 
181
- exemplos = [
182
- ["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"],
183
- ["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"]
184
- ]
185
-
186
- gr.Examples(
187
- examples=exemplos,
188
- inputs=[tipo, fatos, comarca, vara, cliente, oab],
189
- label="Exemplos de Uso"
190
- )
191
 
192
  return demo
193
 
194
  if __name__ == "__main__":
195
- demo = create_interface()
196
- demo.launch()
 
1
  import gradio as gr
 
2
  from huggingface_hub import InferenceClient
3
  import os
4
 
5
+ DOCUMENT_TYPES = {
6
+ "resposta_acusacao": "Resposta à Acusação",
7
+ "habeas_corpus": "Habeas Corpus",
8
+ "revogacao_preventiva": "Revogação de Prisão Preventiva",
9
+ "liberdade_provisoria": "Liberdade Provisória",
10
+ "relaxamento_prisao": "Relaxamento de Prisão",
11
+ "apelacao": "Recurso de Apelação",
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
 
 
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"]
63
+ except Exception as e:
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
 
94
  if __name__ == "__main__":
95
+ create_interface().launch()