Aya1610 commited on
Commit
be40001
·
verified ·
1 Parent(s): 06a742d

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +173 -162
app.py CHANGED
@@ -1,206 +1,217 @@
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)
 
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)