Skip to content

Commit 68cdf52

Browse files
Fix deprecated typing (huggingface#1249)
1 parent 05b709d commit 68cdf52

27 files changed

Lines changed: 335 additions & 352 deletions

examples/agent_from_any_llm.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from typing import Optional
2-
31
from smolagents import InferenceClientModel, LiteLLMModel, OpenAIServerModel, TransformersModel, tool
42
from smolagents.agents import CodeAgent, ToolCallingAgent
53

@@ -38,7 +36,7 @@
3836

3937

4038
@tool
41-
def get_weather(location: str, celsius: Optional[bool] = False) -> str:
39+
def get_weather(location: str, celsius: bool | None = False) -> str:
4240
"""
4341
Get weather in the next days at given location.
4442
Secretly this tool does not care about the location, it hates the weather everywhere.

examples/multiple_tools.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from typing import Optional
2-
31
import requests
42

53
# from smolagents.agents import ToolCallingAgent
@@ -15,7 +13,7 @@
1513

1614

1715
@tool
18-
def get_weather(location: str, celsius: Optional[bool] = False) -> str:
16+
def get_weather(location: str, celsius: bool | None = False) -> str:
1917
"""
2018
Get the current weather at the given location using the WeatherStack API.
2119

examples/open_deep_research/run_gaia.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from concurrent.futures import ThreadPoolExecutor, as_completed
77
from datetime import datetime
88
from pathlib import Path
9-
from typing import List
109

1110
import datasets
1211
import pandas as pd
@@ -242,7 +241,7 @@ def answer_single_question(example, model_id, answers_file, visual_inspection_to
242241
append_answer(annotated_example, answers_file)
243242

244243

245-
def get_examples_to_answer(answers_file, eval_ds) -> List[dict]:
244+
def get_examples_to_answer(answers_file, eval_ds) -> list[dict]:
246245
print(f"Loading answers from {answers_file}...")
247246
try:
248247
done_questions = pd.read_json(answers_file, lines=True)["question"].tolist()

examples/open_deep_research/scripts/mdconvert.py

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import tempfile
1515
import traceback
1616
import zipfile
17-
from typing import Any, Dict, List, Optional, Union
17+
from typing import Any
1818
from urllib.parse import parse_qs, quote, unquote, urlparse, urlunparse
1919

2020
import mammoth
@@ -112,22 +112,22 @@ def convert_soup(self, soup: Any) -> str:
112112
class DocumentConverterResult:
113113
"""The result of converting a document to text."""
114114

115-
def __init__(self, title: Union[str, None] = None, text_content: str = ""):
116-
self.title: Union[str, None] = title
115+
def __init__(self, title: str | None = None, text_content: str = ""):
116+
self.title: str | None = title
117117
self.text_content: str = text_content
118118

119119

120120
class DocumentConverter:
121121
"""Abstract superclass of all DocumentConverters."""
122122

123-
def convert(self, local_path: str, **kwargs: Any) -> Union[None, DocumentConverterResult]:
123+
def convert(self, local_path: str, **kwargs: Any) -> None | DocumentConverterResult:
124124
raise NotImplementedError()
125125

126126

127127
class PlainTextConverter(DocumentConverter):
128128
"""Anything with content type text/plain"""
129129

130-
def convert(self, local_path: str, **kwargs: Any) -> Union[None, DocumentConverterResult]:
130+
def convert(self, local_path: str, **kwargs: Any) -> None | DocumentConverterResult:
131131
# Guess the content type from any file extension that might be around
132132
content_type, _ = mimetypes.guess_type("__placeholder" + kwargs.get("file_extension", ""))
133133

@@ -149,7 +149,7 @@ def convert(self, local_path: str, **kwargs: Any) -> Union[None, DocumentConvert
149149
class HtmlConverter(DocumentConverter):
150150
"""Anything with content type text/html"""
151151

152-
def convert(self, local_path: str, **kwargs: Any) -> Union[None, DocumentConverterResult]:
152+
def convert(self, local_path: str, **kwargs: Any) -> None | DocumentConverterResult:
153153
# Bail if not html
154154
extension = kwargs.get("file_extension", "")
155155
if extension.lower() not in [".html", ".htm"]:
@@ -161,7 +161,7 @@ def convert(self, local_path: str, **kwargs: Any) -> Union[None, DocumentConvert
161161

162162
return result
163163

164-
def _convert(self, html_content: str) -> Union[None, DocumentConverterResult]:
164+
def _convert(self, html_content: str) -> None | DocumentConverterResult:
165165
"""Helper function that converts and HTML string."""
166166

167167
# Parse the string
@@ -189,7 +189,7 @@ def _convert(self, html_content: str) -> Union[None, DocumentConverterResult]:
189189
class WikipediaConverter(DocumentConverter):
190190
"""Handle Wikipedia pages separately, focusing only on the main document content."""
191191

192-
def convert(self, local_path: str, **kwargs: Any) -> Union[None, DocumentConverterResult]:
192+
def convert(self, local_path: str, **kwargs: Any) -> None | DocumentConverterResult:
193193
# Bail if not Wikipedia
194194
extension = kwargs.get("file_extension", "")
195195
if extension.lower() not in [".html", ".htm"]:
@@ -234,7 +234,7 @@ def convert(self, local_path: str, **kwargs: Any) -> Union[None, DocumentConvert
234234
class YouTubeConverter(DocumentConverter):
235235
"""Handle YouTube specially, focusing on the video title, description, and transcript."""
236236

237-
def convert(self, local_path: str, **kwargs: Any) -> Union[None, DocumentConverterResult]:
237+
def convert(self, local_path: str, **kwargs: Any) -> None | DocumentConverterResult:
238238
# Bail if not YouTube
239239
extension = kwargs.get("file_extension", "")
240240
if extension.lower() not in [".html", ".htm"]:
@@ -250,7 +250,7 @@ def convert(self, local_path: str, **kwargs: Any) -> Union[None, DocumentConvert
250250

251251
# Read the meta tags
252252
assert soup.title is not None and soup.title.string is not None
253-
metadata: Dict[str, str] = {"title": soup.title.string}
253+
metadata: dict[str, str] = {"title": soup.title.string}
254254
for meta in soup(["meta"]):
255255
for a in meta.attrs:
256256
if a in ["itemprop", "property", "name"]:
@@ -328,13 +328,13 @@ def convert(self, local_path: str, **kwargs: Any) -> Union[None, DocumentConvert
328328
text_content=webpage_text,
329329
)
330330

331-
def _get(self, metadata: Dict[str, str], keys: List[str], default: Union[str, None] = None) -> Union[str, None]:
331+
def _get(self, metadata: dict[str, str], keys: list[str], default: str | None = None) -> str | None:
332332
for k in keys:
333333
if k in metadata:
334334
return metadata[k]
335335
return default
336336

337-
def _findKey(self, json: Any, key: str) -> Union[str, None]: # TODO: Fix json type
337+
def _findKey(self, json: Any, key: str) -> str | None: # TODO: Fix json type
338338
if isinstance(json, list):
339339
for elm in json:
340340
ret = self._findKey(elm, key)
@@ -356,7 +356,7 @@ class PdfConverter(DocumentConverter):
356356
Converts PDFs to Markdown. Most style information is ignored, so the results are essentially plain-text.
357357
"""
358358

359-
def convert(self, local_path, **kwargs) -> Union[None, DocumentConverterResult]:
359+
def convert(self, local_path, **kwargs) -> None | DocumentConverterResult:
360360
# Bail if not a PDF
361361
extension = kwargs.get("file_extension", "")
362362
if extension.lower() != ".pdf":
@@ -373,7 +373,7 @@ class DocxConverter(HtmlConverter):
373373
Converts DOCX files to Markdown. Style information (e.g.m headings) and tables are preserved where possible.
374374
"""
375375

376-
def convert(self, local_path, **kwargs) -> Union[None, DocumentConverterResult]:
376+
def convert(self, local_path, **kwargs) -> None | DocumentConverterResult:
377377
# Bail if not a DOCX
378378
extension = kwargs.get("file_extension", "")
379379
if extension.lower() != ".docx":
@@ -393,7 +393,7 @@ class XlsxConverter(HtmlConverter):
393393
Converts XLSX files to Markdown, with each sheet presented as a separate Markdown table.
394394
"""
395395

396-
def convert(self, local_path, **kwargs) -> Union[None, DocumentConverterResult]:
396+
def convert(self, local_path, **kwargs) -> None | DocumentConverterResult:
397397
# Bail if not a XLSX
398398
extension = kwargs.get("file_extension", "")
399399
if extension.lower() not in [".xlsx", ".xls"]:
@@ -417,7 +417,7 @@ class PptxConverter(HtmlConverter):
417417
Converts PPTX files to Markdown. Supports heading, tables and images with alt text.
418418
"""
419419

420-
def convert(self, local_path, **kwargs) -> Union[None, DocumentConverterResult]:
420+
def convert(self, local_path, **kwargs) -> None | DocumentConverterResult:
421421
# Bail if not a PPTX
422422
extension = kwargs.get("file_extension", "")
423423
if extension.lower() != ".pptx":
@@ -520,7 +520,7 @@ class WavConverter(MediaConverter):
520520
Converts WAV files to markdown via extraction of metadata (if `exiftool` is installed), and speech transcription (if `speech_recognition` is installed).
521521
"""
522522

523-
def convert(self, local_path, **kwargs) -> Union[None, DocumentConverterResult]:
523+
def convert(self, local_path, **kwargs) -> None | DocumentConverterResult:
524524
# Bail if not a XLSX
525525
extension = kwargs.get("file_extension", "")
526526
if extension.lower() != ".wav":
@@ -570,7 +570,7 @@ class Mp3Converter(WavConverter):
570570
Converts MP3 and M4A files to markdown via extraction of metadata (if `exiftool` is installed), and speech transcription (if `speech_recognition` AND `pydub` are installed).
571571
"""
572572

573-
def convert(self, local_path, **kwargs) -> Union[None, DocumentConverterResult]:
573+
def convert(self, local_path, **kwargs) -> None | DocumentConverterResult:
574574
# Bail if not a MP3
575575
extension = kwargs.get("file_extension", "")
576576
if extension.lower() not in [".mp3", ".m4a"]:
@@ -644,7 +644,7 @@ def __init__(self, extract_dir: str = "downloads"):
644644
# Create the extraction directory if it doesn't exist
645645
os.makedirs(self.extract_dir, exist_ok=True)
646646

647-
def convert(self, local_path: str, **kwargs: Any) -> Union[None, DocumentConverterResult]:
647+
def convert(self, local_path: str, **kwargs: Any) -> None | DocumentConverterResult:
648648
# Bail if not a ZIP file
649649
extension = kwargs.get("file_extension", "")
650650
if extension.lower() != ".zip":
@@ -681,7 +681,7 @@ class ImageConverter(MediaConverter):
681681
Converts images to markdown via extraction of metadata (if `exiftool` is installed), OCR (if `easyocr` is installed), and description via a multimodal LLM (if an mlm_client is configured).
682682
"""
683683

684-
def convert(self, local_path, **kwargs) -> Union[None, DocumentConverterResult]:
684+
def convert(self, local_path, **kwargs) -> None | DocumentConverterResult:
685685
# Bail if not a XLSX
686686
extension = kwargs.get("file_extension", "")
687687
if extension.lower() not in [".jpg", ".jpeg", ".png"]:
@@ -771,9 +771,9 @@ class MarkdownConverter:
771771

772772
def __init__(
773773
self,
774-
requests_session: Optional[requests.Session] = None,
775-
mlm_client: Optional[Any] = None,
776-
mlm_model: Optional[Any] = None,
774+
requests_session: requests.Session | None = None,
775+
mlm_client: Any | None = None,
776+
mlm_model: Any | None = None,
777777
):
778778
if requests_session is None:
779779
self._requests_session = requests.Session()
@@ -783,7 +783,7 @@ def __init__(
783783
self._mlm_client = mlm_client
784784
self._mlm_model = mlm_model
785785

786-
self._page_converters: List[DocumentConverter] = []
786+
self._page_converters: list[DocumentConverter] = []
787787

788788
# Register converters for successful browsing operations
789789
# Later registrations are tried first / take higher priority than earlier registrations
@@ -802,7 +802,7 @@ def __init__(
802802
self.register_page_converter(PdfConverter())
803803

804804
def convert(
805-
self, source: Union[str, requests.Response], **kwargs: Any
805+
self, source: str | requests.Response, **kwargs: Any
806806
) -> DocumentConverterResult: # TODO: deal with kwargs
807807
"""
808808
Args:
@@ -924,7 +924,7 @@ def convert_response(
924924

925925
return result
926926

927-
def _convert(self, local_path: str, extensions: List[Union[str, None]], **kwargs) -> DocumentConverterResult:
927+
def _convert(self, local_path: str, extensions: list[str | None], **kwargs) -> DocumentConverterResult:
928928
error_trace = ""
929929
for ext in extensions + [None]: # Try last with no extension
930930
for converter in self._page_converters:

examples/open_deep_research/scripts/text_inspector_tool.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from typing import Optional
2-
31
from smolagents import Tool
42
from smolagents.models import Model
53

@@ -75,7 +73,7 @@ def forward_initial_exam_mode(self, file_path, question):
7573
]
7674
return self.model(messages).content
7775

78-
def forward(self, file_path, question: Optional[str] = None) -> str:
76+
def forward(self, file_path, question: str | None = None) -> str:
7977
from smolagents.models import MessageRole
8078

8179
result = self.md_converter.convert(file_path)

examples/open_deep_research/scripts/text_web_browser.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import re
77
import time
88
import uuid
9-
from typing import Any, Dict, List, Optional, Tuple, Union
9+
from typing import Any
1010
from urllib.parse import unquote, urljoin, urlparse
1111

1212
import pathvalidate
@@ -24,35 +24,35 @@ class SimpleTextBrowser:
2424

2525
def __init__(
2626
self,
27-
start_page: Optional[str] = None,
28-
viewport_size: Optional[int] = 1024 * 8,
29-
downloads_folder: Optional[Union[str, None]] = None,
30-
serpapi_key: Optional[Union[str, None]] = None,
31-
request_kwargs: Optional[Union[Dict[str, Any], None]] = None,
27+
start_page: str | None = None,
28+
viewport_size: int | None = 1024 * 8,
29+
downloads_folder: str | None | None = None,
30+
serpapi_key: str | None | None = None,
31+
request_kwargs: dict[str, Any] | None | None = None,
3232
):
3333
self.start_page: str = start_page if start_page else "about:blank"
3434
self.viewport_size = viewport_size # Applies only to the standard uri types
3535
self.downloads_folder = downloads_folder
36-
self.history: List[Tuple[str, float]] = list()
37-
self.page_title: Optional[str] = None
36+
self.history: list[tuple[str, float]] = list()
37+
self.page_title: str | None = None
3838
self.viewport_current_page = 0
39-
self.viewport_pages: List[Tuple[int, int]] = list()
39+
self.viewport_pages: list[tuple[int, int]] = list()
4040
self.set_address(self.start_page)
4141
self.serpapi_key = serpapi_key
4242
self.request_kwargs = request_kwargs
4343
self.request_kwargs["cookies"] = COOKIES
4444
self._mdconvert = MarkdownConverter()
4545
self._page_content: str = ""
4646

47-
self._find_on_page_query: Union[str, None] = None
48-
self._find_on_page_last_result: Union[int, None] = None # Location of the last result
47+
self._find_on_page_query: str | None = None
48+
self._find_on_page_last_result: int | None = None # Location of the last result
4949

5050
@property
5151
def address(self) -> str:
5252
"""Return the address of the current page."""
5353
return self.history[-1][0]
5454

55-
def set_address(self, uri_or_path: str, filter_year: Optional[int] = None) -> None:
55+
def set_address(self, uri_or_path: str, filter_year: int | None = None) -> None:
5656
# TODO: Handle anchors
5757
self.history.append((uri_or_path, time.time()))
5858

@@ -102,7 +102,7 @@ def page_down(self) -> None:
102102
def page_up(self) -> None:
103103
self.viewport_current_page = max(self.viewport_current_page - 1, 0)
104104

105-
def find_on_page(self, query: str) -> Union[str, None]:
105+
def find_on_page(self, query: str) -> str | None:
106106
"""Searches for the query from the current viewport forward, looping back to the start if necessary."""
107107

108108
# Did we get here via a previous find_on_page search with the same query?
@@ -121,7 +121,7 @@ def find_on_page(self, query: str) -> Union[str, None]:
121121
self._find_on_page_last_result = viewport_match
122122
return self.viewport
123123

124-
def find_next(self) -> Union[str, None]:
124+
def find_next(self) -> str | None:
125125
"""Scroll to the next viewport that matches the query"""
126126

127127
if self._find_on_page_query is None:
@@ -144,7 +144,7 @@ def find_next(self) -> Union[str, None]:
144144
self._find_on_page_last_result = viewport_match
145145
return self.viewport
146146

147-
def _find_next_viewport(self, query: str, starting_viewport: int) -> Union[int, None]:
147+
def _find_next_viewport(self, query: str, starting_viewport: int) -> int | None:
148148
"""Search for matches between the starting viewport looping when reaching the end."""
149149

150150
if query is None:
@@ -174,7 +174,7 @@ def _find_next_viewport(self, query: str, starting_viewport: int) -> Union[int,
174174

175175
return None
176176

177-
def visit_page(self, path_or_uri: str, filter_year: Optional[int] = None) -> str:
177+
def visit_page(self, path_or_uri: str, filter_year: int | None = None) -> str:
178178
"""Update the address, visit the page, and return the content of the viewport."""
179179
self.set_address(path_or_uri, filter_year=filter_year)
180180
return self.viewport
@@ -201,7 +201,7 @@ def _split_pages(self) -> None:
201201
self.viewport_pages.append((start_idx, end_idx))
202202
start_idx = end_idx
203203

204-
def _serpapi_search(self, query: str, filter_year: Optional[int] = None) -> None:
204+
def _serpapi_search(self, query: str, filter_year: int | None = None) -> None:
205205
if self.serpapi_key is None:
206206
raise ValueError("Missing SerpAPI key.")
207207

@@ -231,7 +231,7 @@ def _prev_visit(url):
231231
return f"You previously visited this page {round(time.time() - self.history[i][1])} seconds ago.\n"
232232
return ""
233233

234-
web_snippets: List[str] = list()
234+
web_snippets: list[str] = list()
235235
idx = 0
236236
if "organic_results" in results:
237237
for page in results["organic_results"]:
@@ -352,7 +352,7 @@ def _fetch_page(self, url: str) -> None:
352352
self.page_title = "Error"
353353
self._set_page_content(f"## Error\n\n{str(request_exception)}")
354354

355-
def _state(self) -> Tuple[str, str]:
355+
def _state(self) -> tuple[str, str]:
356356
header = f"Address: {self.address}\n"
357357
if self.page_title is not None:
358358
header += f"Title: {self.page_title}\n"
@@ -385,7 +385,7 @@ def __init__(self, browser):
385385
super().__init__()
386386
self.browser = browser
387387

388-
def forward(self, query: str, filter_year: Optional[int] = None) -> str:
388+
def forward(self, query: str, filter_year: int | None = None) -> str:
389389
self.browser.visit_page(f"google: {query}", filter_year=filter_year)
390390
header, content = self.browser._state()
391391
return header.strip() + "\n=======================\n" + content

0 commit comments

Comments
 (0)