DukeDDrake1999 commited on
Commit
fceca04
·
verified ·
1 Parent(s): 6d9d359

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +203 -202
app.py CHANGED
@@ -1,202 +1,203 @@
1
- import os
2
- import gradio as gr
3
- import requests
4
- import inspect
5
- import pandas as pd
6
-
7
- from agent import BasicAgent
8
-
9
- # (Keep Constants as is)
10
- # --- Constants ---
11
- DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
12
-
13
- def run_and_submit_all( profile: gr.OAuthProfile | None):
14
- """
15
- Fetches all questions, runs the BasicAgent on them, submits all answers,
16
- and displays the results.
17
- """
18
- # --- Determine HF Space Runtime URL and Repo URL ---
19
- space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
20
-
21
- if profile:
22
- username= f"{profile.username}"
23
- print(f"User logged in: {username}")
24
- else:
25
- print("User not logged in.")
26
- return "Please Login to Hugging Face with the button.", None
27
-
28
- api_url = DEFAULT_API_URL
29
- questions_url = f"{api_url}/questions"
30
- submit_url = f"{api_url}/submit"
31
-
32
- # 1. Instantiate Agent ( modify this part to create your agent)
33
- try:
34
- agent = BasicAgent()
35
- except Exception as e:
36
- print(f"Error instantiating agent: {e}")
37
- return f"Error initializing agent: {e}", None
38
- # In the case of an app running as a hugging Face space, this link points toward your codebase ( usefull for others so please keep it public)
39
- agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
40
- print(agent_code)
41
-
42
- # 2. Fetch Questions
43
- print(f"Fetching questions from: {questions_url}")
44
- try:
45
- response = requests.get(questions_url, timeout=15)
46
- response.raise_for_status()
47
- questions_data = response.json()
48
- if not questions_data:
49
- print("Fetched questions list is empty.")
50
- return "Fetched questions list is empty or invalid format.", None
51
- print(f"Fetched {len(questions_data)} questions.")
52
- except requests.exceptions.RequestException as e:
53
- print(f"Error fetching questions: {e}")
54
- return f"Error fetching questions: {e}", None
55
- except requests.exceptions.JSONDecodeError as e:
56
- print(f"Error decoding JSON response from questions endpoint: {e}")
57
- print(f"Response text: {response.text[:500]}")
58
- return f"Error decoding server response for questions: {e}", None
59
- except Exception as e:
60
- print(f"An unexpected error occurred fetching questions: {e}")
61
- return f"An unexpected error occurred fetching questions: {e}", None
62
-
63
- # 3. Run your Agent
64
- results_log = []
65
- answers_payload = []
66
- print(f"Running agent on {len(questions_data)} questions...")
67
- for item in questions_data:
68
- task_id = item.get("task_id")
69
- question_text = item.get("question")
70
- file_name = item.get("file_name") or ""
71
- if not task_id or question_text is None:
72
- print(f"Skipping item with missing task_id or question: {item}")
73
- continue
74
- try:
75
- submitted_answer = agent(question_text, task_id=task_id, file_name=file_name)
76
- answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
77
- results_log.append(
78
- {
79
- "Task ID": task_id,
80
- "Attached File": file_name,
81
- "Question": question_text,
82
- "Submitted Answer": submitted_answer,
83
- }
84
- )
85
- except Exception as e:
86
- print(f"Error running agent on task {task_id}: {e}")
87
- results_log.append(
88
- {
89
- "Task ID": task_id,
90
- "Attached File": file_name,
91
- "Question": question_text,
92
- "Submitted Answer": f"AGENT ERROR: {e}",
93
- }
94
- )
95
-
96
- if not answers_payload:
97
- print("Agent did not produce any answers to submit.")
98
- return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
99
-
100
- # 4. Prepare Submission
101
- submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
102
- status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
103
- print(status_update)
104
-
105
- # 5. Submit
106
- print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
107
- try:
108
- response = requests.post(submit_url, json=submission_data, timeout=60)
109
- response.raise_for_status()
110
- result_data = response.json()
111
- final_status = (
112
- f"Submission Successful!\n"
113
- f"User: {result_data.get('username')}\n"
114
- f"Overall Score: {result_data.get('score', 'N/A')}% "
115
- f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n"
116
- f"Message: {result_data.get('message', 'No message received.')}"
117
- )
118
- print("Submission successful.")
119
- results_df = pd.DataFrame(results_log)
120
- return final_status, results_df
121
- except requests.exceptions.HTTPError as e:
122
- error_detail = f"Server responded with status {e.response.status_code}."
123
- try:
124
- error_json = e.response.json()
125
- error_detail += f" Detail: {error_json.get('detail', e.response.text)}"
126
- except requests.exceptions.JSONDecodeError:
127
- error_detail += f" Response: {e.response.text[:500]}"
128
- status_message = f"Submission Failed: {error_detail}"
129
- print(status_message)
130
- results_df = pd.DataFrame(results_log)
131
- return status_message, results_df
132
- except requests.exceptions.Timeout:
133
- status_message = "Submission Failed: The request timed out."
134
- print(status_message)
135
- results_df = pd.DataFrame(results_log)
136
- return status_message, results_df
137
- except requests.exceptions.RequestException as e:
138
- status_message = f"Submission Failed: Network error - {e}"
139
- print(status_message)
140
- results_df = pd.DataFrame(results_log)
141
- return status_message, results_df
142
- except Exception as e:
143
- status_message = f"An unexpected error occurred during submission: {e}"
144
- print(status_message)
145
- results_df = pd.DataFrame(results_log)
146
- return status_message, results_df
147
-
148
-
149
- # --- Build Gradio Interface using Blocks ---
150
- with gr.Blocks() as demo:
151
- gr.Markdown("# Basic Agent Evaluation Runner")
152
- gr.Markdown(
153
- """
154
- **Instructions:**
155
-
156
- 1. Add your `GEMINI_API_KEY` in this Space's secrets.
157
- 2. Log in to your Hugging Face account using the button below. This uses your HF username for submission.
158
- 3. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
159
-
160
- ---
161
- **Disclaimers:**
162
- 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).
163
- 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.
164
- """
165
- )
166
-
167
- gr.LoginButton()
168
-
169
- run_button = gr.Button("Run Evaluation & Submit All Answers")
170
-
171
- status_output = gr.Textbox(label="Run Status / Submission Result", lines=5, interactive=False)
172
- # Removed max_rows=10 from DataFrame constructor
173
- results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
174
-
175
- run_button.click(
176
- fn=run_and_submit_all,
177
- outputs=[status_output, results_table]
178
- )
179
-
180
- if __name__ == "__main__":
181
- print("\n" + "-"*30 + " App Starting " + "-"*30)
182
- # Check for SPACE_HOST and SPACE_ID at startup for information
183
- space_host_startup = os.getenv("SPACE_HOST")
184
- space_id_startup = os.getenv("SPACE_ID") # Get SPACE_ID at startup
185
-
186
- if space_host_startup:
187
- print(f"✅ SPACE_HOST found: {space_host_startup}")
188
- print(f" Runtime URL should be: https://{space_host_startup}.hf.space")
189
- else:
190
- print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
191
-
192
- if space_id_startup: # Print repo URLs if SPACE_ID is found
193
- print(f"✅ SPACE_ID found: {space_id_startup}")
194
- print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
195
- print(f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main")
196
- else:
197
- print("ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined.")
198
-
199
- print("-"*(60 + len(" App Starting ")) + "\n")
200
-
201
- print("Launching Gradio Interface for Basic Agent Evaluation...")
202
- demo.launch(debug=True, share=False)
 
 
1
+ import os
2
+ import gradio as gr
3
+ import requests
4
+ import inspect
5
+ import pandas as pd
6
+
7
+ from agent import BasicAgent
8
+
9
+ # --- Constants ---
10
+ DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
11
+
12
+
13
+ def run_and_submit_all( profile: gr.OAuthProfile | None):
14
+ """
15
+ Fetches all questions, runs the BasicAgent on them, submits all answers,
16
+ and displays the results.
17
+ """
18
+ # --- Determine HF Space Runtime URL and Repo URL ---
19
+ space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
20
+
21
+ if profile:
22
+ username= f"{profile.username}"
23
+ print(f"User logged in: {username}")
24
+ else:
25
+ print("User not logged in.")
26
+ return "Please Login to Hugging Face with the button.", None
27
+
28
+ api_url = DEFAULT_API_URL
29
+ questions_url = f"{api_url}/questions"
30
+ submit_url = f"{api_url}/submit"
31
+
32
+ # 1. Instantiate Agent ( modify this part to create your agent)
33
+ try:
34
+ agent = BasicAgent()
35
+ except Exception as e:
36
+ print(f"Error instantiating agent: {e}")
37
+ return f"Error initializing agent: {e}", None
38
+
39
+ # In the case of an app running as a hugging Face space, this link points toward your codebase ( usefull for others so please keep it public)
40
+ agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
41
+ print(agent_code)
42
+
43
+ # 2. Fetch Questions
44
+ print(f"Fetching questions from: {questions_url}")
45
+ try:
46
+ response = requests.get(questions_url, timeout=15)
47
+ response.raise_for_status()
48
+ questions_data = response.json()
49
+ if not questions_data:
50
+ print("Fetched questions list is empty.")
51
+ return "Fetched questions list is empty or invalid format.", None
52
+ print(f"Fetched {len(questions_data)} questions.")
53
+ except requests.exceptions.RequestException as e:
54
+ print(f"Error fetching questions: {e}")
55
+ return f"Error fetching questions: {e}", None
56
+ except requests.exceptions.JSONDecodeError as e:
57
+ print(f"Error decoding JSON response from questions endpoint: {e}")
58
+ print(f"Response text: {response.text[:500]}")
59
+ return f"Error decoding server response for questions: {e}", None
60
+ except Exception as e:
61
+ print(f"An unexpected error occurred fetching questions: {e}")
62
+ return f"An unexpected error occurred fetching questions: {e}", None
63
+
64
+ # 3. Run your Agent
65
+ results_log = []
66
+ answers_payload = []
67
+ print(f"Running agent on {len(questions_data)} questions...")
68
+
69
+ for item in questions_data:
70
+ task_id = item.get("task_id")
71
+ question_text = item.get("question")
72
+ file_name = item.get("file_name") or ""
73
+
74
+ if not task_id or question_text is None:
75
+ print(f"Skipping item with missing task_id or question: {item}")
76
+ continue
77
+
78
+ try:
79
+ submitted_answer = agent(question_text, task_id=task_id, file_name=file_name)
80
+ answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
81
+ results_log.append(
82
+ {
83
+ "Task ID": task_id,
84
+ "Attached File": file_name,
85
+ "Question": question_text,
86
+ "Submitted Answer": submitted_answer,
87
+ }
88
+ )
89
+ except Exception as e:
90
+ print(f"Error running agent on task {task_id}: {e}")
91
+ results_log.append(
92
+ {
93
+ "Task ID": task_id,
94
+ "Attached File": file_name,
95
+ "Question": question_text,
96
+ "Submitted Answer": f"AGENT ERROR: {e}",
97
+ }
98
+ )
99
+
100
+ if not answers_payload:
101
+ print("Agent did not produce any answers to submit.")
102
+ return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
103
+
104
+ # 4. Prepare Submission
105
+ submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
106
+ status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
107
+ print(status_update)
108
+
109
+ # 5. Submit
110
+ print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
111
+ try:
112
+ response = requests.post(submit_url, json=submission_data, timeout=60)
113
+ response.raise_for_status()
114
+ result_data = response.json()
115
+ final_status = (
116
+ f"Submission Successful!\n"
117
+ f"User: {result_data.get('username')}\n"
118
+ f"Overall Score: {result_data.get('score', 'N/A')}% "
119
+ f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n"
120
+ f"Message: {result_data.get('message', 'No message received.')}"
121
+ )
122
+ print("Submission successful.")
123
+ results_df = pd.DataFrame(results_log)
124
+ return final_status, results_df
125
+
126
+ except requests.exceptions.HTTPError as e:
127
+ error_detail = f"Server responded with status {e.response.status_code}."
128
+ try:
129
+ error_json = e.response.json()
130
+ error_detail += f" Detail: {error_json.get('detail', e.response.text)}"
131
+ except requests.exceptions.JSONDecodeError:
132
+ error_detail += f" Response: {e.response.text[:500]}"
133
+ status_message = f"Submission Failed: {error_detail}"
134
+ print(status_message)
135
+ results_df = pd.DataFrame(results_log)
136
+ return status_message, results_df
137
+ except requests.exceptions.Timeout:
138
+ status_message = "Submission Failed: The request timed out."
139
+ print(status_message)
140
+ results_df = pd.DataFrame(results_log)
141
+ return status_message, results_df
142
+ except requests.exceptions.RequestException as e:
143
+ status_message = f"Submission Failed: Network error - {e}"
144
+ print(status_message)
145
+ results_df = pd.DataFrame(results_log)
146
+ return status_message, results_df
147
+ except Exception as e:
148
+ status_message = f"An unexpected error occurred during submission: {e}"
149
+ print(status_message)
150
+ results_df = pd.DataFrame(results_log)
151
+ return status_message, results_df
152
+
153
+
154
+ # --- Build Gradio Interface using Blocks ---
155
+ with gr.Blocks() as demo:
156
+ gr.Markdown("# Basic Agent Evaluation Runner")
157
+ gr.Markdown(
158
+ """
159
+ **Instructions:**
160
+ 1. Add your `OPENAI_API_KEY` **and** your `GEMINI_API_KEY` in this Space's secrets. (OpenAI handles the logic, Gemini handles the video tool).
161
+ 2. Log in to your Hugging Face account using the button below. This uses your HF username for submission.
162
+ 3. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
163
+ ---
164
+ **Disclaimers:**
165
+ 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).
166
+ This space provides a basic setup and is intentionally sub-optimal to encourage you to develop your own, more robust solution.
167
+ """
168
+ )
169
+
170
+ gr.LoginButton()
171
+
172
+ run_button = gr.Button("Run Evaluation & Submit All Answers")
173
+ status_output = gr.Textbox(label="Run Status / Submission Result", lines=5, interactive=False)
174
+ results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
175
+
176
+ run_button.click(
177
+ fn=run_and_submit_all,
178
+ outputs=[status_output, results_table]
179
+ )
180
+
181
+ if __name__ == "__main__":
182
+ print("\n" + "-"*30 + " App Starting " + "-"*30)
183
+
184
+ # Check for SPACE_HOST and SPACE_ID at startup for information
185
+ space_host_startup = os.getenv("SPACE_HOST")
186
+ space_id_startup = os.getenv("SPACE_ID")
187
+
188
+ if space_host_startup:
189
+ print(f"✅ SPACE_HOST found: {space_host_startup}")
190
+ print(f" Runtime URL should be: https://{space_host_startup}.hf.space")
191
+ else:
192
+ print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
193
+
194
+ if space_id_startup:
195
+ print(f"✅ SPACE_ID found: {space_id_startup}")
196
+ print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
197
+ print(f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main")
198
+ else:
199
+ print("ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined.")
200
+
201
+ print("-"*(60 + len(" App Starting ")) + "\n")
202
+ print("Launching Gradio Interface for Basic Agent Evaluation...")
203
+ demo.launch(debug=True, share=False)