AGiorni commited on
Commit
9332d1a
·
1 Parent(s): 45b9751
.gitignore CHANGED
@@ -0,0 +1 @@
 
 
1
+ cca530fc-4052-43b2-b130-b30968d8aa44.png
__pycache__/main_agent.cpython-313.pyc CHANGED
Binary files a/__pycache__/main_agent.cpython-313.pyc and b/__pycache__/main_agent.cpython-313.pyc differ
 
__pycache__/prompts_lib.cpython-313.pyc CHANGED
Binary files a/__pycache__/prompts_lib.cpython-313.pyc and b/__pycache__/prompts_lib.cpython-313.pyc differ
 
__pycache__/tools.cpython-313.pyc CHANGED
Binary files a/__pycache__/tools.cpython-313.pyc and b/__pycache__/tools.cpython-313.pyc differ
 
app.py CHANGED
@@ -1,44 +1,41 @@
 
1
  import os
 
 
 
2
  import gradio as gr
3
- import requests
4
- import inspect
5
  import pandas as pd
 
6
 
7
- import prompts_lib
8
- import main_agent
9
 
10
  # (Keep Constants as is)
11
  # --- Constants ---
12
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
13
 
 
14
  # --- Basic Agent Definition ---
15
  # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
16
- class BasicAgent:
17
- def __init__(self):
18
- pass
19
- def __call__(self, question: str) -> str:
20
- print(f"Agent received question (first 50 chars): {question[:50]}...")
21
-
22
- message = prompts_lib.system_prompt2 + question
23
 
24
- response = main_agent.agent.invoke({'messages': message})
25
 
26
- answer = response.get('messages')[-1].content
 
 
 
 
27
 
28
- # fixed_answer = "This is a default answer."
29
- print(f"Agent returning answer: {answer}")
30
- return answer
31
 
32
- def run_and_submit_all( profile: gr.OAuthProfile | None):
33
- """
34
- Fetches all questions, runs the BasicAgent on them, submits all answers,
35
- and displays the results.
36
  """
37
  # --- Determine HF Space Runtime URL and Repo URL ---
38
  space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
 
39
 
40
  if profile:
41
- username= f"{profile.username}"
42
  print(f"User logged in: {username}")
43
  else:
44
  print("User not logged in.")
@@ -47,14 +44,15 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
47
  api_url = DEFAULT_API_URL
48
  questions_url = f"{api_url}/questions"
49
  submit_url = f"{api_url}/submit"
 
50
 
51
  # 1. Instantiate Agent ( modify this part to create your agent)
52
  try:
53
- agent = BasicAgent()
54
  except Exception as e:
55
  print(f"Error instantiating agent: {e}")
56
  return f"Error initializing agent: {e}", None
57
- # 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)
58
  agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
59
  print(agent_code)
60
 
@@ -65,16 +63,16 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
65
  response.raise_for_status()
66
  questions_data = response.json()
67
  if not questions_data:
68
- print("Fetched questions list is empty.")
69
- return "Fetched questions list is empty or invalid format.", None
70
  print(f"Fetched {len(questions_data)} questions.")
71
  except requests.exceptions.RequestException as e:
72
  print(f"Error fetching questions: {e}")
73
  return f"Error fetching questions: {e}", None
74
  except requests.exceptions.JSONDecodeError as e:
75
- print(f"Error decoding JSON response from questions endpoint: {e}")
76
- print(f"Response text: {response.text[:500]}")
77
- return f"Error decoding server response for questions: {e}", None
78
  except Exception as e:
79
  print(f"An unexpected error occurred fetching questions: {e}")
80
  return f"An unexpected error occurred fetching questions: {e}", None
@@ -90,19 +88,70 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
90
  print(f"Skipping item with missing task_id or question: {item}")
91
  continue
92
  try:
93
- submitted_answer = agent(question_text)
94
- answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
95
- results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": submitted_answer})
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  except Exception as e:
97
- print(f"Error running agent on task {task_id}: {e}")
98
- results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"AGENT ERROR: {e}"})
 
 
 
 
 
 
99
 
100
  if not answers_payload:
101
  print("Agent did not produce any answers to submit.")
102
  return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
103
 
104
- # 4. Prepare Submission
105
- submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
 
 
 
 
106
  status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
107
  print(status_update)
108
 
@@ -157,14 +206,12 @@ with gr.Blocks() as demo:
157
  """
158
  **Instructions:**
159
 
160
- 1. Please clone this space, then modify the code to define your agent's logic, the tools, the necessary packages, etc ...
161
- 2. Log in to your Hugging Face account using the button below. This uses your HF username for submission.
162
- 3. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
163
 
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
 
@@ -172,20 +219,18 @@ with gr.Blocks() as demo:
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}")
@@ -193,14 +238,18 @@ if __name__ == "__main__":
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 inspect
2
  import os
3
+ import tempfile
4
+ from typing import Any, Optional, Tuple
5
+
6
  import gradio as gr
 
 
7
  import pandas as pd
8
+ import requests
9
 
10
+ from main_agent import Agent
 
11
 
12
  # (Keep Constants as is)
13
  # --- Constants ---
14
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
15
 
16
+
17
  # --- Basic Agent Definition ---
18
  # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
 
 
 
 
 
 
 
19
 
 
20
 
21
+ def run_and_submit_all(
22
+ profile: Optional[gr.OAuthProfile],
23
+ ) -> Tuple[str, Optional[pd.DataFrame]]:
24
+ """
25
+ Fetches all questions, runs the Agent on them, submits all answers, and displays the results.
26
 
27
+ Args:
28
+ profile (Optional[gr.OAuthProfile]): The OAuth profile of the user.
 
29
 
30
+ Returns:
31
+ Tuple[str, Optional[pd.DataFrame]]: Status message and DataFrame of results.
 
 
32
  """
33
  # --- Determine HF Space Runtime URL and Repo URL ---
34
  space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
35
+
36
 
37
  if profile:
38
+ username = f"{profile.username}"
39
  print(f"User logged in: {username}")
40
  else:
41
  print("User not logged in.")
 
44
  api_url = DEFAULT_API_URL
45
  questions_url = f"{api_url}/questions"
46
  submit_url = f"{api_url}/submit"
47
+ files_url = f"{api_url}/files"
48
 
49
  # 1. Instantiate Agent ( modify this part to create your agent)
50
  try:
51
+ agent = Agent()
52
  except Exception as e:
53
  print(f"Error instantiating agent: {e}")
54
  return f"Error initializing agent: {e}", None
55
+ # 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)
56
  agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
57
  print(agent_code)
58
 
 
63
  response.raise_for_status()
64
  questions_data = response.json()
65
  if not questions_data:
66
+ print("Fetched questions list is empty.")
67
+ return "Fetched questions list is empty or invalid format.", None
68
  print(f"Fetched {len(questions_data)} questions.")
69
  except requests.exceptions.RequestException as e:
70
  print(f"Error fetching questions: {e}")
71
  return f"Error fetching questions: {e}", None
72
  except requests.exceptions.JSONDecodeError as e:
73
+ print(f"Error decoding JSON response from questions endpoint: {e}")
74
+ print(f"Response text: {response.text[:500]}")
75
+ return f"Error decoding server response for questions: {e}", None
76
  except Exception as e:
77
  print(f"An unexpected error occurred fetching questions: {e}")
78
  return f"An unexpected error occurred fetching questions: {e}", None
 
88
  print(f"Skipping item with missing task_id or question: {item}")
89
  continue
90
  try:
91
+ file_path: Optional[str] = None
92
+ try:
93
+ file_response = requests.get(f"{files_url}/{task_id}", timeout=15)
94
+ if file_response.status_code == 200 and file_response.content:
95
+ # Get filename from Content-Disposition header or URL
96
+ filename = None
97
+ content_disposition = file_response.headers.get(
98
+ "Content-Disposition"
99
+ )
100
+ if content_disposition and "filename=" in content_disposition:
101
+ filename = content_disposition.split("filename=")[-1].strip('"')
102
+ else:
103
+ # Try to get filename from URL
104
+ url = file_response.url
105
+ filename = url.split("/")[-1]
106
+ if not filename or filename == str(task_id):
107
+ filename = f"file_{task_id}"
108
+
109
+ # Create temp directory and save file with original name
110
+ temp_dir = tempfile.mkdtemp()
111
+ file_path = os.path.join(temp_dir, filename)
112
+ with open(file_path, "wb") as f:
113
+ f.write(file_response.content)
114
+ print(f"Downloaded file for task {task_id} to {file_path}")
115
+ else:
116
+ print(f"No file for task {task_id} or file is empty.")
117
+ except Exception as e:
118
+ print(f"Error downloading file for task {task_id}: {e}")
119
+ file_path = None
120
+
121
+ submitted_answer = agent.builder.invoke(
122
+ input={'messages': question_text,
123
+ 'file_path': file_path}
124
+ )
125
+ answers_payload.append(
126
+ {"task_id": task_id, "submitted_answer": submitted_answer}
127
+ )
128
+ results_log.append(
129
+ {
130
+ "Task ID": task_id,
131
+ "Question": question_text,
132
+ "Submitted Answer": submitted_answer,
133
+ }
134
+ )
135
  except Exception as e:
136
+ print(f"Error running agent on task {task_id}: {e}")
137
+ results_log.append(
138
+ {
139
+ "Task ID": task_id,
140
+ "Question": question_text,
141
+ "Submitted Answer": f"AGENT ERROR: {e}",
142
+ }
143
+ )
144
 
145
  if not answers_payload:
146
  print("Agent did not produce any answers to submit.")
147
  return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
148
 
149
+ # 4. Prepare Submission
150
+ submission_data = {
151
+ "username": username.strip(),
152
+ "agent_code": agent_code,
153
+ "answers": answers_payload,
154
+ }
155
  status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
156
  print(status_update)
157
 
 
206
  """
