File size: 4,747 Bytes
75849d9
 
 
 
 
 
 
 
 
 
a55ef75
75849d9
 
a55ef75
6a741f5
75849d9
a55ef75
 
 
 
 
 
 
 
 
 
6a741f5
 
 
75849d9
 
bcf2762
a55ef75
 
 
 
 
085f277
bcf2762
 
 
 
52370d5
bcf2762
 
 
085f277
a55ef75
 
 
 
 
 
75849d9
a55ef75
75849d9
a55ef75
 
75849d9
a55ef75
 
75849d9
a55ef75
75849d9
a55ef75
 
 
 
 
 
 
75849d9
a55ef75
 
75849d9
a55ef75
 
 
 
 
 
 
 
75849d9
a55ef75
 
 
75849d9
a55ef75
 
75849d9
a55ef75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92d2175
a55ef75
 
 
 
 
 
75849d9
bcf2762
 
a55ef75
92d2175
 
bcf2762
 
a55ef75
 
 
75849d9
a55ef75
 
 
 
75849d9
 
a55ef75
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
"""
GRADIO INTERFACE FOR LANGGRAPH AI AGENT

Features:
- Interactive Q&A with AI agent
- Support for task_id and file uploads
- Real-time processing with Qwen3-8B
- Beautiful UI với LangGraph workflow visualization
"""

import os
import gradio as gr
import requests
import pandas as pd
from agent import process_question

# --- Constants ---
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"

# --- Basic Agent Definition ---
# ----- THIS IS WHERE YOU CAN BUILD WHAT YOU WANT ------
class BasicAgent:
    def __init__(self):
        print("BasicAgent initialized.")
    def __call__(self, question: str) -> str:
        print(f"Agent received question (first 50 chars): {question[:50]}...")
        answer = process_question(question)
        print(f"Agent returning answer: {answer}")
        return answer


def run_and_submit_all(profile: gr.OAuthProfile | None = None):
    """
    Fetches all questions, runs the BasicAgent on them, submits all answers,
    and displays the results.
    """
    # Determine HF Space Runtime URL and Repo URL
    space_id = os.getenv("SPACE_ID", "unknown_space")
    
    if profile:
        username = f"{profile.username}"
        print(f"User logged in: {username}")
    else:
        print("User not logged in, using anonymous.")
        username = "anonymous"

    print(f"Running as user: {username}")

    api_url = DEFAULT_API_URL
    questions_url = f"{api_url}/questions"
    submit_url = f"{api_url}/submit"

    # Instantiate Agent
    try:
        agent = BasicAgent()
    except Exception as e:
        print(f"Error instantiating agent: {e}")
        return f"Error initializing agent: {e}", None

    agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
    print(agent_code)

    # Fetch Questions
    try:
        response = requests.get(questions_url, timeout=15)
        response.raise_for_status()
        questions_data = response.json()
        if not questions_data:
            print("Fetched questions list is empty.")
            return "Fetched questions list is empty or invalid.", None
        print(f"Fetched {len(questions_data)} questions.")
    except Exception as e:
        print(f"Error fetching questions: {e}")
        return f"Error fetching questions: {e}", None

    # Run Agent on each question
    results_log = []
    answers_payload = []
    for item in questions_data:
        task_id = item.get("task_id")
        question_text = item.get("question")
        if not task_id or question_text is None:
            continue
        try:
            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})
        except Exception as e:
            print(f"Error on task {task_id}: {e}")
            results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"ERROR: {e}"})

    if not answers_payload:
        print("Agent did not produce any answers to submit.")
        return "No answers to submit.", pd.DataFrame(results_log)

    # Submit answers
    submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
    try:
        response = requests.post(submit_url, json=submission_data, timeout=60)
        response.raise_for_status()
        result_data = response.json()
        final_status = (
            f"Submission Successful!\n"
            f"User: {result_data.get('username')}\n"
            f"Score: {result_data.get('score', 'N/A')}%\n"
            f"Message: {result_data.get('message', '')}"
        )
        return final_status, pd.DataFrame(results_log)
    except Exception as e:
        print(f"Submission failed: {e}")
        return f"Submission failed: {e}", pd.DataFrame(results_log)
            
# --- Build Gradio Interface ---
with gr.Blocks() as demo:
    gr.Markdown("# Basic Agent Evaluation Runner")
    gr.Markdown(
        """
        **Instructions:**

        1. Login to Hugging Face using the button below (required for submission)
        2. Click 'Run Evaluation & Submit All Answers' to fetch, run the agent, and submit.
        """
                    )
                
    gr.LoginButton()
    
    run_button = gr.Button("Run Evaluation & Submit All Answers")
    status_output = gr.Textbox(label="Run Status / Submission Result", lines=5, interactive=False)
    results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)

    run_button.click(
        fn=run_and_submit_all,
        outputs=[status_output, results_table]
    )

if __name__ == "__main__":
    demo.launch(debug=True, share=False)