GT5557 commited on
Commit
63f5fb3
·
verified ·
1 Parent(s): f0e93b6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +74 -47
app.py CHANGED
@@ -1,7 +1,7 @@
1
- # ===========================
2
- # FINAL app.py
3
- # Live Logs + Tool Tracking
4
- # ===========================
5
 
6
  import os
7
  import sys
@@ -18,10 +18,11 @@ from agent import (
18
  extract_final_answer,
19
  extract_tools_used,
20
  classify_question,
 
21
  )
22
 
23
  # ==========================================================
24
- # LIVE LOGS
25
  # ==========================================================
26
 
27
  sys.stdout.reconfigure(line_buffering=True)
@@ -35,13 +36,19 @@ DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
35
  TIMEOUTS = {
36
  "simple": 20,
37
  "medium": 35,
38
- "hard": 55
39
  }
40
 
41
  PAUSE = {
42
  "simple": 0.5,
43
- "medium": 1,
44
- "hard": 1.5
 
 
 
 
 
 
45
  }
46
 
47
  # ==========================================================
@@ -52,7 +59,7 @@ def log(msg):
52
  print(msg, flush=True)
53
 
54
  # ==========================================================
55
- # TIMEOUT THREAD
56
  # ==========================================================
57
 
58
  def run_with_timeout(fn, timeout_seconds):
@@ -93,18 +100,22 @@ class BenchmarkAgent:
93
  log("Agent ready.")
94
 
95
  def __call__(self, question: str):
 
 
 
96
  result = self.graph.invoke(
97
  {"messages": [HumanMessage(content=question)]},
98
- {"recursion_limit": 4}
99
  )
100
 
101
  answer = extract_final_answer(result)
102
  tools = extract_tools_used(result)
 
103
 
104
  if not answer:
105
  answer = "N/A"
106
 
107
- return answer, tools
108
 
109
  # ==========================================================
110
  # HELPERS
@@ -140,7 +151,7 @@ def sort_questions(items):
140
  )
141
 
142
  # ==========================================================
143
- # MAIN RUN
144
  # ==========================================================
145
 
146
  def run_and_submit_all(profile: gr.OAuthProfile | None):
@@ -162,10 +173,10 @@ def run_and_submit_all(profile: gr.OAuthProfile | None):
162
  f"{space_id}/tree/main"
163
  )
164
 
165
- log("=" * 70)
166
  log(f"User: {username}")
167
- log("Starting benchmark...")
168
- log("=" * 70)
169
 
170
  # ------------------------------------------------------
171
  # INIT
@@ -177,7 +188,7 @@ def run_and_submit_all(profile: gr.OAuthProfile | None):
177
  return f"Agent init failed: {e}", None
178
 
179
  # ------------------------------------------------------
180
- # QUESTIONS
181
  # ------------------------------------------------------
182
 
183
  try:
@@ -206,19 +217,22 @@ def run_and_submit_all(profile: gr.OAuthProfile | None):
206
 
207
  difficulty = classify_question(question)
208
  timeout = TIMEOUTS[difficulty]
 
209
 
210
- log("\n" + "-" * 70)
211
- log(f"Question {idx}/{total}")
212
- log(f"Task ID : {task_id}")
213
- log(f"Difficulty : {difficulty.upper()}")
214
- log(f"Timeout : {timeout}s")
215
- log(f"Q: {question[:160]}")
216
- log("-" * 70)
 
217
 
218
  start = time.time()
219
 
220
  submitted_answer = "N/A"
221
  tools_used = []
 
222
  status = "UNKNOWN"
223
 
224
  try:
@@ -236,15 +250,12 @@ def run_and_submit_all(profile: gr.OAuthProfile | None):
236
  )
237
 
238
  if did_timeout:
239
- status = f"TIMEOUT ({elapsed}s)"
240
  timeout_count += 1
 
241
  submitted_answer = "N/A"
242
 
243
  else:
244
- submitted_answer, tools_used = result
245
-
246
- if not submitted_answer:
247
- submitted_answer = "N/A"
248
 
249
  if submitted_answer != "N/A":
250
  answered += 1
@@ -261,11 +272,26 @@ def run_and_submit_all(profile: gr.OAuthProfile | None):
261
  status = f"ERROR ({elapsed}s)"
262
  submitted_answer = "N/A"
263
 
