TzurVaich commited on
Commit
ec4f8ef
·
1 Parent(s): 711bfca

Work in progress

Browse files
Files changed (5) hide show
  1. .vscode/launch.json +28 -0
  2. app.py +609 -33
  3. poetry.lock +669 -1
  4. pyproject.toml +7 -1
  5. test_agents.py +10 -3
.vscode/launch.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ // Use IntelliSense to learn about possible attributes.
3
+ // Hover to view descriptions of existing attributes.
4
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5
+ "version": "0.2.0",
6
+ "configurations": [
7
+
8
+ {
9
+ "name": "Python Debugger: Current File",
10
+ "type": "debugpy",
11
+ "request": "launch",
12
+ "program": "${file}",
13
+ "console": "integratedTerminal"
14
+ },
15
+ {
16
+ "name": "Python with UTF-8",
17
+ "type": "python",
18
+ "request": "launch",
19
+ "program": "${workspaceFolder}/simple_test.py",
20
+ "console": "integratedTerminal",
21
+ "pythonArgs": [
22
+ "-X",
23
+ "utf8"
24
+ ],
25
+ "justMyCode": false
26
+ }
27
+ ]
28
+ }
app.py CHANGED
@@ -1,16 +1,33 @@
1
- import textwrap
2
  import re
3
  import os
4
  import gradio as gr
5
  import requests
6
  import inspect
7
  import datetime
 
 
8
  from textwrap import dedent
9
  import pandas as pd
 
 
 
 
 
 
10
  from dotenv import load_dotenv
11
 
 
12
  # Import smolagents components
13
- from smolagents import CodeAgent, HfApiModel, DuckDuckGoSearchTool, FinalAnswerTool
 
 
 
 
 
 
 
 
 
14
 
15
  # Load environment variables from .env file
16
  load_dotenv()
@@ -22,10 +39,445 @@ DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
22
  # --- Basic Agent Definition ---
23
  # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
24
 
 
 
 
 
 
 
 
25
  # Initialize the search tool
26
  search_tool = DuckDuckGoSearchTool()
27
 
28
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  class BasicAgent:
30
  def __init__(self):
31
  print("BasicAgent initialized.")
@@ -42,45 +494,171 @@ class BasicAgent:
42
  with open(self.filename, 'w', encoding='utf-8') as f:
43
  f.write('') # Create empty file
44
 
45
-
46
  # Initialize the Large Language Model
47
  # The model is used by both agents in this simple setup
48
- self.model = HfApiModel(model_id="Qwen/Qwen2.5-Coder-32B-Instruct")
49
  # mistralai/Mixtral-8x7B-Instruct-v0.1
 
 
50
  #self.model = HfApiModel(model_id="mistralai/Mixtral-8x7B-Instruct-v0.1")
51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
 
53
  # Define the Web Search Agent
54
  # This agent is specialised for searching the web using a specific tool
55
- self.web_search_agent = CodeAgent(
56
- model=self.model, # Assign the model to the agent [
57
- tools=[DuckDuckGoSearchTool(),
58
- FinalAnswerTool()], # Provide the web search tool
59
- name="web_search_agent", # Give the agent a name
60
- # Describe its capability [
61
- description="Searches the web for information.",
62
- verbosity_level=1, # Set verbosity level for logging
63
- max_steps=5, # Limit the steps the agent can take
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  )
65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  # Define the Manager Agent
67
  # This agent manages tasks and delegates to other agents
68
  self.manager_agent = CodeAgent(
69
  model=self.model, # Assign the model to the manager
70
- tools=[FinalAnswerTool()],
71
- managed_agents=[self.web_search_agent], # Specify the agents this manager oversees
 
 
 
 
 
 
 
 
72
  name="manager_agent", # Give the manager agent a name
73
  description="Manages tasks by delegating to other agents.", # Describe its role
74
  additional_authorized_imports=[
75
  "json", "re", "pandas", "numpy", "math", "collections", "itertools", "stat", "statistics", "queue", "unicodedata", "time", "random", "datetime"], # Allow specific imports
76
  verbosity_level=1, # Set verbosity level
77
  max_steps=5, # Limit the steps
 
 
78
  )
79
 
80
  print("MultiAgentSystem initialization complete.")
81
 
82
 
83
- def __call__(self, question: str) -> str:
 
84
  print(f"Agent received question (first 50 chars): {question[:50]}...")
85
 
86
 
@@ -100,23 +678,15 @@ class BasicAgent:
100
 
101
  {question}
102
 
103
- Please analyze this question and determine the best approach to answer it.
104
- If needed, use web search to find relevant information.
105
- Provide a concise, accurate answer to the question.
106
 
107
- IMPORTANT: If you identify that specialized tools are needed that you don't have access to, respond with:
108
- "Missing Tool Warning: Can't process the question. Missing tool for [specify the missing capability]."
 
 
 
 
109
 
110
- Examples of missing capabilities to check for:
111
- - YouTube video analysis (if question mentions YouTube videos)
112
- - Image analysis (if question refers to analyzing images)
113
- - Audio file processing (if question refers to audio files)
114
- - Excel/spreadsheet analysis (if question refers to Excel files)
115
- - Chess position analysis (if question refers to chess positions)
116
- - Code execution (if question requires running Python code)
117
-
118
- Only use the "Missing Tool Warning" format if you CANNOT answer the question with your available tools.
119
- If you can answer the question with web search or your existing knowledge, provide the answer.
120
  """)
121
 
122
  manager_agent_response = "I apologize, but I couldn't find an answer to this question."
@@ -144,7 +714,7 @@ class BasicAgent:
144
  return manager_agent_response
145
 
146
 
147
- def run_and_submit_all( profile: gr.OAuthProfile | None):
148
  """
149
  Fetches all questions, runs the BasicAgent on them, submits all answers,
150
  and displays the results.
@@ -201,11 +771,17 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
201
  for item in questions_data:
202
  task_id = item.get("task_id")
203
  question_text = item.get("question")
 
 
 
 
 
204
  if not task_id or question_text is None:
205
  print(f"Skipping item with missing task_id or question: {item}")
206
  continue
 
207
  try:
208
- submitted_answer = agent(question_text)
209
  answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
210
  results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": submitted_answer})
211
  except Exception as e:
 
 
1
  import re
2
  import os
3
  import gradio as gr
4
  import requests
5
  import inspect
6
  import datetime
7
+ from markdownify import markdownify
8
+ import textwrap
9
  from textwrap import dedent
10
  import pandas as pd
11
+ import wikipedia
12
+ import requests
13
+ from requests.exceptions import RequestException
14
+ from youtube_transcript_api import YouTubeTranscriptApi
15
+ from urllib.parse import urlparse, parse_qs
16
+
17
  from dotenv import load_dotenv
18
 
19
+
20
  # Import smolagents components
21
+ from smolagents import (
22
+ tool,
23
+ CodeAgent,
24
+ HfApiModel,
25
+ DuckDuckGoSearchTool,
26
+ FinalAnswerTool,
27
+ OpenAIServerModel,
28
+ ToolCallingAgent
29
+ )
30
+ from pypdf import PdfReader
31
 
32
  # Load environment variables from .env file
33
  load_dotenv()
 
39
  # --- Basic Agent Definition ---
40
  # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
41
 
42
+ # Get the directory of the current script
43
+ current_dir = os.path.dirname(os.path.abspath(__file__))
44
+
45
+ # Create path to the validation directory
46
+ GAIA_LEVEL1_VALIDATION_FILES_PATH = os.path.join(
47
+ current_dir, "GAIA_level1", "validation")
48
+
49
  # Initialize the search tool
50
  search_tool = DuckDuckGoSearchTool()
51
 
52
 
