From 9a7822a84a6803eb3f4aef87b73d7d06a239cc67 Mon Sep 17 00:00:00 2001 From: Jason Liu Date: Sun, 20 Oct 2024 11:43:16 -0400 Subject: [PATCH] feat: add audio support with new `Audio` class and update documentation (#1095) Co-authored-by: Ivan Leo --- docs/blog/posts/openai-multimodal.md | 87 ++++ docs/concepts/multimodal.md | 42 +- examples/openai-audio/output.wav | Bin 0 -> 105678 bytes examples/openai-audio/run.py | 35 ++ instructor/__init__.py | 3 +- instructor/batch.py | 1 + instructor/multimodal.py | 77 +++- mkdocs.yml | 1 + poetry.lock | 551 +++++++++-------------- pyproject.toml | 10 +- tests/llm/test_openai/test_multimodal.py | 44 +- 11 files changed, 503 insertions(+), 348 deletions(-) create mode 100644 docs/blog/posts/openai-multimodal.md create mode 100644 examples/openai-audio/output.wav create mode 100644 examples/openai-audio/run.py diff --git a/docs/blog/posts/openai-multimodal.md b/docs/blog/posts/openai-multimodal.md new file mode 100644 index 000000000..4d7a9cb9c --- /dev/null +++ b/docs/blog/posts/openai-multimodal.md @@ -0,0 +1,87 @@ +--- +authors: +- jxnl +categories: +- OpenAI +- Audio +comments: true +date: 2025-10-17 +description: Explore the new audio capabilities in OpenAI's Chat Completions API using the gpt-4o-audio-preview model. +draft: false +tags: +- OpenAI +- Audio Processing +- API +- Machine Learning +--- + +# Audio Support in OpenAI's Chat Completions API + +OpenAI has recently introduced audio support in their Chat Completions API, opening up exciting new possibilities for developers working with audio and text interactions. This feature is powered by the new `gpt-4o-audio-preview` model, which brings advanced voice capabilities to the familiar Chat Completions API interface. + +## Key Features + +The new audio support in the Chat Completions API offers several compelling features: + +1. **Flexible Input Handling**: The API can now process any combination of text and audio inputs, allowing for more versatile applications. + +2. **Natural, Steerable Voices**: Similar to the Realtime API, developers can use prompting to shape various aspects of the generated audio, including language, pronunciation, and emotional range. + +3. **Tool Calling Integration**: The audio support seamlessly integrates with existing tool calling functionality, enabling complex workflows that combine audio, text, and external tools. + +## Practical Example + +To demonstrate how to use this new functionality, let's look at a simple example using the `instructor` library: + +"""python +from openai import OpenAI +from pydantic import BaseModel +import instructor +from instructor.multimodal import Audio +import base64 + +client = instructor.from_openai(OpenAI()) + +class Person(BaseModel): + name: str + age: int + +resp = client.chat.completions.create( + model="gpt-4o-audio-preview", + response_model=Person, + modalities=["text"], + audio={"voice": "alloy", "format": "wav"}, + messages=[ + { + "role": "user", + "content": [ + "Extract the following information from the audio", + Audio.from_path("./output.wav"), + ], + }, + ], +) + +print(resp) +# Expected output: Person(name='Jason', age=20) +""" + +In this example, we're using the `gpt-4o-audio-preview` model to extract information from an audio file. The API processes the audio input and returns structured data (a Person object with name and age) based on the content of the audio. + +## Use Cases + +The addition of audio support to the Chat Completions API enables a wide range of applications: + +1. **Voice-based Personal Assistants**: Create more natural and context-aware voice interfaces for various applications. + +2. **Audio Content Analysis**: Automatically extract information, sentiments, or key points from audio recordings or podcasts. + +3. **Language Learning Tools**: Develop interactive language learning applications that can process and respond to spoken language. + +4. **Accessibility Features**: Improve accessibility in applications by providing audio-based interactions and text-to-speech capabilities. + +## Considerations + +While this new feature is exciting, it's important to note that it's best suited for asynchronous use cases that don't require extremely low latencies. For more dynamic and real-time interactions, OpenAI recommends using their Realtime API. + +As with any AI-powered feature, it's crucial to consider ethical implications and potential biases in audio processing and generation. Always test thoroughly and consider the diversity of your user base when implementing these features. diff --git a/docs/concepts/multimodal.md b/docs/concepts/multimodal.md index abf052d30..baad197ce 100644 --- a/docs/concepts/multimodal.md +++ b/docs/concepts/multimodal.md @@ -1,6 +1,6 @@ --- title: Seamless Multimodal Interactions with Instructor -description: Learn how the Image class in Instructor enables seamless handling of images and text across different AI models. +description: Learn how the Image and Audio class in Instructor enables seamless handling of images, audio and text across different AI models. --- # Multimodal @@ -87,3 +87,43 @@ response = client.chat.completions.create( autodetect_images=True ) ``` + +## `Audio` + +The `Audio` class represents an audio file that can be loaded from a URL or file path. It provides methods to create `Audio` instances but currently only OpenAI supports it. You can create an instance using the `from_path` and `from_url` methods. The `Audio` class will automatically convert it to a base64-encoded image and include it in the API request. + +### Usage + +```python +from openai import OpenAI +from pydantic import BaseModel +import instructor +from instructor.multimodal import Audio +import base64 + +client = instructor.from_openai(OpenAI()) + + +class User(BaseModel): + name: str + age: int + + +with open("./output.wav", "rb") as f: + encoded_string = base64.b64encode(f.read()).decode("utf-8") + +resp = client.chat.completions.create( + model="gpt-4o-audio-preview", + response_model=User, + modalities=["text"], + audio={"voice": "alloy", "format": "wav"}, + "Extract the following information from the audio:", + Audio.from_path("./output.wav"), + ], + }, + ], +) # type: ignore + +print(resp) +# > name='Jason' age=20 +``` diff --git a/examples/openai-audio/output.wav b/examples/openai-audio/output.wav new file mode 100644 index 0000000000000000000000000000000000000000..58b1ea7119114094aec827c952faa281b37ddc52 GIT binary patch literal 105678 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 Person(name='Jason', age=20) diff --git a/instructor/__init__.py b/instructor/__init__.py index 348884f54..e22bd553a 100644 --- a/instructor/__init__.py +++ b/instructor/__init__.py @@ -3,7 +3,7 @@ from .mode import Mode from .process_response import handle_response_model from .distil import FinetuneFormat, Instructions -from .multimodal import Image +from .multimodal import Image, Audio from .dsl import ( CitationMixin, Maybe, @@ -26,6 +26,7 @@ __all__ = [ "Instructor", "Image", + "Audio", "from_openai", "from_litellm", "AsyncInstructor", diff --git a/instructor/batch.py b/instructor/batch.py index afb572bc4..6effd60da 100644 --- a/instructor/batch.py +++ b/instructor/batch.py @@ -141,6 +141,7 @@ def create_from_messages( messages=messages, max_tokens=max_tokens, temperature=temperature, + **kwargs, ), ) else: diff --git a/instructor/multimodal.py b/instructor/multimodal.py index 3be20e936..524f2eced 100644 --- a/instructor/multimodal.py +++ b/instructor/multimodal.py @@ -19,6 +19,7 @@ import mimetypes import requests from pydantic import BaseModel, Field +from .mode import Mode F = TypeVar("F", bound=Callable[..., Any]) K = TypeVar("K", bound=Hashable) @@ -50,11 +51,11 @@ class Image(BaseModel): ) @classmethod - def autodetect(cls, source: str | Path) -> Image: + def autodetect(cls, source: Union[str, Path]) -> Image: # noqa: UP007 """Attempt to autodetect an image from a source string or Path. Args: - source (str | Path): The source string or path. + source (Union[str,path]): The source string or path. Returns: An Image if the source is detected to be a valid image. Raises: @@ -75,11 +76,11 @@ def autodetect(cls, source: str | Path) -> Image: raise ValueError("Unable to determine image type or unsupported image format") @classmethod - def autodetect_safely(cls, source: str | Path) -> Union[Image, str]: # noqa: UP007 + def autodetect_safely(cls, source: Union[str, Path]) -> Union[Image, str]: # noqa: UP007 """Safely attempt to autodetect an image from a source string or path. Args: - source (str | Path): The source string or path. + source (Union[str,path]): The source string or path. Returns: An Image if the source is detected to be a valid image, otherwise the source itself as a string. @@ -146,7 +147,7 @@ def from_url(cls, url: str) -> Image: @classmethod @lru_cache - def from_path(cls, path: str | Path) -> Image: + def from_path(cls, path: Union[str, Path]) -> Image: # noqa: UP007 path = Path(path) if not path.is_file(): raise FileNotFoundError(f"Image file not found: {path}") @@ -204,8 +205,47 @@ def to_openai(self) -> dict[str, Any]: raise ValueError("Image data is missing for base64 encoding.") +class Audio(BaseModel): + """Represents an audio that can be loaded from a URL or file path.""" + + source: Union[str, Path] = Field(..., description="URL or file path of the audio") # noqa: UP007 + data: Union[str, None] = Field( # noqa: UP007 + None, description="Base64 encoded audio data", repr=False + ) + + @classmethod + def from_url(cls, url: str) -> Audio: + """Create an Audio instance from a URL.""" + assert url.endswith(".wav"), "Audio must be in WAV format" + + response = requests.get(url) + data = base64.b64encode(response.content).decode("utf-8") + return cls(source=url, data=data) + + @classmethod + def from_path(cls, path: Union[str, Path]) -> Audio: # noqa: UP007 + """Create an Audio instance from a file path.""" + path = Path(path) + assert path.is_file(), f"Audio file not found: {path}" + assert path.suffix.lower() == ".wav", "Audio must be in WAV format" + + data = base64.b64encode(path.read_bytes()).decode("utf-8") + return cls(source=str(path), data=data) + + def to_openai(self) -> dict[str, Any]: + """Convert the Audio instance to OpenAI's API format.""" + return { + "type": "input_audio", + "input_audio": {"data": self.data, "format": "wav"}, + } + + def to_anthropic(self) -> dict[str, Any]: + raise NotImplementedError("Anthropic is not supported yet") + + class ImageWithCacheControl(Image): """Image with Anthropic prompt caching support.""" + cache_control: OptionalCacheControlType = Field( None, description="Optional Anthropic cache control image" ) @@ -232,14 +272,18 @@ def to_anthropic(self) -> dict[str, Any]: def convert_contents( contents: Union[ # noqa: UP007 - list[Union[str, dict[str, Any], Image]], str, dict[str, Any], Image # noqa: UP007 + str, + dict[str, Any], + Image, + Audio, + list[Union[str, dict[str, Any], Image, Audio]], # noqa: UP007 ], mode: Mode, ) -> Union[str, list[dict[str, Any]]]: # noqa: UP007 """Convert content items to the appropriate format based on the specified mode.""" if isinstance(contents, str): return contents - if isinstance(contents, Image) or isinstance(contents, dict): + if isinstance(contents, (Image, Audio)) or isinstance(contents, dict): contents = [contents] converted_contents: list[dict[str, Union[str, Image]]] = [] # noqa: UP007 @@ -248,7 +292,7 @@ def convert_contents( converted_contents.append({"type": "text", "text": content}) elif isinstance(content, dict): converted_contents.append(content) - elif isinstance(content, Image): + elif isinstance(content, (Image, Audio)): if mode in {Mode.ANTHROPIC_JSON, Mode.ANTHROPIC_TOOLS}: converted_contents.append(content.to_anthropic()) elif mode in {Mode.GEMINI_JSON, Mode.GEMINI_TOOLS}: @@ -264,9 +308,15 @@ def convert_messages( messages: list[ dict[ str, - Union[list[Union[str, dict[str, Any], Image]], str, dict[str, Any], Image], # noqa: UP007 + Union[ # noqa: UP007 + str, + dict[str, Any], + Image, + Audio, + list[Union[str, dict[str, Any], Image, Audio]], # noqa: UP007 + ], ] - ], # noqa: UP007 + ], mode: Mode, autodetect_images: bool = False, ) -> list[dict[str, Any]]: @@ -277,11 +327,16 @@ def is_image_params(x: Any) -> bool: return isinstance(x, dict) and x.get("type") == "image" and "source" in x # type: ignore for message in messages: + if "type" in message: + if message["type"] in {"audio", "image"}: + converted_messages.append(message) # type: ignore + else: + raise ValueError(f"Unsupported message type: {message['type']}") role = message["role"] content = message["content"] if autodetect_images: if isinstance(content, list): - new_content: list[Union[str, dict[str, Any], Image]] = [] # noqa: UP007 + new_content: list[Union[str, dict[str, Any], Image, Audio]] = [] # noqa: UP007 for item in content: if isinstance(item, str): new_content.append(Image.autodetect_safely(item)) diff --git a/mkdocs.yml b/mkdocs.yml index 8635e71bc..ae4817ab2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -164,6 +164,7 @@ nav: - "blog/index.md" - Concepts: - Models: 'concepts/models.md' + - Multimodal : 'concepts/multimodal.md' - Retrying: 'concepts/retrying.md' - Patching: 'concepts/patching.md' - Hooks: 'concepts/hooks.md' diff --git a/poetry.lock b/poetry.lock index 12643bf1d..5241de453 100644 --- a/poetry.lock +++ b/poetry.lock @@ -150,13 +150,13 @@ files = [ [[package]] name = "anthropic" -version = "0.34.2" +version = "0.36.2" description = "The official Python library for the anthropic API" optional = false python-versions = ">=3.7" files = [ - {file = "anthropic-0.34.2-py3-none-any.whl", hash = "sha256:f50a628eb71e2c76858b106c8cbea278c45c6bd2077cb3aff716a112abddc9fc"}, - {file = "anthropic-0.34.2.tar.gz", hash = "sha256:808ea19276f26646bfde9ee535669735519376e4eeb301a2974fc69892be1d6e"}, + {file = "anthropic-0.36.2-py3-none-any.whl", hash = "sha256:308ddc6c538de03c081552e456bc0b387b6f7c7d1dea0c20122cc11c7cdbaf6a"}, + {file = "anthropic-0.36.2.tar.gz", hash = "sha256:d5a3fa56d1c82a51944f9dc7b0dc72048deb89f8df5ebfd09e2d1b59c62eb8eb"}, ] [package.dependencies] @@ -353,47 +353,6 @@ webencodings = "*" [package.extras] css = ["tinycss2 (>=1.1.0,<1.3)"] -[[package]] -name = "boto3" -version = "1.35.42" -description = "The AWS SDK for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "boto3-1.35.42-py3-none-any.whl", hash = "sha256:e1f36f8be453505cebcc3da178ea081b2a06c0e5e1cdee774f1067599b8d9c3e"}, - {file = "boto3-1.35.42.tar.gz", hash = "sha256:a5b00f8b82dce62870759f04861747944da834d64a64355970120c475efdafc0"}, -] - -[package.dependencies] -botocore = ">=1.35.42,<1.36.0" -jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.10.0,<0.11.0" - -[package.extras] -crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] - -[[package]] -name = "botocore" -version = "1.35.42" -description = "Low-level, data-driven core of boto 3." -optional = false -python-versions = ">=3.8" -files = [ - {file = "botocore-1.35.42-py3-none-any.whl", hash = "sha256:05af0bb8b9cea7ce7bc589c332348d338a21b784e9d088a588fd10ec145007ff"}, - {file = "botocore-1.35.42.tar.gz", hash = "sha256:af348636f73dc24b7e2dc760a34d08c8f2f94366e9b4c78d877307b128abecef"}, -] - -[package.dependencies] -jmespath = ">=0.7.1,<2.0.0" -python-dateutil = ">=2.1,<3.0.0" -urllib3 = [ - {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, - {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, -] - -[package.extras] -crt = ["awscrt (==0.22.0)"] - [[package]] name = "cachecontrol" version = "0.14.0" @@ -706,17 +665,16 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "cohere" -version = "5.10.0" +version = "5.11.1" description = "" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "cohere-5.10.0-py3-none-any.whl", hash = "sha256:46e50e3e8514a99cf77b4c022c8077a6205fba948051c33087ddeb66ec706f0a"}, - {file = "cohere-5.10.0.tar.gz", hash = "sha256:21020a7ae4c30f72991ef91566a926a9d7d1485d7abeed7bfa2bd6f35ea34783"}, + {file = "cohere-5.11.1-py3-none-any.whl", hash = "sha256:117c718bfbc7637cf22c1025e8e2bf820ebeef51f7fbb2b9d74f3e9c0a9c6c25"}, + {file = "cohere-5.11.1.tar.gz", hash = "sha256:821e20593def7796d314be9bcba87e9ecf69dc6ef17172f842447275f8679d0f"}, ] [package.dependencies] -boto3 = ">=1.34.0,<2.0.0" fastavro = ">=1.9.4,<2.0.0" httpx = ">=0.21.2" httpx-sse = "0.4.0" @@ -728,6 +686,9 @@ tokenizers = ">=0.15,<1" types-requests = ">=2.0.0,<3.0.0" typing_extensions = ">=4.0.0" +[package.extras] +aws = ["boto3 (>=1.34.0,<2.0.0)", "sagemaker (>=2.232.1,<3.0.0)"] + [[package]] name = "colorama" version = "0.4.6" @@ -1400,12 +1361,12 @@ files = [ google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" @@ -1812,13 +1773,13 @@ test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "1.4.1" +version = "1.5.1" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.9" files = [ - {file = "griffe-1.4.1-py3-none-any.whl", hash = "sha256:84295ee0b27743bd880aea75632830ef02ded65d16124025e4c263bb826ab645"}, - {file = "griffe-1.4.1.tar.gz", hash = "sha256:911a201b01dc92e08c0e84c38a301e9da5ec067f00e7d9f2e39bc24dbfa3c176"}, + {file = "griffe-1.5.1-py3-none-any.whl", hash = "sha256:ad6a7980f8c424c9102160aafa3bcdf799df0e75f7829d75af9ee5aef656f860"}, + {file = "griffe-1.5.1.tar.gz", hash = "sha256:72964f93e08c553257706d6cd2c42d1c172213feb48b2be386f243380b405d4b"}, ] [package.dependencies] @@ -2076,13 +2037,13 @@ wsproto = "*" [[package]] name = "huggingface-hub" -version = "0.25.2" +version = "0.26.0" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.25.2-py3-none-any.whl", hash = "sha256:1897caf88ce7f97fe0110603d8f66ac264e3ba6accdf30cd66cc0fed5282ad25"}, - {file = "huggingface_hub-0.25.2.tar.gz", hash = "sha256:a1014ea111a5f40ccd23f7f7ba8ac46e20fa3b658ced1f86a00c75c06ec6423c"}, + {file = "huggingface_hub-0.26.0-py3-none-any.whl", hash = "sha256:e43b8f36042b2103b48dea822535e08f5f089c4aa7013a067fca7b4ebf7f85a3"}, + {file = "huggingface_hub-0.26.0.tar.gz", hash = "sha256:524fe9281b015b76aa73ff1a83bf1cbe8cab851c9ac5ae5fcd2a25d5173ce629"}, ] [package.dependencies] @@ -2095,16 +2056,16 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] hf-transfer = ["hf-transfer (>=0.1.4)"] -inference = ["aiohttp", "minijinja (>=1.0)"] -quality = ["mypy (==1.5.1)", "ruff (>=0.5.0)"] +inference = ["aiohttp"] +quality = ["libcst (==1.4.0)", "mypy (==1.5.1)", "ruff (>=0.5.0)"] tensorflow = ["graphviz", "pydot", "tensorflow"] tensorflow-testing = ["keras (<3.0)", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] torch = ["safetensors[torch]", "torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] @@ -2332,17 +2293,6 @@ files = [ {file = "jiter-0.5.0.tar.gz", hash = "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a"}, ] -[[package]] -name = "jmespath" -version = "1.0.1" -description = "JSON Matching Expressions" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, - {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, -] - [[package]] name = "jsmin" version = "3.0.1" @@ -2509,13 +2459,13 @@ lxml = {version = ">=4.4.2", extras = ["html-clean"]} [[package]] name = "litellm" -version = "1.49.5" +version = "1.50.0" description = "Library to easily interface with LLM API providers" optional = false python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" files = [ - {file = "litellm-1.49.5-py3-none-any.whl", hash = "sha256:9cd246221c1d922edb7614f29b5b5618b9da588f0ac04612965dbd8afeaa130f"}, - {file = "litellm-1.49.5.tar.gz", hash = "sha256:f45667d723d77d235dc3cc3b056338012eb2ffbfd46d7beb7abea927f49358e0"}, + {file = "litellm-1.50.0-py3-none-any.whl", hash = "sha256:97e25a2df273fdac012334515d84ce732ffa14f07582db2898fdd90bb85f35fe"}, + {file = "litellm-1.50.0.tar.gz", hash = "sha256:2202506b842e6048222d284f8b07c0491460cd256136202dd0da74a9aec2fcce"}, ] [package.dependencies] @@ -2524,7 +2474,7 @@ click = "*" importlib-metadata = ">=6.8.0" jinja2 = ">=3.1.2,<4.0.0" jsonschema = ">=4.22.0,<5.0.0" -openai = ">=1.51.0" +openai = ">=1.52.0" pydantic = ">=2.0.0,<3.0.0" python-dotenv = ">=0.2.0" requests = ">=2.31.0,<3.0.0" @@ -2750,72 +2700,72 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "3.0.1" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" files = [ - {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-win32.whl", hash = "sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-win32.whl", hash = "sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-win32.whl", hash = "sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-win32.whl", hash = "sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-win32.whl", hash = "sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4935dd7883f1d50e2ffecca0aa33dc1946a94c8f3fdafb8df5c330e48f71b132"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e9393357f19954248b00bed7c56f29a25c930593a77630c719653d51e7669c2a"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40621d60d0e58aa573b68ac5e2d6b20d44392878e0bfc159012a5787c4e35bc8"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f94190df587738280d544971500b9cafc9b950d32efcb1fba9ac10d84e6aa4e6"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6a387d61fe41cdf7ea95b38e9af11cfb1a63499af2759444b99185c4ab33f5b"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8ad4ad1429cd4f315f32ef263c1342166695fad76c100c5d979c45d5570ed58b"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e24bfe89c6ac4c31792793ad9f861b8f6dc4546ac6dc8f1c9083c7c4f2b335cd"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a4b34a8d14649315c4bc26bbfa352663eb51d146e35eef231dd739d54a5430a"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-win32.whl", hash = "sha256:242d6860f1fd9191aef5fae22b51c5c19767f93fb9ead4d21924e0bcb17619d8"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:93e8248d650e7e9d49e8251f883eed60ecbc0e8ffd6349e18550925e31bd029b"}, - {file = "markupsafe-3.0.1.tar.gz", hash = "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] @@ -2990,13 +2940,13 @@ pygments = ">2.12.0" [[package]] name = "mkdocs-material" -version = "9.5.41" +version = "9.5.42" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.41-py3-none-any.whl", hash = "sha256:990bc138c33342b5b73e7545915ebc0136e501bfbd8e365735144f5120891d83"}, - {file = "mkdocs_material-9.5.41.tar.gz", hash = "sha256:30fa5d459b4b8130848ecd8e1c908878345d9d8268f7ddbc31eebe88d462d97b"}, + {file = "mkdocs_material-9.5.42-py3-none-any.whl", hash = "sha256:452a7c5d21284b373f36b981a2cbebfff59263feebeede1bc28652e9c5bbe316"}, + {file = "mkdocs_material-9.5.42.tar.gz", hash = "sha256:92779b5e9b5934540c574c11647131d217dc540dce72b05feeda088c8eb1b8f2"}, ] [package.dependencies] @@ -3119,13 +3069,13 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.12.1" +version = "1.12.2" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.9" files = [ - {file = "mkdocstrings_python-1.12.1-py3-none-any.whl", hash = "sha256:205244488199c9aa2a39787ad6a0c862d39b74078ea9aa2be817bc972399563f"}, - {file = "mkdocstrings_python-1.12.1.tar.gz", hash = "sha256:60d6a5ca912c9af4ad431db6d0111ce9f79c6c48d33377dde6a05a8f5f48d792"}, + {file = "mkdocstrings_python-1.12.2-py3-none-any.whl", hash = "sha256:7f7d40d6db3cb1f5d19dbcd80e3efe4d0ba32b073272c0c0de9de2e604eda62a"}, + {file = "mkdocstrings_python-1.12.2.tar.gz", hash = "sha256:7a1760941c0b52a2cd87b960a9e21112ffe52e7df9d0b9583d04d47ed2e186f3"}, ] [package.dependencies] @@ -3504,13 +3454,13 @@ files = [ [[package]] name = "openai" -version = "1.51.2" +version = "1.52.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.51.2-py3-none-any.whl", hash = "sha256:5c5954711cba931423e471c37ff22ae0fd3892be9b083eee36459865fbbb83fa"}, - {file = "openai-1.51.2.tar.gz", hash = "sha256:c6a51fac62a1ca9df85a522e462918f6bb6bc51a8897032217e453a0730123a6"}, + {file = "openai-1.52.0-py3-none-any.whl", hash = "sha256:0c249f20920183b0a2ca4f7dba7b0452df3ecd0fa7985eb1d91ad884bc3ced9c"}, + {file = "openai-1.52.0.tar.gz", hash = "sha256:95c65a5f77559641ab8f3e4c3a050804f7b51d278870e2ec1f7444080bfe565a"}, ] [package.dependencies] @@ -3605,9 +3555,9 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.22.4", markers = "python_version < \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -4002,32 +3952,33 @@ files = [ [[package]] name = "psutil" -version = "6.0.0" +version = "6.1.0" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, - {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, - {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, - {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, - {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, - {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, - {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, - {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, - {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, - {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, - {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, - {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, - {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, - {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, ] [package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] [[package]] name = "ptyprocess" @@ -4156,8 +4107,8 @@ files = [ annotated-types = ">=0.4.0" pydantic-core = "2.20.1" typing-extensions = [ - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, ] [package.extras] @@ -4986,48 +4937,31 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.6.9" +version = "0.7.0" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.6.9-py3-none-linux_armv6l.whl", hash = "sha256:064df58d84ccc0ac0fcd63bc3090b251d90e2a372558c0f057c3f75ed73e1ccd"}, - {file = "ruff-0.6.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:140d4b5c9f5fc7a7b074908a78ab8d384dd7f6510402267bc76c37195c02a7ec"}, - {file = "ruff-0.6.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53fd8ca5e82bdee8da7f506d7b03a261f24cd43d090ea9db9a1dc59d9313914c"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645d7d8761f915e48a00d4ecc3686969761df69fb561dd914a773c1a8266e14e"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eae02b700763e3847595b9d2891488989cac00214da7f845f4bcf2989007d577"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d5ccc9e58112441de8ad4b29dcb7a86dc25c5f770e3c06a9d57e0e5eba48829"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:417b81aa1c9b60b2f8edc463c58363075412866ae4e2b9ab0f690dc1e87ac1b5"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c866b631f5fbce896a74a6e4383407ba7507b815ccc52bcedabb6810fdb3ef7"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b118afbb3202f5911486ad52da86d1d52305b59e7ef2031cea3425142b97d6f"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67267654edc23c97335586774790cde402fb6bbdb3c2314f1fc087dee320bfa"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3ef0cc774b00fec123f635ce5c547dac263f6ee9fb9cc83437c5904183b55ceb"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:12edd2af0c60fa61ff31cefb90aef4288ac4d372b4962c2864aeea3a1a2460c0"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:55bb01caeaf3a60b2b2bba07308a02fca6ab56233302406ed5245180a05c5625"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:925d26471fa24b0ce5a6cdfab1bb526fb4159952385f386bdcc643813d472039"}, - {file = "ruff-0.6.9-py3-none-win32.whl", hash = "sha256:eb61ec9bdb2506cffd492e05ac40e5bc6284873aceb605503d8494180d6fc84d"}, - {file = "ruff-0.6.9-py3-none-win_amd64.whl", hash = "sha256:785d31851c1ae91f45b3d8fe23b8ae4b5170089021fbb42402d811135f0b7117"}, - {file = "ruff-0.6.9-py3-none-win_arm64.whl", hash = "sha256:a9641e31476d601f83cd602608739a0840e348bda93fec9f1ee816f8b6798b93"}, - {file = "ruff-0.6.9.tar.gz", hash = "sha256:b076ef717a8e5bc819514ee1d602bbdca5b4420ae13a9cf61a0c0a4f53a2baa2"}, -] - -[[package]] -name = "s3transfer" -version = "0.10.3" -description = "An Amazon S3 Transfer Manager" -optional = false -python-versions = ">=3.8" -files = [ - {file = "s3transfer-0.10.3-py3-none-any.whl", hash = "sha256:263ed587a5803c6c708d3ce44dc4dfedaab4c1a32e8329bab818933d79ddcf5d"}, - {file = "s3transfer-0.10.3.tar.gz", hash = "sha256:4f50ed74ab84d474ce614475e0b8d5047ff080810aac5d01ea25231cfc944b0c"}, + {file = "ruff-0.7.0-py3-none-linux_armv6l.whl", hash = "sha256:0cdf20c2b6ff98e37df47b2b0bd3a34aaa155f59a11182c1303cce79be715628"}, + {file = "ruff-0.7.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:496494d350c7fdeb36ca4ef1c9f21d80d182423718782222c29b3e72b3512737"}, + {file = "ruff-0.7.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:214b88498684e20b6b2b8852c01d50f0651f3cc6118dfa113b4def9f14faaf06"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630fce3fefe9844e91ea5bbf7ceadab4f9981f42b704fae011bb8efcaf5d84be"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:211d877674e9373d4bb0f1c80f97a0201c61bcd1e9d045b6e9726adc42c156aa"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194d6c46c98c73949a106425ed40a576f52291c12bc21399eb8f13a0f7073495"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:82c2579b82b9973a110fab281860403b397c08c403de92de19568f32f7178598"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9af971fe85dcd5eaed8f585ddbc6bdbe8c217fb8fcf510ea6bca5bdfff56040e"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b641c7f16939b7d24b7bfc0be4102c56562a18281f84f635604e8a6989948914"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d71672336e46b34e0c90a790afeac8a31954fd42872c1f6adaea1dff76fd44f9"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ab7d98c7eed355166f367597e513a6c82408df4181a937628dbec79abb2a1fe4"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1eb54986f770f49edb14f71d33312d79e00e629a57387382200b1ef12d6a4ef9"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:dc452ba6f2bb9cf8726a84aa877061a2462afe9ae0ea1d411c53d226661c601d"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4b406c2dce5be9bad59f2de26139a86017a517e6bcd2688da515481c05a2cb11"}, + {file = "ruff-0.7.0-py3-none-win32.whl", hash = "sha256:f6c968509f767776f524a8430426539587d5ec5c662f6addb6aa25bc2e8195ec"}, + {file = "ruff-0.7.0-py3-none-win_amd64.whl", hash = "sha256:ff4aabfbaaba880e85d394603b9e75d32b0693152e16fa659a3064a85df7fce2"}, + {file = "ruff-0.7.0-py3-none-win_arm64.whl", hash = "sha256:10842f69c245e78d6adec7e1db0a7d9ddc2fff0621d730e61657b64fa36f207e"}, + {file = "ruff-0.7.0.tar.gz", hash = "sha256:47a86360cf62d9cd53ebfb0b5eb0e882193fc191c6d717e8bef4462bc3b9ea2b"}, ] -[package.dependencies] -botocore = ">=1.33.2,<2.0a.0" - -[package.extras] -crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] - [[package]] name = "shapely" version = "2.0.6" @@ -5617,20 +5551,6 @@ rich = ">=10.11.0" shellingham = ">=1.3.0" typing-extensions = ">=3.7.4.3" -[[package]] -name = "types-requests" -version = "2.31.0.6" -description = "Typing stubs for requests" -optional = false -python-versions = ">=3.7" -files = [ - {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, - {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, -] - -[package.dependencies] -types-urllib3 = "*" - [[package]] name = "types-requests" version = "2.32.0.20241016" @@ -5645,17 +5565,6 @@ files = [ [package.dependencies] urllib3 = ">=2" -[[package]] -name = "types-urllib3" -version = "1.26.25.14" -description = "Typing stubs for urllib3" -optional = false -python-versions = "*" -files = [ - {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, - {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, -] - [[package]] name = "typing-extensions" version = "4.12.2" @@ -5721,22 +5630,6 @@ files = [ {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, ] -[[package]] -name = "urllib3" -version = "1.26.20" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, - {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, -] - -[package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - [[package]] name = "urllib3" version = "2.2.3" @@ -5977,93 +5870,93 @@ files = [ [[package]] name = "yarl" -version = "1.15.4" +version = "1.15.5" description = "Yet another URL library" optional = false python-versions = ">=3.9" files = [ - {file = "yarl-1.15.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:551205388d1da18a9975302c9a274ba24788f53bb9bb86187496ebf9e938916e"}, - {file = "yarl-1.15.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eee724176b5bc50ee64905f559345448119b860a30b9489bd7a073f61baf925f"}, - {file = "yarl-1.15.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db818e33599f7b2e4c6507f2b2c24f45ff539a1b6e4e09163bb6f3cfb4616ca7"}, - {file = "yarl-1.15.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07019a9de859c5a29916defd1e8c7557de6491a10bf50c49ff5284e6aedf5313"}, - {file = "yarl-1.15.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db64a20e78969fc66665d2e5fc96cb4f4dc80f2137d8fed4b5a650ad569bb60f"}, - {file = "yarl-1.15.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4076bfd8f1621449b19b9826848ed51bf0f2d1d38e82647c312c0730d8778903"}, - {file = "yarl-1.15.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c23a442973dba3646811c284fce3dddd7fe5c2bd674ac73a122198e8218d6115"}, - {file = "yarl-1.15.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2bdb038b3f5c284e3919218c580dedc95f592c417a358361450b9519b22f7a8"}, - {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:59db8e6888d5302b8dbca0c1026ddabe99d81d67cdc101941519e13ffc9050fe"}, - {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f3294ce265011547630a59c20085fcb6af8cc5fa1fa44a203251f7d86cd5d913"}, - {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4851618679ca70b863ba2e7109be5f09f8fd7715ec505bd42e5a947dcfde3a45"}, - {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:dce1c56beef74d9c799a6ed94001693232a1402138292353a8ce302b64f457d9"}, - {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1e7468f31de61a82817f918743e5229fce774f73fad58487cdf88eef4f06d864"}, - {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:527c68f48a91d953691291d3bce0209293aa5ad13ff05286ddb506791c331818"}, - {file = "yarl-1.15.4-cp310-cp310-win32.whl", hash = "sha256:c30115cecaf25fdcb67cc71c669d08425207f62d7a2f6d5416057c1460529216"}, - {file = "yarl-1.15.4-cp310-cp310-win_amd64.whl", hash = "sha256:df09c80f4bc2bc2efde309af383c3fe8fd8c51fe0519edb350b9c9e0af43ffa4"}, - {file = "yarl-1.15.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:76259901cf1ac3db65e7e6dff04775b626d0715f9b51d92b447351144c756a82"}, - {file = "yarl-1.15.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:98d8dc1e8133f86d916125deca9780d791b22645f0d62bafe1452d1cd5eac631"}, - {file = "yarl-1.15.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d0f16c87c62b7a94b389ddf6a8c9d081265d788875c39f3a80108c4856eea7b"}, - {file = "yarl-1.15.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8de5328d91859b461899497980d4cc8269e84e2d18640f6ac643886fda9000bf"}, - {file = "yarl-1.15.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84937d00e2ea03616c40977de20189fa13a9213e5744a3c6afa0e7dd9141d69c"}, - {file = "yarl-1.15.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:691a3b498fdebef63308e8967bb598cfd326c56d628da82b799dd181bace4503"}, - {file = "yarl-1.15.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a706db0c3b7e4578ff34ed2b1d2507b08fd491346ffc64468786fdf1151d938"}, - {file = "yarl-1.15.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:adb6b5d07d17c32f9d34c9dd4a693637a72323cfcb1f8a52d57033ab2dd21e99"}, - {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e100c6c7d9e9d469009fd55cc4d7ad168d67d40758865c50da713f7ada491e5"}, - {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:df6b254e55c8ac2362afaa651e3e53453aa19a095570792346245773b434176e"}, - {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8721f8bedaa722c3c483cc06a1399cbfdb280eadf443aa5d324b0203cef2a75f"}, - {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1005921b30f4f39bf893946df6173567ff650307babb5ec04bbf64342a1f62c1"}, - {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ab79cc13307065a0b3ef087f09f0509996fc605d35d6642bb28e5d85b2648e1e"}, - {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f337486742c700b102d640830aab3faf2848bed966b479a39e6783edd4ab1c6c"}, - {file = "yarl-1.15.4-cp311-cp311-win32.whl", hash = "sha256:20acf84bd1ce530065f8e957e4a5878fda4bc5f18cb02659828210e1519de54e"}, - {file = "yarl-1.15.4-cp311-cp311-win_amd64.whl", hash = "sha256:ab9ccf26cb3fa32747ba2a637a189d2d42386a2fc4afc10dbc7f85922dd23b0f"}, - {file = "yarl-1.15.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f923e94e93a37fd990e8336e0b9bedea533e7cbed14e0c572bf9357ef2a70681"}, - {file = "yarl-1.15.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3198da7d7c34e29fc8c823e0c3ce6c7274aac35760de557c2017489c7d98fc5a"}, - {file = "yarl-1.15.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d886de2ea81f513ba2d6820451d33b767a97c37867ba688d42e164b2dbca1362"}, - {file = "yarl-1.15.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ac85e760543129a1912a82438fc8075223e35eaa2d457d61cd83c27d00d17be"}, - {file = "yarl-1.15.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e58c5d07b1f78dd4cb180c5b3b82465cd281aaeee8aafea0e5d72a4b97922cb1"}, - {file = "yarl-1.15.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9060589d0acad1fca048861fa9ee3e8ed060f67894fa885969648ab6e9e99a54"}, - {file = "yarl-1.15.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccd6774aa7bebdf9ca608bb0839318757a71b8e0d2cf7b10c002bc8790bd343e"}, - {file = "yarl-1.15.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7694f109867ee428c21b85ae19fd31d164c691eb45cc95c561cfdeba237a12e3"}, - {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:83e7154aa0d17f5c93d27ac01088fd9ab6673e7bab1acbd07cd7a865b980c045"}, - {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f16d1940c0cbc342f1d29d6212a006d172be616d2942c5c41966e8a3ce4c3be1"}, - {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7d5226c70af3ad9569ccc4ccc04ab65be79eeb22c87d7ae789c89e62ef76bbd6"}, - {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f25906e4a72d9833e81717c39a39dee7297ff5cb44957d06d177a2ab8ef2ef7f"}, - {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e07e4b17b648c880e8e42bf1ac0a730bde114961646ae1c2ec4433f0c11ca94"}, - {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f8136bde8dfa4477c6a85c79a366581b4a505b51a52b669318fb631d3f4f638"}, - {file = "yarl-1.15.4-cp312-cp312-win32.whl", hash = "sha256:ccbeaf5b18b173b9d78e332e017b30ba8bedcf03cdce1d13490b82a3f421bc98"}, - {file = "yarl-1.15.4-cp312-cp312-win_amd64.whl", hash = "sha256:f74f6ffdc633aefecbc80282242a5395058db9d1247fa7dd2f070ef84dc82583"}, - {file = "yarl-1.15.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4f66a0eda48844508736e47ed476d8fdd7cdbf16a4053b5d439509a25f708504"}, - {file = "yarl-1.15.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fd2bb86f40962d53a91def15a2f7684c62e081a7b96ec74ed0259c34b15973b9"}, - {file = "yarl-1.15.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f864b412557e69a6b953d62c01a0ed0ee342666298aa7f2a29af526bfa80f6e9"}, - {file = "yarl-1.15.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a79c0a8bbb046add85663af85e9993b691bf20c2a109518bd35e0ce77edfe42"}, - {file = "yarl-1.15.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de479e30abd2dfd49fdad3bd6953f2d930a45380be5143c0c9f7a1215cffc8cc"}, - {file = "yarl-1.15.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21fabe58042f3e567b4edc75b2cf44cea02f228e41ac09d73de126bf685fe883"}, - {file = "yarl-1.15.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77390496f2f32437a721c854897f889abefae0f3009daf90a2f703508d96c920"}, - {file = "yarl-1.15.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3896bf15284dd23acab1f2e7fceb350d8da6f6f2436b922f7ec6b3de685d34ca"}, - {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:590e2d733a82ecf004c5c531cbef0d6be328e93adec960024eb213f10cb9503e"}, - {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:1ceb677fb583971351627eac70eec6763fbc889761828da7a276681b5e39742d"}, - {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:69f628d2da1489b27959f4d63fdb326781fe484944dce94abbf919e416c54abe"}, - {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:35a6b69cc44bda002705d6138346bf0a0234cbb7c26c3bf192513eb946aee6f9"}, - {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:49f886e8dcf591275c6e20915b516fd81647857566b0c0158c52df1e468849c9"}, - {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:49190eb2ece70313742b0ea51520340288a059674da1f39eefb589d598d9453e"}, - {file = "yarl-1.15.4-cp313-cp313-win32.whl", hash = "sha256:48334a6c8afee93097eb17c0a094234dac2d88da076c8cf372e09e2a5dcc4b66"}, - {file = "yarl-1.15.4-cp313-cp313-win_amd64.whl", hash = "sha256:f68025d6ba1816428b7de615c80f61cb03d5b7061158d4ced7696657a64aa59c"}, - {file = "yarl-1.15.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8b569f4f511b59518ba6719feb5b8bf0a5d4115e6ac903c89e10a8a9ac656017"}, - {file = "yarl-1.15.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fe17744d60fc404ac61f824118e1e15ce3c2e92eced9b8e22f3c7847acafbf2"}, - {file = "yarl-1.15.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:115346433fad2084ee3a1a925ccc0659990aa42e208ca54c278830a150a3caf3"}, - {file = "yarl-1.15.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60165b8bc260f453321004b193770a66cc1b1a5c57c07d4b8dcc96839e7ad578"}, - {file = "yarl-1.15.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65a0168691373e08d869d48b62c8bed0af0cdaef19c76e11ad73b43901bbdb5a"}, - {file = "yarl-1.15.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:787532f00543a21b8f4ec3050b4e01b8fe437797903c0156a0b03dfca5e1ba6c"}, - {file = "yarl-1.15.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c9d173e5fa4b12d06ddca09a41cabbdeb660471dbe55432423eec095709ab"}, - {file = "yarl-1.15.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c96eaa30030e1cfafe533f3da8983812281235b7c50ef2a6c78ceca7aea1a0b"}, - {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4feab2dcb725eb5b4835207ecf3d370ff7ce930b253cba5e681646cb80d64c2c"}, - {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:de38b0b5b86e57efb129d179854e78b65cb8e294a8c75560877869c43aa2415a"}, - {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:65e0467f90f2acf3bc83bbfeedece8f1fd84df8add1a54e9600ed7b7b5debdb0"}, - {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:40c18f96696549e73b92dc12619f07019cbf5faefc1612608f967c144816e493"}, - {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:46491b3e058de7b484e1c9fb20aa8441f06d6c9a18395d711c1c2a9ad6707d6a"}, - {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:faa3dd7f4620ab5e5da7a0789d0aac78a9ad0376f102409d442ec5a4179e200a"}, - {file = "yarl-1.15.4-cp39-cp39-win32.whl", hash = "sha256:c33ea7c55a73be343f02361795caf52a187357ea07708fb1cae6661ee1d689c8"}, - {file = "yarl-1.15.4-cp39-cp39-win_amd64.whl", hash = "sha256:11b207061f28b4b6d980239b22ab0ecfadc47846b5a3b8e79f27fcc019d02cf9"}, - {file = "yarl-1.15.4-py3-none-any.whl", hash = "sha256:e5cc288111c450c0a54a74475591b206d3b1cb47dc71bb6200f6be8b1337184c"}, - {file = "yarl-1.15.4.tar.gz", hash = "sha256:a0c5e271058d148d730219ca4f33c5d841c6bd46e05b0da60fea7b516906ccd3"}, + {file = "yarl-1.15.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b6c57972a406ea0f61e3f28f2b3a780fb71fbe1d82d267afe5a2f889a83ee7e7"}, + {file = "yarl-1.15.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c3ac5bdcc1375c8ee52784adf94edbce37c471dd2100a117cfef56fe8dbc2b4"}, + {file = "yarl-1.15.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:68d21d0563d82aaf46163eac529adac301b20be3181b8a2811f7bd5615466055"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7d317fb80bc17ed4b34a9aad8b80cef34bea0993654f3e8566daf323def7ef9"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed9c72d5361cfd5af5ccadffa8f8077f4929640e1f938aa0f4b92c5a24996ac5"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bb707859218e8335447b210f41a755e7b1367c33e87add884128bba144694a7f"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6563394492c96cb57f4dff0c69c63d2b28b5469c59c66f35a1e6451583cd0ab4"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c2d1109c8d92059314cc34dd8f0a31f74b720dc140744923ed7ca228bf9b491"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8fc727f0fb388debc771eaa7091c092bd2e8b6b4741b73354b8efadcf96d6031"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:94189746c5ad62e1014a16298130e696fe593d031d442ef135fb7787b7a1f820"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b06d8b05d0fafef204d635a4711283ddbf19c7c0facdc61b4b775f6e47e2d4be"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:de6917946dc6bc237d4b354e38aa13a232e0c7948fdbdb160edee3862e9d735f"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:34816f1d833433a16c4832562a050b0a60eac53dcb71b2032e6ebff82d74b6a7"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:19e2a4b2935f95fad0949f420514c5d862f5f18058fbbfd8854f496a97d9fd87"}, + {file = "yarl-1.15.5-cp310-cp310-win32.whl", hash = "sha256:30ca64521f1a96b72886dd9e8652f16eab11891b4572dcfcfc1ad6d6ccb27abd"}, + {file = "yarl-1.15.5-cp310-cp310-win_amd64.whl", hash = "sha256:86648c53b10c53db8b967a75fb41e0c89dbec7398f6525e34af2b6c456bb0ac0"}, + {file = "yarl-1.15.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e652aa9f8dfa808bc5b2da4d1f4e286cf1d640570fdfa72ffc0c1d16ba114651"}, + {file = "yarl-1.15.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21050b6cd569980fe20ceeab4baeb900d3f7247270475e42bafe117416a5496c"}, + {file = "yarl-1.15.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:18940191ec9a83bbfe63eea61c3e9d12474bb910d5613bce8fa46e84a80b75b2"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a082dc948045606f62dca0228ab24f13737180b253378d6443f5b2b9ef8beefe"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a843e692f9d5402b3455653f4607dc521de2385f01c5cad7ba4a87c46e2ea8d"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5093a453176a4fad4f9c3006f507cf300546190bb3e27944275a37cfd6323a65"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2597a589859b94d0a5e2f5d30fee95081867926e57cb751f8b44a7dd92da4e79"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f5a1ca6eaabfe62718b87eac06d9a47b30cf92ffa065fee9196d3ecd24a3cf1"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4ac83b307cc4b8907345b52994055c6c3c2601ceb6fcb94c5ed6a93c6b4e8257"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:325e2beb2cd8654b276e7686a3cd203628dd3fe32d5c616e632bc35a2901fb16"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:75d04ba8ed335042328086e643e01165e0c24598216f72da709b375930ae3bdb"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7abd7d15aedb3961a967cc65f8144dbbca42e3626a21c5f4f29919cf43eeafb9"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:294c742a273f44511f14b03a9e06b66094dcdf4bbb75a5e23fead548fd5310ae"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:63d46606b20f80a6476f1044bab78e1a69c2e0747f174583e2f12fc70bad2170"}, + {file = "yarl-1.15.5-cp311-cp311-win32.whl", hash = "sha256:b1217102a455e3ac9ac293081093f21f0183e978c7692171ff669fee5296fa28"}, + {file = "yarl-1.15.5-cp311-cp311-win_amd64.whl", hash = "sha256:5848500b6a01497560969e8c3a7eb1b2570853c74a0ca6f67ebaf6064106c49b"}, + {file = "yarl-1.15.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d3309ee667f2d9c7ac9ecf44620d6b274bfdd8065b8c5019ff6795dd887b8fed"}, + {file = "yarl-1.15.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:96ce879799fee124d241ea3b84448378f638e290c49493d00b706f3fd57ec22b"}, + {file = "yarl-1.15.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c884dfa56b050f718ea3cbbfd972e29a6f07f63a7449b10d9a20d64f7eec92e2"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0327081978fe186c3390dd4f73f95f825d0bb9c74967e22c2a1a87735974d8f5"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:524b3bb7dff320e305bc979c65eddc0342548c56ea9241502f907853fe53c408"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd56de8b645421ff09c993fdb0ee9c5a3b50d290a8f55793b500d99b34d0c1ce"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c166ad987265bb343be58cdf4fbc4478cc1d81f2246d2be9a15f94393b269faa"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d56980374a10c74255fcea6ebcfb0aeca7166d212ee9fd7e823ddef35fb62ad0"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cbf36099a9b407e1456dbf55844743a98603fcba32d2a46fb3a698d926facf1b"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d7fa4b033e2f267e37aabcc36949fa89f9f1716a723395912147f9cf3fb437c7"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bb129f77ddaea2d8e6e00417b8d907448de3407af4eddacca0a515574ad71493"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:68e837b3edfcd037f9706157e7cb8efda832de6248c7d9e893e2638356dfae5d"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5b8af4165e097ff84d9bbb97bb4f4d7f71b9c1c9565a2d0e27d93e5f92dae220"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:70d074d5a96e0954fe6db81ff356f4361397da1cda3f7c127fc0902f671a087e"}, + {file = "yarl-1.15.5-cp312-cp312-win32.whl", hash = "sha256:362da97ad4360e4ef1dd24ccdd3bceb18332da7f40026a42f49b7edd686e31c3"}, + {file = "yarl-1.15.5-cp312-cp312-win_amd64.whl", hash = "sha256:9aa054d97033beac9cb9b19b7c0b8784b85b12cd17879087ca6bffba57884e02"}, + {file = "yarl-1.15.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5fadcf532fd9f6cbad71485ef8c2462dd9a91d3efc72ca01eb0970792c92552a"}, + {file = "yarl-1.15.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8b7dd6983c81523f9de0ae6334c3b7a3cb33283936e0525f80c4f713f54a9bb6"}, + {file = "yarl-1.15.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fcfd663dc88465ebe41c7c938bdc91c4b01cda96a0d64bf38fd66c1877323771"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd529e637cd23204bd82072f6637cff7af2516ad2c132e8f3342cbc84871f7d1"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b30f13fac56598474071a4f1ecd66c78fdaf2f8619042d7ca135f72dbb348cf"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44088ec0be82fba118ed29b6b429f80bf295297727adae4c257ac297e01e8bcd"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607683991bab8607e5158cd290dd8fdaa613442aeab802fe1c237d3a3eee7358"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da48cdff56b01ea4282a6d04b83b07a2088351a4a3ff7aacc1e7e9b6b04b90b9"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9162ea117ce8bad8ebc95b7376b4135988acd888d2cf4702f8281e3c11f8b81f"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:e8aa19c39cb20bfb16f0266df175a6004943122cf20707fbf0cacc21f6468a25"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5d6be369488d503c8edc14e2f63d71ab2a607041ad216a8ad444fa18e8dea792"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6e2c674cfe4c03ad7a4d536b1f808221f0d11a360486b4b032d2557c0bd633ad"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:041bafaa82b77fd4ec2826d42a55461ec86d999adf7ed9644eef7e8a9febb366"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2eeb9ba53c055740cd282ae9d34eb7970d65e73a46f15adec4b0c1b0f2e55cc2"}, + {file = "yarl-1.15.5-cp313-cp313-win32.whl", hash = "sha256:73143dd279e641543da52c55652ad7b4c7c5f79e797f124f58f04cc060f14271"}, + {file = "yarl-1.15.5-cp313-cp313-win_amd64.whl", hash = "sha256:94ab1185900f43760d5487c8e49f5f1a66f864e36092f282f1813597479b9dfa"}, + {file = "yarl-1.15.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6b3d2767bd64c62909ea33525b954ba05c8f9726bfdf2141d175da4e344f19ae"}, + {file = "yarl-1.15.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:44359c52af9c383e5107f3b6301446fc8269599721fa42fafb2afb5f31a42dcb"}, + {file = "yarl-1.15.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6493da9ba5c551978c679ab04856c2cf8f79c316e8ec8c503460a135705edc3b"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a6b6e95bc621c11cf9ff21012173337e789f2461ebc3b4e5bf65c74ef69adb8"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7983290ede3aaa2c9620879530849532529b4dcbf5b12a0b6a91163a773eadb9"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07a4b53abe85813c538b9cdbb02909ebe3734e3af466a587df516e960d500cc8"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5882faa2a6e684f65ee44f18c701768749a950cbd5e72db452fc07805f6bdec0"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e27861251d9c094f641d39a8a78dd2371fb9a252ea2f689d1ad353a31d46a0bc"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8669a110f655c9eb22f16fb68a7d4942020aeaa09f1def584a80183e3e89953c"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:10bfe0bef4cf5ea0383886beda004071faadedf2647048b9f876664284c5b60d"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f7de0d4b6b4d8a77e422eb54d765255c0ec6883ee03b8fd537101633948619d7"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:00bb3a559d7bd006a5302ecd7e409916939106a8cdbe31f4eb5e5b9ffcca57ea"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:06ec070a2d71415f90dbe9d70af3158e7da97a128519dba2d1581156ee27fb92"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b997a806846c00d1f41d6a251803732837771b2091bead7566f68820e317bfe7"}, + {file = "yarl-1.15.5-cp39-cp39-win32.whl", hash = "sha256:7825506fbee4055265528ec3532a8197ff26fc53d4978917a4c8ddbb4c1667d7"}, + {file = "yarl-1.15.5-cp39-cp39-win_amd64.whl", hash = "sha256:71730658be0b5de7c570a9795d7404c577b2313c1db370407092c66f70e04ccb"}, + {file = "yarl-1.15.5-py3-none-any.whl", hash = "sha256:625f31d6650829fba4030b4e7bdb2d69e41510dddfa29a1da27076c199521757"}, + {file = "yarl-1.15.5.tar.gz", hash = "sha256:8249147ee81c1cf4d1dc6f26ba28a1b9d92751529f83c308ad02164bb93abd0d"}, ] [package.dependencies] @@ -6105,4 +5998,4 @@ vertexai = ["google-cloud-aiplatform", "jsonref"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "379967b63bcaafa3a42f75d563b57114e7552a9d478e1372c747a9ce3475940c" +content-hash = "05158106183719ca2a786e0666b837bdafcb65765ff3c683e5c25122acaef5ac" diff --git a/pyproject.toml b/pyproject.toml index 06897d7b9..60cfa576e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "instructor" -version = "1.6.2" +version = "1.6.3" description = "structured outputs for llm" authors = ["Jason Liu "] license = "MIT" @@ -10,7 +10,7 @@ repository = "https://github.com/jxnl/instructor" [tool.poetry.dependencies] python = "^3.9" -openai = "^1.45.0" +openai = "^1.52.0" pydantic = "^2.8.0" docstring-parser = "^0.16" typer = ">=0.9.0,<1.0.0" @@ -29,7 +29,7 @@ pandas = { version = "^2.2.0", optional = true } tabulate = { version = "^0.9.0", optional = true } pydantic_extra_types = { version = "^2.6.0", optional = true } litellm = { version = "^1.35.31", optional = true } -anthropic = { version = "^0.34.0", optional = true } +anthropic = { version = "^0.36.2", optional = true } xmltodict = { version = "^0.13.0", optional = true } groq = { version = "^0.4.2", optional = true } cohere = { version = "^5.1.8", optional = true } @@ -86,7 +86,7 @@ mkdocs-minify-plugin = "^0.8.0" mkdocs-redirects = "^1.2.1" [tool.poetry.group.anthropic.dependencies] -anthropic = "^0.34.0" +anthropic = "^0.36.2" [tool.poetry.group.test-docs.dependencies] fastapi = "^0.109.2" @@ -96,7 +96,7 @@ pandas = "^2.2.0" tabulate = "^0.9.0" pydantic_extra_types = "^2.6.0" litellm = "^1.35.31" -anthropic = "^0.34.0" +anthropic = "^0.36.2" xmltodict = "^0.13.0" groq = "^0.4.2" phonenumbers = "^8.13.33" diff --git a/tests/llm/test_openai/test_multimodal.py b/tests/llm/test_openai/test_multimodal.py index 2790e62b9..62785c97c 100644 --- a/tests/llm/test_openai/test_multimodal.py +++ b/tests/llm/test_openai/test_multimodal.py @@ -1,9 +1,51 @@ import pytest -from instructor.multimodal import Image +from instructor.multimodal import Image, Audio import instructor from pydantic import Field, BaseModel from itertools import product from .util import models, modes +import requests +from pathlib import Path + + +audio_url = "https://www2.cs.uic.edu/~i101/SoundFiles/gettysburg.wav" + + +def gettysburg_audio(): + audio_file = Path("gettysburg.wav") + if not audio_file.exists(): + response = requests.get(audio_url) + response.raise_for_status() + with open(audio_file, "wb") as f: + f.write(response.content) + return audio_file + + +@pytest.mark.parametrize( + "audio_file", + [Audio.from_url(audio_url), Audio.from_path(gettysburg_audio())], +) +def test_multimodal_audio_description(audio_file, client): + client = instructor.from_openai(client) + + class AudioDescription(BaseModel): + source: str + + response = client.chat.completions.create( + model="gpt-4o-audio-preview", + response_model=AudioDescription, + modalities=["text"], + messages=[ + { + "role": "user", + "content": [ + "Where's this excerpt from?", + audio_file, + ], + }, + ], + audio={"voice": "alloy", "format": "wav"}, + ) class ImageDescription(BaseModel):