eigbney commited on
Commit
9c5dd85
·
verified ·
1 Parent(s): 245cfdb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +161 -85
app.py CHANGED
@@ -1,118 +1,194 @@
1
  import os
 
2
  import gradio as gr
3
  import requests
4
  import pandas as pd
5
- from smolagents import CodeAgent, InferenceClientModel
 
6
 
 
 
 
7
  # --- Constants ---
8
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
9
 
 
10
  class BasicAgent:
 
11
  def __init__(self):
12
- # We use Qwen2.5-72B for its strong reasoning and code generation
13
- self.model = InferenceClientModel(model_id="Qwen/Qwen2.5-72B-Instruct")
14
-
15
- # CodeAgent natively handles Python code execution
16
- self.agent = CodeAgent(
17
- tools=[],
18
- model=self.model,
19
- add_base_tools=False
20
- )
21
 
22
  def __call__(self, question: str) -> str:
23
- # This prompt is the 'gold standard' for GAIA exact-match scoring
24
- strict_prompt = (
25
- f"You are a general AI assistant. Solve this task: {question}\n\n"
26
- "Report your thoughts, and finish your answer with the following template: "
27
- "FINAL ANSWER: [YOUR FINAL ANSWER]\n\n"
28
- "YOUR FINAL ANSWER should be a number OR as few words as possible OR a comma separated list. "
29
- "If the answer is a number, do not use units ($, %, kg). "
30
- "If the answer is a string, don't use articles (a, an, the) or abbreviations."
31
- )
32
-
33
- try:
34
- # Run the agent
35
- raw_result = self.agent.run(strict_prompt)
36
-
37
- # --- Strict Post-Processing ---
38
- # Extract only the content after 'FINAL ANSWER:' if it exists
39
- result_str = str(raw_result)
40
- if "FINAL ANSWER:" in result_str:
41
- result_str = result_str.split("FINAL ANSWER:")[-1]
42
-
43
- # Remove markdown, quotes, and trailing punctuation
44
- clean_ans = result_str.replace("`", "").replace('"', "").replace("'", "").strip()
45
- return clean_ans.rstrip('.')
46
- except Exception as e:
47
- print(f"Agent Error: {e}")
48
- return "Error"
49
 
50
- def run_and_submit_all(profile: gr.OAuthProfile | None):
51
- if not profile:
 
 
 
 
 
 
 
 
 
 
 
52
  return "Please Login to Hugging Face with the button.", None
53
 
54
- username = profile.username
55
- space_id = os.getenv("SPACE_ID")
 
 
 
 
 
 
 
 
 
56
  agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
 
57
 
58
- # 1. Fetch Questions
 
59
  try:
60
- response = requests.get(f"{DEFAULT_API_URL}/questions", timeout=15)
 
61
  questions_data = response.json()
 
 
 
 
 
 
 
 
 
 
 
62
  except Exception as e:
63
- return f"Fetch Error: {e}", None
 
64
 
65
- # 2. Setup Agent
66
- agent = BasicAgent()
67
- answers_payload = []
68
  results_log = []
69
-
70
- print(f"Starting evaluation for {len(questions_data)} questions...")
71
-
72
  for item in questions_data:
73
  task_id = item.get("task_id")
74
  question_text = item.get("question")
75
-
76
- # --- File Download Logic ---
77
- # Some GAIA questions refer to a file. We download it so the Python tool can read it.
78
- file_url = f"{DEFAULT_API_URL}/files/{task_id}"
79
  try:
80
- file_res = requests.get(file_url, timeout=5)
81
- if file_res.status_code == 200:
82
- # Save the file with its task_id as the name
83
- with open(task_id, "wb") as f:
84
- f.write(file_res.content)
85
- question_text += f"\n\n[System Note: A file for this task has been downloaded to your directory as '{task_id}'. Use Python to read/analyze it.]"
86
- except:
87
- pass # No file for this task
88
-
89
- # 3. Generate Answer
90
- ans = agent(question_text)
91
-
92
- answers_payload.append({"task_id": task_id, "submitted_answer": ans})
93
- results_log.append({"Task ID": task_id, "Answer": ans})
94
-
95
- # 4. Submit
 
 
96
  try:
