File size: 9,758 Bytes
10e9b7d fc6592e 30247ff 3c4371f 31d2ee4 ba4670d 31d2ee4 44661a1 ba4670d 3db6293 e80aab9 a02aaeb ba4670d 30247ff ba4670d 30247ff ba4670d 31d2ee4 30247ff 31243f4 44661a1 31243f4 ba4670d eccf8e4 ba4670d 30247ff 7559f72 ba4670d 30247ff ba4670d 30247ff ba4670d 30247ff ba4670d 30247ff fc6592e 30247ff ba4670d 31243f4 30247ff ba4670d 30247ff 31243f4 ba4670d 30247ff e9f897a ba4670d 31243f4 ba4670d 31d2ee4 ba4670d 30247ff ba4670d 30247ff e9f897a ba4670d 30247ff ba4670d e80aab9 31d2ee4 30247ff ba4670d e80aab9 ba4670d 30247ff ba4670d 30247ff ba4670d 30247ff ba4670d 30247ff ba4670d 30247ff ba4670d 30247ff 7d65c66 ba4670d 30247ff 31d2ee4 30247ff ba4670d 30247ff 31d2ee4 30247ff 7e4a06b ba4670d 1367953 30247ff e9f897a 31d2ee4 ba4670d e9f897a e80aab9 ba4670d 30247ff ba4670d 30247ff ba4670d 30247ff ba4670d 30247ff ba4670d 30247ff ba4670d 31d2ee4 e9f897a 30247ff 31d2ee4 |
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 198 199 200 201 202 |
import os
import gradio as gr
import requests
import pandas as pd
# from dotenv import load_dotenv
# load_dotenv()
try:
from agent import GaiaAgent
except ImportError as e:
print(f"ERRORE: agent.py non trovato o errore nell'importazione di GaiaAgent: {e}")
class GaiaAgent:
def __init__(self, model_name="o4-mini"):
print("Fallback BasicAgent inizializzato perché l'import di GaiaAgent è fallito.")
self.model_name = model_name
def __call__(self, question: str) -> str:
return f"Errore: GaiaAgent (modello: {self.model_name}) non caricato. Questa è una risposta di fallback."
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
def run_and_submit_all(profile: gr.OAuthProfile | None):
space_id = os.getenv("SPACE_ID")
if profile:
username = f"{profile.username}"
print(f"Utente loggato: {username}")
else:
print("Utente non loggato.")
return "Per favore, effettua il login a Hugging Face con il pulsante.", None
# Controlli per le API Keys
openai_key_present = bool(os.getenv("OPENAI_API_KEY"))
tavily_key_present = bool(os.getenv("TAVILY_API_KEY"))
if not openai_key_present:
warning_message_openai = "ATTENZIONE: Il segreto OPENAI_API_KEY non è impostato in questo Space. L'agente probabilmente fallirà."
print(warning_message_openai)
# Potresti voler restituire un errore più severo qui
if not tavily_key_present:
warning_message_tavily = "ATTENZIONE: Il segreto TAVILY_API_KEY non è impostato. La ricerca web con Tavily non funzionerà."
print(warning_message_tavily)
# Potresti voler restituire un errore più severo qui
api_url = DEFAULT_API_URL
questions_url = f"{api_url}/questions"
submit_url = f"{api_url}/submit"
try:
agent = GaiaAgent(model_name="o4-mini")
except Exception as e:
print(f"Errore durante l'istanziazione dell'agente: {e}")
return f"Errore durante l'inizializzazione dell'agente: {e}", None
agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main" if space_id else "Link al codice non disponibile (SPACE_ID non impostato)"
print(f"Link al codice dell'agente: {agent_code}")
print(f"Recupero domande da: {questions_url}")
try:
response = requests.get(questions_url, timeout=30)
response.raise_for_status()
questions_data = response.json()
if not questions_data:
print("La lista delle domande recuperate è vuota.")
return "La lista delle domande recuperate è vuota o in formato non valido.", None
print(f"Recuperate {len(questions_data)} domande.")
except requests.exceptions.RequestException as e:
print(f"Errore durante il recupero delle domande: {e}")
return f"Errore durante il recupero delle domande: {e}", None
except requests.exceptions.JSONDecodeError as e:
print(f"Errore nella decodifica della risposta JSON dall'endpoint delle domande: {e}")
print(f"Testo della risposta (primi 500 caratteri): {response.text[:500]}")
return f"Errore nella decodifica della risposta del server per le domande: {e}", None
except Exception as e:
print(f"Errore imprevisto durante il recupero delle domande: {e}")
return f"Errore imprevisto durante il recupero delle domande: {e}", None
results_log = []
answers_payload = []
print(f"Esecuzione dell'agente su {len(questions_data)} domande...")
for i, item in enumerate(questions_data):
task_id = item.get("task_id")
question_text = item.get("question")
if not task_id or question_text is None:
print(f"Salto l'elemento con task_id o domanda mancante: {item}")
continue
try:
print(f"\nElaborazione Domanda {i+1}/{len(questions_data)} - Task ID: {task_id}, Domanda: {question_text[:100]}...")
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, "Submitted Answer": submitted_answer})
print(f"Task ID: {task_id} - Risposta (primi 100 caratteri): {str(submitted_answer)[:100]}")
except Exception as e:
error_message = f"ERRORE AGENTE sul task {task_id}: {e}"
print(error_message)
answers_payload.append({"task_id": task_id, "submitted_answer": error_message})
results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": error_message})
if not answers_payload:
print("L'agente non ha prodotto alcuna risposta da inviare.")
return "L'agente non ha prodotto alcuna risposta da inviare.", pd.DataFrame(results_log if results_log else [])
submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
status_update = f"Agente terminato. Invio di {len(answers_payload)} risposte per l'utente '{username}'..."
print(status_update)
print(f"Invio di {len(answers_payload)} risposte a: {submit_url}")
try:
response = requests.post(submit_url, json=submission_data, timeout=180)
response.raise_for_status()
result_data = response.json()
final_status = (
f"Invio Riuscito!\n"
f"Utente: {result_data.get('username')}\n"
f"Punteggio Complessivo: {result_data.get('score', 'N/A')}% "
f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} corrette)\n"
f"Messaggio: {result_data.get('message', 'Nessun messaggio ricevuto.')}"
)
print("Invio riuscito.")
results_df = pd.DataFrame(results_log)
return final_status, results_df
except requests.exceptions.HTTPError as e:
error_detail = f"Il server ha risposto con stato {e.response.status_code}."
try:
error_json = e.response.json()
error_detail += f" Dettaglio: {error_json.get('detail', e.response.text)}"
except requests.exceptions.JSONDecodeError:
error_detail += f" Risposta: {e.response.text[:500]}"
status_message = f"Invio Fallito: {error_detail}"
print(status_message)
results_df = pd.DataFrame(results_log)
return status_message, results_df
except requests.exceptions.Timeout:
status_message = "Invio Fallito: La richiesta è scaduta (timeout)."
print(status_message)
results_df = pd.DataFrame(results_log)
return status_message, results_df
except requests.exceptions.RequestException as e:
status_message = f"Invio Fallito: Errore di rete - {e}"
print(status_message)
results_df = pd.DataFrame(results_log)
return status_message, results_df
except Exception as e:
status_message = f"Errore imprevisto durante l'invio: {e}"
print(status_message)
results_df = pd.DataFrame(results_log)
return status_message, results_df
with gr.Blocks(css="footer {visibility: hidden}") as demo:
gr.Markdown("# GAIA Level 1 Agent (con Tavily) - Evaluation Runner")
gr.Markdown(
"""
**Istruzioni:**
1. Questo Space implementa un `GaiaAgent` che utilizza Wikipedia, **Tavily Search**, Arxiv e un interprete di codice Python.
2. Assicurati che `OPENAI_API_KEY` e `TAVILY_API_KEY` siano impostate come **Secrets** nelle impostazioni del tuo Hugging Face Space.
3. Effettua il login al tuo account Hugging Face usando il pulsante qui sotto.
4. Clicca su 'Esegui Valutazione & Invia Tutte le Risposte' per avviare il processo.
"""
)
gr.LoginButton()
run_button = gr.Button("Esegui Valutazione & Invia Tutte le Risposte")
status_output = gr.Textbox(label="Stato Esecuzione / Risultato Invio", lines=6, interactive=False)
results_table = gr.DataFrame(label="Domande e Risposte dell'Agente", wrap=True)
run_button.click(
fn=run_and_submit_all,
inputs=None,
outputs=[status_output, results_table],
api_name="run_evaluation"
)
if __name__ == "__main__":
print("\n" + "-"*30 + " Avvio App " + "-"*30)
space_host_startup = os.getenv("SPACE_HOST")
space_id_startup = os.getenv("SPACE_ID")
if space_host_startup:
print(f"✅ SPACE_HOST trovato: {space_host_startup}")
print(f" L'URL di runtime dovrebbe essere: https://{space_host_startup}.hf.space")
else:
print("ℹ️ Variabile d'ambiente SPACE_HOST non trovata (esecuzione locale?).")
if space_id_startup:
print(f"✅ SPACE_ID trovato: {space_id_startup}")
print(f" URL del Repo: https://huggingface.co/spaces/{space_id_startup}")
print(f" URL dell'albero del Repo: https://huggingface.co/spaces/{space_id_startup}/tree/main")
else:
print("ℹ️ Variabile d'ambiente SPACE_ID non trovata (esecuzione locale?). L'URL del Repo non può essere determinato.")
if not os.getenv("OPENAI_API_KEY"):
print("\n⚠️ ATTENZIONE: La variabile d'ambiente OPENAI_API_KEY NON È IMPOSTATA.")
if not os.getenv("TAVILY_API_KEY"):
print("\n⚠️ ATTENZIONE: La variabile d'ambiente TAVILY_API_KEY NON È IMPOSTATA.")
if not os.getenv("OPENAI_API_KEY") or not os.getenv("TAVILY_API_KEY"):
print("Per favore, imposta le API keys mancanti come Secrets nelle impostazioni del tuo Hugging Face Space o nel tuo ambiente locale.\n")
print("-"*(60 + len(" Avvio App ")) + "\n")
print("Avvio Interfaccia Gradio per Valutazione Agente GAIA (con Tavily)...")
demo.launch(share=False) |