File size: 5,569 Bytes
8850f30
 
dea8abd
 
f53079e
 
9095c2c
cc6f511
f53079e
 
 
 
 
 
7f1778f
cc6f511
f53079e
 
 
 
dea8abd
8850f30
cc6f511
 
 
 
02c9b56
 
 
 
 
 
 
cc6f511
 
 
 
 
 
8850f30
dea8abd
8850f30
dea8abd
 
 
 
f53079e
 
 
 
cc6f511
 
 
 
7f1778f
 
 
f53079e
 
 
 
 
e222391
cc6f511
 
 
e222391
9095c2c
 
 
 
 
 
 
 
 
 
02c9b56
 
 
9095c2c
 
 
 
dea8abd
 
 
 
 
8772acd
dea8abd
 
 
 
 
 
 
 
 
 
 
 
 
 
8772acd
dea8abd
 
 
 
 
8772acd
 
 
dea8abd
 
 
8772acd
 
dea8abd
 
 
8772acd
dea8abd
 
8772acd
dea8abd
 
 
 
 
 
 
8772acd
dea8abd
 
8772acd
 
 
dea8abd
8772acd
 
 
dea8abd
8772acd
dea8abd
 
8850f30
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
"""Application"""

import os
import gradio as gr

from questions import get_questions_data
from submit import submit_answers
from payload import get_answer_payload_results_log

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

API_URL = DEFAULT_API_URL
QUESTIONS_URL = f"{API_URL}/questions"
SUBMIT_URL = f"{API_URL}/submit"
FILES_URL = f"{API_URL}/files"

SPACE_ID = os.getenv("SPACE_ID")
if SPACE_ID:
    AGENT_CODE = f"https://huggingface.co/spaces/{SPACE_ID}/tree/main"
    print(f"Agent Code URL: {AGENT_CODE}")


def _check_agent_dependent_environment_variables() -> str:
    openai_api_key = os.getenv("OPENAI_API_KEY")
    if not openai_api_key:
        return "OPENAI_API_KEY environment variable must be set"
    manger_model_id = os.getenv("MANAGER_MODEL_ID")
    if not manger_model_id:
        return "MANAGER_MODEL_ID environment variable must be set"
    manager_base_url = os.getenv("MANGER_BASE_URL")
    if not manager_base_url:
        return "MANGER_BASE_URL environment variable must be set"

    return None


def run_and_submit_all(
    profile: gr.OAuthProfile | None,
):  # pylint: disable=too-many-return-statements
    """Run and Submit All"""
    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
    if not SPACE_ID:
        print("SPACE_ID must be set")
        return "SPACE_ID environment variable must be set", None

    error_message = _check_agent_dependent_environment_variables()
    if error_message:
        return error_message, None

    questions_data = get_questions_data(
        questions_url=QUESTIONS_URL, files_url=FILES_URL
    )
    if not questions_data:
        print("Questions list is empty.")
        return "Questions list is empty or invalid format.", None
    print(f"Retrieved {len(questions_data)} questions.")

    answers_payload, results_df, error_message = get_answer_payload_results_log(
        questions_data=questions_data
    )
    if error_message:
        return error_message, results_df

    submission_data = {
        "username": username.strip(),
        "agent_code": AGENT_CODE,
        "answers": answers_payload,
    }
    status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."  # pylint: disable=line-too-long
    print(status_update)
    print(f"Submitting {len(answers_payload)} answers to: {SUBMIT_URL}")

    final_status, error_message = submit_answers(
        submit_url=SUBMIT_URL, submission_data=submission_data
    )

    if final_status:
        return final_status, results_df
    return error_message, results_df


# --- Build Gradio Interface using Blocks ---
with gr.Blocks() as demo:
    gr.Markdown("# Basic Agent Evaluation Runner")
    # pylint: disable=line-too-long
    gr.Markdown(
        """
        **Instructions:**

        1.  Please clone this space, then modify the code to define your agent's logic, the tools, the necessary packages, etc ...
        2.  Log in to your Hugging Face account using the button below. This uses your HF username for submission.
        3.  Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.

        ---
        **Disclaimers:**
        Once clicking on the "submit button, it can take quite some time ( this is the time for the agent to go through all the questions).
        This space provides a basic setup and is intentionally sub-optimal to encourage you to develop your own, more robust solution. For instance for the delay process of the submit button, a solution could be to cache the answers and submit in a seperate action or even to answer the questions in async.
        """
    )
    # pylint: enable=line-too-long

    gr.LoginButton()

    run_button = gr.Button("Run Evaluation & Submit All Answers")

    status_output = gr.Textbox(
        label="Run Status / Submission Result", lines=5, interactive=False
    )
    # Removed max_rows=10 from DataFrame constructor
    results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)

    run_button.click(  # pylint: disable=no-member
        fn=run_and_submit_all, outputs=[status_output, results_table]
    )

if __name__ == "__main__":
    print("\n" + "-" * 30 + " App Starting " + "-" * 30)
    # Check for SPACE_HOST and SPACE_ID at startup for information
    space_host_startup = os.getenv("SPACE_HOST")
    space_id_startup = os.getenv("SPACE_ID")  # Get SPACE_ID at startup

    if space_host_startup:
        print(f"✅ SPACE_HOST found: {space_host_startup}")
        print(f"   Runtime URL should be: https://{space_host_startup}.hf.space")
    else:
        print("ℹ️  SPACE_HOST environment variable not found (running locally?).")

    if space_id_startup:  # Print repo URLs if SPACE_ID is found
        print(f"✅ SPACE_ID found: {space_id_startup}")
        print(f"   Repo URL: https://huggingface.co/spaces/{space_id_startup}")
        print(
            f"   Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main"
        )
    else:
        print(
            "ℹ️  SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined."  # pylint: disable=line-too-long
        )  # pylint: disable=line-too-long

    print("-" * (60 + len(" App Starting ")) + "\n")

    print("Launching Gradio Interface for Basic Agent Evaluation...")
    demo.launch(debug=True, share=False)