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 + [![Unix Build Status](https://img.shields.io/github/actions/workflow/status/instill-ai/python-sdk/build.yml?branch=main&label=linux)](https://github.com/instill-ai/python-sdk/actions) [![Coverage Status](https://img.shields.io/codecov/c/gh/instill-ai/python-sdk)](https://codecov.io/gh/instill-ai/python-sdk) [![PyPI License](https://img.shields.io/pypi/l/instill-sdk.svg)](https://pypi.org/project/instill-sdk) [![PyPI Version](https://img.shields.io/pypi/v/instill-sdk.svg)](https://pypi.org/project/instill-sdk) [![PyPI Downloads](https://img.shields.io/pypi/dm/instill-sdk.svg?color=orange)](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__])