File size: 3,289 Bytes
10e9b7d
 
eccf8e4
3c4371f
d01d8ee
 
10e9b7d
e80aab9
3db6293
e80aab9
31243f4
 
d01d8ee
 
71d5963
 
 
 
d01d8ee
 
71d5963
d01d8ee
4021bf3
71d5963
 
d01d8ee
 
 
71d5963
d01d8ee
 
3c4371f
71d5963
 
7e4a06b
71d5963
7e4a06b
7d65c66
3c4371f
7e4a06b
31243f4
 
e80aab9
31243f4
 
 
 
71d5963
36ed51a
3c4371f
eccf8e4
31243f4
 
7d65c66
71d5963
e80aab9
7d65c66
71d5963
 
31243f4
 
 
 
7d65c66
 
 
31243f4
71d5963
e80aab9
71d5963
e80aab9
7d65c66
e80aab9
71d5963
7d65c66
71d5963
e80aab9
71d5963
e80aab9
 
d01d8ee
7e4a06b
31243f4
71d5963
 
e80aab9
31243f4
 
 
e80aab9
 
 
71d5963
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
import os
import gradio as gr
import requests
import pandas as pd
# 這裡只導入最基本的組件,避開 HfApiModel 導入錯誤
from smolagents import CodeAgent, DuckDuckGoSearchTool

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

class BasicAgent:
    def __init__(self):
        # 使用字串定義模型,讓 smolagents 內部去處理載入,避開導入報錯
        self.model_id = "Qwen/Qwen2.5-Coder-32B-Instruct"
        search_tool = DuckDuckGoSearchTool()
        
        self.agent = CodeAgent(
            tools=[search_tool],
            model=self.model_id, # 直接傳入模型 ID 字串
            add_base_tools=True,
        )
        print("Agent initialized successfully.")

    def __call__(self, question: str) -> str:
        try:
            # 執行 Agent 並確保回傳結果是字串
            result = self.agent.run(question)
            return str(result)
        except Exception as e:
            print(f"Error: {e}")
            return "I am sorry, I cannot answer this right now."

def run_and_submit_all(profile: gr.OAuthProfile | None):
    space_id = os.getenv("SPACE_ID")
    if profile:
        username = f"{profile.username}"
    else:
        return "Please Login to Hugging Face with the button.", None

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

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

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

    try:
        response = requests.get(questions_url, timeout=15)
        questions_data = response.json()
    except Exception as e:
        return f"Error fetching questions: {e}", None

    answers_payload = []
    results_log = []

    for item in questions_data:
        task_id = item.get("task_id")
        question_text = item.get("question")
        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:
            results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"Error: {e}"})

    submission_data = {"username": username, "agent_code": agent_code, "answers": answers_payload}
    try:
        response = requests.post(submit_url, json=submission_data, timeout=60)
        result_data = response.json()
        status_msg = f"Score: {result_data.get('score')}% ({result_data.get('correct_count')}/{result_data.get('total_attempted')} correct)"
    except Exception as e:
        status_msg = f"Submission Failed: {e}"

    return status_msg, pd.DataFrame(results_log)

with gr.Blocks() as demo:
    gr.Markdown("# Unit 4 Final Project: AI Agent")
    gr.LoginButton()
    run_button = gr.Button("Run Evaluation & Submit All Answers")
    status_output = gr.Textbox(label="Result")
    results_table = gr.DataFrame(label="Details")

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

if __name__ == "__main__":
    demo.launch()