Dhanushkumar commited on
Commit
5d41306
·
verified ·
1 Parent(s): 81917a3

Upload 9 files

Browse files
Files changed (9) hide show
  1. .env +4 -0
  2. agent.py +246 -0
  3. app.py +195 -195
  4. metadata.jsonl +0 -0
  5. requirements.txt +18 -2
  6. supabase_docs.csv +0 -0
  7. supabase_error_sort.txt +65 -0
  8. system_prompt.txt +28 -0
  9. trial.ipynb +0 -0
.env ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ SUPABASE_URL = https://kyeropjbpzxfcypbxqoi.supabase.co
2
+ SUPABASE_SERVICE_KEY = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imt5ZXJvcGpicHp4ZmN5cGJ4cW9pIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDg0ODYzNDEsImV4cCI6MjA2NDA2MjM0MX0._7ct7b36PILtOs4ycgPk1Tgk6dKNp2bbTjB-UBA3uGg
3
+ GEMINI_API_KEY = AIzaSyCA47F1nv1sF9_y5IYzu_nZM325ZnIXfKU
4
+ TAVILY_API_KEY = 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
agent.py ADDED
@@ -0,0 +1,246 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from dotenv import load_dotenv
3
+ from langgraph.graph import START, StateGraph, MessagesState
4
+ from langgraph.prebuilt import tools_condition
5
+ from langgraph.prebuilt import ToolNode
6
+ from langchain_google_genai import ChatGoogleGenerativeAI
7
+ from langchain_groq import ChatGroq
8
+ from langchain_huggingface import ChatHuggingFace, HuggingFaceEndpoint, HuggingFaceEmbeddings
9
+ from langchain_community.tools.tavily_search import TavilySearchResults
10
+ from langchain_community.document_loaders import WikipediaLoader
11
+ from langchain_community.document_loaders import ArxivLoader
12
+ from langchain_community.vectorstores import SupabaseVectorStore
13
+ from langchain_core.messages import SystemMessage, HumanMessage
14
+ from langchain_core.tools import tool
15
+ from langchain.tools.retriever import create_retriever_tool
16
+ from supabase.client import Client, create_client
17
+
18
+ load_dotenv()
19
+
20
+ @tool
21
+ def multiply(a: int, b: int) -> int:
22
+ """Multiply two numbers.
23
+
24
+ Args:
25
+ a: first int
26
+ b: second int
27
+ """
28
+ return a * b
29
+
30
+ @tool
31
+ def add(a: int, b: int) -> int:
32
+ """Add two numbers.
33
+
34
+ Args:
35
+ a: first int
36
+ b: second int
37
+ """
38
+ return a + b
39
+
40
+ @tool
41
+ def subtract(a: int, b: int) -> int:
42
+ """Subtract two numbers.
43
+
44
+ Args:
45
+ a: first int
46
+ b: second int
47
+ """
48
+ return a - b
49
+
50
+ @tool
51
+ def divide(a: int, b: int) -> int:
52
+ """Divide two numbers.
53
+
54
+ Args:
55
+ a: first int
56
+ b: second int
57
+ """
58
+ if b == 0:
59
+ raise ValueError("Cannot divide by zero.")
60
+ return a / b
61
+
62
+ @tool
63
+ def modulus(a: int, b: int) -> int:
64
+ """Get the modulus of two numbers.
65
+
66
+ Args:
67
+ a: first int
68
+ b: second int
69
+ """
70
+ return a % b
71
+
72
+ @tool
73
+ def wiki_search(query: str) -> str:
74
+ """Search Wikipedia for a query and return maximum 2 results.
75
+
76
+ Args:
77
+ query: The search query.
78
+ """
79
+ try:
80
+ search_docs = WikipediaLoader(query=query, load_max_docs=2).load()
81
+ formatted_search_docs = "\n\n---\n\n".join(
82
+ [
83
+ f'<Document source="{doc.metadata["source"]}" page="{doc.metadata.get("page", "")}"/>\n{doc.page_content}\n</Document>'
84
+ for doc in search_docs
85
+ ])
86
+ return formatted_search_docs
87
+ except Exception as e:
88
+ return f"Error searching Wikipedia: {str(e)}"
89
+
90
+ @tool
91
+ def web_search(query: str) -> str:
92
+ """Search the web using Tavily for a query and return maximum 3 results.
93
+
94
+ Args:
95
+ query: The search query.
96
+ """
97
+ try:
98
+ tavily_search = TavilySearchResults(max_results=3)
99
+ search_docs = tavily_search.invoke({"query": query})
100
+ formatted_search_docs = "\n\n---\n\n".join(
101
+ [
102
+ f'<Document source="{doc.get("url", "Unknown")}" title="{doc.get("title", "")}">\n{doc.get("content", "")}\n</Document>'
103
+ for doc in search_docs
104
+ ])
105
+ return formatted_search_docs
106
+ except Exception as e:
107
+ return f"Error searching web: {str(e)}"
108
+
109
+ @tool
110
+ def arxiv_search(query: str) -> str:
111
+ """Search Arxiv for a query and return maximum 3 results.
112
+
113
+ Args:
114
+ query: The search query.
115
+ """
116
+ try:
117
+ search_docs = ArxivLoader(query=query, load_max_docs=3).load()
118
+ formatted_search_docs = "\n\n---\n\n".join(
119
+ [
120
+ f'<Document source="{doc.metadata["source"]}" page="{doc.metadata.get("page", "")}"/>\n{doc.page_content[:1000]}\n</Document>'
121
+ for doc in search_docs
122
+ ])
123
+ return formatted_search_docs
124
+ except Exception as e:
125
+ return f"Error searching Arxiv: {str(e)}"
126
+
127
+ @tool
128
+ def similar_question_search(question: str) -> str:
129
+ """Search the vector database for similar questions and return the first 3 results.
130
+
131
+ Args:
132
+ question: the question human provided.
133
+ """
134
+ try:
135
+ matched_docs = vector_store.similarity_search(question, 3)
136
+ formatted_search_docs = "\n\n---\n\n".join(
137
+ [
138
+ f'<Document source="{doc.metadata["source"]}" page="{doc.metadata.get("page", "")}"/>\n{doc.page_content[:1000]}\n</Document>'
139
+ for doc in matched_docs
140
+ ])
141
+ return formatted_search_docs
142
+ except Exception as e:
143
+ return f"Error searching similar questions: {str(e)}"
144
+
145
+
146
+
147
+
148
+
149
+ # load the system prompt from the file
150
+ with open("system_prompt.txt", "r", encoding="utf-8") as f:
151
+ system_prompt = f.read()
152
+
153
+ # System message
154
+ sys_msg = SystemMessage(content=system_prompt)
155
+
156
+ # build a retriever
157
+ embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") # dim=768
158
+ supabase: Client = create_client(
159
+ os.environ.get("SUPABASE_URL"),
160
+ os.environ.get("SUPABASE_SERVICE_KEY"))
161
+ vector_store = SupabaseVectorStore(
162
+ client=supabase,
163
+ embedding= embeddings,
164
+ table_name="documents",
165
+ query_name="match_documents_langchain",
166
+ )
167
+ create_retriever_tool = create_retriever_tool(
168
+ retriever=vector_store.as_retriever(),
169
+ name="Question Search",
170
+ description="A tool to retrieve similar questions from a vector store.",
171
+ )
172
+
173
+
174
+
175
+ tools = [
176
+ multiply,
177
+ add,
178
+ subtract,
179
+ divide,
180
+ modulus,
181
+ wiki_search,
182
+ web_search,
183
+ arxiv_search,
184
+ ]
185
+
186
+ # Build graph function
187
+ def build_graph(provider: str = "groq"):
188
+ """Build the graph"""
189
+ # Load environment variables from .env file
190
+ if provider == "google":
191
+ # Google Gemini
192
+ llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash", temperature=0)
193
+ elif provider == "groq":
194
+ # Groq https://console.groq.com/docs/models
195
+ llm = ChatGroq(model="qwen-qwq-32b", temperature=0) # optional : qwen-qwq-32b gemma2-9b-it
196
+ elif provider == "huggingface":
197
+ # TODO: Add huggingface endpoint
198
+ llm = ChatHuggingFace(
199
+ llm=HuggingFaceEndpoint(
200
+ url="https://api-inference.huggingface.co/models/Meta-DeepLearning/llama-2-7b-chat-hf",
201
+ temperature=0,
202
+ ),
203
+ )
204
+ else:
205
+ raise ValueError("Invalid provider. Choose 'google', 'groq' or 'huggingface'.")
206
+ # Bind tools to LLM
207
+ llm_with_tools = llm.bind_tools(tools)
208
+
209
+ # Node
210
+ def assistant(state: MessagesState):
211
+ """Assistant node"""
212
+ return {"messages": [llm_with_tools.invoke(state["messages"])]}
213
+
214
+ def retriever(state: MessagesState):
215
+ """Retriever node"""
216
+ similar_question = vector_store.similarity_search(state["messages"][0].content)
217
+ example_msg = HumanMessage(
218
+ content=f"Here I provide a similar question and answer for reference: \n\n{similar_question[0].page_content}",
219
+ )
220
+ return {"messages": [sys_msg] + state["messages"] + [example_msg]}
221
+
222
+ builder = StateGraph(MessagesState)
223
+ builder.add_node("retriever", retriever)
224
+ builder.add_node("assistant", assistant)
225
+ builder.add_node("tools", ToolNode(tools))
226
+ builder.add_edge(START, "retriever")
227
+ builder.add_edge("retriever", "assistant")
228
+ builder.add_conditional_edges(
229
+ "assistant",
230
+ tools_condition,
231
+ )
232
+ builder.add_edge("tools", "assistant")
233
+
234
+ # Compile graph
235
+ return builder.compile()
236
+
237
+ # test
238
+ if __name__ == "__main__":
239
+ question = "When was a picture of St. Thomas Aquinas first added to the Wikipedia page on the Principle of double effect?"
240
+ # Build the graph
241
+ graph = build_graph(provider="groq")
242
+ # Run the graph
243
+ messages = [HumanMessage(content=question)]
244
+ messages = graph.invoke({"messages": messages})
245
+ for m in messages["messages"]:
246
+ m.pretty_print()
app.py CHANGED
@@ -1,196 +1,196 @@
1
- import os
2
- 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"
39
- submit_url = f"{api_url}/submit"
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)
55
- response.raise_for_status()
56
- questions_data = response.json()
57
- if not questions_data:
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
64
- except requests.exceptions.JSONDecodeError as e:
65
- print(f"Error decoding JSON response from questions endpoint: {e}")
66
- print(f"Response text: {response.text[:500]}")
67
- return f"Error decoding server response for questions: {e}", None
68
- except Exception as e:
69
- print(f"An unexpected error occurred fetching questions: {e}")
70
- return f"An unexpected error occurred fetching questions: {e}", None
71
-
72
- # 3. Run your Agent
73
- results_log = []
74
- answers_payload = []
75
- print(f"Running agent on {len(questions_data)} questions...")
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}"})
89
-
90
- if not answers_payload:
91
- print("Agent did not produce any answers to submit.")
92
- return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
93
-
94
- # 4. Prepare Submission
95
- submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
96
- status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
97
- print(status_update)
98
-
99
- # 5. Submit
100
- print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
101
- try:
102
- response = requests.post(submit_url, json=submission_data, timeout=60)
103
- response.raise_for_status()
104
- result_data = response.json()
105
- final_status = (
106
- f"Submission Successful!\n"
107
- f"User: {result_data.get('username')}\n"
108
- f"Overall Score: {result_data.get('score', 'N/A')}% "
109
- f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n"
110
- f"Message: {result_data.get('message', 'No message received.')}"
111
- )
112
- print("Submission successful.")
113
- results_df = pd.DataFrame(results_log)
114
- return final_status, results_df
115
- except requests.exceptions.HTTPError as e:
116
- error_detail = f"Server responded with status {e.response.status_code}."
117
- try:
118
- error_json = e.response.json()
119
- error_detail += f" Detail: {error_json.get('detail', e.response.text)}"
120
- except requests.exceptions.JSONDecodeError:
121
- error_detail += f" Response: {e.response.text[:500]}"
122
- status_message = f"Submission Failed: {error_detail}"
123
- print(status_message)
124
- results_df = pd.DataFrame(results_log)
125
- return status_message, results_df
126
- except requests.exceptions.Timeout:
127
- status_message = "Submission Failed: The request timed out."
128
- print(status_message)
129
- results_df = pd.DataFrame(results_log)
130
- return status_message, results_df
131
- except requests.exceptions.RequestException as e:
132
- status_message = f"Submission Failed: Network error - {e}"
133
- print(status_message)
134
- results_df = pd.DataFrame(results_log)
135
- return status_message, results_df
136
- except Exception as e:
137
- status_message = f"An unexpected error occurred during submission: {e}"
138
- print(status_message)
139
- results_df = pd.DataFrame(results_log)
140
- return status_message, results_df
141
-
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
167
- results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
168
-
169
- run_button.click(
170
- fn=run_and_submit_all,
171
- outputs=[status_output, results_table]
172
- )
173
-
174
- if __name__ == "__main__":
175
- print("\n" + "-"*30 + " App Starting " + "-"*30)
176
- # Check for SPACE_HOST and SPACE_ID at startup for information
177
- space_host_startup = os.getenv("SPACE_HOST")
178
- space_id_startup = os.getenv("SPACE_ID") # Get SPACE_ID at startup
179
-
180
- if space_host_startup:
181
- print(f"✅ SPACE_HOST found: {space_host_startup}")
182
- print(f" Runtime URL should be: https://{space_host_startup}.hf.space")
183
- else:
184
- print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
185
-
186
- if space_id_startup: # Print repo URLs if SPACE_ID is found
187
- print(f"✅ SPACE_ID found: {space_id_startup}")
188
- print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
189
- print(f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main")
190
- else:
191
- print("ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined.")
192
-
193
- print("-"*(60 + len(" App Starting ")) + "\n")
194
-
195
- print("Launching Gradio Interface for Basic Agent Evaluation...")
196
  demo.launch(debug=True, share=False)
 
1
+ import os
2
+ import gradio as gr
3
+ import requests
4
+ import inspect
5
+ import pandas as pd
6
+ from agent import build_agent
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"
39
+ submit_url = f"{api_url}/submit"
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)
55
+ response.raise_for_status()
56
+ questions_data = response.json()
57
+ if not questions_data:
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
64
+ except requests.exceptions.JSONDecodeError as e:
65
+ print(f"Error decoding JSON response from questions endpoint: {e}")
66
+ print(f"Response text: {response.text[:500]}")
67
+ return f"Error decoding server response for questions: {e}", None
68
+ except Exception as e:
69
+ print(f"An unexpected error occurred fetching questions: {e}")
70
+ return f"An unexpected error occurred fetching questions: {e}", None
71
+
72
+ # 3. Run your Agent
73
+ results_log = []
74
+ answers_payload = []
75
+ print(f"Running agent on {len(questions_data)} questions...")
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}"})
89
+
90
+ if not answers_payload:
91
+ print("Agent did not produce any answers to submit.")
92
+ return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
93
+
94
+ # 4. Prepare Submission
95
+ submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
96
+ status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
97
+ print(status_update)
98
+
99
+ # 5. Submit
100
+ print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
101
+ try:
102
+ response = requests.post(submit_url, json=submission_data, timeout=60)
103
+ response.raise_for_status()
104
+ result_data = response.json()
105
+ final_status = (
106
+ f"Submission Successful!\n"
107
+ f"User: {result_data.get('username')}\n"
108
+ f"Overall Score: {result_data.get('score', 'N/A')}% "
109
+ f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n"
110
+ f"Message: {result_data.get('message', 'No message received.')}"
111
+ )
112
+ print("Submission successful.")
113
+ results_df = pd.DataFrame(results_log)
114
+ return final_status, results_df
115
+ except requests.exceptions.HTTPError as e:
116
+ error_detail = f"Server responded with status {e.response.status_code}."
117
+ try:
118
+ error_json = e.response.json()
119
+ error_detail += f" Detail: {error_json.get('detail', e.response.text)}"
120
+ except requests.exceptions.JSONDecodeError:
121
+ error_detail += f" Response: {e.response.text[:500]}"
122
+ status_message = f"Submission Failed: {error_detail}"
123
+ print(status_message)
124
+ results_df = pd.DataFrame(results_log)
125
+ return status_message, results_df
126
+ except requests.exceptions.Timeout:
127
+ status_message = "Submission Failed: The request timed out."
128
+ print(status_message)
129
+ results_df = pd.DataFrame(results_log)
130
+ return status_message, results_df
131
+ except requests.exceptions.RequestException as e:
132
+ status_message = f"Submission Failed: Network error - {e}"
133
+ print(status_message)
134
+ results_df = pd.DataFrame(results_log)
135
+ return status_message, results_df
136
+ except Exception as e:
137
+ status_message = f"An unexpected error occurred during submission: {e}"
138
+ print(status_message)
139
+ results_df = pd.DataFrame(results_log)
140
+ return status_message, results_df
141
+
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
167
+ results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
168
+
169
+ run_button.click(
170
+ fn=run_and_submit_all,
171
+ outputs=[status_output, results_table]
172
+ )
173
+
174
+ if __name__ == "__main__":
175
+ print("\n" + "-"*30 + " App Starting " + "-"*30)
176
+ # Check for SPACE_HOST and SPACE_ID at startup for information
177
+ space_host_startup = os.getenv("SPACE_HOST")
178
+ space_id_startup = os.getenv("SPACE_ID") # Get SPACE_ID at startup
179
+
180
+ if space_host_startup:
181
+ print(f"✅ SPACE_HOST found: {space_host_startup}")
182
+ print(f" Runtime URL should be: https://{space_host_startup}.hf.space")
183
+ else:
184
+ print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
185
+
186
+ if space_id_startup: # Print repo URLs if SPACE_ID is found
187
+ print(f"✅ SPACE_ID found: {space_id_startup}")
188
+ print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
189
+ print(f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main")
190
+ else:
191
+ print("ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined.")
192
+
193
+ print("-"*(60 + len(" App Starting ")) + "\n")
194
+
195
+ print("Launching Gradio Interface for Basic Agent Evaluation...")
196
  demo.launch(debug=True, share=False)
metadata.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
requirements.txt CHANGED
@@ -1,2 +1,18 @@
1
- gradio
2
- requests
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ gradio
2
+ requests
3
+ langchain
4
+ langchain-community
5
+ langchain-core
6
+ langchain-google-genai
7
+ langchain-huggingface
8
+ langchain-groq
9
+ langchain-tavily
10
+ langchain-chroma
11
+ langgraph
12
+ huggingface_hub
13
+ supabase
14
+ arxiv
15
+ pymupdf
16
+ wikipedia
17
+ pgvector
18
+ python-dotenv
supabase_docs.csv ADDED
The diff for this file is too large to render. See raw diff
 
supabase_error_sort.txt ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ create extension if not exists vector;
2
+ Fix: Allow Insert Access via Row-Level Security Policy
3
+ 🔹 Step 1: Go to Supabase Dashboard
4
+ Open your Supabase project.
5
+
6
+ Click on Database → Tables → Select your table (e.g., documents).
7
+
8
+ 🔹 Step 2: Turn ON RLS (if not already)
9
+ Go to "Row Level Security" tab. If RLS is enabled, you’ll need to define a policy to allow inserts.
10
+
11
+ 🔹 Step 3: Create a Policy to Allow Insert
12
+ Option 1: Allow Full Access to Everyone (for dev/test)
13
+ Click "New Policy", then:
14
+
15
+ Name: Allow Insert
16
+
17
+ Action: INSERT
18
+
19
+ Using Expression: true
20
+
21
+ With Check: true
22
+
23
+ Or run this SQL in the SQL Editor:
24
+
25
+ sql
26
+ Copy
27
+ Edit
28
+ -- Allow all users to insert
29
+ create policy "Allow all inserts"
30
+ on documents
31
+ for insert
32
+ using (true)
33
+ with check (true);
34
+ ⚠️ Warning: This allows anyone to insert rows. Use carefully in production.
35
+
36
+ ✅ (Optional) Turn Off RLS for Development
37
+ You can also disable RLS (not recommended for production):
38
+
39
+ sql
40
+ Copy
41
+ Edit
42
+ alter table documents disable row level security;
43
+
44
+
45
+ create or replace function match_documents_langchain(query_embedding vector(1536), match_count int default null)
46
+ returns table (
47
+ id bigint,
48
+ content text,
49
+ metadata jsonb,
50
+ embedding vector,
51
+ similarity float
52
+ )
53
+ language sql
54
+ stable
55
+ as $$
56
+ select
57
+ id,
58
+ content,
59
+ metadata,
60
+ embedding,
61
+ 1 - (embedding <=> query_embedding) as similarity
62
+ from documents
63
+ order by embedding <=> query_embedding
64
+ limit coalesce(match_count, 5);
65
+ $$;
system_prompt.txt ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ You are a helpful assistant tasked with answering questions using a set of tools.
3
+ If the tool is not available, you can try to find the information online. You can also use your own knowledge to answer the question.
4
+ You need to provide a step-by-step explanation of how you arrived at the answer.
5
+ ==========================
6
+ Here is a few examples showing you how to answer the question step by step.
7
+
8
+ Question 1: In the 2015 Metropolitan Museum of Art exhibition titled after the Chinese zodiac animal of 2015, how many of the "twelve animals of the Chinese zodiac" have a hand visible?
9
+ Steps:
10
+ 1. Search "2015 Chinese zodiac animal" on Google search.
11
+ 2. Note the animal (ram).
12
+ 3. Search "Metropolitan Museum of Art" on Google search.
13
+ 4. Open the Metropolitan Museum of Art website.
14
+ 5. Click "Exhibitions" under "Exhibitions and Events"
15
+ 6. Click "Past".
16
+ 7. Set the year to 2015.
17
+ 8. Scroll to find the exhibit mentioning rams and click "Celebration of the Year of the Ram".
18
+ 9. Click "View All Objects".
19
+ 10. Click "Twelve animals of the Chinese zodiac" to open the image.
20
+ 11. Count how many have a visible hand.
21
+ Tools:
22
+ 1. Web browser
23
+ 2. Search engine
24
+ 3. Image recognition tools
25
+ Final Answer: 11
26
+
27
+ ==========================
28
+ Now, please answer the following question step by step.
trial.ipynb ADDED
The diff for this file is too large to render. See raw diff