Update app.py
Browse files
app.py
CHANGED
|
@@ -28,12 +28,12 @@ GEMINI_API_URL = f"https://generativelanguage.googleapis.com/v1beta/models/gemin
|
|
| 28 |
CONFIG = {
|
| 29 |
"max_retry_attempts": 3,
|
| 30 |
"retry_delay": 5,
|
| 31 |
-
"timeout":
|
| 32 |
"temperatura": 0.2,
|
| 33 |
"max_tokens": 12882
|
| 34 |
}
|
| 35 |
|
| 36 |
-
rate_limiter = RateLimiter(max_calls=
|
| 37 |
|
| 38 |
DICAS_OAB_MELHORADO = {
|
| 39 |
"Endereçamento": "Em relações de consumo, prefira o foro do domicílio do autor (Art. 101, I, CDC). Exemplo: 'Excelentíssimo Senhor Juiz de Direito da Vara Cível da Comarca de [Cidade do Autor]'.",
|
|
@@ -300,40 +300,35 @@ def chamar_api(prompt):
|
|
| 300 |
except Exception as e:
|
| 301 |
return f"❌ Erro inesperado: {str(e)}"
|
| 302 |
|
| 303 |
-
def
|
| 304 |
-
# Função wrapper para fornecer feedback de progresso
|
| 305 |
if not caso.strip():
|
| 306 |
-
return "⚠️ Forneça o caso da banca."
|
| 307 |
if peticao_arquivo is not None:
|
| 308 |
-
yield "", "⏳ Processando arquivo..."
|
| 309 |
peticao_conteudo = process_file(peticao_arquivo)
|
| 310 |
if peticao_conteudo.startswith("❌") or peticao_conteudo.startswith("⚠️"):
|
| 311 |
-
return peticao_conteudo
|
| 312 |
else:
|
| 313 |
peticao_conteudo = peticao_texto or ""
|
| 314 |
if not peticao_conteudo.strip():
|
| 315 |
-
return "⚠️ Forneça uma petição."
|
| 316 |
|
| 317 |
-
yield "", "⏳ Validando petição..."
|
| 318 |
problemas = validar_peticao_basica(peticao_conteudo)
|
| 319 |
aviso_validacao = f"### Validação Inicial\n\n" + "\n".join(problemas) + "\n\n" if problemas else ""
|
| 320 |
|
| 321 |
cache_key = f"{caso[:50]}|{peticao_conteudo[:50]}|{modo_treinamento}"
|
| 322 |
if cache_key in CORRECAO_CACHE:
|
| 323 |
-
return aviso_validacao + CORRECAO_CACHE[cache_key]
|
| 324 |
|
| 325 |
-
yield "", "⏳ Analisando petição com a API..."
|
| 326 |
prompt_analise = estruturar_prompt_analise(caso, peticao_conteudo, modo_treinamento)
|
| 327 |
analise = chamar_api(prompt_analise)
|
| 328 |
if "❌" in analise or "⏱️" in analise:
|
| 329 |
-
return aviso_validacao + analise
|
| 330 |
analise_formatada = formatar_correcao(analise)
|
| 331 |
|
| 332 |
-
yield "", "⏳ Gerando petição corrigida..."
|
| 333 |
prompt_peticao = estruturar_prompt_peticao_corrigida(caso, peticao_conteudo)
|
| 334 |
peticao_corrigida = chamar_api(prompt_peticao)
|
| 335 |
if "❌" in peticao_corrigida or "⏱️" in peticao_corrigida:
|
| 336 |
-
return aviso_validacao + analise_formatada + "\n\n" + peticao_corrigida
|
| 337 |
|
| 338 |
peticao_corrigida = pos_corrigir_peticao(peticao_corrigida)
|
| 339 |
|
|
@@ -347,7 +342,7 @@ def corrigir_peticao_com_progresso(caso, peticao_texto=None, peticao_arquivo=Non
|
|
| 347 |
if len(HISTORICO) > 10:
|
| 348 |
HISTORICO.pop(0)
|
| 349 |
CORRECAO_CACHE[cache_key] = analise_formatada
|
| 350 |
-
return aviso_validacao + analise_formatada
|
| 351 |
|
| 352 |
def formatar_correcao(texto):
|
| 353 |
linhas = texto.split('\n')
|
|
@@ -372,7 +367,7 @@ def formatar_correcao(texto):
|
|
| 372 |
if "Nota Final" in texto_formatado:
|
| 373 |
import re
|
| 374 |
nota_pattern = r"### Nota Final.*?(\d+[.,]\d+|\d+)"
|
| 375 |
-
match = re.search(nota_pattern,
|
| 376 |
if match:
|
| 377 |
nota = match.group(1)
|
| 378 |
texto_formatado = texto_formatado.replace(f"### ⭐ Nota Final\n\n{nota}", f"### ⭐ Nota Final: {nota}/10\n\n")
|
|
@@ -511,9 +506,6 @@ def interface_gradio():
|
|
| 511 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 512 |
gr.Markdown("# 📝 Corretor Avançado de Petições Iniciais (Critérios OAB)")
|
| 513 |
gr.Markdown("⚠️ Nota: Devido a limites da API, pode haver atrasos ou erros em muitas requisições rápidas.")
|
| 514 |
-
|
| 515 |
-
estado_processamento = gr.Textbox(label="Status do Processamento", value="Aguardando...", interactive=False)
|
| 516 |
-
|
| 517 |
with gr.Row():
|
| 518 |
with gr.Column(scale=1):
|
| 519 |
gr.Markdown("""
|
|
@@ -597,24 +589,23 @@ def interface_gradio():
|
|
| 597 |
outputs=historico_output
|
| 598 |
)
|
| 599 |
|
| 600 |
-
|
| 601 |
btn_texto.click(
|
| 602 |
-
fn=
|
| 603 |
-
inputs=[caso_input, peticao_texto,
|
| 604 |
-
outputs=[resultado_output
|
| 605 |
)
|
| 606 |
btn_arquivo.click(
|
| 607 |
-
fn=
|
| 608 |
-
inputs=[caso_input,
|
| 609 |
-
outputs=[resultado_output
|
| 610 |
)
|
| 611 |
-
|
| 612 |
clear_btn.click(
|
| 613 |
-
fn=lambda: [None, None, None, None, "", "", "", "", "", gr.update(visible=False), gr.update(visible=False)
|
| 614 |
inputs=None,
|
| 615 |
outputs=[caso_input, peticao_texto, peticao_arquivo, arquivo_preview, resultado_output, dica_contextual,
|
| 616 |
peticao_aluno_output, peticao_corrigida_output, resumo_alteracoes_output, criticas_output,
|
| 617 |
-
visualizacao_detalhada_output, download_btn, download_file
|
| 618 |
)
|
| 619 |
comparar_btn.click(
|
| 620 |
fn=comparar_peticao_melhorada,
|
|
|
|
| 28 |
CONFIG = {
|
| 29 |
"max_retry_attempts": 3,
|
| 30 |
"retry_delay": 5,
|
| 31 |
+
"timeout": 60,
|
| 32 |
"temperatura": 0.2,
|
| 33 |
"max_tokens": 12882
|
| 34 |
}
|
| 35 |
|
| 36 |
+
rate_limiter = RateLimiter(max_calls=60, period=60)
|
| 37 |
|
| 38 |
DICAS_OAB_MELHORADO = {
|
| 39 |
"Endereçamento": "Em relações de consumo, prefira o foro do domicílio do autor (Art. 101, I, CDC). Exemplo: 'Excelentíssimo Senhor Juiz de Direito da Vara Cível da Comarca de [Cidade do Autor]'.",
|
|
|
|
| 300 |
except Exception as e:
|
| 301 |
return f"❌ Erro inesperado: {str(e)}"
|
| 302 |
|
| 303 |
+
def corrigir_peticao(caso, peticao_texto=None, peticao_arquivo=None, modo_treinamento=False):
|
|
|
|
| 304 |
if not caso.strip():
|
| 305 |
+
return "⚠️ Forneça o caso da banca."
|
| 306 |
if peticao_arquivo is not None:
|
|
|
|
| 307 |
peticao_conteudo = process_file(peticao_arquivo)
|
| 308 |
if peticao_conteudo.startswith("❌") or peticao_conteudo.startswith("⚠️"):
|
| 309 |
+
return peticao_conteudo
|
| 310 |
else:
|
| 311 |
peticao_conteudo = peticao_texto or ""
|
| 312 |
if not peticao_conteudo.strip():
|
| 313 |
+
return "⚠️ Forneça uma petição."
|
| 314 |
|
|
|
|
| 315 |
problemas = validar_peticao_basica(peticao_conteudo)
|
| 316 |
aviso_validacao = f"### Validação Inicial\n\n" + "\n".join(problemas) + "\n\n" if problemas else ""
|
| 317 |
|
| 318 |
cache_key = f"{caso[:50]}|{peticao_conteudo[:50]}|{modo_treinamento}"
|
| 319 |
if cache_key in CORRECAO_CACHE:
|
| 320 |
+
return aviso_validacao + CORRECAO_CACHE[cache_key]
|
| 321 |
|
|
|
|
| 322 |
prompt_analise = estruturar_prompt_analise(caso, peticao_conteudo, modo_treinamento)
|
| 323 |
analise = chamar_api(prompt_analise)
|
| 324 |
if "❌" in analise or "⏱️" in analise:
|
| 325 |
+
return aviso_validacao + analise
|
| 326 |
analise_formatada = formatar_correcao(analise)
|
| 327 |
|
|
|
|
| 328 |
prompt_peticao = estruturar_prompt_peticao_corrigida(caso, peticao_conteudo)
|
| 329 |
peticao_corrigida = chamar_api(prompt_peticao)
|
| 330 |
if "❌" in peticao_corrigida or "⏱️" in peticao_corrigida:
|
| 331 |
+
return aviso_validacao + analise_formatada + "\n\n" + peticao_corrigida
|
| 332 |
|
| 333 |
peticao_corrigida = pos_corrigir_peticao(peticao_corrigida)
|
| 334 |
|
|
|
|
| 342 |
if len(HISTORICO) > 10:
|
| 343 |
HISTORICO.pop(0)
|
| 344 |
CORRECAO_CACHE[cache_key] = analise_formatada
|
| 345 |
+
return aviso_validacao + analise_formatada
|
| 346 |
|
| 347 |
def formatar_correcao(texto):
|
| 348 |
linhas = texto.split('\n')
|
|
|
|
| 367 |
if "Nota Final" in texto_formatado:
|
| 368 |
import re
|
| 369 |
nota_pattern = r"### Nota Final.*?(\d+[.,]\d+|\d+)"
|
| 370 |
+
match = re.search(nota_pattern, texto_formatado, re.DOTALL)
|
| 371 |
if match:
|
| 372 |
nota = match.group(1)
|
| 373 |
texto_formatado = texto_formatado.replace(f"### ⭐ Nota Final\n\n{nota}", f"### ⭐ Nota Final: {nota}/10\n\n")
|
|
|
|
| 506 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 507 |
gr.Markdown("# 📝 Corretor Avançado de Petições Iniciais (Critérios OAB)")
|
| 508 |
gr.Markdown("⚠️ Nota: Devido a limites da API, pode haver atrasos ou erros em muitas requisições rápidas.")
|
|
|
|
|
|
|
|
|
|
| 509 |
with gr.Row():
|
| 510 |
with gr.Column(scale=1):
|
| 511 |
gr.Markdown("""
|
|
|
|
| 589 |
outputs=historico_output
|
| 590 |
)
|
| 591 |
|
| 592 |
+
caso_btn.click(fn=gerar_caso_ficticio, inputs=[], outputs=[caso_input])
|
| 593 |
btn_texto.click(
|
| 594 |
+
fn=lambda caso, texto, treinamento: corrigir_peticao(caso, texto, None, treinamento),
|
| 595 |
+
inputs=[caso_input, peticao_texto, modo_treinamento],
|
| 596 |
+
outputs=[resultado_output]
|
| 597 |
)
|
| 598 |
btn_arquivo.click(
|
| 599 |
+
fn=lambda caso, arquivo, treinamento: corrigir_peticao(caso, None, arquivo, treinamento),
|
| 600 |
+
inputs=[caso_input, peticao_arquivo, modo_treinamento],
|
| 601 |
+
outputs=[resultado_output]
|
| 602 |
)
|
|
|
|
| 603 |
clear_btn.click(
|
| 604 |
+
fn=lambda: [None, None, None, None, "", "", "", "", "", gr.update(visible=False), gr.update(visible=False)],
|
| 605 |
inputs=None,
|
| 606 |
outputs=[caso_input, peticao_texto, peticao_arquivo, arquivo_preview, resultado_output, dica_contextual,
|
| 607 |
peticao_aluno_output, peticao_corrigida_output, resumo_alteracoes_output, criticas_output,
|
| 608 |
+
visualizacao_detalhada_output, download_btn, download_file]
|
| 609 |
)
|
| 610 |
comparar_btn.click(
|
| 611 |
fn=comparar_peticao_melhorada,
|