53
+ @tool
54
+ def load_docx_file(file_path: str) -> str:
55
+ """
56
+ Loads and returns text and tables from a DOCX file in their original order.
57
+
58
+ Args:
59
+ file_path: Path to the .docx file
60
+
61
+ Returns:
62
+ String with paragraphs and markdown-formatted tables in document order.
63
+ """
64
+ from docx import Document
65
+ from docx.table import Table
66
+ from docx.text.paragraph import Paragraph
67
+
68
+ doc = Document(file_path)
69
+ content = []
70
+ table_count = 0
71
+
72
+ # Helper function to convert a table to markdown
73
+ def table_to_markdown(table, table_idx):
74
+ rows = []
75
+ for row in table.rows:
76
+ cells = [cell.text.strip() for cell in row.cells]
77
+ rows.append("| " + " | ".join(cells) + " |")
78
+ # Add markdown separator after header if table has at least one row
79
+ if rows:
80
+ separator = "| " + \
81
+ " | ".join(["---"] * len(table.rows[0].cells)) + " |"
82
+ markdown = f"\n### Table {table_idx}\n" + \
83
+ "\n".join([rows[0], separator] + rows[1:])
84
+ return markdown
85
+ return ""
86
+
87
+ # Iterate through the document's block elements in order
88
+ for block in doc.element.body:
89
+ if block.tag.endswith('}p'): # Paragraph
90
+ para = Paragraph(block, doc)
91
+ text = para.text.strip()
92
+ if text:
93
+ content.append(text)
94
+ elif block.tag.endswith('}tbl'): # Table
95
+ table_count += 1
96
+ table = Table(block, doc)
97
+ markdown = table_to_markdown(table, table_count)
98
+ if markdown:
99
+ content.append(markdown)
100
+
101
+ return "\n\n".join(content)
102
+
103
+
104
+ @tool
105
+ def load_pdf_file(file_path: str) -> str:
106
+ """
107
+ Loads and returns text content from a PDF file.
108
+
109
+ Args:
110
+ file_path (str): The path to the .pdf file.
111
+
112
+ Returns:
113
+ str: The extracted text content from the PDF file. Returns an error message if the file cannot be processed.
114
+ """
115
+ extracted_text = []
116
+ try:
117
+ # Check if the file exists
118
+ if not os.path.exists(file_path):
119
+ return f"Error: PDF file not found at path: {file_path}"
120
+
121
+ # Open the PDF file
122
+ reader = PdfReader(file_path)
123
+
124
+ # Iterate through each page and extract text
125
+ for page_num, page in enumerate(reader.pages):
126
+ text = page.extract_text()
127
+ if text: # Ensure text was extracted
128
+ extracted_text.append(f"--- Page {page_num + 1} ---\n{text.strip()}")
129
+ else:
130
+ extracted_text.append(f"--- Page {page_num + 1} --- (No text extracted)")
131
+
132
+ # Join the text from all pages
133
+ full_text = "\n\n".join(extracted_text)
134
+ if not full_text.strip():
135
+ return f"Warning: No text could be extracted from the PDF file: {file_path}"
136
+ return full_text
137
+
138
+ except Exception as e:
139
+ # Catch any other exceptions during PDF processing
140
+ return f"Error processing PDF file '{file_path}': {type(e).__name__}: {e}"
141
+
142
+ @tool
143
+ def load_xlsx_file_as_markdown(file_path: str) -> str:
144
+ """
145
+ Loads data from all sheets of an XLSX file and returns it as a single
146
+ markdown-formatted string.
147
+
148
+ Args:
149
+ file_path (str): The path to the .xlsx file.
150
+
151
+ Returns:
152
+ str: A string containing the data from all sheets, formatted as markdown tables.
153
+ Returns an error message if the file cannot be processed.
154
+ """
155
+ extracted_content = []
156
+ try:
157
+ # Check if the file exists
158
+ if not os.path.exists(file_path):
159
+ return f"Error: XLSX file not found at path: {file_path}"
160
+
161
+ # Read all sheets from the Excel file into a dictionary of DataFrames
162
+ # sheet_name=None reads all sheets
163
+ excel_data = pd.read_excel(file_path, sheet_name=None)
164
+
165
+ if not excel_data:
166
+ return f"Warning: No sheets found or the XLSX file is empty: {file_path}"
167
+
168
+ # Iterate through each sheet and convert its DataFrame to markdown
169
+ for sheet_name, df in excel_data.items():
170
+ if not df.empty:
171
+ # Convert DataFrame to markdown table string, excluding the index
172
+ markdown_table = df.to_markdown(index=False)
173
+ extracted_content.append(f"--- Sheet: {sheet_name} ---\n{markdown_table}")
174
+ else:
175
+ extracted_content.append(f"--- Sheet: {sheet_name} --- (Sheet is empty)")
176
+
177
+ # Join the content from all sheets
178
+ full_content = "\n\n".join(extracted_content)
179
+ if not full_content.strip():
180
+ return f"Warning: No data could be extracted from the XLSX file: {file_path}"
181
+ return full_content
182
+
183
+ except FileNotFoundError:
184
+ return f"Error: XLSX file not found at path: {file_path}"
185
+ except Exception as e:
186
+ # Catch pandas-specific errors or other general exceptions
187
+ return f"Error processing XLSX file '{file_path}': {type(e).__name__}: {e}"
188
+
189
+
190
+ @tool
191
+ def load_xlsx_file_as_dataframe(file_path: str) -> pd.DataFrame:
192
+ """
193
+ Loads data from the first sheet of an XLSX file and returns it as a pandas DataFrame.
194
+
195
+ Args:
196
+ file_path (str): The path to the .xlsx file.
197
+
198
+ Returns:
199
+ pd.DataFrame: A pandas DataFrame containing the data from the first sheet.
200
+ Returns an empty DataFrame if the file is empty or cannot be processed.
201
+ """
202
+ try:
203
+ # Check if the file exists
204
+ if not os.path.exists(file_path):
205
+ print(
206
+ f"Warning: XLSX file not found at path: {file_path}. Returning empty DataFrame.")
207
+ return pd.DataFrame()
208
+
209
+ # Read the first sheet (index 0) from the Excel file
210
+ # If the first sheet is empty or doesn't exist, it might raise an error or return empty
211
+ # Using try-except to handle cases where the sheet might not exist or is unreadable
212
+ df = pd.read_excel(file_path, sheet_name=0)
213
+
214
+ # Return the DataFrame (it will be empty if the sheet was empty)
215
+ return df
216
+
217
+ except FileNotFoundError:
218
+ # Return empty DataFrame if file not found (alternative to raising error)
219
+ print(
220
+ f"Warning: XLSX file not found at path: {file_path}. Returning empty DataFrame.")
221
+ return pd.DataFrame()
222
+ except Exception as e:
223
+ # Catch pandas-specific errors or other general exceptions
224
+ print(
225
+ f"Error processing XLSX file '{file_path}': {type(e).__name__}: {e}. Returning empty DataFrame.")
226
+ return pd.DataFrame() # Return empty DataFrame on error
227
+
228
+
229
+ @tool
230
+ def visit_webpage(url: str) -> str:
231
+ """Visits a webpage at the given URL and returns its content as a markdown string.
232
+
233
+ Args:
234
+ url: The URL of the webpage to visit.
235
+
236
+ Returns:
237
+ The content of the webpage converted to Markdown, or an error message if the request fails.
238
+ """
239
+ try:
240
+ # Send a GET request to the URL
241
+ response = requests.get(url, timeout=10)
242
+ response.raise_for_status() # Raise an exception for bad status codes
243
+
244
+ # Convert the HTML content to Markdown
245
+ markdown_content = markdownify(response.text).strip()
246
+
247
+ # Remove multiple line breaks
248
+ markdown_content = re.sub(r"\n{3,}", "\n\n", markdown_content)
249
+
250
+ return markdown_content
251
+
252
+ except RequestException as e:
253
+ return f"Error fetching the webpage: {str(e)}"
254
+ except Exception as e:
255
+ return f"An unexpected error occurred: {str(e)}"
256
+
257
+
258
+ @tool
259
+ def query_wikipedia(query: str, sentences: int = 5) -> str:
260
+ """
261
+ Searches Wikipedia for a given query and returns a summary of the most relevant page.
262
+ Use this tool especially when Wikipedia is mentioned in the context.
263
+
264
+ Args:
265
+ query (str): The search term or question for Wikipedia.
266
+ sentences (int): The desired number of sentences for the summary (default: 5).
267
+
268
+ Returns:
269
+ str: A summary of the Wikipedia page, a list of options if the query is ambiguous,
270
+ or an error message if the page is not found or another error occurs.
271
+ """
272
+ try:
273
+ # Set language if needed, defaults to English
274
+ # wikipedia.set_lang("en")
275
+
276
+ # auto_suggest=False prevents Wikipedia from guessing if the exact title isn't found.
277
+ # We handle potential suggestions in the PageError exception if needed.
278
+ summary = wikipedia.summary(
279
+ query, sentences=sentences, auto_suggest=False)
280
+
281
+ # Optionally, get the actual page title found
282
+ try:
283
+ page_title = wikipedia.page(query, auto_suggest=False).title
284
+ return f"Wikipedia Summary for '{page_title}':\n\n{summary}"
285
+ except wikipedia.exceptions.PageError:
286
+ # If getting the page title fails after summary worked (unlikely but possible)
287
+ return f"Wikipedia Summary (Query: '{query}'):\n\n{summary}"
288
+ except wikipedia.exceptions.DisambiguationError as e:
289
+ # If getting the page title causes disambiguation after summary worked
290
+ return f"Wikipedia Summary (Query: '{query}'):\n\n{summary}\n\nNote: Query might be ambiguous. Options include: {e.options}"
291
+
292
+ except wikipedia.exceptions.DisambiguationError as e:
293
+ # Handle cases where the query matches multiple pages
294
+ options_list = "\n - ".join(e.options[:10]) # Limit to 10 options
295
+ return (f"Wikipedia query '{query}' is ambiguous. "
296
+ f"Please be more specific or choose from these options:\n - {options_list}")
297
+
298
+ except wikipedia.exceptions.PageError:
299
+ # Handle cases where the page doesn't exist
300
+ # Try searching for suggestions
301
+ search_results = wikipedia.search(query, results=5)
302
+ if search_results:
303
+ suggestions = "\n - ".join(search_results)
304
+ return (f"Wikipedia page for '{query}' not found. "
305
+ f"Did you mean one of these?\n - {suggestions}")
306
+ else:
307
+ return f"Wikipedia page for '{query}' not found, and no suggestions available."
308
+
309
+ except Exception as e:
310
+ # Handle other potential errors (network issues, etc.)
311
+ return f"Error querying Wikipedia for '{query}': {type(e).__name__}: {e}"
312
+
313
+
314
+ @tool
315
+ def openai_reasoning(question: str) -> str:
316
+ """
317
+ Uses OpenAI's GPT-4o model for in-depth reasoning and analysis of complex questions.
318
+ Use this for riddles, puzzles, or questions that require deep thinking rather than code execution.
319
+
320
+ Args:
321
+ question: The question or problem to analyze using GPT-4o's reasoning capabilities.
322
+
323
+ Returns:
324
+ The reasoned answer to the question.
325
+ """
326
+ try:
327
+ # Create a specialized reasoning model instance
328
+ reasoning_model = OpenAIServerModel(
329
+ "gpt-4o",
330
+ max_tokens=1024,
331
+ temperature=0.05
332
+ )
333
+
334
+ # Craft effective system and user prompts
335
+ messages = [
336
+ {
337
+ "role": "system",
338
+ "content": """You are an expert reasoning engine specialized in solving complex problems, puzzles and riddles.
339
+ When tackling problems:
340
+ 1. Understand the question thoroughly
341
+ 2. Break down complex problems into parts
342
+ 3. Consider multiple approaches before deciding on a solution
343
+ 4. Think step by step
344
+ 5. Provide only the final answer unless asked for reasoning
345
+
346
+ Be precise and concise in your final response."""
347
+ },
348
+ {
349
+ "role": "user",
350
+ "content": question
351
+ }
352
+ ]
353
+
354
+ # Get the response
355
+ response = reasoning_model(messages)
356
+
357
+ # Return just the content from the response
358
+ return response.content
359
+
360
+ except Exception as e:
361
+ return f"Error when processing with reasoning model: {str(e)}"
362
+
363
+
364
+ @tool
365
+ def extract_youtube_id(url: str) -> str:
366
+ """
367
+ Extract the YouTube video ID from a URL.
368
+
369
+ Args:
370
+ url: The YouTube video URL (may contain spaces or formatting issues)
371
+
372
+ Returns:
373
+ The YouTube video ID
374
+ """
375
+ # Clean the URL by removing extra spaces
376
+ cleaned_url = url.replace(" ", "")
377
+
378
+ try:
379
+ # Handle different YouTube URL formats
380
+ parsed_url = urlparse(cleaned_url)
381
+
382
+ # Check for video ID in query parameters (youtube.com/watch?v=VIDEO_ID)
383
+ query_params = parse_qs(parsed_url.query)
384
+ if 'v' in query_params:
385
+ return query_params['v'][0]
386
+
387
+ # Check for youtu.be short links (youtu.be/VIDEO_ID)
388
+ if 'youtu.be' in parsed_url.netloc:
389
+ path = parsed_url.path.strip('/')
390
+ return path
391
+
392
+ # Check for embedded format (youtube.com/embed/VIDEO_ID)
393
+ if '/embed/' in parsed_url.path:
394
+ return parsed_url.path.split('/embed/')[1]
395
+
396
+ # If URL parsing fails, try regex patterns
397
+ patterns = [
398
+ r'(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/|youtube\.com\/v\/|youtube\.com\/e\/|youtube\.com\/watch\?.*v=|youtube\.com\/watch\?.*&v=)([^&\s]+)',
399
+ r'(?:youtube\.com\/shorts\/)([^&\s]+)',
400
+ r'v=([^&\s]+)'
401
+ ]
402
+
403
+ for pattern in patterns:
404
+ match = re.search(pattern, cleaned_url)
405
+ if match:
406
+ return match.group(1)
407
+
408
+ # Try to extract directly from the raw string as a last resort
409
+ if 'v=' in cleaned_url:
410
+ v_index = cleaned_url.find('v=')
411
+ video_id = cleaned_url[v_index +
412
+ 2:].split('&')[0].split('#')[0].split('?')[0].split('/')[0]
413
+ # YouTube IDs are typically 11 characters
414
+ if video_id and len(video_id) in range(10, 12):
415
+ return video_id
416
+
417
+ return "Could not extract a valid YouTube video ID from the provided URL."
418
+
419
+ except Exception as e:
420
+ # Attempt direct extraction if parsing fails
421
+ if 'v=' in url:
422
+ parts = url.split('v=')
423
+ if len(parts) > 1:
424
+ return parts[1].split('&')[0].split('#')[0].strip()
425
+
426
+ return f"Error extracting YouTube ID: {str(e)}"
427
+
428
+
429
+ @tool
430
+ def get_youtube_transcript(video_id: str, language: str = "en") -> str:
431
+ """
432
+ Get the transcript of a YouTube video.
433
+
434
+ Args:
435
+ video_id: The YouTube video ID
436
+ language: The language code for the transcript (default: 'en' for English)
437
+
438
+ Returns:
439
+ The transcript text of the YouTube video
440
+ """
441
+ try:
442
+ transcript_list = YouTubeTranscriptApi.get_transcript(
443
+ video_id, languages=[language])
444
+
445
+ # Combine all transcript segments into a single text
446
+ transcript_text = ""
447
+ for segment in transcript_list:
448
+ transcript_text += segment['text'] + " "
449
+
450
+ return transcript_text.strip()
451
+
452
+ except Exception as e:
453
+ return f"Error retrieving transcript: {str(e)}"
454
+
455
+ # Tool to analyze the transcript and answer a question
456
+ @tool
457
+ def analyze_transcript(transcript: str, question: str) -> str:
458
+ """
459
+ Analyze the provided video transcript to answer a specific question.
460
+
461
+ Args:
462
+ transcript: The full transcript text of the video
463
+ question: The specific question to answer based on the transcript
464
+
465
+ Returns:
466
+ The answer to the question based on the transcript content
467
+ """
468
+ # This tool leverages the LLM's understanding capability
469
+ # The implementation is simple because the LLM will do the analysis
470
+ if not transcript or transcript.startswith("Error"):
471
+ return f"Unable to analyze transcript: {transcript}"
472
+
473
+ # Check if transcript has enough content to analyze
474
+ if len(transcript.split()) < 10:
475
+ return "The transcript is too short or incomplete to properly analyze."
476
+
477
+ return "TRANSCRIPT_ANALYSIS_PLACEHOLDER" # This will be replaced by LLM reasoning
478
+
479
+
480
+
481
  class BasicAgent:
