|
|
import os |
|
|
import gradio as gr |
|
|
import requests |
|
|
import json |
|
|
import pandas as pd |
|
|
from dotenv import load_dotenv |
|
|
from agent import AgentDeedee |
|
|
|
|
|
|
|
|
os.environ["GRADIO_ANALYTICS_ENABLED"] = "False" |
|
|
|
|
|
|
|
|
load_dotenv() |
|
|
|
|
|
|
|
|
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space" |
|
|
OUTPUT_JSONL = "answers.jsonl" |
|
|
|
|
|
def carregar_prompt_sistema(): |
|
|
"""Carrega o prompt do sistema a partir do arquivo""" |
|
|
try: |
|
|
with open("system_prompt.txt", "r", encoding="utf-8") as f: |
|
|
return f.read() |
|
|
except Exception as e: |
|
|
print(f"Erro ao carregar prompt do sistema: {e}") |
|
|
return "Você é a Deedee, um assistente especializado em responder perguntas." |
|
|
|
|
|
def salvar_jsonl(respostas_payload): |
|
|
"""Salva as respostas no formato JSONL exatamente como esperado pelo sistema de avaliação""" |
|
|
with open(OUTPUT_JSONL, 'w', encoding='utf-8') as f: |
|
|
for resposta in respostas_payload: |
|
|
|
|
|
model_answer = resposta.get("model_answer", "") |
|
|
if model_answer.startswith("FINAL ANSWER: "): |
|
|
model_answer = model_answer[14:] |
|
|
|
|
|
|
|
|
entrada = { |
|
|
"task_id": resposta["task_id"], |
|
|
"model_answer": model_answer |
|
|
|
|
|
} |
|
|
json.dump(entrada, f, ensure_ascii=False) |
|
|
f.write('\n') |
|
|
print(f"Respostas salvas em {OUTPUT_JSONL}") |
|
|
|
|
|
def processar_pergunta(pergunta, task_id): |
|
|
""" |
|
|
Processa uma pergunta usando o agente Deedee e retorna a resposta |
|
|
""" |
|
|
try: |
|
|
|
|
|
agente = AgentDeedee() |
|
|
|
|
|
|
|
|
resposta = agente(pergunta) |
|
|
|
|
|
|
|
|
if resposta.startswith("FINAL ANSWER: "): |
|
|
resposta = resposta[14:] |
|
|
|
|
|
return { |
|
|
"task_id": task_id, |
|
|
"model_answer": resposta |
|
|
} |
|
|
except Exception as e: |
|
|
print(f"Erro ao processar pergunta {task_id}: {e}") |
|
|
return { |
|
|
"task_id": task_id, |
|
|
"model_answer": "Erro ao processar a pergunta" |
|
|
} |
|
|
|
|
|
def executar_enviar_tudo(profile: gr.OAuthProfile | None): |
|
|
""" |
|
|
Carrega as respostas do arquivo answers.jsonl e as envia para avaliação. |
|
|
""" |
|
|
if not profile: |
|
|
print("Usuário não está logado.") |
|
|
return "Por favor, faça login no Hugging Face com o botão.", None |
|
|
|
|
|
nome_usuario = profile.username.strip() |
|
|
print(f"Usuário logado: {nome_usuario}") |
|
|
|
|
|
|
|
|
space_id = os.getenv("SPACE_ID", f"{nome_usuario}/Final_Assignment_Template") |
|
|
codigo_agente = f"https://huggingface.co/spaces/{space_id}/tree/main" |
|
|
print(f"Usando URL do código do agente: {codigo_agente}") |
|
|
|
|
|
api_url = DEFAULT_API_URL |
|
|
url_envio = f"{api_url}/submit" |
|
|
|
|
|
|
|
|
try: |
|
|
respostas_payload = [] |
|
|
registro_resultados = [] |
|
|
|
|
|
with open(OUTPUT_JSONL, 'r', encoding='utf-8') as f: |
|
|
for line in f: |
|
|
if line.strip(): |
|
|
entry = json.loads(line.strip()) |
|
|
|
|
|
|
|
|
model_answer = entry.get("model_answer", "") |
|
|
if model_answer.startswith("FINAL ANSWER: "): |
|
|
model_answer = model_answer[14:] |
|
|
|
|
|
entry["model_answer"] = model_answer |
|
|
respostas_payload.append(entry) |
|
|
registro_resultados.append({ |
|
|
"ID da Tarefa": entry["task_id"], |
|
|
"Resposta Enviada": entry["model_answer"] |
|
|
}) |
|
|
|
|
|
print(f"Carregadas {len(respostas_payload)} respostas do arquivo {OUTPUT_JSONL}") |
|
|
|
|
|
if not respostas_payload: |
|
|
return f"Erro: O arquivo {OUTPUT_JSONL} está vazio ou não contém respostas válidas.", None |
|
|
|
|
|
except Exception as e: |
|
|
print(f"Erro ao carregar respostas do arquivo {OUTPUT_JSONL}: {e}") |
|
|
return f"Erro ao carregar respostas: {e}", None |
|
|
|
|
|
|
|
|
try: |
|
|
dados_envio = { |
|
|
"username": nome_usuario, |
|
|
"agent_code": codigo_agente, |
|
|
"answers": respostas_payload |
|
|
} |
|
|
|
|
|
print(f"Enviando {len(respostas_payload)} respostas...") |
|
|
resposta = requests.post(url_envio, json=dados_envio, timeout=120) |
|
|
resposta.raise_for_status() |
|
|
|
|
|
resultado = resposta.json() |
|
|
status = f"Envio bem-sucedido!\nUsuário: {nome_usuario}\nPontuação: {resultado.get('score', 'N/A')}%" |
|
|
|
|
|
return status, pd.DataFrame(registro_resultados) |
|
|
|
|
|
except Exception as e: |
|
|
msg_erro = f"Falha no envio: {str(e)}" |
|
|
if hasattr(e, 'response') and hasattr(e.response, 'text'): |
|
|
msg_erro += f"\nResposta: {e.response.text}" |
|
|
|
|
|
print(msg_erro) |
|
|
return msg_erro, pd.DataFrame(registro_resultados) |
|
|
|
|
|
|
|
|
with gr.Blocks() as demo: |
|
|
gr.Markdown("# Deedee - Agente de Avaliação") |
|
|
gr.Markdown( |
|
|
""" |
|
|
**Instruções:** |
|
|
1. Configure sua chave API do Together AI no arquivo .env |
|
|
2. Clique em 'Testar Agente' para testar o agente com uma pergunta de exemplo |
|
|
3. Para envio completo, faça login com sua conta Hugging Face e clique em 'Executar Avaliação' |
|
|
""" |
|
|
) |
|
|
|
|
|
|
|
|
with gr.Tab("Teste Local"): |
|
|
pergunta_teste = gr.Textbox(label="Pergunta de teste", lines=2, placeholder="Digite uma pergunta para testar o agente...") |
|
|
resposta_teste = gr.Textbox(label="Resposta do agente", lines=5, interactive=False) |
|
|
botao_teste = gr.Button("Testar Agente") |
|
|
|
|
|
|
|
|
def testar_agente(pergunta): |
|
|
try: |
|
|
agente = AgentDeedee() |
|
|
resposta = agente(pergunta) |
|
|
return resposta |
|
|
except Exception as e: |
|
|
return f"Erro ao processar pergunta: {str(e)}" |
|
|
|
|
|
botao_teste.click( |
|
|
fn=testar_agente, |
|
|
inputs=pergunta_teste, |
|
|
outputs=resposta_teste |
|
|
) |
|
|
|
|
|
|
|
|
with gr.Tab("Envio para Avaliação"): |
|
|
gr.Markdown(""" |
|
|
**Nota:** Esta funcionalidade está disponível apenas quando executada em um ambiente Hugging Face Space. |
|
|
|
|
|
Para enviar respostas para avaliação: |
|
|
1. Faça o upload deste código para um Space no Hugging Face |
|
|
2. Configure as variáveis de ambiente necessárias |
|
|
3. Execute o aplicativo no ambiente do Space |
|
|
""") |
|
|
|
|
|
|
|
|
gr.Button("Executar Avaliação (Desabilitado em ambiente local)", interactive=False) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.launch() |
|
|
|