207
  **Instructions:**
208
 
209
+ 1. Log in to your Hugging Face account using the button below. This uses your HF username for submission.
210
+ 2. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
 
211
 
212
  ---
213
  **Disclaimers:**
214
+ 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).
 
215
  """
216
  )
217
 
 
219
 
220
  run_button = gr.Button("Run Evaluation & Submit All Answers")
221
 
222
+ status_output = gr.Textbox(
223
+ label="Run Status / Submission Result", lines=5, interactive=False
224
+ )
225
  results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
226
 
227
+ run_button.click(fn=run_and_submit_all, outputs=[status_output, results_table])
 
 
 
228
 
229
  if __name__ == "__main__":
230
+ print("\n" + "-" * 30 + " App Starting " + "-" * 30)
231
  # Check for SPACE_HOST and SPACE_ID at startup for information
232
  space_host_startup = os.getenv("SPACE_HOST")
233
+ space_id_startup = os.getenv("SPACE_ID")
234
 
235
  if space_host_startup:
236
  print(f"✅ SPACE_HOST found: {space_host_startup}")
 
238
  else:
239
  print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
240
 
241
+ if space_id_startup: # Print repo URLs if SPACE_ID is found
242
  print(f"✅ SPACE_ID found: {space_id_startup}")
243
  print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
244
+ print(
245
+ f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main"
246
+ )
247
  else:
248
+ print(
249
+ "ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined."
250
+ )
251
 
252
+ print("-" * (60 + len(" App Starting ")) + "\n")
253
 
254
  print("Launching Gradio Interface for Basic Agent Evaluation...")
255
  demo.launch(debug=True, share=False)
app_.py ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gradio as gr
3
+ import requests
4
+ import inspect
5
+ import pandas as pd
6
+
7
+ import prompts_lib
8
+ import main_agent
9
+
10
+ # (Keep Constants as is)
11
+ # --- Constants ---
12
+ DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
13
+
14
+ # --- Basic Agent Definition ---
15
+ # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
16
+ class BasicAgent:
17
+ def __init__(self):
18
+ pass
19
+ def __call__(self, question: str) -> str:
20
+ print(f"Agent received question (first 50 chars): {question[:50]}...")
21
+
22
+ response = main_agent.agent.invoke({'messages': question})
23
+
24
+ answer = response.get('messages')[-1].content
25
+
26
+ # fixed_answer = "This is a default answer."
27
+ print(f"Agent returning answer: {answer}")
28
+ return answer
29
+
30
+ def run_and_submit_all( profile: gr.OAuthProfile | None):
31
+ """
32
+ Fetches all questions, runs the BasicAgent on them, submits all answers,
33
+ and displays the results.
34
+ """
35
+ # --- Determine HF Space Runtime URL and Repo URL ---
36
+ space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
37
+
38
+ if profile:
39
+ username= f"{profile.username}"
40
+ print(f"User logged in: {username}")
41
+ else:
42
+ print("User not logged in.")
43
+ return "Please Login to Hugging Face with the button.", None
44
+
45
+ api_url = DEFAULT_API_URL
46
+ questions_url = f"{api_url}/questions"
47
+ file_url = f"{api_url}/file_name"
48
+ submit_url = f"{api_url}/submit"
49
+
50
+ # 1. Instantiate Agent ( modify this part to create your agent)
51
+ try:
52
+ agent = BasicAgent()
53
+ except Exception as e:
54
+ print(f"Error instantiating agent: {e}")
55
+ return f"Error initializing agent: {e}", None
56
+ # 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)
57
+ agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
58
+ print(agent_code)
59
+
60
+ # 2. Fetch Questions
61
+ print(f"Fetching questions from: {questions_url}")
62
+ try:
63
+ response = requests.get(questions_url, timeout=15)
64
+ response.raise_for_status()
65
+ questions_data = response.json()
66
+ if not questions_data:
67
+ print("Fetched questions list is empty.")
68
+ return "Fetched questions list is empty or invalid format.", None
69
+ print(f"Fetched {len(questions_data)} questions.")
70
+ except requests.exceptions.RequestException as e:
71
+ print(f"Error fetching questions: {e}")
72
+ return f"Error fetching questions: {e}", None
73
+ except requests.exceptions.JSONDecodeError as e:
74
+ print(f"Error decoding JSON response from questions endpoint: {e}")
75
+ print(f"Response text: {response.text[:500]}")
76
+ return f"Error decoding server response for questions: {e}", None
77
+ except Exception as e:
78
+ print(f"An unexpected error occurred fetching questions: {e}")
79
+ return f"An unexpected error occurred fetching questions: {e}", None
80
+
81
+ # 3. Run your Agent
82
+ results_log = []
83
+ answers_payload = []
84
+ print(f"Running agent on {len(questions_data)} questions...")
85
+ for item in questions_data:
86
+ task_id = item.get("task_id")
87
+ question_text = item.get("question")
88
+ if not task_id or question_text is None:
89
+ print(f"Skipping item with missing task_id or question: {item}")
90
+ continue
91
+ try:
92
+ submitted_answer = agent(question_text)
93
+ answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
94
+ results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": submitted_answer})
95
+ except Exception as e:
96
+ print(f"Error running agent on task {task_id}: {e}")
97
+ results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"AGENT ERROR: {e}"})
98
+
99
+ if not answers_payload:
100
+ print("Agent did not produce any answers to submit.")
101
+ return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
102
+
103
+ # 4. Prepare Submission
104
+ submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
105
+ status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
106
+ print(status_update)
107
+
108
+ # 5. Submit
109
+ print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
110
+ try:
111
+ response = requests.post(submit_url, json=submission_data, timeout=60)
112
+ response.raise_for_status()
113
+ result_data = response.json()
114
+ final_status = (
115
+ f"Submission Successful!\n"
116
+ f"User: {result_data.get('username')}\n"
117
+ f"Overall Score: {result_data.get('score', 'N/A')}% "
118
+ f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n"
119
+ f"Message: {result_data.get('message', 'No message received.')}"
120
+ )
121
+ print("Submission successful.")
122
+ results_df = pd.DataFrame(results_log)
123
+ return final_status, results_df
124
+ except requests.exceptions.HTTPError as e:
125
+ error_detail = f"Server responded with status {e.response.status_code}."
126
+ try:
127
+ error_json = e.response.json()
128
+ error_detail += f" Detail: {error_json.get('detail', e.response.text)}"
129
+ except requests.exceptions.JSONDecodeError:
130
+ error_detail += f" Response: {e.response.text[:500]}"
131
+ status_message = f"Submission Failed: {error_detail}"
132
+ print(status_message)
133
+ results_df = pd.DataFrame(results_log)
134
+ return status_message, results_df
135
+ except requests.exceptions.Timeout:
136
+ status_message = "Submission Failed: The request timed out."
137
+ print(status_message)
138
+ results_df = pd.DataFrame(results_log)
139
+ return status_message, results_df
140
+ except requests.exceptions.RequestException as e:
141
+ status_message = f"Submission Failed: Network error - {e}"
142
+ print(status_message)
143
+ results_df = pd.DataFrame(results_log)
144
+ return status_message, results_df
145
+ except Exception as e:
146
+ status_message = f"An unexpected error occurred during submission: {e}"
147
+ print(status_message)
148
+ results_df = pd.DataFrame(results_log)
149
+ return status_message, results_df
150
+
151
+
152
+ # --- Build Gradio Interface using Blocks ---
153
+ with gr.Blocks() as demo:
154
+ gr.Markdown("# Basic Agent Evaluation Runner")
155
+ gr.Markdown(
156
+ """
157
+ **Instructions:**
158
+
159
+ 1. Please clone this space, then modify the code to define your agent's logic, the tools, the necessary packages, etc ...
160
+ 2. Log in to your Hugging Face account using the button below. This uses your HF username for submission.
161
+ 3. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
162
+
163
+ ---
164
+ **Disclaimers:**
165
+ 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).
166
+ 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.
167
+ """
168
+ )
169
+
170
+ gr.LoginButton()
171
+
172
+ run_button = gr.Button("Run Evaluation & Submit All Answers")
173
+
174
+ status_output = gr.Textbox(label="Run Status / Submission Result", lines=5, interactive=False)
175
+ # Removed max_rows=10 from DataFrame constructor
176
+ results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
177
+
178
+ run_button.click(
179
+ fn=run_and_submit_all,
180
+ outputs=[status_output, results_table]
181
+ )
182
+
183
+ if __name__ == "__main__":
184
+ print("\n" + "-"*30 + " App Starting " + "-"*30)
185
+ # Check for SPACE_HOST and SPACE_ID at startup for information
186
+ space_host_startup = os.getenv("SPACE_HOST")
187
+ space_id_startup = os.getenv("SPACE_ID") # Get SPACE_ID at startup
188
+
189
+ if space_host_startup:
190
+ print(f"✅ SPACE_HOST found: {space_host_startup}")
191
+ print(f" Runtime URL should be: https://{space_host_startup}.hf.space")
192
+ else:
193
+ print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
194
+
195
+ if space_id_startup: # Print repo URLs if SPACE_ID is found
196
+ print(f"✅ SPACE_ID found: {space_id_startup}")
197
+ print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
198
+ print(f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main")
199
+ else:
200
+ print("ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined.")
201
+
202
+ print("-"*(60 + len(" App Starting ")) + "\n")
203
+
204
+ print("Launching Gradio Interface for Basic Agent Evaluation...")
205
+ demo.launch(debug=True, share=False)
main_agent.py CHANGED
@@ -1,10 +1,10 @@
1
  # imports
2
- from typing import TypedDict, Annotated
3
  from langgraph.graph.message import add_messages
4
  from langchain_core.messages import AnyMessage, SystemMessage
5
  from langchain_openai import AzureChatOpenAI
6
  from langgraph.graph import START, StateGraph
7
- from tools import duckduck_tool, wiki_RAG_tool
8
  from langgraph.prebuilt import ToolNode, tools_condition
9
 
10
  import prompts_lib as my_prompts
@@ -18,6 +18,7 @@ load_dotenv() # take environment variables
18
  # define state
19
  class State(TypedDict):
20
  messages: Annotated[list[AnyMessage], add_messages]
 
21
 
22
  # create llm interface
23
  llm = AzureChatOpenAI(
@@ -29,7 +30,7 @@ llm = AzureChatOpenAI(
29
  )
30
 
31
  # bild tools
32
- tools = [duckduck_tool, wiki_RAG_tool]
33
  chat_w_tools = llm.bind_tools(tools)
34
 
35
  # load system prompt
@@ -38,8 +39,12 @@ system_message = SystemMessage(content=system_prompt)
38
 
39
  # define nodes
40
  def assistant(state: State):
 
 
 
 
41
  return {
42
- "messages": [chat_w_tools.invoke([system_message] + state["messages"])]
43
  }
44
 
45
 
@@ -56,4 +61,8 @@ builder.add_conditional_edges("assistant", tools_condition,
56
  {"tools": "tools", "__end__": "__end__"})
57
  builder.add_edge("tools", "assistant")
58
  # compile gtaph
59
- agent = builder.compile()
 
 
 
 
 
1
  # imports
2
+ from typing import TypedDict, Annotated, Optional
3
  from langgraph.graph.message import add_messages
4
  from langchain_core.messages import AnyMessage, SystemMessage
5
  from langchain_openai import AzureChatOpenAI
6
  from langgraph.graph import START, StateGraph
7
+ from tools import duckduck_tool, wiki_RAG_tool, image_analyser_tool
8
  from langgraph.prebuilt import ToolNode, tools_condition
9
 
10
  import prompts_lib as my_prompts
 
18
  # define state
19
  class State(TypedDict):
20
  messages: Annotated[list[AnyMessage], add_messages]
21
+ file_path: Optional[str]
22
 
23
  # create llm interface
24
  llm = AzureChatOpenAI(
 
30
  )
31
 
32
  # bild tools
33
+ tools = [duckduck_tool, wiki_RAG_tool, image_analyser_tool]
34
  chat_w_tools = llm.bind_tools(tools)
35
 
36
  # load system prompt
 
39
 
40
  # define nodes
41
  def assistant(state: State):
42
+
43
+ file_path = state.get("file_path", None)
44
+ if file_path:
45
+ state["messages"].append(SystemMessage(content=f"File path provided: {file_path}"))
46
  return {
47
+ "messages": [chat_w_tools.invoke([system_message] + state["messages"])],
48
  }
49
 
50
 
 
61
  {"tools": "tools", "__end__": "__end__"})
62
  builder.add_edge("tools", "assistant")
63
  # compile gtaph
64
+ # agent = builder.compile()
65
+
66
+ class Agent:
67
+ def __init__(self):
68
+ self.builder = builder.compile()
requirements.txt CHANGED
Binary files a/requirements.txt and b/requirements.txt differ
 
test.ipynb CHANGED
@@ -103,7 +103,7 @@
103
  },
104
  {
105
  "cell_type": "code",
106
- "execution_count": 28,
107
  "id": "02c87f0c",
108
  "metadata": {},
109
  "outputs": [
@@ -113,7 +113,7 @@
113
  "text": [
114
  "Agent received question (first 50 chars): \n",
115
  "How many studio albums were published by Mercedes...\n",
116
- "Agent returning answer: Three\n"
117
  ]
118
  }
119
  ],
@@ -152,7 +152,7 @@
152
  },
153
  {
154
  "cell_type": "code",
155
- "execution_count": 31,
156
  "id": "069db350",
157
  "metadata": {},
158
  "outputs": [
@@ -178,6 +178,20 @@
178
  "land inequality. During the 1970s she was a part of two films by the\n",
179
  "director Leopoldo Torre Nilsson: El Santo de la Espada in 1970 and Güemes,\n",
180
  "la tierra en armas in 1971, in which she portrayed Juana Azurduy de\n",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  "Padilla, the guerrilla military leader who fought for The double album was\n",
182
  "a commercial success, being certified platinum by the CAPIF selling more\n",
183
  "than 200,000 copies in Argentina, Cantora 1 was also certified platinum\n",
@@ -187,60 +201,52 @@
187
  "only appearances on both charts. At documentary film titled Mercedes Sosa,\n",
188
  "Cantora un viaje íntimo was released on 2009, it was directed by Rodrigo\n",
189
  "Vila and features the recording process of the album as well as testimonies\n",
190
- "from the different guest artists that appeared on the project. Haydée\n",
191
- "Mercedes Sosa (9 July 1935 4 October 2009) was an Argentine singer who\n",
192
- "was popular throughout Latin America and many countries outside the region.\n",
193
- "With her roots in Argentine folk music, Sosa became one of the preeminent\n",
194
- "exponents of El nuevo cancionero. She gave voice to songs written by many\n",
195
- "Latin American songwriters. Her music made people hail her as the \"voice of\n",
196
- "the voiceless ones\". She was often called \"the conscience of Latin\n",
197
- "America\". Cantora, un Viaje Íntimo (English: Cantora, An Intimate Journey)\n",
198
- "is a double album by Argentine singer Mercedes Sosa, released on 2009\n",
199
- "through Sony Music Argentina. The album features Cantora 1 and Cantora 2,\n",
200
- "the project is Sosa's final album before her death on October 4, 2009. At\n",
201
- "the 10th Annual Latin Grammy Awards, Cantora 1 was nominated for Album of\n",
202
- "the Year and won Best Folk Album and Best Recording Package, the latter\n",
203
- "award went to Alejandro Ros, the art director of the album. Additionally,\n",
204
- "Sosa won two out of five nominations for the albums at the Gardel Awards\n",
205
- "2010, the double album was nominated for Album of the Year and Production\n",
206
- "of the Year and won Best DVD while both Cantora 1 and Cantora 2 were\n",
207
- "nominated for Best Female Folk Album, with the former winning the category.\n",
208
- "public. Sosa and her first husband, Manuel Oscar Matus, with whom she had\n",
209
- "one son, were key players in the mid-60s nueva canción movement (which was\n",
210
- "called nuevo cancionero in Argentina). Her second record was Canciones con\n",
211
- "Fundamento, a collection of Argentine folk songs. == Background == The\n",
212
- "albums were produced by Popi Spatocco, frequent collaborator of Sosa,\n",
213
- "engineered by Jorge \"Portugués\" Da Silva and recorded from May 2008 to June\n",
214
- "2009 at Estudios Panda and Estudios Ion, both in Buenos Aires, Argentina,\n",
215
- "the first session took place at Estudios Panda while the rest of the album\n",
216
- "was recorded at Estudios Ion, the first songs to be recorded were \"Agua,\n",
217
- "Fuego, Tierra y Viento\" with Argentine singer Soledad Pastorutti and\n",
218
- "\"Misionera\" with Brazilian accordionist Luiz Carlos Borges, the recording\n",
219
- "of the album was marked by interruptions due to the delicate health\n",
220
- "condition of Sosa, she would eventually die on October 16, 2009 at age 74,\n",
221
- "a couple of months following the release of the albums, about Cantora,\n",
222
- "Spatocco said that \"it was like receiving a diploma of honor, she was\n",
223
- "dedicated to whatever happened because she knew that I had her back\". Sosa\n",
224
- "\"spent the late 1960s building her audience in Europe and among the\n",
225
- "cosmopolitan middle class in Buenos Aires, becoming in the process a much\n",
226
- "bigger star\" than her contemporaries. In 1967, Sosa toured the United\n",
227
- "States and Europe with great success. In later years, she performed and\n",
228
- "recorded extensively, broadening her repertoire to include material from\n",
229
- "throughout Latin America. Sosa was born on 9 July 1935, in San Miguel de\n",
230
- "Tucumán, in the northwestern Argentine province of Tucumán, of mestizo\n",
231
- "ancestry. She was of French, Spanish and Diaguita descent. Her nickname \"la\n",
232
- "negra\", which is a common nickname in Argentina for people with darker\n",
233
- "complexion, is a reference to her indigenous heritage. Her parents, a day\n",
234
- "laborer and a washerwoman, were Peronists, although they never registered\n",
235
- "in the party, and she started her career as a singer for the Peronist Party\n",
236
- "in Tucuman under the name Gladys Osorio. In 1950, at age fifteen, she won a\n",
237
- "singing competition organized by a local radio station and was given a\n",
238
- "contract to perform for two months. She recorded her first album, La Voz de\n",
239
- "la Zafra, in 1959. A performance at the 1965 Cosquín National Folklore\n",
240
- "Festival—where she was introduced and brought to the stage while sitting in\n",
241
- "the audience by fellow folk singer Jorge Cafrune— brought her to the\n",
242
- "attention of the Argentine public. Sosa and her first husband, Manuel\n",
243
- "<class 'langchain_core.messages.ai.AIMessage'>: Three\n"
244
  ]
245
  }
246
  ],
 
103
  },
104
  {
105
  "cell_type": "code",
106
+ "execution_count": 34,
107
  "id": "02c87f0c",
108
  "metadata": {},
109
  "outputs": [
 
113
  "text": [
114
  "Agent received question (first 50 chars): \n",
115
  "How many studio albums were published by Mercedes...\n",
116
+ "Agent returning answer: Cantora 1, Cantora 2.\n"
117
  ]
118
  }
119
  ],
 
152
  },
153
  {
154
  "cell_type": "code",
155
+ "execution_count": 35,
156
  "id": "069db350",
157
  "metadata": {},
158
  "outputs": [
 
178
  "land inequality. During the 1970s she was a part of two films by the\n",
179
  "director Leopoldo Torre Nilsson: El Santo de la Espada in 1970 and Güemes,\n",
180
  "la tierra en armas in 1971, in which she portrayed Juana Azurduy de\n",
181
+ "Padilla, the guerrilla military leader who fought for In the early 1970s,\n",
182
+ "Sosa released two concept albums in collaboration with composer Ariel\n",
183
+ "Ramírez and lyricist Félix Luna: Cantata Sudamericana and Mujeres\n",
184
+ "Argentinas (Argentine Women). She also recorded a tribute to Chilean\n",
185
+ "musician Violeta Parra in 1971, including what was to become one of Sosa's\n",
186
+ "signature songs, Gracias a la vida. She further popularized of songs\n",
187
+ "written by Milton Nascimento of Brazil and Pablo Milanés and Silvio\n",
188
+ "Rodríguez both from Cuba. Throughout the decade, she released albums such\n",
189
+ "as Hasta la Victoria in 1972 and Traigo un Pueblo en mi Voz in 1973. They\n",
190
+ "featured songs like \"Cuando tenga la tierra\", written by Ariel Petrocelli\n",
191
+ "and Daniel Toro, which tackles political and social issues like wealth and\n",
192
+ "land inequality. During the 1970s she was a part of two films by the\n",
193
+ "director Leopoldo Torre Nilsson: El Santo de la Espada in 1970 and Güemes,\n",
194
+ "la tierra en armas in 1971, in which she portrayed Juana Azurduy de\n",
195
  "Padilla, the guerrilla military leader who fought for The double album was\n",
196
  "a commercial success, being certified platinum by the CAPIF selling more\n",
197
  "than 200,000 copies in Argentina, Cantora 1 was also certified platinum\n",
 
201
  "only appearances on both charts. At documentary film titled Mercedes Sosa,\n",
202
  "Cantora un viaje íntimo was released on 2009, it was directed by Rodrigo\n",
203
  "Vila and features the recording process of the album as well as testimonies\n",
204
+ "from the different guest artists that appeared on the project. The double\n",
205
+ "album was a commercial success, being certified platinum by the CAPIF\n",
206
+ "selling more than 200,000 copies in Argentina, Cantora 1 was also certified\n",
207
+ "platinum selling 40,000 copies while Cantora 2 was certified gold selling\n",
208
+ "20,000 copies. The album also peaked at numbers 22 and 8 at the Top Latin\n",
209
+ "Albums and Latin Pop Albums charts in United States, respectively, being\n",
210
+ "Sosa's only appearances on both charts. At documentary film titled Mercedes\n",
211
+ "Sosa, Cantora un viaje íntimo was released on 2009, it was directed by\n",
212
+ "Rodrigo Vila and features the recording process of the album as well as\n",
213
+ "testimonies from the different guest artists that appeared on the project.\n",
214
+ "Haydée Mercedes Sosa (9 July 1935 4 October 2009) was an Argentine singer\n",
215
+ "who was popular throughout Latin America and many countries outside the\n",
216
+ "region. With her roots in Argentine folk music, Sosa became one of the\n",
217
+ "preeminent exponents of El nuevo cancionero. She gave voice to songs\n",
218
+ "written by many Latin American songwriters. Her music made people hail her\n",
219
+ "as the \"voice of the voiceless ones\". She was often called \"the conscience\n",
220
+ "of Latin America\". Haydée Mercedes Sosa (9 July 1935 4 October 2009) was\n",
221
+ "an Argentine singer who was popular throughout Latin America and many\n",
222
+ "countries outside the region. With her roots in Argentine folk music, Sosa\n",
223
+ "became one of the preeminent exponents of El nuevo cancionero. She gave\n",
224
+ "voice to songs written by many Latin American songwriters. Her music made\n",
225
+ "people hail her as the \"voice of the voiceless ones\". She was often called\n",
226
+ "\"the conscience of Latin America\". Cantora, un Viaje Íntimo (English:\n",
227
+ "Cantora, An Intimate Journey) is a double album by Argentine singer\n",
228
+ "Mercedes Sosa, released on 2009 through Sony Music Argentina. The album\n",
229
+ "features Cantora 1 and Cantora 2, the project is Sosa's final album before\n",
230
+ "her death on October 4, 2009. At the 10th Annual Latin Grammy Awards,\n",
231
+ "Cantora 1 was nominated for Album of the Year and won Best Folk Album and\n",
232
+ "Best Recording Package, the latter award went to Alejandro Ros, the art\n",
233
+ "director of the album. Additionally, Sosa won two out of five nominations\n",
234
+ "for the albums at the Gardel Awards 2010, the double album was nominated\n",
235
+ "for Album of the Year and Production of the Year and won Best DVD while\n",
236
+ "both Cantora 1 and Cantora 2 were nominated for Best Female Folk Album,\n",
237
+ "with the former winning the category. Cantora, un Viaje Íntimo (English:\n",
238
+ "Cantora, An Intimate Journey) is a double album by Argentine singer\n",
239
+ "Mercedes Sosa, released on 2009 through Sony Music Argentina. The album\n",
240
+ "features Cantora 1 and Cantora 2, the project is Sosa's final album before\n",
241
+ "her death on October 4, 2009. At the 10th Annual Latin Grammy Awards,\n",
242
+ "Cantora 1 was nominated for Album of the Year and won Best Folk Album and\n",
243
+ "Best Recording Package, the latter award went to Alejandro Ros, the art\n",
244
+ "director of the album. Additionally, Sosa won two out of five nominations\n",
245
+ "for the albums at the Gardel Awards 2010, the double album was nominated\n",
246
+ "for Album of the Year and Production of the Year and won Best DVD while\n",
247
+ "both Cantora 1 and Cantora 2 were nominated for Best Female Folk Album,\n",
248
+ "with the former winning the category.\n",
249
+ "<class 'langchain_core.messages.ai.AIMessage'>: Cantora 1, Cantora 2.\n"
 
 
 
 
 
 
 
 
250
  ]
251
  }
252
  ],
test_app.ipynb ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "id": "d3e1ddaa",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "import requests"
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "code",
15
+ "execution_count": 2,
16
+ "id": "4f03dfb6",
17
+ "metadata": {},
18
+ "outputs": [],
19
+ "source": [
20
+ "DEFAULT_API_URL = \"https://agents-course-unit4-scoring.hf.space\"\n",
21
+ "\n",
22
+ "api_url = DEFAULT_API_URL\n",
23
+ "\n",
24
+ "questions_url = f\"{api_url}/questions\"\n",
25
+ "\n",
26
+ "\n",
27
+ "response = requests.get(questions_url, timeout=15)\n",
28
+ "response.raise_for_status()\n",
29
+ "questions_data = response.json()"
30
+ ]
31
+ },
32
+ {
33
+ "cell_type": "code",
34
+ "execution_count": 30,
35
+ "id": "c086d928",
36
+ "metadata": {},
37
+ "outputs": [],
38
+ "source": [
39
+ "for i, item in enumerate(questions_data):\n",
40
+ " task_id = item.get(\"task_id\")\n",
41
+ " question_text = item.get(\"question\")\n",
42
+ "\n",
43
+ " if i==13:\n",
44
+ " break\n",
45
+ "\n"
46
+ ]
47
+ },
48
+ {
49
+ "cell_type": "code",
50
+ "execution_count": 32,
51
+ "id": "f2be8564",
52
+ "metadata": {},
53
+ "outputs": [
54
+ {
55
+ "data": {
56
+ "text/plain": [
57
+ "{'task_id': '1f975693-876d-457b-a649-393859e79bf3',\n",
58
+ " 'question': \"Hi, I was out sick from my classes on Friday, so I'm trying to figure out what I need to study for my Calculus mid-term next week. My friend from class sent me an audio recording of Professor Willowbrook giving out the recommended reading for the test, but my headphones are broken :(\\n\\nCould you please listen to the recording for me and tell me the page numbers I'm supposed to go over? I've attached a file called Homework.mp3 that has the recording. Please provide just the page numbers as a comma-delimited list. And please provide the list in ascending order.\",\n",
59
+ " 'Level': '1',\n",
60
+ " 'file_name': '1f975693-876d-457b-a649-393859e79bf3.mp3'}"
61
+ ]
62
+ },
63
+ "execution_count": 32,
64
+ "metadata": {},
65
+ "output_type": "execute_result"
66
+ }
67
+ ],
68
+ "source": [
69
+ "item"
70
+ ]
71
+ },
72
+ {
73
+ "cell_type": "code",
74
+ "execution_count": 31,
75
+ "id": "3951626a",
76
+ "metadata": {},
77
+ "outputs": [
78
+ {
79
+ "data": {
80
+ "text/plain": [
81
+ "\"Hi, I was out sick from my classes on Friday, so I'm trying to figure out what I need to study for my Calculus mid-term next week. My friend from class sent me an audio recording of Professor Willowbrook giving out the recommended reading for the test, but my headphones are broken :(\\n\\nCould you please listen to the recording for me and tell me the page numbers I'm supposed to go over? I've attached a file called Homework.mp3 that has the recording. Please provide just the page numbers as a comma-delimited list. And please provide the list in ascending order.\""
82
+ ]
83
+ },
84
+ "execution_count": 31,
85
+ "metadata": {},
86
+ "output_type": "execute_result"
87
+ }
88
+ ],
89
+ "source": [
90
+ "question_text"
91
+ ]
92
+ },
93
+ {
94
+ "cell_type": "code",
95
+ "execution_count": 33,
96
+ "id": "442a3761",
97
+ "metadata": {},
98
+ "outputs": [],
99
+ "source": [
100
+ "import base64\n",
101
+ "image_path = 'cca530fc-4052-43b2-b130-b30968d8aa44.png'\n",
102
+ "with open(image_path, \"rb\") as image_file:\n",
103
+ " image_data = base64.b64encode(image_file.read()).decode(\"utf-8\")"
104
+ ]
105
+ },
106
+ {
107
+ "cell_type": "code",
108
+ "execution_count": 34,
109
+ "id": "c8620c63",
110
+ "metadata": {},
111
+ "outputs": [
112
+ {
113
+ "data": {
114
+ "text/plain": [
115
+ "'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'"
116
+ ]
117
+ },
118
+ "execution_count": 34,
119
+ "metadata": {},
120
+ "output_type": "execute_result"
121
+ }
122
+ ],
123
+ "source": [
124
+ "image_data"
125
+ ]
126
+ },
127
+ {
128
+ "cell_type": "code",
129
+ "execution_count": null,
130
+ "id": "4f51cb6d",
131
+ "metadata": {},
132
+ "outputs": [],
133
+ "source": []
134
+ }
135
+ ],
136
+ "metadata": {
137
+ "kernelspec": {
138
+ "display_name": ".venv (3.13.6)",
139
+ "language": "python",
140
+ "name": "python3"
141
+ },
142
+ "language_info": {
143
+ "codemirror_mode": {
144
+ "name": "ipython",
145
+ "version": 3
146
+ },
147
+ "file_extension": ".py",
148
+ "mimetype": "text/x-python",
149
+ "name": "python",
150
+ "nbconvert_exporter": "python",
151
+ "pygments_lexer": "ipython3",
152
+ "version": "3.13.6"
153
+ }
154
+ },
155
+ "nbformat": 4,
156
+ "nbformat_minor": 5
157
+ }
test_app2.ipynb ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "id": "8c3eda07",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "%load_ext autoreload\n",
11
+ "\n",
12
+ "%autoreload 2"
13
+ ]
14
+ },
15
+ {
16
+ "cell_type": "code",
17
+ "execution_count": null,
18
+ "id": "31ef3bc0",
19
+ "metadata": {},
20
+ "outputs": [],
21
+ "source": []
22
+ },
23
+ {
24
+ "cell_type": "code",
25
+ "execution_count": null,
26
+ "id": "ee202a8a",
27
+ "metadata": {},
28
+ "outputs": [],
29
+ "source": [
30
+ "submitted_answer = agent.builder.invoke(question_text, file_path)"
31
+ ]
32
+ }
33
+ ],
34
+ "metadata": {
35
+ "kernelspec": {
36
+ "display_name": ".venv (3.13.6)",
37
+ "language": "python",
38
+ "name": "python3"
39
+ },
40
+ "language_info": {
41
+ "name": "python",
42
+ "version": "3.13.6"
43
+ }
44
+ },
45
+ "nbformat": 4,
46
+ "nbformat_minor": 5
47
+ }
tools.py CHANGED
@@ -4,8 +4,13 @@ from langchain_community.utilities import WikipediaAPIWrapper
4
  from langchain_community.document_loaders import WikipediaLoader
5
  from langchain.text_splitter import RecursiveCharacterTextSplitter
6
  from langchain_chroma import Chroma
7
- from langchain_openai import AzureOpenAIEmbeddings
 
 
8
  import os
 
 
 
9
  from dotenv import load_dotenv
10
 
11
  # load environment variables
@@ -33,7 +38,7 @@ embeddings = AzureOpenAIEmbeddings(
33
  def wiki_RAG(query: str):
34
  """####"""
