Etqad Khan commited on
Commit
c1451a2
·
1 Parent(s): 81917a3

agents code

Browse files
Files changed (3) hide show
  1. .gitattributes +0 -35
  2. app.py +101 -29
  3. requirements.txt +23 -1
.gitattributes DELETED
@@ -1,35 +0,0 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app.py CHANGED
@@ -3,36 +3,55 @@ import gradio as gr
3
  import requests
4
  import inspect
5
  import pandas as pd
 
 
6
 
7
  # (Keep Constants as is)
8
  # --- Constants ---
9
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
10
 
11
- # --- Basic Agent Definition ---
12
  # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
13
- class BasicAgent:
14
  def __init__(self):
15
- print("BasicAgent initialized.")
 
 
 
16
  def __call__(self, question: str) -> str:
17
  print(f"Agent received question (first 50 chars): {question[:50]}...")
18
- fixed_answer = "This is a default answer."
19
- print(f"Agent returning fixed answer: {fixed_answer}")
20
- return fixed_answer
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
- def run_and_submit_all( profile: gr.OAuthProfile | None):
23
  """
24
- Fetches all questions, runs the BasicAgent on them, submits all answers,
25
  and displays the results.
26
  """
27
  # --- Determine HF Space Runtime URL and Repo URL ---
28
  space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
29
 
30
- if profile:
31
- username= f"{profile.username}"
32
- print(f"User logged in: {username}")
33
- else:
34
- print("User not logged in.")
35
- return "Please Login to Hugging Face with the button.", None
36
 
37
  api_url = DEFAULT_API_URL
38
  questions_url = f"{api_url}/questions"
@@ -40,15 +59,18 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
40
 
41
  # 1. Instantiate Agent ( modify this part to create your agent)
42
  try:
43
- agent = BasicAgent()
44
  except Exception as e:
45
  print(f"Error instantiating agent: {e}")
46
  return f"Error initializing agent: {e}", None
47
  # 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)
48
- agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
49
- print(agent_code)
 
 
 
50
 
51
- # 2. Fetch Questions
52
  print(f"Fetching questions from: {questions_url}")
53
  try:
54
  response = requests.get(questions_url, timeout=15)
@@ -58,6 +80,45 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
58
  print("Fetched questions list is empty.")
59
  return "Fetched questions list is empty or invalid format.", None
60
  print(f"Fetched {len(questions_data)} questions.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  except requests.exceptions.RequestException as e:
62
  print(f"Error fetching questions: {e}")
63
  return f"Error fetching questions: {e}", None
@@ -76,13 +137,24 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
76
  for item in questions_data:
77
  task_id = item.get("task_id")
78
  question_text = item.get("question")
 
 
79
  if not task_id or question_text is None:
80
  print(f"Skipping item with missing task_id or question: {item}")
81
  continue
 
 
 
 
 
 
 
82
  try:
83
- submitted_answer = agent(question_text)
 
84
  answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
85
  results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": submitted_answer})
 
86
  except Exception as e:
87
  print(f"Error running agent on task {task_id}: {e}")
88
  results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"AGENT ERROR: {e}"})
@@ -142,25 +214,24 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
142
 
143
  # --- Build Gradio Interface using Blocks ---
144
  with gr.Blocks() as demo:
145
- gr.Markdown("# Basic Agent Evaluation Runner")
146
  gr.Markdown(
147
  """
148
  **Instructions:**
149
 
150
- 1. Please clone this space, then modify the code to define your agent's logic, the tools, the necessary packages, etc ...
151
- 2. Log in to your Hugging Face account using the button below. This uses your HF username for submission.
152
- 3. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
153
 
154
  ---
155
- **Disclaimers:**
156
- 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).
157
- 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.
 
158
  """
159
  )
160
 
161
- gr.LoginButton()
162
-
163
- run_button = gr.Button("Run Evaluation & Submit All Answers")
164
 
