File size: 7,205 Bytes
962c042 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
import os
import gradio as gr
import requests
import json
import pandas as pd
from dotenv import load_dotenv
from agent import AgentDeedee
# Desabilita a autenticação OAuth para testes locais
os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
# Carrega variáveis de ambiente
load_dotenv()
# --- Constantes ---
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:
# Remove o prefixo "FINAL ANSWER: " se existir
model_answer = resposta.get("model_answer", "")
if model_answer.startswith("FINAL ANSWER: "):
model_answer = model_answer[14:] # Remove os primeiros 14 caracteres
# Cria uma entrada no formato correto
entrada = {
"task_id": resposta["task_id"],
"model_answer": model_answer
# Opcionalmente: "reasoning_trace": "Processo de raciocínio para esta resposta"
}
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:
# Inicializa o agente
agente = AgentDeedee()
# Processa a pergunta
resposta = agente(pergunta)
# Remove o prefixo "FINAL ANSWER: " se existir
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}")
# Obtém o SPACE_ID para enviar o link para o código
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"
# Carrega as respostas do arquivo answers.jsonl
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())
# Garantir que não há prefixo "FINAL ANSWER: " na resposta
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
# Envia Respostas
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)
# --- Constroi Interface Gradio usando Blocks ---
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'
"""
)
# Interface para teste local
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")
# Função para testar o agente localmente
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
)
# Interface para envio completo (apenas para ambiente Hugging Face Space)
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
""")
# Botão desabilitado para ambiente local
gr.Button("Executar Avaliação (Desabilitado em ambiente local)", interactive=False)
if __name__ == "__main__":
demo.launch()
|