Update app.py
Browse files
app.py
CHANGED
|
@@ -18,7 +18,7 @@ import difflib
|
|
| 18 |
from html import escape
|
| 19 |
import random
|
| 20 |
import logging
|
| 21 |
-
import re
|
| 22 |
|
| 23 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
| 24 |
logger = logging.getLogger(__name__)
|
|
@@ -101,7 +101,6 @@ def extract_text_from_pdf(file_path_or_obj):
|
|
| 101 |
else:
|
| 102 |
logger.warning(f"Página {i+1} sem texto extraível, tentando OCR.")
|
| 103 |
try:
|
| 104 |
-
# Supondo que Tesseract esteja instalado via packages.txt no HF
|
| 105 |
img = page.to_image(resolution=300)
|
| 106 |
preprocessed_img = preprocess_image_for_ocr(img.original)
|
| 107 |
page_ocr_text = pytesseract.image_to_string(preprocessed_img, lang='por')
|
|
@@ -725,7 +724,7 @@ def chamar_api(prompt):
|
|
| 725 |
return "❌ Falha ao chamar a API após todas as tentativas."
|
| 726 |
|
| 727 |
def corrigir_peticao(caso, tipo_peticao, peticao_texto=None, peticao_arquivo=None, modo_treinamento=False):
|
| 728 |
-
logger.info(f"Iniciando correção para tipo: {tipo_peticao}")
|
| 729 |
start_time = time.time()
|
| 730 |
|
| 731 |
if not caso or not caso.strip():
|
|
@@ -739,6 +738,7 @@ def corrigir_peticao(caso, tipo_peticao, peticao_texto=None, peticao_arquivo=Non
|
|
| 739 |
peticao_conteudo = ""
|
| 740 |
if peticao_arquivo is not None:
|
| 741 |
logger.info("Processando arquivo de petição...")
|
|
|
|
| 742 |
peticao_conteudo = process_file(peticao_arquivo)
|
| 743 |
if peticao_conteudo.startswith("❌") or peticao_conteudo.startswith("⚠️"):
|
| 744 |
logger.error(f"Erro ao processar arquivo: {peticao_conteudo}")
|
|
@@ -778,7 +778,6 @@ def corrigir_peticao(caso, tipo_peticao, peticao_texto=None, peticao_arquivo=Non
|
|
| 778 |
if cache_key in CORRECAO_CACHE:
|
| 779 |
logger.info("Correção encontrada no cache.")
|
| 780 |
cached_data = CORRECAO_CACHE[cache_key]
|
| 781 |
-
# Recalcular diff_html se não foi cacheado
|
| 782 |
diff_html_cache, _, _ = calcular_diff_interno(cached_data["peticao_original"], cached_data["peticao_corrigida"])
|
| 783 |
return cached_data["analise_formatada"], cached_data["peticao_original"], cached_data["peticao_corrigida"], cached_data["resumo_diff"], cached_data["criticas_diff"], diff_html_cache
|
| 784 |
|
|
@@ -1212,6 +1211,7 @@ def interface_gradio():
|
|
| 1212 |
choices=TIPOS_DE_PETICAO,
|
| 1213 |
value="Petição Inicial"
|
| 1214 |
)
|
|
|
|
| 1215 |
modo_treinamento = gr.Checkbox(label="🎓 Modo Treinamento (Feedback Detalhado)", value=False)
|
| 1216 |
|
| 1217 |
with gr.Accordion("⚙️ Configurações Avançadas", open=False):
|
|
@@ -1281,6 +1281,23 @@ def interface_gradio():
|
|
| 1281 |
|
| 1282 |
clear_btn = gr.Button("🗑️ Limpar Tudo")
|
| 1283 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1284 |
caso_btn.click(
|
| 1285 |
fn=gerar_caso_ficticio,
|
| 1286 |
inputs=[tipo_peticao_input],
|
|
@@ -1304,13 +1321,16 @@ def interface_gradio():
|
|
| 1304 |
outputs=[arquivo_preview_output]
|
| 1305 |
)
|
| 1306 |
|
|
|
|
| 1307 |
btn_corrigir.click(
|
| 1308 |
fn=lambda: gr.update(value="⏳ Processando... Gerando análise e correção. Isso pode levar um minuto...", visible=True),
|
| 1309 |
inputs=None,
|
| 1310 |
outputs=[processing_message]
|
| 1311 |
).then(
|
| 1312 |
-
fn=
|
| 1313 |
-
|
|
|
|
|
|
|
| 1314 |
outputs=[resultado_analise_output, gr.Textbox(visible=False), resultado_peticao_corrigida_output,
|
| 1315 |
resumo_alteracoes_output, criticas_output, visualizacao_detalhada_output]
|
| 1316 |
).then(
|
|
@@ -1319,13 +1339,16 @@ def interface_gradio():
|
|
| 1319 |
outputs=[processing_message]
|
| 1320 |
)
|
| 1321 |
|
|
|
|
| 1322 |
btn_corrigir_arquivo.click(
|
| 1323 |
fn=lambda: gr.update(value="⏳ Processando arquivo... Gerando análise e correção. Isso pode levar um minuto...", visible=True),
|
| 1324 |
inputs=None,
|
| 1325 |
outputs=[processing_message]
|
| 1326 |
).then(
|
| 1327 |
-
fn=
|
| 1328 |
-
|
|
|
|
|
|
|
| 1329 |
outputs=[resultado_analise_output, gr.Textbox(visible=False), resultado_peticao_corrigida_output,
|
| 1330 |
resumo_alteracoes_output, criticas_output, visualizacao_detalhada_output]
|
| 1331 |
).then(
|
|
|
|
| 18 |
from html import escape
|
| 19 |
import random
|
| 20 |
import logging
|
| 21 |
+
import re
|
| 22 |
|
| 23 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
| 24 |
logger = logging.getLogger(__name__)
|
|
|
|
| 101 |
else:
|
| 102 |
logger.warning(f"Página {i+1} sem texto extraível, tentando OCR.")
|
| 103 |
try:
|
|
|
|
| 104 |
img = page.to_image(resolution=300)
|
| 105 |
preprocessed_img = preprocess_image_for_ocr(img.original)
|
| 106 |
page_ocr_text = pytesseract.image_to_string(preprocessed_img, lang='por')
|
|
|
|
| 724 |
return "❌ Falha ao chamar a API após todas as tentativas."
|
| 725 |
|
| 726 |
def corrigir_peticao(caso, tipo_peticao, peticao_texto=None, peticao_arquivo=None, modo_treinamento=False):
|
| 727 |
+
logger.info(f"Iniciando correção para tipo: {tipo_peticao}, Modo Treinamento: {modo_treinamento}")
|
| 728 |
start_time = time.time()
|
| 729 |
|
| 730 |
if not caso or not caso.strip():
|
|
|
|
| 738 |
peticao_conteudo = ""
|
| 739 |
if peticao_arquivo is not None:
|
| 740 |
logger.info("Processando arquivo de petição...")
|
| 741 |
+
# O objeto peticao_arquivo aqui é o próprio arquivo temporário do Gradio
|
| 742 |
peticao_conteudo = process_file(peticao_arquivo)
|
| 743 |
if peticao_conteudo.startswith("❌") or peticao_conteudo.startswith("⚠️"):
|
| 744 |
logger.error(f"Erro ao processar arquivo: {peticao_conteudo}")
|
|
|
|
| 778 |
if cache_key in CORRECAO_CACHE:
|
| 779 |
logger.info("Correção encontrada no cache.")
|
| 780 |
cached_data = CORRECAO_CACHE[cache_key]
|
|
|
|
| 781 |
diff_html_cache, _, _ = calcular_diff_interno(cached_data["peticao_original"], cached_data["peticao_corrigida"])
|
| 782 |
return cached_data["analise_formatada"], cached_data["peticao_original"], cached_data["peticao_corrigida"], cached_data["resumo_diff"], cached_data["criticas_diff"], diff_html_cache
|
| 783 |
|
|
|
|
| 1211 |
choices=TIPOS_DE_PETICAO,
|
| 1212 |
value="Petição Inicial"
|
| 1213 |
)
|
| 1214 |
+
# Definindo o componente checkbox
|
| 1215 |
modo_treinamento = gr.Checkbox(label="🎓 Modo Treinamento (Feedback Detalhado)", value=False)
|
| 1216 |
|
| 1217 |
with gr.Accordion("⚙️ Configurações Avançadas", open=False):
|
|
|
|
| 1281 |
|
| 1282 |
clear_btn = gr.Button("🗑️ Limpar Tudo")
|
| 1283 |
|
| 1284 |
+
# --- FUNÇÕES WRAPPER ---
|
| 1285 |
+
def corrigir_peticao_wrapper_texto(caso, tipo_peticao, peticao_texto, peticao_arquivo_state):
|
| 1286 |
+
# Acessa o valor atual do componente checkbox
|
| 1287 |
+
is_treinamento = modo_treinamento.value
|
| 1288 |
+
# Chama a função original passando o valor booleano
|
| 1289 |
+
return corrigir_peticao(caso, tipo_peticao, peticao_texto, peticao_arquivo_state, is_treinamento)
|
| 1290 |
+
|
| 1291 |
+
def corrigir_peticao_wrapper_arquivo(caso, tipo_peticao, peticao_texto_state, peticao_arquivo):
|
| 1292 |
+
# Acessa o valor atual do componente checkbox
|
| 1293 |
+
is_treinamento = modo_treinamento.value
|
| 1294 |
+
# Chama a função original passando o valor booleano
|
| 1295 |
+
return corrigir_peticao(caso, tipo_peticao, peticao_texto_state, peticao_arquivo, is_treinamento)
|
| 1296 |
+
# --- FIM DAS FUNÇÕES WRAPPER ---
|
| 1297 |
+
|
| 1298 |
+
|
| 1299 |
+
# --- LÓGICA DOS BOTÕES E EVENTOS (COM CORREÇÃO) ---
|
| 1300 |
+
|
| 1301 |
caso_btn.click(
|
| 1302 |
fn=gerar_caso_ficticio,
|
| 1303 |
inputs=[tipo_peticao_input],
|
|
|
|
| 1321 |
outputs=[arquivo_preview_output]
|
| 1322 |
)
|
| 1323 |
|
| 1324 |
+
# Botão Corrigir (Texto) - MODIFICADO PARA USAR WRAPPER
|
| 1325 |
btn_corrigir.click(
|
| 1326 |
fn=lambda: gr.update(value="⏳ Processando... Gerando análise e correção. Isso pode levar um minuto...", visible=True),
|
| 1327 |
inputs=None,
|
| 1328 |
outputs=[processing_message]
|
| 1329 |
).then(
|
| 1330 |
+
fn=corrigir_peticao_wrapper_texto, # Chama a função wrapper
|
| 1331 |
+
# Inputs SEM o componente modo_treinamento
|
| 1332 |
+
inputs=[caso_input, tipo_peticao_input, peticao_texto_input, gr.State(None)],
|
| 1333 |
+
# Outputs permanecem os mesmos
|
| 1334 |
outputs=[resultado_analise_output, gr.Textbox(visible=False), resultado_peticao_corrigida_output,
|
| 1335 |
resumo_alteracoes_output, criticas_output, visualizacao_detalhada_output]
|
| 1336 |
).then(
|
|
|
|
| 1339 |
outputs=[processing_message]
|
| 1340 |
)
|
| 1341 |
|
| 1342 |
+
# Botão Corrigir (Arquivo) - MODIFICADO PARA USAR WRAPPER
|
| 1343 |
btn_corrigir_arquivo.click(
|
| 1344 |
fn=lambda: gr.update(value="⏳ Processando arquivo... Gerando análise e correção. Isso pode levar um minuto...", visible=True),
|
| 1345 |
inputs=None,
|
| 1346 |
outputs=[processing_message]
|
| 1347 |
).then(
|
| 1348 |
+
fn=corrigir_peticao_wrapper_arquivo, # Chama a função wrapper
|
| 1349 |
+
# Inputs SEM o componente modo_treinamento
|
| 1350 |
+
inputs=[caso_input, tipo_peticao_input, gr.State(None), peticao_arquivo_input],
|
| 1351 |
+
# Outputs permanecem os mesmos
|
| 1352 |
outputs=[resultado_analise_output, gr.Textbox(visible=False), resultado_peticao_corrigida_output,
|
| 1353 |
resumo_alteracoes_output, criticas_output, visualizacao_detalhada_output]
|
| 1354 |
).then(
|