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)