| 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() |
|
|