165
  status_output = gr.Textbox(label="Run Status / Submission Result", lines=5, interactive=False)
166
  # Removed max_rows=10 from DataFrame constructor
@@ -168,6 +239,7 @@ with gr.Blocks() as demo:
168
 
169
  run_button.click(
170
  fn=run_and_submit_all,
 
171
  outputs=[status_output, results_table]
172
  )
173
 
 
3
  import requests
4
  import inspect
5
  import pandas as pd
6
+ from agent import build_graph
7
+ from langchain_core.messages import HumanMessage
8
 
9
  # (Keep Constants as is)
10
  # --- Constants ---
11
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
12
 
13
+ # --- Agent Definition ---
14
  # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
15
+ class GAIAAgent:
16
  def __init__(self):
17
+ print("GAIAAgent initialized - building LangGraph agent...")
18
+ self.graph = build_graph(provider="vertexai")
19
+ print("LangGraph agent built successfully.")
20
+
21
  def __call__(self, question: str) -> str:
22
  print(f"Agent received question (first 50 chars): {question[:50]}...")
23
+ try:
24
+ # Invoke the graph with the question
25
+ result = self.graph.invoke({"messages": [HumanMessage(content=question)]})
26
+
27
+ # Extract the final answer from the last message
28
+ messages = result.get("messages", [])
29
+ if messages:
30
+ last_message = messages[-1].content
31
+ # Look for FINAL ANSWER in the response
32
+ if "FINAL ANSWER:" in last_message:
33
+ answer = last_message.split("FINAL ANSWER:")[-1].strip()
34
+ else:
35
+ answer = last_message
36
+ print(f"Agent returning answer: {answer[:100]}...")
37
+ return answer
38
+ else:
39
+ return "No response generated"
40
+ except Exception as e:
41
+ print(f"Error running agent: {e}")
42
+ return f"Error: {str(e)}"
43
 
44
+ def run_and_submit_all():
45
  """
46
+ Fetches all questions, runs the GAIAAgent on them, submits all answers,
47
  and displays the results.
48
  """
49
  # --- Determine HF Space Runtime URL and Repo URL ---
50
  space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
51
 
52
+ # For local testing, use a default username
53
+ username = os.getenv("HF_USERNAME", "local_user")
54
+ print(f"Running as: {username}")
 
 
 
55
 
56
  api_url = DEFAULT_API_URL
57
  questions_url = f"{api_url}/questions"
 
59
 
60
  # 1. Instantiate Agent ( modify this part to create your agent)
61
  try:
62
+ agent = GAIAAgent()
63
  except Exception as e:
64
  print(f"Error instantiating agent: {e}")
65
  return f"Error initializing agent: {e}", None
66
  # 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)
67
+ if space_id:
68
+ agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
69
+ else:
70
+ agent_code = "local_development"
71
+ print(f"Agent code location: {agent_code}")
72
 
73
+ # 2. Fetch Questions and Download Associated Files
74
  print(f"Fetching questions from: {questions_url}")
75
  try:
76
  response = requests.get(questions_url, timeout=15)
 
80
  print("Fetched questions list is empty.")
81
  return "Fetched questions list is empty or invalid format.", None
82
  print(f"Fetched {len(questions_data)} questions.")