35
 
36
- loader = WikipediaLoader(query=query, load_max_docs=2)
37
  docs = loader.load()
38
 
39
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50)
@@ -53,4 +58,59 @@ wiki_RAG_tool = Tool(
53
  name="wikipedia_search_RAG",
54
  func=wiki_RAG,
55
  description="Searches information in wikipedia."
56
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  from langchain_community.document_loaders import WikipediaLoader
5
  from langchain.text_splitter import RecursiveCharacterTextSplitter
6
  from langchain_chroma import Chroma
7
+ from langchain_openai import AzureOpenAIEmbeddings, AzureChatOpenAI
8
+ from langchain_core.tools import tool
9
+ import base64
10
  import os
11
+ from pydantic import BaseModel, Field
12
+
13
+
14
  from dotenv import load_dotenv
15
 
16
  # load environment variables
 
38
  def wiki_RAG(query: str):
39
  """####"""
40
 
41
+ loader = WikipediaLoader(query=query, load_max_docs=5)
42
  docs = loader.load()
43
 
44
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50)
 
58
  name="wikipedia_search_RAG",
59
  func=wiki_RAG,
60
  description="Searches information in wikipedia."
61
+ )
62
+
63
+
64
+ # image analyser
65
+
66
+ # create llm interface
67
+ llm_img = AzureChatOpenAI(
68
+ deployment_name = os.environ.get("AZURE_OPENAI_DEPLOYMENT_NAME"),
69
+ openai_api_key = os.environ.get("AZURE_OPENAI_API_KEY"),
70
+ azure_endpoint = os.environ.get("AZURE_OPENAI_ENDPOINT"),
71
+ openai_api_version = os.environ.get("OPENAI_API_VERSION"),
72
+ temperature=0
73
+ )
74
+
75
+
76
+
77
+
78
+
79
+ class ImageAnalyserInput(BaseModel):
80
+ image_path: str = Field(description="path to file")
81
+
82
+
83
+ @tool("image-analyser", args_schema=ImageAnalyserInput)
84
+ def image_analyser_tool(image_path: str) -> str:
85
+ """Analyzes an image and returns a description."""
86
+
87
+ with open(image_path, "rb") as image_file:
88
+ image_data = base64.b64encode(image_file.read()).decode("utf-8")
89
+
90
+ message = {
91
+ "role": "user",
92
+ "content": [
93
+ {
94
+ "type": "text",
95
+ "text": "Describe this image",
96
+ },
97
+ {
98
+ "type": "image",
99
+ "source_type": "base64",
100
+ "data": image_data,
101
+ "mime_type": "image/jpeg",
102
+ },
103
+ ],
104
+ }
105
+
106
+ response = llm_img.invoke([message])
107
+ return response.content
108
+
109
+ # image_analyser_tool = Tool(
110
+ # name="image analyser",
111
+ # func=image_analyser,
112
+ # description="Analises an image and returns a text description"
113
+ # )
114
+
115
+
116
+
tools_test.ipynb CHANGED
@@ -28,7 +28,7 @@
28
  },
