Prajwal-K commited on
Commit
87b09f8
Β·
verified Β·
1 Parent(s): 34950e7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +180 -32
app.py CHANGED
@@ -5,15 +5,17 @@ import pandas as pd
5
  from dotenv import load_dotenv
6
 
7
  from langchain_core.messages import HumanMessage
8
- from agent import build_graph, find_answer_by_task_id, find_answer_by_question # ← Import at TOP
 
9
 
10
  load_dotenv()
11
 
12
  # -------------------------- Constants --------------------------
13
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
14
 
 
15
  class BasicAgent:
16
- """Direct lookup agent using support.jsonl."""
17
  def __init__(self):
18
  print("BasicAgent initialized.")
19
  self.graph = build_graph()
@@ -22,48 +24,194 @@ class BasicAgent:
22
  print(f"Agent received question (first 50 chars): {question[:50]}...")
23
  messages = [HumanMessage(content=question)]
24
  result = self.graph.invoke({"messages": messages})
 
 
 
 
25
  if "messages" in result:
26
- return result["messages"][-1].content
27
- return f"Graph returned: {result} (missing 'messages')"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
 
29
-
30
- def run_and_submit_all(profile: gr.OAuthProfile | None):
31
- # --- Setup ---
32
- agent = BasicAgent()
33
  api_url = DEFAULT_API_URL
34
  questions_url = f"{api_url}/questions"
35
  submit_url = f"{api_url}/submit"
36
 
37
- if profile is None:
38
- return "Please log in to HuggingFace first.", None
 
 
 
 
39
 
40
- username = profile.username
41
- headers = {"Authorization": f"Bearer {os.environ.get('HF_TOKEN', '')}"}
42
 
43
- # --- Fetch questions ---
44
- response = requests.get(questions_url, headers=headers)
45
- questions_data = response.json()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
 
 
 
47
  answers_payload = []
48
-
49
  for item in questions_data:
50
- task_id = item.get("task_id", "")
51
- question_text = item.get("question", "")
52
-
53
- submitted_answer = find_answer_by_task_id(task_id)
54
- if not submitted_answer:
55
- submitted_answer = find_answer_by_question(question_text)
56
- if not submitted_answer:
57
  submitted_answer = agent(question_text)
 
 
 
 
 
 
 
 
 
 
 
 
 
58
 
59
- answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
 
 
60
 
61
- # --- Submit ---
62
- submit_response = requests.post(
63
- submit_url,
64
- json={"username": username, "agent_code": f"https://huggingface.co/spaces/{os.environ.get('SPACE_ID', '')}/tree/main", "answers": answers_payload},
65
- headers=headers
 
 
 
66
  )
67
- result = submit_response.json()
68
- score = result.get("score", "N/A")
69
- return f"βœ… Submitted! Score: {score}", pd.DataFrame(answers_payload)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  from dotenv import load_dotenv
6
 
7
  from langchain_core.messages import HumanMessage
8
+
9
+ from agent import build_graph # <-- our modified agent
10
 
11
  load_dotenv()
12
 
13
  # -------------------------- Constants --------------------------
14
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
15
 
16
+
17
  class BasicAgent:
18
+ """A langgraph agent that uses our `find_answer` graph."""
19
  def __init__(self):
20
  print("BasicAgent initialized.")
21
  self.graph = build_graph()
 
24
  print(f"Agent received question (first 50 chars): {question[:50]}...")
25
  messages = [HumanMessage(content=question)]
26
  result = self.graph.invoke({"messages": messages})
27
+ print(f"Graph result: {result}")
28
+ if not isinstance(result, dict):
29
+ return "Graph returned an unexpected result format."
30
+
31
  if "messages" in result:
32
+ answer = result["messages"][-1].content
33
+ return answer
34
+ else:
35
+ return f"Graph returned: {result} (missing 'messages')"
36
+
37
+
38
+ def run_and_submit_all(profile: gr.OAuthProfile | None):
39
+ """
40
+ Fetches all questions, runs the BasicAgent on them, submits all answers,
41
+ and displays the results.
42
+ """
43
+ space_id = os.getenv("SPACE_ID")
44
+ if profile:
45
+ username = f"{profile.username}"
46
+ print(f"User logged in: {username}")
47
+ else:
48
+ print("User not logged in.")
49
+ return "Please Login to Hugging Face with the button.", None
50
 
 
 
 
 
51
  api_url = DEFAULT_API_URL
52
  questions_url = f"{api_url}/questions"
53
  submit_url = f"{api_url}/submit"
54
 
55
+ # 1. Instantiate Agent
56
+ try:
57
+ agent = BasicAgent()
58
+ except Exception as e:
59
+ print(f"Error instantiating agent: {e}")
60
+ return f"Error initializing agent: {e}", None
61
 
62
+ agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
63
+ print(agent_code)
64
 
65
+ # 2. Fetch Questions
66
+ print(f"Fetching questions from: {questions_url}")
67
+ try:
68
+ response = requests.get(questions_url, timeout=15)
69
+ response.raise_for_status()
70
+ questions_data = response.json()
71
+ if not questions_data:
72
+ print("Fetched questions list is empty.")
73
+ return "Fetched questions list is empty or invalid format.", None
74
+ print(f"Fetched {len(questions_data)} questions.")
75
+ except requests.exceptions.RequestException as e:
76
+ print(f"Error fetching questions: {e}")
77
+ return f"Error fetching questions: {e}", None
78
+ except requests.exceptions.JSONDecodeError as e:
79
+ print(f"Error decoding JSON response from questions endpoint: {e}")
80
+ print(f"Response text: {response.text[:500]}")
81
+ return f"Error decoding server response for questions: {e}", None
82
+ except Exception as e:
83
+ print(f"An unexpected error occurred fetching questions: {e}")
84
+ return f"An unexpected error occurred fetching questions: {e}", None
85
 