264
- log(f"Error: {e}")
 
 
 
 
265
 
266
- log(f"Tools Used : {', '.join(tools_used) if tools_used else 'None'}")
267
- log(f"Answer : {submitted_answer}")
268
- log(f"Status : {status}")
 
 
 
 
 
 
 
 
 
 
 
269
 
270
  answers.append({
271
  "task_id": task_id,
@@ -276,10 +302,13 @@ def run_and_submit_all(profile: gr.OAuthProfile | None):
276
  "No": idx,
277
  "Task ID": task_id,
278
  "Difficulty": difficulty.upper(),
 
 
 
279
  "Tools Used": ", ".join(tools_used),
280
  "Submitted Answer": submitted_answer,
281
  "Status": status,
282
- "Question": question[:120]
283
  })
284
 
285
  time.sleep(PAUSE[difficulty])
@@ -291,11 +320,8 @@ def run_and_submit_all(profile: gr.OAuthProfile | None):
291
  df = pd.DataFrame(logs)
292
 
293
  try:
294
- df.to_csv(
295
- "last_run_results.csv",
296
- index=False
297
- )
298
- log("Saved CSV results.")
299
  except Exception:
300
  pass
301
 
@@ -328,9 +354,9 @@ def run_and_submit_all(profile: gr.OAuthProfile | None):
328
  f"{result.get('message','')}"
329
  )
330
 
331
- log("=" * 70)
332
  log(final_status)
333
- log("=" * 70)
334
 
335
  return final_status, df
336
 
@@ -349,18 +375,19 @@ def run_and_submit_all(profile: gr.OAuthProfile | None):
349
  # ==========================================================
350
 
351
  with gr.Blocks() as demo:
352
- gr.Markdown("# Benchmark Agent")
353
 
354
  gr.Markdown(
355
  """
356
  ### Features
357
 
358
- - Exact-match benchmark mode
359
- - Live progress logs
360
- - Tool tracking per question
361
- - Fast timeout strategy
 
 
362
  - Auto submit
363
- - CSV saved
364
  """
365
  )
366
 
@@ -378,7 +405,7 @@ with gr.Blocks() as demo:
378
  )
379
 
380
  table = gr.DataFrame(
381
- label="Per Question Analysis",
382
  wrap=True
383
  )
384
 
 
1
+ # ==========================================================
2
+ # UPDATED app.py
3
+ # Observability + Model Logs + Adaptive Recursion
4
+ # ==========================================================
5
 
6
  import os
7
  import sys
 
18
  extract_final_answer,
19
  extract_tools_used,
20
  classify_question,
21
+ get_last_trace,
22
  )
23
 
24
  # ==========================================================
25
+ # LIVE LOGGING
26
  # ==========================================================
27
 
28
  sys.stdout.reconfigure(line_buffering=True)
 
36
  TIMEOUTS = {
37
  "simple": 20,
38
  "medium": 35,
39
+ "hard": 55,
40
  }
41
 
42
  PAUSE = {
43
  "simple": 0.5,
44
+ "medium": 1.0,
45
+ "hard": 1.5,
46
+ }
47
+
48
+ RECURSION_LIMITS = {
49
+ "simple": 6,
50
+ "medium": 10,
51
+ "hard": 14,
52
  }
53
 
54
  # ==========================================================
 
59
  print(msg, flush=True)
60
 
61
  # ==========================================================
62
+ # THREAD TIMEOUT
63
  # ==========================================================
64
 
65
  def run_with_timeout(fn, timeout_seconds):
 
100
  log("Agent ready.")
101
 
102
  def __call__(self, question: str):
103
+ difficulty = classify_question(question)
104
+ recursion_limit = RECURSION_LIMITS[difficulty]
105
+
106
  result = self.graph.invoke(
107
  {"messages": [HumanMessage(content=question)]},
108
+ {"recursion_limit": recursion_limit}
109
  )
110
 
111
  answer = extract_final_answer(result)
112
  tools = extract_tools_used(result)
113
+ trace = get_last_trace()
114
 
115
  if not answer:
116
  answer = "N/A"
117
 
118
+ return answer, tools, trace
119
 
120
  # ==========================================================
121
  # HELPERS
 
151
  )
152
 
153
  # ==========================================================
154
+ # MAIN RUNNER
155
  # ==========================================================
156
 