29
  {
30
  "cell_type": "code",
31
- "execution_count": null,
32
  "id": "4ec297d7",
33
  "metadata": {},
34
  "outputs": [],
@@ -59,17 +59,20 @@
59
  },
60
  {
61
  "cell_type": "code",
62
- "execution_count": 28,
63
  "id": "3f538870",
64
  "metadata": {},
65
  "outputs": [],
66
  "source": [
67
- "out = tools.wikipedia_tool.invoke(\"who is germany chancellor?\")"
 
 
 
68
  ]
69
  },
70
  {
71
  "cell_type": "code",
72
- "execution_count": 29,
73
  "id": "ef465273",
74
  "metadata": {},
75
  "outputs": [
@@ -77,19 +80,31 @@
77
  "name": "stdout",
78
  "output_type": "stream",
79
  "text": [
80
- "Page: Chancellor of Germany Summary: The chancellor of Germany, officially\n",
81
- "the federal chancellor of the Federal Republic of Germany, is the head of\n",
82
- "the federal government of Germany. The chancellor is the chief executive of\n",
83
- "the Federal Cabinet and heads the executive branch. The chancellor is\n",
84
- "elected by the Bundestag on the proposal of the federal president and\n",
85
- "without debate (Article 63 of the German Constitution). During a state of\n",
86
- "defence declared by the Bundestag the chancellor also assumes the position\n",
87
- "of commander-in-chief of the Bundeswehr. Ten people (nine men and one\n",
88
- "woman) have served as chancellor of the Federal Republic of Germany, the\n",
89
- "first being Konrad Adenauer from 1949 to 1963. (Another 26 men had served\n",
90
- "as \"Reich chancellors\" of the previous German Empire from 1871 to 1945.)\n",
91
- "The current officeholder is Friedrich Merz of the Christian Democratic\n",
92
- "Union, sworn in on 6 May 2025.\n"
 
 
 
 
 
 
 
 
 
 
 
 
93
  ]
94
  }
95
  ],
