Aya1610 commited on
Commit
bb1b5da
·
verified ·
1 Parent(s): 514138f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +162 -173
app.py CHANGED
@@ -1,217 +1,206 @@
1
  import os
 
2
  import gradio as gr
3
  import requests
4
  import pandas as pd
5
  from langchain_core.messages import HumanMessage
6
  from agent import build_graph
7
 
 
 
 
8
  # --- Constants ---
9
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
10
 
 
 
 
 
11
  class BasicAgent:
12
- """A langgraph agent using OpenAI."""
13
  def __init__(self):
14
- print("=== INITIALIZING OPENAI BASIC AGENT ===")
15
- print(f"Current working directory: {os.getcwd()}")
16
- print(f"Files in directory: {os.listdir('.')}")
17
-
18
- # Check environment variables
19
- print("=== ENVIRONMENT VARIABLES ===")
20
- for key in sorted(os.environ.keys()):
21
- if any(term in key.upper() for term in ['OPENAI', 'API_KEY', 'TOKEN', 'TAVILY']):
22
- value = os.environ[key]
23
- print(f"{key}: {value[:10] if value else 'None'}...")
24
-
25
- # Check specifically for OpenAI API key
26
- openai_key = os.getenv("OPENAI_API_KEY")
27
- if openai_key:
28
- print(f"✓ OpenAI API Key found: {openai_key[:15]}...")
29
- else:
30
- print("✗ OpenAI API Key not found!")
31
- print("Please add OPENAI_API_KEY to your Hugging Face Space secrets")
32
-
33
- try:
34
- self.graph = build_graph()
35
- print("✓ Graph built successfully")
36
- except Exception as e:
37
- print(f"✗ Error building graph: {e}")
38
- raise e
39
 
40
  def __call__(self, question: str) -> str:
41
- print(f"=== AGENT CALL ===")
42
- print(f"Question: {question[:100]}...")
43
-
44
- try:
45
- messages = [HumanMessage(content=question)]
46
- print(f"Invoking graph with messages: {len(messages)}")
47
-
48
- result = self.graph.invoke({"messages": messages})
49
- print(f"Graph result keys: {result.keys() if isinstance(result, dict) else 'Not a dict'}")
50
-
51
- if 'messages' in result and result['messages']:
52
- answer = result['messages'][-1].content
53
- print(f"Answer (first 100 chars): {answer[:100]}...")
54
- return answer
55
- else:
56
- print("No messages in result")
57
- return "I apologize, but I couldn't generate a response."
58
-
59
- except Exception as e:
60
- print(f"Error in agent call: {e}")
61
- return f"Error: {str(e)}"
62
-
63
- def run_and_submit_all(profile: gr.OAuthProfile | None):
64
- print("=== STARTING RUN AND SUBMIT ===")
65
- space_id = os.getenv("SPACE_ID")
66
- print(f"Space ID: {space_id}")
67
-
68
- if not profile:
69
  return "Please Login to Hugging Face with the button.", None
70
-
71
- username = profile.username
72
- print(f"Username: {username}")
73
-
74
  api_url = DEFAULT_API_URL
75
  questions_url = f"{api_url}/questions"
76
  submit_url = f"{api_url}/submit"
77
-
78
- print("=== INITIALIZING AGENT ===")
79
  try:
80
  agent = BasicAgent()
81
- print("✓ Agent initialized successfully")
82
  except Exception as e:
83
- error_msg = f"Error initializing agent: {e}"
84
- print(error_msg)
85
- return error_msg, None
86
-
87
  agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
88
- print(f"Agent code URL: {agent_code}")
89
 
90
- print("=== FETCHING QUESTIONS ===")
 
91
  try:
92
- resp_q = requests.get(questions_url, timeout=15)
93
- resp_q.raise_for_status()
94
- questions = resp_q.json()
95
- print(f"✓ Fetched {len(questions)} questions")
 
 
 
 
 
 
 
 
 
 
96
  except Exception as e:
97
- error_msg = f"Error fetching questions: {e}"
98
- print(error_msg)
99
- return error_msg, None
100
 
 
101
  results_log = []