97
- sub_res = requests.post(f"{DEFAULT_API_URL}/submit", json={
98
- "username": username,
99
- "agent_code": agent_code,
100
- "answers": answers_payload
101
- })
102
- data = sub_res.json()
103
- status = f"Success! Score: {data.get('score')}% ({data.get('correct_count')}/{data.get('total_attempted')})"
104
- return status, pd.DataFrame(results_log)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  except Exception as e:
106
- return f"Submission Failed: {e}", pd.DataFrame(results_log)
 
 
 
107
 
108
- # --- Gradio UI ---
 
109
  with gr.Blocks() as demo:
110
- gr.Markdown("# GAIA Pro Solver")
 
 
 
 
111
  gr.LoginButton()
112
- run_btn = gr.Button("Run & Submit", variant="primary")
113
- status = gr.Textbox(label="Result")
114
- table = gr.DataFrame(label="Log")
115
- run_btn.click(fn=run_and_submit_all, outputs=[status, table])
 
 
 
 
 
 
 
116
 
117
  if __name__ == "__main__":
118
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import os
2
+ import inspect
3
  import gradio as gr
4
  import requests
5
  import pandas as pd
6
+ from langchain_core.messages import HumanMessage
7
+ from agent import build_graph
8
 
9
+
10
+
11
+ # (Keep Constants as is)
12
  # --- Constants ---
13
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
14
 
15
+
16
  class BasicAgent:
17
+ """A langgraph agent."""
18
  def __init__(self):
19
+ print("BasicAgent initialized.")
20
+ self.graph = build_graph()
 
 
 
 
 
 
 
21
 
22
  def __call__(self, question: str) -> str:
23
+ print(f"Agent received question (first 50 chars): {question[:50]}...")
24
+ messages = [HumanMessage(content=question)]
25
+ result = self.graph.invoke({"messages": messages})
26
+ answer = result['messages'][-1].content
27
+ return answer # kein [14:] mehr nötig!
28
+
29
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
+ def run_and_submit_all( profile: gr.OAuthProfile | None):
32
+ """
33
+ Fetches all questions, runs the BasicAgent on them, submits all answers,
34
+ and displays the results.
35
+ """
36
+ # --- Determine HF Space Runtime URL and Repo URL ---
37
+ space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
38
+
39
+ if profile:
40
+ username= f"{profile.username}"
41
+ print(f"User logged in: {username}")
42
+ else:
43
+ print("User not logged in.")
44
  return "Please Login to Hugging Face with the button.", None
45
 
46
+ api_url = DEFAULT_API_URL
47
+ questions_url = f"{api_url}/questions"
48
+ submit_url = f"{api_url}/submit"
49
+
50
+ # 1. Instantiate Agent ( modify this part to create your agent)
51
+ try:
52
+ agent = BasicAgent()
53
+ except Exception as e:
54
+ print(f"Error instantiating agent: {e}")
55
+ return f"Error initializing agent: {e}", None
56
+ # 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)
57
  agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
58
+ print(agent_code)
59
 
60
+ # 2. Fetch Questions
61
+ print(f"Fetching questions from: {questions_url}")
62
  try:
63
+ response = requests.get(questions_url, timeout=15)
64
+ response.raise_for_status()
65
  questions_data = response.json()
66
+ if not questions_data:
67
+ print("Fetched questions list is empty.")
68
+ return "Fetched questions list is empty or invalid format.", None
69
+ print(f"Fetched {len(questions_data)} questions.")
70
+ except requests.exceptions.RequestException as e:
71
+ print(f"Error fetching questions: {e}")
72
+ return f"Error fetching questions: {e}", None
73
+ except requests.exceptions.JSONDecodeError as e:
74
+ print(f"Error decoding JSON response from questions endpoint: {e}")
75
+ print(f"Response text: {response.text[:500]}")
76
+ return f"Error decoding server response for questions: {e}", None
77
  except Exception as e:
78
+ print(f"An unexpected error occurred fetching questions: {e}")
79
+ return f"An unexpected error occurred fetching questions: {e}", None
80
 
81
+ # 3. Run your Agent
 
 
82
  results_log = []
83
+ answers_payload = []
84
+ print(f"Running agent on {len(questions_data)} questions...")
 
85
  for item in questions_data:
86
  task_id = item.get("task_id")
87
  question_text = item.get("question")