@@ -99,27 +114,65 @@
99
  },
100
  {
101
  "cell_type": "code",
102
- "execution_count": 10,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  "id": "a9768b29",
104
  "metadata": {},
105
  "outputs": [],
106
  "source": [
107
- "res = tools.wiki_RAG('who is germany chancellor?')"
108
  ]
109
  },
110
  {
111
  "cell_type": "code",
112
- "execution_count": 22,
113
  "id": "d140be5f",
114
  "metadata": {},
115
- "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  "source": [
117
- "res2 = tools.wiki_RAG('the list of german chancellors')"
118
  ]
119
  },
120
  {
121
  "cell_type": "code",
122
- "execution_count": 7,
123
  "id": "7f334a2f",
124
  "metadata": {},
125
  "outputs": [
@@ -127,42 +180,56 @@
127
  "name": "stdout",
128
  "output_type": "stream",
129
  "text": [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  "The chancellor of Germany, officially the federal chancellor of the Federal Republic of Germany, is the head of the federal government of Germany. The chancellor is the chief executive of the Federal Cabinet and heads the executive branch. The chancellor is elected by the Bundestag on the proposal of the federal president and without debate (Article 63 of the German Constitution). During a state of defence declared by the Bundestag the chancellor also assumes the position of commander-in-chief of the Bundeswehr.\n",
131
  "Ten people (nine men and one woman) have served as chancellor of the Federal Republic of Germany, the first being Konrad Adenauer from 1949 to 1963. (Another 26 men had served as \"Reich chancellors\" of the previous German Empire from 1871 to 1945.) The current officeholder is Friedrich Merz of the Christian Democratic Union, sworn in on 6 May 2025.\n",
132
  "\n",
133
  "\n",
134
  "== History of the office (pre-1949) ==\n",
135
- "chancellor of the Federal Republic of Germany, is the head of the federal government of Germany.\n",
136
- "The chancellor of Germany, officially the federal chancellor of the Federal Republic of Germany, is\n",
137
- "The chancellor of Germany is the political leader of Germany and the head of the federal government.\n",
138
- "The chancellor of Germany is the political leader of Germany and the head of the federal government. The office holder is responsible for selecting all other members of the government and chairing cabinet meetings.\n",
139
- "The office was created in the North German Confederation in 1867, when Otto von Bismarck became the first chancellor. With the unification of Germany and establishment of the German Empire in 1871, the Confederation evolved into a German nation-state and its leader became known as the chancellor of Germany. Originally, the chancellor was only responsible to the emperor. This changed with the constitutional reform in 1918, when the Parliament was given the right to dismiss the chancellor. Under the 1919 Weimar Constitution the chancellors were appointed by the directly elected president, but were responsible to Parliament.\n"
 
 
140
  ]
141
  }
142
  ],