102
- answers = []
103
-
104
- print("=== PROCESSING QUESTIONS ===")
105
- for i, item in enumerate(questions):
106
  task_id = item.get("task_id")
107
- q = item.get("question")
108
-
109
- print(f"\n--- Question {i+1}/{len(questions)} ---")
110
- print(f"Task ID: {task_id}")
111
- print(f"Question: {q[:100]}...")
112
-
113
- if not task_id or q is None:
114
- print("Skipping - missing task_id or question")
115
  continue
116
-
117
  try:
118
- print("Calling agent...")
119
- ans = agent(q)
120
- print(f"Answer: {ans[:100]}...")
121
-
122
- answers.append({"task_id": task_id, "submitted_answer": ans})
123
- results_log.append({"Task ID": task_id, "Question": q, "Submitted Answer": ans})
124
- print("✓ Question processed successfully")
125
-
126
  except Exception as e:
127
- error_msg = f"ERROR: {e}"
128
- print(f" Error processing question: {error_msg}")
129
- results_log.append({"Task ID": task_id, "Question": q, "Submitted Answer": error_msg})
130
 
131
- if not answers:
 
132
  return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
133
 
134
- print(f"=== SUBMITTING {len(answers)} ANSWERS ===")
135
- payload = {"username": username.strip(), "agent_code": agent_code, "answers": answers}
136
-
 
 
 
 
137
  try:
138
- resp_s = requests.post(submit_url, json=payload, timeout=60)
139
- resp_s.raise_for_status()
140
- data = resp_s.json()
141
-
142
- status = (
143
  f"Submission Successful!\n"
144
- f"User: {data.get('username')}\n"
145
- f"Score: {data.get('score', 'N/A')}% "
146
- f"({data.get('correct_count', '?')}/{data.get('total_attempted', '?')})\n"
147
- f"{data.get('message', '')}"
148
  )
149
- print("Submission successful")
150
- print(status)
151
- return status, pd.DataFrame(results_log)
152
-
153
- except Exception as e:
154
- error_msg = f"Submission Failed: {e}"
155
- print(error_msg)
156
- return error_msg, pd.DataFrame(results_log)
157
-
158
- # Simple test function for debugging
159
- def test_agent():
160
- """Test function to verify agent works"""
161
- print("=== TESTING AGENT ===")
162
- try:
163
- agent = BasicAgent()
164
- test_questions = [
165
- "What is 2 + 3?",
166
- "What is 10 * 5?",
167
- "Search for information about Python programming"
168
- ]
169
-
170
- for q in test_questions:
171
- print(f"\nTesting: {q}")
172
- answer = agent(q)
173
- print(f"Answer: {answer}")
174
-
175
  except Exception as e:
176
- print(f"Test failed: {e}")
 
 
 
 
177
 
 
178
  with gr.Blocks() as demo:
179
- gr.Markdown("# OpenAI-Powered Agent Evaluation Runner")
180
- gr.Markdown("""
181
- This agent uses OpenAI's GPT models instead of Hugging Face.
182
-
183
- ## Setup Instructions:
184
- 1. Get an OpenAI API key from https://platform.openai.com/api-keys
185
- 2. Add it as `OPENAI_API_KEY` in your Hugging Face Space secrets
186
- 3. (Optional) Add `TAVILY_API_KEY` for web search functionality
187
- 4. Log in with the button below
188
- 5. Click **Run Evaluation & Submit All Answers**
189
-
190
- ## Current Configuration:
191
- - Model: GPT-3.5-turbo (change to GPT-4 in agent.py if you have access)
192
- - Tools: Math operations, Wikipedia search, Arxiv search, Web search (if Tavily configured)
193
- """)
194
-
195
- with gr.Row():
196
- gr.LoginButton()
197
- test_btn = gr.Button("Test Agent", variant="secondary")
198
-
199
- run_btn = gr.Button("Run Evaluation & Submit All Answers", variant="primary")
200
- status_out = gr.Textbox(label="Run Status / Submission Result", lines=5)
201
  results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
202
-
203
- # Button actions
204
- run_btn.click(fn=run_and_submit_all, outputs=[status_out, results_table])
205
- test_btn.click(fn=test_agent, outputs=[])
 
206
 
207
  if __name__ == "__main__":
