assistentjuri / app.py
Danielfonseca1212's picture
Update app.py
bc0f945 verified
# app.py
import gradio as gr
import os
import httpx
from huggingface_hub import list_models
from datasets import load_dataset
HF_TOKEN = os.getenv("HF_TOKEN")
def search_models(query="legal", language="pt", limit=5):
try:
results = list(
list_models(
search=query,
language=language or None,
sort="downloads",
direction=-1,
limit=int(limit),
token=HF_TOKEN,
)
)
output = ""
for m in results[:int(limit)]:
output += f"**{m.modelId}**\n"
output += f"- Task: {m.pipeline_tag}\n"
output += f"- Downloads: {m.downloads:,}\n"
output += f"- URL: https://huggingface.co/{m.modelId}\n\n"
return output if output else "Nenhum modelo encontrado."
except Exception as e:
return f"Erro: {str(e)}"
def analyze_text(text, task="summarization"):
try:
models = {
"summarization": "facebook/bart-large-cnn",
"text-classification": "nlpaueb/legal-bert-base-uncased",
}
model_id = models.get(task, "facebook/bart-large-cnn")
url = f"https://api-inference.huggingface.co/models/{model_id}"
headers = {"Content-Type": "application/json"}
if HF_TOKEN:
headers["Authorization"] = f"Bearer {HF_TOKEN}"
payload = {"inputs": text[:512]}
with httpx.Client(timeout=60.0) as client:
resp = client.post(url, headers=headers, json=payload)
if resp.status_code == 200:
return str(resp.json())
else:
return f"Erro HTTP {resp.status_code}: {resp.text[:200]}"
except Exception as e:
return f"Erro: {str(e)}"
def explore_dataset(dataset_id, n_samples=3):
try:
ds = load_dataset(
dataset_id,
split=f"train[:{n_samples}]",
token=HF_TOKEN,
trust_remote_code=False,
)
output = f"**Dataset:** {dataset_id}\n\n"
output += f"**Colunas:** {', '.join(ds.column_names)}\n\n"
for i, sample in enumerate(ds.to_list()[:int(n_samples)]):
output += f"--- Amostra {i+1} ---\n"
for key, val in sample.items():
if isinstance(val, str) and len(val) > 300:
val = val[:300] + "..."
output += f"{key}: {val}\n"
output += "\n"
return output
except Exception as e:
return f"Erro: {str(e)}"
with gr.Blocks(title="LEX - Assistente Jurídico", theme=gr.themes.Soft()) as demo:
gr.Markdown("# ⚖️ LEX - Assistente Jurídico MCP")
gr.Markdown("Powered by Hugging Face Hub + FastMCP")
with gr.Tab("🔍 Buscar Modelos"):
with gr.Row():
with gr.Column():
model_query = gr.Textbox(label="Query", value="legal")
model_lang = gr.Textbox(label="Idioma", value="pt")
model_limit = gr.Slider(1, 20, value=5, step=1, label="Limite")
model_btn = gr.Button("Buscar", variant="primary")
with gr.Column():
model_output = gr.Textbox(label="Resultados", lines=15, interactive=False)
model_btn.click(fn=search_models, inputs=[model_query, model_lang, model_limit], outputs=model_output)
with gr.Tab("📝 Analisar Texto"):
with gr.Row():
with gr.Column():
text_input = gr.Textbox(label="Texto Jurídico", lines=5)
task_type = gr.Dropdown(
choices=["summarization", "text-classification"],
value="summarization",
label="Tarefa"
)
analyze_btn = gr.Button("Analisar", variant="primary")
with gr.Column():
analyze_output = gr.Textbox(label="Resultado", lines=10, interactive=False)
analyze_btn.click(fn=analyze_text, inputs=[text_input, task_type], outputs=analyze_output)
with gr.Tab("📊 Explorar Dataset"):
with gr.Row():
with gr.Column():
dataset_input = gr.Textbox(label="Dataset ID", value="joelniklaus/brazilian_court_decisions")
sample_count = gr.Slider(1, 10, value=3, step=1, label="Amostras")
dataset_btn = gr.Button("Explorar", variant="primary")
with gr.Column():
dataset_output = gr.Textbox(label="Dataset Info", lines=15, interactive=False)
dataset_btn.click(fn=explore_dataset, inputs=[dataset_input, sample_count], outputs=dataset_output)
if __name__ == "__main__":
# ✅ CORREÇÃO: Configuração correta para HF Spaces
demo.launch(
server_name="0.0.0.0",
server_port=int(os.getenv("PORT", 7860)),
share=False,
show_error=True
)