482
  def __init__(self):
483
  print("BasicAgent initialized.")
 
494
  with open(self.filename, 'w', encoding='utf-8') as f:
495
  f.write('') # Create empty file
496
 
 
497
  # Initialize the Large Language Model
498
  # The model is used by both agents in this simple setup
 
499
  # mistralai/Mixtral-8x7B-Instruct-v0.1
500
+ # meta-llama/Llama-3.3-70B-Instruct
501
+ self.model = HfApiModel(model_id="Qwen/Qwen2.5-Coder-32B-Instruct")
502
  #self.model = HfApiModel(model_id="mistralai/Mixtral-8x7B-Instruct-v0.1")
503
 
504
+ # For TGI container
505
+ # self.model = OpenAIServerModel(
506
+ # api_base="http://localhost:8080/v1", # If using TGI container
507
+ # api_key="not-needed", # Local servers usually don't need API keys
508
+ # model_id="Qwen/Qwen3-1.7B"
509
+ # )
510
+ # self.model = LiteLLMModel(
511
+ # model_name="ollama/qwen3:1.7b", # Prefix with 'ollama/' to use the Ollama provider
512
+ # api_base="http://localhost:11434", # Your custom Ollama port
513
+ # flatten_messages_as_text=True,
514
+ # api_key="", # Try passing an empty API key
515
+ # )
516
+
517
+
518
+ #print(self.model)
519
+ #print(f"Model Name: {self.model.model_name}")
520
+ #print(f"API Base: {self.model.api_base}")
521
 
522
  # Define the Web Search Agent
523
  # This agent is specialised for searching the web using a specific tool
524
+ # self.web_search_agent = CodeAgent(
525
+ # model=self.model, # Assign the model to the agent [
526
+ # tools=[DuckDuckGoSearchTool(),
527
+ # FinalAnswerTool()], # Provide the web search tool
528
+ # name="web_search_agent", # Give the agent a name
529
+ # # Describe its capability [
530
+ # description="""Searches the web for information.
531
+
532
+ # In the end you have to return a final answer using the `final_answer` tool.""",
533
+ # verbosity_level=1, # Set verbosity level for logging
534
+ # max_steps=3, # Limit the steps the agent can take
535
+ # planning_interval=2,
536
+ # )
537
+
538
+ self.web_search_specialist_agent = ToolCallingAgent(
539
+ model=self.model, # Or any other compatible model instance
540
+ tools=[
541
+ DuckDuckGoSearchTool(),
542
+ query_wikipedia, # Make sure this is the @tool decorated function
543
+ visit_webpage,
544
+ FinalAnswerTool()
545
+ ],
546
+ name="web_search_specialist_agent",
547
+ description=textwrap.dedent("""\
548
+ This agent specializes in finding information on the web and answering questions based on web content.
549
+
550
+ **Core Strategy:**
551
+ 1. **Understand & Plan:** For any query, especially complex ones or those requiring information from specific sources, first formulate a clear, step-by-step plan. Think about what information is needed and which tools are best for each step.
552
+ 2. **Execute & Adapt:** Execute your plan step-by-step. After each step, review the results and adapt your plan if necessary.
553
+ 3. **Extract & Synthesize:** Once relevant information is found (e.g., on a webpage), don't just return raw data. Carefully extract the specific piece of information that answers the original question.
554
+
555
+ **Tool Usage Guidelines:**
556
+ - Use the `DuckDuckGoSearchTool` for general web searches, to find broad information, current events, or to locate specific websites or pages when the URL is unknown.
557
+ - If `DuckDuckGoSearchTool` returns URLs, evaluate them. If a URL seems promising for answering the question, a subsequent step in your plan should be to use the `visit_webpage` tool.
558
+ - Use the `query_wikipedia` tool when the question specifically asks for information from Wikipedia, or when Wikipedia is clearly the most authoritative source (e.g., for definitions, historical events, biographical information).
559
+ - Use the `visit_webpage` tool to get the content of a specific URL.
560
+ - **Crucially**: After using `visit_webpage`, your next step is to analyze its content and extract the precise information needed to answer the query. Do not just output the entire page content as the answer.
561
+ - If the query explicitly mentions a specific website (e.g., "Merriam-Webster", "Cornell Law School website"), your plan should prioritize searching that site.
562
+ - Use `DuckDuckGoSearchTool` with site-specific queries (e.g., "site:merriam-webster.com <your actual query terms>").
563
+ - If a direct URL from that site is found or can be inferred, use `visit_webpage` to get the content, then extract the specific information.
564
+
565
+ **Search & Iteration Tactics:**
566
+ - Before taking a new action, review the information and results from your previous steps. Use this history to inform your decisions and refine your plan.
567
+ - Do not repeat the exact same or very similar queries to the same tool if the initial attempt did not yield useful information. Use knowledge from past attempts to refine your strategy.
568
+ - If information is not found, consider: rephrasing your query, trying a different aspect of the question, or using an alternative search tool, always considering what you've learned.
569
+ - Be aware of date format sensitivity in searches. If a date is part of your query, try alternative formats (e.g., "27 July 2010" vs "27/7/2010").
570
+
571
+ **Final Output:**
572
+ - In the end, you must return a final answer using the `final_answer` tool, based on the information you have gathered and processed according to your plan.
573
+ """),
574
+ verbosity_level=1, # Adjust as needed
575
+ max_steps=3, # Adjust as needed
576
+ planning_interval=1 # Adjust as needed
577
  )
578
 
579
+
580
+ # Define your model
581
+ self.code_model = "gpt-4.1" # or whatever model you're using
582
+ reasoning_model = OpenAIServerModel(
583
+ self.code_model,
584
+ max_completion_tokens=8096
585
+ )
586
+
587
+ # Create your agent with the reasoning tool and other tools
588
+ self.reasoning_agent = ToolCallingAgent(
589
+ model=reasoning_model,
590
+ tools=[openai_reasoning, FinalAnswerTool()],
591
+ planning_interval=2,
592
+ max_steps=5,
593
+ verbosity_level=1,
594
+ name="reasoning_agent",
595
+ description="""Solves complex problems riddles and puzzles through reasoning rather than code execution.
596
+ In the end you have to return a final answer using the `final_answer` tool."""
597
+ )
598
+
599
+ self.youtube_qa_agent = ToolCallingAgent(
600
+ model=reasoning_model, #self.model,
601
+ tools=[extract_youtube_id, get_youtube_transcript,
602
+ analyze_transcript, FinalAnswerTool()],
603
+ name="youtube_qa_agent",
604
+ planning_interval=2,
605
+ max_steps=5,
606
+ verbosity_level=1,
607
+ description=textwrap.dedent("""\
608
+ You are an expert assistant that can answer questions about YouTube videos by analyzing their transcripts.
609
+
610
+ When given a YouTube URL and a question, follow these steps IN ORDER:
611
+ 1. Extract the video ID from the URL using the `extract_youtube_id` tool
612
+ 2. Retrieve the transcript of the video using the `get_youtube_transcript` tool
613
+ 3. ALWAYS analyze the transcript to find the answer to the question using the `analyze_transcript` tool
614
+ 4. Provide a clear and concise answer based solely on the transcript content
615
+ 5. Return your final answer using the `final_answer` tool
616
+
617
+ IMPORTANT INSTRUCTIONS:
618
+ - After getting the transcript, you MUST use the analyze_transcript tool. DO NOT call get_youtube_transcript twice.
619
+ - Never skip the analysis step - it's crucial for answering the question correctly.
620
+ - Each tool must be used in the correct sequence - ID extraction, then transcript retrieval, then analysis.
621
+
622
+ If you cannot find a direct answer to the question in the transcript:
623
+ - Acknowledge that you couldn't find a specific answer
624
+ - Provide the transcript for reference
625
+ - Suggest that the user might want to use a different approach
626
+
627
+ DO NOT run the same tool with the same arguments multiple times.
628
+ DO NOT make up information that is not in the transcript.
629
+ """)
630
+ )
631
+
632
+
633
  # Define the Manager Agent
634
  # This agent manages tasks and delegates to other agents
635
  self.manager_agent = CodeAgent(
636
  model=self.model, # Assign the model to the manager
637
+ tools=[load_docx_file,
638
+ load_pdf_file,
639
+ load_xlsx_file_as_dataframe,
640
+ load_xlsx_file_as_markdown,
641
+ query_wikipedia,
642
+ FinalAnswerTool()],
643
+ # Specify the agents this manager oversees
644
+ managed_agents=[self.web_search_specialist_agent,
645
+ self.reasoning_agent,
646
+ self.youtube_qa_agent],
647
  name="manager_agent", # Give the manager agent a name
648
  description="Manages tasks by delegating to other agents.", # Describe its role
649
  additional_authorized_imports=[
650
  "json", "re", "pandas", "numpy", "math", "collections", "itertools", "stat", "statistics", "queue", "unicodedata", "time", "random", "datetime"], # Allow specific imports
651
  verbosity_level=1, # Set verbosity level
652
  max_steps=5, # Limit the steps
653
+ planning_interval=1,
654
+ #final_answer_checks=[]
655
  )
656
 
657
  print("MultiAgentSystem initialization complete.")
658
 
659
 
660
+ def __call__(self, question: str,
661
+ file_name: str = None) -> str:
662
  print(f"Agent received question (first 50 chars): {question[:50]}...")
663
 
664
 
 
678
 
679
  {question}
680
 
681
+ using the following file: '{file_name}' if provided.
 
 
682
 
683
+ Please analyze this question and determine the best approach to answer it
684
+ using the available agents and tools.
685
+ Note that you are provided with a special agent to resolve logical problems, riddles and puzzles named "reasoning_agent".
686
+
687
+ If needed, use any of the available tools to find or load the relevant information.
688
+ Provide a concise, accurate answer to the question.
689
 
 
 
 
 
 
 
 
 
 
 
690
  """)
691
 
692
  manager_agent_response = "I apologize, but I couldn't find an answer to this question."
 
714
  return manager_agent_response
715
 
716
 
717
+ def run_and_submit_all(profile: gr.OAuthProfile | None):
718
  """
719
  Fetches all questions, runs the BasicAgent on them, submits all answers,
720
  and displays the results.
 
771
  for item in questions_data:
772
  task_id = item.get("task_id")
773
  question_text = item.get("question")
774
+ file_name = item.get("file_name", None)
775
+ if file_name:
776
+ file_name = os.path.join(GAIA_LEVEL1_VALIDATION_FILES_PATH, file_name)
777
+
778
+ continue
779
  if not task_id or question_text is None:
780
  print(f"Skipping item with missing task_id or question: {item}")
781
  continue
782
+
783
  try:
784
+ submitted_answer = agent(question_text, file_name)
785
  answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
786
  results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": submitted_answer})
787
  except Exception as e:
poetry.lock CHANGED
@@ -559,6 +559,18 @@ tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "elasticsearch (>=7.
559
  torch = ["torch"]
560
  vision = ["Pillow (>=9.4.0)"]
561
 
 
 
 
 
 
 
 
 
 
 
 
 
562
  [[package]]
563
  name = "dill"
564
  version = "0.3.8"
