Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,27 +1,29 @@
|
|
1 |
import gradio as gr
|
2 |
-
from
|
3 |
-
import json
|
4 |
from datetime import datetime
|
5 |
import logging
|
6 |
from typing import Dict, List, Optional
|
7 |
|
8 |
# Configuração do logging
|
9 |
-
logging.basicConfig(
|
10 |
-
level=logging.INFO,
|
11 |
-
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
12 |
-
)
|
13 |
logger = logging.getLogger(__name__)
|
14 |
|
15 |
-
class
|
16 |
-
"""Gerencia a
|
17 |
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
|
26 |
DADOS DO CASO:
|
27 |
Cliente: {context.get('client_name')}
|
@@ -35,135 +37,33 @@ class PromptManager:
|
|
35 |
FUNDAMENTOS JURÍDICOS:
|
36 |
{context.get('legal_basis')}
|
37 |
|
38 |
-
|
39 |
-
1. Cabeçalho com endereçamento correto
|
40 |
-
2. Qualificação das partes
|
41 |
-
3. Fatos relevantes
|
42 |
-
4. Fundamentos jurídicos
|
43 |
-
5. Jurisprudência relevante
|
44 |
-
6. Pedidos (liminar e mérito)
|
45 |
-
""",
|
46 |
-
|
47 |
-
"denuncia": f"""
|
48 |
-
Atue como um promotor de justiça experiente e gere uma denúncia criminal:
|
49 |
-
|
50 |
-
DADOS DO CASO:
|
51 |
-
Processo: {context.get('process_number')}
|
52 |
-
Tribunal: {context.get('court')}
|
53 |
-
Comarca: {context.get('jurisdiction')}
|
54 |
-
|
55 |
-
FATOS:
|
56 |
-
{context.get('facts')}
|
57 |
-
|
58 |
-
ENQUADRAMENTO LEGAL:
|
59 |
-
{context.get('legal_basis')}
|
60 |
-
|
61 |
-
Gere uma denúncia criminal completa, incluindo:
|
62 |
-
1. Qualificação do(s) denunciado(s)
|
63 |
-
2. Narrativa clara dos fatos
|
64 |
-
3. Tipificação penal
|
65 |
-
4. Circunstâncias do crime
|
66 |
-
5. Rol de testemunhas
|
67 |
-
6. Pedidos
|
68 |
-
""",
|
69 |
-
|
70 |
-
"alegacoes_finais": f"""
|
71 |
-
Atue como um advogado criminalista e gere alegações finais:
|
72 |
-
|
73 |
-
DADOS DO PROCESSO:
|
74 |
-
Cliente: {context.get('client_name')}
|
75 |
-
Processo: {context.get('process_number')}
|
76 |
-
Tribunal: {context.get('court')}
|
77 |
-
|
78 |
-
FATOS E PROVAS:
|
79 |
-
{context.get('facts')}
|
80 |
-
|
81 |
-
TESE DEFENSIVA:
|
82 |
-
{context.get('legal_basis')}
|
83 |
-
|
84 |
-
Elabore alegações finais completas, incluindo:
|
85 |
-
1. Relatório do processo
|
86 |
-
2. Preliminares (se houver)
|
87 |
-
3. Mérito
|
88 |
-
4. Análise das provas
|
89 |
-
5. Pedidos
|
90 |
-
"""
|
91 |
-
}
|
92 |
-
|
93 |
-
return prompts.get(doc_type, "Tipo de documento não suportado")
|
94 |
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
base_prompt = self.prompt_manager.get_base_prompt(doc_type, context)
|
111 |
-
|
112 |
-
system_prompt = """Você é um advogado criminalista experiente especializado em gerar documentos jurídicos.
|
113 |
-
Gere o documento solicitado usando linguagem formal e técnica apropriada."""
|
114 |
-
|
115 |
-
formatted_prompt = f"""### System:
|
116 |
-
{system_prompt}
|
117 |
-
|
118 |
-
### User:
|
119 |
-
{base_prompt}
|
120 |
-
|
121 |
-
### Assistant:
|
122 |
-
Gerando o documento solicitado em formato jurídico adequado:
|
123 |
-
"""
|
124 |
-
|
125 |
-
# Configuração otimizada para documentos jurídicos
|
126 |
-
result = self.pipe(
|
127 |
-
formatted_prompt,
|
128 |
-
max_new_tokens=2048, # Aumentado para documentos longos
|
129 |
-
temperature=0.3, # Reduzido para maior consistência
|
130 |
-
top_p=0.85, # Ajustado para melhor coerência
|
131 |
-
top_k=40, # Limita as opções de tokens
|
132 |
-
num_return_sequences=1,
|
133 |
-
do_sample=True,
|
134 |
-
repetition_penalty=1.2, # Evita repetições
|
135 |
-
pad_token_id=self.pipe.tokenizer.eos_token_id
|
136 |
-
)[0]['generated_text']
|
137 |
-
|
138 |
-
# Remove o prompt do resultado e retorna apenas o documento
|
139 |
-
final_text = result.split("### Assistant:")[-1].strip()
|
140 |
-
return self._format_output(final_text)
|
141 |
|
142 |
except Exception as e:
|
143 |
logger.error(f"Erro na geração: {str(e)}")
|
144 |
-
|
145 |
-
return "Erro: Problema com recursos GPU. Tentando novamente com configurações reduzidas..."
|
146 |
-
elif "out of memory" in str(e):
|
147 |
-
return "Erro: Memória insuficiente. Tente um documento menor."
|
148 |
-
else:
|
149 |
-
return f"Erro na geração do documento: {str(e)}"
|
150 |
|
151 |
def _format_output(self, text: str) -> str:
|
152 |
-
"""Formata o texto gerado
|
153 |
-
if not
|
154 |
-
|
155 |
-
|
156 |
-
else:
|
157 |
-
text = str(text)
|
158 |
-
|
159 |
-
# Remove linhas vazias extras
|
160 |
-
lines = [line for line in text.split('\n') if line.strip()]
|
161 |
-
formatted_text = '\n'.join(lines)
|
162 |
-
|
163 |
-
# Ajusta espaçamento de parágrafos
|
164 |
-
formatted_text = formatted_text.replace('\n\n\n', '\n\n')
|
165 |
-
|
166 |
-
return formatted_text.strip()
|
167 |
|
168 |
class WebInterface:
|
169 |
"""Interface Gradio para o gerador de documentos"""
|
@@ -178,7 +78,7 @@ class WebInterface:
|
|
178 |
with gr.Blocks(theme=gr.themes.Soft()) as self.app:
|
179 |
gr.Markdown("""
|
180 |
# Gerador de Documentos Criminais
|
181 |
-
### Powered by
|
182 |
""")
|
183 |
|
184 |
with gr.Row():
|
@@ -188,7 +88,10 @@ class WebInterface:
|
|
188 |
choices=[
|
189 |
"Habeas Corpus",
|
190 |
"Denúncia",
|
191 |
-
"Alegações Finais"
|
|
|
|
|
|
|
192 |
],
|
193 |
label="Tipo de Documento",
|
194 |
value="Habeas Corpus"
|
@@ -228,12 +131,6 @@ class WebInterface:
|
|
228 |
placeholder="Indique os fundamentos legais principais..."
|
229 |
)
|
230 |
|
231 |
-
# Status e botões
|
232 |
-
status = gr.Textbox(
|
233 |
-
label="Status",
|
234 |
-
interactive=False
|
235 |
-
)
|
236 |
-
|
237 |
generate_btn = gr.Button(
|
238 |
"Gerar Documento",
|
239 |
variant="primary"
|
@@ -245,8 +142,13 @@ class WebInterface:
|
|
245 |
lines=30,
|
246 |
show_copy_button=True
|
247 |
)
|
|
|
|
|
|
|
|
|
|
|
248 |
|
249 |
-
#
|
250 |
gr.Examples(
|
251 |
examples=[
|
252 |
[
|
@@ -302,7 +204,7 @@ class WebInterface:
|
|
302 |
|
303 |
# Gera documento
|
304 |
result = self.generator.generate(
|
305 |
-
doc_type
|
306 |
context
|
307 |
)
|
308 |
|
@@ -314,11 +216,8 @@ class WebInterface:
|
|
314 |
|
315 |
def launch(self):
|
316 |
"""Inicia a interface web"""
|
317 |
-
self.app.launch(
|
318 |
|
319 |
if __name__ == "__main__":
|
320 |
-
# Dependências necessárias:
|
321 |
-
# pip install gradio transformers torch
|
322 |
-
|
323 |
interface = WebInterface()
|
324 |
interface.launch()
|
|
|
1 |
import gradio as gr
|
2 |
+
from huggingface_hub import InferenceClient
|
|
|
3 |
from datetime import datetime
|
4 |
import logging
|
5 |
from typing import Dict, List, Optional
|
6 |
|
7 |
# Configuração do logging
|
8 |
+
logging.basicConfig(level=logging.INFO)
|
|
|
|
|
|
|
9 |
logger = logging.getLogger(__name__)
|
10 |
|
11 |
+
class DocumentGenerator:
|
12 |
+
"""Gerencia a geração de documentos usando Mistral via InferenceClient"""
|
13 |
|
14 |
+
def __init__(self):
|
15 |
+
# Inicializa o cliente de inferência
|
16 |
+
self.client = InferenceClient()
|
17 |
+
self.model = "mistralai/Mistral-7B-Instruct-v0.2"
|
18 |
+
|
19 |
+
def generate(self, doc_type: str, context: Dict[str, str]) -> str:
|
20 |
+
"""Gera o documento baseado no tipo e contexto"""
|
21 |
+
try:
|
22 |
+
# Prepara a mensagem para o modelo
|
23 |
+
system_prompt = """Você é um advogado criminalista experiente especializado em gerar documentos jurídicos no Brasil.
|
24 |
+
Gere o documento solicitado usando linguagem formal, técnica e no formato jurídico correto."""
|
25 |
+
|
26 |
+
user_content = f"""Gere um {doc_type} com os seguintes dados:
|
27 |
|
28 |
DADOS DO CASO:
|
29 |
Cliente: {context.get('client_name')}
|
|
|
37 |
FUNDAMENTOS JURÍDICOS:
|
38 |
{context.get('legal_basis')}
|
39 |
|
40 |
+
O documento deve ser completo, tecnicamente preciso e seguir o formato jurídico brasileiro."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
|
42 |
+
messages = [
|
43 |
+
{"role": "system", "content": system_prompt},
|
44 |
+
{"role": "user", "content": user_content}
|
45 |
+
]
|
46 |
+
|
47 |
+
# Faz a chamada ao modelo
|
48 |
+
completion = self.client.chat.completions.create(
|
49 |
+
model=self.model,
|
50 |
+
messages=messages,
|
51 |
+
max_tokens=2048,
|
52 |
+
temperature=0.3,
|
53 |
+
top_p=0.85,
|
54 |
+
)
|
55 |
+
|
56 |
+
return self._format_output(completion.choices[0].message.content)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
|
58 |
except Exception as e:
|
59 |
logger.error(f"Erro na geração: {str(e)}")
|
60 |
+
return f"Erro na geração do documento: {str(e)}"
|
|
|
|
|
|
|
|
|
|
|
61 |
|
62 |
def _format_output(self, text: str) -> str:
|
63 |
+
"""Formata o texto gerado"""
|
64 |
+
if not text:
|
65 |
+
return "Erro: Nenhum texto gerado"
|
66 |
+
return text.strip()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
67 |
|
68 |
class WebInterface:
|
69 |
"""Interface Gradio para o gerador de documentos"""
|
|
|
78 |
with gr.Blocks(theme=gr.themes.Soft()) as self.app:
|
79 |
gr.Markdown("""
|
80 |
# Gerador de Documentos Criminais
|
81 |
+
### Powered by Mistral-7B-Instruct
|
82 |
""")
|
83 |
|
84 |
with gr.Row():
|
|
|
88 |
choices=[
|
89 |
"Habeas Corpus",
|
90 |
"Denúncia",
|
91 |
+
"Alegações Finais",
|
92 |
+
"Resposta à Acusação",
|
93 |
+
"Recurso em Sentido Estrito",
|
94 |
+
"Apelação Criminal"
|
95 |
],
|
96 |
label="Tipo de Documento",
|
97 |
value="Habeas Corpus"
|
|
|
131 |
placeholder="Indique os fundamentos legais principais..."
|
132 |
)
|
133 |
|
|
|
|
|
|
|
|
|
|
|
|
|
134 |
generate_btn = gr.Button(
|
135 |
"Gerar Documento",
|
136 |
variant="primary"
|
|
|
142 |
lines=30,
|
143 |
show_copy_button=True
|
144 |
)
|
145 |
+
|
146 |
+
status = gr.Textbox(
|
147 |
+
label="Status",
|
148 |
+
interactive=False
|
149 |
+
)
|
150 |
|
151 |
+
# Exemplo de uso
|
152 |
gr.Examples(
|
153 |
examples=[
|
154 |
[
|
|
|
204 |
|
205 |
# Gera documento
|
206 |
result = self.generator.generate(
|
207 |
+
doc_type,
|
208 |
context
|
209 |
)
|
210 |
|
|
|
216 |
|
217 |
def launch(self):
|
218 |
"""Inicia a interface web"""
|
219 |
+
self.app.launch()
|
220 |
|
221 |
if __name__ == "__main__":
|
|
|
|
|
|
|
222 |
interface = WebInterface()
|
223 |
interface.launch()
|