Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
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 |
-
|
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: {
|
85 |
-
Vara: {
|
86 |
-
Cliente: {
|
87 |
-
OAB: {
|
88 |
|
89 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
|
91 |
def create_interface():
|
|
|
|
|
|
|
|
|
92 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
93 |
-
gr.Markdown("# Sistema Criminal.AI"
|
94 |
|
95 |
-
|
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 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
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 |
-
|
137 |
-
|
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 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
)
|
180 |
|
181 |
-
|
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 |
-
|
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()
|
|