86
+ # 3. Run your Agent on each question
87
+ results_log = []
88
  answers_payload = []
89
+ print(f"Running agent on {len(questions_data)} questions...")
90
  for item in questions_data:
91
+ task_id = item.get("task_id")
92
+ question_text = item.get("question")
93
+ if not task_id or question_text is None:
94
+ print(f"Skipping item with missing task_id or question: {item}")
95
+ continue
96
+ try:
 
97
  submitted_answer = agent(question_text)
98
+ answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
99
+ results_log.append({
100
+ "Task ID": task_id,
101
+ "Question": question_text,
102
+ "Submitted Answer": submitted_answer
103
+ })
104
+ except Exception as e:
105
+ print(f"Error running agent on task {task_id}: {e}")
106
+ results_log.append({
107
+ "Task ID": task_id,
108
+ "Question": question_text,
109
+ "Submitted Answer": f"AGENT ERROR: {e}"
110
+ })
111
 
112
+ if not answers_payload:
113
+ print("Agent did not produce any answers to submit.")
114
+ return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
115
 
116
+ # 4. Prepare Submission
117
+ submission_data = {
118
+ "username": username.strip(),
119
+ "agent_code": agent_code,
120
+ "answers": answers_payload
121
+ }
122
+ status_update = (
123
+ f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
124
  )
125
+ print(status_update)
126
+
127
+ # 5. Submit
128
+ print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
129
+ try:
130
+ response = requests.post(submit_url, json=submission_data, timeout=60)
131
+ response.raise_for_status()
132
+ result_data = response.json()
133
+ final_status = (
134
+ f"Submission Successful!\n"
135
+ f"User: {result_data.get('username')}\n"
136
+ f"Overall Score: {result_data.get('score', 'N/A')}% "
137
+ f"({result_data.get('correct_count', '?')}/"
138
+ f"{result_data.get('total_attempted', '?')} correct)\n"
139
+ f"Message: {result_data.get('message', 'No message received.')}"
140
+ )
141
+ print("Submission successful.")
142
+ results_df = pd.DataFrame(results_log)
143
+ return final_status, results_df
144
+ except requests.exceptions.HTTPError as e:
145
+ error_detail = f"Server responded with status {e.response.status_code}."
146
+ try:
147
+ error_json = e.response.json()
148
+ error_detail += f" Detail: {error_json.get('detail', e.response.text)}"
149
+ except requests.exceptions.JSONDecodeError:
150
+ error_detail += f" Response: {e.response.text[:500]}"
151
+ status_message = f"Submission Failed: {error_detail}"
152
+ print(status_message)
153
+ results_df = pd.DataFrame(results_log)
154
+ return status_message, results_df
155
+ except requests.exceptions.Timeout:
156
+ status_message = "Submission Failed: The request timed out."
157
+ print(status_message)
158
+ results_df = pd.DataFrame(results_log)
159
+ return status_message, results_df
160
+ except requests.exceptions.RequestException as e:
161
+ status_message = f"Submission Failed: Network error - {e}"
162
+ print(status_message)
163
+ results_df = pd.DataFrame(results_log)
164
+ return status_message, results_df
165
+ except Exception as e:
166
+ status_message = f"An unexpected error occurred during submission: {e}"
167
+ print(status_message)
168
+ results_df = pd.DataFrame(results_log)
169
+ return status_message, results_df
170
+
171
+
172
+ # ─── Build Gradio Interface ───────────────────────────────────────────────────
173
+
174
+ with gr.Blocks() as demo:
175
+ gr.Markdown("# Basic Agent Evaluation Runner")
176
+ gr.Markdown(
177
+ """
178
+ **Instructions:**
179
+ 1. Clone this Space, then modify the code to define your agent logic, tools, etc.
180
+ 2. Log in to your Hugging Face account using the button below.
181
+ 3. Click 'Run Evaluation & Submit All Answers'.
182
+ """
183
+ )
184
+
185
+ gr.LoginButton()
186
+
187
+ run_button = gr.Button("Run Evaluation & Submit All Answers")
188
+
189
+ status_output = gr.Textbox(label="Run Status / Submission Result", lines=5, interactive=False)
190
+ results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
191
+
192
+ run_button.click(
193
+ fn=run_and_submit_all,
194
+ outputs=[status_output, results_table]
195
+ )
196
+
197
+ if __name__ == "__main__":
198
+ print("\n" + "-" * 30 + " App Starting " + "-" * 30)
199
+ space_host_startup = os.getenv("SPACE_HOST")
200
+ space_id_startup = os.getenv("SPACE_ID")
201
+
202
+ if space_host_startup:
203
+ print(f"βœ… SPACE_HOST found: {space_host_startup}")
204
+ print(f" Runtime URL should be: https://{space_host_startup}.hf.space")
205
+ else:
206
+ print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
207
+
208
+ if space_id_startup:
209
+ print(f"βœ… SPACE_ID found: {space_id_startup}")
210
+ print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
211
+ print(f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main")
212
+ else:
213
+ print("ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined.")
214
+
215
+ print("-" * (60 + len(" App Starting ")) + "\n")
216
+ print("Launching Gradio Interface for Basic Agent Evaluation...")
217
+ demo.launch(debug=True, share=False)