208
- print("=== STARTING OPENAI GRADIO APP ===")
209
-
210
- # Quick environment check
211
- openai_key = os.getenv("OPENAI_API_KEY")
212
- if openai_key:
213
- print(f"✓ OpenAI API Key configured: {openai_key[:15]}...")
 
 
214
  else:
215
- print("⚠️ OpenAI API Key not found - please add OPENAI_API_KEY to your Space secrets")
216
-
217
- demo.launch(debug=True, share=False)
 
 
 
 
 
 
 
 
 
 
 
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
+ # --- Basic Agent Definition ---
16
+ # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
17
+
18
+
19
  class BasicAgent:
20
+ """A langgraph agent."""
21
  def __init__(self):
22
+ print("BasicAgent initialized.")
23
+ self.graph = build_graph()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
  def __call__(self, question: str) -> str:
26
+ print(f"Agent received question (first 50 chars): {question[:50]}...")
27
+ messages = [HumanMessage(content=question)]
28
+ result = self.graph.invoke({"messages": messages})
29
+ answer = result['messages'][-1].content
30
+ return answer # kein [14:] mehr nötig!
31
+
32
+
33
+
34
+ def run_and_submit_all( profile: gr.OAuthProfile | None):
35
+ """
36
+ Fetches all questions, runs the BasicAgent on them, submits all answers,
37
+ and displays the results.
38
+ """
39
+ # --- Determine HF Space Runtime URL and Repo URL ---
40
+ space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
41
+
42
+ if profile:
43
+ username= f"{profile.username}"
44
+ print(f"User logged in: {username}")
45
+ else:
46
+ print("User not logged in.")
 
 
 
 
 
 
 
47
  return "Please Login to Hugging Face with the button.", None
48
+
 
 
 
49
  api_url = DEFAULT_API_URL
50
  questions_url = f"{api_url}/questions"
51
  submit_url = f"{api_url}/submit"
52
+
53
+ # 1. Instantiate Agent ( modify this part to create your agent)
54
  try:
55
  agent = BasicAgent()
 
56
  except Exception as e:
57
+ print(f"Error instantiating agent: {e}")
58
+ return f"Error initializing agent: {e}", None
59
+ # 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)
 
60
  agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
61
+ print(agent_code)
62
 
63
+ # 2. Fetch Questions
64
+ print(f"Fetching questions from: {questions_url}")
65
  try:
66
+ response = requests.get(questions_url, timeout=15)
67
+ response.raise_for_status()
68
+ questions_data = response.json()
69
+ if not questions_data:
70
+ print("Fetched questions list is empty.")
71
+ return "Fetched questions list is empty or invalid format.", None
72
+ print(f"Fetched {len(questions_data)} questions.")
73
+ except requests.exceptions.RequestException as e:
74
+ print(f"Error fetching questions: {e}")
75
+ return f"Error fetching questions: {e}", None
76
+ except requests.exceptions.JSONDecodeError as e:
77
+ print(f"Error decoding JSON response from questions endpoint: {e}")
78
+ print(f"Response text: {response.text[:500]}")
79
+ return f"Error decoding server response for questions: {e}", None
80
  except Exception as e:
81
+ print(f"An unexpected error occurred fetching questions: {e}")
82
+ return f"An unexpected error occurred fetching questions: {e}", None
 
83
 
84
+ # 3. Run your Agent
85
  results_log = []
86
+ answers_payload = []
87
+ print(f"Running agent on {len(questions_data)} questions...")
88
+ for item in questions_data:
 
89
  task_id = item.get("task_id")
90
+ question_text = item.get("question")
91
+ if not task_id or question_text is None:
92
+ print(f"Skipping item with missing task_id or question: {item}")
 
 
 
 
 
93
  continue
 
94
  try:
95
+ submitted_answer = agent(question_text)
96
+ answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
97
+ results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": submitted_answer})
 
 
 
 
 
98
  except Exception as e:
99
+ print(f"Error running agent on task {task_id}: {e}")
100
+ results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"AGENT ERROR: {e}"})
 
101
 
102
+ if not answers_payload:
103
+ print("Agent did not produce any answers to submit.")
104
  return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
105
 