143
  "source": [
144
- "print(res)"
145
  ]
146
  },
147
  {
148
  "cell_type": "code",
149
- "execution_count": 25,
150
  "id": "a6933d2d",
151
  "metadata": {},
152
  "outputs": [
153
  {
154
- "name": "stdout",
155
- "output_type": "stream",
156
- "text": [
157
- "== Federal Republic of Germany (1949–present) == In 1949, two separate\n",
158
- "German states were established: the Federal Republic of Germany (known as\n",
159
- "West Germany) and the German Democratic Republic (known as East Germany).\n",
160
- "The list below gives the chancellors of West Germany; the government of\n",
161
- "East Germany was headed by the chairman of the Council of Ministers. In\n",
162
- "1990, East Germany was dissolved as it merged with West Germany; Germany\n",
163
- "was reunified. It retained the name of the Federal Republic of Germany.\n",
164
- "Political parties: CDU (6) SPD (4) == Timeline == == See also ==\n",
165
- "Leadership of East Germany List of chancellors of Germany by time in offi\n"
166
  ]
167
  }
168
  ],
@@ -172,10 +239,42 @@
172
  },
173
  {
174
  "cell_type": "code",
175
- "execution_count": null,
176
  "id": "08e04f44",
177
  "metadata": {},
178
  "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179
  "source": []
180
  }