@@ -575,6 +587,18 @@ files = [
575
  graph = ["objgraph (>=1.7.2)"]
576
  profile = ["gprof2dot (>=2022.7.29)"]
577
 
 
 
 
 
 
 
 
 
 
 
 
 
578
  [[package]]
579
  name = "duckduckgo-search"
580
  version = "8.0.1"
@@ -595,6 +619,18 @@ primp = ">=0.15.0"
595
  [package.extras]
596
  dev = ["mypy (>=1.14.1)", "pytest (>=8.3.4)", "pytest-dependency (>=0.6.0)", "ruff (>=0.9.2)"]
597
 
 
 
 
 
 
 
 
 
 
 
 
 
598
  [[package]]
599
  name = "fastapi"
600
  version = "0.115.12"
@@ -1062,6 +1098,30 @@ files = [
1062
  [package.extras]
1063
  all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
1064
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1065
  [[package]]
1066
  name = "itsdangerous"
1067
  version = "2.2.0"
@@ -1092,6 +1152,158 @@ MarkupSafe = ">=2.0"
1092
  [package.extras]
1093
  i18n = ["Babel (>=2.7)"]
1094
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1095
  [[package]]
1096
  name = "lxml"
1097
  version = "5.4.0"
@@ -1566,6 +1778,48 @@ files = [
1566
  {file = "numpy-2.2.5.tar.gz", hash = "sha256:a9c0d994680cd991b1cb772e8b297340085466a6fe964bc9d4e80f5e2f43c291"},
1567
  ]
1568
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1569
  [[package]]
1570
  name = "orjson"
1571
  version = "3.10.16"
@@ -2251,6 +2505,26 @@ files = [
2251
  [package.extras]
2252
  windows-terminal = ["colorama (>=0.4.6)"]
2253
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2254
  [[package]]
2255
  name = "python-dateutil"
2256
  version = "2.9.0.post0"
@@ -2266,6 +2540,22 @@ files = [
2266
  [package.dependencies]
2267
  six = ">=1.5"
2268
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2269
  [[package]]
2270
  name = "python-dotenv"
2271
  version = "1.1.0"
@@ -2368,6 +2658,127 @@ files = [
2368
  {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
2369
  ]
2370
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2371
  [[package]]
2372
  name = "requests"
2373
  version = "2.32.3"
@@ -2409,6 +2820,130 @@ pygments = ">=2.13.0,<3.0.0"
2409
  [package.extras]
2410
  jupyter = ["ipywidgets (>=7.5.1,<9)"]
2411
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2412
  [[package]]
2413
  name = "ruff"
2414
  version = "0.11.7"
@@ -2513,6 +3048,7 @@ files = [
2513
  duckduckgo-search = ">=6.3.7"
2514
  huggingface-hub = ">=0.28.0"
2515
  jinja2 = ">=3.1.4"
 
2516
  markdownify = ">=0.14.1"
2517
  pillow = ">=11.0.0"
2518
  python-dotenv = "*"
@@ -2581,6 +3117,87 @@ anyio = ">=3.6.2,<5"
2581
  [package.extras]
2582
  full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"]
2583
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2584
  [[package]]
2585
  name = "tomlkit"
2586
  version = "0.13.2"
@@ -2790,6 +3407,21 @@ files = [
2790
  {file = "websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee"},
2791
  ]
2792
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2793
  [[package]]
2794
  name = "xxhash"
2795
  version = "3.5.0"
@@ -3042,7 +3674,43 @@ idna = ">=2.0"
3042
  multidict = ">=4.0"
3043
  propcache = ">=0.2.1"
3044
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3045
  [metadata]
3046
  lock-version = "2.1"
3047
  python-versions = ">=3.12,<3.13"
3048
- content-hash = "7c662ae1b5b4fcdf657f71cba00bd47d50de0e0c6453a9d165f685dac1313af2"
 
559
  torch = ["torch"]
560
  vision = ["Pillow (>=9.4.0)"]
561
 
562
+ [[package]]
563
+ name = "defusedxml"
564
+ version = "0.7.1"
565
+ description = "XML bomb protection for Python stdlib modules"
566
+ optional = false
567
+ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
568
+ groups = ["main"]
569
+ files = [
570
+ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"},
571
+ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"},
572
+ ]
573
+
574
  [[package]]
575
  name = "dill"
576
  version = "0.3.8"
 
587
  graph = ["objgraph (>=1.7.2)"]
588
  profile = ["gprof2dot (>=2022.7.29)"]
589
 
590
+ [[package]]
591
+ name = "distro"
592
+ version = "1.9.0"
593
+ description = "Distro - an OS platform information API"
594
+ optional = false
595
+ python-versions = ">=3.6"
596
+ groups = ["main"]
597
+ files = [
598
+ {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"},
599
+ {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"},
600
+ ]
601
+
602
  [[package]]
603
  name = "duckduckgo-search"
604
  version = "8.0.1"
 
619
  [package.extras]
620
  dev = ["mypy (>=1.14.1)", "pytest (>=8.3.4)", "pytest-dependency (>=0.6.0)", "ruff (>=0.9.2)"]
621
 
622
+ [[package]]
623
+ name = "et-xmlfile"
624
+ version = "2.0.0"
625
+ description = "An implementation of lxml.xmlfile for the standard library"
626
+ optional = false
627
+ python-versions = ">=3.8"
628
+ groups = ["main"]
629
+ files = [
630
+ {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"},
631
+ {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"},
632
+ ]
633
+
634
  [[package]]
635
  name = "fastapi"
636
  version = "0.115.12"
 
1098
  [package.extras]
1099
  all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
1100
 
1101
+ [[package]]
1102
+ name = "importlib-metadata"
1103
+ version = "8.7.0"
1104
+ description = "Read metadata from Python packages"
1105
+ optional = false
1106
+ python-versions = ">=3.9"
1107
+ groups = ["main"]
1108
+ files = [
1109
+ {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"},
1110
+ {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"},
1111
+ ]
1112
+
1113
+ [package.dependencies]
1114
+ zipp = ">=3.20"
1115
+
1116
+ [package.extras]
1117
+ check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
1118
+ cover = ["pytest-cov"]
1119
+ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
1120
+ enabler = ["pytest-enabler (>=2.2)"]
1121
+ perf = ["ipython"]
1122
+ test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"]
1123
+ type = ["pytest-mypy"]
1124
+
1125
  [[package]]
1126
  name = "itsdangerous"
1127
  version = "2.2.0"
 
1152
  [package.extras]
1153
  i18n = ["Babel (>=2.7)"]
1154
 
1155
+ [[package]]
1156
+ name = "jiter"
1157
+ version = "0.9.0"
1158
+ description = "Fast iterable JSON parser."
1159
+ optional = false
1160
+ python-versions = ">=3.8"
1161
+ groups = ["main"]
1162
+ files = [
1163
+ {file = "jiter-0.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:816ec9b60fdfd1fec87da1d7ed46c66c44ffec37ab2ef7de5b147b2fce3fd5ad"},
1164
+ {file = "jiter-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b1d3086f8a3ee0194ecf2008cf81286a5c3e540d977fa038ff23576c023c0ea"},
1165
+ {file = "jiter-0.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1339f839b91ae30b37c409bf16ccd3dc453e8b8c3ed4bd1d6a567193651a4a51"},
1166
+ {file = "jiter-0.9.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ffba79584b3b670fefae66ceb3a28822365d25b7bf811e030609a3d5b876f538"},
1167
+ {file = "jiter-0.9.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cfc7d0a8e899089d11f065e289cb5b2daf3d82fbe028f49b20d7b809193958d"},
1168
+ {file = "jiter-0.9.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e00a1a2bbfaaf237e13c3d1592356eab3e9015d7efd59359ac8b51eb56390a12"},
1169
+ {file = "jiter-0.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1d9870561eb26b11448854dce0ff27a9a27cb616b632468cafc938de25e9e51"},
1170
+ {file = "jiter-0.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9872aeff3f21e437651df378cb75aeb7043e5297261222b6441a620218b58708"},
1171
+ {file = "jiter-0.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1fd19112d1049bdd47f17bfbb44a2c0001061312dcf0e72765bfa8abd4aa30e5"},
1172
+ {file = "jiter-0.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6ef5da104664e526836070e4a23b5f68dec1cc673b60bf1edb1bfbe8a55d0678"},
1173
+ {file = "jiter-0.9.0-cp310-cp310-win32.whl", hash = "sha256:cb12e6d65ebbefe5518de819f3eda53b73187b7089040b2d17f5b39001ff31c4"},
1174
+ {file = "jiter-0.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:c43ca669493626d8672be3b645dbb406ef25af3f4b6384cfd306da7eb2e70322"},
1175
+ {file = "jiter-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6c4d99c71508912a7e556d631768dcdef43648a93660670986916b297f1c54af"},
1176
+ {file = "jiter-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f60fb8ce7df529812bf6c625635a19d27f30806885139e367af93f6e734ef58"},
1177
+ {file = "jiter-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51c4e1a4f8ea84d98b7b98912aa4290ac3d1eabfde8e3c34541fae30e9d1f08b"},
1178
+ {file = "jiter-0.9.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f4c677c424dc76684fea3e7285a7a2a7493424bea89ac441045e6a1fb1d7b3b"},
1179
+ {file = "jiter-0.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2221176dfec87f3470b21e6abca056e6b04ce9bff72315cb0b243ca9e835a4b5"},
1180
+ {file = "jiter-0.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c7adb66f899ffa25e3c92bfcb593391ee1947dbdd6a9a970e0d7e713237d572"},
1181
+ {file = "jiter-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c98d27330fdfb77913c1097a7aab07f38ff2259048949f499c9901700789ac15"},
1182
+ {file = "jiter-0.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eda3f8cc74df66892b1d06b5d41a71670c22d95a1ca2cbab73654745ce9d0419"},
1183
+ {file = "jiter-0.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd5ab5ddc11418dce28343123644a100f487eaccf1de27a459ab36d6cca31043"},
1184
+ {file = "jiter-0.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42f8a68a69f047b310319ef8e2f52fdb2e7976fb3313ef27df495cf77bcad965"},
1185
+ {file = "jiter-0.9.0-cp311-cp311-win32.whl", hash = "sha256:a25519efb78a42254d59326ee417d6f5161b06f5da827d94cf521fed961b1ff2"},
1186
+ {file = "jiter-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:923b54afdd697dfd00d368b7ccad008cccfeb1efb4e621f32860c75e9f25edbd"},
1187
+ {file = "jiter-0.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7b46249cfd6c48da28f89eb0be3f52d6fdb40ab88e2c66804f546674e539ec11"},
1188
+ {file = "jiter-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:609cf3c78852f1189894383cf0b0b977665f54cb38788e3e6b941fa6d982c00e"},
1189
+ {file = "jiter-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d726a3890a54561e55a9c5faea1f7655eda7f105bd165067575ace6e65f80bb2"},
1190
+ {file = "jiter-0.9.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e89dc075c1fef8fa9be219e249f14040270dbc507df4215c324a1839522ea75"},
1191
+ {file = "jiter-0.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e8ffa3c353b1bc4134f96f167a2082494351e42888dfcf06e944f2729cbe1d"},
1192
+ {file = "jiter-0.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203f28a72a05ae0e129b3ed1f75f56bc419d5f91dfacd057519a8bd137b00c42"},
1193
+ {file = "jiter-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca1a02ad60ec30bb230f65bc01f611c8608b02d269f998bc29cca8619a919dc"},
1194
+ {file = "jiter-0.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:237e5cee4d5d2659aaf91bbf8ec45052cc217d9446070699441a91b386ae27dc"},
1195
+ {file = "jiter-0.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:528b6b71745e7326eed73c53d4aa57e2a522242320b6f7d65b9c5af83cf49b6e"},
1196
+ {file = "jiter-0.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9f48e86b57bc711eb5acdfd12b6cb580a59cc9a993f6e7dcb6d8b50522dcd50d"},
1197
+ {file = "jiter-0.9.0-cp312-cp312-win32.whl", hash = "sha256:699edfde481e191d81f9cf6d2211debbfe4bd92f06410e7637dffb8dd5dfde06"},
1198
+ {file = "jiter-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0"},
1199
+ {file = "jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7"},
1200
+ {file = "jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b"},
1201
+ {file = "jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69"},
1202
+ {file = "jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103"},
1203
+ {file = "jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635"},
1204
+ {file = "jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4"},
1205
+ {file = "jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d"},
1206
+ {file = "jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3"},
1207
+ {file = "jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5"},
1208
+ {file = "jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d"},
1209
+ {file = "jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53"},
1210
+ {file = "jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7"},
1211
+ {file = "jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001"},
1212
+ {file = "jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a"},
1213
+ {file = "jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf"},
1214
+ {file = "jiter-0.9.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4a2d16360d0642cd68236f931b85fe50288834c383492e4279d9f1792e309571"},
1215
+ {file = "jiter-0.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e84ed1c9c9ec10bbb8c37f450077cbe3c0d4e8c2b19f0a49a60ac7ace73c7452"},
1216
+ {file = "jiter-0.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f3c848209ccd1bfa344a1240763975ca917de753c7875c77ec3034f4151d06c"},
1217
+ {file = "jiter-0.9.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7825f46e50646bee937e0f849d14ef3a417910966136f59cd1eb848b8b5bb3e4"},
1218
+ {file = "jiter-0.9.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d82a811928b26d1a6311a886b2566f68ccf2b23cf3bfed042e18686f1f22c2d7"},
1219
+ {file = "jiter-0.9.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c058ecb51763a67f019ae423b1cbe3fa90f7ee6280c31a1baa6ccc0c0e2d06e"},
1220
+ {file = "jiter-0.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9897115ad716c48f0120c1f0c4efae348ec47037319a6c63b2d7838bb53aaef4"},
1221
+ {file = "jiter-0.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:351f4c90a24c4fb8c87c6a73af2944c440494ed2bea2094feecacb75c50398ae"},
1222
+ {file = "jiter-0.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d45807b0f236c485e1e525e2ce3a854807dfe28ccf0d013dd4a563395e28008a"},
1223
+ {file = "jiter-0.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1537a890724ba00fdba21787010ac6f24dad47f763410e9e1093277913592784"},
1224
+ {file = "jiter-0.9.0-cp38-cp38-win32.whl", hash = "sha256:e3630ec20cbeaddd4b65513fa3857e1b7c4190d4481ef07fb63d0fad59033321"},
1225
+ {file = "jiter-0.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:2685f44bf80e95f8910553bf2d33b9c87bf25fceae6e9f0c1355f75d2922b0ee"},
1226
+ {file = "jiter-0.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:9ef340fae98065071ccd5805fe81c99c8f80484e820e40043689cf97fb66b3e2"},
1227
+ {file = "jiter-0.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:efb767d92c63b2cd9ec9f24feeb48f49574a713870ec87e9ba0c2c6e9329c3e2"},
1228
+ {file = "jiter-0.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:113f30f87fb1f412510c6d7ed13e91422cfd329436364a690c34c8b8bd880c42"},
1229
+ {file = "jiter-0.9.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8793b6df019b988526f5a633fdc7456ea75e4a79bd8396a3373c371fc59f5c9b"},
1230
+ {file = "jiter-0.9.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a9aaa5102dba4e079bb728076fadd5a2dca94c05c04ce68004cfd96f128ea34"},
1231
+ {file = "jiter-0.9.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d838650f6ebaf4ccadfb04522463e74a4c378d7e667e0eb1865cfe3990bfac49"},
1232
+ {file = "jiter-0.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0194f813efdf4b8865ad5f5c5f50f8566df7d770a82c51ef593d09e0b347020"},
1233
+ {file = "jiter-0.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7954a401d0a8a0b8bc669199db78af435aae1e3569187c2939c477c53cb6a0a"},
1234
+ {file = "jiter-0.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4feafe787eb8a8d98168ab15637ca2577f6ddf77ac6c8c66242c2d028aa5420e"},
1235
+ {file = "jiter-0.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:27cd1f2e8bb377f31d3190b34e4328d280325ad7ef55c6ac9abde72f79e84d2e"},
1236
+ {file = "jiter-0.9.0-cp39-cp39-win32.whl", hash = "sha256:161d461dcbe658cf0bd0aa375b30a968b087cdddc624fc585f3867c63c6eca95"},
1237
+ {file = "jiter-0.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:e8b36d8a16a61993be33e75126ad3d8aa29cf450b09576f3c427d27647fcb4aa"},
1238
+ {file = "jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893"},
1239
+ ]
1240
+
1241
+ [[package]]
1242
+ name = "jsonschema"
1243
+ version = "4.23.0"
1244
+ description = "An implementation of JSON Schema validation for Python"
1245
+ optional = false
1246
+ python-versions = ">=3.8"
1247
+ groups = ["main"]
1248
+ files = [
1249
+ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"},
1250
+ {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"},
1251
+ ]
1252
+
1253
+ [package.dependencies]
1254
+ attrs = ">=22.2.0"
1255
+ jsonschema-specifications = ">=2023.03.6"
1256
+ referencing = ">=0.28.4"
1257
+ rpds-py = ">=0.7.1"
1258
+
1259
+ [package.extras]
1260
+ format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"]
1261
+ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"]
1262
+
1263
+ [[package]]
1264
+ name = "jsonschema-specifications"
1265
+ version = "2025.4.1"
1266
+ description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry"
1267
+ optional = false
1268
+ python-versions = ">=3.9"
1269
+ groups = ["main"]
1270
+ files = [
1271
+ {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"},
1272
+ {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"},
1273
+ ]
1274
+
1275
+ [package.dependencies]
1276
+ referencing = ">=0.31.0"
1277
+
1278
+ [[package]]
1279
+ name = "litellm"
1280
+ version = "1.67.5"
1281
+ description = "Library to easily interface with LLM API providers"
1282
+ optional = false
1283
+ python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8"
1284
+ groups = ["main"]
1285
+ files = [
1286
+ {file = "litellm-1.67.5-py3-none-any.whl", hash = "sha256:bd3329731a36200539293521d312adf4f05fc4a6312a84baff2ce5a8b1507a43"},
1287
+ {file = "litellm-1.67.5.tar.gz", hash = "sha256:a9c73feed05aba33b3f2879658f57bb3480b43404ae693ebc827f1c157affde5"},
1288
+ ]
1289
+
1290
+ [package.dependencies]
1291
+ aiohttp = "*"
1292
+ click = "*"
1293
+ httpx = ">=0.23.0"
1294
+ importlib-metadata = ">=6.8.0"
1295
+ jinja2 = ">=3.1.2,<4.0.0"
1296
+ jsonschema = ">=4.22.0,<5.0.0"
1297
+ openai = ">=1.68.2"
1298
+ pydantic = ">=2.0.0,<3.0.0"
1299
+ python-dotenv = ">=0.2.0"
1300
+ tiktoken = ">=0.7.0"
1301
+ tokenizers = "*"
1302
+
1303
+ [package.extras]
1304
+ extra-proxy = ["azure-identity (>=1.15.0,<2.0.0)", "azure-keyvault-secrets (>=4.8.0,<5.0.0)", "google-cloud-kms (>=2.21.3,<3.0.0)", "prisma (==0.11.0)", "redisvl (>=0.4.1,<0.5.0)", "resend (>=0.8.0,<0.9.0)"]
1305
+ proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "boto3 (==1.34.34)", "cryptography (>=43.0.1,<44.0.0)", "fastapi (>=0.115.5,<0.116.0)", "fastapi-sso (>=0.16.0,<0.17.0)", "gunicorn (>=23.0.0,<24.0.0)", "litellm-proxy-extras (==0.1.13)", "mcp (==1.5.0)", "orjson (>=3.9.7,<4.0.0)", "pynacl (>=1.5.0,<2.0.0)", "python-multipart (>=0.0.18,<0.0.19)", "pyyaml (>=6.0.1,<7.0.0)", "rq", "uvicorn (>=0.29.0,<0.30.0)", "uvloop (>=0.21.0,<0.22.0)", "websockets (>=13.1.0,<14.0.0)"]
1306
+
1307
  [[package]]
1308
  name = "lxml"
1309
  version = "5.4.0"
 
1778
  {file = "numpy-2.2.5.tar.gz", hash = "sha256:a9c0d994680cd991b1cb772e8b297340085466a6fe964bc9d4e80f5e2f43c291"},
1779
  ]
1780
 
1781
+ [[package]]
1782
+ name = "openai"
1783
+ version = "1.77.0"
1784
+ description = "The official Python library for the openai API"
1785
+ optional = false
1786
+ python-versions = ">=3.8"
1787
+ groups = ["main"]
1788
+ files = [
1789
+ {file = "openai-1.77.0-py3-none-any.whl", hash = "sha256:07706e91eb71631234996989a8ea991d5ee56f0744ef694c961e0824d4f39218"},
1790
+ {file = "openai-1.77.0.tar.gz", hash = "sha256:897969f927f0068b8091b4b041d1f8175bcf124f7ea31bab418bf720971223bc"},
1791
+ ]
1792
+
1793
+ [package.dependencies]
1794
+ anyio = ">=3.5.0,<5"
1795
+ distro = ">=1.7.0,<2"
1796
+ httpx = ">=0.23.0,<1"
1797
+ jiter = ">=0.4.0,<1"
1798
+ pydantic = ">=1.9.0,<3"
1799
+ sniffio = "*"
1800
+ tqdm = ">4"
1801
+ typing-extensions = ">=4.11,<5"
1802
+
1803
+ [package.extras]
1804
+ datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"]
1805
+ realtime = ["websockets (>=13,<16)"]
1806
+ voice-helpers = ["numpy (>=2.0.2)", "sounddevice (>=0.5.1)"]
1807
+
1808
+ [[package]]
1809
+ name = "openpyxl"
1810
+ version = "3.1.5"
1811
+ description = "A Python library to read/write Excel 2010 xlsx/xlsm files"
1812
+ optional = false
1813
+ python-versions = ">=3.8"
1814
+ groups = ["main"]
1815
+ files = [
1816
+ {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"},
1817
+ {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"},
1818
+ ]
1819
+
1820
+ [package.dependencies]
1821
+ et-xmlfile = "*"
1822
+
1823
  [[package]]
1824
  name = "orjson"
1825
  version = "3.10.16"
 
2505
  [package.extras]
2506
  windows-terminal = ["colorama (>=0.4.6)"]
2507
 
2508
+ [[package]]
2509
+ name = "pypdf"
2510
+ version = "5.4.0"
2511
+ description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files"
2512
+ optional = false
2513
+ python-versions = ">=3.8"
2514
+ groups = ["main"]
2515
+ files = [
2516
+ {file = "pypdf-5.4.0-py3-none-any.whl", hash = "sha256:db994ab47cadc81057ea1591b90e5b543e2b7ef2d0e31ef41a9bfe763c119dab"},
2517
+ {file = "pypdf-5.4.0.tar.gz", hash = "sha256:9af476a9dc30fcb137659b0dec747ea94aa954933c52cf02ee33e39a16fe9175"},
2518
+ ]
2519
+
2520
+ [package.extras]
2521
+ crypto = ["cryptography"]
2522
+ cryptodome = ["PyCryptodome"]
2523
+ dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "pytest-socket", "pytest-timeout", "pytest-xdist", "wheel"]
2524
+ docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"]
2525
+ full = ["Pillow (>=8.0.0)", "cryptography"]
2526
+ image = ["Pillow (>=8.0.0)"]
2527
+
2528
  [[package]]
2529
  name = "python-dateutil"
2530
  version = "2.9.0.post0"
 
2540
  [package.dependencies]
2541
  six = ">=1.5"
2542
 
2543
+ [[package]]
2544
+ name = "python-docx"
2545
+ version = "1.1.2"
2546
+ description = "Create, read, and update Microsoft Word .docx files."
2547
+ optional = false
2548
+ python-versions = ">=3.7"
2549
+ groups = ["main"]
2550
+ files = [
2551
+ {file = "python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe"},
2552
+ {file = "python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd"},
2553
+ ]
2554
+
2555
+ [package.dependencies]
2556
+ lxml = ">=3.1.0"
2557
+ typing-extensions = ">=4.9.0"
2558
+
2559
  [[package]]
2560
  name = "python-dotenv"
2561
  version = "1.1.0"
 
2658
  {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
2659
  ]
2660
 
2661
+ [[package]]
2662
+ name = "referencing"
2663
+ version = "0.36.2"
2664
+ description = "JSON Referencing + Python"
2665
+ optional = false
2666
+ python-versions = ">=3.9"
2667
+ groups = ["main"]
2668
+ files = [
2669
+ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"},
2670
+ {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"},
2671
+ ]
2672
+
2673
+ [package.dependencies]
2674
+ attrs = ">=22.2.0"
2675
+ rpds-py = ">=0.7.0"
2676
+ typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""}
2677
+
2678
+ [[package]]
2679
+ name = "regex"
2680
+ version = "2024.11.6"
2681
+ description = "Alternative regular expression module, to replace re."
2682
+ optional = false
2683
+ python-versions = ">=3.8"
2684
+ groups = ["main"]
2685
+ files = [
2686
+ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"},
2687
+ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"},
2688
+ {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"},
2689
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"},
2690
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"},
2691
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"},
2692
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"},
2693
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"},
2694
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"},
2695
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"},
2696
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"},
2697
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"},
2698
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"},
2699
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"},
2700
+ {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"},
2701
+ {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"},
2702
+ {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"},
2703
+ {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"},
2704
+ {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"},
2705
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"},
2706
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"},
2707
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"},
2708
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"},
2709
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"},
2710
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"},
2711
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"},
2712
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"},
2713
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"},
2714
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"},
2715
+ {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"},
2716
+ {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"},
2717
+ {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"},
2718
+ {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"},
2719
+ {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"},
2720
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"},
2721
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"},
2722
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"},
2723
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"},
2724
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"},
2725
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"},
2726
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"},
2727
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"},
2728
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"},
2729
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"},
2730
+ {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"},
2731
+ {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"},
2732
+ {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"},
2733
+ {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"},
2734
+ {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"},
2735
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"},
2736
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"},
2737
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"},
2738
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"},
2739
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"},
2740
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"},
2741
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"},
2742
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"},
2743
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"},
2744
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"},
2745
+ {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"},
2746
+ {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"},
2747
+ {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"},
2748
+ {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"},
2749
+ {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"},
2750
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"},
2751
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"},
2752
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"},
2753
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"},
2754
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"},
2755
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"},
2756
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"},
2757
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"},
2758
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"},
2759
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"},
2760
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"},
2761
+ {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"},
2762
+ {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"},
2763
+ {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"},
2764
+ {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"},
2765
+ {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"},
2766
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"},
2767
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"},
2768
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"},
2769
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"},
2770
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"},
2771
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"},
2772
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"},
2773
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"},
2774
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"},
2775
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"},
2776
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"},
2777
+ {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"},
2778
+ {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"},
2779
+ {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"},
2780
+ ]
2781
+
2782
  [[package]]
2783
  name = "requests"
2784
  version = "2.32.3"
 
2820
  [package.extras]
2821
  jupyter = ["ipywidgets (>=7.5.1,<9)"]
2822
 
2823
+ [[package]]
2824
+ name = "rpds-py"
2825
+ version = "0.24.0"
2826
+ description = "Python bindings to Rust's persistent data structures (rpds)"
2827
+ optional = false
2828
+ python-versions = ">=3.9"
2829
+ groups = ["main"]
2830
+ files = [
2831
+ {file = "rpds_py-0.24.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:006f4342fe729a368c6df36578d7a348c7c716be1da0a1a0f86e3021f8e98724"},
2832
+ {file = "rpds_py-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2d53747da70a4e4b17f559569d5f9506420966083a31c5fbd84e764461c4444b"},
2833
+ {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8acd55bd5b071156bae57b555f5d33697998752673b9de554dd82f5b5352727"},
2834
+ {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7e80d375134ddb04231a53800503752093dbb65dad8dabacce2c84cccc78e964"},
2835
+ {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60748789e028d2a46fc1c70750454f83c6bdd0d05db50f5ae83e2db500b34da5"},
2836
+ {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e1daf5bf6c2be39654beae83ee6b9a12347cb5aced9a29eecf12a2d25fff664"},
2837
+ {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b221c2457d92a1fb3c97bee9095c874144d196f47c038462ae6e4a14436f7bc"},
2838
+ {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:66420986c9afff67ef0c5d1e4cdc2d0e5262f53ad11e4f90e5e22448df485bf0"},
2839
+ {file = "rpds_py-0.24.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:43dba99f00f1d37b2a0265a259592d05fcc8e7c19d140fe51c6e6f16faabeb1f"},
2840
+ {file = "rpds_py-0.24.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a88c0d17d039333a41d9bf4616bd062f0bd7aa0edeb6cafe00a2fc2a804e944f"},
2841
+ {file = "rpds_py-0.24.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc31e13ce212e14a539d430428cd365e74f8b2d534f8bc22dd4c9c55b277b875"},
2842
+ {file = "rpds_py-0.24.0-cp310-cp310-win32.whl", hash = "sha256:fc2c1e1b00f88317d9de6b2c2b39b012ebbfe35fe5e7bef980fd2a91f6100a07"},
2843
+ {file = "rpds_py-0.24.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0145295ca415668420ad142ee42189f78d27af806fcf1f32a18e51d47dd2052"},
2844
+ {file = "rpds_py-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2d3ee4615df36ab8eb16c2507b11e764dcc11fd350bbf4da16d09cda11fcedef"},
2845
+ {file = "rpds_py-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e13ae74a8a3a0c2f22f450f773e35f893484fcfacb00bb4344a7e0f4f48e1f97"},
2846
+ {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf86f72d705fc2ef776bb7dd9e5fbba79d7e1f3e258bf9377f8204ad0fc1c51e"},
2847
+ {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c43583ea8517ed2e780a345dd9960896afc1327e8cf3ac8239c167530397440d"},
2848
+ {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cd031e63bc5f05bdcda120646a0d32f6d729486d0067f09d79c8db5368f4586"},
2849
+ {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34d90ad8c045df9a4259c47d2e16a3f21fdb396665c94520dbfe8766e62187a4"},
2850
+ {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e838bf2bb0b91ee67bf2b889a1a841e5ecac06dd7a2b1ef4e6151e2ce155c7ae"},
2851
+ {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04ecf5c1ff4d589987b4d9882872f80ba13da7d42427234fce8f22efb43133bc"},
2852
+ {file = "rpds_py-0.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:630d3d8ea77eabd6cbcd2ea712e1c5cecb5b558d39547ac988351195db433f6c"},
2853
+ {file = "rpds_py-0.24.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ebcb786b9ff30b994d5969213a8430cbb984cdd7ea9fd6df06663194bd3c450c"},
2854
+ {file = "rpds_py-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:174e46569968ddbbeb8a806d9922f17cd2b524aa753b468f35b97ff9c19cb718"},
2855
+ {file = "rpds_py-0.24.0-cp311-cp311-win32.whl", hash = "sha256:5ef877fa3bbfb40b388a5ae1cb00636a624690dcb9a29a65267054c9ea86d88a"},
2856
+ {file = "rpds_py-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:e274f62cbd274359eff63e5c7e7274c913e8e09620f6a57aae66744b3df046d6"},
2857
+ {file = "rpds_py-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d8551e733626afec514b5d15befabea0dd70a343a9f23322860c4f16a9430205"},
2858
+ {file = "rpds_py-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e374c0ce0ca82e5b67cd61fb964077d40ec177dd2c4eda67dba130de09085c7"},
2859
+ {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d69d003296df4840bd445a5d15fa5b6ff6ac40496f956a221c4d1f6f7b4bc4d9"},
2860
+ {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8212ff58ac6dfde49946bea57474a386cca3f7706fc72c25b772b9ca4af6b79e"},
2861
+ {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:528927e63a70b4d5f3f5ccc1fa988a35456eb5d15f804d276709c33fc2f19bda"},
2862
+ {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a824d2c7a703ba6daaca848f9c3d5cb93af0505be505de70e7e66829affd676e"},
2863
+ {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d51febb7a114293ffd56c6cf4736cb31cd68c0fddd6aa303ed09ea5a48e029"},
2864
+ {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3fab5f4a2c64a8fb64fc13b3d139848817a64d467dd6ed60dcdd6b479e7febc9"},
2865
+ {file = "rpds_py-0.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9be4f99bee42ac107870c61dfdb294d912bf81c3c6d45538aad7aecab468b6b7"},
2866
+ {file = "rpds_py-0.24.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:564c96b6076a98215af52f55efa90d8419cc2ef45d99e314fddefe816bc24f91"},
2867
+ {file = "rpds_py-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:75a810b7664c17f24bf2ffd7f92416c00ec84b49bb68e6a0d93e542406336b56"},
2868
+ {file = "rpds_py-0.24.0-cp312-cp312-win32.whl", hash = "sha256:f6016bd950be4dcd047b7475fdf55fb1e1f59fc7403f387be0e8123e4a576d30"},
2869
+ {file = "rpds_py-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034"},
2870
+ {file = "rpds_py-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2d8e4508e15fc05b31285c4b00ddf2e0eb94259c2dc896771966a163122a0c"},
2871
+ {file = "rpds_py-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f00c16e089282ad68a3820fd0c831c35d3194b7cdc31d6e469511d9bffc535c"},
2872
+ {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951cc481c0c395c4a08639a469d53b7d4afa252529a085418b82a6b43c45c240"},
2873
+ {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9ca89938dff18828a328af41ffdf3902405a19f4131c88e22e776a8e228c5a8"},
2874
+ {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0ef550042a8dbcd657dfb284a8ee00f0ba269d3f2286b0493b15a5694f9fe8"},
2875
+ {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2356688e5d958c4d5cb964af865bea84db29971d3e563fb78e46e20fe1848b"},
2876
+ {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78884d155fd15d9f64f5d6124b486f3d3f7fd7cd71a78e9670a0f6f6ca06fb2d"},
2877
+ {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a4a535013aeeef13c5532f802708cecae8d66c282babb5cd916379b72110cf7"},
2878
+ {file = "rpds_py-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:84e0566f15cf4d769dade9b366b7b87c959be472c92dffb70462dd0844d7cbad"},
2879
+ {file = "rpds_py-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:823e74ab6fbaa028ec89615ff6acb409e90ff45580c45920d4dfdddb069f2120"},
2880
+ {file = "rpds_py-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c61a2cb0085c8783906b2f8b1f16a7e65777823c7f4d0a6aaffe26dc0d358dd9"},
2881
+ {file = "rpds_py-0.24.0-cp313-cp313-win32.whl", hash = "sha256:60d9b630c8025b9458a9d114e3af579a2c54bd32df601c4581bd054e85258143"},
2882
+ {file = "rpds_py-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a"},
2883
+ {file = "rpds_py-0.24.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:d09dc82af2d3c17e7dd17120b202a79b578d79f2b5424bda209d9966efeed114"},
2884
+ {file = "rpds_py-0.24.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5fc13b44de6419d1e7a7e592a4885b323fbc2f46e1f22151e3a8ed3b8b920405"},
2885
+ {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c347a20d79cedc0a7bd51c4d4b7dbc613ca4e65a756b5c3e57ec84bd43505b47"},
2886
+ {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20f2712bd1cc26a3cc16c5a1bfee9ed1abc33d4cdf1aabd297fe0eb724df4272"},
2887
+ {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad911555286884be1e427ef0dc0ba3929e6821cbeca2194b13dc415a462c7fd"},
2888
+ {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0aeb3329c1721c43c58cae274d7d2ca85c1690d89485d9c63a006cb79a85771a"},
2889
+ {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0f156e9509cee987283abd2296ec816225145a13ed0391df8f71bf1d789e2d"},
2890
+ {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa6800adc8204ce898c8a424303969b7aa6a5e4ad2789c13f8648739830323b7"},
2891
+ {file = "rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a18fc371e900a21d7392517c6f60fe859e802547309e94313cd8181ad9db004d"},
2892
+ {file = "rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9168764133fd919f8dcca2ead66de0105f4ef5659cbb4fa044f7014bed9a1797"},
2893
+ {file = "rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f6e3cec44ba05ee5cbdebe92d052f69b63ae792e7d05f1020ac5e964394080c"},
2894
+ {file = "rpds_py-0.24.0-cp313-cp313t-win32.whl", hash = "sha256:8ebc7e65ca4b111d928b669713865f021b7773350eeac4a31d3e70144297baba"},
2895
+ {file = "rpds_py-0.24.0-cp313-cp313t-win_amd64.whl", hash = "sha256:675269d407a257b8c00a6b58205b72eec8231656506c56fd429d924ca00bb350"},
2896
+ {file = "rpds_py-0.24.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a36b452abbf29f68527cf52e181fced56685731c86b52e852053e38d8b60bc8d"},
2897
+ {file = "rpds_py-0.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b3b397eefecec8e8e39fa65c630ef70a24b09141a6f9fc17b3c3a50bed6b50e"},
2898
+ {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdabcd3beb2a6dca7027007473d8ef1c3b053347c76f685f5f060a00327b8b65"},
2899
+ {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5db385bacd0c43f24be92b60c857cf760b7f10d8234f4bd4be67b5b20a7c0b6b"},
2900
+ {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8097b3422d020ff1c44effc40ae58e67d93e60d540a65649d2cdaf9466030791"},
2901
+ {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493fe54318bed7d124ce272fc36adbf59d46729659b2c792e87c3b95649cdee9"},
2902
+ {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8aa362811ccdc1f8dadcc916c6d47e554169ab79559319ae9fae7d7752d0d60c"},
2903
+ {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d8f9a6e7fd5434817526815f09ea27f2746c4a51ee11bb3439065f5fc754db58"},
2904
+ {file = "rpds_py-0.24.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8205ee14463248d3349131bb8099efe15cd3ce83b8ef3ace63c7e976998e7124"},
2905
+ {file = "rpds_py-0.24.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:921ae54f9ecba3b6325df425cf72c074cd469dea843fb5743a26ca7fb2ccb149"},
2906
+ {file = "rpds_py-0.24.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32bab0a56eac685828e00cc2f5d1200c548f8bc11f2e44abf311d6b548ce2e45"},
2907
+ {file = "rpds_py-0.24.0-cp39-cp39-win32.whl", hash = "sha256:f5c0ed12926dec1dfe7d645333ea59cf93f4d07750986a586f511c0bc61fe103"},
2908
+ {file = "rpds_py-0.24.0-cp39-cp39-win_amd64.whl", hash = "sha256:afc6e35f344490faa8276b5f2f7cbf71f88bc2cda4328e00553bd451728c571f"},
2909
+ {file = "rpds_py-0.24.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:619ca56a5468f933d940e1bf431c6f4e13bef8e688698b067ae68eb4f9b30e3a"},
2910
+ {file = "rpds_py-0.24.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:4b28e5122829181de1898c2c97f81c0b3246d49f585f22743a1246420bb8d399"},
2911
+ {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e5ab32cf9eb3647450bc74eb201b27c185d3857276162c101c0f8c6374e098"},
2912
+ {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:208b3a70a98cf3710e97cabdc308a51cd4f28aa6e7bb11de3d56cd8b74bab98d"},
2913
+ {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbc4362e06f950c62cad3d4abf1191021b2ffaf0b31ac230fbf0526453eee75e"},
2914
+ {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebea2821cdb5f9fef44933617be76185b80150632736f3d76e54829ab4a3b4d1"},
2915
+ {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a4df06c35465ef4d81799999bba810c68d29972bf1c31db61bfdb81dd9d5bb"},
2916
+ {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d3aa13bdf38630da298f2e0d77aca967b200b8cc1473ea05248f6c5e9c9bdb44"},
2917
+ {file = "rpds_py-0.24.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:041f00419e1da7a03c46042453598479f45be3d787eb837af382bfc169c0db33"},
2918
+ {file = "rpds_py-0.24.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d8754d872a5dfc3c5bf9c0e059e8107451364a30d9fd50f1f1a85c4fb9481164"},
2919
+ {file = "rpds_py-0.24.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:896c41007931217a343eff197c34513c154267636c8056fb409eafd494c3dcdc"},
2920
+ {file = "rpds_py-0.24.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:92558d37d872e808944c3c96d0423b8604879a3d1c86fdad508d7ed91ea547d5"},
2921
+ {file = "rpds_py-0.24.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f9e0057a509e096e47c87f753136c9b10d7a91842d8042c2ee6866899a717c0d"},
2922
+ {file = "rpds_py-0.24.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6e109a454412ab82979c5b1b3aee0604eca4bbf9a02693bb9df027af2bfa91a"},
2923
+ {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc1c892b1ec1f8cbd5da8de287577b455e388d9c328ad592eabbdcb6fc93bee5"},
2924
+ {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c39438c55983d48f4bb3487734d040e22dad200dab22c41e331cee145e7a50d"},
2925
+ {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d7e8ce990ae17dda686f7e82fd41a055c668e13ddcf058e7fb5e9da20b57793"},
2926
+ {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ea7f4174d2e4194289cb0c4e172d83e79a6404297ff95f2875cf9ac9bced8ba"},
2927
+ {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb2954155bb8f63bb19d56d80e5e5320b61d71084617ed89efedb861a684baea"},
2928
+ {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04f2b712a2206e13800a8136b07aaedc23af3facab84918e7aa89e4be0260032"},
2929
+ {file = "rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:eda5c1e2a715a4cbbca2d6d304988460942551e4e5e3b7457b50943cd741626d"},
2930
+ {file = "rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:9abc80fe8c1f87218db116016de575a7998ab1629078c90840e8d11ab423ee25"},
2931
+ {file = "rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6a727fd083009bc83eb83d6950f0c32b3c94c8b80a9b667c87f4bd1274ca30ba"},
2932
+ {file = "rpds_py-0.24.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e0f3ef95795efcd3b2ec3fe0a5bcfb5dadf5e3996ea2117427e524d4fbf309c6"},
2933
+ {file = "rpds_py-0.24.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:2c13777ecdbbba2077670285dd1fe50828c8742f6a4119dbef6f83ea13ad10fb"},
2934
+ {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79e8d804c2ccd618417e96720ad5cd076a86fa3f8cb310ea386a3e6229bae7d1"},
2935
+ {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd822f019ccccd75c832deb7aa040bb02d70a92eb15a2f16c7987b7ad4ee8d83"},
2936
+ {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0047638c3aa0dbcd0ab99ed1e549bbf0e142c9ecc173b6492868432d8989a046"},
2937
+ {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5b66d1b201cc71bc3081bc2f1fc36b0c1f268b773e03bbc39066651b9e18391"},
2938
+ {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbcbb6db5582ea33ce46a5d20a5793134b5365110d84df4e30b9d37c6fd40ad3"},
2939
+ {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63981feca3f110ed132fd217bf7768ee8ed738a55549883628ee3da75bb9cb78"},
2940
+ {file = "rpds_py-0.24.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3a55fc10fdcbf1a4bd3c018eea422c52cf08700cf99c28b5cb10fe97ab77a0d3"},
2941
+ {file = "rpds_py-0.24.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:c30ff468163a48535ee7e9bf21bd14c7a81147c0e58a36c1078289a8ca7af0bd"},
2942
+ {file = "rpds_py-0.24.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:369d9c6d4c714e36d4a03957b4783217a3ccd1e222cdd67d464a3a479fc17796"},
2943
+ {file = "rpds_py-0.24.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:24795c099453e3721fda5d8ddd45f5dfcc8e5a547ce7b8e9da06fecc3832e26f"},
2944
+ {file = "rpds_py-0.24.0.tar.gz", hash = "sha256:772cc1b2cd963e7e17e6cc55fe0371fb9c704d63e44cacec7b9b7f523b78919e"},
2945
+ ]
2946
+
2947
  [[package]]
2948
  name = "ruff"
2949
  version = "0.11.7"
 
3048
  duckduckgo-search = ">=6.3.7"
3049
  huggingface-hub = ">=0.28.0"
3050
  jinja2 = ">=3.1.4"
3051
+ litellm = {version = ">=1.60.2", optional = true, markers = "extra == \"litellm\""}
3052
  markdownify = ">=0.14.1"
3053
  pillow = ">=11.0.0"
3054
  python-dotenv = "*"
 
3117
  [package.extras]
3118
  full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"]
3119
 
3120
+ [[package]]
3121
+ name = "tiktoken"
3122
+ version = "0.9.0"
3123
+ description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models"
3124
+ optional = false
3125
+ python-versions = ">=3.9"
3126
+ groups = ["main"]
3127
+ files = [
3128
+ {file = "tiktoken-0.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:586c16358138b96ea804c034b8acf3f5d3f0258bd2bc3b0227af4af5d622e382"},
3129
+ {file = "tiktoken-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d9c59ccc528c6c5dd51820b3474402f69d9a9e1d656226848ad68a8d5b2e5108"},
3130
+ {file = "tiktoken-0.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0968d5beeafbca2a72c595e8385a1a1f8af58feaebb02b227229b69ca5357fd"},
3131
+ {file = "tiktoken-0.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a5fb085a6a3b7350b8fc838baf493317ca0e17bd95e8642f95fc69ecfed1de"},
3132
+ {file = "tiktoken-0.9.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:15a2752dea63d93b0332fb0ddb05dd909371ededa145fe6a3242f46724fa7990"},
3133
+ {file = "tiktoken-0.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:26113fec3bd7a352e4b33dbaf1bd8948de2507e30bd95a44e2b1156647bc01b4"},
3134
+ {file = "tiktoken-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f32cc56168eac4851109e9b5d327637f15fd662aa30dd79f964b7c39fbadd26e"},
3135
+ {file = "tiktoken-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:45556bc41241e5294063508caf901bf92ba52d8ef9222023f83d2483a3055348"},
3136
+ {file = "tiktoken-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03935988a91d6d3216e2ec7c645afbb3d870b37bcb67ada1943ec48678e7ee33"},
3137
+ {file = "tiktoken-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b3d80aad8d2c6b9238fc1a5524542087c52b860b10cbf952429ffb714bc1136"},
3138
+ {file = "tiktoken-0.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b2a21133be05dc116b1d0372af051cd2c6aa1d2188250c9b553f9fa49301b336"},
3139
+ {file = "tiktoken-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:11a20e67fdf58b0e2dea7b8654a288e481bb4fc0289d3ad21291f8d0849915fb"},
3140
+ {file = "tiktoken-0.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e88f121c1c22b726649ce67c089b90ddda8b9662545a8aeb03cfef15967ddd03"},
3141
+ {file = "tiktoken-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a6600660f2f72369acb13a57fb3e212434ed38b045fd8cc6cdd74947b4b5d210"},
3142
+ {file = "tiktoken-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95e811743b5dfa74f4b227927ed86cbc57cad4df859cb3b643be797914e41794"},
3143
+ {file = "tiktoken-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99376e1370d59bcf6935c933cb9ba64adc29033b7e73f5f7569f3aad86552b22"},
3144
+ {file = "tiktoken-0.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:badb947c32739fb6ddde173e14885fb3de4d32ab9d8c591cbd013c22b4c31dd2"},
3145
+ {file = "tiktoken-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:5a62d7a25225bafed786a524c1b9f0910a1128f4232615bf3f8257a73aaa3b16"},
3146
+ {file = "tiktoken-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b0e8e05a26eda1249e824156d537015480af7ae222ccb798e5234ae0285dbdb"},
3147
+ {file = "tiktoken-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:27d457f096f87685195eea0165a1807fae87b97b2161fe8c9b1df5bd74ca6f63"},
3148
+ {file = "tiktoken-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cf8ded49cddf825390e36dd1ad35cd49589e8161fdcb52aa25f0583e90a3e01"},
3149
+ {file = "tiktoken-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc156cb314119a8bb9748257a2eaebd5cc0753b6cb491d26694ed42fc7cb3139"},
3150
+ {file = "tiktoken-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd69372e8c9dd761f0ab873112aba55a0e3e506332dd9f7522ca466e817b1b7a"},
3151
+ {file = "tiktoken-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95"},
3152
+ {file = "tiktoken-0.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c6386ca815e7d96ef5b4ac61e0048cd32ca5a92d5781255e13b31381d28667dc"},
3153
+ {file = "tiktoken-0.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75f6d5db5bc2c6274b674ceab1615c1778e6416b14705827d19b40e6355f03e0"},
3154
+ {file = "tiktoken-0.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e15b16f61e6f4625a57a36496d28dd182a8a60ec20a534c5343ba3cafa156ac7"},
3155
+ {file = "tiktoken-0.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebcec91babf21297022882344c3f7d9eed855931466c3311b1ad6b64befb3df"},
3156
+ {file = "tiktoken-0.9.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e5fd49e7799579240f03913447c0cdfa1129625ebd5ac440787afc4345990427"},
3157
+ {file = "tiktoken-0.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:26242ca9dc8b58e875ff4ca078b9a94d2f0813e6a535dcd2205df5d49d927cc7"},
3158
+ {file = "tiktoken-0.9.0.tar.gz", hash = "sha256:d02a5ca6a938e0490e1ff957bc48c8b078c88cb83977be1625b1fd8aac792c5d"},
3159
+ ]
3160
+
3161
+ [package.dependencies]
3162
+ regex = ">=2022.1.18"
3163
+ requests = ">=2.26.0"
3164
+
3165
+ [package.extras]
3166
+ blobfile = ["blobfile (>=2)"]
3167
+
3168
+ [[package]]
3169
+ name = "tokenizers"
3170
+ version = "0.21.1"
3171
+ description = ""
3172
+ optional = false
3173
+ python-versions = ">=3.9"
3174
+ groups = ["main"]
3175
+ files = [
3176
+ {file = "tokenizers-0.21.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e78e413e9e668ad790a29456e677d9d3aa50a9ad311a40905d6861ba7692cf41"},
3177
+ {file = "tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:cd51cd0a91ecc801633829fcd1fda9cf8682ed3477c6243b9a095539de4aecf3"},
3178
+ {file = "tokenizers-0.21.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28da6b72d4fb14ee200a1bd386ff74ade8992d7f725f2bde2c495a9a98cf4d9f"},
3179
+ {file = "tokenizers-0.21.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34d8cfde551c9916cb92014e040806122295a6800914bab5865deb85623931cf"},
3180
+ {file = "tokenizers-0.21.1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaa852d23e125b73d283c98f007e06d4595732104b65402f46e8ef24b588d9f8"},
3181
+ {file = "tokenizers-0.21.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a21a15d5c8e603331b8a59548bbe113564136dc0f5ad8306dd5033459a226da0"},
3182
+ {file = "tokenizers-0.21.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2fdbd4c067c60a0ac7eca14b6bd18a5bebace54eb757c706b47ea93204f7a37c"},
3183
+ {file = "tokenizers-0.21.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dd9a0061e403546f7377df940e866c3e678d7d4e9643d0461ea442b4f89e61a"},
3184
+ {file = "tokenizers-0.21.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:db9484aeb2e200c43b915a1a0150ea885e35f357a5a8fabf7373af333dcc8dbf"},
3185
+ {file = "tokenizers-0.21.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:ed248ab5279e601a30a4d67bdb897ecbe955a50f1e7bb62bd99f07dd11c2f5b6"},
3186
+ {file = "tokenizers-0.21.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:9ac78b12e541d4ce67b4dfd970e44c060a2147b9b2a21f509566d556a509c67d"},
3187
+ {file = "tokenizers-0.21.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e5a69c1a4496b81a5ee5d2c1f3f7fbdf95e90a0196101b0ee89ed9956b8a168f"},
3188
+ {file = "tokenizers-0.21.1-cp39-abi3-win32.whl", hash = "sha256:1039a3a5734944e09de1d48761ade94e00d0fa760c0e0551151d4dd851ba63e3"},
3189
+ {file = "tokenizers-0.21.1-cp39-abi3-win_amd64.whl", hash = "sha256:0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382"},
3190
+ {file = "tokenizers-0.21.1.tar.gz", hash = "sha256:a1bb04dc5b448985f86ecd4b05407f5a8d97cb2c0532199b2a302a604a0165ab"},
3191
+ ]
3192
+
3193
+ [package.dependencies]
3194
+ huggingface-hub = ">=0.16.4,<1.0"
3195
+
3196
+ [package.extras]
3197
+ dev = ["tokenizers[testing]"]
3198
+ docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"]
3199
+ testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"]
3200
+
3201
  [[package]]
3202
  name = "tomlkit"
3203
  version = "0.13.2"
 
3407
  {file = "websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee"},
3408
  ]
3409
 
3410
+ [[package]]
3411
+ name = "wikipedia"
3412
+ version = "1.4.0"
3413
+ description = "Wikipedia API for Python"
3414
+ optional = false
3415
+ python-versions = "*"
3416
+ groups = ["main"]
3417
+ files = [
3418
+ {file = "wikipedia-1.4.0.tar.gz", hash = "sha256:db0fad1829fdd441b1852306e9856398204dc0786d2996dd2e0c8bb8e26133b2"},
3419
+ ]
3420
+
3421
+ [package.dependencies]
3422
+ beautifulsoup4 = "*"
3423
+ requests = ">=2.0.0,<3.0.0"
3424
+
3425
  [[package]]
3426
  name = "xxhash"
3427
  version = "3.5.0"
 
3674
  multidict = ">=4.0"
3675
  propcache = ">=0.2.1"
3676
 
3677
+ [[package]]
3678
+ name = "youtube-transcript-api"
3679
+ version = "1.0.3"
3680
+ description = "This is an python API which allows you to get the transcripts/subtitles for a given YouTube video. It also works for automatically generated subtitles, supports translating subtitles and it does not require a headless browser, like other selenium based solutions do!"
3681
+ optional = false
3682
+ python-versions = "<3.14,>=3.8"
3683
+ groups = ["main"]
3684
+ files = [
3685
+ {file = "youtube_transcript_api-1.0.3-py3-none-any.whl", hash = "sha256:d1874e57de65cf14c9d7d09b2b37c814d6287fa0e770d4922c4cd32a5b3f6c47"},
3686
+ {file = "youtube_transcript_api-1.0.3.tar.gz", hash = "sha256:902baf90e7840a42e1e148335e09fe5575dbff64c81414957aea7038e8a4db46"},
3687
+ ]
3688
+
3689
+ [package.dependencies]
3690
+ defusedxml = ">=0.7.1,<0.8.0"
3691
+ requests = "*"
3692
+
3693
+ [[package]]
3694
+ name = "zipp"
3695
+ version = "3.21.0"
3696
+ description = "Backport of pathlib-compatible object wrapper for zip files"
3697
+ optional = false
3698
+ python-versions = ">=3.9"
3699
+ groups = ["main"]
3700
+ files = [
3701
+ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"},
3702
+ {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"},
3703
+ ]
3704
+
3705
+ [package.extras]
3706
+ check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
3707
+ cover = ["pytest-cov"]
3708
+ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
3709
+ enabler = ["pytest-enabler (>=2.2)"]
3710
+ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
3711
+ type = ["pytest-mypy"]
3712
+
3713
  [metadata]
3714
  lock-version = "2.1"
3715
  python-versions = ">=3.12,<3.13"
3716
+ content-hash = "e29835a62bb0b14f8ba9524f2c6c9a58128a40946e4e719dd9f8864a98aa3820"
pyproject.toml CHANGED
@@ -8,13 +8,19 @@ authors = [
8
  readme = "README.md"
9
  requires-python = ">=3.12,<3.13"
10
  dependencies = [
11
- "smolagents (>=1.14.0,<2.0.0)",
12
  "gradio[oauth] (>=5.27.0,<6.0.0)",
13
  "requests (>=2.32.3,<3.0.0)",
14
  "pandas (>=2.2.3,<3.0.0)",
15
  "python-dotenv (>=1.1.0,<2.0.0)",
16
  "playwright (>=1.52.0,<2.0.0)",
17
  "datasets (>=3.5.1,<4.0.0)",
 
 
 
 
 
 
18
  ]
19
 
20
 
 
8
  readme = "README.md"
9
  requires-python = ">=3.12,<3.13"
10
  dependencies = [
11
+ "smolagents[litellm] (>=1.14.0,<2.0.0)",
12
  "gradio[oauth] (>=5.27.0,<6.0.0)",
13
  "requests (>=2.32.3,<3.0.0)",
14
  "pandas (>=2.2.3,<3.0.0)",
15
  "python-dotenv (>=1.1.0,<2.0.0)",
16
  "playwright (>=1.52.0,<2.0.0)",
17
  "datasets (>=3.5.1,<4.0.0)",
18
+ "python-docx (>=1.1.2,<2.0.0)",
19
+ "pypdf (>=5.4.0,<6.0.0)",
20
+ "openpyxl (>=3.1.5,<4.0.0)",
21
+ "wikipedia (>=1.4.0,<2.0.0)",
22
+ "openai (>=1.77.0,<2.0.0)",
23
+ "youtube-transcript-api (>=1.0.3,<2.0.0)",
24
  ]
25
 
26
 
test_agents.py CHANGED
@@ -4,7 +4,7 @@ import time
4
  import datetime
5
  import os
6
  from dotenv import load_dotenv
7
- from app import BasicAgent # Assuming app.py is accessible
8
 
9
  # Import the BasicAgent from your app module
10
  try:
@@ -85,11 +85,18 @@ def eval_GAIA(json_file_path="GAIA_level1_status.json"):
85
  start_time = time.time()
86
 
87
  # 4. Process questions
 
88
  for q_num, data in gaia_data.items():
 
 
89
  if data.get("status") is False:
90
  processed_count += 1
91
  question = data.get("Q")
92
  correct_answer = data.get("A")
 
 
 
 
93
  status = data.get("status") # Should be False here
94
 
95
  if question is None or correct_answer is None:
@@ -102,7 +109,7 @@ def eval_GAIA(json_file_path="GAIA_level1_status.json"):
102
  print(f"Q: {question[:100]}...") # Print first 100 chars
103
 
104
  try:
105
- agent_response = agent(question)
106
  print(f"Agent A: {agent_response}")
107
  print(f"Correct A: {correct_answer}")
108
 
@@ -140,7 +147,7 @@ def eval_GAIA(json_file_path="GAIA_level1_status.json"):
140
  print(f"Skipping question {q_num}: Status is already True.")
141
 
142
  # Exit
143
- #break
144
 
145
  end_time = time.time()
146
  total_time = end_time - start_time
 
4
  import datetime
5
  import os
6
  from dotenv import load_dotenv
7
+ from app import BasicAgent, GAIA_LEVEL1_VALIDATION_FILES_PATH
8
 
9
  # Import the BasicAgent from your app module
10
  try:
 
85
  start_time = time.time()
86
 
87
  # 4. Process questions
88
+ test_questions = ["27"]
89
  for q_num, data in gaia_data.items():
90
+ if q_num not in test_questions:
91
+ continue
92
  if data.get("status") is False:
93
  processed_count += 1
94
  question = data.get("Q")
95
  correct_answer = data.get("A")
96
+ file_name = data.get("file_name", None)
97
+ if file_name:
98
+ file_name = os.path.join(GAIA_LEVEL1_VALIDATION_FILES_PATH, file_name)
99
+
100
  status = data.get("status") # Should be False here
101
 
102
  if question is None or correct_answer is None:
 
109
  print(f"Q: {question[:100]}...") # Print first 100 chars
110
 
111
  try:
112
+ agent_response = agent(question, file_name)
113
  print(f"Agent A: {agent_response}")
114
  print(f"Correct A: {correct_answer}")
115
 
 
147
  print(f"Skipping question {q_num}: Status is already True.")
148
 
149
  # Exit
150
+ break
151
 
152
  end_time = time.time()
153
  total_time = end_time - start_time