106
+ # 4. Prepare Submission
107
+ submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
108
+ status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
109
+ print(status_update)
110
+
111
+ # 5. Submit
112
+ print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
113
  try:
114
+ response = requests.post(submit_url, json=submission_data, timeout=60)
115
+ response.raise_for_status()
116
+ result_data = response.json()
117
+ final_status = (
 
118
  f"Submission Successful!\n"
119
+ f"User: {result_data.get('username')}\n"
120
+ f"Overall Score: {result_data.get('score', 'N/A')}% "
121
+ f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n"
122
+ f"Message: {result_data.get('message', 'No message received.')}"
123
  )
124
+ print("Submission successful.")
125
+ results_df = pd.DataFrame(results_log)
126
+ return final_status, results_df
127
+ except requests.exceptions.HTTPError as e:
128
+ error_detail = f"Server responded with status {e.response.status_code}."
129
+ try:
130
+ error_json = e.response.json()
131
+ error_detail += f" Detail: {error_json.get('detail', e.response.text)}"
132
+ except requests.exceptions.JSONDecodeError:
133
+ error_detail += f" Response: {e.response.text[:500]}"
134
+ status_message = f"Submission Failed: {error_detail}"
135
+ print(status_message)
136
+ results_df = pd.DataFrame(results_log)
137
+ return status_message, results_df
138
+ except requests.exceptions.Timeout:
139
+ status_message = "Submission Failed: The request timed out."
140
+ print(status_message)
141
+ results_df = pd.DataFrame(results_log)
142
+ return status_message, results_df
143
+ except requests.exceptions.RequestException as e:
144
+ status_message = f"Submission Failed: Network error - {e}"
145
+ print(status_message)
146
+ results_df = pd.DataFrame(results_log)
147
+ return status_message, results_df
 
 
148
  except Exception as e:
149
+ status_message = f"An unexpected error occurred during submission: {e}"
150
+ print(status_message)
151
+ results_df = pd.DataFrame(results_log)
152
+ return status_message, results_df
153
+
154
 
155
+ # --- Build Gradio Interface using Blocks ---
156
  with gr.Blocks() as demo:
157
+ gr.Markdown("# Basic Agent Evaluation Runner")
158
+ gr.Markdown(
159
+ """
160
+ **Instructions:**
161
+ 1. Please clone this space, then modify the code to define your agent's logic, the tools, the necessary packages, etc ...
162
+ 2. Log in to your Hugging Face account using the button below. This uses your HF username for submission.
163
+ 3. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
164
+ ---
165
+ **Disclaimers:**
166
+ 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).
167
+ 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.
168
+ """
169
+ )
170
+
171
+ gr.LoginButton()
172
+
173
+ run_button = gr.Button("Run Evaluation & Submit All Answers")
174
+
175
+ status_output = gr.Textbox(label="Run Status / Submission Result", lines=5, interactive=False)
176
+ # Removed max_rows=10 from DataFrame constructor
 
 
177
  results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
178
+
179
+ run_button.click(
180
+ fn=run_and_submit_all,
181
+ outputs=[status_output, results_table]
182
+ )
183
 
184
  if __name__ == "__main__":
185
+ print("\n" + "-"*30 + " App Starting " + "-"*30)
186
+ # Check for SPACE_HOST and SPACE_ID at startup for information
187
+ space_host_startup = os.getenv("SPACE_HOST")
188
+ space_id_startup = os.getenv("SPACE_ID") # Get SPACE_ID at startup
189
+
190
+ if space_host_startup:
191
+ print(f"✅ SPACE_HOST found: {space_host_startup}")
192
+ print(f" Runtime URL should be: https://{space_host_startup}.hf.space")
193
  else:
194
+ print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
195
+
196
+ if space_id_startup: # Print repo URLs if SPACE_ID is found
197
+ print(f"✅ SPACE_ID found: {space_id_startup}")
198
+ print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
199
+ print(f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main")
200
+ else:
201
+ print("ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined.")
202
+
203
+ print("-"*(60 + len(" App Starting ")) + "\n")
204
+
205
+ print("Launching Gradio Interface for Basic Agent Evaluation...")
206
+ demo.launch(debug=True, share=False)