83
+
84
+ # Download files for questions that have them
85
+ files_url = f"{api_url}/files"
86
+ for item in questions_data:
87
+ task_id = item.get("task_id")
88
+ file_name = item.get("file_name", "")
89
+
90
+ if file_name: # If there's a file associated with this question
91
+ print(f"Downloading file for task {task_id}: {file_name}")
92
+ try:
93
+ file_response = requests.get(f"{files_url}/{task_id}", timeout=30)
94
+ file_response.raise_for_status()
95
+
96
+ # Determine file extension from content type or file_name
97
+ content_type = file_response.headers.get('content-type', '')
98
+ if not file_name:
99
+ if 'image' in content_type:
100
+ file_name = f"{task_id}.png"
101
+ elif 'audio' in content_type:
102
+ file_name = f"{task_id}.mp3"
103
+ elif 'excel' in content_type or 'spreadsheet' in content_type:
104
+ file_name = f"{task_id}.xlsx"
105
+ elif 'python' in content_type or 'text' in content_type:
106
+ file_name = f"{task_id}.py"
107
+ else:
108
+ file_name = f"{task_id}.bin"
109
+
110
+ # Save the file
111
+ with open(file_name, 'wb') as f:
112
+ f.write(file_response.content)
113
+
114
+ # Add file path to the item
115
+ item['file_path'] = file_name
116
+ print(f" Downloaded: {file_name} ({len(file_response.content)} bytes)")
117
+
118
+ except requests.exceptions.RequestException as e:
119
+ print(f" Error downloading file for {task_id}: {e}")
120
+ item['file_path'] = None
121
+
122
  except requests.exceptions.RequestException as e:
123
  print(f"Error fetching questions: {e}")
124
  return f"Error fetching questions: {e}", None
 
137
  for item in questions_data:
138
  task_id = item.get("task_id")
139
  question_text = item.get("question")
140
+ file_path = item.get("file_path", None)
141
+
142
  if not task_id or question_text is None:
143
  print(f"Skipping item with missing task_id or question: {item}")
144
  continue
145
+
146
+ # Add file path information to the question if a file exists
147
+ if file_path:
148
+ enhanced_question = f"{question_text}\n\nFile available at: {file_path}"
149
+ else:
150
+ enhanced_question = question_text
151
+
152
  try:
153
+ print(f"Processing task {task_id}...")
154
+ submitted_answer = agent(enhanced_question)
155
  answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
156
  results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": submitted_answer})
157
+ print(f" Answer: {submitted_answer[:100]}..." if len(submitted_answer) > 100 else f" Answer: {submitted_answer}")
158
  except Exception as e:
159
  print(f"Error running agent on task {task_id}: {e}")
160
  results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"AGENT ERROR: {e}"})
 
214
 
215
  # --- Build Gradio Interface using Blocks ---
216
  with gr.Blocks() as demo:
217
+ gr.Markdown("# GAIA Agent Evaluation Runner")
218
  gr.Markdown(
219
  """
220
  **Instructions:**
221
 
222
+ 1. Your agent is configured to use Google VertexAI Gemini model
223
+ 2. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
224
+ 3. Note: This can take some time as the agent processes all questions.
225
 
226
  ---
227
+ **Setup:**
228
+ - Model: Gemini 2.5 Pro (VertexAI)
229
+ - Tools: Wikipedia, Web Search (Tavily), ArXiv, Math operations
230
+ - Vector Store: ChromaDB (for similar question retrieval)
231
  """
232
  )
233
 
234
+ run_button = gr.Button("Run Evaluation & Submit All Answers", variant="primary")
 
 
235
 
236
  status_output = gr.Textbox(label="Run Status / Submission Result", lines=5, interactive=False)
237
  # Removed max_rows=10 from DataFrame constructor
 
239
 
240
  run_button.click(
241
  fn=run_and_submit_all,
242
+ inputs=[],
243
  outputs=[status_output, results_table]
244
  )
245
 
requirements.txt CHANGED
@@ -1,2 +1,24 @@
1
  gradio
2
- requests
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  gradio
2
+ requests
3
+ langchain
4
+ langchain-community
5
+ langchain-core
6
+ langchain-google-vertexai
7
+ langchain-huggingface
8
+ langchain-tavily
9
+ langchain-chroma
10
+ langgraph
11
+ huggingface_hub
12
+ sentence-transformers
13
+ arxiv
14
+ pymupdf
15
+ wikipedia
16
+ pgvector
17
+ python-dotenv
18
+ protobuf==3.20.*
19
+ chromadb
20
+ google-cloud-aiplatform
21
+ vertexai
22
+ pandas
23
+ pillow
24
+ openpyxl