danlvr's picture
Update app.py
db8ff9e verified
Raw
History Blame Contribute Delete
8.16 kB
import os
import gradio as gr
import requests
import pandas as pd
import time
import traceback
from smolagents import CodeAgent, OpenAIServerModel, DuckDuckGoSearchTool, VisitWebpageTool
# --- Constantes ---
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
# --- Definição do Agente com OpenAI ---
class BasicAgent:
def __init__(self):
print("Inicializando CodeAgent de produção com OpenAI (GPT-4o)...")
openai_key = os.environ.get("OPENAI_API_KEY")
if not openai_key:
raise ValueError("⚠️ OPENAI_API_KEY não encontrada! Verifique os Secrets do Space.")
# Inicializa o modelo GPT-4o
# Nota: Se quiser economizar créditos, você pode trocar "gpt-4o" por "gpt-4o-mini"
self.model = OpenAIServerModel(
model_id="gpt-4o",
api_key=openai_key
)
self.agent = CodeAgent(
tools=[DuckDuckGoSearchTool(), VisitWebpageTool()],
model=self.model,
add_base_tools=True,
max_steps=12
)
print("Agente inicializado com sucesso usando OpenAI.")
def __call__(self, question: str) -> str:
print(f"Agente recebeu a pergunta (primeiros 50 chars): {question[:50]}...")
strict_prompt = f"""
You are an elite, highly precise automated evaluation solver. Your goal is to provide the exact answer requested.
Task Question:
{question}
CRITICAL TOOL DIRECTIVES:
- If the question mentions an attached file (like a CSV, Excel, or Python file), YOU MUST use your python code tool to open, read, and analyze that file. It is saved in your current local directory. Do not guess.
- If you need to extract information from a specific URL, use the visit_webpage tool.
- IF YOU GET A "403 FORBIDDEN" ERROR from visit_webpage, DO NOT GIVE UP. Instead, use your python code tool to write a script using the `requests` and `bs4` libraries to fetch the URL. You MUST include a standard browser header like `headers={{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}}` in your requests.get() call to bypass bot protection.
- If you need general knowledge or current events, use the DuckDuckGo search tool.
CRITICAL OUTPUT DIRECTIVES:
1. Return ONLY the absolute final answer value string (e.g., a specific number, name, or word).
2. Do NOT write conversational transitions like "The answer is...", "Therefore...", or markdown blocks.
3. Do NOT include the phrase "FINAL ANSWER".
4. Do not output your internal reasoning as the final string.
"""
try:
raw_result = self.agent.run(strict_prompt)
cleaned_answer = str(raw_result).strip()
print(f"Agente gerou a resposta estruturada: {cleaned_answer}")
return cleaned_answer
except Exception as e:
print("Falha na execução dentro do loop do agente:")
traceback.print_exc()
return "ERROR_PROCESSING_TASK"
def run_and_submit_all(profile: gr.OAuthProfile | None):
space_id = os.getenv("SPACE_ID")
if profile:
username = f"{profile.username}"
print(f"Usuário logado: {username}")
else:
print("Usuário não logado.")
return "Por favor, faça login no Hugging Face com o botão abaixo.", None
api_url = DEFAULT_API_URL
questions_url = f"{api_url}/questions"
submit_url = f"{api_url}/submit"
try:
agent = BasicAgent()
except Exception as e:
print(f"Erro ao instanciar o agente: {e}")
return f"Erro inicializando o agente: {e}", None
agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
print(f"Buscando perguntas de: {questions_url}")
try:
response = requests.get(questions_url, timeout=15)
response.raise_for_status()
questions_data = response.json()
if not questions_data:
return "Lista de perguntas vazia ou em formato inválido.", None
print(f"Buscou {len(questions_data)} perguntas.")
except Exception as e:
return f"Erro buscando perguntas: {e}", None
results_log = []
answers_payload = []
print(f"Rodando agente em {len(questions_data)} perguntas...")
for item in questions_data:
task_id = item.get("task_id")
question_text = item.get("question")
if not task_id or question_text is None:
continue
try:
file_res = requests.get(f"{api_url}/files/{task_id}", stream=True, timeout=10)
if file_res.status_code == 200:
cd_header = file_res.headers.get("content-disposition", "")
if "filename=" in cd_header:
filename = cd_header.split("filename=")[1].strip('"')
else:
filename = f"evaluation_file_{task_id}"
with open(filename, "wb") as local_file:
local_file.write(file_res.content)
question_text += f"\n\n[System Note: A structural file associated with this problem was successfully saved to your environment at: '{filename}']. Use python code tools to open and read it."
print(f"Arquivo '{filename}' salvo com sucesso para a Tarefa {task_id}")
except Exception as fe:
print(f"Passo de verificação de arquivo pulado ou indisponível para Tarefa {task_id}: {fe}")
try:
submitted_answer = agent(question_text)
answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
results_log.append({"Task ID": task_id, "Question": question_text[:120] + "...", "Submitted Answer": submitted_answer})
except Exception as e:
print(f"FALHOU NA TAREFA {task_id}. Motivo:")
traceback.print_exc()
results_log.append({"Task ID": task_id, "Question": question_text[:120] + "...", "Submitted Answer": f"AGENT ERROR: {e}"})
# Uma pausa leve (10s) apenas por boas práticas de rede
print("Pausando brevemente entre as perguntas...")
time.sleep(10)
if not answers_payload:
return "Agente não produziu nenhuma resposta para enviar.", pd.DataFrame(results_log)
submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
print(f"Enviando {len(answers_payload)} respostas para: {submit_url}")
try:
response = requests.post(submit_url, json=submission_data, timeout=60)
response.raise_for_status()
result_data = response.json()
final_status = (
f"Submissão Bem Sucedida!\n"
f"Usuário: {result_data.get('username')}\n"
f"Pontuação Geral: {result_data.get('score', 'N/A')}% "
f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} corretas)\n"
f"Mensagem: {result_data.get('message', 'Nenhuma mensagem recebida.')}"
)
return final_status, pd.DataFrame(results_log)
except Exception as e:
status_message = f"Processamento da Submissão Interrompido: {e}"
return status_message, pd.DataFrame(results_log)
with gr.Blocks() as demo:
gr.Markdown("# Runner de Avaliação do Agente (Powered by GPT-4o)")
gr.Markdown(
"""
**Instruções:**
1. Faça login na sua conta do Hugging Face usando o botão abaixo.
2. Clique em 'Run Evaluation & Submit All Answers' para iniciar a execução.
"""
)
gr.LoginButton()
run_button = gr.Button("Run Evaluation & Submit All Answers")
status_output = gr.Textbox(label="Status de Execução / Resultado da Submissão", lines=5, interactive=False)
results_table = gr.DataFrame(label="Perguntas e Respostas do Agente", wrap=True)
run_button.click(
fn=run_and_submit_all,
outputs=[status_output, results_table]
)
if __name__ == "__main__":
demo.launch(debug=True)