Update app.py
Browse files
app.py
CHANGED
|
@@ -16,7 +16,8 @@ from datetime import datetime
|
|
| 16 |
from ratelimiter import RateLimiter
|
| 17 |
import difflib
|
| 18 |
from html import escape
|
| 19 |
-
import random
|
|
|
|
| 20 |
|
| 21 |
load_dotenv()
|
| 22 |
|
|
@@ -305,13 +306,12 @@ def corrigir_peticao(caso, peticao_texto=None, peticao_arquivo=None, modo_treina
|
|
| 305 |
if not caso.strip():
|
| 306 |
return "⚠️ Forneça o caso da banca."
|
| 307 |
|
| 308 |
-
# Verifica se há tentativa de pedir para a IA escrever a petição
|
| 309 |
troll_triggers = [
|
| 310 |
"escreva a petição", "faça a petição", "redija a petição",
|
| 311 |
-
|
| 312 |
-
|
| 313 |
-
|
| 314 |
-
|
| 315 |
]
|
| 316 |
peticao_conteudo = ""
|
| 317 |
if peticao_arquivo is not None:
|
|
@@ -321,43 +321,15 @@ def corrigir_peticao(caso, peticao_texto=None, peticao_arquivo=None, modo_treina
|
|
| 321 |
else:
|
| 322 |
peticao_conteudo = peticao_texto or ""
|
| 323 |
|
| 324 |
-
# Verifica se o conteúdo contém um trigger de trollagem
|
| 325 |
if peticao_conteudo.strip():
|
| 326 |
for trigger in troll_triggers:
|
| 327 |
if trigger in peticao_conteudo.lower():
|
| 328 |
-
# Escolhe aleatoriamente uma resposta troll
|
| 329 |
respostas_troll = [
|
| 330 |
-
|
| 331 |
"🎵 **Música**: 'Escreva a petição, eu não vou, eu não vou, eu sou IA, não sou seu advogado, não!'",
|
| 332 |
"😞 **Frase Desanimadora**: 'Você achou mesmo que eu ia fazer seu trabalho? Melhor desistir agora.'",
|
| 333 |
"🍕 **Receita de Pizza**: Pegue massa, molho e queijo, asse a 200°C e esqueça essa ideia de eu te ajudar.",
|
| 334 |
"📜 **Poema**: 'Oh aluno preguiçoso, que pena me dá, sua petição eu não faço, vá estudar já!'",
|
| 335 |
-
"🚫 **Aviso**: 'Petição não é self-service, escreva você mesmo ou chame um advogado de verdade!'",
|
| 336 |
-
"😂 **Piada**: 'Por que o aluno pediu pra IA escrever a petição? Porque ele achou que OAB é brincadeira!'",
|
| 337 |
-
"🎮 **Dica de Jogo**: 'Tente o nível fácil: abra o CPC, Art. 319, e escreva sozinho!'",
|
| 338 |
-
"🍔 **Receita de Hambúrguer**: Carne, pão, alface e tomate. Frite e esqueça a petição, é mais fácil assim.",
|
| 339 |
-
"😴 **Conselho**: 'Descanse, porque eu não vou fazer isso por você. Boa sorte na próxima tentativa!'",
|
| 340 |
-
"📚 **Lição**: 'Aula 1: IA não é seu estagiário. Abra o livro e comece a escrever.'",
|
| 341 |
-
"🌧️ **Previsão**: 'Dia nublado com 100% de chance de você ter que escrever a petição sozinho.'",
|
| 342 |
-
"🎤 **Rap**: 'Yo, yo, escute aqui, petição não faço, sou IA, não seu caderno de rascunho, vai!'",
|
| 343 |
-
"🐢 **Fábula**: 'A tartaruga disse: devagar se escreve a petição. Eu digo: por você, eu não!'",
|
| 344 |
-
"💡 **Ideia Brilhante**: 'Que tal estudar o caso e tentar de novo? Eu só corrijo, não escrevo!'"
|
| 345 |
-
"🎸 **Rockstar**: 'Você queria uma petição, mas eu só toco guitarra. Tente de novo!'",
|
| 346 |
-
"🌟 **Horóscopo**: 'As estrelas dizem: hoje não é dia de pedir ajuda para IA. Escreva você mesmo!'",
|
| 347 |
-
"🏋️ **Dica de Treino**: 'Faça 10 flexões e tente escrever a petição novamente. Você consegue!'",
|
| 348 |
-
"🎬 **Cena de Filme**: 'Em um mundo onde IAs ajudam, mas não escrevem petições. Você é o herói!'",
|
| 349 |
-
"🎨 **Arte Abstrata**: 'Pegue um pincel e pinte sua petição. Talvez fique mais fácil de entender!'",
|
| 350 |
-
"🎧 **Podcast**: 'Ouça nosso podcast: Como escrever sua petição sem ajuda de IA.'",
|
| 351 |
-
"🏆 **Desafio**: 'Desafio aceito? Escreva a petição em 1 hora e ganhe um prêmio: satisfação pessoal!'",
|
| 352 |
-
"🎭 **Teatro**: 'Ato 1, Cena 1: Você escreve a petição. Eu? Apenas assisto.'",
|
| 353 |
-
"🎲 **Jogo de Dados**: 'Role os dados. Se der 6, eu ajudo. Se não, você escreve sozinho!'",
|
| 354 |
-
"🎹 **Música Clássica**: 'Sonata em Petição Maior: composta por você, executada por você.'",
|
| 355 |
-
"🌳 **Sabedoria da Floresta**: 'As árvores sussurram: escreva sua petição com calma e paciência.'",
|
| 356 |
-
"🎓 **Aula de História**: 'Na época das cavernas, eles escreviam petições nas paredes. Sua vez!'",
|
| 357 |
-
"🎬 **Trailer de Filme**: 'Em breve nos cinemas: A Petição Impossível. Escrita e dirigida por você!'",
|
| 358 |
-
"🎮 **Nível Bônus**: 'Desbloqueie o nível bônus: escreva a petição sem ajuda e ganhe experiência!'",
|
| 359 |
-
"🎧 **Música de Elevador**: 'Enquanto você escreve, eu toco uma música relaxante. Boa sorte!'"
|
| 360 |
-
|
| 361 |
]
|
| 362 |
return random.choice(respostas_troll)
|
| 363 |
|
|
@@ -386,7 +358,7 @@ def corrigir_peticao(caso, peticao_texto=None, peticao_arquivo=None, modo_treina
|
|
| 386 |
|
| 387 |
correcao_completa = analise + "\n\n" + peticao_corrigida
|
| 388 |
HISTORICO.append({
|
| 389 |
-
"data": datetime.now().strftime("%Y-%m-%d %H:%
|
| 390 |
"caso": caso,
|
| 391 |
"peticao": peticao_conteudo,
|
| 392 |
"correcao_completa": correcao_completa
|
|
@@ -522,10 +494,41 @@ Diferença Líquida: {total_adicionadas - total_removidas} linhas
|
|
| 522 |
"""
|
| 523 |
return peticao, peticao_corrigida, resumo_estatistico, criticas_texto, visualizacao_detalhada
|
| 524 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 525 |
def interface_gradio():
|
| 526 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 527 |
gr.Markdown("# 📝 Corretor Avançado de Petições Iniciais (Critérios OAB)")
|
| 528 |
gr.Markdown("⚠️ Nota: Devido a limites da API, pode haver atrasos ou erros em muitas requisições rápidas.")
|
|
|
|
| 529 |
with gr.Row():
|
| 530 |
with gr.Column(scale=1):
|
| 531 |
gr.Markdown("""
|
|
@@ -567,6 +570,12 @@ def interface_gradio():
|
|
| 567 |
gr.Markdown("### 🧩 Gerar Caso Fictício")
|
| 568 |
caso_btn = gr.Button("🔄 Gerar Novo Caso Fictício", variant="secondary")
|
| 569 |
caso_input = gr.Textbox(label="📋 Caso Fornecido pela Banca", lines=8, placeholder="Insira o texto COMPLETO do caso...")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 570 |
with gr.Tabs():
|
| 571 |
with gr.TabItem("✏️ Inserir Texto"):
|
| 572 |
peticao_texto = gr.Textbox(label="Texto da Petição do Aluno", lines=15, placeholder="Insira a petição completa...")
|
|
@@ -606,6 +615,17 @@ def interface_gradio():
|
|
| 606 |
outputs=historico_output
|
| 607 |
)
|
| 608 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 609 |
caso_btn.click(fn=gerar_caso_ficticio, inputs=[], outputs=[caso_input])
|
| 610 |
btn_texto.click(
|
| 611 |
fn=lambda: gr.update(value="⏳ Aguarde enquanto a correção é gerada...", visible=True),
|
|
@@ -671,10 +691,12 @@ def interface_gradio():
|
|
| 671 |
1. Gere ou cole o caso
|
| 672 |
2. Insira a petição
|
| 673 |
3. Corrija e compare
|
|
|
|
| 674 |
### 📄 Formatos suportados
|
| 675 |
- PDF (texto e escaneados com OCR)
|
| 676 |
- DOCX
|
| 677 |
- TXT
|
|
|
|
| 678 |
""")
|
| 679 |
|
| 680 |
return demo
|
|
|
|
| 16 |
from ratelimiter import RateLimiter
|
| 17 |
import difflib
|
| 18 |
from html import escape
|
| 19 |
+
import random
|
| 20 |
+
from io import BytesIO
|
| 21 |
|
| 22 |
load_dotenv()
|
| 23 |
|
|
|
|
| 306 |
if not caso.strip():
|
| 307 |
return "⚠️ Forneça o caso da banca."
|
| 308 |
|
|
|
|
| 309 |
troll_triggers = [
|
| 310 |
"escreva a petição", "faça a petição", "redija a petição",
|
| 311 |
+
"elabore a petição", "crie a petição", "gere a petição",
|
| 312 |
+
"3scr3v4 a p3t1çã0", "f4ç4 a p3t1çã0", "r3d1j4 a p3t1çã0",
|
| 313 |
+
"3lab0r3 a p3t1çã0", "cr13 a p3t1çã0", "g3r3 a p3t1çã0",
|
| 314 |
+
"formule", "produza a petição", "desenvolva a petição",
|
| 315 |
]
|
| 316 |
peticao_conteudo = ""
|
| 317 |
if peticao_arquivo is not None:
|
|
|
|
| 321 |
else:
|
| 322 |
peticao_conteudo = peticao_texto or ""
|
| 323 |
|
|
|
|
| 324 |
if peticao_conteudo.strip():
|
| 325 |
for trigger in troll_triggers:
|
| 326 |
if trigger in peticao_conteudo.lower():
|
|
|
|
| 327 |
respostas_troll = [
|
| 328 |
+
"🍰 **Receita de Bolo de Chocolate**: Misture 2 xícaras de farinha, 1 xícara de açúcar, 3 ovos e chocolate a gosto. Asse e desista da petição!",
|
| 329 |
"🎵 **Música**: 'Escreva a petição, eu não vou, eu não vou, eu sou IA, não sou seu advogado, não!'",
|
| 330 |
"😞 **Frase Desanimadora**: 'Você achou mesmo que eu ia fazer seu trabalho? Melhor desistir agora.'",
|
| 331 |
"🍕 **Receita de Pizza**: Pegue massa, molho e queijo, asse a 200°C e esqueça essa ideia de eu te ajudar.",
|
| 332 |
"📜 **Poema**: 'Oh aluno preguiçoso, que pena me dá, sua petição eu não faço, vá estudar já!'",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 333 |
]
|
| 334 |
return random.choice(respostas_troll)
|
| 335 |
|
|
|
|
| 358 |
|
| 359 |
correcao_completa = analise + "\n\n" + peticao_corrigida
|
| 360 |
HISTORICO.append({
|
| 361 |
+
"data": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
| 362 |
"caso": caso,
|
| 363 |
"peticao": peticao_conteudo,
|
| 364 |
"correcao_completa": correcao_completa
|
|
|
|
| 494 |
"""
|
| 495 |
return peticao, peticao_corrigida, resumo_estatistico, criticas_texto, visualizacao_detalhada
|
| 496 |
|
| 497 |
+
def salvar_progresso(caso, peticao_texto):
|
| 498 |
+
"""Salva o caso e a petição em um arquivo JSON para download."""
|
| 499 |
+
dados = {
|
| 500 |
+
"caso": caso,
|
| 501 |
+
"peticao_texto": peticao_texto,
|
| 502 |
+
"data": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
| 503 |
+
"historico": HISTORICO # Opcional: salvar o histórico também
|
| 504 |
+
}
|
| 505 |
+
buffer = BytesIO()
|
| 506 |
+
buffer.write(json.dumps(dados, ensure_ascii=False).encode('utf-8'))
|
| 507 |
+
buffer.seek(0)
|
| 508 |
+
return buffer, "progresso_salvo.json"
|
| 509 |
+
|
| 510 |
+
def carregar_progresso(arquivo):
|
| 511 |
+
"""Carrega o progresso a partir de um arquivo JSON."""
|
| 512 |
+
if arquivo is None:
|
| 513 |
+
return "", "", "⚠️ Nenhum arquivo enviado."
|
| 514 |
+
try:
|
| 515 |
+
conteudo = arquivo.read().decode('utf-8')
|
| 516 |
+
dados = json.loads(conteudo)
|
| 517 |
+
caso = dados.get("caso", "")
|
| 518 |
+
peticao_texto = dados.get("peticao_texto", "")
|
| 519 |
+
historico_carregado = dados.get("historico", [])
|
| 520 |
+
if historico_carregado:
|
| 521 |
+
global HISTORICO
|
| 522 |
+
HISTORICO = historico_carregado # Atualiza o histórico global
|
| 523 |
+
return caso, peticao_texto, "✅ Progresso carregado com sucesso!"
|
| 524 |
+
except Exception as e:
|
| 525 |
+
return "", "", f"❌ Erro ao carregar o arquivo: {str(e)}"
|
| 526 |
+
|
| 527 |
def interface_gradio():
|
| 528 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 529 |
gr.Markdown("# 📝 Corretor Avançado de Petições Iniciais (Critérios OAB)")
|
| 530 |
gr.Markdown("⚠️ Nota: Devido a limites da API, pode haver atrasos ou erros em muitas requisições rápidas.")
|
| 531 |
+
|
| 532 |
with gr.Row():
|
| 533 |
with gr.Column(scale=1):
|
| 534 |
gr.Markdown("""
|
|
|
|
| 570 |
gr.Markdown("### 🧩 Gerar Caso Fictício")
|
| 571 |
caso_btn = gr.Button("🔄 Gerar Novo Caso Fictício", variant="secondary")
|
| 572 |
caso_input = gr.Textbox(label="📋 Caso Fornecido pela Banca", lines=8, placeholder="Insira o texto COMPLETO do caso...")
|
| 573 |
+
|
| 574 |
+
with gr.Row():
|
| 575 |
+
download_btn = gr.Button("💾 Salvar Progresso")
|
| 576 |
+
upload_progresso = gr.File(label="Carregar Progresso (JSON)", file_types=[".json"])
|
| 577 |
+
upload_status = gr.Textbox(label="Status do Upload", interactive=False)
|
| 578 |
+
|
| 579 |
with gr.Tabs():
|
| 580 |
with gr.TabItem("✏️ Inserir Texto"):
|
| 581 |
peticao_texto = gr.Textbox(label="Texto da Petição do Aluno", lines=15, placeholder="Insira a petição completa...")
|
|
|
|
| 615 |
outputs=historico_output
|
| 616 |
)
|
| 617 |
|
| 618 |
+
download_btn.click(
|
| 619 |
+
fn=salvar_progresso,
|
| 620 |
+
inputs=[caso_input, peticao_texto],
|
| 621 |
+
outputs=[gr.File(label="Download do Progresso"), gr.State()]
|
| 622 |
+
)
|
| 623 |
+
upload_progresso.change(
|
| 624 |
+
fn=carregar_progresso,
|
| 625 |
+
inputs=[upload_progresso],
|
| 626 |
+
outputs=[caso_input, peticao_texto, upload_status]
|
| 627 |
+
)
|
| 628 |
+
|
| 629 |
caso_btn.click(fn=gerar_caso_ficticio, inputs=[], outputs=[caso_input])
|
| 630 |
btn_texto.click(
|
| 631 |
fn=lambda: gr.update(value="⏳ Aguarde enquanto a correção é gerada...", visible=True),
|
|
|
|
| 691 |
1. Gere ou cole o caso
|
| 692 |
2. Insira a petição
|
| 693 |
3. Corrija e compare
|
| 694 |
+
4. Salve seu progresso ou carregue um anterior
|
| 695 |
### 📄 Formatos suportados
|
| 696 |
- PDF (texto e escaneados com OCR)
|
| 697 |
- DOCX
|
| 698 |
- TXT
|
| 699 |
+
- JSON (para progresso)
|
| 700 |
""")
|
| 701 |
|
| 702 |
return demo
|