88
+ if not task_id or question_text is None:
89
+ print(f"Skipping item with missing task_id or question: {item}")
90
+ continue
 
91
  try:
92
+ submitted_answer = agent(question_text)
93
+ answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
94
+ results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": submitted_answer})
95
+ except Exception as e:
96
+ print(f"Error running agent on task {task_id}: {e}")
97
+ results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"AGENT ERROR: {e}"})
98
+
99
+ if not answers_payload:
100
+ print("Agent did not produce any answers to submit.")
101
+ return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
102
+
103
+ # 4. Prepare Submission
104
+ submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
105
+ status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
106
+ print(status_update)
107
+
108
+ # 5. Submit
109
+ print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
110
  try:
111
+ response = requests.post(submit_url, json=submission_data, timeout=60)
112
+ response.raise_for_status()
113
+ result_data = response.json()
114
+ final_status = (
115
+ f"Submission Successful!\n"
116
+ f"User: {result_data.get('username')}\n"
117
+ f"Overall Score: {result_data.get('score', 'N/A')}% "
118
+ f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n"
119
+ f"Message: {result_data.get('message', 'No message received.')}"
120
+ )
121
+ print("Submission successful.")
122
+ results_df = pd.DataFrame(results_log)
123
+ return final_status, results_df
124
+ except requests.exceptions.HTTPError as e:
125
+ error_detail = f"Server responded with status {e.response.status_code}."
126
+ try:
127
+ error_json = e.response.json()
128
+ error_detail += f" Detail: {error_json.get('detail', e.response.text)}"
129
+ except requests.exceptions.JSONDecodeError:
130
+ error_detail += f" Response: {e.response.text[:500]}"
131
+ status_message = f"Submission Failed: {error_detail}"
132
+ print(status_message)
133
+ results_df = pd.DataFrame(results_log)
134
+ return status_message, results_df
135
+ except requests.exceptions.Timeout:
136
+ status_message = "Submission Failed: The request timed out."
137
+ print(status_message)
138
+ results_df = pd.DataFrame(results_log)
139
+ return status_message, results_df
140
+ except requests.exceptions.RequestException as e:
141
+ status_message = f"Submission Failed: Network error - {e}"
142
+ print(status_message)
143
+ results_df = pd.DataFrame(results_log)
144
+ return status_message, results_df
145
  except Exception as e:
146
+ status_message = f"An unexpected error occurred during submission: {e}"
147
+ print(status_message)
148
+ results_df = pd.DataFrame(results_log)
149
+ return status_message, results_df
150
 
151
+
152
+ # --- Build Gradio Interface using Blocks ---
153
  with gr.Blocks() as demo:
154
+ gr.Markdown("# Basic Agent Evaluation Runner")
155
+ gr.Markdown(
156
+
157
+ )
158
+
159
  gr.LoginButton()
160
+
161
+ run_button = gr.Button("Run Evaluation & Submit All Answers")
162
+
163
+ status_output = gr.Textbox(label="Run Status / Submission Result", lines=5, interactive=False)
164
+ # Removed max_rows=10 from DataFrame constructor
165
+ results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
166
+
167
+ run_button.click(
168
+ fn=run_and_submit_all,
169
+ outputs=[status_output, results_table]
170
+ )
171
 
172
  if __name__ == "__main__":
173
+ print("\n" + "-"*30 + " App Starting " + "-"*30)
174
+ # Check for SPACE_HOST and SPACE_ID at startup for information
175
+ space_host_startup = os.getenv("SPACE_HOST")
176
+ space_id_startup = os.getenv("SPACE_ID") # Get SPACE_ID at startup
177
+
178
+ if space_host_startup:
179
+ print(f"✅ SPACE_HOST found: {space_host_startup}")
180
+ print(f" Runtime URL should be: https://{space_host_startup}.hf.space")
181
+ else:
182
+ print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
183
+
184
+ if space_id_startup: # Print repo URLs if SPACE_ID is found
185
+ print(f"✅ SPACE_ID found: {space_id_startup}")
186
+ print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
187
+ print(f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main")
188
+ else:
189
+ print("ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined.")
190
+
191
+ print("-"*(60 + len(" App Starting ")) + "\n")
192
+
193
+ print("Launching Gradio Interface for Basic Agent Evaluation...")
194
+ demo.launch(debug=True, share=False)