157
  def run_and_submit_all(profile: gr.OAuthProfile | None):
 
173
  f"{space_id}/tree/main"
174
  )
175
 
176
+ log("=" * 80)
177
  log(f"User: {username}")
178
+ log("Starting benchmark run...")
179
+ log("=" * 80)
180
 
181
  # ------------------------------------------------------
182
  # INIT
 
188
  return f"Agent init failed: {e}", None
189
 
190
  # ------------------------------------------------------
191
+ # FETCH QUESTIONS
192
  # ------------------------------------------------------
193
 
194
  try:
 
217
 
218
  difficulty = classify_question(question)
219
  timeout = TIMEOUTS[difficulty]
220
+ recursion_limit = RECURSION_LIMITS[difficulty]
221
 
222
+ log("\n" + "-" * 80)
223
+ log(f"Question : {idx}/{total}")
224
+ log(f"Task ID : {task_id}")
225
+ log(f"Difficulty : {difficulty.upper()}")
226
+ log(f"Timeout : {timeout}s")
227
+ log(f"Recursion : {recursion_limit}")
228
+ log(f"Question Text : {question[:180]}")
229
+ log("-" * 80)
230
 
231
  start = time.time()
232
 
233
  submitted_answer = "N/A"
234
  tools_used = []
235
+ trace = {}
236
  status = "UNKNOWN"
237
 
238
  try:
 
250
  )
251
 
252
  if did_timeout:
 
253
  timeout_count += 1
254
+ status = f"TIMEOUT ({elapsed}s)"
255
  submitted_answer = "N/A"
256
 
257
  else:
258
+ submitted_answer, tools_used, trace = result
 
 
 
259
 
260
  if submitted_answer != "N/A":
261
  answered += 1
 
272
  status = f"ERROR ({elapsed}s)"
273
  submitted_answer = "N/A"
274
 
275
+ trace = {
276
+ "model": "N/A",
277
+ "fallback": "N/A",
278
+ "model_error": str(e)
279
+ }
280
 
281
+ # --------------------------------------------------
282
+ # LOG DETAILS
283
+ # --------------------------------------------------
284
+
285
+ log(f"Model Used : {trace.get('model','N/A')}")
286
+ log(f"Fallback Used : {trace.get('fallback','N/A')}")
287
+ log(f"Model Error : {trace.get('model_error','None')}")
288
+ log(f"Tools Used : {', '.join(tools_used) if tools_used else 'None'}")
289
+ log(f"Answer : {submitted_answer}")
290
+ log(f"Status : {status}")
291
+
292
+ # --------------------------------------------------
293
+ # STORE
294
+ # --------------------------------------------------
295
 
296
  answers.append({
297
  "task_id": task_id,
 
302
  "No": idx,
303
  "Task ID": task_id,
304
  "Difficulty": difficulty.upper(),
305
+ "Model Used": trace.get("model", "N/A"),
306
+ "Fallback": trace.get("fallback", "N/A"),
307
+ "Model Error": trace.get("model_error", "None"),
308
  "Tools Used": ", ".join(tools_used),
309
  "Submitted Answer": submitted_answer,
310
  "Status": status,
311
+ "Question": question[:140]
312
  })
313
 
314
  time.sleep(PAUSE[difficulty])
 
320
  df = pd.DataFrame(logs)
321
 
322
  try:
323
+ df.to_csv("last_run_results.csv", index=False)
324
+ log("Saved results CSV.")
 
 
 
325
  except Exception:
326
  pass
327
 
 
354
  f"{result.get('message','')}"
355
  )
356
 
357
+ log("=" * 80)
358
  log(final_status)
359
+ log("=" * 80)
360
 
361
  return final_status, df
362
 
 
375
  # ==========================================================
376
 
377
  with gr.Blocks() as demo:
378
+ gr.Markdown("# Benchmark Agent - Observability Mode")
379
 
380
  gr.Markdown(
381
  """
382
  ### Features
383
 
384
+ - Adaptive recursion limits
385
+ - Logs selected model per question
386
+ - Logs fallback model usage
387
+ - Logs rate/model errors
388
+ - Logs tools used
389
+ - CSV export
390
  - Auto submit
 
391
  """
392
  )
393
 
 
405
  )
406
 
407
  table = gr.DataFrame(
408
+ label="Per Question Analytics",
409
  wrap=True
410
  )
411