181
  ],
 
28
  },
29
  {
30
  "cell_type": "code",
31
+ "execution_count": 2,
32
  "id": "4ec297d7",
33
  "metadata": {},
34
  "outputs": [],
 
59
  },
60
  {
61
  "cell_type": "code",
62
+ "execution_count": 55,
63
  "id": "3f538870",
64
  "metadata": {},
65
  "outputs": [],
66
  "source": [
67
+ "# msg = '''How many studio album were published by mercedes sosa between 2000 and 2009 (included)?\n",
68
+ "# you can use the latest 2022 version of english wikipedia'''\n",
69
+ "\n",
70
+ "out = tools.wikipedia_tool.invoke(msg)"
71
  ]
72
  },
73
  {
74
  "cell_type": "code",
75
+ "execution_count": 56,
76
  "id": "ef465273",
77
  "metadata": {},
78
  "outputs": [
 
80
  "name": "stdout",
81
  "output_type": "stream",
82
  "text": [
83
+ "Page: José José Summary: José Rómulo Sosa Ortiz (17 February 1948 – 28\n",
84
+ "September 2019), known professionally as José José, was a Mexican singer\n",
85
+ "and actor. Also known as \"El Príncipe de la Canción\" (The Prince of Song),\n",
86
+ "his performance and vocal style have influenced many Latin pop artists in a\n",
87
+ "career that spanned more than four decades. Due to his vocals and\n",
88
+ "popularity, José José was considered by Latin audiences and media as an\n",
89
+ "icon of Latin pop music and one of the most emblematic Latin singers of his\n",
90
+ "time. Born into a family of musicians, José began his musical career in his\n",
91
+ "early teens playing guitar and singing in serenade. He later joined a jazz\n",
92
+ "and bossa nova trio where he sang and played bass and double bass. José\n",
93
+ "José found success as a solo artist in the early 1970s. Demonstrating his\n",
94
+ "tenor vocal ability with a stunning performance of the song \"El Triste\" at\n",
95
+ "a Latin music festival held in Mexico City in 1970, he climbed the Latin\n",
96
+ "charts during that decade. Having achieved recognition as a balladeer, his\n",
97
+ "singing garnered universal critical acclaim from musical peers and media.\n",
98
+ "In the 1980s, after signing with Ariola Records, José rose to international\n",
99
+ "prominence as one of the most popular and talented Latin performers. His\n",
100
+ "1983 album Secretos has sold over four million units. With many\n",
101
+ "international hits, he received several Grammy nominations, sold more than\n",
102
+ "40 million albums and was once courted by music legend Frank Sinatra, who\n",
103
+ "wanted to win him for his own label. He sold out in venues such as Madison\n",
104
+ "Square Garden and Radio City Music Hall. His music reached non-Spanish-\n",
105
+ "speaking countries in Europe and Asia. He forged a career as an actor,\n",
106
+ "starring in movies such as Gavilán o Paloma (1985) and Perdóname Todo\n",
107
+ "(1995).\n"
108
  ]
109
  }
110
  ],
 
114
  },
115
  {
116
  "cell_type": "code",
117
+ "execution_count": 54,
118
+ "id": "a21740d8",
119
+ "metadata": {},
120
+ "outputs": [],
121
+ "source": [
122
+ "msg = 'studio album by Mercedes Sosa between 2000 and 2009'"
123
+ ]
124
+ },
125
+ {
126
+ "cell_type": "code",
127
+ "execution_count": 51,
128
+ "id": "5ef4d0cd",
129
+ "metadata": {},
130
+ "outputs": [],
131
+ "source": [
132
+ "msg = \"barrak obama\""
133
+ ]
134
+ },
135
+ {
136
+ "cell_type": "code",
137
+ "execution_count": 52,
138
  "id": "a9768b29",
139
  "metadata": {},
140
  "outputs": [],
141
  "source": [
142
+ "res = tools.wiki_RAG(msg)"
143
  ]
144
  },
145
  {
146
  "cell_type": "code",
147
+ "execution_count": 53,
148
  "id": "d140be5f",
149
  "metadata": {},
150
+ "outputs": [
151
+ {
152
+ "data": {
153
+ "text/plain": [
154
+ "[Document(id='5616d47e-c781-4235-9399-1902a19e0027', metadata={'source': 'https://en.wikipedia.org/wiki/Barrak', 'summary': 'Barrak (Arabic: ��رّاك) or Al-Barrak (Arabic: البرّاك) is a surname. Notable people with the surname include:\\n\\nAbdul-Rahman al-Barrak (born c. 1933), senior Saudi cleric\\nAbdulrahman bin Abdullah Al Barrak (born 1956), Saudi academic\\nMusallam Al-Barrak, member of the Kuwaiti National Assembly\\nNagib Barrak (born 1940), Lebanese alpine skier\\nRony Barrak, Lebanese musician and darbouka player and composer\\nSaad Al Barrak, Kuwaiti businessman and investor', 'title': 'Barrak'}, page_content='Barrak (Arabic: برّاك) or Al-Barrak (Arabic: البرّاك) is a surname. Notable people with the surname include:\\n\\nAbdul-Rahman al-Barrak (born c. 1933), senior Saudi cleric\\nAbdulrahman bin Abdullah Al Barrak (born 1956), Saudi academic\\nMusallam Al-Barrak, member of the Kuwaiti National Assembly\\nNagib Barrak (born 1940), Lebanese alpine skier\\nRony Barrak, Lebanese musician and darbouka player and composer\\nSaad Al Barrak, Kuwaiti businessman and investor\\n\\n\\n== See also ==\\nAll pages with titles containing Barrak\\nBarack (disambiguation)\\nBarack Obama, U.S. president\\nBarak (disambiguation)\\nBaraq (disambiguation)\\nBarrack (disambiguation)\\nBarracks\\nB-R-K'),\n",
155
+ " Document(id='6b35b789-0c32-4f6d-b487-396aa2e028ab', metadata={'source': 'https://en.wikipedia.org/wiki/Barack_Obama', 'title': 'Barack Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\"}, page_content='Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.'),\n",
156
+ " Document(id='f8375b7f-1867-4ac5-8dcc-4f95cd389acd', metadata={'source': 'https://en.wikipedia.org/wiki/Barack_Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\", 'title': 'Barack Obama'}, page_content=\"Obama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging\"),\n",
157
+ " Document(id='f2bbc8b9-723c-4450-89cd-e69e8d24d053', metadata={'source': 'https://en.wikipedia.org/wiki/Barack_Obama', 'title': 'Barack Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\"}, page_content='though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.'),\n",
158
+ " Document(id='a5f095d9-c6b2-49ef-ab79-8fdc9172ad2a', metadata={'title': 'Barack Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\", 'source': 'https://en.wikipedia.org/wiki/Barack_Obama'}, page_content=\"Obama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Fat\"),\n",
159
+ " Document(id='466cc0f7-f6eb-49b2-af9a-c09874bd4d4a', metadata={'title': 'Barack Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\", 'source': 'https://en.wikipedia.org/wiki/Barack_Obama'}, page_content='Born in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.'),\n",
160
+ " Document(id='225bb748-c745-4784-a906-16fd37845ec9', metadata={'title': 'Barack Obama', 'source': 'https://en.wikipedia.org/wiki/Barack_Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\"}, page_content=\"Obama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country\"),\n",
161
+ " Document(id='5564d870-41f8-41d4-9594-9c1d39a568c6', metadata={'source': 'https://en.wikipedia.org/wiki/Barack_Obama', 'title': 'Barack Obama', 'summary': \"Barack Hussein Obama II (born August 4, 1961) is an American politician who was the 44th president of the United States from 2009 to 2017. A member of the Democratic Party, he was the first African American president. Obama previously served as a U.S. senator representing Illinois from 2005 to 2008 and as an Illinois state senator from 1997 to 2004.\\nBorn in Honolulu, Hawaii, Obama graduated from Columbia University in 1983 with a Bachelor of Arts degree in political science and later worked as a community organizer in Chicago. In 1988, Obama enrolled in Harvard Law School, where he was the first black president of the Harvard Law Review. He became a civil rights attorney and an academic, teaching constitutional law at the University of Chicago Law School from 1992 to 2004. In 1996, Obama was elected to represent the 13th district in the Illinois Senate, a position he held until 2004, when he successfully ran for the U.S. Senate. In the 2008 presidential election, after a close primary campaign against Hillary Clinton, he was nominated by the Democratic Party for president. Obama selected Joe Biden as his running mate and defeated Republican nominee John McCain and his running mate Sarah Palin.\\nObama was awarded the 2009 Nobel Peace Prize for efforts in international diplomacy, a decision which drew both criticism and praise. During his first term, his administration responded to the 2008 financial crisis with measures including the American Recovery and Reinvestment Act of 2009, a major stimulus package to guide the economy in recovering from the Great Recession; a partial extension of the Bush tax cuts; legislation to reform health care; and the Dodd–Frank Wall Street Reform and Consumer Protection Act, a major financial regulation reform bill. Obama also appointed Supreme Court justices Sonia Sotomayor and Elena Kagan, the former being the first Hispanic American on the Supreme Court. He oversaw the end of the Iraq War and ordered Operation Neptune Spear, the raid that killed Osama bin Laden, who was responsible for the September 11 attacks. Obama downplayed Bush's counterinsurgency model, expanding air strikes and making extensive use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.\\nObama defeated Republican opponent Mitt Romney and his running mate Paul Ryan in the 2012 presidential election. In his second term, Obama advocated for gun control in the wake of the Sandy Hook Elementary School shooting, took steps to combat climate change, signing the Paris Agreement, a major international climate agreement, and an executive order to limit carbon emissions. Obama also presided over the implementation of the Affordable Care Act and other legislation passed in his first term. He initiated sanctions against Russia following the invasion in Ukraine and again after Russian interference in the 2016 U.S. elections, ordered military intervention in Iraq in response to gains made by ISIL following the 2011 withdrawal from Iraq, negotiated the Joint Comprehensive Plan of Action (a nuclear agreement with Iran), and normalized relations with Cuba. The number of American soldiers in Afghanistan decreased during Obama's second term, though U.S. soldiers remained in the country throughout the remainder of his presidency. Obama promoted inclusion for LGBT Americans, becoming the first sitting U.S. president to publicly support same-sex marriage.\\nObama left office in 2017 with high approval ratings both within the United States and among foreign advisories. He continues to reside in Washington, D.C., and remains politically active, campaigning for candidates in various American elections, including in Biden's successful presidential bid in the 2020 presidential election. Outside of politics, Obama has published three books: Dreams from My Father (1995), The Audacity of Hope (2006), and A Promised Land (2020). His presidential library began construction in the South Side of Chicago in 2021. Historians and political scientists rank Obama among the upper tier in historical rankings of U.S. presidents.\"}, page_content='use of special forces, while encouraging greater reliance on host-government militaries. He also ordered the 2011 military intervention in Libya to implement United Nations Security Council Resolution 1973, contributing to the overthrow of Muammar Gaddafi.')]"
162
+ ]
163
+ },
164
+ "execution_count": 53,
165
+ "metadata": {},
166
+ "output_type": "execute_result"
167
+ }
168
+ ],
169
  "source": [
170
+ "res"
171
  ]
172
  },
