File size: 4,467 Bytes
36351d1
051c1ef
bd9a51c
051c1ef
 
 
1d1bae6
bd9a51c
051c1ef
 
 
36351d1
051c1ef
 
36351d1
051c1ef
 
 
 
36351d1
 
 
 
 
051c1ef
5d6dd93
e4bdf70
051c1ef
5d6dd93
051c1ef
 
 
 
 
 
 
 
 
 
 
 
 
5d6dd93
051c1ef
 
 
 
 
 
 
e4bdf70
051c1ef
 
 
e4bdf70
051c1ef
 
 
 
 
 
 
 
e4bdf70
 
 
 
 
051c1ef
e4bdf70
 
 
 
 
051c1ef
 
 
 
e4bdf70
 
 
 
 
051c1ef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e4bdf70
051c1ef
e4bdf70
bd9a51c
051c1ef
 
 
 
e4bdf70
 
 
051c1ef
 
 
 
 
 
 
 
 
 
 
 
 
 
e4bdf70
5d6dd93
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
""" Basic Agent Evaluation Runner """
import os
import gradio as gr
import requests
import pandas as pd
from langchain_core.messages import HumanMessage
from agent import ninu  

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

class BasicAgent:
    """Agent class using LangGraph compiled graph."""
    def __init__(self):
        print("BasicAgent initialized.")
        self.graph = ninu  # ما تنساش: ما تعملش () هنا لأن `ninu` هو كائن compiled

    def __call__(self, question: str) -> str:
        print(f"Agent received question (first 50 chars): {question[:50]}...")
        messages = [HumanMessage(content=question)]
        result = self.graph.invoke({"messages": messages})
        for message in reversed(result["messages"]):
            if isinstance(message.content, str) and "FINAL ANSWER:" in message.content:
                return message.content.split("FINAL ANSWER:")[-1].strip()
        return "لم أتمكن من إيجاد إجابة نهائية."

def run_and_submit_all(profile: gr.OAuthProfile | None):
    space_id = os.getenv("SPACE_ID")
    if profile:
        username = f"{profile.username}"
        print(f"User logged in: {username}")
    else:
        print("User not logged in.")
        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)
        response.raise_for_status()
        questions_data = response.json()
    except Exception as e:
        return f"Error fetching questions: {e}", None

    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:
            results_log.append({
                "Task ID": task_id,
                "Question": question_text,
                "Submitted Answer": f"AGENT ERROR: {e}"
            })

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

    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"Overall Score: {result_data.get('score', 'N/A')}% "
            f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n"
            f"Message: {result_data.get('message', 'No message received.')}"
        )
        results_df = pd.DataFrame(results_log)
        return final_status, results_df
    except Exception as e:
        return f"Submission Failed: {e}", pd.DataFrame(results_log)

# Gradio UI
with gr.Blocks() as demo:
    gr.Markdown("# Basic Agent Evaluation Runner")
    gr.Markdown(
        """
        **Instructions:**
        1. Clone this space and customize the agent logic.
        2. Log in with Hugging Face to enable submission.
        3. Click the button to run evaluation and submit all answers.
        """
    )

    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__":
    print("\nLaunching Gradio Interface...")
    demo.launch(debug=True, share=False)