diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 5d3cdeb..2350203 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1 +1 @@
-* @GeorgeWilliamStrong @pinglin
+* @pinglin
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 45756ce..231d5a0 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -27,34 +27,34 @@ Before delving into the details to come up with your first PR, please familiaris
To confirm these system dependencies are configured correctly:
-```bash
-$ make doctor
+```shell
+make doctor
```
#### Installation
Fetch git submodules:
-```bash
-$ make get-proto
+```shell
+make get-proto
```
Fetch and generate json schema files and dataclass:
-```bash
-$ make update-specs
+```shell
+make update-specs
# `instill/resources/schema/airbyte/OAuth2.py` will be generated with an error, need to manually remove the `OAuth2.` in `OAuth2.AuthType.OAuth2_0`
```
> [!IMPORTANT]
-> **Create a `.venv` folder if you are rusing `conda`**
+> **Create a `.venv` folder if you are using `conda`**
> This will be fixed soon, but currently if you are installing the development dependencies inside a conda env,
-> you will need to create a `.venv` folder in your proejct root to prevent errors
+> you will need to create a `.venv` folder in your project root to prevent errors
Install project dependencies into a virtual environment:
-```text
-$ make install
+```shell
+make install
```
### Development Tasks
@@ -63,28 +63,28 @@ $ make install
Run the tests:
-```text
-$ make test
+```shell
+make test
```
Run static analysis:
-```text
-$ make check
+```shell
+make check
```
Build the documentation:
-```text
-$ make docs
+```shell
+make docs
```
#### Automatic
Keep all of the above tasks running on change:
-```text
-$ make dev
+```shell
+make dev
```
> In order to have OS X notifications, `brew install terminal-notifier`.
@@ -93,16 +93,16 @@ $ make dev
The CI server will report overall build status:
-```text
-$ make all
+```shell
+make all
```
### Release Tasks
Release to PyPI:
-```text
-$ make upload
+```shell
+make upload
```
### Sending PRs
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index b69e769..42ad083 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -7,7 +7,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- python-version: ["3.9", "3.10", "3.11"]
+ python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v4
@@ -19,7 +19,9 @@ jobs:
with:
python-version: ${{ matrix.python-version }}
- - uses: Gr1N/setup-poetry@v9
+ - uses: abatilo/actions-poetry@v4
+ with:
+ poetry-version: 1.8.4
- name: Check dependencies
run: make doctor
diff --git a/README.md b/README.md
index 4272f1e..e405cc2 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,12 @@
+# Instill Core Python SDK
+
[](https://github.com/instill-ai/python-sdk/actions) [](https://codecov.io/gh/instill-ai/python-sdk) [](https://pypi.org/project/instill-sdk) [](https://pypi.org/project/instill-sdk) [](https://pypistats.org/packages/instill-sdk)
-> [!IMPORTANT]
-> **This SDK tool is under active development**
-> For any bug found or featur request, feel free to open any issue regarding this SDK in our [instill-core](https://github.com/instill-ai/instill-core/issues) repo.
+> [!IMPORTANT]
+> **This SDK tool is under active development**
+> For any bug found or feature request, feel free to open any issue regarding this SDK in our [instill-core](https://github.com/instill-ai/instill-core/issues) repo.
-# Overview
+## Overview
Welcome to Instill Python SDK, where the world of AI-first application comes alive in the form of Python.
@@ -15,45 +17,46 @@ Before you jump into creating your first application with this SDK tool, we reco
## Setup
-> [!NOTE]
+> [!NOTE]
> For setting up development environment, please refer to [Contributing](#contributing)
### Requirements
-- Python 3.8 - 3.11
+- Python 3.8 - 3.12
+- CUDA 12.2 - 12.8 (if you want to build a model with GPU support)
### Installation
-> [!WARNING]
-> If your host machine is on arm64 architecture(including Apple silicon machines, equipped with m1/m2 processors), there are some issues when installing `grpcio` within `conda` environment. You will have to manually build and install it like below. Read more about this issue [here](https://github.com/grpc/grpc/issues/33714).
+> [!WARNING]
+> If your host machine is on arm64 architecture(including Apple silicon machines, equipped with m1/m2 processors), there are some issues when installing `grpcio` within `conda` environment. You will have to manually build and install it like below. Read more about this issue in the [gRPC GitHub issue](https://github.com/grpc/grpc/issues/33714).
-```bash
-$ GRPC_PYTHON_LDFLAGS=" -framework CoreFoundation" pip install grpcio --no-binary :all:
+```shell
+GRPC_PYTHON_LDFLAGS=" -framework CoreFoundation" pip install grpcio --no-binary :all:
```
Install it directly into an activated virtual environment:
-```text
-$ pip install instill-sdk
+```shell
+pip install instill-sdk
```
or add it to your [Poetry](https://poetry.eustace.io/) project:
-```text
-$ poetry add instill-sdk
+```shell
+poetry add instill-sdk
```
### Check import
After installation, you can check if it has been installed correctly:
-```text
-$ python
+```shell
+python
>>> import instill
>>> instill.__version__
```
-### Config `Instill Core` or `Instill Cloud` instance
+### Config `Instill Core` or `Managed Instill Core` instance
Before we can start using this SDK, you will need to properly config your target instance. We support two ways to setup the configs, which are
@@ -61,7 +64,7 @@ Before we can start using this SDK, you will need to properly config your target
create a config file under this path `${HOME}/.config/instill/sdk/python/config.yml`, and within that path you will need to fill in some basic parameters for your desired host.[^1]
-[^1]: You can obtain an `api_token` by simply going to Settings > API Tokens page from the console, no matter it is `Instill Core` or `Instill Cloud`.
+[^1]: You can obtain an `api_token` by simply going to Settings > API Tokens page from the console, no matter it is `Instill Core` or `Managed Instill Core`.
Within the config file, you can define multiple instances with the `alias` of your liking, later in the SDK you can refer to this `alias` to switch between instances.[^2]
@@ -143,9 +146,9 @@ user = client.mgmt_service.get_user()
# ...
```
-Please find more usages for this sdk at [here](https://www.instill-ai.dev/docs/sdk/python#usage)
+Please find more usages for this SDK in our [documentation](https://www.instill-ai.dev/docs/sdk/python#usage)
-**You can also find some notebook examples [here](https://github.com/instill-ai/python-sdk/tree/main/notebooks)**
+**You can also find some notebook examples in our [notebooks directory](https://github.com/instill-ai/python-sdk/tree/main/notebooks)**
### Create a model
@@ -168,7 +171,7 @@ client.model_service.create_model(
`Instill Model` is an advanced MLOps/LLMOps platform that was specifically crafted to facilitate the efficient management and orchestration of model deployments for unstructured data ETL. With `Instill Model`, you can easily create, manage, and deploy your own custom models with ease in `Instill Core` or on the cloud with `Instill Cloud`.
-Follow the instructions [here](https://www.instill-ai.dev/docs/model/create) to build and deploy your model.
+Follow the [model creation guide](https://www.instill-ai.dev/docs/model/create) to build and deploy your model.
### Create pipeline
diff --git a/instill/helpers/cli.py b/instill/helpers/cli.py
index b9d0a39..38b8b61 100644
--- a/instill/helpers/cli.py
+++ b/instill/helpers/cli.py
@@ -1,36 +1,10 @@
import argparse
-
-# import hashlib
-import os
import platform
-import shutil
-import subprocess
-import tempfile
-import uuid
-
-import ray
-import yaml
-
-import instill
-from instill.helpers.const import DEFAULT_DEPENDENCIES
-from instill.helpers.errors import ModelConfigException
-from instill.utils.logger import Logger
-
-bash_script = """
-until curl -s -o /dev/null -w "%{http_code}" http://localhost:8265 | grep -q "200"; do
- sleep 5
-done
-"""
-
-def config_check_required_fields(c):
- """Check if required fields are present in the model configuration."""
- if "build" not in c or c["build"] is None:
- raise ModelConfigException("build")
- if "gpu" not in c["build"] or c["build"]["gpu"] is None:
- raise ModelConfigException("gpu")
- if "python_version" not in c["build"] or c["build"]["python_version"] is None:
- raise ModelConfigException("python_version")
+from .commands.build import add_build_parser
+from .commands.init import add_init_parser
+from .commands.push import add_push_parser
+from .commands.run import add_run_parser
def cli():
@@ -39,510 +13,19 @@ def cli():
default_platform = "amd64"
else:
default_platform = platform.machine()
+
parser = argparse.ArgumentParser()
subcommands = parser.add_subparsers(required=True)
- # init
- init_parser = subcommands.add_parser("init", help="Initialize model directory")
- init_parser.set_defaults(func=init)
-
- # build
- build_parser = subcommands.add_parser("build", help="Build model image")
- build_parser.set_defaults(func=build)
- build_parser.add_argument(
- "name",
- help="user and model namespace, in the format of /[:tag] (default tag is 'latest')",
- )
- build_parser.add_argument(
- "-n",
- "--no-cache",
- help="build the image without cache",
- action="store_true",
- required=False,
- )
- build_parser.add_argument(
- "-a",
- "--target-arch",
- help="target platform architecture for the model image, default to host architecture",
- default=default_platform,
- choices=["arm64", "amd64"],
- required=False,
- )
- build_parser.add_argument(
- "-w",
- "--sdk-wheel",
- help="instill sdk wheel absolute path for debug purpose",
- default=None,
- required=False,
- )
- build_parser.add_argument(
- "-e",
- "--editable-project",
- help="path to local Python project to install in editable mode (overrides --sdk-wheel if both are specified)",
- default=None,
- required=False,
- )
-
- # push
- push_parser = subcommands.add_parser("push", help="Push model image")
- push_parser.set_defaults(func=push)
- push_parser.add_argument(
- "name",
- help="user and model namespace, in the format of /[:tag] (default tag is 'latest')",
- )
- push_parser.add_argument(
- "-u",
- "--url",
- help="image registry url, in the format of host:port, default to api.instill-ai.com",
- default="api.instill-ai.com",
- required=False,
- )
-
- # run
- run_parser = subcommands.add_parser("run", help="Run inference on model image")
- run_parser.set_defaults(func=run)
- run_parser.add_argument(
- "name",
- help="user and model namespace, in the format of /[:tag] (default tag is 'latest')",
- )
- run_parser.add_argument(
- "-g",
- "--gpu",
- help="whether the model needs gpu",
- action="store_true",
- required=False,
- )
- run_parser.add_argument(
- "-ng",
- "--num-of-gpus",
- help="number of gpus to use if gpu flag is on, default to 1",
- type=int,
- default=1,
- required=False,
- )
- run_parser.add_argument(
- "-i",
- "--input",
- help="inference input json",
- required=True,
- )
+ # Add command parsers
+ add_init_parser(subcommands)
+ add_build_parser(subcommands, default_platform)
+ add_push_parser(subcommands)
+ add_run_parser(subcommands)
args = parser.parse_args()
args.func(args)
-def init(_):
- """Initialize a new model directory with template files."""
- shutil.copyfile(
- __file__.replace("cli.py", "init-templates/instill.yaml"),
- f"{os.getcwd()}/instill.yaml",
- )
- shutil.copyfile(
- __file__.replace("cli.py", "init-templates/model.py"),
- f"{os.getcwd()}/model.py",
- )
-
-
-def find_project_root(start_path):
- """Find the Python project root by looking for setup.py or pyproject.toml"""
- current_path = os.path.abspath(start_path)
- while current_path != "/":
- if os.path.exists(os.path.join(current_path, "setup.py")) or os.path.exists(
- os.path.join(current_path, "pyproject.toml")
- ):
- return current_path
- current_path = os.path.dirname(current_path)
- return None
-
-
-def is_vllm_version_compatible(version_parts):
- """Check if vLLM version meets minimum requirements (v0.6.5)"""
- return not (
- version_parts[0] < 0
- or (version_parts[0] == 0 and version_parts[1] < 6)
- or (version_parts[0] == 0 and version_parts[1] == 6 and version_parts[2] < 5)
- )
-
-
-def prepare_build_environment(build_params):
- """Prepare environment variables and settings for the build process."""
- python_version = build_params["python_version"].replace(".", "")
- ray_version = ray.__version__
- instill_sdk_version = instill.__version__
-
- # Determine CUDA suffix
- if not build_params["gpu"]:
- cuda_suffix = ""
- elif "cuda_version" in build_params and not build_params["cuda_version"] is None:
- cuda_suffix = f'-cu{build_params["cuda_version"].replace(".", "")}'
- else:
- cuda_suffix = "-gpu"
-
- # Prepare system packages
- system_pkg_list = []
- if (
- "system_packages" in build_params
- and not build_params["system_packages"] is None
- ):
- system_pkg_list.extend(build_params["system_packages"])
- system_pkg_str = " ".join(system_pkg_list)
-
- # Prepare Python packages
- python_pkg_list = []
- if (
- "python_packages" in build_params
- and build_params["python_packages"] is not None
- ):
- python_pkg_list.extend(build_params["python_packages"])
- python_pkg_list.extend(DEFAULT_DEPENDENCIES)
-
- return (
- python_version,
- ray_version,
- instill_sdk_version,
- cuda_suffix,
- system_pkg_str,
- python_pkg_list,
- )
-
-
-def process_arm64_packages(python_pkg_list, target_arch):
- """Process packages for ARM64 architecture, handling vLLM and other dependencies."""
- dockerfile = "Dockerfile"
- vllm_version = None
-
- if target_arch == "arm64":
- filtered_pkg_list = []
- for pkg in python_pkg_list:
- if pkg.startswith("vllm"):
- # Transform version string from "0.6.4.post1" to "v0.6.4"
- version = pkg.split("==")[1]
- vllm_version = f"v{version.split('.post')[0]}"
- # Check if version is at least v0.6.5
- base_version = version.split(".post")[0]
- version_parts = [int(x) for x in base_version.split(".")]
- if not is_vllm_version_compatible(version_parts):
- raise ValueError(
- f"[Instill] vLLM version must be at least v0.6.5, got {vllm_version}"
- )
- elif pkg.startswith("bitsandbytes"):
- raise ValueError(
- "[Instill] bitsandbytes is not supported on ARM architecture"
- )
- else:
- filtered_pkg_list.append(pkg)
-
- python_pkg_list = filtered_pkg_list
- if vllm_version is not None and target_arch == "arm64":
- dockerfile = "Dockerfile.vllm"
-
- python_pkg_str = " ".join(python_pkg_list)
- target_arch_suffix = "-aarch64" if target_arch == "arm64" else ""
-
- return dockerfile, vllm_version, python_pkg_str, target_arch_suffix, python_pkg_list
-
-
-def parse_image_name(name):
- """Parse image name to extract name and tag."""
- if ":" in name:
- image, tag = name.split(":", 1)
- return image, tag
- return name, "latest"
-
-
-def prepare_build_command(args, tmpdir, dockerfile, build_vars):
- """Prepare the Docker build command with all necessary arguments."""
- vllm_version, target_arch_suffix, ray_version, python_version = build_vars[:4]
- cuda_suffix, python_pkg_str, system_pkg_str, instill_sdk_version = build_vars[4:8]
- instill_python_sdk_project_name = build_vars[8]
-
- image_name, tag = parse_image_name(args.name)
-
- command = [
- "docker",
- "buildx",
- "build",
- "--progress=plain",
- "--file",
- f"{tmpdir}/{dockerfile}",
- "--build-arg",
- f"TARGET_ARCH_SUFFIX={target_arch_suffix}",
- "--build-arg",
- f"RAY_VERSION={ray_version}",
- "--build-arg",
- f"PYTHON_VERSION={python_version}",
- "--build-arg",
- f"PYTHON_PACKAGES={python_pkg_str}",
- "--build-arg",
- f"INSTILL_PYTHON_SDK_VERSION={instill_sdk_version}",
- "--platform",
- f"linux/{args.target_arch}",
- "-t",
- f"{image_name}:{tag}",
- tmpdir,
- "--load",
- ]
-
- # Add conditional build args
- if args.no_cache:
- command.append("--no-cache")
-
- if vllm_version:
- command.extend(["--build-arg", f"VLLM_VERSION={vllm_version}"])
-
- if cuda_suffix:
- command.extend(["--build-arg", f"CUDA_SUFFIX={cuda_suffix}"])
-
- if system_pkg_str:
- command.extend(["--build-arg", f"SYSTEM_PACKAGES={system_pkg_str}"])
-
- command.extend(
- [
- # editable mode
- "--build-arg",
- f"INSTILL_PYTHON_SDK_PROJECT_NAME={instill_python_sdk_project_name}",
- "--build-arg",
- (
- "PYTHONPATH_USER_DEFINED_PROTO=/home/ray/"
- f"{instill_python_sdk_project_name}/instill/protogen/model/ray/v1alpha"
- ),
- ]
- if instill_python_sdk_project_name
- else [
- "--build-arg",
- (
- "PYTHONPATH_USER_DEFINED_PROTO=/home/ray/"
- "anaconda3/lib/python3.11/site-packages/instill/protogen/model/ray/v1alpha"
- ),
- ]
- )
-
- return command
-
-
-def build(args):
- """Build a Docker image for the model with specified configuration."""
- try:
- Logger.i("[Instill] Loading config file...")
- with open("instill.yaml", "r", encoding="utf8") as f:
- Logger.i("[Instill] Parsing config file...")
- config = yaml.safe_load(f)
-
- config_check_required_fields(config)
- build_params = config["build"]
-
- # Prepare build environment
- (
- python_version,
- ray_version,
- instill_sdk_version,
- cuda_suffix,
- system_pkg_str,
- python_pkg_list,
- ) = prepare_build_environment(build_params)
-
- # Process ARM64-specific packages
- (
- dockerfile,
- vllm_version,
- python_pkg_str,
- target_arch_suffix,
- python_pkg_list,
- ) = process_arm64_packages(python_pkg_list, args.target_arch)
-
- with tempfile.TemporaryDirectory() as tmpdir:
-
- # Copy files to tmpdir
- docker_dir = __file__.replace("cli.py", "docker")
- shutil.copyfile(f"{docker_dir}/{dockerfile}", f"{tmpdir}/Dockerfile")
- shutil.copyfile(f"{docker_dir}/.dockerignore", f"{tmpdir}/.dockerignore")
- shutil.copytree(
- os.getcwd(),
- tmpdir,
- ignore=shutil.ignore_patterns("model.py"),
- dirs_exist_ok=True,
- )
- shutil.copyfile(f"{os.getcwd()}/model.py", f"{tmpdir}/_model.py")
-
- # Handle SDK wheel if provided
- if args.sdk_wheel is not None:
- shutil.copyfile(
- args.sdk_wheel,
- f"{tmpdir}/instill_sdk-{instill_sdk_version}dev-py3-none-any.whl",
- )
-
- # Handle editable project installation
- instill_sdk_project_name = None
- if args.editable_project:
- project_root = find_project_root(args.editable_project)
- if project_root is None:
- raise FileNotFoundError(
- "[Instill] No Python project found at the specified path (missing setup.py or pyproject.toml)"
- )
- instill_sdk_project_name = os.path.basename(project_root)
- Logger.i(f"[Instill] Found Python project: {instill_sdk_project_name}")
- shutil.copytree(
- project_root,
- f"{tmpdir}/{instill_sdk_project_name}",
- dirs_exist_ok=True,
- )
-
- Logger.i("[Instill] Building model image...")
- build_vars = [
- vllm_version,
- target_arch_suffix,
- ray_version,
- python_version,
- cuda_suffix,
- python_pkg_str,
- system_pkg_str,
- instill_sdk_version,
- instill_sdk_project_name,
- ]
- command = prepare_build_command(args, tmpdir, dockerfile, build_vars)
-
- subprocess.run(command, check=True)
- image_name, tag = parse_image_name(args.name)
- Logger.i(f"[Instill] {image_name}:{tag} built")
- except subprocess.CalledProcessError:
- Logger.e("[Instill] Build failed")
- except (ValueError, FileNotFoundError, OSError, IOError) as e:
- Logger.e("[Instill] Prepare failed")
- Logger.e(e)
- finally:
- Logger.i("[Instill] Done")
-
-
-def push(args):
- """Push a built model image to a Docker registry."""
- registry = args.url
- image_name, tag = parse_image_name(args.name)
- tagged_image = f"{registry}/{image_name}:{tag}"
- try:
- # Tag the image
- subprocess.run(
- [
- "docker",
- "tag",
- f"{image_name}:{tag}",
- tagged_image,
- ],
- check=True,
- )
- Logger.i("[Instill] Pushing model image...")
- # Push the image
- subprocess.run(["docker", "push", tagged_image], check=True)
- Logger.i(f"[Instill] {tagged_image} pushed")
- except subprocess.CalledProcessError:
- Logger.e("[Instill] Push failed")
- except (ConnectionError, OSError, IOError) as e:
- Logger.e("[Instill] Prepare failed")
- Logger.e(e)
- finally:
- # Remove the tagged image regardless of success/failure
- try:
- subprocess.run(
- ["docker", "rmi", tagged_image],
- check=True,
- )
- except subprocess.CalledProcessError:
- Logger.e(f"[Instill] Failed to remove tagged image {tagged_image}")
- Logger.i("[Instill] Done")
-
-
-def run(args):
- """Run inference on a model image."""
- docker_run = False
- try:
- name = uuid.uuid4()
- image_name, tag = parse_image_name(args.name)
- Logger.i("[Instill] Starting model image...")
- if not args.gpu:
- subprocess.run(
- [
- "docker",
- "run",
- "--rm",
- "-d",
- "--shm-size=4gb",
- "--name",
- str(name),
- f"{image_name}:{tag}",
- "serve",
- "run",
- "_model:entrypoint",
- ],
- check=True,
- stdout=subprocess.DEVNULL,
- )
- else:
- subprocess.run(
- f"docker run \
- --rm -d --shm-size=4gb --name {str(name)} --gpus all \
- {image_name}:{tag} /bin/bash -c \
- \"serve build _model:entrypoint -o serve.yaml && \
- sed -i 's/app1/default/' serve.yaml && \
- sed -i 's/num_cpus: 0.0/num_gpus: {args.num_of_gpus}/' serve.yaml && \
- serve run serve.yaml\"",
- shell=True,
- check=True,
- stdout=subprocess.DEVNULL,
- )
- docker_run = True
- subprocess.run(
- f"docker exec {str(name)} /bin/bash -c '{bash_script}'",
- shell=True,
- check=True,
- stdout=subprocess.DEVNULL,
- timeout=300,
- )
-
- Logger.i("[Instill] Deploying model...")
- subprocess.run(
- [
- "docker",
- "exec",
- str(name),
- "/bin/bash",
- "-c",
- "until serve status --name default | grep 'RUNNING: 1' > /dev/null; do sleep 1; done;",
- ],
- check=True,
- )
- Logger.i("[Instill] Running inference...")
- subprocess.run(
- [
- "docker",
- "exec",
- str(name),
- "python",
- "-m",
- "instill.helpers.test",
- "-i",
- args.input,
- ],
- check=True,
- )
- except subprocess.CalledProcessError:
- Logger.e("[Instill] Run failed")
- except subprocess.TimeoutExpired:
- Logger.e("[Instill] Deployment timeout")
- except (RuntimeError, OSError, IOError) as e:
- Logger.e("[Instill] Prepare failed")
- Logger.e(e)
- finally:
- if docker_run:
- subprocess.run(
- [
- "docker",
- "stop",
- str(name),
- ],
- check=True,
- stdout=subprocess.DEVNULL,
- )
- Logger.i("[Instill] Done")
-
-
if __name__ == "__main__":
cli()
diff --git a/instill/helpers/commands/__init__.py b/instill/helpers/commands/__init__.py
new file mode 100644
index 0000000..ac4244f
--- /dev/null
+++ b/instill/helpers/commands/__init__.py
@@ -0,0 +1 @@
+"""Command modules for the Instill CLI."""
diff --git a/instill/helpers/commands/build.py b/instill/helpers/commands/build.py
new file mode 100644
index 0000000..e561fc1
--- /dev/null
+++ b/instill/helpers/commands/build.py
@@ -0,0 +1,169 @@
+"""Build command for the Instill CLI."""
+
+import os
+import shutil
+import subprocess
+import tempfile
+
+import yaml
+
+from instill.utils.logger import Logger
+
+from .utils import (
+ config_check_required_fields,
+ find_project_root,
+ parse_image_tag_name,
+ parse_target_arch,
+ prepare_build_command,
+ prepare_build_environment,
+)
+
+
+def add_build_parser(subcommands, default_platform):
+ """Add build command parser to subcommands."""
+ build_parser = subcommands.add_parser("build", help="Build model image")
+ build_parser.set_defaults(func=build)
+ build_parser.add_argument(
+ "name",
+ help="""
+ Image name and tag for the model with the format /[:tag]
+ (default tag is 'latest')
+ """,
+ )
+ build_parser.add_argument(
+ "-n",
+ "--no-cache",
+ help="Build the image without cache",
+ default=False,
+ action="store_true",
+ required=False,
+ )
+ build_parser.add_argument(
+ "-a",
+ "--target-arch",
+ help="Target platform architecture for the model image. If not specified, default to host architecture",
+ default=default_platform,
+ choices=["arm64", "amd64"],
+ required=False,
+ )
+ build_parser.add_argument(
+ "-w",
+ "--sdk-wheel",
+ help="The python-sdk wheel absolute path",
+ default=None,
+ required=False,
+ )
+ build_parser.add_argument(
+ "-e",
+ "--editable-project",
+ help="""
+ The python-sdk project path to install in editable mode
+ (overrides --sdk-wheel if both are specified)
+ """,
+ default=None,
+ required=False,
+ )
+
+
+def build(args):
+ """Build a Docker image for the model with specified configuration."""
+ try:
+ Logger.i("[Instill] Loading config file...")
+ with open("instill.yaml", "r", encoding="utf8") as f:
+ Logger.i("[Instill] Parsing config file...")
+ config = yaml.safe_load(f)
+
+ config_check_required_fields(config)
+ build_params = config["build"]
+
+ if build_params.get("gpu") and args.target_arch == "arm64":
+ raise ValueError("GPU is not supported on ARM64 architecture")
+
+ # Prepare build environment
+ (
+ llm_runtime,
+ ray_version,
+ python_version,
+ cuda_version,
+ device_type,
+ system_pkg_str,
+ python_pkg_str,
+ instill_sdk_version,
+ ) = prepare_build_environment(build_params)
+
+ if llm_runtime is not None:
+ if "mlc-llm" in llm_runtime:
+ dockerfile = "Dockerfile.mlc-llm"
+ elif "vllm" in llm_runtime:
+ dockerfile = "Dockerfile.vllm"
+ elif "transformers" in llm_runtime:
+ dockerfile = "Dockerfile.transformers"
+ else:
+ dockerfile = "Dockerfile"
+
+ with tempfile.TemporaryDirectory() as tmpdir:
+ # Copy files to tmpdir
+ docker_dir = __file__.replace("commands/build.py", "docker")
+ shutil.copyfile(f"{docker_dir}/{dockerfile}", f"{tmpdir}/{dockerfile}")
+ shutil.copyfile(f"{docker_dir}/.dockerignore", f"{tmpdir}/.dockerignore")
+ shutil.copytree(
+ os.getcwd(),
+ tmpdir,
+ ignore=shutil.ignore_patterns("model.py"),
+ dirs_exist_ok=True,
+ )
+ shutil.copyfile(f"{os.getcwd()}/model.py", f"{tmpdir}/_model.py")
+
+ # Handle SDK wheel if provided
+ if args.sdk_wheel is not None:
+ shutil.copyfile(
+ args.sdk_wheel,
+ f"{tmpdir}/instill_sdk-{instill_sdk_version}dev-py3-none-any.whl",
+ )
+
+ # Handle editable project installation
+ instill_sdk_project_name = None
+ if args.editable_project:
+ project_root = find_project_root(args.editable_project)
+ if project_root is None:
+ raise FileNotFoundError(
+ """
+ [Instill] No Python project found at the specified path (missing setup.py or pyproject.toml)
+ """
+ )
+ instill_sdk_project_name = os.path.basename(project_root)
+ Logger.i(f"[Instill] Found Python project: {instill_sdk_project_name}")
+ shutil.copytree(
+ project_root,
+ f"{tmpdir}/{instill_sdk_project_name}",
+ dirs_exist_ok=True,
+ )
+
+ Logger.i("[Instill] Building model image...")
+ image_name_tag = parse_image_tag_name(args.name)
+ target_arch = parse_target_arch(args.target_arch)
+ build_vars = [
+ image_name_tag,
+ target_arch,
+ args.no_cache,
+ llm_runtime,
+ ray_version,
+ python_version,
+ cuda_version,
+ device_type,
+ python_pkg_str,
+ system_pkg_str,
+ instill_sdk_version,
+ instill_sdk_project_name,
+ ]
+ command = prepare_build_command(tmpdir, dockerfile, build_vars)
+
+ subprocess.run(command, check=True)
+ Logger.i(f"[Instill] {image_name_tag} built")
+ except subprocess.CalledProcessError:
+ Logger.e("[Instill] Build failed")
+ except (ValueError, FileNotFoundError, OSError, IOError) as e:
+ Logger.e("[Instill] Prepare failed")
+ Logger.e(str(e))
+ finally:
+ Logger.i("[Instill] Done")
diff --git a/instill/helpers/commands/init.py b/instill/helpers/commands/init.py
new file mode 100644
index 0000000..749c294
--- /dev/null
+++ b/instill/helpers/commands/init.py
@@ -0,0 +1,29 @@
+"""Initialize command for the Instill CLI."""
+
+import os
+import shutil
+
+from instill.utils.logger import Logger
+
+
+def add_init_parser(subcommands):
+ """Add init command parser to subcommands."""
+ init_parser = subcommands.add_parser("init", help="Initialize model directory")
+ init_parser.set_defaults(func=init)
+
+
+def init(_):
+ """Initialize a new model directory with template files."""
+ try:
+ shutil.copyfile(
+ __file__.replace("commands/init.py", "init-templates/instill.yaml"),
+ f"{os.getcwd()}/instill.yaml",
+ )
+ shutil.copyfile(
+ __file__.replace("commands/init.py", "init-templates/model.py"),
+ f"{os.getcwd()}/model.py",
+ )
+ Logger.i("[Instill] Model directory initialized successfully")
+ except (OSError, IOError) as e:
+ Logger.e("[Instill] Failed to initialize model directory")
+ Logger.e(e)
diff --git a/instill/helpers/commands/push.py b/instill/helpers/commands/push.py
new file mode 100644
index 0000000..3118ad7
--- /dev/null
+++ b/instill/helpers/commands/push.py
@@ -0,0 +1,64 @@
+"""Push command for the Instill CLI."""
+
+import subprocess
+
+from instill.utils.logger import Logger
+
+from .utils import parse_image_tag_name
+
+
+def add_push_parser(subcommands):
+ """Add push command parser to subcommands."""
+ push_parser = subcommands.add_parser("push", help="Push model image")
+ push_parser.set_defaults(func=push)
+ push_parser.add_argument(
+ "name",
+ help="""
+ Image name and tag for the model with the format /[:tag]
+ (default tag is 'latest')
+ """,
+ )
+ push_parser.add_argument(
+ "-u",
+ "--url",
+ help="Image registry URL in the format of host:port. If not specified, default to api.instill-ai.com",
+ default="api.instill-ai.com",
+ required=False,
+ )
+
+
+def push(args):
+ """Push a built model image to a Docker registry."""
+ registry = args.url
+ image_name_tag = parse_image_tag_name(args.name)
+ tagged_image = f"{registry}/{image_name_tag}"
+ try:
+ # Tag the image
+ subprocess.run(
+ [
+ "docker",
+ "tag",
+ f"{image_name_tag}",
+ tagged_image,
+ ],
+ check=True,
+ )
+ Logger.i("[Instill] Pushing model image...")
+ # Push the image
+ subprocess.run(["docker", "push", tagged_image], check=True)
+ Logger.i(f"[Instill] {tagged_image} pushed")
+ except subprocess.CalledProcessError:
+ Logger.e("[Instill] Push failed")
+ except (ConnectionError, OSError, IOError) as e:
+ Logger.e("[Instill] Prepare failed")
+ Logger.e(e)
+ finally:
+ # Remove the tagged image regardless of success/failure
+ try:
+ subprocess.run(
+ ["docker", "rmi", tagged_image],
+ check=True,
+ )
+ except subprocess.CalledProcessError:
+ Logger.e(f"[Instill] Failed to remove tagged image {tagged_image}")
+ Logger.i("[Instill] Done")
diff --git a/instill/helpers/commands/run.py b/instill/helpers/commands/run.py
new file mode 100644
index 0000000..6d270e5
--- /dev/null
+++ b/instill/helpers/commands/run.py
@@ -0,0 +1,169 @@
+"""Run command for the Instill CLI."""
+
+import subprocess
+import uuid
+
+from instill.utils.logger import Logger
+
+from .utils import BASH_SCRIPT, parse_image_tag_name
+
+
+def add_run_parser(subcommands):
+ """Add run command parser to subcommands."""
+ run_parser = subcommands.add_parser("run", help="Run inference on model image")
+ run_parser.set_defaults(func=run)
+ run_parser.add_argument(
+ "name",
+ help="""
+ Image name and tag for the model with the format /[:tag]
+ (default tag is 'latest')
+ """,
+ )
+ run_parser.add_argument(
+ "-nc",
+ "--num-of-cpus",
+ help="Number of CPUs to use if --gpu flag is off, default to 1",
+ type=int,
+ default=1,
+ required=False,
+ )
+ run_parser.add_argument(
+ "-cs",
+ "--cpu-kvcache-space",
+ help="CPU KV-Cache space in GB. If not specified, default to 4GB",
+ type=int,
+ default=4,
+ required=False,
+ )
+ run_parser.add_argument(
+ "-g",
+ "--gpu",
+ help="Whether the model runs on GPUs",
+ action="store_true",
+ required=False,
+ )
+ run_parser.add_argument(
+ "-ng",
+ "--num-of-gpus",
+ help="Number of GPUs to use if --gpu flag is on, default to 1",
+ type=int,
+ default=1,
+ required=False,
+ )
+ run_parser.add_argument(
+ "-i",
+ "--input",
+ help="Inference input as a string in JSON format",
+ type=str,
+ required=True,
+ )
+
+
+def run(args):
+ """Run inference on a model image."""
+ docker_run = False
+ try:
+ name = uuid.uuid4()
+ image_name_tag = parse_image_tag_name(args.name)
+ Logger.i("[Instill] Starting model image...")
+ if not args.gpu:
+ subprocess.run(
+ [
+ "docker",
+ "run",
+ "-d",
+ "--privileged",
+ "--shm-size=4gb",
+ "--rm",
+ "-e",
+ f"VLLM_CPU_OMP_THREADS_BIND=0-{args.num_of_cpus}",
+ "-e",
+ f"VLLM_CPU_KVCACHE_SPACE={args.cpu_kvcache_space}",
+ "--name",
+ str(name),
+ image_name_tag,
+ "serve",
+ "run",
+ "_model:entrypoint",
+ ],
+ check=True,
+ stdout=subprocess.DEVNULL,
+ )
+ else:
+ subprocess.run(
+ [
+ "docker",
+ "run",
+ "-d",
+ "--privileged",
+ "--shm-size=4gb",
+ "--rm",
+ "--name",
+ str(name),
+ "--device",
+ f"nvidia.com/gpu:{args.num_of_gpus}",
+ f"{image_name_tag}",
+ "/bin/bash",
+ "-c",
+ "serve build _model:entrypoint -o serve.yaml && "
+ f"sed -i 's/app1/default/' serve.yaml && "
+ f"sed -i 's/num_cpus: 0.0/num_gpus: {args.num_of_gpus}/' serve.yaml && "
+ "serve run serve.yaml",
+ ],
+ check=True,
+ stdout=subprocess.DEVNULL,
+ )
+ docker_run = True
+ subprocess.run(
+ f"docker exec {str(name)} /bin/bash -c '{BASH_SCRIPT}'",
+ shell=True,
+ check=True,
+ stdout=subprocess.DEVNULL,
+ timeout=300,
+ )
+
+ Logger.i("[Instill] Deploying model...")
+ subprocess.run(
+ [
+ "docker",
+ "exec",
+ str(name),
+ "/bin/bash",
+ "-c",
+ "until serve status --name default | grep 'RUNNING: 1' > /dev/null; do sleep 1; done;",
+ ],
+ check=True,
+ )
+ Logger.i("[Instill] Running inference...")
+ subprocess.run(
+ [
+ "docker",
+ "exec",
+ str(name),
+ "python",
+ "-m",
+ "instill.helpers.test",
+ "-i",
+ args.input,
+ ],
+ check=True,
+ )
+ except subprocess.CalledProcessError:
+ Logger.e("[Instill] Run failed")
+ except subprocess.TimeoutExpired:
+ Logger.e("[Instill] Deployment timeout")
+ except (RuntimeError, OSError, IOError) as e:
+ Logger.e("[Instill] Prepare failed")
+ Logger.e(e)
+ finally:
+ if docker_run:
+ subprocess.run(
+ [
+ "docker",
+ "stop",
+ str(name),
+ ],
+ check=True,
+ stdout=subprocess.DEVNULL,
+ )
+ Logger.i("[Instill] Done")
diff --git a/instill/helpers/commands/utils.py b/instill/helpers/commands/utils.py
new file mode 100644
index 0000000..3789cf4
--- /dev/null
+++ b/instill/helpers/commands/utils.py
@@ -0,0 +1,293 @@
+"""Shared utilities for CLI commands."""
+
+import os
+
+import ray
+
+import instill
+from instill.helpers.const import (
+ CUDA_VERSION_MAX,
+ CUDA_VERSION_MIN,
+ MLC_LLM_VERSION,
+ PYTHON_VERSION_MAX,
+ PYTHON_VERSION_MIN,
+ TRANSFORMERS_VERSION,
+ VLLM_VERSION,
+)
+from instill.helpers.errors import ModelConfigException
+
+BASH_SCRIPT = """
+until curl -s -o /dev/null -w "%{http_code}" http://localhost:8265 | grep -q "200"; do
+ sleep 5
+done
+"""
+
+
+def config_check_required_fields(c):
+ """Check if required fields are present in the model configuration."""
+ if "build" not in c or c["build"] is None:
+ raise ModelConfigException("build")
+ if "gpu" not in c["build"] or c["build"]["gpu"] is None:
+ raise ModelConfigException("gpu")
+
+
+def find_project_root(start_path):
+ """Find the Python project root by looking for setup.py or pyproject.toml"""
+ current_path = os.path.abspath(start_path)
+ while current_path != "/":
+ if os.path.exists(os.path.join(current_path, "setup.py")) or os.path.exists(
+ os.path.join(current_path, "pyproject.toml")
+ ):
+ return current_path
+ current_path = os.path.dirname(current_path)
+ return None
+
+
+def validate_python_version(python_version: str) -> str:
+ """Validate Python version and return cleaned version string."""
+ # Set default Python version if not provided
+ if not python_version:
+ python_version = "3.11"
+
+ # Validate Python version format first
+ try:
+ version_parts = [int(x) for x in python_version.split(".")]
+ if len(version_parts) < 2:
+ raise ValueError(
+ f"Invalid Python version format: {python_version}. Must be in format X.Y (e.g., 3.11)"
+ )
+ except (ValueError, IndexError) as exc:
+ raise ValueError(
+ f"Invalid Python version format: {python_version}. Must be in format X.Y (e.g., 3.11)"
+ ) from exc
+
+ # Then validate version range
+ major, minor = version_parts[0], version_parts[1]
+
+ # Parse min and max versions
+ min_major, min_minor = map(int, PYTHON_VERSION_MIN.split("."))
+ max_major, max_minor = map(int, PYTHON_VERSION_MAX.split("."))
+
+ # Compare major version first, then minor version
+ if major < min_major or (major == min_major and minor < min_minor):
+ raise ValueError(
+ f"Python version {python_version} is too old. Must be at least {PYTHON_VERSION_MIN}"
+ )
+
+ if major > max_major or (major == max_major and minor > max_minor):
+ raise ValueError(
+ f"Python version {python_version} is too new. Must be at most {PYTHON_VERSION_MAX}"
+ )
+
+ return python_version.replace(".", "")
+
+
+def validate_cuda_version(cuda_version: str) -> str:
+ """Validate CUDA version and return cleaned version string."""
+ # Set default CUDA version if not provided
+ if not cuda_version:
+ cuda_version = "12.8"
+
+ # Validate CUDA version format first
+ try:
+ version_parts = [int(x) for x in cuda_version.split(".")]
+ if len(version_parts) < 2:
+ raise ValueError(
+ f"Invalid CUDA version format: {cuda_version}. Must be in format X.Y (e.g., 12.8)"
+ )
+ except (ValueError, IndexError) as exc:
+ raise ValueError(
+ f"Invalid CUDA version format: {cuda_version}. Must be in format X.Y (e.g., 12.8)"
+ ) from exc
+
+ # Then validate version range
+ major, minor = version_parts[0], version_parts[1]
+
+ # Parse min and max versions
+ min_major, min_minor = map(int, CUDA_VERSION_MIN.split("."))
+ max_major, max_minor = map(int, CUDA_VERSION_MAX.split("."))
+
+ # Compare major version first, then minor version
+ if major < min_major or (major == min_major and minor < min_minor):
+ raise ValueError(
+ f"CUDA version {cuda_version} is too old. Must be at least {CUDA_VERSION_MIN}"
+ )
+
+ if major > max_major or (major == max_major and minor > max_minor):
+ raise ValueError(
+ f"CUDA version {cuda_version} is too new. Must be at most {CUDA_VERSION_MAX}"
+ )
+
+ return cuda_version.replace(".", "")
+
+
+def prepare_build_environment(build_params):
+ """Prepare environment variables and settings for the build process."""
+
+ # Prepare Ray version
+ ray_version = ray.__version__
+
+ # Prepare Python version
+ python_version = f"-py{validate_python_version(build_params.get('python_version'))}"
+
+ # Prepare CUDA version and device type
+ if not build_params["gpu"]:
+ cuda_version = ""
+ device_type = "-cpu"
+ elif build_params.get("cuda_version") is not None:
+ cuda_version = f'-cu{validate_cuda_version(build_params["cuda_version"])}'
+ device_type = "-gpu"
+ else:
+ cuda_version = "-cu128" # Default to 12.8
+ device_type = "-gpu"
+
+ llm_runtime = build_params.get("llm_runtime")
+
+ # Prepare system packages
+ system_pkg_list = []
+ if (
+ "system_packages" in build_params
+ and not build_params["system_packages"] is None
+ ):
+ system_pkg_list.extend(build_params["system_packages"])
+ system_pkg_str = " ".join(system_pkg_list)
+
+ # Prepare Python packages
+ python_pkg_list = []
+ if (
+ "python_packages" in build_params
+ and build_params["python_packages"] is not None
+ ):
+ python_pkg_list.extend(build_params["python_packages"])
+ python_pkg_str = " ".join(python_pkg_list)
+
+ # Prepare Instill SDK version
+ instill_sdk_version = instill.__version__
+
+ return (
+ llm_runtime,
+ ray_version,
+ python_version,
+ cuda_version,
+ device_type,
+ system_pkg_str,
+ python_pkg_str,
+ instill_sdk_version,
+ )
+
+
+def parse_image_tag_name(image_tag_name: str):
+ """Parse image name to extract name and tag."""
+ if ":" in image_tag_name:
+ return image_tag_name
+ return f"{image_tag_name}:latest"
+
+
+def parse_target_arch(target_arch: str):
+ """Parse target architecture."""
+ if target_arch not in ["amd64", "arm64"]:
+ raise ValueError(
+ f"Invalid target architecture: {target_arch}. Must be 'amd64' or 'arm64'"
+ )
+
+ if target_arch == "arm64":
+ return "aarch64"
+ return "amd64"
+
+
+def prepare_build_command(tmpdir, dockerfile, build_vars):
+ """Prepare the Docker build command with all necessary arguments."""
+ (
+ image_name_tag,
+ target_arch,
+ no_cache,
+ llm_runtime,
+ ray_version,
+ python_version,
+ cuda_version,
+ device_type,
+ python_pkg_str,
+ system_pkg_str,
+ instill_sdk_version,
+ instill_python_sdk_project_name,
+ ) = build_vars
+
+ command = [
+ "docker",
+ "buildx",
+ "build",
+ "--progress=plain",
+ "--file",
+ f"{tmpdir}/{dockerfile}",
+ "--build-arg",
+ f"RAY_VERSION={ray_version}",
+ "--build-arg",
+ f"PYTHON_VERSION={python_version}",
+ "--build-arg",
+ f"CUDA_VERSION={cuda_version}",
+ "--build-arg",
+ f"DEVICE_TYPE={device_type}",
+ "--build-arg",
+ f"PYTHON_PACKAGES={python_pkg_str}",
+ "--build-arg",
+ f"INSTILL_PYTHON_SDK_VERSION={instill_sdk_version}",
+ "--platform",
+ f"linux/{target_arch}",
+ "-t",
+ f"{image_name_tag}",
+ tmpdir,
+ "--load",
+ ]
+
+ # Add conditional build args
+ if no_cache:
+ command.append("--no-cache")
+
+ # Extract LLM runtime version
+ if llm_runtime is not None:
+ if "mlc-llm" in llm_runtime:
+ llm_runtime_version = (
+ llm_runtime.split("==")[1] if "==" in llm_runtime else MLC_LLM_VERSION
+ )
+ command.extend(["--build-arg", f"MLC_LLM_VERSION={llm_runtime_version}"])
+ elif "vllm" in llm_runtime:
+ llm_runtime_version = (
+ llm_runtime.split("==")[1] if "==" in llm_runtime else VLLM_VERSION
+ )
+ command.extend(["--build-arg", f"VLLM_VERSION={llm_runtime_version}"])
+ elif "transformers" in llm_runtime:
+ llm_runtime_version = (
+ llm_runtime.split("==")[1]
+ if "==" in llm_runtime
+ else TRANSFORMERS_VERSION
+ )
+ command.extend(
+ ["--build-arg", f"TRANSFORMERS_VERSION={llm_runtime_version}"]
+ )
+
+ if system_pkg_str:
+ command.extend(["--build-arg", f"SYSTEM_PACKAGES={system_pkg_str}"])
+
+ command.extend(
+ [
+ # editable mode
+ "--build-arg",
+ f"INSTILL_PYTHON_SDK_PROJECT_NAME={instill_python_sdk_project_name}",
+ "--build-arg",
+ (
+ "PYTHONPATH_USER_DEFINED_PROTO=/home/ray/"
+ f"{instill_python_sdk_project_name}/instill/protogen/model/ray/v1alpha"
+ ),
+ ]
+ if instill_python_sdk_project_name
+ else [
+ "--build-arg",
+ (
+ "PYTHONPATH_USER_DEFINED_PROTO=/home/ray/"
+ f"anaconda3/lib/python3.{python_version[4:]}/"
+ "site-packages/instill/protogen/model/ray/v1alpha"
+ ),
+ ]
+ )
+
+ return command
diff --git a/instill/helpers/const.py b/instill/helpers/const.py
index 35dc419..4ee8c34 100644
--- a/instill/helpers/const.py
+++ b/instill/helpers/const.py
@@ -1,8 +1,20 @@
+"""Constants for Instill Core Python SDK."""
+
import os
from typing import Dict, List
from PIL import Image
+PYTHON_VERSION_MIN = "3.9"
+PYTHON_VERSION_MAX = "3.12"
+
+CUDA_VERSION_MIN = "12.2"
+CUDA_VERSION_MAX = "12.8"
+
+TRANSFORMERS_VERSION = "4.52.4"
+VLLM_VERSION = "0.9.1"
+MLC_LLM_VERSION = "0.19.0"
+
PROMPT_ROLES = ["user", "assistant", "system"]
IMAGE_INPUT_TYPE_URL = "image-url"
@@ -133,8 +145,6 @@ class ImageToImageInput:
VRAM_MINIMUM_RESERVE = 2 # GB
VRAM_UPSCALE_FACTOR = 1.25
-DEFAULT_DEPENDENCIES = ["protobuf==4.25.3", "grpcio-tools==1.62.0"]
-
ENV_MEMORY = "RAY_MEMORY"
ENV_TOTAL_VRAM = "RAY_TOTAL_VRAM"
ENV_RAY_ACCELERATOR_TYPE = "RAY_ACCELERATOR_TYPE"
diff --git a/instill/helpers/docker/Dockerfile b/instill/helpers/docker/Dockerfile
index 1e383b5..580b591 100644
--- a/instill/helpers/docker/Dockerfile
+++ b/instill/helpers/docker/Dockerfile
@@ -1,17 +1,19 @@
# syntax=docker/dockerfile:1.7-labs
-ARG RAY_VERSION
-ARG PYTHON_VERSION
-ARG CUDA_SUFFIX
-ARG TARGET_ARCH_SUFFIX
-FROM rayproject/ray:${RAY_VERSION}-py${PYTHON_VERSION}${CUDA_SUFFIX}${TARGET_ARCH_SUFFIX}
+ARG RAY_VERSION=2.47.0
+ARG PYTHON_VERSION=-py311
+ARG CUDA_VERSION=-cu128
+FROM rayproject/ray:${RAY_VERSION}${PYTHON_VERSION}${CUDA_VERSION}
+
+# Install base packages
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
sudo apt-get update && \
- DEBIAN_FRONTEND=noninteractive sudo apt-get install -y tzdata curl vim && \
+ DEBIAN_FRONTEND=noninteractive sudo apt-get install -y curl vim && \
sudo rm -rf /var/lib/apt/lists/*
+# Install system packages
ARG SYSTEM_PACKAGES
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
@@ -21,12 +23,20 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
done && \
sudo rm -rf /var/lib/apt/lists/*
+# Install python packages
ARG PYTHON_PACKAGES
RUN --mount=type=cache,target=/root/.cache/pip,sharing=locked \
for package in ${PYTHON_PACKAGES}; do \
- pip install --default-timeout=1000 $package; \
+ pip install $package; \
done
+# The python-sdk is a local module that is not installed in the Ray worker environment.
+# Ray workers need to deserialize model configurations and deployment settings that were
+# created in the runtime environment. These objects may depend on this python-sdk.
+# Instead of installing the SDK in the Ray image, we copy
+# the entire SDK to /home/ray in development mode (editable or wheel) or
+# install the SDK in the Ray image in production mode
+
COPY --chown=ray:users . .
ARG INSTILL_PYTHON_SDK_PROJECT_NAME
@@ -40,10 +50,6 @@ RUN --mount=type=cache,target=/root/.cache/pip,sharing=locked \
pip install --default-timeout=1000 instill-sdk==${INSTILL_PYTHON_SDK_VERSION}; \
fi;
-# The python-sdk is a local module that is not installed in the Ray worker environment.
-# Ray workers need to deserialize model configurations and deployment settings that were
-# created in the runtime environment. These objects may depend on this python-sdk.
-# Instead of installing the SDK in the Ray image, we copy
-# the entire SDK to /home/ray and set PYTHONPATH to allow dynamic importing.
+# Set PYTHONPATH to allow dynamic importing for the python-sdk protobuf files
ARG PYTHONPATH_USER_DEFINED_PROTO
ENV PYTHONPATH=${PYTHONPATH_USER_DEFINED_PROTO}
\ No newline at end of file
diff --git a/instill/helpers/docker/Dockerfile.mlc b/instill/helpers/docker/Dockerfile.mlc
deleted file mode 100644
index 453cfca..0000000
--- a/instill/helpers/docker/Dockerfile.mlc
+++ /dev/null
@@ -1,69 +0,0 @@
-# syntax=docker/dockerfile:1.7-labs
-ARG RAY_VERSION
-ARG PYTHON_VERSION
-ARG CUDA_SUFFIX
-ARG TARGET_ARCH_SUFFIX
-
-FROM rayproject/ray:${RAY_VERSION}-py${PYTHON_VERSION}${CUDA_SUFFIX}${TARGET_ARCH_SUFFIX}
-
-RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
- --mount=type=cache,target=/var/lib/apt,sharing=locked \
- sudo apt-get update && \
- DEBIAN_FRONTEND=noninteractive sudo apt-get install -y tzdata curl vim cmake && \
- sudo rm -rf /var/lib/apt/lists/*
-
-# Build mlc-llm from source
-RUN conda create -y -q -n mlc-venv -c conda-forge "cmake>=3.24" rust git python=${PYTHON_VERSION}
-RUN conda run -n mlc-venv bash -c " \
- git clone --recursive https://github.com/mlc-ai/mlc-llm.git && \
- cd mlc-llm/ && \
- mkdir -p build && cd build && \
- echo '
- set(TVM_SOURCE_DIR 3rdparty/tvm)\n \
- set(CMAKE_BUILD_TYPE RelWithDebInfo)\n \
- set(USE_CUDA OFF)\n \
- set(USE_CUTLASS OFF)\n \
- set(USE_CUBLAS OFF)\n \
- set(USE_ROCM OFF)\n \
- set(USE_VULKAN OFF)\n \
- set(USE_METAL OFF)\n \
- set(USE_OPENCL OFF)\n \
- set(USE_OPENCL_ENABLE_HOST_PTR OFF)\n \
- set(USE_FLASHINFER ON)' > config.cmake && \
- cmake .. && cmake --build . --parallel $(nproc) && sudo make install"
-
-ARG SYSTEM_PACKAGES
-RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
- --mount=type=cache,target=/var/lib/apt,sharing=locked \
- sudo apt-get update && \
- for package in ${SYSTEM_PACKAGES}; do \
- DEBIAN_FRONTEND=noninteractive sudo apt-get install -y $package; \
- done && \
- sudo rm -rf /var/lib/apt/lists/*
-
-ARG PYTHON_PACKAGES
-RUN --mount=type=cache,target=/root/.cache/pip,sharing=locked \
- for package in ${PYTHON_PACKAGES}; do \
- pip install $package; \
- done
-
-COPY --chown=ray:users . .
-
-ARG INSTILL_PYTHON_SDK_PROJECT_NAME
-ARG INSTILL_PYTHON_SDK_VERSION
-RUN --mount=type=cache,target=/root/.cache/pip,sharing=locked \
- if [ ! -z "$INSTILL_PYTHON_SDK_PROJECT_NAME" ]; then \
- pip install -e ${INSTILL_PYTHON_SDK_PROJECT_NAME}; \
- elif [ -f instill_sdk-${INSTILL_PYTHON_SDK_VERSION}dev-py3-none-any.whl ]; then \
- pip install instill_sdk-${INSTILL_PYTHON_SDK_VERSION}dev-py3-none-any.whl; \
- else \
- pip install instill-sdk==${INSTILL_PYTHON_SDK_VERSION}; \
- fi;
-
-# The python-sdk is a local module that is not installed in the Ray worker environment.
-# Ray workers need to deserialize model configurations and deployment settings that were
-# created in the runtime environment. These objects may depend on this python-sdk.
-# Instead of installing the SDK in the Ray image, we copy
-# the entire SDK to /home/ray and set PYTHONPATH to allow dynamic importing.
-ARG PYTHONPATH_USER_DEFINED_PROTO
-ENV PYTHONPATH=${PYTHONPATH_USER_DEFINED_PROTO}
\ No newline at end of file
diff --git a/instill/helpers/docker/Dockerfile.mlc-llm b/instill/helpers/docker/Dockerfile.mlc-llm
new file mode 100644
index 0000000..e75b642
--- /dev/null
+++ b/instill/helpers/docker/Dockerfile.mlc-llm
@@ -0,0 +1,114 @@
+# syntax=docker/dockerfile:1.7-labs
+
+ARG RAY_VERSION=2.47.0
+ARG PYTHON_VERSION=-py311
+ARG CUDA_VERSION=-cu128
+ARG DEVICE_TYPE=-cpu
+
+#####################################################################################################
+# CPU Base Image (amd64)
+#####################################################################################################
+FROM rayproject/ray:${RAY_VERSION}${PYTHON_VERSION}${CUDA_VERSION} AS base-cpu-amd64
+
+# Install mlc-llm from pre-built wheels
+RUN pip install git-lfs
+
+ARG MLC_LLM_VERSION=0.19.0
+ARG PYTHON_VERSION=-py311
+RUN wget -nv "https://github.com/mlc-ai/package/releases/download/v0.9.dev0/mlc_ai_cpu-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_x86_64.whl" && \
+ pip install "mlc_ai_cpu-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_x86_64.whl" && \
+ rm "mlc_ai_cpu-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_x86_64.whl"
+
+RUN wget -nv "https://github.com/mlc-ai/package/releases/download/v0.9.dev0/mlc_llm_cpu-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_x86_64.whl" && \
+ pip install "mlc_llm_cpu-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_x86_64.whl" && \
+ rm "mlc_llm_cpu-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_x86_64.whl"
+
+#####################################################################################################
+# CPU Base Image (arm64)
+#####################################################################################################
+FROM rayproject/ray:${RAY_VERSION}${PYTHON_VERSION}${CUDA_VERSION} AS base-cpu-arm64
+
+# Install mlc-llm from pre-built wheels
+RUN pip install git-lfs
+
+ARG MLC_LLM_VERSION=0.19.0
+ARG PYTHON_VERSION=-py311
+RUN wget -nv "https://github.com/instill-ai/package/releases/download/v0.9.dev0/mlc_ai_cpu-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_aarch64.whl" && \
+ pip install "mlc_ai_cpu-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_aarch64.whl" && \
+ rm "mlc_ai_cpu-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_aarch64.whl"
+
+RUN wget -nv "https://github.com/instill-ai/package/releases/download/v0.9.dev0/mlc_llm_cpu-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_aarch64.whl" && \
+ pip install "mlc_llm_cpu-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_aarch64.whl" && \
+ rm "mlc_llm_cpu-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_aarch64.whl"
+
+#####################################################################################################
+# GPU Base Image (amd64)
+#####################################################################################################
+FROM rayproject/ray:${RAY_VERSION}${PYTHON_VERSION}${CUDA_VERSION} AS base-gpu-amd64
+
+# Install mlc-llm from pre-built wheels
+RUN pip install git-lfs
+
+ARG MLC_LLM_VERSION=0.19.0
+ARG PYTHON_VERSION=-py311
+ARG CUDA_VERSION=-cu128
+RUN wget -nv "https://github.com/mlc-ai/package/releases/download/v0.9.dev0/mlc_ai_cu${CUDA_VERSION#-cu}-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_x86_64.whl" && \
+ pip install "mlc_ai_cu${CUDA_VERSION#-cu}-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_x86_64.whl" && \
+ rm "mlc_ai_cu${CUDA_VERSION#-cu}-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_x86_64.whl"
+
+RUN wget -nv "https://github.com/mlc-ai/package/releases/download/v0.9.dev0/mlc_llm_cu${CUDA_VERSION#-cu}-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_x86_64.whl" && \
+ pip install "mlc_llm_cu${CUDA_VERSION#-cu}-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_x86_64.whl" && \
+ rm "mlc_llm_cu${CUDA_VERSION#-cu}-${MLC_LLM_VERSION}-cp${PYTHON_VERSION#-py}-cp${PYTHON_VERSION#-py}-manylinux_2_28_x86_64.whl"
+
+#####################################################################################################
+# Main Image
+#####################################################################################################
+FROM base${DEVICE_TYPE}-${TARGETARCH}
+
+# Install base packages
+RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
+ sudo apt-get update && \
+ DEBIAN_FRONTEND=noninteractive sudo apt-get install -y curl vim && \
+ sudo rm -rf /var/lib/apt/lists/*
+
+# Install system packages
+ARG SYSTEM_PACKAGES
+RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
+ sudo apt-get update && \
+ for package in ${SYSTEM_PACKAGES}; do \
+ DEBIAN_FRONTEND=noninteractive sudo apt-get install -y $package; \
+ done && \
+ sudo rm -rf /var/lib/apt/lists/*
+
+# Install python packages
+ARG PYTHON_PACKAGES
+RUN --mount=type=cache,target=/root/.cache/pip,sharing=locked \
+ for package in ${PYTHON_PACKAGES}; do \
+ pip install $package; \
+ done
+
+# The python-sdk is a local module that is not installed in the Ray worker environment.
+# Ray workers need to deserialize model configurations and deployment settings that were
+# created in the runtime environment. These objects may depend on this python-sdk.
+# Instead of installing the SDK in the Ray image, we copy
+# the entire SDK to /home/ray in development mode (editable or wheel) or
+# install the SDK in the Ray image in production mode
+
+COPY --chown=ray:users . .
+
+ARG INSTILL_PYTHON_SDK_PROJECT_NAME
+ARG INSTILL_PYTHON_SDK_VERSION
+RUN --mount=type=cache,target=/root/.cache/pip,sharing=locked \
+ if [ ! -z "$INSTILL_PYTHON_SDK_PROJECT_NAME" ]; then \
+ pip install -e ${INSTILL_PYTHON_SDK_PROJECT_NAME}; \
+ elif [ -f instill_sdk-${INSTILL_PYTHON_SDK_VERSION}dev-py3-none-any.whl ]; then \
+ pip install instill_sdk-${INSTILL_PYTHON_SDK_VERSION}dev-py3-none-any.whl; \
+ else \
+ pip install instill-sdk==${INSTILL_PYTHON_SDK_VERSION}; \
+ fi;
+
+# Set PYTHONPATH to allow dynamic importing for the python-sdk protobuf files
+ARG PYTHONPATH_USER_DEFINED_PROTO
+ENV PYTHONPATH=${PYTHONPATH_USER_DEFINED_PROTO}
\ No newline at end of file
diff --git a/instill/helpers/docker/Dockerfile.transformers b/instill/helpers/docker/Dockerfile.transformers
new file mode 100644
index 0000000..af2b72b
--- /dev/null
+++ b/instill/helpers/docker/Dockerfile.transformers
@@ -0,0 +1,89 @@
+# syntax=docker/dockerfile:1.7-labs
+
+ARG RAY_VERSION=2.47.0
+ARG PYTHON_VERSION=-py311
+ARG CUDA_VERSION=-cu128
+ARG DEVICE_TYPE=-cpu
+
+#####################################################################################################
+# CPU Base Image (amd64)
+#####################################################################################################
+FROM rayproject/ray:${RAY_VERSION}${PYTHON_VERSION}${CUDA_VERSION} AS base-cpu-amd64
+
+ARG TRANSFORMERS_VERSION=4.52.4
+RUN pip install transformers==${TRANSFORMERS_VERSION} torch torchvision torchaudio triton accelerate sentencepiece
+RUN pip install -U flash-attn --no-build-isolation
+RUN pip install -U autoawq --no-build-isolation
+
+#####################################################################################################
+# CPU Base Image (arm64)
+#####################################################################################################
+FROM rayproject/ray:${RAY_VERSION}${PYTHON_VERSION}${CUDA_VERSION} AS base-cpu-arm64
+
+ARG TRANSFORMERS_VERSION=4.52.4
+RUN pip install transformers==${TRANSFORMERS_VERSION} torch torchvision torchaudio accelerate sentencepiece
+# RUN pip install -U autoawq --no-build-isolation
+# RUN pip install intel-extension-for-pytorch --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/
+
+#####################################################################################################
+# GPU Base Image (amd64)
+#####################################################################################################
+FROM rayproject/ray:${RAY_VERSION}${PYTHON_VERSION}${CUDA_VERSION} AS base-gpu-amd64
+
+ARG TRANSFORMERS_VERSION=4.52.4
+RUN pip install transformers==${TRANSFORMERS_VERSION} torch torchvision torchaudio triton accelerate sentencepiece
+RUN pip install -U flash-attn --no-build-isolation
+RUN pip install -U autoawq --no-build-isolation
+
+###############################################################################
+# Main Image
+###############################################################################
+FROM base${DEVICE_TYPE}-${TARGETARCH}
+
+# Install base packages
+RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
+ sudo apt-get update && \
+ DEBIAN_FRONTEND=noninteractive sudo apt-get install -y curl vim && \
+ sudo rm -rf /var/lib/apt/lists/*
+
+# Install system packages
+ARG SYSTEM_PACKAGES
+RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
+ sudo apt-get update && \
+ for package in ${SYSTEM_PACKAGES}; do \
+ DEBIAN_FRONTEND=noninteractive sudo apt-get install -y $package; \
+ done && \
+ sudo rm -rf /var/lib/apt/lists/*
+
+# Install python packages
+ARG PYTHON_PACKAGES
+RUN --mount=type=cache,target=/root/.cache/pip,sharing=locked \
+ for package in ${PYTHON_PACKAGES}; do \
+ pip install $package; \
+ done
+
+# The python-sdk is a local module that is not installed in the Ray worker environment.
+# Ray workers need to deserialize model configurations and deployment settings that were
+# created in the runtime environment. These objects may depend on this python-sdk.
+# Instead of installing the SDK in the Ray image, we copy
+# the entire SDK to /home/ray in development mode (editable or wheel) or
+# install the SDK in the Ray image in production mode
+
+COPY --chown=ray:users . .
+
+ARG INSTILL_PYTHON_SDK_PROJECT_NAME
+ARG INSTILL_PYTHON_SDK_VERSION
+RUN --mount=type=cache,target=/root/.cache/pip,sharing=locked \
+ if [ ! -z "$INSTILL_PYTHON_SDK_PROJECT_NAME" ]; then \
+ pip install -e ${INSTILL_PYTHON_SDK_PROJECT_NAME}; \
+ elif [ -f instill_sdk-${INSTILL_PYTHON_SDK_VERSION}dev-py3-none-any.whl ]; then \
+ pip install instill_sdk-${INSTILL_PYTHON_SDK_VERSION}dev-py3-none-any.whl; \
+ else \
+ pip install --default-timeout=1000 instill-sdk==${INSTILL_PYTHON_SDK_VERSION}; \
+ fi;
+
+# Set PYTHONPATH to allow dynamic importing for the python-sdk protobuf files
+ARG PYTHONPATH_USER_DEFINED_PROTO
+ENV PYTHONPATH=${PYTHONPATH_USER_DEFINED_PROTO}
\ No newline at end of file
diff --git a/instill/helpers/docker/Dockerfile.vllm b/instill/helpers/docker/Dockerfile.vllm
index 4a11cc8..0927398 100644
--- a/instill/helpers/docker/Dockerfile.vllm
+++ b/instill/helpers/docker/Dockerfile.vllm
@@ -1,24 +1,72 @@
# syntax=docker/dockerfile:1.7-labs
+ARG RAY_VERSION=2.47.0
+ARG PYTHON_VERSION=-py311
+ARG CUDA_VERSION=-cu128
+ARG DEVICE_TYPE=-cpu
+
#####################################################################################################
-# This vLLM Dockerfile is used to construct an image that can build and run vLLM on ARM CPU platform.
+# CPU Base Image (amd46)
#####################################################################################################
-ARG RAY_VERSION
-ARG PYTHON_VERSION
+FROM rayproject/ray:${RAY_VERSION}${PYTHON_VERSION}${CUDA_VERSION} AS base-cpu-amd64
-FROM rayproject/ray:${RAY_VERSION}-py${PYTHON_VERSION}-aarch64
+RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
+ sudo apt-get update -y \
+ && sudo apt-get install -y curl ccache git numactl gcc-12 g++-12 python3 python3-pip libtcmalloc-minimal4 libnuma-dev \
+ && sudo apt-get install -y ffmpeg libsm6 libxext6 libgl1 \
+ && sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 10 --slave /usr/bin/g++ g++ /usr/bin/g++-12
-USER root
+# tcmalloc provides better memory allocation efficiency, e.g., holding memory in caches to speed up access of commonly-used objects.
+RUN --mount=type=cache,target=/root/.cache/pip \
+ pip install py-cpuinfo # Use this to gather CPU info and optimize based on x86_64 cores
-ENV CCACHE_DIR=/root/.cache/ccache
+# Set LD_PRELOAD for tcmalloc on x86_64 (different path than ARM)
+ENV LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4"
-ENV CMAKE_CXX_COMPILER_LAUNCHER=ccache
+RUN echo 'ulimit -c 0' >> ~/.bashrc
-RUN --mount=type=cache,target=/var/cache/apt \
- apt-get update -y \
- && apt-get install -y curl ccache git wget vim numactl gcc-12 g++-12 python3 python3-pip libtcmalloc-minimal4 libnuma-dev \
- && apt-get install -y ffmpeg libsm6 libxext6 libgl1 \
- && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 10 --slave /usr/bin/g++ g++ /usr/bin/g++-12
+WORKDIR /workspace
+
+# Clone vLLM repository (cache git objects)
+ARG VLLM_VERSION=0.9.1
+RUN git clone -b v${VLLM_VERSION} https://github.com/vllm-project/vllm
+
+WORKDIR /workspace/vllm
+
+ARG PIP_EXTRA_INDEX_URL="https://download.pytorch.org/whl/cpu"
+ENV PIP_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL}
+RUN --mount=type=cache,target=/root/.cache/pip \
+ pip install --upgrade pip && \
+ pip install -r requirements/build.txt
+
+RUN --mount=type=cache,target=/root/.cache/pip \
+ pip install -v -r requirements/common.txt -r requirements/cpu.txt
+
+ARG GIT_REPO_CHECK=0
+RUN if [ "$GIT_REPO_CHECK" != 0 ]; then bash tools/check_repo.sh ; fi
+
+# Enable AVX512 optimizations for x86_64 by default (can be disabled via build arg)
+ARG VLLM_CPU_DISABLE_AVX512="false"
+ENV VLLM_CPU_DISABLE_AVX512=${VLLM_CPU_DISABLE_AVX512}
+
+RUN --mount=type=cache,target=/root/.cache/pip \
+ --mount=type=cache,target=/root/.cache/ccache \
+ VLLM_TARGET_DEVICE=cpu python3 setup.py bdist_wheel && \
+ pip install dist/*.whl && \
+ rm -rf dist
+
+#####################################################################################################
+# CPU Base Image (arm64)
+#####################################################################################################
+FROM rayproject/ray:${RAY_VERSION}${PYTHON_VERSION}${CUDA_VERSION} AS base-cpu-arm64
+
+RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
+ sudo apt-get update -y \
+ && sudo apt-get install -y curl ccache git numactl gcc-12 g++-12 python3 python3-pip libtcmalloc-minimal4 libnuma-dev \
+ && sudo apt-get install -y ffmpeg libsm6 libxext6 libgl1 \
+ && sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 10 --slave /usr/bin/g++ g++ /usr/bin/g++-12
# tcmalloc provides better memory allocation efficiency, e.g., holding memory in caches to speed up access of commonly-used objects.
RUN --mount=type=cache,target=/root/.cache/pip \
@@ -32,8 +80,8 @@ RUN echo 'ulimit -c 0' >> ~/.bashrc
WORKDIR /workspace
# Clone vLLM repository (cache git objects)
-ARG VLLM_VERSION
-RUN git clone --branch ${VLLM_VERSION} https://github.com/vllm-project/vllm
+ARG VLLM_VERSION=0.9.1
+RUN git clone -b v${VLLM_VERSION} https://github.com/vllm-project/vllm
WORKDIR /workspace/vllm
@@ -59,22 +107,57 @@ RUN --mount=type=cache,target=/root/.cache/pip \
pip install dist/*.whl && \
rm -rf dist
+#####################################################################################################
+# GPU Base Image (amd64)
+#####################################################################################################
+FROM rayproject/ray:${RAY_VERSION}${PYTHON_VERSION}${CUDA_VERSION} AS base-gpu-amd64
+
+# Install vLLM with pre-built wheels supporting CUDA 12.2-12.8
+# The wheel will automatically detect the appropriate CUDA version at runtime
+RUN --mount=type=cache,target=/root/.cache/pip \
+ pip install --upgrade pip && \
+ pip install vllm[all] --extra-index-url https://download.pytorch.org/whl${CUDA_VERSION/-//}
+
+# Verify vLLM installation and CUDA support
+RUN python -c "import vllm; print(f'vLLM version: {vllm.__version__}'); print('CUDA available:', vllm.utils.cuda_utils.is_cuda_available())"
+
###############################################################################
-# Instill Core Model Dependencies
+# Main Image
###############################################################################
+FROM base${DEVICE_TYPE}-${TARGETARCH}
-ARG SYSTEM_PACKAGES
-RUN for package in ${SYSTEM_PACKAGES}; do \
- apt-get install $package; \
- done;
+WORKDIR /home/ray
+
+# Install base packages
+RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
+ sudo apt-get update && \
+ DEBIAN_FRONTEND=noninteractive sudo apt-get install -y curl vim && \
+ sudo rm -rf /var/lib/apt/lists/*
+# Install system packages
+ARG SYSTEM_PACKAGES
+RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
+ sudo apt-get update && \
+ for package in ${SYSTEM_PACKAGES}; do \
+ DEBIAN_FRONTEND=noninteractive sudo apt-get install -y $package; \
+ done && \
+ sudo rm -rf /var/lib/apt/lists/*
+
+# Install python packages
ARG PYTHON_PACKAGES
RUN --mount=type=cache,target=/root/.cache/pip,sharing=locked \
for package in ${PYTHON_PACKAGES}; do \
pip install --default-timeout=1000 $package; \
done
-WORKDIR /home/ray
+# The python-sdk is a local module that is not installed in the Ray worker environment.
+# Ray workers need to deserialize model configurations and deployment settings that were
+# created in the runtime environment. These objects may depend on this python-sdk.
+# Instead of installing the SDK in the Ray image, we copy
+# the entire SDK to /home/ray in development mode (editable or wheel) or
+# install the SDK in the Ray image in production mode
COPY --chown=ray:users . .
ARG INSTILL_PYTHON_SDK_PROJECT_NAME
diff --git a/instill/helpers/errors.py b/instill/helpers/errors.py
index 4d7f593..d2b385b 100644
--- a/instill/helpers/errors.py
+++ b/instill/helpers/errors.py
@@ -1,14 +1,31 @@
+"""
+Exceptions for the Instill CLI tool.
+"""
+
+
class ModelPathException(Exception):
+ """
+ Exception raised when the model path is not valid.
+ """
+
def __str__(self) -> str:
return "model path is not valid"
class ModelVramException(Exception):
+ """
+ Exception raised when the model projected vram usage is more than the GPU can handle.
+ """
+
def __str__(self) -> str:
return "model projected vram usage is more than the GPU can handle"
class ModelConfigException(Exception):
+ """
+ Exception raised when the model config file `instill.yaml` is missing a required field.
+ """
+
def __init__(self, field):
self.field = field
@@ -19,6 +36,10 @@ def __str__(
class InvalidInputException(Exception):
+ """
+ Exception raised when the input is invalid.
+ """
+
def __init__(self, field):
self.field = field
@@ -29,5 +50,9 @@ def __str__(
class InvalidOutputShapeException(Exception):
+ """
+ Exception raised when the output shape is invalid.
+ """
+
def __str__(self) -> str:
return "outputs length not matched"
diff --git a/instill/helpers/init-templates/instill.yaml b/instill/helpers/init-templates/instill.yaml
index e53974a..6ede0c9 100644
--- a/instill/helpers/init-templates/instill.yaml
+++ b/instill/helpers/init-templates/instill.yaml
@@ -1,20 +1,20 @@
build:
- # set to true if your model requires GPU
+ # (Required) Set to true if your model requires GPU.
gpu: true
- # python version, currently only support 3.11
+ # (Optional) Python version, currently only support 3.11.
python_version: "3.11"
- # cuda version if `gpu` is set to true
- # support 11.5, 11.6 ,11.7 ,11.7 ,12.1
- cuda_version: "12.1"
+ # (Optional) CUDA version if `gpu` is set to true
+ # support 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8
+ cuda_version: "12.8"
- # a list of python packages in the format of {package-name}=={version}
+ # (Optional) A list of python packages in the format of {package-name}=={version}
# python_packages:
# - torch==2.3.1
# - transformers==4.41.2
- # a list of system packages from apt package manager
+ # (Optional) A list of system packages from apt package manager
# system_packages:
# - htop
# - libglib2.0-0
diff --git a/poetry.lock b/poetry.lock
index 2471c06..8cce871 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand.
[[package]]
name = "altgraph"
@@ -91,8 +91,8 @@ files = [
lazy-object-proxy = ">=1.4.0"
typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""}
wrapt = [
- {version = ">=1.11,<2", markers = "python_version < \"3.11\""},
{version = ">=1.14,<2", markers = "python_version >= \"3.11\""},
+ {version = ">=1.11,<2", markers = "python_version < \"3.11\""},
]
[[package]]
@@ -208,14 +208,14 @@ files = [
[[package]]
name = "certifi"
-version = "2025.4.26"
+version = "2025.6.15"
description = "Python package for providing Mozilla's CA Bundle."
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
groups = ["main", "dev"]
files = [
- {file = "certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"},
- {file = "certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6"},
+ {file = "certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057"},
+ {file = "certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b"},
]
[[package]]
@@ -466,79 +466,79 @@ test = ["pytest"]
[[package]]
name = "coverage"
-version = "7.8.2"
+version = "7.9.1"
description = "Code coverage measurement for Python"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "coverage-7.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd8ec21e1443fd7a447881332f7ce9d35b8fbd2849e761bb290b584535636b0a"},
- {file = "coverage-7.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c26c2396674816deaeae7ded0e2b42c26537280f8fe313335858ffff35019be"},
- {file = "coverage-7.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1aec326ed237e5880bfe69ad41616d333712c7937bcefc1343145e972938f9b3"},
- {file = "coverage-7.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e818796f71702d7a13e50c70de2a1924f729228580bcba1607cccf32eea46e6"},
- {file = "coverage-7.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:546e537d9e24efc765c9c891328f30f826e3e4808e31f5d0f87c4ba12bbd1622"},
- {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab9b09a2349f58e73f8ebc06fac546dd623e23b063e5398343c5270072e3201c"},
- {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fd51355ab8a372d89fb0e6a31719e825cf8df8b6724bee942fb5b92c3f016ba3"},
- {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0774df1e093acb6c9e4d58bce7f86656aeed6c132a16e2337692c12786b32404"},
- {file = "coverage-7.8.2-cp310-cp310-win32.whl", hash = "sha256:00f2e2f2e37f47e5f54423aeefd6c32a7dbcedc033fcd3928a4f4948e8b96af7"},
- {file = "coverage-7.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:145b07bea229821d51811bf15eeab346c236d523838eda395ea969d120d13347"},
- {file = "coverage-7.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b99058eef42e6a8dcd135afb068b3d53aff3921ce699e127602efff9956457a9"},
- {file = "coverage-7.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5feb7f2c3e6ea94d3b877def0270dff0947b8d8c04cfa34a17be0a4dc1836879"},
- {file = "coverage-7.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:670a13249b957bb9050fab12d86acef7bf8f6a879b9d1a883799276e0d4c674a"},
- {file = "coverage-7.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bdc8bf760459a4a4187b452213e04d039990211f98644c7292adf1e471162b5"},
- {file = "coverage-7.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07a989c867986c2a75f158f03fdb413128aad29aca9d4dbce5fc755672d96f11"},
- {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2db10dedeb619a771ef0e2949ccba7b75e33905de959c2643a4607bef2f3fb3a"},
- {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e6ea7dba4e92926b7b5f0990634b78ea02f208d04af520c73a7c876d5a8d36cb"},
- {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ef2f22795a7aca99fc3c84393a55a53dd18ab8c93fb431004e4d8f0774150f54"},
- {file = "coverage-7.8.2-cp311-cp311-win32.whl", hash = "sha256:641988828bc18a6368fe72355df5f1703e44411adbe49bba5644b941ce6f2e3a"},
- {file = "coverage-7.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8ab4a51cb39dc1933ba627e0875046d150e88478dbe22ce145a68393e9652975"},
- {file = "coverage-7.8.2-cp311-cp311-win_arm64.whl", hash = "sha256:8966a821e2083c74d88cca5b7dcccc0a3a888a596a04c0b9668a891de3a0cc53"},
- {file = "coverage-7.8.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2f6fe3654468d061942591aef56686131335b7a8325684eda85dacdf311356c"},
- {file = "coverage-7.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76090fab50610798cc05241bf83b603477c40ee87acd358b66196ab0ca44ffa1"},
- {file = "coverage-7.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd0a0a5054be160777a7920b731a0570284db5142abaaf81bcbb282b8d99279"},
- {file = "coverage-7.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da23ce9a3d356d0affe9c7036030b5c8f14556bd970c9b224f9c8205505e3b99"},
- {file = "coverage-7.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9392773cffeb8d7e042a7b15b82a414011e9d2b5fdbbd3f7e6a6b17d5e21b20"},
- {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:876cbfd0b09ce09d81585d266c07a32657beb3eaec896f39484b631555be0fe2"},
- {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3da9b771c98977a13fbc3830f6caa85cae6c9c83911d24cb2d218e9394259c57"},
- {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a990f6510b3292686713bfef26d0049cd63b9c7bb17e0864f133cbfd2e6167f"},
- {file = "coverage-7.8.2-cp312-cp312-win32.whl", hash = "sha256:bf8111cddd0f2b54d34e96613e7fbdd59a673f0cf5574b61134ae75b6f5a33b8"},
- {file = "coverage-7.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:86a323a275e9e44cdf228af9b71c5030861d4d2610886ab920d9945672a81223"},
- {file = "coverage-7.8.2-cp312-cp312-win_arm64.whl", hash = "sha256:820157de3a589e992689ffcda8639fbabb313b323d26388d02e154164c57b07f"},
- {file = "coverage-7.8.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ea561010914ec1c26ab4188aef8b1567272ef6de096312716f90e5baa79ef8ca"},
- {file = "coverage-7.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cb86337a4fcdd0e598ff2caeb513ac604d2f3da6d53df2c8e368e07ee38e277d"},
- {file = "coverage-7.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a4636ddb666971345541b59899e969f3b301143dd86b0ddbb570bd591f1e85"},
- {file = "coverage-7.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5040536cf9b13fb033f76bcb5e1e5cb3b57c4807fef37db9e0ed129c6a094257"},
- {file = "coverage-7.8.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc67994df9bcd7e0150a47ef41278b9e0a0ea187caba72414b71dc590b99a108"},
- {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e6c86888fd076d9e0fe848af0a2142bf606044dc5ceee0aa9eddb56e26895a0"},
- {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:684ca9f58119b8e26bef860db33524ae0365601492e86ba0b71d513f525e7050"},
- {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8165584ddedb49204c4e18da083913bdf6a982bfb558632a79bdaadcdafd0d48"},
- {file = "coverage-7.8.2-cp313-cp313-win32.whl", hash = "sha256:34759ee2c65362163699cc917bdb2a54114dd06d19bab860725f94ef45a3d9b7"},
- {file = "coverage-7.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:2f9bc608fbafaee40eb60a9a53dbfb90f53cc66d3d32c2849dc27cf5638a21e3"},
- {file = "coverage-7.8.2-cp313-cp313-win_arm64.whl", hash = "sha256:9fe449ee461a3b0c7105690419d0b0aba1232f4ff6d120a9e241e58a556733f7"},
- {file = "coverage-7.8.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8369a7c8ef66bded2b6484053749ff220dbf83cba84f3398c84c51a6f748a008"},
- {file = "coverage-7.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:159b81df53a5fcbc7d45dae3adad554fdbde9829a994e15227b3f9d816d00b36"},
- {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6fcbbd35a96192d042c691c9e0c49ef54bd7ed865846a3c9d624c30bb67ce46"},
- {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05364b9cc82f138cc86128dc4e2e1251c2981a2218bfcd556fe6b0fbaa3501be"},
- {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46d532db4e5ff3979ce47d18e2fe8ecad283eeb7367726da0e5ef88e4fe64740"},
- {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4000a31c34932e7e4fa0381a3d6deb43dc0c8f458e3e7ea6502e6238e10be625"},
- {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:43ff5033d657cd51f83015c3b7a443287250dc14e69910577c3e03bd2e06f27b"},
- {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94316e13f0981cbbba132c1f9f365cac1d26716aaac130866ca812006f662199"},
- {file = "coverage-7.8.2-cp313-cp313t-win32.whl", hash = "sha256:3f5673888d3676d0a745c3d0e16da338c5eea300cb1f4ada9c872981265e76d8"},
- {file = "coverage-7.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:2c08b05ee8d7861e45dc5a2cc4195c8c66dca5ac613144eb6ebeaff2d502e73d"},
- {file = "coverage-7.8.2-cp313-cp313t-win_arm64.whl", hash = "sha256:1e1448bb72b387755e1ff3ef1268a06617afd94188164960dba8d0245a46004b"},
- {file = "coverage-7.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:496948261eaac5ac9cf43f5d0a9f6eb7a6d4cb3bedb2c5d294138142f5c18f2a"},
- {file = "coverage-7.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eacd2de0d30871eff893bab0b67840a96445edcb3c8fd915e6b11ac4b2f3fa6d"},
- {file = "coverage-7.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b039ffddc99ad65d5078ef300e0c7eed08c270dc26570440e3ef18beb816c1ca"},
- {file = "coverage-7.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e49824808d4375ede9dd84e9961a59c47f9113039f1a525e6be170aa4f5c34d"},
- {file = "coverage-7.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b069938961dfad881dc2f8d02b47645cd2f455d3809ba92a8a687bf513839787"},
- {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:de77c3ba8bb686d1c411e78ee1b97e6e0b963fb98b1637658dd9ad2c875cf9d7"},
- {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1676628065a498943bd3f64f099bb573e08cf1bc6088bbe33cf4424e0876f4b3"},
- {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8e1a26e7e50076e35f7afafde570ca2b4d7900a491174ca357d29dece5aacee7"},
- {file = "coverage-7.8.2-cp39-cp39-win32.whl", hash = "sha256:6782a12bf76fa61ad9350d5a6ef5f3f020b57f5e6305cbc663803f2ebd0f270a"},
- {file = "coverage-7.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:1efa4166ba75ccefd647f2d78b64f53f14fb82622bc94c5a5cb0a622f50f1c9e"},
- {file = "coverage-7.8.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:ec455eedf3ba0bbdf8f5a570012617eb305c63cb9f03428d39bf544cb2b94837"},
- {file = "coverage-7.8.2-py3-none-any.whl", hash = "sha256:726f32ee3713f7359696331a18daf0c3b3a70bb0ae71141b9d3c52be7c595e32"},
- {file = "coverage-7.8.2.tar.gz", hash = "sha256:a886d531373a1f6ff9fad2a2ba4a045b68467b779ae729ee0b3b10ac20033b27"},
+ {file = "coverage-7.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cc94d7c5e8423920787c33d811c0be67b7be83c705f001f7180c7b186dcf10ca"},
+ {file = "coverage-7.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16aa0830d0c08a2c40c264cef801db8bc4fc0e1892782e45bcacbd5889270509"},
+ {file = "coverage-7.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf95981b126f23db63e9dbe4cf65bd71f9a6305696fa5e2262693bc4e2183f5b"},
+ {file = "coverage-7.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f05031cf21699785cd47cb7485f67df619e7bcdae38e0fde40d23d3d0210d3c3"},
+ {file = "coverage-7.9.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb4fbcab8764dc072cb651a4bcda4d11fb5658a1d8d68842a862a6610bd8cfa3"},
+ {file = "coverage-7.9.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0f16649a7330ec307942ed27d06ee7e7a38417144620bb3d6e9a18ded8a2d3e5"},
+ {file = "coverage-7.9.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cea0a27a89e6432705fffc178064503508e3c0184b4f061700e771a09de58187"},
+ {file = "coverage-7.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e980b53a959fa53b6f05343afbd1e6f44a23ed6c23c4b4c56c6662bbb40c82ce"},
+ {file = "coverage-7.9.1-cp310-cp310-win32.whl", hash = "sha256:70760b4c5560be6ca70d11f8988ee6542b003f982b32f83d5ac0b72476607b70"},
+ {file = "coverage-7.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:a66e8f628b71f78c0e0342003d53b53101ba4e00ea8dabb799d9dba0abbbcebe"},
+ {file = "coverage-7.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:95c765060e65c692da2d2f51a9499c5e9f5cf5453aeaf1420e3fc847cc060582"},
+ {file = "coverage-7.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba383dc6afd5ec5b7a0d0c23d38895db0e15bcba7fb0fa8901f245267ac30d86"},
+ {file = "coverage-7.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37ae0383f13cbdcf1e5e7014489b0d71cc0106458878ccde52e8a12ced4298ed"},
+ {file = "coverage-7.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69aa417a030bf11ec46149636314c24c8d60fadb12fc0ee8f10fda0d918c879d"},
+ {file = "coverage-7.9.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4be2a28656afe279b34d4f91c3e26eccf2f85500d4a4ff0b1f8b54bf807338"},
+ {file = "coverage-7.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:382e7ddd5289f140259b610e5f5c58f713d025cb2f66d0eb17e68d0a94278875"},
+ {file = "coverage-7.9.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e5532482344186c543c37bfad0ee6069e8ae4fc38d073b8bc836fc8f03c9e250"},
+ {file = "coverage-7.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a39d18b3f50cc121d0ce3838d32d58bd1d15dab89c910358ebefc3665712256c"},
+ {file = "coverage-7.9.1-cp311-cp311-win32.whl", hash = "sha256:dd24bd8d77c98557880def750782df77ab2b6885a18483dc8588792247174b32"},
+ {file = "coverage-7.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:6b55ad10a35a21b8015eabddc9ba31eb590f54adc9cd39bcf09ff5349fd52125"},
+ {file = "coverage-7.9.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ad935f0016be24c0e97fc8c40c465f9c4b85cbbe6eac48934c0dc4d2568321e"},
+ {file = "coverage-7.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8de12b4b87c20de895f10567639c0797b621b22897b0af3ce4b4e204a743626"},
+ {file = "coverage-7.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5add197315a054e92cee1b5f686a2bcba60c4c3e66ee3de77ace6c867bdee7cb"},
+ {file = "coverage-7.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600a1d4106fe66f41e5d0136dfbc68fe7200a5cbe85610ddf094f8f22e1b0300"},
+ {file = "coverage-7.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a876e4c3e5a2a1715a6608906aa5a2e0475b9c0f68343c2ada98110512ab1d8"},
+ {file = "coverage-7.9.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81f34346dd63010453922c8e628a52ea2d2ccd73cb2487f7700ac531b247c8a5"},
+ {file = "coverage-7.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:888f8eee13f2377ce86d44f338968eedec3291876b0b8a7289247ba52cb984cd"},
+ {file = "coverage-7.9.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9969ef1e69b8c8e1e70d591f91bbc37fc9a3621e447525d1602801a24ceda898"},
+ {file = "coverage-7.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60c458224331ee3f1a5b472773e4a085cc27a86a0b48205409d364272d67140d"},
+ {file = "coverage-7.9.1-cp312-cp312-win32.whl", hash = "sha256:5f646a99a8c2b3ff4c6a6e081f78fad0dde275cd59f8f49dc4eab2e394332e74"},
+ {file = "coverage-7.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:30f445f85c353090b83e552dcbbdad3ec84c7967e108c3ae54556ca69955563e"},
+ {file = "coverage-7.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:af41da5dca398d3474129c58cb2b106a5d93bbb196be0d307ac82311ca234342"},
+ {file = "coverage-7.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:31324f18d5969feef7344a932c32428a2d1a3e50b15a6404e97cba1cc9b2c631"},
+ {file = "coverage-7.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0c804506d624e8a20fb3108764c52e0eef664e29d21692afa375e0dd98dc384f"},
+ {file = "coverage-7.9.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef64c27bc40189f36fcc50c3fb8f16ccda73b6a0b80d9bd6e6ce4cffcd810bbd"},
+ {file = "coverage-7.9.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4fe2348cc6ec372e25adec0219ee2334a68d2f5222e0cba9c0d613394e12d86"},
+ {file = "coverage-7.9.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34ed2186fe52fcc24d4561041979a0dec69adae7bce2ae8d1c49eace13e55c43"},
+ {file = "coverage-7.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:25308bd3d00d5eedd5ae7d4357161f4df743e3c0240fa773ee1b0f75e6c7c0f1"},
+ {file = "coverage-7.9.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73e9439310f65d55a5a1e0564b48e34f5369bee943d72c88378f2d576f5a5751"},
+ {file = "coverage-7.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37ab6be0859141b53aa89412a82454b482c81cf750de4f29223d52268a86de67"},
+ {file = "coverage-7.9.1-cp313-cp313-win32.whl", hash = "sha256:64bdd969456e2d02a8b08aa047a92d269c7ac1f47e0c977675d550c9a0863643"},
+ {file = "coverage-7.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:be9e3f68ca9edb897c2184ad0eee815c635565dbe7a0e7e814dc1f7cbab92c0a"},
+ {file = "coverage-7.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:1c503289ffef1d5105d91bbb4d62cbe4b14bec4d13ca225f9c73cde9bb46207d"},
+ {file = "coverage-7.9.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0b3496922cb5f4215bf5caaef4cf12364a26b0be82e9ed6d050f3352cf2d7ef0"},
+ {file = "coverage-7.9.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9565c3ab1c93310569ec0d86b017f128f027cab0b622b7af288696d7ed43a16d"},
+ {file = "coverage-7.9.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2241ad5dbf79ae1d9c08fe52b36d03ca122fb9ac6bca0f34439e99f8327ac89f"},
+ {file = "coverage-7.9.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bb5838701ca68b10ebc0937dbd0eb81974bac54447c55cd58dea5bca8451029"},
+ {file = "coverage-7.9.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b30a25f814591a8c0c5372c11ac8967f669b97444c47fd794926e175c4047ece"},
+ {file = "coverage-7.9.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2d04b16a6062516df97969f1ae7efd0de9c31eb6ebdceaa0d213b21c0ca1a683"},
+ {file = "coverage-7.9.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7931b9e249edefb07cd6ae10c702788546341d5fe44db5b6108a25da4dca513f"},
+ {file = "coverage-7.9.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52e92b01041151bf607ee858e5a56c62d4b70f4dac85b8c8cb7fb8a351ab2c10"},
+ {file = "coverage-7.9.1-cp313-cp313t-win32.whl", hash = "sha256:684e2110ed84fd1ca5f40e89aa44adf1729dc85444004111aa01866507adf363"},
+ {file = "coverage-7.9.1-cp313-cp313t-win_amd64.whl", hash = "sha256:437c576979e4db840539674e68c84b3cda82bc824dd138d56bead1435f1cb5d7"},
+ {file = "coverage-7.9.1-cp313-cp313t-win_arm64.whl", hash = "sha256:18a0912944d70aaf5f399e350445738a1a20b50fbea788f640751c2ed9208b6c"},
+ {file = "coverage-7.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f424507f57878e424d9a95dc4ead3fbdd72fd201e404e861e465f28ea469951"},
+ {file = "coverage-7.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:535fde4001b2783ac80865d90e7cc7798b6b126f4cd8a8c54acfe76804e54e58"},
+ {file = "coverage-7.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02532fd3290bb8fa6bec876520842428e2a6ed6c27014eca81b031c2d30e3f71"},
+ {file = "coverage-7.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56f5eb308b17bca3bbff810f55ee26d51926d9f89ba92707ee41d3c061257e55"},
+ {file = "coverage-7.9.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfa447506c1a52271f1b0de3f42ea0fa14676052549095e378d5bff1c505ff7b"},
+ {file = "coverage-7.9.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9ca8e220006966b4a7b68e8984a6aee645a0384b0769e829ba60281fe61ec4f7"},
+ {file = "coverage-7.9.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:49f1d0788ba5b7ba65933f3a18864117c6506619f5ca80326b478f72acf3f385"},
+ {file = "coverage-7.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:68cd53aec6f45b8e4724c0950ce86eacb775c6be01ce6e3669fe4f3a21e768ed"},
+ {file = "coverage-7.9.1-cp39-cp39-win32.whl", hash = "sha256:95335095b6c7b1cc14c3f3f17d5452ce677e8490d101698562b2ffcacc304c8d"},
+ {file = "coverage-7.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:e1b5191d1648acc439b24721caab2fd0c86679d8549ed2c84d5a7ec1bedcc244"},
+ {file = "coverage-7.9.1-pp39.pp310.pp311-none-any.whl", hash = "sha256:db0f04118d1db74db6c9e1cb1898532c7dcc220f1d2718f058601f7c3f499514"},
+ {file = "coverage-7.9.1-py3-none-any.whl", hash = "sha256:66b974b145aa189516b6bf2d8423e888b742517d37872f6ee4c5be0073bd9a3c"},
+ {file = "coverage-7.9.1.tar.gz", hash = "sha256:6cf43c78c4282708a28e466316935ec7489a9c487518a77fa68f716c67909cec"},
]
[package.dependencies]
@@ -568,50 +568,50 @@ requests = ">=2.28,<3.0"
[[package]]
name = "cryptography"
-version = "45.0.3"
+version = "45.0.4"
description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
optional = false
python-versions = "!=3.9.0,!=3.9.1,>=3.7"
groups = ["dev"]
markers = "sys_platform == \"linux\""
files = [
- {file = "cryptography-45.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:7573d9eebaeceeb55285205dbbb8753ac1e962af3d9640791d12b36864065e71"},
- {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d377dde61c5d67eb4311eace661c3efda46c62113ff56bf05e2d679e02aebb5b"},
- {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fae1e637f527750811588e4582988932c222f8251f7b7ea93739acb624e1487f"},
- {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ca932e11218bcc9ef812aa497cdf669484870ecbcf2d99b765d6c27a86000942"},
- {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af3f92b1dc25621f5fad065288a44ac790c5798e986a34d393ab27d2b27fcff9"},
- {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2f8f8f0b73b885ddd7f3d8c2b2234a7d3ba49002b0223f58cfde1bedd9563c56"},
- {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9cc80ce69032ffa528b5e16d217fa4d8d4bb7d6ba8659c1b4d74a1b0f4235fca"},
- {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c824c9281cb628015bfc3c59335163d4ca0540d49de4582d6c2637312907e4b1"},
- {file = "cryptography-45.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5833bb4355cb377ebd880457663a972cd044e7f49585aee39245c0d592904578"},
- {file = "cryptography-45.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9bb5bf55dcb69f7067d80354d0a348368da907345a2c448b0babc4215ccd3497"},
- {file = "cryptography-45.0.3-cp311-abi3-win32.whl", hash = "sha256:3ad69eeb92a9de9421e1f6685e85a10fbcfb75c833b42cc9bc2ba9fb00da4710"},
- {file = "cryptography-45.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:97787952246a77d77934d41b62fb1b6f3581d83f71b44796a4158d93b8f5c490"},
- {file = "cryptography-45.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:c92519d242703b675ccefd0f0562eb45e74d438e001f8ab52d628e885751fb06"},
- {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5edcb90da1843df85292ef3a313513766a78fbbb83f584a5a58fb001a5a9d57"},
- {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38deed72285c7ed699864f964a3f4cf11ab3fb38e8d39cfcd96710cd2b5bb716"},
- {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5555365a50efe1f486eed6ac7062c33b97ccef409f5970a0b6f205a7cfab59c8"},
- {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9e4253ed8f5948a3589b3caee7ad9a5bf218ffd16869c516535325fece163dcc"},
- {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cfd84777b4b6684955ce86156cfb5e08d75e80dc2585e10d69e47f014f0a5342"},
- {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:a2b56de3417fd5f48773ad8e91abaa700b678dc7fe1e0c757e1ae340779acf7b"},
- {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:57a6500d459e8035e813bd8b51b671977fb149a8c95ed814989da682314d0782"},
- {file = "cryptography-45.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f22af3c78abfbc7cbcdf2c55d23c3e022e1a462ee2481011d518c7fb9c9f3d65"},
- {file = "cryptography-45.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:232954730c362638544758a8160c4ee1b832dc011d2c41a306ad8f7cccc5bb0b"},
- {file = "cryptography-45.0.3-cp37-abi3-win32.whl", hash = "sha256:cb6ab89421bc90e0422aca911c69044c2912fc3debb19bb3c1bfe28ee3dff6ab"},
- {file = "cryptography-45.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:d54ae41e6bd70ea23707843021c778f151ca258081586f0cfa31d936ae43d1b2"},
- {file = "cryptography-45.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed43d396f42028c1f47b5fec012e9e12631266e3825e95c00e3cf94d472dac49"},
- {file = "cryptography-45.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:fed5aaca1750e46db870874c9c273cd5182a9e9deb16f06f7bdffdb5c2bde4b9"},
- {file = "cryptography-45.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:00094838ecc7c6594171e8c8a9166124c1197b074cfca23645cee573910d76bc"},
- {file = "cryptography-45.0.3-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:92d5f428c1a0439b2040435a1d6bc1b26ebf0af88b093c3628913dd464d13fa1"},
- {file = "cryptography-45.0.3-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:ec64ee375b5aaa354b2b273c921144a660a511f9df8785e6d1c942967106438e"},
- {file = "cryptography-45.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:71320fbefd05454ef2d457c481ba9a5b0e540f3753354fff6f780927c25d19b0"},
- {file = "cryptography-45.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:edd6d51869beb7f0d472e902ef231a9b7689508e83880ea16ca3311a00bf5ce7"},
- {file = "cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:555e5e2d3a53b4fabeca32835878b2818b3f23966a4efb0d566689777c5a12c8"},
- {file = "cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:25286aacb947286620a31f78f2ed1a32cded7be5d8b729ba3fb2c988457639e4"},
- {file = "cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:050ce5209d5072472971e6efbfc8ec5a8f9a841de5a4db0ebd9c2e392cb81972"},
- {file = "cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:dc10ec1e9f21f33420cc05214989544727e776286c1c16697178978327b95c9c"},
- {file = "cryptography-45.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9eda14f049d7f09c2e8fb411dda17dd6b16a3c76a1de5e249188a32aeb92de19"},
- {file = "cryptography-45.0.3.tar.gz", hash = "sha256:ec21313dd335c51d7877baf2972569f40a4291b76a0ce51391523ae358d05899"},
+ {file = "cryptography-45.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:425a9a6ac2823ee6e46a76a21a4e8342d8fa5c01e08b823c1f19a8b74f096069"},
+ {file = "cryptography-45.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:680806cf63baa0039b920f4976f5f31b10e772de42f16310a6839d9f21a26b0d"},
+ {file = "cryptography-45.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4ca0f52170e821bc8da6fc0cc565b7bb8ff8d90d36b5e9fdd68e8a86bdf72036"},
+ {file = "cryptography-45.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f3fe7a5ae34d5a414957cc7f457e2b92076e72938423ac64d215722f6cf49a9e"},
+ {file = "cryptography-45.0.4-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:25eb4d4d3e54595dc8adebc6bbd5623588991d86591a78c2548ffb64797341e2"},
+ {file = "cryptography-45.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ce1678a2ccbe696cf3af15a75bb72ee008d7ff183c9228592ede9db467e64f1b"},
+ {file = "cryptography-45.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:49fe9155ab32721b9122975e168a6760d8ce4cffe423bcd7ca269ba41b5dfac1"},
+ {file = "cryptography-45.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2882338b2a6e0bd337052e8b9007ced85c637da19ef9ecaf437744495c8c2999"},
+ {file = "cryptography-45.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:23b9c3ea30c3ed4db59e7b9619272e94891f8a3a5591d0b656a7582631ccf750"},
+ {file = "cryptography-45.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0a97c927497e3bc36b33987abb99bf17a9a175a19af38a892dc4bbb844d7ee2"},
+ {file = "cryptography-45.0.4-cp311-abi3-win32.whl", hash = "sha256:e00a6c10a5c53979d6242f123c0a97cff9f3abed7f064fc412c36dc521b5f257"},
+ {file = "cryptography-45.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:817ee05c6c9f7a69a16200f0c90ab26d23a87701e2a284bd15156783e46dbcc8"},
+ {file = "cryptography-45.0.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:964bcc28d867e0f5491a564b7debb3ffdd8717928d315d12e0d7defa9e43b723"},
+ {file = "cryptography-45.0.4-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6a5bf57554e80f75a7db3d4b1dacaa2764611ae166ab42ea9a72bcdb5d577637"},
+ {file = "cryptography-45.0.4-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:46cf7088bf91bdc9b26f9c55636492c1cce3e7aaf8041bbf0243f5e5325cfb2d"},
+ {file = "cryptography-45.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7bedbe4cc930fa4b100fc845ea1ea5788fcd7ae9562e669989c11618ae8d76ee"},
+ {file = "cryptography-45.0.4-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:eaa3e28ea2235b33220b949c5a0d6cf79baa80eab2eb5607ca8ab7525331b9ff"},
+ {file = "cryptography-45.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7ef2dde4fa9408475038fc9aadfc1fb2676b174e68356359632e980c661ec8f6"},
+ {file = "cryptography-45.0.4-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:6a3511ae33f09094185d111160fd192c67aa0a2a8d19b54d36e4c78f651dc5ad"},
+ {file = "cryptography-45.0.4-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:06509dc70dd71fa56eaa138336244e2fbaf2ac164fc9b5e66828fccfd2b680d6"},
+ {file = "cryptography-45.0.4-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5f31e6b0a5a253f6aa49be67279be4a7e5a4ef259a9f33c69f7d1b1191939872"},
+ {file = "cryptography-45.0.4-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:944e9ccf67a9594137f942d5b52c8d238b1b4e46c7a0c2891b7ae6e01e7c80a4"},
+ {file = "cryptography-45.0.4-cp37-abi3-win32.whl", hash = "sha256:c22fe01e53dc65edd1945a2e6f0015e887f84ced233acecb64b4daadb32f5c97"},
+ {file = "cryptography-45.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:627ba1bc94f6adf0b0a2e35d87020285ead22d9f648c7e75bb64f367375f3b22"},
+ {file = "cryptography-45.0.4-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a77c6fb8d76e9c9f99f2f3437c1a4ac287b34eaf40997cfab1e9bd2be175ac39"},
+ {file = "cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7aad98a25ed8ac917fdd8a9c1e706e5a0956e06c498be1f713b61734333a4507"},
+ {file = "cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3530382a43a0e524bc931f187fc69ef4c42828cf7d7f592f7f249f602b5a4ab0"},
+ {file = "cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:6b613164cb8425e2f8db5849ffb84892e523bf6d26deb8f9bb76ae86181fa12b"},
+ {file = "cryptography-45.0.4-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:96d4819e25bf3b685199b304a0029ce4a3caf98947ce8a066c9137cc78ad2c58"},
+ {file = "cryptography-45.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b97737a3ffbea79eebb062eb0d67d72307195035332501722a9ca86bab9e3ab2"},
+ {file = "cryptography-45.0.4-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4828190fb6c4bcb6ebc6331f01fe66ae838bb3bd58e753b59d4b22eb444b996c"},
+ {file = "cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:03dbff8411206713185b8cebe31bc5c0eb544799a50c09035733716b386e61a4"},
+ {file = "cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51dfbd4d26172d31150d84c19bbe06c68ea4b7f11bbc7b3a5e146b367c311349"},
+ {file = "cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:0339a692de47084969500ee455e42c58e449461e0ec845a34a6a9b9bf7df7fb8"},
+ {file = "cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:0cf13c77d710131d33e63626bd55ae7c0efb701ebdc2b3a7952b9b23a0412862"},
+ {file = "cryptography-45.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bbc505d1dc469ac12a0a064214879eac6294038d6b24ae9f71faae1448a9608d"},
+ {file = "cryptography-45.0.4.tar.gz", hash = "sha256:7405ade85c83c37682c8fe65554759800a4a8c54b2d96e0f8ad114d31b808d57"},
]
[package.dependencies]
@@ -624,7 +624,7 @@ nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_full_version >= \"3.8
pep8test = ["check-sdist ; python_full_version >= \"3.8.0\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"]
sdist = ["build (>=1.0.0)"]
ssh = ["bcrypt (>=3.1.5)"]
-test = ["certifi (>=2024)", "cryptography-vectors (==45.0.3)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"]
+test = ["certifi (>=2024)", "cryptography-vectors (==45.0.4)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"]
test-randomorder = ["pytest-randomly"]
[[package]]
@@ -648,9 +648,9 @@ isort = ">=4.3.21,<6.0"
jinja2 = ">=2.10.1,<4.0"
packaging = "*"
pydantic = [
+ {version = ">=1.10.0,<2.4.0 || >2.4.0,<3.0", extras = ["email"], markers = "python_version >= \"3.11\" and python_version < \"4.0\""},
{version = ">=1.5.1,<2.4.0 || >2.4.0,<3.0", extras = ["email"], markers = "python_version < \"3.10\""},
{version = ">=1.9.0,<2.4.0 || >2.4.0,<3.0", extras = ["email"], markers = "python_version == \"3.10\""},
- {version = ">=1.10.0,<2.4.0 || >2.4.0,<3.0", extras = ["email"], markers = "python_version >= \"3.11\" and python_version < \"4.0\""},
]
pyyaml = ">=6.0.1"
toml = {version = ">=0.10.0,<1.0.0", markers = "python_version < \"3.11\""}
@@ -833,14 +833,14 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth
[[package]]
name = "fastapi"
-version = "0.115.12"
+version = "0.115.13"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d"},
- {file = "fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681"},
+ {file = "fastapi-0.115.13-py3-none-any.whl", hash = "sha256:0a0cab59afa7bab22f5eb347f8c9864b681558c278395e94035a741fc10cd865"},
+ {file = "fastapi-0.115.13.tar.gz", hash = "sha256:55d1d25c2e1e0a0a50aceb1c8705cd932def273c102bff0b1c1da88b3c6eb307"},
]
[package.dependencies]
@@ -916,14 +916,14 @@ dev = ["flake8", "markdown", "twine", "wheel"]
[[package]]
name = "google-api-core"
-version = "2.25.0"
+version = "2.25.1"
description = "Google API client core library"
optional = false
python-versions = ">=3.7"
groups = ["main"]
files = [
- {file = "google_api_core-2.25.0-py3-none-any.whl", hash = "sha256:1db79d1281dcf9f3d10023283299ba38f3dc9f639ec41085968fd23e5bcf512e"},
- {file = "google_api_core-2.25.0.tar.gz", hash = "sha256:9b548e688702f82a34ed8409fb8a6961166f0b7795032f0be8f48308dff4333a"},
+ {file = "google_api_core-2.25.1-py3-none-any.whl", hash = "sha256:8a2a56c1fef82987a524371f99f3bd0143702fecc670c72e600c1cda6bf8dbb7"},
+ {file = "google_api_core-2.25.1.tar.gz", hash = "sha256:d2aaa0b13c78c61cb3f4282c464c046e45fbd75755683c9c525e6e8f7ed0a5e8"},
]
[package.dependencies]
@@ -941,14 +941,14 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.0)"]
[[package]]
name = "google-auth"
-version = "2.40.2"
+version = "2.40.3"
description = "Google Authentication Library"
optional = false
python-versions = ">=3.7"
groups = ["main"]
files = [
- {file = "google_auth-2.40.2-py2.py3-none-any.whl", hash = "sha256:f7e568d42eedfded58734f6a60c58321896a621f7c116c411550a4b4a13da90b"},
- {file = "google_auth-2.40.2.tar.gz", hash = "sha256:a33cde547a2134273226fa4b853883559947ebe9207521f7afc707efbf690f58"},
+ {file = "google_auth-2.40.3-py2.py3-none-any.whl", hash = "sha256:1370d4593e86213563547f97a92752fc658456fe4514c809544f330fed45a7ca"},
+ {file = "google_auth-2.40.3.tar.gz", hash = "sha256:500c3a29adedeb36ea9cf24b8d10858e152f2412e3ca37829b3fa18e33d63b77"},
]
[package.dependencies]
@@ -986,128 +986,134 @@ grpc = ["grpcio (>=1.44.0,<2.0.0)"]
[[package]]
name = "grpcio"
-version = "1.72.1"
+version = "1.73.0"
description = "HTTP/2-based RPC framework"
optional = false
python-versions = ">=3.9"
groups = ["main", "dev"]
files = [
- {file = "grpcio-1.72.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:ce2706ff37be7a6de68fbc4c3f8dde247cab48cc70fee5fedfbc9cd923b4ee5a"},
- {file = "grpcio-1.72.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:7db9e15ee7618fbea748176a67d347f3100fa92d36acccd0e7eeb741bc82f72a"},
- {file = "grpcio-1.72.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:8d6e7764181ba4a8b74aa78c98a89c9f3441068ebcee5d6f14c44578214e0be3"},
- {file = "grpcio-1.72.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:237bb619ba33594006025e6f114f62e60d9563afd6f8e89633ee384868e26687"},
- {file = "grpcio-1.72.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7f1d8a442fd242aa432c8e1b8411c79ebc409dad2c637614d726e226ce9ed0c"},
- {file = "grpcio-1.72.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f2359bd4bba85bf94fd9ab8802671b9637a6803bb673d221157a11523a52e6a8"},
- {file = "grpcio-1.72.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3269cfca37570a420a57a785f2a5d4234c5b12aced55f8843dafced2d3f8c9a6"},
- {file = "grpcio-1.72.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:06c023d86398714d6257194c21f2bc0b58a53ce45cee87dd3c54c7932c590e17"},
- {file = "grpcio-1.72.1-cp310-cp310-win32.whl", hash = "sha256:06dbe54eeea5f9dfb3e7ca2ff66c715ff5fc96b07a1feb322122fe14cb42f6aa"},
- {file = "grpcio-1.72.1-cp310-cp310-win_amd64.whl", hash = "sha256:ba593aa2cd52f4468ba29668c83f893d88c128198d6b1273ca788ef53e3ae5fe"},
- {file = "grpcio-1.72.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:4e112c083f90c330b0eaa78a633fb206d49c20c443926e827f8cac9eb9d2ea32"},
- {file = "grpcio-1.72.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:c6f7e3275832adab7384193f78b8c1a98b82541562fa08d7244e8a6b4b5c78a4"},
- {file = "grpcio-1.72.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:dd03c8847c47ef7ac5455aafdfb5e553ecf84f228282bd6106762b379f27c25c"},
- {file = "grpcio-1.72.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7497dbdf220b88b66004e2630fb2b1627df5e279db970d3cc20f70d39dce978d"},
- {file = "grpcio-1.72.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c2cde3ae8ae901317c049394ed8d3c6964de6b814ae65fc68636a7337b63aa"},
- {file = "grpcio-1.72.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7a66cef4bc1db81a54108a849e95650da640c9bc1901957bf7d3b1eeb3251ee8"},
- {file = "grpcio-1.72.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fc0435ad45d540597f78978e3fd5515b448193f51f9065fb67dda566336e0f5f"},
- {file = "grpcio-1.72.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:524bad78d610fa1f9f316d47b3aab1ff89d438ba952ee34e3e335ca80a27ba96"},
- {file = "grpcio-1.72.1-cp311-cp311-win32.whl", hash = "sha256:409ee0abf7e74bbf88941046142452cf3d1f3863d34e11e8fd2b07375170c730"},
- {file = "grpcio-1.72.1-cp311-cp311-win_amd64.whl", hash = "sha256:ea483e408fac55569c11158c3e6d6d6a8c3b0f798b68f1c10db9b22c5996e19b"},
- {file = "grpcio-1.72.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:65a5ef28e5852bd281c6d01a923906e8036736e95e370acab8626fcbec041e67"},
- {file = "grpcio-1.72.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:9e5c594a6c779d674204fb9bdaa1e7b71666ff10b34a62e7769fc6868b5d7511"},
- {file = "grpcio-1.72.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:d324f4bdb990d852d79b38c59a12d24fcd47cf3b1a38f2e4d2b6d0b1031bc818"},
- {file = "grpcio-1.72.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:841db55dd29cf2f4121b853b2f89813a1b6175163fbb92c5945fb1b0ca259ef2"},
- {file = "grpcio-1.72.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00da930aa2711b955a538e835096aa365a4b7f2701bdc2ce1febb242a103f8a1"},
- {file = "grpcio-1.72.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4b657773480267fbb7ad733fa85abc103c52ab62e5bc97791faf82c53836eefc"},
- {file = "grpcio-1.72.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a08b483f17a6abca2578283a7ae3aa8d4d90347242b0de2898bdb27395c3f20b"},
- {file = "grpcio-1.72.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:299f3ea4e03c1d0548f4a174b48d612412f92c667f2100e30a079ab76fdaa813"},
- {file = "grpcio-1.72.1-cp312-cp312-win32.whl", hash = "sha256:addc721a3708ff789da1bf69876018dc730c1ec9d3d3cb6912776a00c535a5bc"},
- {file = "grpcio-1.72.1-cp312-cp312-win_amd64.whl", hash = "sha256:22ea2aa92a60dff231ba5fcd7f0220a33c2218e556009996f858eeafe294d1c2"},
- {file = "grpcio-1.72.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:294be6e9c323a197434569a41e0fb5b5aa0962fd5d55a3dc890ec5df985f611a"},
- {file = "grpcio-1.72.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:41ec164dac8df2862f67457d9cdf8d8f8b6a4ca475a3ed1ba6547fff98d93717"},
- {file = "grpcio-1.72.1-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:761736f75c6ddea3732d97eaabe70c616271f5f542a8be95515135fdd1a638f6"},
- {file = "grpcio-1.72.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:082003cb93618964c111c70d69b60ac0dc6566d4c254c9b2a775faa2965ba8f8"},
- {file = "grpcio-1.72.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8660f736da75424949c14f7c8b1ac60a25b2f37cabdec95181834b405373e8a7"},
- {file = "grpcio-1.72.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2ada1abe2ad122b42407b2bfd79d6706a4940d4797f44bd740f5c98ca1ecda9b"},
- {file = "grpcio-1.72.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:0db2766d0c482ee740abbe7d00a06cc4fb54f7e5a24d3cf27c3352be18a2b1e8"},
- {file = "grpcio-1.72.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4bdb404d9c2187260b34e2b22783c204fba8a9023a166cf77376190d9cf5a08"},
- {file = "grpcio-1.72.1-cp313-cp313-win32.whl", hash = "sha256:bb64722c3124c906a5b66e50a90fd36442642f653ba88a24f67d08e94bca59f3"},
- {file = "grpcio-1.72.1-cp313-cp313-win_amd64.whl", hash = "sha256:329cc6ff5b431df9614340d3825b066a1ff0a5809a01ba2e976ef48c65a0490b"},
- {file = "grpcio-1.72.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:8941b83addd503c1982090b4631804d0ff1edbbc6c85c9c20ed503b1dc65fef9"},
- {file = "grpcio-1.72.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:d29b80290c5eda561a4c291d6d5b4315a2a5095ab37061118d6e0781858aca0a"},
- {file = "grpcio-1.72.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:4ca56d955564db749c9c6d75e9c4c777854e22b2482d247fb6c5a02d5f28ea78"},
- {file = "grpcio-1.72.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b08a3ef14d2b01eef13882c6d3a2d8fb5fcd73db81bd1e3ab69d4ee75215433a"},
- {file = "grpcio-1.72.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7df49801b3b323e4a21047979e3834cd286b32ee5ceee46f5217826274721f"},
- {file = "grpcio-1.72.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9717617ba2ff65c058ef53b0d5e50f03e8350f0c5597f93bb5c980a31db990c8"},
- {file = "grpcio-1.72.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:212db80b1e8aa7792d51269bfb32164e2333a9bb273370ace3ed2a378505cb01"},
- {file = "grpcio-1.72.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a0d19947d4480af5f363f077f221e665931f479e2604280ac4eafe6daa71f77"},
- {file = "grpcio-1.72.1-cp39-cp39-win32.whl", hash = "sha256:7622ef647dc911ed010a817d9be501df4ae83495b8e5cdd35b555bdcf3880a3e"},
- {file = "grpcio-1.72.1-cp39-cp39-win_amd64.whl", hash = "sha256:f8d8fa7cd2a7f1b4207e215dec8bc07f1202682d9a216ebe028185c15faece30"},
- {file = "grpcio-1.72.1.tar.gz", hash = "sha256:87f62c94a40947cec1a0f91f95f5ba0aa8f799f23a1d42ae5be667b6b27b959c"},
-]
-
-[package.extras]
-protobuf = ["grpcio-tools (>=1.72.1)"]
+ {file = "grpcio-1.73.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:d050197eeed50f858ef6c51ab09514856f957dba7b1f7812698260fc9cc417f6"},
+ {file = "grpcio-1.73.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:ebb8d5f4b0200916fb292a964a4d41210de92aba9007e33d8551d85800ea16cb"},
+ {file = "grpcio-1.73.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:c0811331b469e3f15dda5f90ab71bcd9681189a83944fd6dc908e2c9249041ef"},
+ {file = "grpcio-1.73.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12787c791c3993d0ea1cc8bf90393647e9a586066b3b322949365d2772ba965b"},
+ {file = "grpcio-1.73.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c17771e884fddf152f2a0df12478e8d02853e5b602a10a9a9f1f52fa02b1d32"},
+ {file = "grpcio-1.73.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:275e23d4c428c26b51857bbd95fcb8e528783597207ec592571e4372b300a29f"},
+ {file = "grpcio-1.73.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9ffc972b530bf73ef0f948f799482a1bf12d9b6f33406a8e6387c0ca2098a833"},
+ {file = "grpcio-1.73.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d269df64aff092b2cec5e015d8ae09c7e90888b5c35c24fdca719a2c9f35"},
+ {file = "grpcio-1.73.0-cp310-cp310-win32.whl", hash = "sha256:072d8154b8f74300ed362c01d54af8b93200c1a9077aeaea79828d48598514f1"},
+ {file = "grpcio-1.73.0-cp310-cp310-win_amd64.whl", hash = "sha256:ce953d9d2100e1078a76a9dc2b7338d5415924dc59c69a15bf6e734db8a0f1ca"},
+ {file = "grpcio-1.73.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:51036f641f171eebe5fa7aaca5abbd6150f0c338dab3a58f9111354240fe36ec"},
+ {file = "grpcio-1.73.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:d12bbb88381ea00bdd92c55aff3da3391fd85bc902c41275c8447b86f036ce0f"},
+ {file = "grpcio-1.73.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:483c507c2328ed0e01bc1adb13d1eada05cc737ec301d8e5a8f4a90f387f1790"},
+ {file = "grpcio-1.73.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c201a34aa960c962d0ce23fe5f423f97e9d4b518ad605eae6d0a82171809caaa"},
+ {file = "grpcio-1.73.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:859f70c8e435e8e1fa060e04297c6818ffc81ca9ebd4940e180490958229a45a"},
+ {file = "grpcio-1.73.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e2459a27c6886e7e687e4e407778425f3c6a971fa17a16420227bda39574d64b"},
+ {file = "grpcio-1.73.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e0084d4559ee3dbdcce9395e1bc90fdd0262529b32c417a39ecbc18da8074ac7"},
+ {file = "grpcio-1.73.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef5fff73d5f724755693a464d444ee0a448c6cdfd3c1616a9223f736c622617d"},
+ {file = "grpcio-1.73.0-cp311-cp311-win32.whl", hash = "sha256:965a16b71a8eeef91fc4df1dc40dc39c344887249174053814f8a8e18449c4c3"},
+ {file = "grpcio-1.73.0-cp311-cp311-win_amd64.whl", hash = "sha256:b71a7b4483d1f753bbc11089ff0f6fa63b49c97a9cc20552cded3fcad466d23b"},
+ {file = "grpcio-1.73.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:fb9d7c27089d9ba3746f18d2109eb530ef2a37452d2ff50f5a6696cd39167d3b"},
+ {file = "grpcio-1.73.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:128ba2ebdac41e41554d492b82c34586a90ebd0766f8ebd72160c0e3a57b9155"},
+ {file = "grpcio-1.73.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:068ecc415f79408d57a7f146f54cdf9f0acb4b301a52a9e563973dc981e82f3d"},
+ {file = "grpcio-1.73.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ddc1cfb2240f84d35d559ade18f69dcd4257dbaa5ba0de1a565d903aaab2968"},
+ {file = "grpcio-1.73.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e53007f70d9783f53b41b4cf38ed39a8e348011437e4c287eee7dd1d39d54b2f"},
+ {file = "grpcio-1.73.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4dd8d8d092efede7d6f48d695ba2592046acd04ccf421436dd7ed52677a9ad29"},
+ {file = "grpcio-1.73.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:70176093d0a95b44d24baa9c034bb67bfe2b6b5f7ebc2836f4093c97010e17fd"},
+ {file = "grpcio-1.73.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:085ebe876373ca095e24ced95c8f440495ed0b574c491f7f4f714ff794bbcd10"},
+ {file = "grpcio-1.73.0-cp312-cp312-win32.whl", hash = "sha256:cfc556c1d6aef02c727ec7d0016827a73bfe67193e47c546f7cadd3ee6bf1a60"},
+ {file = "grpcio-1.73.0-cp312-cp312-win_amd64.whl", hash = "sha256:bbf45d59d090bf69f1e4e1594832aaf40aa84b31659af3c5e2c3f6a35202791a"},
+ {file = "grpcio-1.73.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:da1d677018ef423202aca6d73a8d3b2cb245699eb7f50eb5f74cae15a8e1f724"},
+ {file = "grpcio-1.73.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:36bf93f6a657f37c131d9dd2c391b867abf1426a86727c3575393e9e11dadb0d"},
+ {file = "grpcio-1.73.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:d84000367508ade791d90c2bafbd905574b5ced8056397027a77a215d601ba15"},
+ {file = "grpcio-1.73.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c98ba1d928a178ce33f3425ff823318040a2b7ef875d30a0073565e5ceb058d9"},
+ {file = "grpcio-1.73.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a73c72922dfd30b396a5f25bb3a4590195ee45ecde7ee068acb0892d2900cf07"},
+ {file = "grpcio-1.73.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:10e8edc035724aba0346a432060fd192b42bd03675d083c01553cab071a28da5"},
+ {file = "grpcio-1.73.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f5cdc332b503c33b1643b12ea933582c7b081957c8bc2ea4cc4bc58054a09288"},
+ {file = "grpcio-1.73.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:07ad7c57233c2109e4ac999cb9c2710c3b8e3f491a73b058b0ce431f31ed8145"},
+ {file = "grpcio-1.73.0-cp313-cp313-win32.whl", hash = "sha256:0eb5df4f41ea10bda99a802b2a292d85be28958ede2a50f2beb8c7fc9a738419"},
+ {file = "grpcio-1.73.0-cp313-cp313-win_amd64.whl", hash = "sha256:38cf518cc54cd0c47c9539cefa8888549fcc067db0b0c66a46535ca8032020c4"},
+ {file = "grpcio-1.73.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:1284850607901cfe1475852d808e5a102133461ec9380bc3fc9ebc0686ee8e32"},
+ {file = "grpcio-1.73.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:0e092a4b28eefb63eec00d09ef33291cd4c3a0875cde29aec4d11d74434d222c"},
+ {file = "grpcio-1.73.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:33577fe7febffe8ebad458744cfee8914e0c10b09f0ff073a6b149a84df8ab8f"},
+ {file = "grpcio-1.73.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60813d8a16420d01fa0da1fc7ebfaaa49a7e5051b0337cd48f4f950eb249a08e"},
+ {file = "grpcio-1.73.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a9c957dc65e5d474378d7bcc557e9184576605d4b4539e8ead6e351d7ccce20"},
+ {file = "grpcio-1.73.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3902b71407d021163ea93c70c8531551f71ae742db15b66826cf8825707d2908"},
+ {file = "grpcio-1.73.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1dd7fa7276dcf061e2d5f9316604499eea06b1b23e34a9380572d74fe59915a8"},
+ {file = "grpcio-1.73.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2d1510c4ea473110cb46a010555f2c1a279d1c256edb276e17fa571ba1e8927c"},
+ {file = "grpcio-1.73.0-cp39-cp39-win32.whl", hash = "sha256:d0a1517b2005ba1235a1190b98509264bf72e231215dfeef8db9a5a92868789e"},
+ {file = "grpcio-1.73.0-cp39-cp39-win_amd64.whl", hash = "sha256:6228f7eb6d9f785f38b589d49957fca5df3d5b5349e77d2d89b14e390165344c"},
+ {file = "grpcio-1.73.0.tar.gz", hash = "sha256:3af4c30918a7f0d39de500d11255f8d9da4f30e94a2033e70fe2a720e184bd8e"},
+]
+
+[package.extras]
+protobuf = ["grpcio-tools (>=1.73.0)"]
[[package]]
name = "grpcio-tools"
-version = "1.62.3"
+version = "1.62.0"
description = "Protobuf code generator for gRPC"
optional = false
python-versions = ">=3.7"
groups = ["dev"]
files = [
- {file = "grpcio-tools-1.62.3.tar.gz", hash = "sha256:7c7136015c3d62c3eef493efabaf9e3380e3e66d24ee8e94c01cb71377f57833"},
- {file = "grpcio_tools-1.62.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:2f968b049c2849540751ec2100ab05e8086c24bead769ca734fdab58698408c1"},
- {file = "grpcio_tools-1.62.3-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:0a8c0c4724ae9c2181b7dbc9b186df46e4f62cb18dc184e46d06c0ebeccf569e"},
- {file = "grpcio_tools-1.62.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5782883a27d3fae8c425b29a9d3dcf5f47d992848a1b76970da3b5a28d424b26"},
- {file = "grpcio_tools-1.62.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3d812daffd0c2d2794756bd45a353f89e55dc8f91eb2fc840c51b9f6be62667"},
- {file = "grpcio_tools-1.62.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b47d0dda1bdb0a0ba7a9a6de88e5a1ed61f07fad613964879954961e36d49193"},
- {file = "grpcio_tools-1.62.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ca246dffeca0498be9b4e1ee169b62e64694b0f92e6d0be2573e65522f39eea9"},
- {file = "grpcio_tools-1.62.3-cp310-cp310-win32.whl", hash = "sha256:6a56d344b0bab30bf342a67e33d386b0b3c4e65868ffe93c341c51e1a8853ca5"},
- {file = "grpcio_tools-1.62.3-cp310-cp310-win_amd64.whl", hash = "sha256:710fecf6a171dcbfa263a0a3e7070e0df65ba73158d4c539cec50978f11dad5d"},
- {file = "grpcio_tools-1.62.3-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:703f46e0012af83a36082b5f30341113474ed0d91e36640da713355cd0ea5d23"},
- {file = "grpcio_tools-1.62.3-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:7cc83023acd8bc72cf74c2edbe85b52098501d5b74d8377bfa06f3e929803492"},
- {file = "grpcio_tools-1.62.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ff7d58a45b75df67d25f8f144936a3e44aabd91afec833ee06826bd02b7fbe7"},
- {file = "grpcio_tools-1.62.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f2483ea232bd72d98a6dc6d7aefd97e5bc80b15cd909b9e356d6f3e326b6e43"},
- {file = "grpcio_tools-1.62.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:962c84b4da0f3b14b3cdb10bc3837ebc5f136b67d919aea8d7bb3fd3df39528a"},
- {file = "grpcio_tools-1.62.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8ad0473af5544f89fc5a1ece8676dd03bdf160fb3230f967e05d0f4bf89620e3"},
- {file = "grpcio_tools-1.62.3-cp311-cp311-win32.whl", hash = "sha256:db3bc9fa39afc5e4e2767da4459df82b095ef0cab2f257707be06c44a1c2c3e5"},
- {file = "grpcio_tools-1.62.3-cp311-cp311-win_amd64.whl", hash = "sha256:e0898d412a434e768a0c7e365acabe13ff1558b767e400936e26b5b6ed1ee51f"},
- {file = "grpcio_tools-1.62.3-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d102b9b21c4e1e40af9a2ab3c6d41afba6bd29c0aa50ca013bf85c99cdc44ac5"},
- {file = "grpcio_tools-1.62.3-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:0a52cc9444df978438b8d2332c0ca99000521895229934a59f94f37ed896b133"},
- {file = "grpcio_tools-1.62.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141d028bf5762d4a97f981c501da873589df3f7e02f4c1260e1921e565b376fa"},
- {file = "grpcio_tools-1.62.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47a5c093ab256dec5714a7a345f8cc89315cb57c298b276fa244f37a0ba507f0"},
- {file = "grpcio_tools-1.62.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f6831fdec2b853c9daa3358535c55eed3694325889aa714070528cf8f92d7d6d"},
- {file = "grpcio_tools-1.62.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e02d7c1a02e3814c94ba0cfe43d93e872c758bd8fd5c2797f894d0c49b4a1dfc"},
- {file = "grpcio_tools-1.62.3-cp312-cp312-win32.whl", hash = "sha256:b881fd9505a84457e9f7e99362eeedd86497b659030cf57c6f0070df6d9c2b9b"},
- {file = "grpcio_tools-1.62.3-cp312-cp312-win_amd64.whl", hash = "sha256:11c625eebefd1fd40a228fc8bae385e448c7e32a6ae134e43cf13bbc23f902b7"},
- {file = "grpcio_tools-1.62.3-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:ec6fbded0c61afe6f84e3c2a43e6d656791d95747d6d28b73eff1af64108c434"},
- {file = "grpcio_tools-1.62.3-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:bfda6ee8990997a9df95c5606f3096dae65f09af7ca03a1e9ca28f088caca5cf"},
- {file = "grpcio_tools-1.62.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b77f9f9cee87cd798f0fe26b7024344d1b03a7cd2d2cba7035f8433b13986325"},
- {file = "grpcio_tools-1.62.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e02d3b96f2d0e4bab9ceaa30f37d4f75571e40c6272e95364bff3125a64d184"},
- {file = "grpcio_tools-1.62.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1da38070738da53556a4b35ab67c1b9884a5dd48fa2f243db35dc14079ea3d0c"},
- {file = "grpcio_tools-1.62.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ace43b26d88a58dcff16c20d23ff72b04d0a415f64d2820f4ff06b1166f50557"},
- {file = "grpcio_tools-1.62.3-cp37-cp37m-win_amd64.whl", hash = "sha256:350a80485e302daaa95d335a931f97b693e170e02d43767ab06552c708808950"},
- {file = "grpcio_tools-1.62.3-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:c3a1ac9d394f8e229eb28eec2e04b9a6f5433fa19c9d32f1cb6066e3c5114a1d"},
- {file = "grpcio_tools-1.62.3-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:11f363570dea661dde99e04a51bd108a5807b5df32a6f8bdf4860e34e94a4dbf"},
- {file = "grpcio_tools-1.62.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9ad9950119d8ae27634e68b7663cc8d340ae535a0f80d85a55e56a6973ab1f"},
- {file = "grpcio_tools-1.62.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c5d22b252dcef11dd1e0fbbe5bbfb9b4ae048e8880d33338215e8ccbdb03edc"},
- {file = "grpcio_tools-1.62.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:27cd9ef5c5d68d5ed104b6dcb96fe9c66b82050e546c9e255716903c3d8f0373"},
- {file = "grpcio_tools-1.62.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f4b1615adf67bd8bb71f3464146a6f9949972d06d21a4f5e87e73f6464d97f57"},
- {file = "grpcio_tools-1.62.3-cp38-cp38-win32.whl", hash = "sha256:e18e15287c31baf574fcdf8251fb7f997d64e96c6ecf467906e576da0a079af6"},
- {file = "grpcio_tools-1.62.3-cp38-cp38-win_amd64.whl", hash = "sha256:6c3064610826f50bd69410c63101954676edc703e03f9e8f978a135f1aaf97c1"},
- {file = "grpcio_tools-1.62.3-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:8e62cc7164b0b7c5128e637e394eb2ef3db0e61fc798e80c301de3b2379203ed"},
- {file = "grpcio_tools-1.62.3-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c8ad5cce554e2fcaf8842dee5d9462583b601a3a78f8b76a153c38c963f58c10"},
- {file = "grpcio_tools-1.62.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec279dcf3518201fc592c65002754f58a6b542798cd7f3ecd4af086422f33f29"},
- {file = "grpcio_tools-1.62.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c989246c2aebc13253f08be32538a4039a64e12d9c18f6d662d7aee641dc8b5"},
- {file = "grpcio_tools-1.62.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ca4f5eeadbb57cf03317d6a2857823239a63a59cc935f5bd6cf6e8b7af7a7ecc"},
- {file = "grpcio_tools-1.62.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0cb3a3436ac119cbd37a7d3331d9bdf85dad21a6ac233a3411dff716dcbf401e"},
- {file = "grpcio_tools-1.62.3-cp39-cp39-win32.whl", hash = "sha256:3eae6ea76d62fcac091e1f15c2dcedf1dc3f114f8df1a972a8a0745e89f4cf61"},
- {file = "grpcio_tools-1.62.3-cp39-cp39-win_amd64.whl", hash = "sha256:eec73a005443061f4759b71a056f745e3b000dc0dc125c9f20560232dfbcbd14"},
-]
-
-[package.dependencies]
-grpcio = ">=1.62.3"
+ {file = "grpcio-tools-1.62.0.tar.gz", hash = "sha256:7fca6ecfbbf0549058bb29dcc6e435d885b878d07701e77ac58e1e1f591736dc"},
+ {file = "grpcio_tools-1.62.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:465c51ebaa184ee3bb619cd5bfaf562bbdde166f2822a6935461e6a741f5ac19"},
+ {file = "grpcio_tools-1.62.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:0d9c9a4832f52c4597d6dc12d9ab3109c3bd0ee1686b8bf6d64f9eab4145e3cb"},
+ {file = "grpcio_tools-1.62.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:5a482d9625209023481e631c29a6df1392bfc49f9accfa880dabbacff642559a"},
+ {file = "grpcio_tools-1.62.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74196beed18383d53ff3e2412a6c1eefa3ff109e987be240368496bc3dcabc8b"},
+ {file = "grpcio_tools-1.62.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75aca28cbeb605c59b5689a7e000fbc2bd659d2f322c58461f3912f00069f6da"},
+ {file = "grpcio_tools-1.62.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:523adf731fa4c5af0bf7ee2edb65e8c7ef4d9df9951461d6a18fe096688efd2d"},
+ {file = "grpcio_tools-1.62.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:791aa220f8f1936e65bc079e9eb954fa0202a1f16e28b83956e59d17dface127"},
+ {file = "grpcio_tools-1.62.0-cp310-cp310-win32.whl", hash = "sha256:5dacc691b18d2c294ea971720ff980a1e2d68a3f7ddcd2f0670b3204e81c4b18"},
+ {file = "grpcio_tools-1.62.0-cp310-cp310-win_amd64.whl", hash = "sha256:6999a4e705b03aacad46e625feb7610e47ec88dbd51220c2282b6334f90721fc"},
+ {file = "grpcio_tools-1.62.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:19b74e141937c885c9e56b6a7dfa190ca7d583bd48bce9171dd65bbf108b9271"},
+ {file = "grpcio_tools-1.62.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:17c16e9a89c0b9f4ff2b143f232c5256383453ce7b55fe981598f9517adc8252"},
+ {file = "grpcio_tools-1.62.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:3730b1cd998a0cffc817602cc55e51f268fa97b3e38fa4bee578e3741474547a"},
+ {file = "grpcio_tools-1.62.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14201950513636f515dd455a06890e3a21d115b943cf6a8f5af67ad1413cfa1f"},
+ {file = "grpcio_tools-1.62.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74e0053360e0eadd75193c0c379b6d7f51d074ebbff856bd41780e1a028b38d"},
+ {file = "grpcio_tools-1.62.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d5959e3df126931d28cd94dd5f0a708b7dd96019de80ab715fb922fd0c8a838d"},
+ {file = "grpcio_tools-1.62.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1927934dfba4658a97c2dab267e53ed239264d40fdd5b295fc317693543db85b"},
+ {file = "grpcio_tools-1.62.0-cp311-cp311-win32.whl", hash = "sha256:2f5bd22203e64e1732e149bfdd3083716d038abca294e4e2852159b3d893f9ec"},
+ {file = "grpcio_tools-1.62.0-cp311-cp311-win_amd64.whl", hash = "sha256:cd1f4caeca614b04db803566473f7db0971e7a88268f95e4a529b0ace699b949"},
+ {file = "grpcio_tools-1.62.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:f0884eaf6a2bbd7b03fea456e808909ee48dd4f7f455519d67defda791116368"},
+ {file = "grpcio_tools-1.62.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:6b900ae319b6f9ac1be0ca572dfb41c23a7ff6fcbf36e3be6d3054e1e4c60de6"},
+ {file = "grpcio_tools-1.62.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:3bbe79b134dfb7c98cf60e4962e31039bef824834cc7034bdf1886a2ed1097f9"},
+ {file = "grpcio_tools-1.62.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77196c7ac8741d4a2aebb023bcc2964ac65ca44180fd791640889ab2afed3e47"},
+ {file = "grpcio_tools-1.62.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b65288ebe12e38dd3650fea65d82fcce0d35df1ae4a770b525c10119ee71962f"},
+ {file = "grpcio_tools-1.62.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:52b216c458458f6c292e12428916e80974c5113abc505a61e7b0b9f8932a785d"},
+ {file = "grpcio_tools-1.62.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88aa62303278aec45bbb26bf679269c7890346c37140ae30e39da1070c341e11"},
+ {file = "grpcio_tools-1.62.0-cp312-cp312-win32.whl", hash = "sha256:bb6802d63e42734d2baf02e1343377fe18590ed6a1f5ffbdebbbe0f8331f176b"},
+ {file = "grpcio_tools-1.62.0-cp312-cp312-win_amd64.whl", hash = "sha256:d5652d3a52a2e8e1d9bdf28fbd15e21b166e31b968cd7c8c604bf31611c0bb5b"},
+ {file = "grpcio_tools-1.62.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:84e27206bd884be83a7fdcef8be3c90eb1591341c0ba9b0d25ec9db1043ba2f2"},
+ {file = "grpcio_tools-1.62.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:5eb63d9207b02a0fa30216907e1e7705cc2670f933e77236c6e0eb966ad3b4bf"},
+ {file = "grpcio_tools-1.62.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:95e49839d49e79187c43cd63af5c206dc5743a01d7d3d2f039772fa743cbb30c"},
+ {file = "grpcio_tools-1.62.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ae5cd2f89e33a529790bf8aa59a459484edb05e4f58d4cf78836b9dfa1fab43"},
+ {file = "grpcio_tools-1.62.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e1fd7301d762bf5984b7e7fb62fce82cff864d75f0a57e15cfd07ae1bd79133"},
+ {file = "grpcio_tools-1.62.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e38d5800151e6804d500e329f7ddfb615c50eee0c1607593e3147a4b21037e40"},
+ {file = "grpcio_tools-1.62.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:563a75924109e75809b2919e68d7e6ae7872e63d20258aae7899b14f6ff9e18b"},
+ {file = "grpcio_tools-1.62.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5f8934715577c9cc0c792b8a77f7d0dd2bb60e951161b10c5f46b60856673240"},
+ {file = "grpcio_tools-1.62.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:ed6cf7ff4a10c46f85340f9c68982f9efb29f51ee4b66828310fcdf3c2d7ffd1"},
+ {file = "grpcio_tools-1.62.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:1faa5006fe9e7b9e65c47bc23f7cd333fdcdd4ba35d44080303848266db5ab05"},
+ {file = "grpcio_tools-1.62.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:3b526dc5566161a3a17599753838b9cfbdd4cb15b6ad419aae8a5d12053fa8ae"},
+ {file = "grpcio_tools-1.62.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09db3688efd3499ce3c0b02c0bac0656abdab4cb99716f81ad879c08b92c56e"},
+ {file = "grpcio_tools-1.62.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:006ea0cc16e8bf8f307326e0556e1384f24abb402cc4e6a720aa1dfe8f268647"},
+ {file = "grpcio_tools-1.62.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b46ba0b6552b4375ede65e0c89491af532635347f78d52a72f8a027529e713ed"},
+ {file = "grpcio_tools-1.62.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ec6f561c86fe13cff3be16f297cc05e1aa1274294524743a4cf91d971866fbb0"},
+ {file = "grpcio_tools-1.62.0-cp38-cp38-win32.whl", hash = "sha256:c85391e06620d6e16a56341caae5007d0c6219beba065e1e288f2523fba6a335"},
+ {file = "grpcio_tools-1.62.0-cp38-cp38-win_amd64.whl", hash = "sha256:679cf2507090e010da73e5001665c76de2a5927b2e2110e459222b1c81cb10c2"},
+ {file = "grpcio_tools-1.62.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:0e87f105f1d152934759f8975ed002d5ce057b3cdf1cc6cb63fe6008671a27b9"},
+ {file = "grpcio_tools-1.62.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:bf9f281f528e0220558d57e09b4518dec148dcb250d78bd9cbb27e09edabb3f9"},
+ {file = "grpcio_tools-1.62.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:711314cb4c6c8b3d51bafaee380ffa5012bd0567ed68f1b0b1fc07492b27acab"},
+ {file = "grpcio_tools-1.62.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54bb570bd963905de3bda596b35e06026552705edebbb2cb737b57aa5252b9e5"},
+ {file = "grpcio_tools-1.62.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dce5f04676cf94e6e2d13d7f91ac2de79097d86675bc4d404a3c24dcc0332c88"},
+ {file = "grpcio_tools-1.62.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:98ddf871c614cc0ed331c7159ebbbf5040be562279677d3bb97c2e6083539f72"},
+ {file = "grpcio_tools-1.62.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f3aaf3b20c0f7063856b2432335af8f76cf580f898e04085548cde28332d6833"},
+ {file = "grpcio_tools-1.62.0-cp39-cp39-win32.whl", hash = "sha256:3dee3be61d9032f777a9b4e2696ea3d0748a582cb99c672b5d41ca66821e8c87"},
+ {file = "grpcio_tools-1.62.0-cp39-cp39-win_amd64.whl", hash = "sha256:f54b5181784464bd3573ae7dbcf053da18a4b7a75fe19960791f383be3d035ca"},
+]
+
+[package.dependencies]
+grpcio = ">=1.62.0"
protobuf = ">=4.21.6,<5.0dev"
setuptools = "*"
@@ -1828,118 +1834,113 @@ files = [
[[package]]
name = "msgpack"
-version = "1.1.0"
+version = "1.1.1"
description = "MessagePack serializer"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"},
- {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"},
- {file = "msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5"},
- {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5"},
- {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e"},
- {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b"},
- {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f"},
- {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68"},
- {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b"},
- {file = "msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044"},
- {file = "msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f"},
- {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7"},
- {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa"},
- {file = "msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701"},
- {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6"},
- {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59"},
- {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0"},
- {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e"},
- {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6"},
- {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5"},
- {file = "msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88"},
- {file = "msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"},
- {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d"},
- {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2"},
- {file = "msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420"},
- {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2"},
- {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39"},
- {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f"},
- {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247"},
- {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c"},
- {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b"},
- {file = "msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b"},
- {file = "msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f"},
- {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf"},
- {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330"},
- {file = "msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734"},
- {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e"},
- {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca"},
- {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915"},
- {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d"},
- {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434"},
- {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c"},
- {file = "msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc"},
- {file = "msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f"},
- {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec"},
- {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96"},
- {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870"},
- {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7"},
- {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb"},
- {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f"},
- {file = "msgpack-1.1.0-cp38-cp38-win32.whl", hash = "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b"},
- {file = "msgpack-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb"},
- {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1"},
- {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48"},
- {file = "msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c"},
- {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468"},
- {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74"},
- {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846"},
- {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346"},
- {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b"},
- {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8"},
- {file = "msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd"},
- {file = "msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325"},
- {file = "msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e"},
+ {file = "msgpack-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:353b6fc0c36fde68b661a12949d7d49f8f51ff5fa019c1e47c87c4ff34b080ed"},
+ {file = "msgpack-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:79c408fcf76a958491b4e3b103d1c417044544b68e96d06432a189b43d1215c8"},
+ {file = "msgpack-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78426096939c2c7482bf31ef15ca219a9e24460289c00dd0b94411040bb73ad2"},
+ {file = "msgpack-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b17ba27727a36cb73aabacaa44b13090feb88a01d012c0f4be70c00f75048b4"},
+ {file = "msgpack-1.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a17ac1ea6ec3c7687d70201cfda3b1e8061466f28f686c24f627cae4ea8efd0"},
+ {file = "msgpack-1.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:88d1e966c9235c1d4e2afac21ca83933ba59537e2e2727a999bf3f515ca2af26"},
+ {file = "msgpack-1.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f6d58656842e1b2ddbe07f43f56b10a60f2ba5826164910968f5933e5178af75"},
+ {file = "msgpack-1.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96decdfc4adcbc087f5ea7ebdcfd3dee9a13358cae6e81d54be962efc38f6338"},
+ {file = "msgpack-1.1.1-cp310-cp310-win32.whl", hash = "sha256:6640fd979ca9a212e4bcdf6eb74051ade2c690b862b679bfcb60ae46e6dc4bfd"},
+ {file = "msgpack-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:8b65b53204fe1bd037c40c4148d00ef918eb2108d24c9aaa20bc31f9810ce0a8"},
+ {file = "msgpack-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:71ef05c1726884e44f8b1d1773604ab5d4d17729d8491403a705e649116c9558"},
+ {file = "msgpack-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36043272c6aede309d29d56851f8841ba907a1a3d04435e43e8a19928e243c1d"},
+ {file = "msgpack-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a32747b1b39c3ac27d0670122b57e6e57f28eefb725e0b625618d1b59bf9d1e0"},
+ {file = "msgpack-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a8b10fdb84a43e50d38057b06901ec9da52baac6983d3f709d8507f3889d43f"},
+ {file = "msgpack-1.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0c325c3f485dc54ec298d8b024e134acf07c10d494ffa24373bea729acf704"},
+ {file = "msgpack-1.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:88daaf7d146e48ec71212ce21109b66e06a98e5e44dca47d853cbfe171d6c8d2"},
+ {file = "msgpack-1.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8b55ea20dc59b181d3f47103f113e6f28a5e1c89fd5b67b9140edb442ab67f2"},
+ {file = "msgpack-1.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a28e8072ae9779f20427af07f53bbb8b4aa81151054e882aee333b158da8752"},
+ {file = "msgpack-1.1.1-cp311-cp311-win32.whl", hash = "sha256:7da8831f9a0fdb526621ba09a281fadc58ea12701bc709e7b8cbc362feabc295"},
+ {file = "msgpack-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fd1b58e1431008a57247d6e7cc4faa41c3607e8e7d4aaf81f7c29ea013cb458"},
+ {file = "msgpack-1.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae497b11f4c21558d95de9f64fff7053544f4d1a17731c866143ed6bb4591238"},
+ {file = "msgpack-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:33be9ab121df9b6b461ff91baac6f2731f83d9b27ed948c5b9d1978ae28bf157"},
+ {file = "msgpack-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f64ae8fe7ffba251fecb8408540c34ee9df1c26674c50c4544d72dbf792e5ce"},
+ {file = "msgpack-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a494554874691720ba5891c9b0b39474ba43ffb1aaf32a5dac874effb1619e1a"},
+ {file = "msgpack-1.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb643284ab0ed26f6957d969fe0dd8bb17beb567beb8998140b5e38a90974f6c"},
+ {file = "msgpack-1.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d275a9e3c81b1093c060c3837e580c37f47c51eca031f7b5fb76f7b8470f5f9b"},
+ {file = "msgpack-1.1.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4fd6b577e4541676e0cc9ddc1709d25014d3ad9a66caa19962c4f5de30fc09ef"},
+ {file = "msgpack-1.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb29aaa613c0a1c40d1af111abf025f1732cab333f96f285d6a93b934738a68a"},
+ {file = "msgpack-1.1.1-cp312-cp312-win32.whl", hash = "sha256:870b9a626280c86cff9c576ec0d9cbcc54a1e5ebda9cd26dab12baf41fee218c"},
+ {file = "msgpack-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:5692095123007180dca3e788bb4c399cc26626da51629a31d40207cb262e67f4"},
+ {file = "msgpack-1.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3765afa6bd4832fc11c3749be4ba4b69a0e8d7b728f78e68120a157a4c5d41f0"},
+ {file = "msgpack-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8ddb2bcfd1a8b9e431c8d6f4f7db0773084e107730ecf3472f1dfe9ad583f3d9"},
+ {file = "msgpack-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:196a736f0526a03653d829d7d4c5500a97eea3648aebfd4b6743875f28aa2af8"},
+ {file = "msgpack-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d592d06e3cc2f537ceeeb23d38799c6ad83255289bb84c2e5792e5a8dea268a"},
+ {file = "msgpack-1.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4df2311b0ce24f06ba253fda361f938dfecd7b961576f9be3f3fbd60e87130ac"},
+ {file = "msgpack-1.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e4141c5a32b5e37905b5940aacbc59739f036930367d7acce7a64e4dec1f5e0b"},
+ {file = "msgpack-1.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b1ce7f41670c5a69e1389420436f41385b1aa2504c3b0c30620764b15dded2e7"},
+ {file = "msgpack-1.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4147151acabb9caed4e474c3344181e91ff7a388b888f1e19ea04f7e73dc7ad5"},
+ {file = "msgpack-1.1.1-cp313-cp313-win32.whl", hash = "sha256:500e85823a27d6d9bba1d057c871b4210c1dd6fb01fbb764e37e4e8847376323"},
+ {file = "msgpack-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:6d489fba546295983abd142812bda76b57e33d0b9f5d5b71c09a583285506f69"},
+ {file = "msgpack-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bba1be28247e68994355e028dcd668316db30c1f758d3241a7b903ac78dcd285"},
+ {file = "msgpack-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8f93dcddb243159c9e4109c9750ba5b335ab8d48d9522c5308cd05d7e3ce600"},
+ {file = "msgpack-1.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fbbc0b906a24038c9958a1ba7ae0918ad35b06cb449d398b76a7d08470b0ed9"},
+ {file = "msgpack-1.1.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:61e35a55a546a1690d9d09effaa436c25ae6130573b6ee9829c37ef0f18d5e78"},
+ {file = "msgpack-1.1.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:1abfc6e949b352dadf4bce0eb78023212ec5ac42f6abfd469ce91d783c149c2a"},
+ {file = "msgpack-1.1.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:996f2609ddf0142daba4cefd767d6db26958aac8439ee41db9cc0db9f4c4c3a6"},
+ {file = "msgpack-1.1.1-cp38-cp38-win32.whl", hash = "sha256:4d3237b224b930d58e9d83c81c0dba7aacc20fcc2f89c1e5423aa0529a4cd142"},
+ {file = "msgpack-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:da8f41e602574ece93dbbda1fab24650d6bf2a24089f9e9dbb4f5730ec1e58ad"},
+ {file = "msgpack-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5be6b6bc52fad84d010cb45433720327ce886009d862f46b26d4d154001994b"},
+ {file = "msgpack-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3a89cd8c087ea67e64844287ea52888239cbd2940884eafd2dcd25754fb72232"},
+ {file = "msgpack-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d75f3807a9900a7d575d8d6674a3a47e9f227e8716256f35bc6f03fc597ffbf"},
+ {file = "msgpack-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d182dac0221eb8faef2e6f44701812b467c02674a322c739355c39e94730cdbf"},
+ {file = "msgpack-1.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b13fe0fb4aac1aa5320cd693b297fe6fdef0e7bea5518cbc2dd5299f873ae90"},
+ {file = "msgpack-1.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:435807eeb1bc791ceb3247d13c79868deb22184e1fc4224808750f0d7d1affc1"},
+ {file = "msgpack-1.1.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4835d17af722609a45e16037bb1d4d78b7bdf19d6c0128116d178956618c4e88"},
+ {file = "msgpack-1.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a8ef6e342c137888ebbfb233e02b8fbd689bb5b5fcc59b34711ac47ebd504478"},
+ {file = "msgpack-1.1.1-cp39-cp39-win32.whl", hash = "sha256:61abccf9de335d9efd149e2fff97ed5974f2481b3353772e8e2dd3402ba2bd57"},
+ {file = "msgpack-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:40eae974c873b2992fd36424a5d9407f93e97656d999f43fca9d29f820899084"},
+ {file = "msgpack-1.1.1.tar.gz", hash = "sha256:77b79ce34a2bdab2594f490c8e80dd62a02d650b91a75159a63ec413b8d104cd"},
]
[[package]]
name = "mypy"
-version = "1.16.0"
+version = "1.16.1"
description = "Optional static typing for Python"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "mypy-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7909541fef256527e5ee9c0a7e2aeed78b6cda72ba44298d1334fe7881b05c5c"},
- {file = "mypy-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e71d6f0090c2256c713ed3d52711d01859c82608b5d68d4fa01a3fe30df95571"},
- {file = "mypy-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:936ccfdd749af4766be824268bfe22d1db9eb2f34a3ea1d00ffbe5b5265f5491"},
- {file = "mypy-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4086883a73166631307fdd330c4a9080ce24913d4f4c5ec596c601b3a4bdd777"},
- {file = "mypy-1.16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:feec38097f71797da0231997e0de3a58108c51845399669ebc532c815f93866b"},
- {file = "mypy-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:09a8da6a0ee9a9770b8ff61b39c0bb07971cda90e7297f4213741b48a0cc8d93"},
- {file = "mypy-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9f826aaa7ff8443bac6a494cf743f591488ea940dd360e7dd330e30dd772a5ab"},
- {file = "mypy-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82d056e6faa508501af333a6af192c700b33e15865bda49611e3d7d8358ebea2"},
- {file = "mypy-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:089bedc02307c2548eb51f426e085546db1fa7dd87fbb7c9fa561575cf6eb1ff"},
- {file = "mypy-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6a2322896003ba66bbd1318c10d3afdfe24e78ef12ea10e2acd985e9d684a666"},
- {file = "mypy-1.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:021a68568082c5b36e977d54e8f1de978baf401a33884ffcea09bd8e88a98f4c"},
- {file = "mypy-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:54066fed302d83bf5128632d05b4ec68412e1f03ef2c300434057d66866cea4b"},
- {file = "mypy-1.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c5436d11e89a3ad16ce8afe752f0f373ae9620841c50883dc96f8b8805620b13"},
- {file = "mypy-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f2622af30bf01d8fc36466231bdd203d120d7a599a6d88fb22bdcb9dbff84090"},
- {file = "mypy-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d045d33c284e10a038f5e29faca055b90eee87da3fc63b8889085744ebabb5a1"},
- {file = "mypy-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b4968f14f44c62e2ec4a038c8797a87315be8df7740dc3ee8d3bfe1c6bf5dba8"},
- {file = "mypy-1.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb14a4a871bb8efb1e4a50360d4e3c8d6c601e7a31028a2c79f9bb659b63d730"},
- {file = "mypy-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:bd4e1ebe126152a7bbaa4daedd781c90c8f9643c79b9748caa270ad542f12bec"},
- {file = "mypy-1.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a9e056237c89f1587a3be1a3a70a06a698d25e2479b9a2f57325ddaaffc3567b"},
- {file = "mypy-1.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b07e107affb9ee6ce1f342c07f51552d126c32cd62955f59a7db94a51ad12c0"},
- {file = "mypy-1.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c6fb60cbd85dc65d4d63d37cb5c86f4e3a301ec605f606ae3a9173e5cf34997b"},
- {file = "mypy-1.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7e32297a437cc915599e0578fa6bc68ae6a8dc059c9e009c628e1c47f91495d"},
- {file = "mypy-1.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:afe420c9380ccec31e744e8baff0d406c846683681025db3531b32db56962d52"},
- {file = "mypy-1.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:55f9076c6ce55dd3f8cd0c6fff26a008ca8e5131b89d5ba6d86bd3f47e736eeb"},
- {file = "mypy-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f56236114c425620875c7cf71700e3d60004858da856c6fc78998ffe767b73d3"},
- {file = "mypy-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:15486beea80be24ff067d7d0ede673b001d0d684d0095803b3e6e17a886a2a92"},
- {file = "mypy-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f2ed0e0847a80655afa2c121835b848ed101cc7b8d8d6ecc5205aedc732b1436"},
- {file = "mypy-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb5fbc8063cb4fde7787e4c0406aa63094a34a2daf4673f359a1fb64050e9cb2"},
- {file = "mypy-1.16.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a5fcfdb7318c6a8dd127b14b1052743b83e97a970f0edb6c913211507a255e20"},
- {file = "mypy-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:2e7e0ad35275e02797323a5aa1be0b14a4d03ffdb2e5f2b0489fa07b89c67b21"},
- {file = "mypy-1.16.0-py3-none-any.whl", hash = "sha256:29e1499864a3888bca5c1542f2d7232c6e586295183320caa95758fc84034031"},
- {file = "mypy-1.16.0.tar.gz", hash = "sha256:84b94283f817e2aa6350a14b4a8fb2a35a53c286f97c9d30f53b63620e7af8ab"},
+ {file = "mypy-1.16.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b4f0fed1022a63c6fec38f28b7fc77fca47fd490445c69d0a66266c59dd0b88a"},
+ {file = "mypy-1.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86042bbf9f5a05ea000d3203cf87aa9d0ccf9a01f73f71c58979eb9249f46d72"},
+ {file = "mypy-1.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ea7469ee5902c95542bea7ee545f7006508c65c8c54b06dc2c92676ce526f3ea"},
+ {file = "mypy-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:352025753ef6a83cb9e7f2427319bb7875d1fdda8439d1e23de12ab164179574"},
+ {file = "mypy-1.16.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ff9fa5b16e4c1364eb89a4d16bcda9987f05d39604e1e6c35378a2987c1aac2d"},
+ {file = "mypy-1.16.1-cp310-cp310-win_amd64.whl", hash = "sha256:1256688e284632382f8f3b9e2123df7d279f603c561f099758e66dd6ed4e8bd6"},
+ {file = "mypy-1.16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:472e4e4c100062488ec643f6162dd0d5208e33e2f34544e1fc931372e806c0cc"},
+ {file = "mypy-1.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea16e2a7d2714277e349e24d19a782a663a34ed60864006e8585db08f8ad1782"},
+ {file = "mypy-1.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08e850ea22adc4d8a4014651575567b0318ede51e8e9fe7a68f25391af699507"},
+ {file = "mypy-1.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22d76a63a42619bfb90122889b903519149879ddbf2ba4251834727944c8baca"},
+ {file = "mypy-1.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c7ce0662b6b9dc8f4ed86eb7a5d505ee3298c04b40ec13b30e572c0e5ae17c4"},
+ {file = "mypy-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:211287e98e05352a2e1d4e8759c5490925a7c784ddc84207f4714822f8cf99b6"},
+ {file = "mypy-1.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:af4792433f09575d9eeca5c63d7d90ca4aeceda9d8355e136f80f8967639183d"},
+ {file = "mypy-1.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66df38405fd8466ce3517eda1f6640611a0b8e70895e2a9462d1d4323c5eb4b9"},
+ {file = "mypy-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44e7acddb3c48bd2713994d098729494117803616e116032af192871aed80b79"},
+ {file = "mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15"},
+ {file = "mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd"},
+ {file = "mypy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f0435cf920e287ff68af3d10a118a73f212deb2ce087619eb4e648116d1fe9b"},
+ {file = "mypy-1.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ddc91eb318c8751c69ddb200a5937f1232ee8efb4e64e9f4bc475a33719de438"},
+ {file = "mypy-1.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87ff2c13d58bdc4bbe7dc0dedfe622c0f04e2cb2a492269f3b418df2de05c536"},
+ {file = "mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f"},
+ {file = "mypy-1.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:051e1677689c9d9578b9c7f4d206d763f9bbd95723cd1416fad50db49d52f359"},
+ {file = "mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be"},
+ {file = "mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee"},
+ {file = "mypy-1.16.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7fc688329af6a287567f45cc1cefb9db662defeb14625213a5b7da6e692e2069"},
+ {file = "mypy-1.16.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e198ab3f55924c03ead626ff424cad1732d0d391478dfbf7bb97b34602395da"},
+ {file = "mypy-1.16.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09aa4f91ada245f0a45dbc47e548fd94e0dd5a8433e0114917dc3b526912a30c"},
+ {file = "mypy-1.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13c7cd5b1cb2909aa318a90fd1b7e31f17c50b242953e7dd58345b2a814f6383"},
+ {file = "mypy-1.16.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:58e07fb958bc5d752a280da0e890c538f1515b79a65757bbdc54252ba82e0b40"},
+ {file = "mypy-1.16.1-cp39-cp39-win_amd64.whl", hash = "sha256:f895078594d918f93337a505f8add9bd654d1a24962b4c6ed9390e12531eb31b"},
+ {file = "mypy-1.16.1-py3-none-any.whl", hash = "sha256:5fc2ac4027d0ef28d6ba69a0343737a23c4d1b83672bf38d1fe237bdc0643b37"},
+ {file = "mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab"},
]
[package.dependencies]
@@ -2338,23 +2339,23 @@ testing = ["google-api-core (>=1.31.5)"]
[[package]]
name = "protobuf"
-version = "4.25.8"
+version = "4.25.3"
description = ""
optional = false
python-versions = ">=3.8"
groups = ["main", "dev"]
files = [
- {file = "protobuf-4.25.8-cp310-abi3-win32.whl", hash = "sha256:504435d831565f7cfac9f0714440028907f1975e4bed228e58e72ecfff58a1e0"},
- {file = "protobuf-4.25.8-cp310-abi3-win_amd64.whl", hash = "sha256:bd551eb1fe1d7e92c1af1d75bdfa572eff1ab0e5bf1736716814cdccdb2360f9"},
- {file = "protobuf-4.25.8-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:ca809b42f4444f144f2115c4c1a747b9a404d590f18f37e9402422033e464e0f"},
- {file = "protobuf-4.25.8-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:9ad7ef62d92baf5a8654fbb88dac7fa5594cfa70fd3440488a5ca3bfc6d795a7"},
- {file = "protobuf-4.25.8-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:83e6e54e93d2b696a92cad6e6efc924f3850f82b52e1563778dfab8b355101b0"},
- {file = "protobuf-4.25.8-cp38-cp38-win32.whl", hash = "sha256:27d498ffd1f21fb81d987a041c32d07857d1d107909f5134ba3350e1ce80a4af"},
- {file = "protobuf-4.25.8-cp38-cp38-win_amd64.whl", hash = "sha256:d552c53d0415449c8d17ced5c341caba0d89dbf433698e1436c8fa0aae7808a3"},
- {file = "protobuf-4.25.8-cp39-cp39-win32.whl", hash = "sha256:077ff8badf2acf8bc474406706ad890466274191a48d0abd3bd6987107c9cde5"},
- {file = "protobuf-4.25.8-cp39-cp39-win_amd64.whl", hash = "sha256:f4510b93a3bec6eba8fd8f1093e9d7fb0d4a24d1a81377c10c0e5bbfe9e4ed24"},
- {file = "protobuf-4.25.8-py3-none-any.whl", hash = "sha256:15a0af558aa3b13efef102ae6e4f3efac06f1eea11afb3a57db2901447d9fb59"},
- {file = "protobuf-4.25.8.tar.gz", hash = "sha256:6135cf8affe1fc6f76cced2641e4ea8d3e59518d1f24ae41ba97bcad82d397cd"},
+ {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"},
+ {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"},
+ {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"},
+ {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"},
+ {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"},
+ {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"},
+ {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"},
+ {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"},
+ {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"},
+ {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"},
+ {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"},
]
[[package]]
@@ -2467,14 +2468,14 @@ files = [
[[package]]
name = "pydantic"
-version = "2.11.5"
+version = "2.11.7"
description = "Data validation using Python type hints"
optional = false
python-versions = ">=3.9"
groups = ["main", "dev"]
files = [
- {file = "pydantic-2.11.5-py3-none-any.whl", hash = "sha256:f9c26ba06f9747749ca1e5c94d6a85cb84254577553c8785576fd38fa64dc0f7"},
- {file = "pydantic-2.11.5.tar.gz", hash = "sha256:7f853db3d0ce78ce8bbb148c401c2cdd6431b3473c0cdff2755c7690952a7b7a"},
+ {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"},
+ {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"},
]
[package.dependencies]
@@ -2669,14 +2670,14 @@ hook-testing = ["execnet (>=1.5.0)", "psutil", "pytest (>=2.7.3)"]
[[package]]
name = "pyinstaller-hooks-contrib"
-version = "2025.4"
+version = "2025.5"
description = "Community maintained hooks for PyInstaller"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "pyinstaller_hooks_contrib-2025.4-py3-none-any.whl", hash = "sha256:6c2d73269b4c484eb40051fc1acee0beb113c2cfb3b37437b8394faae6f0d072"},
- {file = "pyinstaller_hooks_contrib-2025.4.tar.gz", hash = "sha256:5ce1afd1997b03e70f546207031cfdf2782030aabacc102190677059e2856446"},
+ {file = "pyinstaller_hooks_contrib-2025.5-py3-none-any.whl", hash = "sha256:ebfae1ba341cb0002fb2770fad0edf2b3e913c2728d92df7ad562260988ca373"},
+ {file = "pyinstaller_hooks_contrib-2025.5.tar.gz", hash = "sha256:707386770b8fe066c04aad18a71bc483c7b25e18b4750a756999f7da2ab31982"},
]
[package.dependencies]
@@ -2700,8 +2701,8 @@ files = [
astroid = ">=2.12.13,<=2.14.0-dev0"
colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""}
dill = [
- {version = ">=0.2", markers = "python_version < \"3.11\""},
{version = ">=0.3.6", markers = "python_version >= \"3.11\""},
+ {version = ">=0.2", markers = "python_version < \"3.11\""},
]
isort = ">=4.2.5,<6"
mccabe = ">=0.6,<0.8"
@@ -2962,105 +2963,91 @@ pyyaml = "*"
[[package]]
name = "pyzmq"
-version = "26.4.0"
+version = "27.0.0"
description = "Python bindings for 0MQ"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "pyzmq-26.4.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:0329bdf83e170ac133f44a233fc651f6ed66ef8e66693b5af7d54f45d1ef5918"},
- {file = "pyzmq-26.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:398a825d2dea96227cf6460ce0a174cf7657d6f6827807d4d1ae9d0f9ae64315"},
- {file = "pyzmq-26.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d52d62edc96787f5c1dfa6c6ccff9b581cfae5a70d94ec4c8da157656c73b5b"},
- {file = "pyzmq-26.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1410c3a3705db68d11eb2424d75894d41cff2f64d948ffe245dd97a9debfebf4"},
- {file = "pyzmq-26.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:7dacb06a9c83b007cc01e8e5277f94c95c453c5851aac5e83efe93e72226353f"},
- {file = "pyzmq-26.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6bab961c8c9b3a4dc94d26e9b2cdf84de9918931d01d6ff38c721a83ab3c0ef5"},
- {file = "pyzmq-26.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a5c09413b924d96af2aa8b57e76b9b0058284d60e2fc3730ce0f979031d162a"},
- {file = "pyzmq-26.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7d489ac234d38e57f458fdbd12a996bfe990ac028feaf6f3c1e81ff766513d3b"},
- {file = "pyzmq-26.4.0-cp310-cp310-win32.whl", hash = "sha256:dea1c8db78fb1b4b7dc9f8e213d0af3fc8ecd2c51a1d5a3ca1cde1bda034a980"},
- {file = "pyzmq-26.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:fa59e1f5a224b5e04dc6c101d7186058efa68288c2d714aa12d27603ae93318b"},
- {file = "pyzmq-26.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:a651fe2f447672f4a815e22e74630b6b1ec3a1ab670c95e5e5e28dcd4e69bbb5"},
- {file = "pyzmq-26.4.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:bfcf82644c9b45ddd7cd2a041f3ff8dce4a0904429b74d73a439e8cab1bd9e54"},
- {file = "pyzmq-26.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9bcae3979b2654d5289d3490742378b2f3ce804b0b5fd42036074e2bf35b030"},
- {file = "pyzmq-26.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccdff8ac4246b6fb60dcf3982dfaeeff5dd04f36051fe0632748fc0aa0679c01"},
- {file = "pyzmq-26.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4550af385b442dc2d55ab7717837812799d3674cb12f9a3aa897611839c18e9e"},
- {file = "pyzmq-26.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f7ffe9db1187a253fca95191854b3fda24696f086e8789d1d449308a34b88"},
- {file = "pyzmq-26.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3709c9ff7ba61589b7372923fd82b99a81932b592a5c7f1a24147c91da9a68d6"},
- {file = "pyzmq-26.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f8f3c30fb2d26ae5ce36b59768ba60fb72507ea9efc72f8f69fa088450cff1df"},
- {file = "pyzmq-26.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:382a4a48c8080e273427fc692037e3f7d2851959ffe40864f2db32646eeb3cef"},
- {file = "pyzmq-26.4.0-cp311-cp311-win32.whl", hash = "sha256:d56aad0517d4c09e3b4f15adebba8f6372c5102c27742a5bdbfc74a7dceb8fca"},
- {file = "pyzmq-26.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:963977ac8baed7058c1e126014f3fe58b3773f45c78cce7af5c26c09b6823896"},
- {file = "pyzmq-26.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0c8e8cadc81e44cc5088fcd53b9b3b4ce9344815f6c4a03aec653509296fae3"},
- {file = "pyzmq-26.4.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:5227cb8da4b6f68acfd48d20c588197fd67745c278827d5238c707daf579227b"},
- {file = "pyzmq-26.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1c07a7fa7f7ba86554a2b1bef198c9fed570c08ee062fd2fd6a4dcacd45f905"},
- {file = "pyzmq-26.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae775fa83f52f52de73183f7ef5395186f7105d5ed65b1ae65ba27cb1260de2b"},
- {file = "pyzmq-26.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c760d0226ebd52f1e6b644a9e839b5db1e107a23f2fcd46ec0569a4fdd4e63"},
- {file = "pyzmq-26.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ef8c6ecc1d520debc147173eaa3765d53f06cd8dbe7bd377064cdbc53ab456f5"},
- {file = "pyzmq-26.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3150ef4084e163dec29ae667b10d96aad309b668fac6810c9e8c27cf543d6e0b"},
- {file = "pyzmq-26.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4448c9e55bf8329fa1dcedd32f661bf611214fa70c8e02fee4347bc589d39a84"},
- {file = "pyzmq-26.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e07dde3647afb084d985310d067a3efa6efad0621ee10826f2cb2f9a31b89d2f"},
- {file = "pyzmq-26.4.0-cp312-cp312-win32.whl", hash = "sha256:ba034a32ecf9af72adfa5ee383ad0fd4f4e38cdb62b13624278ef768fe5b5b44"},
- {file = "pyzmq-26.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be"},
- {file = "pyzmq-26.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f23c750e485ce1eb639dbd576d27d168595908aa2d60b149e2d9e34c9df40e0"},
- {file = "pyzmq-26.4.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:c43fac689880f5174d6fc864857d1247fe5cfa22b09ed058a344ca92bf5301e3"},
- {file = "pyzmq-26.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902aca7eba477657c5fb81c808318460328758e8367ecdd1964b6330c73cae43"},
- {file = "pyzmq-26.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e48a830bfd152fe17fbdeaf99ac5271aa4122521bf0d275b6b24e52ef35eb6"},
- {file = "pyzmq-26.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31be2b6de98c824c06f5574331f805707c667dc8f60cb18580b7de078479891e"},
- {file = "pyzmq-26.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6332452034be001bbf3206ac59c0d2a7713de5f25bb38b06519fc6967b7cf771"},
- {file = "pyzmq-26.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:da8c0f5dd352136853e6a09b1b986ee5278dfddfebd30515e16eae425c872b30"},
- {file = "pyzmq-26.4.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f4ccc1a0a2c9806dda2a2dd118a3b7b681e448f3bb354056cad44a65169f6d86"},
- {file = "pyzmq-26.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c0b5fceadbab461578daf8d1dcc918ebe7ddd2952f748cf30c7cf2de5d51101"},
- {file = "pyzmq-26.4.0-cp313-cp313-win32.whl", hash = "sha256:28e2b0ff5ba4b3dd11062d905682bad33385cfa3cc03e81abd7f0822263e6637"},
- {file = "pyzmq-26.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b"},
- {file = "pyzmq-26.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:1edb0385c7f025045d6e0f759d4d3afe43c17a3d898914ec6582e6f464203c08"},
- {file = "pyzmq-26.4.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:93a29e882b2ba1db86ba5dd5e88e18e0ac6b627026c5cfbec9983422011b82d4"},
- {file = "pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45684f276f57110bb89e4300c00f1233ca631f08f5f42528a5c408a79efc4a"},
- {file = "pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72073e75260cb301aad4258ad6150fa7f57c719b3f498cb91e31df16784d89b"},
- {file = "pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be37e24b13026cfedd233bcbbccd8c0bcd2fdd186216094d095f60076201538d"},
- {file = "pyzmq-26.4.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:237b283044934d26f1eeff4075f751b05d2f3ed42a257fc44386d00df6a270cf"},
- {file = "pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b30f862f6768b17040929a68432c8a8be77780317f45a353cb17e423127d250c"},
- {file = "pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:c80fcd3504232f13617c6ab501124d373e4895424e65de8b72042333316f64a8"},
- {file = "pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:26a2a7451606b87f67cdeca2c2789d86f605da08b4bd616b1a9981605ca3a364"},
- {file = "pyzmq-26.4.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:831cc53bf6068d46d942af52fa8b0b9d128fb39bcf1f80d468dc9a3ae1da5bfb"},
- {file = "pyzmq-26.4.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:51d18be6193c25bd229524cfac21e39887c8d5e0217b1857998dfbef57c070a4"},
- {file = "pyzmq-26.4.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:445c97854204119ae2232503585ebb4fa7517142f71092cb129e5ee547957a1f"},
- {file = "pyzmq-26.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:807b8f4ad3e6084412c0f3df0613269f552110fa6fb91743e3e306223dbf11a6"},
- {file = "pyzmq-26.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c01d109dd675ac47fa15c0a79d256878d898f90bc10589f808b62d021d2e653c"},
- {file = "pyzmq-26.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0a294026e28679a8dd64c922e59411cb586dad307661b4d8a5c49e7bbca37621"},
- {file = "pyzmq-26.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:22c8dd677274af8dfb1efd05006d6f68fb2f054b17066e308ae20cb3f61028cf"},
- {file = "pyzmq-26.4.0-cp38-cp38-win32.whl", hash = "sha256:14fc678b696bc42c14e2d7f86ac4e97889d5e6b94d366ebcb637a768d2ad01af"},
- {file = "pyzmq-26.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:d1ef0a536662bbbdc8525f7e2ef19e74123ec9c4578e0582ecd41aedc414a169"},
- {file = "pyzmq-26.4.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:a88643de8abd000ce99ca72056a1a2ae15881ee365ecb24dd1d9111e43d57842"},
- {file = "pyzmq-26.4.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a744ce209ecb557406fb928f3c8c55ce79b16c3eeb682da38ef5059a9af0848"},
- {file = "pyzmq-26.4.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9434540f333332224ecb02ee6278b6c6f11ea1266b48526e73c903119b2f420f"},
- {file = "pyzmq-26.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6c6f0a23e55cd38d27d4c89add963294ea091ebcb104d7fdab0f093bc5abb1c"},
- {file = "pyzmq-26.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6145df55dc2309f6ef72d70576dcd5aabb0fd373311613fe85a5e547c722b780"},
- {file = "pyzmq-26.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2ea81823840ef8c56e5d2f9918e4d571236294fea4d1842b302aebffb9e40997"},
- {file = "pyzmq-26.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc2abc385dc37835445abe206524fbc0c9e3fce87631dfaa90918a1ba8f425eb"},
- {file = "pyzmq-26.4.0-cp39-cp39-win32.whl", hash = "sha256:41a2508fe7bed4c76b4cf55aacfb8733926f59d440d9ae2b81ee8220633b4d12"},
- {file = "pyzmq-26.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:d4000e8255d6cbce38982e5622ebb90823f3409b7ffe8aeae4337ef7d6d2612a"},
- {file = "pyzmq-26.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:b4f6919d9c120488246bdc2a2f96662fa80d67b35bd6d66218f457e722b3ff64"},
- {file = "pyzmq-26.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:98d948288ce893a2edc5ec3c438fe8de2daa5bbbd6e2e865ec5f966e237084ba"},
- {file = "pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9f34f5c9e0203ece706a1003f1492a56c06c0632d86cb77bcfe77b56aacf27b"},
- {file = "pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80c9b48aef586ff8b698359ce22f9508937c799cc1d2c9c2f7c95996f2300c94"},
- {file = "pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3f2a5b74009fd50b53b26f65daff23e9853e79aa86e0aa08a53a7628d92d44a"},
- {file = "pyzmq-26.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:61c5f93d7622d84cb3092d7f6398ffc77654c346545313a3737e266fc11a3beb"},
- {file = "pyzmq-26.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4478b14cb54a805088299c25a79f27eaf530564a7a4f72bf432a040042b554eb"},
- {file = "pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a28ac29c60e4ba84b5f58605ace8ad495414a724fe7aceb7cf06cd0598d04e1"},
- {file = "pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43b03c1ceea27c6520124f4fb2ba9c647409b9abdf9a62388117148a90419494"},
- {file = "pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7731abd23a782851426d4e37deb2057bf9410848a4459b5ede4fe89342e687a9"},
- {file = "pyzmq-26.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a222ad02fbe80166b0526c038776e8042cd4e5f0dec1489a006a1df47e9040e0"},
- {file = "pyzmq-26.4.0-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:91c3ffaea475ec8bb1a32d77ebc441dcdd13cd3c4c284a6672b92a0f5ade1917"},
- {file = "pyzmq-26.4.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d9a78a52668bf5c9e7b0da36aa5760a9fc3680144e1445d68e98df78a25082ed"},
- {file = "pyzmq-26.4.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b70cab356ff8c860118b89dc86cd910c73ce2127eb986dada4fbac399ef644cf"},
- {file = "pyzmq-26.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acae207d4387780838192326b32d373bb286da0b299e733860e96f80728eb0af"},
- {file = "pyzmq-26.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f928eafd15794aa4be75463d537348b35503c1e014c5b663f206504ec1a90fe4"},
- {file = "pyzmq-26.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:552b0d2e39987733e1e9e948a0ced6ff75e0ea39ab1a1db2fc36eb60fd8760db"},
- {file = "pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd670a8aa843f2ee637039bbd412e0d7294a5e588e1ecc9ad98b0cdc050259a4"},
- {file = "pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d367b7b775a0e1e54a59a2ba3ed4d5e0a31566af97cc9154e34262777dab95ed"},
- {file = "pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112af16c406e4a93df2caef49f884f4c2bb2b558b0b5577ef0b2465d15c1abc"},
- {file = "pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c76c298683f82669cab0b6da59071f55238c039738297c69f187a542c6d40099"},
- {file = "pyzmq-26.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:49b6ca2e625b46f499fb081aaf7819a177f41eeb555acb05758aa97f4f95d147"},
- {file = "pyzmq-26.4.0.tar.gz", hash = "sha256:4bd13f85f80962f91a651a7356fe0472791a5f7a92f227822b5acf44795c626d"},
+ {file = "pyzmq-27.0.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:b973ee650e8f442ce482c1d99ca7ab537c69098d53a3d046676a484fd710c87a"},
+ {file = "pyzmq-27.0.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:661942bc7cd0223d569d808f2e5696d9cc120acc73bf3e88a1f1be7ab648a7e4"},
+ {file = "pyzmq-27.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50360fb2a056ffd16e5f4177eee67f1dd1017332ea53fb095fe7b5bf29c70246"},
+ {file = "pyzmq-27.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf209a6dc4b420ed32a7093642843cbf8703ed0a7d86c16c0b98af46762ebefb"},
+ {file = "pyzmq-27.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c2dace4a7041cca2fba5357a2d7c97c5effdf52f63a1ef252cfa496875a3762d"},
+ {file = "pyzmq-27.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:63af72b2955fc77caf0a77444baa2431fcabb4370219da38e1a9f8d12aaebe28"},
+ {file = "pyzmq-27.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e8c4adce8e37e75c4215297d7745551b8dcfa5f728f23ce09bf4e678a9399413"},
+ {file = "pyzmq-27.0.0-cp310-cp310-win32.whl", hash = "sha256:5d5ef4718ecab24f785794e0e7536436698b459bfbc19a1650ef55280119d93b"},
+ {file = "pyzmq-27.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:e40609380480b3d12c30f841323f42451c755b8fece84235236f5fe5ffca8c1c"},
+ {file = "pyzmq-27.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6b0397b0be277b46762956f576e04dc06ced265759e8c2ff41a0ee1aa0064198"},
+ {file = "pyzmq-27.0.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:21457825249b2a53834fa969c69713f8b5a79583689387a5e7aed880963ac564"},
+ {file = "pyzmq-27.0.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1958947983fef513e6e98eff9cb487b60bf14f588dc0e6bf35fa13751d2c8251"},
+ {file = "pyzmq-27.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0dc628b5493f9a8cd9844b8bee9732ef587ab00002157c9329e4fc0ef4d3afa"},
+ {file = "pyzmq-27.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7bbe9e1ed2c8d3da736a15694d87c12493e54cc9dc9790796f0321794bbc91f"},
+ {file = "pyzmq-27.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dc1091f59143b471d19eb64f54bae4f54bcf2a466ffb66fe45d94d8d734eb495"},
+ {file = "pyzmq-27.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7011ade88c8e535cf140f8d1a59428676fbbce7c6e54fefce58bf117aefb6667"},
+ {file = "pyzmq-27.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c386339d7e3f064213aede5d03d054b237937fbca6dd2197ac8cf3b25a6b14e"},
+ {file = "pyzmq-27.0.0-cp311-cp311-win32.whl", hash = "sha256:0546a720c1f407b2172cb04b6b094a78773491497e3644863cf5c96c42df8cff"},
+ {file = "pyzmq-27.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f39d50bd6c9091c67315ceb878a4f531957b121d2a05ebd077eb35ddc5efed"},
+ {file = "pyzmq-27.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c5817641eebb391a2268c27fecd4162448e03538387093cdbd8bf3510c316b38"},
+ {file = "pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52"},
+ {file = "pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3"},
+ {file = "pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152"},
+ {file = "pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22"},
+ {file = "pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371"},
+ {file = "pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d"},
+ {file = "pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be"},
+ {file = "pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4"},
+ {file = "pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371"},
+ {file = "pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e"},
+ {file = "pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688"},
+ {file = "pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38"},
+ {file = "pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a"},
+ {file = "pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9"},
+ {file = "pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d"},
+ {file = "pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44"},
+ {file = "pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef"},
+ {file = "pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad"},
+ {file = "pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f"},
+ {file = "pyzmq-27.0.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:f4162dbbd9c5c84fb930a36f290b08c93e35fce020d768a16fc8891a2f72bab8"},
+ {file = "pyzmq-27.0.0-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4e7d0a8d460fba526cc047333bdcbf172a159b8bd6be8c3eb63a416ff9ba1477"},
+ {file = "pyzmq-27.0.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:29f44e3c26b9783816ba9ce274110435d8f5b19bbd82f7a6c7612bb1452a3597"},
+ {file = "pyzmq-27.0.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e435540fa1da54667f0026cf1e8407fe6d8a11f1010b7f06b0b17214ebfcf5e"},
+ {file = "pyzmq-27.0.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:51f5726de3532b8222e569990c8aa34664faa97038304644679a51d906e60c6e"},
+ {file = "pyzmq-27.0.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:42c7555123679637c99205b1aa9e8f7d90fe29d4c243c719e347d4852545216c"},
+ {file = "pyzmq-27.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a979b7cf9e33d86c4949df527a3018767e5f53bc3b02adf14d4d8db1db63ccc0"},
+ {file = "pyzmq-27.0.0-cp38-cp38-win32.whl", hash = "sha256:26b72c5ae20bf59061c3570db835edb81d1e0706ff141747055591c4b41193f8"},
+ {file = "pyzmq-27.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:55a0155b148fe0428285a30922f7213539aa84329a5ad828bca4bbbc665c70a4"},
+ {file = "pyzmq-27.0.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:100f6e5052ba42b2533011d34a018a5ace34f8cac67cb03cfa37c8bdae0ca617"},
+ {file = "pyzmq-27.0.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:bf6c6b061efd00404b9750e2cfbd9507492c8d4b3721ded76cb03786131be2ed"},
+ {file = "pyzmq-27.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee05728c0b0b2484a9fc20466fa776fffb65d95f7317a3419985b8c908563861"},
+ {file = "pyzmq-27.0.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7cdf07fe0a557b131366f80727ec8ccc4b70d89f1e3f920d94a594d598d754f0"},
+ {file = "pyzmq-27.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:90252fa2ff3a104219db1f5ced7032a7b5fc82d7c8d2fec2b9a3e6fd4e25576b"},
+ {file = "pyzmq-27.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ea6d441c513bf18c578c73c323acf7b4184507fc244762193aa3a871333c9045"},
+ {file = "pyzmq-27.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ae2b34bcfaae20c064948a4113bf8709eee89fd08317eb293ae4ebd69b4d9740"},
+ {file = "pyzmq-27.0.0-cp39-cp39-win32.whl", hash = "sha256:5b10bd6f008937705cf6e7bf8b6ece5ca055991e3eb130bca8023e20b86aa9a3"},
+ {file = "pyzmq-27.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:00387d12a8af4b24883895f7e6b9495dc20a66027b696536edac35cb988c38f3"},
+ {file = "pyzmq-27.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:4c19d39c04c29a6619adfeb19e3735c421b3bfee082f320662f52e59c47202ba"},
+ {file = "pyzmq-27.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:656c1866505a5735d0660b7da6d7147174bbf59d4975fc2b7f09f43c9bc25745"},
+ {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74175b9e12779382432dd1d1f5960ebe7465d36649b98a06c6b26be24d173fab"},
+ {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c6de908465697a8708e4d6843a1e884f567962fc61eb1706856545141d0cbb"},
+ {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c644aaacc01d0df5c7072826df45e67301f191c55f68d7b2916d83a9ddc1b551"},
+ {file = "pyzmq-27.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:10f70c1d9a446a85013a36871a296007f6fe4232b530aa254baf9da3f8328bc0"},
+ {file = "pyzmq-27.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd1dc59763effd1576f8368047c9c31468fce0af89d76b5067641137506792ae"},
+ {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:60e8cc82d968174650c1860d7b716366caab9973787a1c060cf8043130f7d0f7"},
+ {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14fe7aaac86e4e93ea779a821967360c781d7ac5115b3f1a171ced77065a0174"},
+ {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ad0562d4e6abb785be3e4dd68599c41be821b521da38c402bc9ab2a8e7ebc7e"},
+ {file = "pyzmq-27.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9df43a2459cd3a3563404c1456b2c4c69564daa7dbaf15724c09821a3329ce46"},
+ {file = "pyzmq-27.0.0-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c86ea8fe85e2eb0ffa00b53192c401477d5252f6dd1db2e2ed21c1c30d17e5e"},
+ {file = "pyzmq-27.0.0-pp38-pypy38_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c45fee3968834cd291a13da5fac128b696c9592a9493a0f7ce0b47fa03cc574d"},
+ {file = "pyzmq-27.0.0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cae73bb6898c4e045fbed5024cb587e4110fddb66f6163bcab5f81f9d4b9c496"},
+ {file = "pyzmq-27.0.0-pp38-pypy38_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:26d542258c7a1f35a9cff3d887687d3235006134b0ac1c62a6fe1ad3ac10440e"},
+ {file = "pyzmq-27.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:04cd50ef3b28e35ced65740fb9956a5b3f77a6ff32fcd887e3210433f437dd0f"},
+ {file = "pyzmq-27.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:39ddd3ba0a641f01d8f13a3cfd4c4924eb58e660d8afe87e9061d6e8ca6f7ac3"},
+ {file = "pyzmq-27.0.0-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8ca7e6a0388dd9e1180b14728051068f4efe83e0d2de058b5ff92c63f399a73f"},
+ {file = "pyzmq-27.0.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2524c40891be6a3106885a3935d58452dd83eb7a5742a33cc780a1ad4c49dec0"},
+ {file = "pyzmq-27.0.0-pp39-pypy39_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a56e3e5bd2d62a01744fd2f1ce21d760c7c65f030e9522738d75932a14ab62a"},
+ {file = "pyzmq-27.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:096af9e133fec3a72108ddefba1e42985cb3639e9de52cfd336b6fc23aa083e9"},
+ {file = "pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf"},
]
[package.dependencies]
@@ -3167,19 +3154,19 @@ typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""}
[[package]]
name = "requests"
-version = "2.32.4"
+version = "2.32.3"
description = "Python HTTP for Humans."
optional = false
python-versions = ">=3.8"
groups = ["main", "dev"]
files = [
- {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"},
- {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"},
+ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
+ {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
]
[package.dependencies]
certifi = ">=2017.4.17"
-charset_normalizer = ">=2,<4"
+charset-normalizer = ">=2,<4"
idna = ">=2.5,<4"
urllib3 = ">=1.21.1,<3"
@@ -3572,14 +3559,14 @@ files = [
[[package]]
name = "tomlkit"
-version = "0.13.2"
+version = "0.13.3"
description = "Style preserving TOML library"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"},
- {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"},
+ {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"},
+ {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"},
]
[[package]]
@@ -3669,18 +3656,30 @@ files = [
[[package]]
name = "types-requests"
-version = "2.32.0.20250602"
+version = "2.31.0.6"
description = "Typing stubs for requests"
optional = false
-python-versions = ">=3.9"
+python-versions = ">=3.7"
groups = ["main"]
files = [
- {file = "types_requests-2.32.0.20250602-py3-none-any.whl", hash = "sha256:f4f335f87779b47ce10b8b8597b409130299f6971ead27fead4fe7ba6ea3e726"},
- {file = "types_requests-2.32.0.20250602.tar.gz", hash = "sha256:ee603aeefec42051195ae62ca7667cd909a2f8128fdf8aad9e8a5219ecfab3bf"},
+ {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]
-urllib3 = ">=2"
+types-urllib3 = "*"
+
+[[package]]
+name = "types-urllib3"
+version = "1.26.25.14"
+description = "Typing stubs for urllib3"
+optional = false
+python-versions = "*"
+groups = ["main"]
+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"
@@ -3711,21 +3710,20 @@ typing-extensions = ">=4.12.0"
[[package]]
name = "urllib3"
-version = "2.4.0"
+version = "1.26.20"
description = "HTTP library with thread-safe connection pooling, file post, and more."
optional = false
-python-versions = ">=3.9"
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
groups = ["main", "dev"]
files = [
- {file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"},
- {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"},
+ {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) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""]
-h2 = ["h2 (>=4,<5)"]
-socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
-zstd = ["zstandard (>=0.18.0)"]
+brotli = ["brotli (==1.0.9) ; os_name != \"nt\" and python_version < \"3\" and platform_python_implementation == \"CPython\"", "brotli (>=1.0.9) ; python_version >= \"3\" and platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; (os_name != \"nt\" or python_version >= \"3\") and platform_python_implementation != \"CPython\"", "brotlipy (>=0.6.0) ; os_name == \"nt\" and python_version < \"3\""]
+secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress ; python_version == \"2.7\"", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
+socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[[package]]
name = "uvicorn"
@@ -3914,14 +3912,14 @@ files = [
[[package]]
name = "zipp"
-version = "3.22.0"
+version = "3.23.0"
description = "Backport of pathlib-compatible object wrapper for zip files"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "zipp-3.22.0-py3-none-any.whl", hash = "sha256:fe208f65f2aca48b81f9e6fd8cf7b8b32c26375266b009b413d45306b6148343"},
- {file = "zipp-3.22.0.tar.gz", hash = "sha256:dd2f28c3ce4bc67507bfd3781d21b7bb2be31103b51a4553ad7d90b84e57ace5"},
+ {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"},
+ {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"},
]
[package.extras]
@@ -3929,10 +3927,10 @@ check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"
cover = ["pytest-cov"]
doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
enabler = ["pytest-enabler (>=2.2)"]
-test = ["big-O", "importlib_resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
+test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
type = ["pytest-mypy"]
[metadata]
lock-version = "2.1"
python-versions = ">3.9.1,<3.12"
-content-hash = "3394f492fd01d338d6446dc5ee05323fc4bc1dc11d91745cb82c882dd9536f58"
+content-hash = "295e3ae37773afb17fb9ee9bbd672d99a8d57cc458118cd944eb01f78dfd84f7"
diff --git a/pyproject.toml b/pyproject.toml
index c95487e..5fffc46 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -35,17 +35,18 @@ jsonschema = "^4.20.0"
numpy = "^1.21.0"
pillow = "^10.1.0"
pkginfo = "^1.12.1.2"
-protobuf = "^4.24.2"
+protobuf = "4.25.3"
protoc-gen-openapiv2 = "^0.0.1"
pydantic = ">=1.10.13"
python = ">3.9.1,<3.12"
pyyaml = "^6.0.1"
ray = "2.47.0"
-requests = "^2.32.3"
+requests = "2.32.3"
starlette = "^0.46.1"
types-protobuf = "^4.24.0.1"
types-pyyaml = "^6.0.12.11"
-types-requests = "^2.32.0.20240712"
+types-requests = "2.31.0.6"
+urllib3 = "1.26.20"
uvicorn = "^0.34.0"
virtualenv = "^20.30.0"
@@ -145,7 +146,7 @@ pygments = "^2.11.1"
# Tooling
MacFSEvents = {version = "*", platform = "darwin"}
datamodel-code-generator = "^0.25.2"
-grpcio-tools = "^1.54.2"
+grpcio-tools = "1.62.0"
ipykernel = "^6.28.0"
ipython = "^8.10.0"
jsonref = "^1.1.0"
diff --git a/release-please/config.json b/release-please/config.json
index 754b48a..178d4f0 100644
--- a/release-please/config.json
+++ b/release-please/config.json
@@ -3,9 +3,9 @@
".": {
"release-type": "python",
"draft": false,
- "prerelease": true,
+ "prerelease": false,
"bump-minor-pre-major": true,
- "bump-patch-for-minor-pre-major": false
+ "bump-patch-for-minor-pre-major": true
}
},
"changelog-sections": [
@@ -45,4 +45,4 @@
"hidden": false
}
]
-}
+}
\ No newline at end of file
diff --git a/scent.py b/scent.py
index cb50f4d..950cd74 100644
--- a/scent.py
+++ b/scent.py
@@ -2,6 +2,7 @@
import time
import subprocess
+import os
from sniffer.api import select_runnable, file_validator, runnable
try:
@@ -12,7 +13,16 @@
notify = Notifier.notify
-watch_paths = ["instill", "tests"]
+# Watch all relevant directories including subdirectories
+watch_paths = [
+ "instill",
+ "tests",
+ "instill/helpers",
+ "instill/helpers/commands",
+ "instill/clients",
+ "instill/resources",
+ "instill/utils"
+]
class Options:
@@ -31,12 +41,27 @@ class Options:
@select_runnable("run_targets")
@file_validator
def python_files(filename):
- return filename.endswith(".py") and ".py." not in filename
+ """Check if file is a Python file and should trigger tests."""
+ # Ignore cache files and temporary files
+ if any(part in filename for part in ["__pycache__", ".pyc", ".pyo", ".pyd", ".py."]):
+ return False
+
+ # Only watch Python files in our project directories
+ if not filename.endswith(".py"):
+ return False
+
+ # Check if file is in one of our watched paths
+ for path in watch_paths:
+ if filename.startswith(path):
+ return True
+
+ return False
@select_runnable("run_targets")
@file_validator
def html_files(filename):
+ """Check if file is an HTML/CSS/JS file for docs."""
return filename.split(".")[-1] in ["html", "css", "js"]
diff --git a/tests/test_cli.py b/tests/test_cli.py
new file mode 100644
index 0000000..0a20224
--- /dev/null
+++ b/tests/test_cli.py
@@ -0,0 +1,794 @@
+"""Unit tests for CLI commands."""
+
+# pylint: disable=unused-argument
+
+import os
+import subprocess
+import tempfile
+from unittest.mock import MagicMock, mock_open, patch
+
+import pytest
+
+from instill.helpers.cli import cli
+from instill.helpers.commands.build import add_build_parser, build
+from instill.helpers.commands.init import add_init_parser, init
+from instill.helpers.commands.push import add_push_parser, push
+from instill.helpers.commands.run import add_run_parser, run
+from instill.helpers.commands.utils import (
+ config_check_required_fields,
+ find_project_root,
+ parse_image_tag_name,
+ parse_target_arch,
+ prepare_build_command,
+ prepare_build_environment,
+ validate_cuda_version,
+ validate_python_version,
+)
+from instill.helpers.errors import ModelConfigException
+
+
+class TestInitCommand:
+ """Test cases for the init command."""
+
+ def test_add_init_parser(self):
+ """Test that init parser is added correctly."""
+ subcommands = MagicMock()
+ add_init_parser(subcommands)
+
+ subcommands.add_parser.assert_called_once_with(
+ "init", help="Initialize model directory"
+ )
+ parser = subcommands.add_parser.return_value
+ parser.set_defaults.assert_called_once_with(func=init)
+
+ @patch("instill.helpers.commands.init.shutil.copyfile")
+ @patch("instill.helpers.commands.init.os.getcwd")
+ @patch("instill.helpers.commands.init.__file__")
+ @patch("instill.helpers.commands.init.Logger")
+ def test_init_success(self, mock_logger, mock_file, mock_getcwd, mock_copyfile):
+ """Test successful initialization."""
+ mock_file.return_value = "/path/to/commands/init.py"
+ mock_getcwd.return_value = "/current/dir"
+
+ args = MagicMock()
+ init(args)
+
+ # Check that files were copied
+ assert mock_copyfile.call_count == 2
+
+ # Check that success message was logged
+ mock_logger.i.assert_called_once_with(
+ "[Instill] Model directory initialized successfully"
+ )
+
+ @patch("instill.helpers.commands.init.shutil.copyfile")
+ @patch("instill.helpers.commands.init.os.getcwd")
+ @patch("instill.helpers.commands.init.__file__")
+ @patch("instill.helpers.commands.init.Logger")
+ def test_init_file_not_found(
+ self, mock_logger, mock_file, mock_getcwd, mock_copyfile
+ ):
+ """Test init when template files are not found."""
+ mock_file.return_value = "/path/to/commands/init.py"
+ mock_getcwd.return_value = "/current/dir"
+ mock_copyfile.side_effect = FileNotFoundError("Template not found")
+
+ args = MagicMock()
+ init(args) # Should not raise exception, just log error
+
+ # Check that error was logged
+ mock_logger.e.assert_called()
+ error_calls = [
+ call
+ for call in mock_logger.e.call_args_list
+ if "[Instill] Failed to initialize model directory" in str(call)
+ ]
+ assert len(error_calls) == 1
+
+ @patch("instill.helpers.commands.init.shutil.copyfile")
+ @patch("instill.helpers.commands.init.os.getcwd")
+ @patch("instill.helpers.commands.init.Logger")
+ def test_init_permission_error(self, mock_logger, mock_getcwd, mock_copyfile):
+ """Test init when there's a permission error."""
+ mock_getcwd.return_value = "/current/dir"
+ mock_copyfile.side_effect = PermissionError("Permission denied")
+
+ args = MagicMock()
+ init(args) # Should not raise exception, just log error
+
+ # Check that error was logged
+ mock_logger.e.assert_called()
+ error_calls = [
+ call
+ for call in mock_logger.e.call_args_list
+ if "[Instill] Failed to initialize model directory" in str(call)
+ ]
+ assert len(error_calls) == 1
+
+
+class TestBuildCommand:
+ """Test cases for the build command."""
+
+ def test_add_build_parser(self):
+ """Test that build parser is added correctly."""
+ subcommands = MagicMock()
+ add_build_parser(subcommands, "amd64")
+
+ subcommands.add_parser.assert_called_once_with(
+ "build", help="Build model image"
+ )
+ parser = subcommands.add_parser.return_value
+ assert parser.add_argument.call_count == 5
+
+ @patch("instill.helpers.commands.build.Logger")
+ @patch("instill.helpers.commands.build.open", new_callable=mock_open)
+ def test_build_missing_config_file(self, mock_open_func, mock_logger):
+ """Test build when config file is missing."""
+ mock_open_func.side_effect = FileNotFoundError("Config file not found")
+
+ args = MagicMock()
+ args.name = "test/model"
+ args.no_cache = False
+ args.target_arch = "amd64"
+ args.sdk_wheel = None
+ args.editable_project = None
+
+ build(args) # Should not raise exception, just log error
+
+ # Check that error was logged
+ mock_logger.e.assert_called()
+ error_calls = [
+ call
+ for call in mock_logger.e.call_args_list
+ if "Config file not found" in str(call)
+ ]
+ assert len(error_calls) == 1
+
+ @patch("instill.helpers.commands.build.open", new_callable=mock_open)
+ @patch("instill.helpers.commands.build.yaml.safe_load")
+ def test_build_invalid_config(self, mock_yaml_load, mock_open_func):
+ """Test build with invalid configuration."""
+ mock_yaml_load.return_value = {"build": {"gpu": None}}
+
+ args = MagicMock()
+ args.name = "test/model"
+ args.no_cache = False
+ args.target_arch = "amd64"
+ args.sdk_wheel = None
+ args.editable_project = None
+
+ with pytest.raises(ModelConfigException):
+ build(args)
+
+ @patch("instill.helpers.commands.build.open", new_callable=mock_open)
+ @patch("instill.helpers.commands.build.Logger")
+ @patch("instill.helpers.commands.build.yaml.safe_load")
+ def test_build_gpu_on_arm64(self, mock_yaml_load, mock_logger, mock_open_func):
+ """Test build with GPU on ARM64 architecture."""
+ mock_yaml_load.return_value = {
+ "build": {"gpu": True, "llm_runtime": "transformers"}
+ }
+
+ args = MagicMock()
+ args.name = "test/model"
+ args.no_cache = False
+ args.target_arch = "arm64"
+ args.sdk_wheel = None
+ args.editable_project = None
+
+ build(args) # Should not raise exception, just log error
+
+ # Check that error was logged
+ mock_logger.e.assert_called()
+ error_calls = [
+ call
+ for call in mock_logger.e.call_args_list
+ if "GPU is not supported on ARM64 architecture" in str(call)
+ ]
+ assert len(error_calls) == 1
+
+ @patch("instill.helpers.commands.build.open", new_callable=mock_open)
+ @patch("instill.helpers.commands.build.subprocess.run")
+ @patch("instill.helpers.commands.build.shutil.copytree")
+ @patch("instill.helpers.commands.build.shutil.copyfile")
+ @patch("instill.helpers.commands.build.os.getcwd")
+ @patch("instill.helpers.commands.build.tempfile.TemporaryDirectory")
+ @patch("instill.helpers.commands.build.yaml.safe_load")
+ def test_build_success_cpu(
+ self,
+ mock_yaml_load,
+ mock_tempdir,
+ mock_getcwd,
+ mock_copyfile,
+ mock_copytree,
+ mock_subprocess,
+ mock_open_func,
+ ):
+ """Test successful build for CPU."""
+ mock_yaml_load.return_value = {
+ "build": {
+ "gpu": False,
+ "llm_runtime": "transformers",
+ "python_version": "3.11",
+ }
+ }
+
+ mock_tempdir.return_value.__enter__.return_value = "/tmp/test"
+ mock_subprocess.return_value.returncode = 0
+ mock_getcwd.return_value = "/current/working/dir"
+
+ args = MagicMock()
+ args.name = "test/model"
+ args.no_cache = False
+ args.target_arch = "amd64"
+ args.sdk_wheel = None
+ args.editable_project = None
+
+ build(args)
+
+ # Verify subprocess was called
+ mock_subprocess.assert_called_once()
+
+ @patch("instill.helpers.commands.build.open", new_callable=mock_open)
+ @patch("instill.helpers.commands.build.subprocess.run")
+ @patch("instill.helpers.commands.build.shutil.copytree")
+ @patch("instill.helpers.commands.build.shutil.copyfile")
+ @patch("instill.helpers.commands.build.os.getcwd")
+ @patch("instill.helpers.commands.build.tempfile.TemporaryDirectory")
+ @patch("instill.helpers.commands.build.yaml.safe_load")
+ def test_build_with_sdk_wheel(
+ self,
+ mock_yaml_load,
+ mock_tempdir,
+ mock_getcwd,
+ mock_copyfile,
+ mock_copytree,
+ mock_subprocess,
+ mock_open_func,
+ ):
+ """Test build with SDK wheel."""
+ mock_yaml_load.return_value = {
+ "build": {"gpu": False, "llm_runtime": "transformers"}
+ }
+
+ mock_tempdir.return_value.__enter__.return_value = "/tmp/test"
+ mock_subprocess.return_value.returncode = 0
+ mock_getcwd.return_value = "/current/working/dir"
+
+ args = MagicMock()
+ args.name = "test/model"
+ args.no_cache = False
+ args.target_arch = "amd64"
+ args.sdk_wheel = "/path/to/wheel.whl"
+ args.editable_project = None
+
+ build(args)
+
+ # Verify SDK wheel was copied
+ mock_copyfile.assert_any_call(
+ "/path/to/wheel.whl", "/tmp/test/instill_sdk-0.17.2dev-py3-none-any.whl"
+ )
+
+ @patch("instill.helpers.commands.build.open", new_callable=mock_open)
+ @patch("instill.helpers.commands.build.find_project_root")
+ @patch("instill.helpers.commands.build.subprocess.run")
+ @patch("instill.helpers.commands.build.shutil.copytree")
+ @patch("instill.helpers.commands.build.shutil.copyfile")
+ @patch("instill.helpers.commands.build.os.getcwd")
+ @patch("instill.helpers.commands.build.tempfile.TemporaryDirectory")
+ @patch("instill.helpers.commands.build.yaml.safe_load")
+ def test_build_with_editable_project(
+ self,
+ mock_yaml_load,
+ mock_tempdir,
+ mock_getcwd,
+ mock_copyfile,
+ mock_copytree,
+ mock_subprocess,
+ mock_find_project_root,
+ mock_open_func,
+ ):
+ """Test build with editable project."""
+ mock_yaml_load.return_value = {
+ "build": {"gpu": False, "llm_runtime": "transformers"}
+ }
+
+ mock_tempdir.return_value.__enter__.return_value = "/tmp/test"
+ mock_subprocess.return_value.returncode = 0
+ mock_getcwd.return_value = "/current/working/dir"
+
+ # Mock the project root finding
+ mock_find_project_root.return_value = "/path/to/project"
+
+ args = MagicMock()
+ args.name = "test/model"
+ args.no_cache = False
+ args.target_arch = "amd64"
+ args.sdk_wheel = None
+ args.editable_project = "/path/to/project"
+
+ build(args)
+
+ # Verify project was copied - use the correct path based on os.path.basename
+ mock_copytree.assert_any_call(
+ "/path/to/project", "/tmp/test/project", dirs_exist_ok=True
+ )
+
+ @patch("instill.helpers.commands.build.open", new_callable=mock_open)
+ @patch("instill.helpers.commands.build.find_project_root")
+ @patch("instill.helpers.commands.build.subprocess.run")
+ @patch("instill.helpers.commands.build.shutil.copytree")
+ @patch("instill.helpers.commands.build.shutil.copyfile")
+ @patch("instill.helpers.commands.build.os.getcwd")
+ @patch("instill.helpers.commands.build.tempfile.TemporaryDirectory")
+ @patch("instill.helpers.commands.build.yaml.safe_load")
+ def test_build_with_editable_project_custom_name(
+ self,
+ mock_yaml_load,
+ mock_tempdir,
+ mock_getcwd,
+ mock_copyfile,
+ mock_copytree,
+ mock_subprocess,
+ mock_find_project_root,
+ mock_open_func,
+ ):
+ """Test build with editable project that has a custom name."""
+ mock_yaml_load.return_value = {
+ "build": {"gpu": False, "llm_runtime": "transformers"}
+ }
+
+ mock_tempdir.return_value.__enter__.return_value = "/tmp/test"
+ mock_subprocess.return_value.returncode = 0
+ mock_getcwd.return_value = "/current/working/dir"
+
+ # Mock the project root finding with a custom project name
+ mock_find_project_root.return_value = "/path/to/my-custom-project"
+
+ args = MagicMock()
+ args.name = "test/model"
+ args.no_cache = False
+ args.target_arch = "amd64"
+ args.sdk_wheel = None
+ args.editable_project = "/path/to/my-custom-project"
+
+ build(args)
+
+ # Verify project was copied with the correct name
+ mock_copytree.assert_any_call(
+ "/path/to/my-custom-project",
+ "/tmp/test/my-custom-project",
+ dirs_exist_ok=True,
+ )
+
+
+class TestPushCommand:
+ """Test cases for the push command."""
+
+ def test_add_push_parser(self):
+ """Test that push parser is added correctly."""
+ subcommands = MagicMock()
+ add_push_parser(subcommands)
+
+ subcommands.add_parser.assert_called_once_with("push", help="Push model image")
+ parser = subcommands.add_parser.return_value
+ assert parser.add_argument.call_count == 2 # name, url
+
+ @patch("instill.helpers.commands.push.subprocess.run")
+ @patch("instill.helpers.commands.push.Logger")
+ def test_push_success(self, mock_logger, mock_subprocess):
+ """Test successful push operation."""
+ mock_subprocess.return_value.returncode = 0
+
+ args = MagicMock()
+ args.name = "test/model"
+ args.url = "registry.example.com"
+
+ push(args)
+
+ # Check that docker tag and push were called
+ assert mock_subprocess.call_count == 3 # tag, push, rmi
+
+ # Check that success messages were logged
+ mock_logger.i.assert_called()
+ success_calls = [
+ call for call in mock_logger.i.call_args_list if "pushed" in str(call)
+ ]
+ assert len(success_calls) == 1
+
+ @patch("instill.helpers.commands.push.subprocess.run")
+ @patch("instill.helpers.commands.push.Logger")
+ def test_push_failure(self, mock_logger, mock_subprocess):
+ """Test push operation failure."""
+
+ # Mock the subprocess calls to simulate failure
+ def mock_run_side_effect(*args, **kwargs):
+ # First call (tag) succeeds
+ if "tag" in args[0]:
+ return MagicMock(returncode=0)
+ # Second call (push) fails
+ if "push" in args[0]:
+ raise subprocess.CalledProcessError(1, args[0])
+ # Third call (rmi) succeeds
+ if "rmi" in args[0]:
+ return MagicMock(returncode=0)
+ return MagicMock(returncode=0)
+
+ mock_subprocess.side_effect = mock_run_side_effect
+
+ args = MagicMock()
+ args.name = "test/model"
+ args.url = "registry.example.com"
+
+ push(args) # Should not raise exception, just log error
+
+ # Check that error was logged
+ mock_logger.e.assert_called()
+ error_calls = [
+ call
+ for call in mock_logger.e.call_args_list
+ if "[Instill] Push failed" in str(call)
+ ]
+ assert len(error_calls) == 1
+
+
+class TestRunCommand:
+ """Test cases for the run command."""
+
+ def test_add_run_parser(self):
+ """Test that run parser is added correctly."""
+ subcommands = MagicMock()
+ add_run_parser(subcommands)
+
+ subcommands.add_parser.assert_called_once_with(
+ "run", help="Run inference on model image"
+ )
+ parser = subcommands.add_parser.return_value
+ assert (
+ parser.add_argument.call_count == 6
+ ) # name, num-of-cpus, cpu-kvcache-space, gpu, num-of-gpus, input
+
+ @patch("instill.helpers.commands.run.subprocess.run")
+ @patch("instill.helpers.commands.run.uuid.uuid4")
+ def test_run_cpu_mode(self, mock_uuid, mock_subprocess):
+ """Test run in CPU mode."""
+ mock_uuid.return_value = "test-uuid"
+ mock_subprocess.return_value.returncode = 0
+
+ args = MagicMock()
+ args.name = "test/model"
+ args.num_of_cpus = 2
+ args.cpu_kvcache_space = 8
+ args.gpu = False
+ args.num_of_gpus = 1
+ args.input = '{"test": "data"}'
+
+ run(args)
+
+ # Check that docker run was called with CPU parameters
+ calls = mock_subprocess.call_args_list
+ docker_run_call = calls[0][0][0]
+
+ assert docker_run_call[0] == "docker"
+ assert docker_run_call[1] == "run"
+ assert "-d" in docker_run_call
+ assert "--privileged" in docker_run_call
+ assert "--shm-size=4gb" in docker_run_call
+ assert "--rm" in docker_run_call
+ assert "--name" in docker_run_call
+ assert "test-uuid" in docker_run_call
+ assert "test/model:latest" in docker_run_call
+
+ @patch("instill.helpers.commands.run.subprocess.run")
+ @patch("instill.helpers.commands.run.uuid.uuid4")
+ def test_run_gpu_mode(self, mock_uuid, mock_subprocess):
+ """Test run in GPU mode."""
+ mock_uuid.return_value = "test-uuid"
+ mock_subprocess.return_value.returncode = 0
+
+ args = MagicMock()
+ args.name = "test/model"
+ args.num_of_cpus = 1
+ args.cpu_kvcache_space = 4
+ args.gpu = True
+ args.num_of_gpus = 2
+ args.input = '{"test": "data"}'
+
+ run(args)
+
+ # Check that docker run was called with GPU parameters
+ calls = mock_subprocess.call_args_list
+ docker_run_call = calls[0][0][0]
+
+ assert docker_run_call[0] == "docker"
+ assert docker_run_call[1] == "run"
+ assert "--device" in docker_run_call
+ assert "nvidia.com/gpu:2" in docker_run_call
+
+
+class TestUtils:
+ """Test cases for utility functions."""
+
+ def test_config_check_required_fields_valid(self):
+ """Test config check with valid configuration."""
+ config = {"build": {"gpu": True, "llm_runtime": "transformers"}}
+
+ # Should not raise any exception
+ config_check_required_fields(config)
+
+ def test_config_check_required_fields_missing_build(self):
+ """Test config check with missing build section."""
+ config = {"other": "value"}
+
+ with pytest.raises(ModelConfigException, match="build"):
+ config_check_required_fields(config)
+
+ def test_config_check_required_fields_missing_gpu(self):
+ """Test config check with missing gpu field."""
+ config = {"build": {"other": "value"}}
+
+ with pytest.raises(ModelConfigException, match="gpu"):
+ config_check_required_fields(config)
+
+ def test_find_project_root_found(self):
+ """Test finding project root when it exists."""
+ with tempfile.TemporaryDirectory() as temp_dir:
+ # Create a mock project structure
+ project_dir = os.path.join(temp_dir, "test_project")
+ os.makedirs(project_dir)
+
+ # Create pyproject.toml in the project directory
+ pyproject_path = os.path.join(project_dir, "pyproject.toml")
+ with open(pyproject_path, "w", encoding="utf-8") as f:
+ f.write("[tool.poetry]\nname = 'test'\n")
+
+ # Test from a subdirectory
+ subdir = os.path.join(project_dir, "src", "package")
+ os.makedirs(subdir)
+
+ result = find_project_root(subdir)
+ assert result == project_dir
+
+ def test_find_project_root_not_found(self):
+ """Test finding project root when it doesn't exist."""
+ with tempfile.TemporaryDirectory() as temp_dir:
+ result = find_project_root(temp_dir)
+ assert result is None
+
+ @pytest.mark.parametrize(
+ "version,expected",
+ [
+ ("3.11", "311"),
+ ("3.10", "310"),
+ ("3.9", "39"),
+ ("", "311"), # Default
+ ],
+ )
+ def test_validate_python_version_valid(self, version, expected):
+ """Test Python version validation with valid versions."""
+ result = validate_python_version(version)
+ assert result == expected
+
+ @pytest.mark.parametrize(
+ "version,error_msg",
+ [
+ ("2.7", "too old"),
+ ("3.13", "too new"),
+ ("invalid", "format"),
+ ("3", "format"),
+ ],
+ )
+ def test_validate_python_version_invalid(self, version, error_msg):
+ """Test Python version validation with invalid versions."""
+ with pytest.raises(ValueError, match=error_msg):
+ validate_python_version(version)
+
+ @pytest.mark.parametrize(
+ "version,expected",
+ [
+ ("12.8", "128"),
+ ("12.2", "122"),
+ ("", "128"), # Default
+ ],
+ )
+ def test_validate_cuda_version_valid(self, version, expected):
+ """Test CUDA version validation with valid versions."""
+ result = validate_cuda_version(version)
+ assert result == expected
+
+ @pytest.mark.parametrize(
+ "version,error_msg",
+ [
+ ("11.8", "too old"), # Below minimum 12.2
+ ("13.0", "too new"), # Above maximum 12.8
+ ("invalid", "format"),
+ ("12", "format"),
+ ],
+ )
+ def test_validate_cuda_version_invalid(self, version, error_msg):
+ """Test CUDA version validation with invalid versions."""
+ with pytest.raises(ValueError, match=error_msg):
+ validate_cuda_version(version)
+
+ @patch("instill.helpers.commands.utils.ray.__version__", "2.47.0")
+ @patch("instill.__version__", "0.17.2")
+ def test_prepare_build_environment_cpu(self):
+ """Test build environment preparation for CPU."""
+ build_params = {
+ "gpu": False,
+ "llm_runtime": "transformers",
+ "python_version": "3.11",
+ "system_packages": ["git", "curl"],
+ "python_packages": ["numpy", "pandas"],
+ }
+
+ result = prepare_build_environment(build_params)
+
+ assert len(result) == 8
+ (
+ llm_runtime,
+ ray_version,
+ python_version,
+ cuda_version,
+ device_type,
+ system_pkg_str,
+ python_pkg_str,
+ instill_sdk_version,
+ ) = result
+
+ assert llm_runtime == "transformers"
+ assert ray_version == "2.47.0"
+ assert python_version == "-py311"
+ assert cuda_version == ""
+ assert device_type == "-cpu"
+ assert system_pkg_str == "git curl"
+ assert python_pkg_str == "numpy pandas"
+ assert instill_sdk_version == "0.17.2"
+
+ @patch("instill.helpers.commands.utils.ray.__version__", "2.47.0")
+ @patch("instill.__version__", "0.17.2")
+ def test_prepare_build_environment_gpu(self):
+ """Test build environment preparation for GPU."""
+ build_params = {
+ "gpu": True,
+ "cuda_version": "12.8",
+ "llm_runtime": "vllm",
+ "python_version": "3.11",
+ }
+
+ result = prepare_build_environment(build_params)
+
+ assert len(result) == 8
+ (
+ llm_runtime,
+ ray_version,
+ python_version,
+ cuda_version,
+ device_type,
+ system_pkg_str,
+ python_pkg_str,
+ instill_sdk_version,
+ ) = result
+
+ assert llm_runtime == "vllm"
+ assert ray_version == "2.47.0"
+ assert python_version == "-py311"
+ assert cuda_version == "-cu128"
+ assert device_type == "-gpu"
+ assert system_pkg_str == ""
+ assert python_pkg_str == ""
+ assert instill_sdk_version == "0.17.2"
+
+ @pytest.mark.parametrize(
+ "image_name,expected",
+ [
+ ("test/model", "test/model:latest"),
+ ("test/model:latest", "test/model:latest"),
+ ("test/model:v1.0", "test/model:v1.0"),
+ ],
+ )
+ def test_parse_image_tag_name(self, image_name, expected):
+ """Test image tag name parsing."""
+ result = parse_image_tag_name(image_name)
+ assert result == expected
+
+ @pytest.mark.parametrize(
+ "arch,expected",
+ [
+ ("amd64", "amd64"),
+ ("arm64", "aarch64"),
+ ],
+ )
+ def test_parse_target_arch_valid(self, arch, expected):
+ """Test target architecture parsing with valid values."""
+ result = parse_target_arch(arch)
+ assert result == expected
+
+ def test_parse_target_arch_invalid(self):
+ """Test target architecture parsing with invalid value."""
+ with pytest.raises(ValueError, match="Invalid target architecture"):
+ parse_target_arch("invalid")
+
+ def test_prepare_build_command(self):
+ """Test build command preparation."""
+ tmpdir = "/tmp/test"
+ dockerfile = "Dockerfile.transformers"
+ build_vars = [
+ "test/model:latest", # image_name_tag
+ "amd64", # target_arch
+ False, # no_cache
+ "transformers", # llm_runtime
+ "2.47.0", # ray_version
+ "-py311", # python_version
+ "", # cuda_version
+ "-cpu", # device_type
+ "numpy pandas", # python_pkg_str
+ "git curl", # system_pkg_str
+ "0.17.2", # instill_sdk_version
+ None, # instill_python_sdk_project_name
+ ]
+
+ command = prepare_build_command(tmpdir, dockerfile, build_vars)
+
+ assert command[0] == "docker"
+ assert command[1] == "buildx"
+ assert command[2] == "build"
+ assert "--file" in command
+ assert f"{tmpdir}/{dockerfile}" in command
+ assert "--platform" in command
+ assert "linux/amd64" in command
+ assert "-t" in command
+ assert "test/model:latest" in command
+
+
+class TestCLIIntegration:
+ """Integration tests for CLI commands."""
+
+ @patch("instill.helpers.cli.add_init_parser")
+ @patch("instill.helpers.cli.add_build_parser")
+ @patch("instill.helpers.cli.add_push_parser")
+ @patch("instill.helpers.cli.add_run_parser")
+ @patch("instill.helpers.cli.argparse.ArgumentParser")
+ def test_cli_setup(self, mock_parser, mock_run, mock_push, mock_build, mock_init):
+ """Test that CLI sets up all command parsers correctly."""
+ mock_parser_instance = MagicMock()
+ mock_parser.return_value = mock_parser_instance
+ mock_parser_instance.add_subparsers.return_value = MagicMock()
+
+ # Mock platform.machine to return a known value
+ with patch("instill.helpers.cli.platform.machine", return_value="x86_64"):
+ cli()
+
+ # Check that all parsers were added
+ mock_init.assert_called_once()
+ mock_build.assert_called_once()
+ mock_push.assert_called_once()
+ mock_run.assert_called_once()
+
+ def test_cli_default_platform_detection(self):
+ """Test CLI platform detection."""
+ with patch("instill.helpers.cli.platform.machine") as mock_machine:
+ # Test x86_64 detection
+ mock_machine.return_value = "x86_64"
+ with patch("instill.helpers.cli.argparse.ArgumentParser") as mock_parser:
+ mock_parser_instance = MagicMock()
+ mock_parser.return_value = mock_parser_instance
+ mock_parser_instance.add_subparsers.return_value = MagicMock()
+
+ # Mock the parser functions to avoid the actual function calls
+ with patch("instill.helpers.cli.add_init_parser"):
+ with patch("instill.helpers.cli.add_build_parser") as mock_build:
+ with patch("instill.helpers.cli.add_push_parser"):
+ with patch("instill.helpers.cli.add_run_parser"):
+ cli()
+
+ # Check that build parser was called with amd64
+ mock_build.assert_called_once()
+ args, _ = mock_build.call_args
+ assert (
+ args[1] == "amd64"
+ ) # default_platform should be amd64
+
+
+if __name__ == "__main__":
+ pytest.main([__file__])