173
  {
174
  "cell_type": "code",
175
+ "execution_count": 33,
176
  "id": "7f334a2f",
177
  "metadata": {},
178
  "outputs": [
 
180
  "name": "stdout",
181
  "output_type": "stream",
182
  "text": [
183
+ "Germany). The list below gives the chancellors of West Germany; the government of East Germany was\n",
184
+ "and the German Democratic Republic (known as East Germany). The list below gives the chancellors of\n",
185
+ "== Federal Republic of Germany (1949–present) ==\n",
186
+ "In 1949, two separate German states were established: the Federal Republic of Germany (known as West Germany) and the German Democratic Republic (known as East Germany). The list below gives the chancellors of West Germany; the government of East Germany was headed by the chairman of the Council of Ministers. In 1990, East Germany was dissolved as it merged with West Germany; Germany was reunified. It retained the name of the Federal Republic of Germany.\n",
187
+ "Political parties:\n",
188
+ " CDU (6)\n",
189
+ " SPD (4)\n",
190
+ "\n",
191
+ "\n",
192
+ "== Timeline ==\n",
193
+ "\n",
194
+ "\n",
195
+ "== See also ==\n",
196
+ "\n",
197
+ "Leadership of East Germany\n",
198
+ "List of chancellors of Germany by time in offi\n",
199
  "The chancellor of Germany, officially the federal chancellor of the Federal Republic of Germany, is the head of the federal government of Germany. The chancellor is the chief executive of the Federal Cabinet and heads the executive branch. The chancellor is elected by the Bundestag on the proposal of the federal president and without debate (Article 63 of the German Constitution). During a state of defence declared by the Bundestag the chancellor also assumes the position of commander-in-chief of the Bundeswehr.\n",
200
  "Ten people (nine men and one woman) have served as chancellor of the Federal Republic of Germany, the first being Konrad Adenauer from 1949 to 1963. (Another 26 men had served as \"Reich chancellors\" of the previous German Empire from 1871 to 1945.) The current officeholder is Friedrich Merz of the Christian Democratic Union, sworn in on 6 May 2025.\n",
201
  "\n",
202
  "\n",
203
  "== History of the office (pre-1949) ==\n",
204
+ "Ten people (nine men and one woman) have served as chancellor of the Federal Republic of Germany,\n",
205
+ "to 1963. (Another 26 men had served as \"Reich chancellors\" of the previous German Empire from 1871\n",
206
+ "as chancellor of the Federal Republic of Germany, the first being Konrad Adenauer from 1949 to\n",
207
+ "== See also ==\n",
208
+ "\n",
209
+ "Leadership of East Germany\n",
210
+ "List of chancellors of Germany by time in offi\n"
211
  ]
212
  }
213
  ],
214
  "source": [
215
+ "print(res2)"
216
  ]
217
  },
218
  {
219
  "cell_type": "code",
220
+ "execution_count": 34,
221
  "id": "a6933d2d",
222
  "metadata": {},
223
  "outputs": [
224
  {
225
+ "ename": "AttributeError",
226
+ "evalue": "'str' object has no attribute 'page_content'",
227
+ "output_type": "error",
228
+ "traceback": [
229
+ "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
230
+ "\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)",
231
+ "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[34]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m print_(\u001b[43mres2\u001b[49m\u001b[43m[\u001b[49m\u001b[32;43m2\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m.\u001b[49m\u001b[43mpage_content\u001b[49m)\n",
232
+ "\u001b[31mAttributeError\u001b[39m: 'str' object has no attribute 'page_content'"
 
 
 
 
233
  ]
234
  }
235
  ],
 
239
  },
240
  {
241
  "cell_type": "code",
242
+ "execution_count": 6,
243
  "id": "08e04f44",
244
  "metadata": {},
245
  "outputs": [],
246
+ "source": [
247
+ "path_img = 'cca530fc-4052-43b2-b130-b30968d8aa44.png'\n",
248
+ "res = tools.image_analyser(path_img)"
249
+ ]
250
+ },
251
+ {
252
+ "cell_type": "code",
253
+ "execution_count": 7,
254
+ "id": "284e6c50",
255
+ "metadata": {},
256
+ "outputs": [
257
+ {
258
+ "data": {
259
+ "text/plain": [
260
+ "\"This image depicts a chess position on a standard 8x8 chessboard. The pieces are arranged as follows:\\n\\n### **White Pieces:**\\n- **King**: g1\\n- **Queen**: h5\\n- **Rooks**: e3\\n- **Bishops**: d3, c3\\n- **Pawns**: f2, g2, h3, a3\\n\\n### **Black Pieces:**\\n- **King**: g8\\n- **Queen**: b3\\n- **Rook**: d8\\n- **Bishop**: e6\\n- **Knight**: d5\\n- **Pawns**: f7, g7, h7, a7, b7, c7\\n\\nThe position appears to be mid-game, with both sides having developed their pieces. Black's queen is aggressively placed on b3, and White's queen is on h5, threatening the kingside.\""
261
+ ]
262
+ },
263
+ "execution_count": 7,
264
+ "metadata": {},
265
+ "output_type": "execute_result"
266
+ }
267
+ ],
268
+ "source": [
269
+ "res"
270
+ ]
271
+ },
272
+ {
273
+ "cell_type": "code",
274
+ "execution_count": null,
275
+ "id": "14ae331c",
276
+ "metadata": {},
277
+ "outputs": [],
278
  "source": []
279
  }
280
  ],