Update app.py
Browse files
app.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
| 1 |
-
# app.py
|
| 2 |
import gradio as gr
|
| 3 |
import requests
|
| 4 |
import os
|
|
@@ -15,6 +14,7 @@ import pytesseract
|
|
| 15 |
import cv2
|
| 16 |
import numpy as np
|
| 17 |
from datetime import datetime
|
|
|
|
| 18 |
|
| 19 |
# Carrega variáveis de ambiente de um arquivo .env (opcional para dev local)
|
| 20 |
load_dotenv()
|
|
@@ -30,12 +30,15 @@ GEMINI_API_URL = f"https://generativelanguage.googleapis.com/v1beta/models/gemin
|
|
| 30 |
# Configurações da aplicação
|
| 31 |
CONFIG = {
|
| 32 |
"max_retry_attempts": 3,
|
| 33 |
-
"retry_delay":
|
| 34 |
"timeout": 60,
|
| 35 |
"temperatura": 0.2,
|
| 36 |
"max_tokens": 4096
|
| 37 |
}
|
| 38 |
|
|
|
|
|
|
|
|
|
|
| 39 |
# Banco de dicas contextuais
|
| 40 |
DICAS_OAB = {
|
| 41 |
"Endereçamento": "Em relações de consumo, prefira o foro do domicílio do autor (art. 101, I, CDC).",
|
|
@@ -45,8 +48,9 @@ DICAS_OAB = {
|
|
| 45 |
"Custas": "Inclua 'Requer a juntada da guia de custas devidamente recolhida'."
|
| 46 |
}
|
| 47 |
|
| 48 |
-
# Histórico de correções
|
| 49 |
HISTORICO = []
|
|
|
|
| 50 |
|
| 51 |
def preprocess_image_for_ocr(img):
|
| 52 |
try:
|
|
@@ -300,7 +304,8 @@ def gerar_caso_ficticio():
|
|
| 300 |
headers = {"Content-Type": "application/json"}
|
| 301 |
for tentativa in range(CONFIG["max_retry_attempts"]):
|
| 302 |
try:
|
| 303 |
-
|
|
|
|
| 304 |
if response.status_code != 200:
|
| 305 |
response_data = response.json()
|
| 306 |
error_msg = response_data.get("error", {}).get("message", "Erro desconhecido")
|
|
@@ -340,6 +345,12 @@ def corrigir_peticao(caso, peticao_texto=None, peticao_arquivo=None, modo_treina
|
|
| 340 |
peticao_conteudo = peticao_texto or ""
|
| 341 |
if not peticao_conteudo.strip():
|
| 342 |
return "⚠️ Forneça uma petição."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 343 |
prompt = estruturar_prompt_correcao(caso, peticao_conteudo, modo_treinamento)
|
| 344 |
payload = {
|
| 345 |
"contents": [{"parts": [{"text": prompt}]}],
|
|
@@ -348,7 +359,8 @@ def corrigir_peticao(caso, peticao_texto=None, peticao_arquivo=None, modo_treina
|
|
| 348 |
headers = {"Content-Type": "application/json"}
|
| 349 |
for tentativa in range(CONFIG["max_retry_attempts"]):
|
| 350 |
try:
|
| 351 |
-
|
|
|
|
| 352 |
if response.status_code != 200:
|
| 353 |
response_data = response.json()
|
| 354 |
error_msg = response_data.get("error", {}).get("message", "Erro desconhecido")
|
|
@@ -375,6 +387,7 @@ def corrigir_peticao(caso, peticao_texto=None, peticao_arquivo=None, modo_treina
|
|
| 375 |
"peticao": peticao_conteudo,
|
| 376 |
"correcao_completa": correção_completa
|
| 377 |
})
|
|
|
|
| 378 |
return correção_formatada
|
| 379 |
except requests.Timeout:
|
| 380 |
if tentativa < CONFIG["max_retry_attempts"] - 1:
|
|
@@ -546,6 +559,7 @@ def comparar_peticao_melhorada(caso, peticao_texto, correcao):
|
|
| 546 |
def interface_gradio():
|
| 547 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 548 |
gr.Markdown("# 📝 Corretor Avançado de Petições Iniciais (Critérios OAB)")
|
|
|
|
| 549 |
with gr.Row():
|
| 550 |
with gr.Column(scale=1):
|
| 551 |
gr.Markdown("""
|
|
@@ -671,6 +685,5 @@ def interface_gradio():
|
|
| 671 |
|
| 672 |
return demo
|
| 673 |
|
| 674 |
-
# No Hugging Face, não usamos if __name__ == "__main__":
|
| 675 |
app = interface_gradio()
|
| 676 |
app.launch()
|
|
|
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
import requests
|
| 3 |
import os
|
|
|
|
| 14 |
import cv2
|
| 15 |
import numpy as np
|
| 16 |
from datetime import datetime
|
| 17 |
+
from ratelimiter import RateLimiter
|
| 18 |
|
| 19 |
# Carrega variáveis de ambiente de um arquivo .env (opcional para dev local)
|
| 20 |
load_dotenv()
|
|
|
|
| 30 |
# Configurações da aplicação
|
| 31 |
CONFIG = {
|
| 32 |
"max_retry_attempts": 3,
|
| 33 |
+
"retry_delay": 10, # Aumentado para 10 segundos para respeitar limites
|
| 34 |
"timeout": 60,
|
| 35 |
"temperatura": 0.2,
|
| 36 |
"max_tokens": 4096
|
| 37 |
}
|
| 38 |
|
| 39 |
+
# Limite de 60 requisições por minuto (ajuste conforme seu limite real)
|
| 40 |
+
rate_limiter = RateLimiter(max_calls=60, period=60)
|
| 41 |
+
|
| 42 |
# Banco de dicas contextuais
|
| 43 |
DICAS_OAB = {
|
| 44 |
"Endereçamento": "Em relações de consumo, prefira o foro do domicílio do autor (art. 101, I, CDC).",
|
|
|
|
| 48 |
"Custas": "Inclua 'Requer a juntada da guia de custas devidamente recolhida'."
|
| 49 |
}
|
| 50 |
|
| 51 |
+
# Histórico de correções e cache
|
| 52 |
HISTORICO = []
|
| 53 |
+
CORRECAO_CACHE = {}
|
| 54 |
|
| 55 |
def preprocess_image_for_ocr(img):
|
| 56 |
try:
|
|
|
|
| 304 |
headers = {"Content-Type": "application/json"}
|
| 305 |
for tentativa in range(CONFIG["max_retry_attempts"]):
|
| 306 |
try:
|
| 307 |
+
with rate_limiter:
|
| 308 |
+
response = requests.post(GEMINI_API_URL, headers=headers, data=json.dumps(payload), timeout=CONFIG["timeout"])
|
| 309 |
if response.status_code != 200:
|
| 310 |
response_data = response.json()
|
| 311 |
error_msg = response_data.get("error", {}).get("message", "Erro desconhecido")
|
|
|
|
| 345 |
peticao_conteudo = peticao_texto or ""
|
| 346 |
if not peticao_conteudo.strip():
|
| 347 |
return "⚠️ Forneça uma petição."
|
| 348 |
+
|
| 349 |
+
# Chave única para o cache
|
| 350 |
+
cache_key = f"{caso[:50]}|{peticao_conteudo[:50]}|{modo_treinamento}"
|
| 351 |
+
if cache_key in CORRECAO_CACHE:
|
| 352 |
+
return CORRECAO_CACHE[cache_key]
|
| 353 |
+
|
| 354 |
prompt = estruturar_prompt_correcao(caso, peticao_conteudo, modo_treinamento)
|
| 355 |
payload = {
|
| 356 |
"contents": [{"parts": [{"text": prompt}]}],
|
|
|
|
| 359 |
headers = {"Content-Type": "application/json"}
|
| 360 |
for tentativa in range(CONFIG["max_retry_attempts"]):
|
| 361 |
try:
|
| 362 |
+
with rate_limiter:
|
| 363 |
+
response = requests.post(GEMINI_API_URL, headers=headers, data=json.dumps(payload), timeout=CONFIG["timeout"])
|
| 364 |
if response.status_code != 200:
|
| 365 |
response_data = response.json()
|
| 366 |
error_msg = response_data.get("error", {}).get("message", "Erro desconhecido")
|
|
|
|
| 387 |
"peticao": peticao_conteudo,
|
| 388 |
"correcao_completa": correção_completa
|
| 389 |
})
|
| 390 |
+
CORRECAO_CACHE[cache_key] = correção_formatada # Armazena no cache
|
| 391 |
return correção_formatada
|
| 392 |
except requests.Timeout:
|
| 393 |
if tentativa < CONFIG["max_retry_attempts"] - 1:
|
|
|
|
| 559 |
def interface_gradio():
|
| 560 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 561 |
gr.Markdown("# 📝 Corretor Avançado de Petições Iniciais (Critérios OAB)")
|
| 562 |
+
gr.Markdown("⚠️ Nota: Devido a limites de cota da API, pode haver atrasos ou erros se muitas requisições forem feitas rapidamente.")
|
| 563 |
with gr.Row():
|
| 564 |
with gr.Column(scale=1):
|
| 565 |
gr.Markdown("""
|
|
|
|
| 685 |
|
| 686 |
return demo
|
| 687 |
|
|
|
|
| 688 |
app = interface_gradio()
|
| 689 |
app.launch()
|