From a37dccf0de0120bc8cb2eb1de31848a8f718a437 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Tue, 4 Mar 2025 18:59:39 -0800 Subject: [PATCH 01/29] feat: updates to compoundai to get it working with kv router --- container/Dockerfile.vllm | 4 + deploy/compoundai/sdk/pyproject.toml | 8 +- .../compoundai/sdk/src/compoundai/__init__.py | 10 +++ .../sdk/src/compoundai/cli/serve_nova.py | 76 ++++++++++++------- .../sdk/src/compoundai/sdk/dependency.py | 30 ++++++++ .../sdk/src/compoundai/sdk/image.py | 7 +- .../sdk/src/compoundai/sdk/service.py | 8 +- 7 files changed, 104 insertions(+), 39 deletions(-) diff --git a/container/Dockerfile.vllm b/container/Dockerfile.vllm index 2d66c81289d3..de86cb7622da 100644 --- a/container/Dockerfile.vllm +++ b/container/Dockerfile.vllm @@ -118,6 +118,10 @@ ENV VLLM_KV_CAPI_PATH="/opt/triton/bindings/lib/libtriton_distributed_llm_capi.s # FIXME: Copy more specific folders in for dev/debug after directory restructure COPY . /workspace +RUN source /opt/triton/venv/bin/activate && \ + cd /workspace/deploy/compoundai/sdk && \ + uv pip install -e . + # FIXME: May want a modification with triton-distributed banner on entry ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"] diff --git a/deploy/compoundai/sdk/pyproject.toml b/deploy/compoundai/sdk/pyproject.toml index f8ae41385e7c..67bda941387a 100644 --- a/deploy/compoundai/sdk/pyproject.toml +++ b/deploy/compoundai/sdk/pyproject.toml @@ -19,11 +19,13 @@ version = "0.1.0" description = "Add your description here" readme = "README.md" authors = [ - { name = "mabdulwahhab", email = "mabdulwahhab@nvidia.com" } + { name = "mabdulwahhab", email = "mabdulwahhab@nvidia.com" }, + { name = "biswa.panda", email = "biswaranjanp@nvidia.com" } ] -requires-python = "==3.10.*" dependencies = [ - "bentoml>=1.4.1", + # TODO: currently compatible with bentoml==1.4.1, + # v1.4.2 has removed normalize_identifier which is used in compoundai + "bentoml==1.4.1", "types-psutil==7.0.0.20250218", ] diff --git a/deploy/compoundai/sdk/src/compoundai/__init__.py b/deploy/compoundai/sdk/src/compoundai/__init__.py index 60ee5afcdbea..e78724871561 100644 --- a/deploy/compoundai/sdk/src/compoundai/__init__.py +++ b/deploy/compoundai/sdk/src/compoundai/__init__.py @@ -12,3 +12,13 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + +from compoundai.sdk.decorators import nova_endpoint, nova_api, async_onstart +from compoundai.sdk.service import service +from compoundai.sdk.dependency import depends +from bentoml import api +from bentoml._internal.context import server_context +from compoundai.sdk.image import NOVA_IMAGE + + +tdist_context = {} \ No newline at end of file diff --git a/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py b/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py index c610fa07faa5..255a78b74c7d 100644 --- a/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py +++ b/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py @@ -26,9 +26,12 @@ from typing import Any import click -from triton_distributed_rs import DistributedRuntime, triton_endpoint, triton_worker +from triton_distributed.runtime import DistributedRuntime, triton_endpoint, triton_worker + +from compoundai import tdist_context logger = logging.getLogger("compoundai.serve.nova") +logger.setLevel(logging.INFO) def generate_run_id(): @@ -69,9 +72,9 @@ def main( from bentoml._internal.log import configure_server_logging run_id = generate_run_id() - - # print the contents of the environment variable BENTOML_RUNNER_MAP - print(f"BENTOML_RUNNER_MAP: {os.environ['BENTOML_RUNNER_MAP']}") + tdist_context["service_name"] = service_name + tdist_context["runner_map"] = runner_map + tdist_context["worker_id"] = worker_id # Import service first to check configuration service = import_service(bento_identifier) @@ -100,10 +103,17 @@ def main( if service.is_nova_component(): if worker_id is not None: server_context.worker_index = worker_id - class_instance = service.inner() @triton_worker() async def worker(runtime: DistributedRuntime): + global tdist_context + tdist_context["runtime"] = runtime + # init service instance, calls __init__ + #TODO:bis: delete this print + print( + f"SERVE NOVA triton_worker sn: {service_name} tdist_context: {tdist_context}, runtime: {runtime}" + ) + # logger.info(f"setting tdist_context: {tdist_context}, runtime: {runtime}") if service_name and service_name != service.name: server_context.service_type = "service" else: @@ -123,21 +133,6 @@ async def worker(runtime: DistributedRuntime): await component.create_service() logger.info(f"[{run_id}] Created {service.name} component") - # Run startup hooks before setting up endpoints - for name, member in vars(class_instance.__class__).items(): - if callable(member) and getattr( - member, "__bentoml_startup_hook__", False - ): - logger.info(f"[{run_id}] Running startup hook: {name}") - result = getattr(class_instance, name)() - if inspect.isawaitable(result): - await result - logger.info( - f"[{run_id}] Completed async startup hook: {name}" - ) - else: - logger.info(f"[{run_id}] Completed startup hook: {name}") - # Set runtime on all dependencies for dep in service.dependencies.values(): dep.set_runtime(runtime) @@ -151,10 +146,18 @@ async def worker(runtime: DistributedRuntime): raise ValueError(error_msg) print(f"[{run_id}] Nova endpoints: {nova_endpoints}") + endpoints = [] for name, endpoint in nova_endpoints.items(): td_endpoint = component.endpoint(name) logger.info(f"[{run_id}] Registering endpoint '{name}'") + endpoints.append(td_endpoint) # Bind an instance of inner to the endpoint + # bound_method = endpoint.func.__get__(service.inner()) + tdist_context["component"] = component + tdist_context["endpoints"] = endpoints + class_instance = service.inner() + twm = [] + for name, endpoint in nova_endpoints.items(): bound_method = endpoint.func.__get__(class_instance) # Only pass request type for now, use Any for response # TODO: Handle a triton_endpoint not having types @@ -162,17 +165,32 @@ async def worker(runtime: DistributedRuntime): triton_wrapped_method = triton_endpoint(endpoint.request_type, Any)( bound_method ) - result = await td_endpoint.serve_endpoint(triton_wrapped_method) - # WARNING: unreachable code :( because serve blocks - logger.info(f"[{run_id}] Result: {result}") - logger.info(f"[{run_id}] Registered endpoint '{name}'") - - logger.info( - f"[{run_id}] Started {service.name} instance with all endpoints registered" - ) + twm.append(triton_wrapped_method) + #TODO:bis: delete this print + print(f"SETTING sn:{service_name} tdist_context: {tdist_context}") + # Run startup hooks before setting up endpoints + for name, member in vars(class_instance.__class__).items(): + if callable(member) and getattr( + member, "__bentoml_startup_hook__", False + ): + logger.info(f"[{run_id}] Running startup hook: {name}") + result = getattr(class_instance, name)() + if inspect.isawaitable(result): + # await on startup hook async_onstart + await result + logger.info( + f"[{run_id}] Completed async startup hook: {name}" + ) + else: + logger.info(f"[{run_id}] Completed startup hook: {name}") + #TODO:bis: delete this print + print(f"serve nova STARTING sn:{service_name}, endpoints:{endpoints}") logger.info( - f"[{run_id}] Available endpoints: {service.list_nova_endpoints()}" + f"[{run_id}] Starting {service.name} instance with all registered endpoints" ) + #TODO:bis: convert to list + result = await endpoints[0].serve_endpoint(twm[0]) + except Exception as e: logger.error(f"[{run_id}] Error in Nova component setup: {str(e)}") raise diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py b/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py index b58aec6dfb49..d6128469ace6 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py @@ -133,6 +133,36 @@ def __init__( self._nova_client: Optional[NovaClient] = None self._runtime = None + # offers an escape hatch to get the endpoint directly + async def get_endpoint(self, name: str) -> Any: + """ + usage: + dep = depends(Worker) + + ... + await dep.get_endpoint("generate") # equivalent to the following + router_client = ( + await runtime.namespace("triton-init") + .component("router") + .endpoint("generate") + .client() + ) + + """ + # TODO: Read the runtime from the tdist since it is not stored in global + if self._runtime is None: + print("Get Endpoint: Runtime not set for NovaDependency. Cannot get endpoint.") + raise ValueError("Runtime not set for NovaDependency") + + address = self.on.nova_address() + comp_ns, comp_name = address + print("Get Endpoint: Nova ADDRESS: ", address) + return await self._runtime.namespace(comp_ns)\ + .component(comp_name)\ + .endpoint(name)\ + .client() + + def set_runtime(self, runtime: Any) -> None: """Set the Nova runtime for this dependency""" self._runtime = runtime diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/image.py b/deploy/compoundai/sdk/src/compoundai/sdk/image.py index bff1c916c0ed..503673d820c0 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/image.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/image.py @@ -16,5 +16,10 @@ # wrapper over bento images to handle TritonDistributed base image import bentoml +import os -NOVA_IMAGE = bentoml.images.PythonImage(base_image="triton-distributed:latest-vllm") + +#TODO: "triton-distributed:latest-vllm" image will not be available to image builder +# so we need to use the nova-base image. We'd consider publishing the image to a public registry. +image_name = os.getenv("NOVA_IMAGE", "nvcr.io/nvidian/nim-llm-dev/yatai-bentos:nova-base-0886e19") +NOVA_IMAGE = bentoml.images.PythonImage(base_image=image_name) diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/service.py b/deploy/compoundai/sdk/src/compoundai/sdk/service.py index 93eac9df01a5..3c86691bd0c5 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/service.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/service.py @@ -91,12 +91,8 @@ def nova_address(self) -> Tuple[str, str]: except (json.JSONDecodeError, ValueError) as e: raise ValueError(f"Failed to parse BENTOML_RUNNER_MAP: {str(e)}") from e - # Ensure namespace and name are not None - namespace = self._nova_config.namespace or "default" - name = self._nova_config.name or self.inner.__name__ - - print(f"Using default Nova address: {namespace}/{name}") - return (namespace, name) + print(f"Using default Nova address: {self._nova_config.namespace}/{self._nova_config.name}") + return (self._nova_config.namespace, self._nova_config.name) def get_nova_endpoints(self) -> Dict[str, NovaEndpoint]: """Get all registered Nova endpoints""" From 6058f2ab656295c748579dfda9b3f47aff96874b Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Tue, 4 Mar 2025 18:59:39 -0800 Subject: [PATCH 02/29] feat: updates to compoundai to get it working with kv router --- container/Dockerfile.vllm | 4 + deploy/compoundai/sdk/pyproject.toml | 8 +- .../compoundai/sdk/src/compoundai/__init__.py | 10 +++ .../sdk/src/compoundai/cli/serve_nova.py | 74 ++++++++++++------- .../sdk/src/compoundai/sdk/dependency.py | 30 ++++++++ .../sdk/src/compoundai/sdk/image.py | 7 +- .../sdk/src/compoundai/sdk/service.py | 8 +- 7 files changed, 103 insertions(+), 38 deletions(-) diff --git a/container/Dockerfile.vllm b/container/Dockerfile.vllm index 9e8e085b4837..9041fb2d2df9 100644 --- a/container/Dockerfile.vllm +++ b/container/Dockerfile.vllm @@ -118,6 +118,10 @@ ENV VLLM_KV_CAPI_PATH="/opt/dynemo/bindings/lib/libdynemo_llm_capi.so" # FIXME: Copy more specific folders in for dev/debug after directory restructure COPY . /workspace +RUN source /opt/triton/venv/bin/activate && \ + cd /workspace/deploy/compoundai/sdk && \ + uv pip install -e . + # FIXME: May want a modification with dynemo-distributed banner on entry ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"] diff --git a/deploy/compoundai/sdk/pyproject.toml b/deploy/compoundai/sdk/pyproject.toml index f8ae41385e7c..67bda941387a 100644 --- a/deploy/compoundai/sdk/pyproject.toml +++ b/deploy/compoundai/sdk/pyproject.toml @@ -19,11 +19,13 @@ version = "0.1.0" description = "Add your description here" readme = "README.md" authors = [ - { name = "mabdulwahhab", email = "mabdulwahhab@nvidia.com" } + { name = "mabdulwahhab", email = "mabdulwahhab@nvidia.com" }, + { name = "biswa.panda", email = "biswaranjanp@nvidia.com" } ] -requires-python = "==3.10.*" dependencies = [ - "bentoml>=1.4.1", + # TODO: currently compatible with bentoml==1.4.1, + # v1.4.2 has removed normalize_identifier which is used in compoundai + "bentoml==1.4.1", "types-psutil==7.0.0.20250218", ] diff --git a/deploy/compoundai/sdk/src/compoundai/__init__.py b/deploy/compoundai/sdk/src/compoundai/__init__.py index 60ee5afcdbea..e78724871561 100644 --- a/deploy/compoundai/sdk/src/compoundai/__init__.py +++ b/deploy/compoundai/sdk/src/compoundai/__init__.py @@ -12,3 +12,13 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + +from compoundai.sdk.decorators import nova_endpoint, nova_api, async_onstart +from compoundai.sdk.service import service +from compoundai.sdk.dependency import depends +from bentoml import api +from bentoml._internal.context import server_context +from compoundai.sdk.image import NOVA_IMAGE + + +tdist_context = {} \ No newline at end of file diff --git a/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py b/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py index 8ee63a810a65..2998b39f2a94 100644 --- a/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py +++ b/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py @@ -29,7 +29,10 @@ from dynemo.runtime import DistributedRuntime, dynemo_endpoint, dynemo_worker +from compoundai import tdist_context + logger = logging.getLogger("compoundai.serve.nova") +logger.setLevel(logging.INFO) def generate_run_id(): @@ -70,9 +73,9 @@ def main( from bentoml._internal.log import configure_server_logging run_id = generate_run_id() - - # print the contents of the environment variable BENTOML_RUNNER_MAP - print(f"BENTOML_RUNNER_MAP: {os.environ['BENTOML_RUNNER_MAP']}") + tdist_context["service_name"] = service_name + tdist_context["runner_map"] = runner_map + tdist_context["worker_id"] = worker_id # Import service first to check configuration service = import_service(bento_identifier) @@ -101,10 +104,17 @@ def main( if service.is_nova_component(): if worker_id is not None: server_context.worker_index = worker_id - class_instance = service.inner() @dynemo_worker() async def worker(runtime: DistributedRuntime): + global tdist_context + tdist_context["runtime"] = runtime + # init service instance, calls __init__ + #TODO:bis: delete this print + print( + f"SERVE NOVA triton_worker sn: {service_name} tdist_context: {tdist_context}, runtime: {runtime}" + ) + # logger.info(f"setting tdist_context: {tdist_context}, runtime: {runtime}") if service_name and service_name != service.name: server_context.service_type = "service" else: @@ -124,21 +134,6 @@ async def worker(runtime: DistributedRuntime): await component.create_service() logger.info(f"[{run_id}] Created {service.name} component") - # Run startup hooks before setting up endpoints - for name, member in vars(class_instance.__class__).items(): - if callable(member) and getattr( - member, "__bentoml_startup_hook__", False - ): - logger.info(f"[{run_id}] Running startup hook: {name}") - result = getattr(class_instance, name)() - if inspect.isawaitable(result): - await result - logger.info( - f"[{run_id}] Completed async startup hook: {name}" - ) - else: - logger.info(f"[{run_id}] Completed startup hook: {name}") - # Set runtime on all dependencies for dep in service.dependencies.values(): dep.set_runtime(runtime) @@ -152,10 +147,18 @@ async def worker(runtime: DistributedRuntime): raise ValueError(error_msg) print(f"[{run_id}] Nova endpoints: {nova_endpoints}") + endpoints = [] for name, endpoint in nova_endpoints.items(): td_endpoint = component.endpoint(name) logger.info(f"[{run_id}] Registering endpoint '{name}'") + endpoints.append(td_endpoint) # Bind an instance of inner to the endpoint + # bound_method = endpoint.func.__get__(service.inner()) + tdist_context["component"] = component + tdist_context["endpoints"] = endpoints + class_instance = service.inner() + twm = [] + for name, endpoint in nova_endpoints.items(): bound_method = endpoint.func.__get__(class_instance) # Only pass request type for now, use Any for response # TODO: Handle a dynemo_endpoint not having types @@ -163,17 +166,32 @@ async def worker(runtime: DistributedRuntime): dynemo_wrapped_method = dynemo_endpoint(endpoint.request_type, Any)( bound_method ) - result = await td_endpoint.serve_endpoint(dynemo_wrapped_method) - # WARNING: unreachable code :( because serve blocks - logger.info(f"[{run_id}] Result: {result}") - logger.info(f"[{run_id}] Registered endpoint '{name}'") - - logger.info( - f"[{run_id}] Started {service.name} instance with all endpoints registered" - ) + twm.append(triton_wrapped_method) + #TODO:bis: delete this print + print(f"SETTING sn:{service_name} tdist_context: {tdist_context}") + # Run startup hooks before setting up endpoints + for name, member in vars(class_instance.__class__).items(): + if callable(member) and getattr( + member, "__bentoml_startup_hook__", False + ): + logger.info(f"[{run_id}] Running startup hook: {name}") + result = getattr(class_instance, name)() + if inspect.isawaitable(result): + # await on startup hook async_onstart + await result + logger.info( + f"[{run_id}] Completed async startup hook: {name}" + ) + else: + logger.info(f"[{run_id}] Completed startup hook: {name}") + #TODO:bis: delete this print + print(f"serve nova STARTING sn:{service_name}, endpoints:{endpoints}") logger.info( - f"[{run_id}] Available endpoints: {service.list_nova_endpoints()}" + f"[{run_id}] Starting {service.name} instance with all registered endpoints" ) + #TODO:bis: convert to list + result = await endpoints[0].serve_endpoint(twm[0]) + except Exception as e: logger.error(f"[{run_id}] Error in Nova component setup: {str(e)}") raise diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py b/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py index de3d62520cc9..c2c1f9cf510a 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py @@ -133,6 +133,36 @@ def __init__( self._nova_client: Optional[NovaClient] = None self._runtime = None + # offers an escape hatch to get the endpoint directly + async def get_endpoint(self, name: str) -> Any: + """ + usage: + dep = depends(Worker) + + ... + await dep.get_endpoint("generate") # equivalent to the following + router_client = ( + await runtime.namespace("triton-init") + .component("router") + .endpoint("generate") + .client() + ) + + """ + # TODO: Read the runtime from the tdist since it is not stored in global + if self._runtime is None: + print("Get Endpoint: Runtime not set for NovaDependency. Cannot get endpoint.") + raise ValueError("Runtime not set for NovaDependency") + + address = self.on.nova_address() + comp_ns, comp_name = address + print("Get Endpoint: Nova ADDRESS: ", address) + return await self._runtime.namespace(comp_ns)\ + .component(comp_name)\ + .endpoint(name)\ + .client() + + def set_runtime(self, runtime: Any) -> None: """Set the Nova runtime for this dependency""" self._runtime = runtime diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/image.py b/deploy/compoundai/sdk/src/compoundai/sdk/image.py index bff1c916c0ed..503673d820c0 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/image.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/image.py @@ -16,5 +16,10 @@ # wrapper over bento images to handle TritonDistributed base image import bentoml +import os -NOVA_IMAGE = bentoml.images.PythonImage(base_image="triton-distributed:latest-vllm") + +#TODO: "triton-distributed:latest-vllm" image will not be available to image builder +# so we need to use the nova-base image. We'd consider publishing the image to a public registry. +image_name = os.getenv("NOVA_IMAGE", "nvcr.io/nvidian/nim-llm-dev/yatai-bentos:nova-base-0886e19") +NOVA_IMAGE = bentoml.images.PythonImage(base_image=image_name) diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/service.py b/deploy/compoundai/sdk/src/compoundai/sdk/service.py index 93eac9df01a5..3c86691bd0c5 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/service.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/service.py @@ -91,12 +91,8 @@ def nova_address(self) -> Tuple[str, str]: except (json.JSONDecodeError, ValueError) as e: raise ValueError(f"Failed to parse BENTOML_RUNNER_MAP: {str(e)}") from e - # Ensure namespace and name are not None - namespace = self._nova_config.namespace or "default" - name = self._nova_config.name or self.inner.__name__ - - print(f"Using default Nova address: {namespace}/{name}") - return (namespace, name) + print(f"Using default Nova address: {self._nova_config.namespace}/{self._nova_config.name}") + return (self._nova_config.namespace, self._nova_config.name) def get_nova_endpoints(self) -> Dict[str, NovaEndpoint]: """Get all registered Nova endpoints""" From 7b8e7dd753a686dbe7663d5d696f7dd7bf891a2f Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Wed, 5 Mar 2025 18:26:00 -0800 Subject: [PATCH 03/29] feat: onboarded kv rotuer and basic examples for sdk --- container/Dockerfile.vllm | 2 +- container/Dockerfile.vllm_nixl | 4 + deploy/compoundai/sdk/pyproject.toml | 2 +- .../compoundai/sdk/src/compoundai/__init__.py | 19 ++- .../sdk/src/compoundai/cli/serve_nova.py | 19 +-- .../sdk/src/compoundai/cli/serving.py | 1 - .../sdk/src/compoundai/sdk/dependency.py | 13 +- .../sdk/src/compoundai/sdk/image.py | 10 +- .../sdk/src/compoundai/sdk/service.py | 4 +- .../llm/vllm/sdk_basic_service/README.md | 32 ++++ .../llm/vllm/sdk_basic_service/basic.py | 96 ++++++++++++ .../llm/vllm/sdk_kv_router/README.md | 21 +++ .../llm/vllm/sdk_kv_router/__init__.py | 0 .../llm/vllm/sdk_kv_router/frontend.py | 27 ++++ .../llm/vllm/sdk_kv_router/processor.py | 142 ++++++++++++++++++ .../llm/vllm/sdk_kv_router/router.py | 101 +++++++++++++ .../llm/vllm/sdk_kv_router/worker.py | 108 +++++++++++++ 17 files changed, 568 insertions(+), 33 deletions(-) create mode 100644 examples/python_rs/llm/vllm/sdk_basic_service/README.md create mode 100644 examples/python_rs/llm/vllm/sdk_basic_service/basic.py create mode 100644 examples/python_rs/llm/vllm/sdk_kv_router/README.md create mode 100644 examples/python_rs/llm/vllm/sdk_kv_router/__init__.py create mode 100644 examples/python_rs/llm/vllm/sdk_kv_router/frontend.py create mode 100644 examples/python_rs/llm/vllm/sdk_kv_router/processor.py create mode 100644 examples/python_rs/llm/vllm/sdk_kv_router/router.py create mode 100644 examples/python_rs/llm/vllm/sdk_kv_router/worker.py diff --git a/container/Dockerfile.vllm b/container/Dockerfile.vllm index 9041fb2d2df9..4a994d0a46cf 100644 --- a/container/Dockerfile.vllm +++ b/container/Dockerfile.vllm @@ -118,7 +118,7 @@ ENV VLLM_KV_CAPI_PATH="/opt/dynemo/bindings/lib/libdynemo_llm_capi.so" # FIXME: Copy more specific folders in for dev/debug after directory restructure COPY . /workspace -RUN source /opt/triton/venv/bin/activate && \ +RUN source /opt/dynemo/venv/bin/activate && \ cd /workspace/deploy/compoundai/sdk && \ uv pip install -e . diff --git a/container/Dockerfile.vllm_nixl b/container/Dockerfile.vllm_nixl index ce4c06ba42c6..d2fe50dcb442 100644 --- a/container/Dockerfile.vllm_nixl +++ b/container/Dockerfile.vllm_nixl @@ -243,6 +243,10 @@ ENV VLLM_KV_CAPI_PATH="/opt/dynemo/bindings/lib/libdynemo_llm_capi.so" # FIXME: Copy more specific folders in for dev/debug after directory restructure COPY . /workspace +RUN source /opt/dynemo/venv/bin/activate && \ + cd /workspace/deploy/compoundai/sdk && \ + uv pip install -e . + # FIXME: May want a modification with dynemo-distributed banner on entry ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"] diff --git a/deploy/compoundai/sdk/pyproject.toml b/deploy/compoundai/sdk/pyproject.toml index 67bda941387a..0ae79fa1e8dd 100644 --- a/deploy/compoundai/sdk/pyproject.toml +++ b/deploy/compoundai/sdk/pyproject.toml @@ -23,7 +23,7 @@ authors = [ { name = "biswa.panda", email = "biswaranjanp@nvidia.com" } ] dependencies = [ - # TODO: currently compatible with bentoml==1.4.1, + # TODO: currently compatible with bentoml==1.4.1, # v1.4.2 has removed normalize_identifier which is used in compoundai "bentoml==1.4.1", "types-psutil==7.0.0.20250218", diff --git a/deploy/compoundai/sdk/src/compoundai/__init__.py b/deploy/compoundai/sdk/src/compoundai/__init__.py index e78724871561..a7f090516973 100644 --- a/deploy/compoundai/sdk/src/compoundai/__init__.py +++ b/deploy/compoundai/sdk/src/compoundai/__init__.py @@ -13,12 +13,23 @@ # See the License for the specific language governing permissions and # limitations under the License. -from compoundai.sdk.decorators import nova_endpoint, nova_api, async_onstart -from compoundai.sdk.service import service -from compoundai.sdk.dependency import depends from bentoml import api from bentoml._internal.context import server_context +from compoundai.sdk.decorators import async_onstart, nova_api, nova_endpoint +from compoundai.sdk.dependency import depends from compoundai.sdk.image import NOVA_IMAGE +from compoundai.sdk.service import service +tdist_context = {} -tdist_context = {} \ No newline at end of file +__all__ = [ + "api", + "server_context", + "async_onstart", + "nova_api", + "nova_endpoint", + "depends", + "NOVA_IMAGE", + "service", + "tdist_context", +] diff --git a/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py b/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py index 2998b39f2a94..989965dd07e2 100644 --- a/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py +++ b/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py @@ -26,11 +26,10 @@ from typing import Any import click +from compoundai import tdist_context from dynemo.runtime import DistributedRuntime, dynemo_endpoint, dynemo_worker -from compoundai import tdist_context - logger = logging.getLogger("compoundai.serve.nova") logger.setLevel(logging.INFO) @@ -109,12 +108,6 @@ def main( async def worker(runtime: DistributedRuntime): global tdist_context tdist_context["runtime"] = runtime - # init service instance, calls __init__ - #TODO:bis: delete this print - print( - f"SERVE NOVA triton_worker sn: {service_name} tdist_context: {tdist_context}, runtime: {runtime}" - ) - # logger.info(f"setting tdist_context: {tdist_context}, runtime: {runtime}") if service_name and service_name != service.name: server_context.service_type = "service" else: @@ -146,14 +139,12 @@ async def worker(runtime: DistributedRuntime): logger.error(error_msg) raise ValueError(error_msg) - print(f"[{run_id}] Nova endpoints: {nova_endpoints}") endpoints = [] for name, endpoint in nova_endpoints.items(): td_endpoint = component.endpoint(name) logger.info(f"[{run_id}] Registering endpoint '{name}'") endpoints.append(td_endpoint) # Bind an instance of inner to the endpoint - # bound_method = endpoint.func.__get__(service.inner()) tdist_context["component"] = component tdist_context["endpoints"] = endpoints class_instance = service.inner() @@ -166,9 +157,7 @@ async def worker(runtime: DistributedRuntime): dynemo_wrapped_method = dynemo_endpoint(endpoint.request_type, Any)( bound_method ) - twm.append(triton_wrapped_method) - #TODO:bis: delete this print - print(f"SETTING sn:{service_name} tdist_context: {tdist_context}") + twm.append(dynemo_wrapped_method) # Run startup hooks before setting up endpoints for name, member in vars(class_instance.__class__).items(): if callable(member) and getattr( @@ -184,12 +173,10 @@ async def worker(runtime: DistributedRuntime): ) else: logger.info(f"[{run_id}] Completed startup hook: {name}") - #TODO:bis: delete this print - print(f"serve nova STARTING sn:{service_name}, endpoints:{endpoints}") logger.info( f"[{run_id}] Starting {service.name} instance with all registered endpoints" ) - #TODO:bis: convert to list + # TODO:bis: convert to list result = await endpoints[0].serve_endpoint(twm[0]) except Exception as e: diff --git a/deploy/compoundai/sdk/src/compoundai/cli/serving.py b/deploy/compoundai/sdk/src/compoundai/cli/serving.py index b002c25bce37..d42c45420657 100644 --- a/deploy/compoundai/sdk/src/compoundai/cli/serving.py +++ b/deploy/compoundai/sdk/src/compoundai/cli/serving.py @@ -445,7 +445,6 @@ def serve_http( # inject runner map now inject_env = {"BENTOML_RUNNER_MAP": json.dumps(dependency_map)} - print(f"inject_env: {inject_env}") for watcher in watchers: if watcher.env is None: diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py b/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py index c2c1f9cf510a..ba897df0f181 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py @@ -151,17 +151,20 @@ async def get_endpoint(self, name: str) -> Any: """ # TODO: Read the runtime from the tdist since it is not stored in global if self._runtime is None: - print("Get Endpoint: Runtime not set for NovaDependency. Cannot get endpoint.") + print( + "Get Endpoint: Runtime not set for NovaDependency. Cannot get endpoint." + ) raise ValueError("Runtime not set for NovaDependency") address = self.on.nova_address() comp_ns, comp_name = address print("Get Endpoint: Nova ADDRESS: ", address) - return await self._runtime.namespace(comp_ns)\ - .component(comp_name)\ - .endpoint(name)\ + return ( + await self._runtime.namespace(comp_ns) + .component(comp_name) + .endpoint(name) .client() - + ) def set_runtime(self, runtime: Any) -> None: """Set the Nova runtime for this dependency""" diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/image.py b/deploy/compoundai/sdk/src/compoundai/sdk/image.py index 503673d820c0..034c3b2effdf 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/image.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/image.py @@ -13,13 +13,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -# wrapper over bento images to handle TritonDistributed base image +# wrapper over bento images to handle Dynemo base image -import bentoml import os +import bentoml -#TODO: "triton-distributed:latest-vllm" image will not be available to image builder +# TODO: "dynemo:latest-vllm" image will not be available to image builder # so we need to use the nova-base image. We'd consider publishing the image to a public registry. -image_name = os.getenv("NOVA_IMAGE", "nvcr.io/nvidian/nim-llm-dev/yatai-bentos:nova-base-0886e19") +image_name = os.getenv( + "NOVA_IMAGE", "nvcr.io/nvidian/nim-llm-dev/yatai-bentos:nova-base-0886e19" +) NOVA_IMAGE = bentoml.images.PythonImage(base_image=image_name) diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/service.py b/deploy/compoundai/sdk/src/compoundai/sdk/service.py index 3c86691bd0c5..e510dabce4b5 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/service.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/service.py @@ -91,7 +91,9 @@ def nova_address(self) -> Tuple[str, str]: except (json.JSONDecodeError, ValueError) as e: raise ValueError(f"Failed to parse BENTOML_RUNNER_MAP: {str(e)}") from e - print(f"Using default Nova address: {self._nova_config.namespace}/{self._nova_config.name}") + print( + f"Using default Nova address: {self._nova_config.namespace}/{self._nova_config.name}" + ) return (self._nova_config.namespace, self._nova_config.name) def get_nova_endpoints(self) -> Dict[str, NovaEndpoint]: diff --git a/examples/python_rs/llm/vllm/sdk_basic_service/README.md b/examples/python_rs/llm/vllm/sdk_basic_service/README.md new file mode 100644 index 000000000000..ca04762b9ee6 --- /dev/null +++ b/examples/python_rs/llm/vllm/sdk_basic_service/README.md @@ -0,0 +1,32 @@ +## Overview + +Pipeline Architecture: + +``` +Users/Clients (HTTP) + │ + ▼ +┌─────────────┐ +│ Frontend │ HTTP API endpoint (/generate) +└─────────────┘ + │ nova/distributed-runtime + ▼ +┌─────────────┐ +│ Middle │ +└─────────────┘ + │ nova/distributed-runtime + ▼ +┌─────────────┐ +│ Backend │ +└─────────────┘ +``` + + +## Unified serve +Launch all three services using a single command - + +```bash +cd /workspace/examples/python_rs/llm/vllm + +compoundai serve sdk_basic_service.basic:Frontend +``` diff --git a/examples/python_rs/llm/vllm/sdk_basic_service/basic.py b/examples/python_rs/llm/vllm/sdk_basic_service/basic.py new file mode 100644 index 000000000000..940342e4b827 --- /dev/null +++ b/examples/python_rs/llm/vllm/sdk_basic_service/basic.py @@ -0,0 +1,96 @@ +from compoundai import api +from compoundai.sdk.decorators import nova_endpoint +from compoundai.sdk.dependency import depends +from compoundai.sdk.service import service +from pydantic import BaseModel + +""" +Pipeline Architecture: + +Users/Clients (HTTP) + │ + ▼ +┌─────────────┐ +│ Frontend │ HTTP API endpoint (/generate) +└─────────────┘ + │ nova/distributed-runtime + ▼ +┌─────────────┐ +│ Middle │ +└─────────────┘ + │ nova/distributed-runtime + ▼ +┌─────────────┐ +│ Backend │ +└─────────────┘ +""" + + +class RequestType(BaseModel): + text: str + + +class ResponseType(BaseModel): + text: str + + +@service( + resources={"cpu": "2"}, + traffic={"timeout": 30}, + nova={ + "enabled": True, + "namespace": "inference", + }, + workers=3, +) +class Backend: + def __init__(self) -> None: + print("Starting backend") + + @nova_endpoint() + async def generate(self, text: RequestType): + """Generate tokens.""" + text = f"{text.text}-back" + print(f"Backend received: {text}") + for token in text.split(): + yield f"Backend: {token}" + + +@service( + resources={"cpu": "2"}, + traffic={"timeout": 30}, + nova={"enabled": True, "namespace": "inference"}, +) +class Middle: + backend = depends(Backend) + + def __init__(self) -> None: + print("Starting middle") + + @nova_endpoint() + async def generate(self, text: RequestType): + """Forward requests to backend.""" + text = f"{text.text}-mid" + print(f"Middle received: {text}") + txt = RequestType(text=text) + async for response in self.backend.generate(txt.model_dump_json()): + print(f"Middle received response: {response}") + yield f"Middle: {response}" + + +@service(resources={"cpu": "1"}, traffic={"timeout": 60}) # Regular HTTP API +class Frontend: + middle = depends(Middle) + + def __init__(self) -> None: + print("Starting frontend") + + @api + async def generate(self, text): + """Stream results from the pipeline.""" + print(f"Frontend received: {text}") + print(f"Frontend received type: {type(text)}") + txt = RequestType(text=text) + print(f"Frontend sending: {type(txt)}") + async for response in self.middle.generate(txt.model_dump_json()): + yield f"Frontend: {response}" diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/README.md b/examples/python_rs/llm/vllm/sdk_kv_router/README.md new file mode 100644 index 000000000000..de355c210de5 --- /dev/null +++ b/examples/python_rs/llm/vllm/sdk_kv_router/README.md @@ -0,0 +1,21 @@ +Run this example using command below + +```bash + +cd /workspace/examples/python_rs/llm/vllm + +compoundai serve sdk_kv_router.frontend:Frontend +``` + + +Send request to http service: +```bash + +curl -X 'POST' \ + 'http://localhost:3000/chat_completion' \ + -H 'accept: text/event-stream' \ + -H 'Content-Type: application/json' \ + -d '{ + "msg": "In the heart of Eldoria, an ancient land of boundless magic and mysterious creatures, lies the long-forgotten city of Aeloria. Once a beacon of knowledge and power, Aeloria was buried beneath the shifting sands of time, lost to the world for centuries. You are an intrepid explorer, known for your unparalleled curiosity and courage, who has stumbled upon an ancient map hinting at ests that Aeloria holds a secret so profound that it has the potential to reshape the very fabric of reality. Your journey will take you through treacherous deserts, enchanted forests, and across perilous mountain ranges. Your Task: Character Background: Develop a detailed background for your character. Describe their motivations for seeking out Aeloria, their skills and weaknesses, and any personal connections to the ancient city or its legends. Are they driven by a quest for knowledge, a search for lost familt clue is hidden." +}' +```` \ No newline at end of file diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/__init__.py b/examples/python_rs/llm/vllm/sdk_kv_router/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py b/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py new file mode 100644 index 000000000000..91e5effc05f3 --- /dev/null +++ b/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py @@ -0,0 +1,27 @@ +from compoundai import NOVA_IMAGE, api, depends, service +from sdk_kv_router.processor import Processor + + +@service(traffic={"timeout": 10000}, image=NOVA_IMAGE) +class Frontend: + processor = depends(Processor) + + def __init__(self): + print("frontend init") + + @api + async def chat_completion(self, msg: str): + # Call the generate method + generator = self.processor.generate( + { + "model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B", + "messages": [{"role": "user", "content": msg}], + "stream": True, + "max_tokens": 10, + } + ) + + # Now iterate over the async generator + async for response in generator: + print("client response_data:", response) + yield response diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/processor.py b/examples/python_rs/llm/vllm/sdk_kv_router/processor.py new file mode 100644 index 000000000000..0f16c4078d98 --- /dev/null +++ b/examples/python_rs/llm/vllm/sdk_kv_router/processor.py @@ -0,0 +1,142 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import uuid +from typing import AsyncIterator + +import bentoml +from sdk_kv_router.router import Router +from sdk_kv_router.worker import VllmEngine + +with bentoml.importing(): + from transformers import AutoTokenizer + from vllm.engine.arg_utils import AsyncEngineArgs + from vllm.entrypoints.openai.protocol import ChatCompletionRequest + from vllm.outputs import RequestOutput + from vllm.transformers_utils.tokenizer import AnyTokenizer + from common.chat_processor import ChatProcessor, ProcessMixIn + from common.protocol import MyRequestOutput, Tokens, vLLMGenerateRequest + +from compoundai import depends, nova_endpoint, service, tdist_context + + +@service( + nova={ + "enabled": True, + "namespace": "triton-init", + }, + resources={"cpu": "10", "memory": "20Gi"}, + workers=1, +) +class Processor(ProcessMixIn): + """ + vLLM pre and post processing + """ + + workers = depends(VllmEngine) + router = depends(Router) + + def __init__(self): + model = "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B" + self.engine_args = AsyncEngineArgs( + model=model, + tokenizer=model, + enable_prefix_caching=True, + block_size=64, + max_model_len=16384, + ) + self.model_config = self.engine_args.create_model_config() + self.tokenizer = self._create_tokenizer() + self.chat_processor = ChatProcessor(self.tokenizer, self.model_config) + + def _create_tokenizer(self) -> AnyTokenizer: + """Create a TokenizerGroup using engine arguments similar to VLLM's approach""" + model_path = self.engine_args.model + + # Create the base tokenizer with VLLM's typical settings + base_tokenizer = AutoTokenizer.from_pretrained( + model_path, + trust_remote_code=True, + padding_side="left", + truncation_side="left", + use_fast=True, # VLLM might use the fast tokenizer for efficiency + ) + return base_tokenizer + + async def generate_responses( + self, engine_generator + ) -> AsyncIterator[RequestOutput]: + async for resp in engine_generator: + # Deserialize the response from the engine + # Creates correct vLLM objects for each field + output = MyRequestOutput.model_validate_json(resp.data()) + # OpenAIServingChat.chat_completion_stream_generator() method expects a RequestOutput object + yield RequestOutput( + request_id=output.request_id, + prompt=output.prompt, + prompt_token_ids=output.prompt_token_ids, + prompt_logprobs=output.prompt_logprobs, + outputs=output.outputs, + finished=output.finished, + metrics=output.metrics, + ) + + @nova_endpoint() + async def generate(self, raw_request: ChatCompletionRequest): + request_id = str(uuid.uuid4()) + ( + request, + conversation, + prompt, + engine_prompt, + sampling_params, + ) = await self._parse_raw_request(raw_request) + worker_id = None + async for worker in self.router.generate( + Tokens(tokens=engine_prompt["prompt_token_ids"]).model_dump_json() + ): + worker_id = worker + break + runtime = tdist_context["runtime"] + comp_ns, comp_name = VllmEngine.nova_address() + worker_client = ( + await runtime.namespace(comp_ns) + .component(comp_name) + .endpoint("generate") + .client() + ) + if worker_id == "": + engine_generator = await worker_client.generate( + vLLMGenerateRequest( + engine_prompt=engine_prompt, + sampling_params=sampling_params, + request_id=request_id, + ).model_dump_json() + ) + else: + engine_generator = await worker_client.direct( + vLLMGenerateRequest( + engine_prompt=engine_prompt, + sampling_params=sampling_params, + request_id=request_id, + ).model_dump_json(), + uuid.UUID(worker_id).int, + ) + output = self.generate_responses(engine_generator) + + async for response in await self._stream_response( + request, output, request_id, conversation + ): + yield response diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/router.py b/examples/python_rs/llm/vllm/sdk_kv_router/router.py new file mode 100644 index 000000000000..9f4eb6a1d227 --- /dev/null +++ b/examples/python_rs/llm/vllm/sdk_kv_router/router.py @@ -0,0 +1,101 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import asyncio +from enum import Enum + +import bentoml +from common.protocol import Tokens +from compoundai import async_onstart, nova_endpoint, service, tdist_context + +with bentoml.importing(): + from dynemo.runtime import KvRouter + + +WorkerId = str + + +class RoutingStrategy(Enum): + PREFIX = "prefix" + ROUND_ROBIN = "round_robin" + RANDOM = "random" + + +@service( + nova={ + "enabled": True, + "namespace": "triton-init", + }, + resources={"cpu": "10", "memory": "20Gi"}, + workers=1, +) +class Router: + """ + Request handler for the generate endpoint + """ + + def __init__(self): + self.model_name = "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B" + self.routing_strategy = RoutingStrategy.PREFIX + self.runtime = tdist_context["runtime"] + self.min_workers = 1 + self.router = None + + @async_onstart + async def init_engine(self): + workers_client = ( + await self.runtime.namespace("triton-init") + .component("VllmEngine") + .endpoint("generate") + .client() + ) + wait_task = workers_client.wait_for_endpoints() + await asyncio.sleep(1) + + while not wait_task.done(): + print("Waiting for workers to be ready...") + await asyncio.sleep(5) + + wait_task.result() + + while len(workers_client.endpoint_ids()) < self.min_workers: + print( + f"Waiting for more workers... Current: {len(workers_client.endpoint_ids())}, Required: {self.min_workers}" + ) + await asyncio.sleep(5) + + kv_listener = self.runtime.namespace("triton-init").component(self.model_name) + await kv_listener.create_service() + self.router = KvRouter(self.runtime, kv_listener) + + @nova_endpoint() + async def generate(self, request: Tokens): + lora_id = 0 + worker_id = "" + if self.routing_strategy == RoutingStrategy.PREFIX: + try: + worker_id = await self.router.schedule(request.tokens, lora_id) + except Exception as e: + if "No worker found" in str(e): + worker_id = "" + else: + print(f"Error during worker selection: {e}") + print(f"Scheduling to worker_id: {worker_id}") + yield worker_id + else: + # TODO: Do we implement round_robin and random here? + # or just skip this router and directly enable in preprocess? + raise NotImplementedError( + f"Routing strategy {self.routing_strategy} not implemented" + ) diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/worker.py b/examples/python_rs/llm/vllm/sdk_kv_router/worker.py new file mode 100644 index 000000000000..f9b183042327 --- /dev/null +++ b/examples/python_rs/llm/vllm/sdk_kv_router/worker.py @@ -0,0 +1,108 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import os + +import bentoml + +with bentoml.importing(): + from vllm.engine.arg_utils import AsyncEngineArgs + from vllm.logger import logger as vllm_logger + from vllm.sampling_params import RequestOutputKind + from common.base_engine import BaseVllmEngine + from common.protocol import MyRequestOutput, vLLMGenerateRequest + +from compoundai import ( + async_onstart, + nova_endpoint, + server_context, + service, + tdist_context, +) + +from dynemo.llm import KvMetricsPublisher + +lease_id = None + +## TODO: metrics_publisher.create_endpoint(worker_component), + + +@service( + nova={ + "enabled": True, + "namespace": "triton-init", + }, + resources={"gpu": 1, "cpu": "10", "memory": "20Gi"}, + workers=1, +) +class VllmEngine(BaseVllmEngine): + """ + vLLM Inference Engine + """ + + def __init__(self): + model = "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B" + self.engine_args = AsyncEngineArgs( + model=model, + gpu_memory_utilization=0.8, + enable_prefix_caching=True, + block_size=64, + max_model_len=16384, + ) + VLLM_WORKER_ID = tdist_context["endpoints"][0].lease_id() + os.environ["VLLM_WORKER_ID"] = str(VLLM_WORKER_ID) + os.environ["VLLM_KV_NAMESPACE"] = "triton-init" + os.environ["VLLM_KV_COMPONENT"] = "vllm" + vllm_logger.info(f"Generate endpoint ID: {VLLM_WORKER_ID}") + os.environ["CUDA_VISIBLE_DEVICES"] = f"{server_context.worker_index - 1}" + self.metrics_publisher = KvMetricsPublisher() + super().__init__(self.engine_args) + + async def create_metrics_publisher_endpoint(self): + component = tdist_context["component"] + await self.metrics_publisher.create_endpoint(component) + + @async_onstart + async def init_engine(self): + if self.engine_client is None: + await super().initialize() + print("vLLM worker initialized") + assert self.engine_client is not None, "engine_client was not initialized" + self.engine_client.set_metrics_publisher(self.metrics_publisher) + self.metrics_publisher.publish(0, 1024, 0, 1024) + task = asyncio.create_task(self.create_metrics_publisher_endpoint()) + task.add_done_callback(lambda _: print("metrics publisher endpoint created")) + + @nova_endpoint() + async def generate(self, request: vLLMGenerateRequest): + sampling_params = request.sampling_params + # rust HTTP requires Delta streaming + sampling_params.output_kind = RequestOutputKind.DELTA + + async for response in self.engine_client.generate( + request.engine_prompt, sampling_params, request.request_id + ): + # MyRequestOutput takes care of serializing the response as + # vLLM's RequestOutput is not serializable by default + resp = MyRequestOutput( + request_id=response.request_id, + prompt=response.prompt, + prompt_token_ids=response.prompt_token_ids, + prompt_logprobs=response.prompt_logprobs, + outputs=response.outputs, + finished=response.finished, + ).model_dump_json() + yield resp From 97ba44dc89a596ce5c5d1771f1cfe03e1e402f57 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Wed, 5 Mar 2025 18:45:26 -0800 Subject: [PATCH 04/29] chore: rename to dynemo --- .../operator/internal/nim/nim_test.go | 2 +- .../compoundai/sdk/src/compoundai/__init__.py | 6 +- .../cli/{serve_nova.py => serve_dynemo.py} | 26 ++--- .../sdk/src/compoundai/cli/serving.py | 45 ++++---- .../sdk/src/compoundai/sdk/decorators.py | 20 ++-- .../sdk/src/compoundai/sdk/dependency.py | 66 ++++++------ .../sdk/src/compoundai/sdk/image.py | 4 +- .../sdk/src/compoundai/sdk/service.py | 100 +++++++++--------- .../llm/vllm/sdk_basic_service/README.md | 4 +- .../llm/vllm/sdk_basic_service/basic.py | 14 +-- .../llm/vllm/sdk_kv_router/processor.py | 9 +- .../llm/vllm/sdk_kv_router/router.py | 6 +- .../llm/vllm/sdk_kv_router/worker.py | 6 +- 13 files changed, 155 insertions(+), 153 deletions(-) rename deploy/compoundai/sdk/src/compoundai/cli/{serve_nova.py => serve_dynemo.py} (88%) diff --git a/deploy/compoundai/operator/internal/nim/nim_test.go b/deploy/compoundai/operator/internal/nim/nim_test.go index ca8aaf0b7381..3ce80dc2e542 100644 --- a/deploy/compoundai/operator/internal/nim/nim_test.go +++ b/deploy/compoundai/operator/internal/nim/nim_test.go @@ -133,7 +133,7 @@ func TestGenerateCompoundAINIMDeployments(t *testing.T) { wantErr: false, }, { - name: "Test GenerateCompoundAINIMDeployments nova dependency", + name: "Test GenerateCompoundAINIMDeployments dynemo dependency", args: args{ parentCompoundAIDeployment: &v1alpha1.CompoundAIDeployment{ ObjectMeta: metav1.ObjectMeta{ diff --git a/deploy/compoundai/sdk/src/compoundai/__init__.py b/deploy/compoundai/sdk/src/compoundai/__init__.py index a7f090516973..80f4ef165078 100644 --- a/deploy/compoundai/sdk/src/compoundai/__init__.py +++ b/deploy/compoundai/sdk/src/compoundai/__init__.py @@ -15,7 +15,7 @@ from bentoml import api from bentoml._internal.context import server_context -from compoundai.sdk.decorators import async_onstart, nova_api, nova_endpoint +from compoundai.sdk.decorators import async_onstart, dynemo_api, dynemo_endpoint from compoundai.sdk.dependency import depends from compoundai.sdk.image import NOVA_IMAGE from compoundai.sdk.service import service @@ -26,8 +26,8 @@ "api", "server_context", "async_onstart", - "nova_api", - "nova_endpoint", + "dynemo_api", + "dynemo_endpoint", "depends", "NOVA_IMAGE", "service", diff --git a/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py b/deploy/compoundai/sdk/src/compoundai/cli/serve_dynemo.py similarity index 88% rename from deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py rename to deploy/compoundai/sdk/src/compoundai/cli/serve_dynemo.py index 989965dd07e2..17c40eb32ce4 100644 --- a/deploy/compoundai/sdk/src/compoundai/cli/serve_nova.py +++ b/deploy/compoundai/sdk/src/compoundai/cli/serve_dynemo.py @@ -30,7 +30,7 @@ from dynemo.runtime import DistributedRuntime, dynemo_endpoint, dynemo_worker -logger = logging.getLogger("compoundai.serve.nova") +logger = logging.getLogger("compoundai.serve.dynemo") logger.setLevel(logging.INFO) @@ -65,7 +65,7 @@ def main( worker_env: str | None, worker_id: int | None, ) -> None: - """Start a worker for the given service - either Nova or regular service""" + """Start a worker for the given service - either Dynemo or regular service""" from _bentoml_impl.loader import import_service from bentoml._internal.container import BentoMLContainer from bentoml._internal.context import server_context @@ -99,8 +99,8 @@ def main( t.cast(t.Dict[str, str], json.loads(runner_map)) ) - # Check if Nova is enabled for this service - if service.is_nova_component(): + # Check if Dynemo is enabled for this service + if service.is_dynemo_component(): if worker_id is not None: server_context.worker_index = worker_id @@ -115,8 +115,8 @@ async def worker(runtime: DistributedRuntime): server_context.service_name = service.name - # Get Nova configuration and create component - namespace, component_name = service.nova_address() + # Get Dynemo configuration and create component + namespace, component_name = service.dynemo_address() logger.info( f"[{run_id}] Registering component {namespace}/{component_name}" ) @@ -132,15 +132,15 @@ async def worker(runtime: DistributedRuntime): dep.set_runtime(runtime) logger.info(f"[{run_id}] Set runtime for dependency: {dep}") - # Then register all Nova endpoints - nova_endpoints = service.get_nova_endpoints() - if not nova_endpoints: - error_msg = f"[{run_id}] FATAL ERROR: No Nova endpoints found in service {service.name}!" + # Then register all Dynemo endpoints + dynemo_endpoints = service.get_dynemo_endpoints() + if not dynemo_endpoints: + error_msg = f"[{run_id}] FATAL ERROR: No Dynemo endpoints found in service {service.name}!" logger.error(error_msg) raise ValueError(error_msg) endpoints = [] - for name, endpoint in nova_endpoints.items(): + for name, endpoint in dynemo_endpoints.items(): td_endpoint = component.endpoint(name) logger.info(f"[{run_id}] Registering endpoint '{name}'") endpoints.append(td_endpoint) @@ -149,7 +149,7 @@ async def worker(runtime: DistributedRuntime): tdist_context["endpoints"] = endpoints class_instance = service.inner() twm = [] - for name, endpoint in nova_endpoints.items(): + for name, endpoint in dynemo_endpoints.items(): bound_method = endpoint.func.__get__(class_instance) # Only pass request type for now, use Any for response # TODO: Handle a dynemo_endpoint not having types @@ -180,7 +180,7 @@ async def worker(runtime: DistributedRuntime): result = await endpoints[0].serve_endpoint(twm[0]) except Exception as e: - logger.error(f"[{run_id}] Error in Nova component setup: {str(e)}") + logger.error(f"[{run_id}] Error in Dynemo component setup: {str(e)}") raise asyncio.run(worker()) diff --git a/deploy/compoundai/sdk/src/compoundai/cli/serving.py b/deploy/compoundai/sdk/src/compoundai/cli/serving.py index d42c45420657..2917a8a3e30a 100644 --- a/deploy/compoundai/sdk/src/compoundai/cli/serving.py +++ b/deploy/compoundai/sdk/src/compoundai/cli/serving.py @@ -47,7 +47,7 @@ class ServiceProtocol(Protocol): models: list[Any] bento: Any - def is_nova_component(self) -> bool: + def is_dynemo_component(self) -> bool: ... @@ -155,7 +155,7 @@ def create_dependency_watcher( return watcher, socket, uri -def create_nova_watcher( +def create_dynemo_watcher( bento_identifier: str, svc: ServiceProtocol, uds_path: str, @@ -165,7 +165,7 @@ def create_nova_watcher( working_dir: Optional[str] = None, env: Optional[Dict[str, str]] = None, ) -> tuple[Watcher, CircusSocket, str]: - """Create a watcher for a Nova service in the dependency graph""" + """Create a watcher for a Dynemo service in the dependency graph""" from bentoml.serving import create_watcher # Get socket for this service @@ -174,10 +174,10 @@ def create_nova_watcher( # Get worker configuration num_workers, worker_envs = scheduler.get_worker_env(svc) - # Create Nova-specific worker args + # Create Dynemo-specific worker args args = [ "-m", - "compoundai.cli.serve_nova", # Use our Nova worker module + "compoundai.cli.serve_dynemo", # Use our Dynemo worker module bento_identifier, "--service-name", svc.name, @@ -190,7 +190,7 @@ def create_nova_watcher( # Create the watcher with dependency map in environment watcher = create_watcher( - name=f"nova_service_{svc.name}", + name=f"dynemo_service_{svc.name}", args=args, numprocesses=num_workers, working_dir=working_dir, @@ -306,12 +306,12 @@ def serve_http( if name in dependency_map: continue - # Check if this is a Nova service + # Check if this is a Dynemo service if ( - hasattr(dep_svc, "is_nova_component") - and dep_svc.is_nova_component() + hasattr(dep_svc, "is_dynemo_component") + and dep_svc.is_dynemo_component() ): - new_watcher, new_socket, uri = create_nova_watcher( + new_watcher, new_socket, uri = create_dynemo_watcher( bento_id, dep_svc, uds_path, @@ -354,7 +354,7 @@ def serve_http( except ValueError as e: raise BentoMLConfigException(f"Invalid host IP address: {host}") from e - if not svc.is_nova_component(): + if not svc.is_dynemo_component(): sockets.append( CircusSocket( name=API_SERVER_NAME, @@ -405,12 +405,12 @@ def serve_http( scheme = "https" if BentoMLContainer.ssl.enabled.get() else "http" - # Check if this is a Nova service - if hasattr(svc, "is_nova_component") and svc.is_nova_component(): - # Create Nova-specific watcher using existing socket + # Check if this is a Dynemo service + if hasattr(svc, "is_dynemo_component") and svc.is_dynemo_component(): + # Create Dynemo-specific watcher using existing socket args = [ "-m", - "compoundai.cli.serve_nova", # Use our Nova worker module + "compoundai.cli.serve_dynemo", # Use our Dynemo worker module bento_identifier, "--service-name", svc.name, @@ -418,7 +418,7 @@ def serve_http( "$(CIRCUS.WID)", ] watcher = create_watcher( - name=f"nova_service_{svc.name}", + name=f"dynemo_service_{svc.name}", args=args, numprocesses=num_workers, working_dir=str(bento_path.absolute()), @@ -426,7 +426,7 @@ def serve_http( env=env, # Dependency map will be injected by serve_http ) watchers.append(watcher) - print(f"nova_service_{svc.name} entrypoint created") + print(f"dynemo_service_{svc.name} entrypoint created") else: # Create regular BentoML service watcher watchers.append( @@ -473,12 +473,15 @@ def serve_http( arbiter.exit_stack.callback(shutil.rmtree, uds_path, ignore_errors=True) arbiter.start( cb=lambda _: logger.info( # type: ignore - "Starting Nova Service %s (%s/%s) listening on %s://%s:%d (Press CTRL+C to quit)" - if (hasattr(svc, "is_nova_component") and svc.is_nova_component()) + "Starting Dynemo Service %s (%s/%s) listening on %s://%s:%d (Press CTRL+C to quit)" + if (hasattr(svc, "is_dynemo_component") and svc.is_dynemo_component()) else 'Starting production %s BentoServer from "%s" (Press CTRL+C to quit)', *( - (svc.name, *svc.nova_address(), scheme, log_host, port) - if (hasattr(svc, "is_nova_component") and svc.is_nova_component()) + (svc.name, *svc.dynemo_address(), scheme, log_host, port) + if ( + hasattr(svc, "is_dynemo_component") + and svc.is_dynemo_component() + ) else (scheme.upper(), bento_identifier) ), ), diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/decorators.py b/deploy/compoundai/sdk/src/compoundai/sdk/decorators.py index 6ef09f661933..6936982b93eb 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/decorators.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/decorators.py @@ -23,13 +23,13 @@ from pydantic import BaseModel -class NovaEndpoint: - """Decorator class for Nova endpoints""" +class DynemoEndpoint: + """Decorator class for Dynemo endpoints""" def __init__(self, func: t.Callable, name: str | None = None): self.func = func self.name = name or func.__name__ - self.is_nova_endpoint = True + self.is_dynemo_endpoint = True # Extract request type from hints hints = get_type_hints(func) @@ -58,29 +58,29 @@ async def __call__(self, *args: t.Any, **kwargs: t.Any) -> Any: return await self.func(*args, **kwargs) -def nova_endpoint(name: str | None = None) -> t.Callable[[t.Callable], NovaEndpoint]: - """Decorator for Nova endpoints. +def dynemo_endpoint(name: str | None = None) -> t.Callable[[t.Callable], DynemoEndpoint]: + """Decorator for Dynemo endpoints. Args: name: Optional name for the endpoint. Defaults to function name. Example: - @nova_endpoint() + @dynemo_endpoint() def my_endpoint(self, input: str) -> str: return input - @nova_endpoint(name="custom_name") + @dynemo_endpoint(name="custom_name") def another_endpoint(self, input: str) -> str: return input """ - def decorator(func: t.Callable) -> NovaEndpoint: - return NovaEndpoint(func, name) + def decorator(func: t.Callable) -> DynemoEndpoint: + return DynemoEndpoint(func, name) return decorator -def nova_api(func: t.Callable) -> t.Callable: +def dynemo_api(func: t.Callable) -> t.Callable: """Decorator for BentoML API endpoints. Args: diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py b/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py index ba897df0f181..a4f2a7b64d6a 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py @@ -23,25 +23,25 @@ T = TypeVar("T") -class NovaClient: - """Client for calling Nova endpoints with streaming support""" +class DynemoClient: + """Client for calling Dynemo endpoints with streaming support""" def __init__(self, service: CompoundService[Any]): self._service = service - self._endpoints = service.get_nova_endpoints() - self._nova_clients: Dict[str, Any] = {} + self._endpoints = service.get_dynemo_endpoints() + self._dynemo_clients: Dict[str, Any] = {} self._runtime = None def __getattr__(self, name: str) -> Any: if name not in self._endpoints: raise AttributeError( - f"No Nova endpoint '{name}' found on service '{self._service.name}'. " + f"No Dynemo endpoint '{name}' found on service '{self._service.name}'. " f"Available endpoints: {list(self._endpoints.keys())}" ) # For streaming endpoints, create/cache the stream function - if name not in self._nova_clients: - namespace, component_name = self._service.nova_address() + if name not in self._dynemo_clients: + namespace, component_name = self._service.dynemo_address() # Create async generator function that uses Queue for streaming async def get_stream(*args, **kwargs): @@ -71,7 +71,7 @@ async def stream_worker(): raise else: - # Create nova worker if no runtime + # Create dynemo worker if no runtime from dynemo.runtime import DistributedRuntime, dynemo_worker @dynemo_worker() @@ -114,13 +114,13 @@ async def stream_worker(runtime: DistributedRuntime): except Exception: raise - self._nova_clients[name] = get_stream + self._dynemo_clients[name] = get_stream - return self._nova_clients[name] + return self._dynemo_clients[name] -class NovaDependency(Dependency[T]): - """Enhanced dependency that supports Nova endpoints""" +class DynemoDependency(Dependency[T]): + """Enhanced dependency that supports Dynemo endpoints""" def __init__( self, @@ -130,7 +130,7 @@ def __init__( cluster: str | None = None, ): super().__init__(on, url=url, deployment=deployment, cluster=cluster) - self._nova_client: Optional[NovaClient] = None + self._dynemo_client: Optional[DynemoClient] = None self._runtime = None # offers an escape hatch to get the endpoint directly @@ -142,7 +142,7 @@ async def get_endpoint(self, name: str) -> Any: ... await dep.get_endpoint("generate") # equivalent to the following router_client = ( - await runtime.namespace("triton-init") + await runtime.namespace("dynemo-init") .component("router") .endpoint("generate") .client() @@ -152,13 +152,13 @@ async def get_endpoint(self, name: str) -> Any: # TODO: Read the runtime from the tdist since it is not stored in global if self._runtime is None: print( - "Get Endpoint: Runtime not set for NovaDependency. Cannot get endpoint." + "Get Endpoint: Runtime not set for DynemoDependency. Cannot get endpoint." ) - raise ValueError("Runtime not set for NovaDependency") + raise ValueError("Runtime not set for DynemoDependency") - address = self.on.nova_address() + address = self.on.dynemo_address() comp_ns, comp_name = address - print("Get Endpoint: Nova ADDRESS: ", address) + print("Get Endpoint: Dynemo ADDRESS: ", address) return ( await self._runtime.namespace(comp_ns) .component(comp_name) @@ -167,19 +167,19 @@ async def get_endpoint(self, name: str) -> Any: ) def set_runtime(self, runtime: Any) -> None: - """Set the Nova runtime for this dependency""" + """Set the Dynemo runtime for this dependency""" self._runtime = runtime - if self._nova_client: - self._nova_client._runtime = runtime + if self._dynemo_client: + self._dynemo_client._runtime = runtime def get(self, *args: Any, **kwargs: Any) -> T | Any: - # If this is a Nova-enabled service, return the Nova client - if isinstance(self.on, CompoundService) and self.on.is_nova_component(): - if self._nova_client is None: - self._nova_client = NovaClient(self.on) + # If this is a Dynemo-enabled service, return the Dynemo client + if isinstance(self.on, CompoundService) and self.on.is_dynemo_component(): + if self._dynemo_client is None: + self._dynemo_client = DynemoClient(self.on) if self._runtime: - self._nova_client._runtime = self._runtime - return self._nova_client + self._dynemo_client._runtime = self._runtime + return self._dynemo_client # Otherwise fall back to normal BentoML dependency resolution return super().get(*args, **kwargs) @@ -191,11 +191,11 @@ def depends( url: str | None = None, deployment: str | None = None, cluster: str | None = None, -) -> NovaDependency[T]: - """Create a dependency that's Nova-aware. +) -> DynemoDependency[T]: + """Create a dependency that's Dynemo-aware. - If the dependency is on a Nova-enabled service, this will return a client - that can call Nova endpoints. Otherwise behaves like normal BentoML dependency. + If the dependency is on a Dynemo-enabled service, this will return a client + that can call Dynemo endpoints. Otherwise behaves like normal BentoML dependency. Args: on: The service to depend on @@ -204,8 +204,8 @@ def depends( cluster: Cluster name Raises: - AttributeError: When trying to call a non-existent Nova endpoint + AttributeError: When trying to call a non-existent Dynemo endpoint """ if on is not None and not isinstance(on, Service): raise TypeError("depends() expects a class decorated with @service()") - return NovaDependency(on, url=url, deployment=deployment, cluster=cluster) + return DynemoDependency(on, url=url, deployment=deployment, cluster=cluster) diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/image.py b/deploy/compoundai/sdk/src/compoundai/sdk/image.py index 034c3b2effdf..eabf0fbb94ed 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/image.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/image.py @@ -20,8 +20,8 @@ import bentoml # TODO: "dynemo:latest-vllm" image will not be available to image builder -# so we need to use the nova-base image. We'd consider publishing the image to a public registry. +# so we need to use the dynemo-base image. We'd consider publishing the image to a public registry. image_name = os.getenv( - "NOVA_IMAGE", "nvcr.io/nvidian/nim-llm-dev/yatai-bentos:nova-base-0886e19" + "NOVA_IMAGE", "nvcr.io/nvidian/nim-llm-dev/yatai-bentos:dynemo-base-0886e19" ) NOVA_IMAGE = bentoml.images.PythonImage(base_image=image_name) diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/service.py b/deploy/compoundai/sdk/src/compoundai/sdk/service.py index e510dabce4b5..70dbdfebe43b 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/service.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/service.py @@ -21,14 +21,14 @@ from _bentoml_sdk import Service, ServiceConfig from _bentoml_sdk.images import Image -from compoundai.sdk.decorators import NovaEndpoint +from compoundai.sdk.decorators import DynemoEndpoint T = TypeVar("T", bound=object) @dataclass -class NovaConfig: - """Configuration for Nova components""" +class DynemoConfig: + """Configuration for Dynemo components""" enabled: bool = False name: str | None = None @@ -36,7 +36,7 @@ class NovaConfig: class CompoundService(Service[T]): - """A custom service class that extends BentoML's base Service with Nova capabilities""" + """A custom service class that extends BentoML's base Service with Dynemo capabilities""" def __init__( self, @@ -44,71 +44,71 @@ def __init__( inner: type[T], image: Optional[Image] = None, envs: Optional[list[dict[str, Any]]] = None, - nova_config: Optional[NovaConfig] = None, + dynemo_config: Optional[DynemoConfig] = None, ): super().__init__(config=config, inner=inner, image=image, envs=envs or []) - # Initialize Nova configuration - self._nova_config = ( - nova_config - if nova_config - else NovaConfig(name=inner.__name__, namespace="default") + # Initialize Dynemo configuration + self._dynemo_config = ( + dynemo_config + if dynemo_config + else DynemoConfig(name=inner.__name__, namespace="default") ) - if self._nova_config.name is None: - self._nova_config.name = inner.__name__ + if self._dynemo_config.name is None: + self._dynemo_config.name = inner.__name__ - # Register Nova endpoints - self._nova_endpoints: Dict[str, NovaEndpoint] = {} + # Register Dynemo endpoints + self._dynemo_endpoints: Dict[str, DynemoEndpoint] = {} for field in dir(inner): value = getattr(inner, field) - if isinstance(value, NovaEndpoint): - self._nova_endpoints[value.name] = value + if isinstance(value, DynemoEndpoint): + self._dynemo_endpoints[value.name] = value - def is_nova_component(self) -> bool: - """Check if this service is configured as a Nova component""" - return self._nova_config.enabled + def is_dynemo_component(self) -> bool: + """Check if this service is configured as a Dynemo component""" + return self._dynemo_config.enabled - def nova_address(self) -> Tuple[str, str]: - """Get the Nova address for this component in namespace/name format""" - if not self.is_nova_component(): - raise ValueError("Service is not configured as a Nova component") + def dynemo_address(self) -> Tuple[str, str]: + """Get the Dynemo address for this component in namespace/name format""" + if not self.is_dynemo_component(): + raise ValueError("Service is not configured as a Dynemo component") - # Check if we have a runner map with Nova address + # Check if we have a runner map with Dynemo address runner_map = os.environ.get("BENTOML_RUNNER_MAP") if runner_map: try: runners = json.loads(runner_map) if self.name in runners: address = runners[self.name] - if address.startswith("nova://"): - # Parse nova://namespace/name into (namespace, name) + if address.startswith("dynemo://"): + # Parse dynemo://namespace/name into (namespace, name) _, path = address.split("://", 1) namespace, name = path.split("/", 1) print( - f"Resolved Nova address from runner map: {namespace}/{name}" + f"Resolved Dynemo address from runner map: {namespace}/{name}" ) return (namespace, name) except (json.JSONDecodeError, ValueError) as e: raise ValueError(f"Failed to parse BENTOML_RUNNER_MAP: {str(e)}") from e print( - f"Using default Nova address: {self._nova_config.namespace}/{self._nova_config.name}" + f"Using default Dynemo address: {self._dynemo_config.namespace}/{self._dynemo_config.name}" ) - return (self._nova_config.namespace, self._nova_config.name) + return (self._dynemo_config.namespace, self._dynemo_config.name) - def get_nova_endpoints(self) -> Dict[str, NovaEndpoint]: - """Get all registered Nova endpoints""" - return self._nova_endpoints + def get_dynemo_endpoints(self) -> Dict[str, DynemoEndpoint]: + """Get all registered Dynemo endpoints""" + return self._dynemo_endpoints - def get_nova_endpoint(self, name: str) -> NovaEndpoint: - """Get a specific Nova endpoint by name""" - if name not in self._nova_endpoints: - raise ValueError(f"No Nova endpoint found with name: {name}") - return self._nova_endpoints[name] + def get_dynemo_endpoint(self, name: str) -> DynemoEndpoint: + """Get a specific Dynemo endpoint by name""" + if name not in self._dynemo_endpoints: + raise ValueError(f"No Dynemo endpoint found with name: {name}") + return self._dynemo_endpoints[name] - def list_nova_endpoints(self) -> List[str]: - """List names of all registered Nova endpoints""" - return list(self._nova_endpoints.keys()) + def list_dynemo_endpoints(self) -> List[str]: + """List names of all registered Dynemo endpoints""" + return list(self._dynemo_endpoints.keys()) # todo: add another function to bind an instance of the inner to the self within these methods @@ -119,13 +119,13 @@ def service( *, image: Optional[Image] = None, envs: Optional[list[dict[str, Any]]] = None, - nova: Optional[Union[Dict[str, Any], NovaConfig]] = None, + dynemo: Optional[Union[Dict[str, Any], DynemoConfig]] = None, **kwargs: Any, ) -> Any: - """Enhanced service decorator that supports Nova configuration + """Enhanced service decorator that supports Dynemo configuration Args: - nova: Nova configuration, either as a NovaConfig object or dict with keys: + dynemo: Dynemo configuration, either as a DynemoConfig object or dict with keys: - enabled: bool (default True) - name: str (default: class name) - namespace: str (default: "default") @@ -133,13 +133,13 @@ def service( """ config = kwargs - # Parse dict into NovaConfig object - nova_config: Optional[NovaConfig] = None - if nova is not None: - if isinstance(nova, dict): - nova_config = NovaConfig(**nova) + # Parse dict into DynemoConfig object + dynemo_config: Optional[DynemoConfig] = None + if dynemo is not None: + if isinstance(dynemo, dict): + dynemo_config = DynemoConfig(**dynemo) else: - nova_config = nova + dynemo_config = dynemo def decorator(inner: type[T]) -> CompoundService[T]: if isinstance(inner, Service): @@ -149,7 +149,7 @@ def decorator(inner: type[T]) -> CompoundService[T]: inner=inner, image=image, envs=envs or [], - nova_config=nova_config, + dynemo_config=dynemo_config, ) return decorator(inner) if inner is not None else decorator diff --git a/examples/python_rs/llm/vllm/sdk_basic_service/README.md b/examples/python_rs/llm/vllm/sdk_basic_service/README.md index ca04762b9ee6..6bb70bd68b04 100644 --- a/examples/python_rs/llm/vllm/sdk_basic_service/README.md +++ b/examples/python_rs/llm/vllm/sdk_basic_service/README.md @@ -9,12 +9,12 @@ Users/Clients (HTTP) ┌─────────────┐ │ Frontend │ HTTP API endpoint (/generate) └─────────────┘ - │ nova/distributed-runtime + │ dynemo/distributed-runtime ▼ ┌─────────────┐ │ Middle │ └─────────────┘ - │ nova/distributed-runtime + │ dynemo/distributed-runtime ▼ ┌─────────────┐ │ Backend │ diff --git a/examples/python_rs/llm/vllm/sdk_basic_service/basic.py b/examples/python_rs/llm/vllm/sdk_basic_service/basic.py index 940342e4b827..5f273828b984 100644 --- a/examples/python_rs/llm/vllm/sdk_basic_service/basic.py +++ b/examples/python_rs/llm/vllm/sdk_basic_service/basic.py @@ -1,5 +1,5 @@ from compoundai import api -from compoundai.sdk.decorators import nova_endpoint +from compoundai.sdk.decorators import dynemo_endpoint from compoundai.sdk.dependency import depends from compoundai.sdk.service import service from pydantic import BaseModel @@ -13,12 +13,12 @@ ┌─────────────┐ │ Frontend │ HTTP API endpoint (/generate) └─────────────┘ - │ nova/distributed-runtime + │ dynemo/distributed-runtime ▼ ┌─────────────┐ │ Middle │ └─────────────┘ - │ nova/distributed-runtime + │ dynemo/distributed-runtime ▼ ┌─────────────┐ │ Backend │ @@ -37,7 +37,7 @@ class ResponseType(BaseModel): @service( resources={"cpu": "2"}, traffic={"timeout": 30}, - nova={ + dynemo={ "enabled": True, "namespace": "inference", }, @@ -47,7 +47,7 @@ class Backend: def __init__(self) -> None: print("Starting backend") - @nova_endpoint() + @dynemo_endpoint() async def generate(self, text: RequestType): """Generate tokens.""" text = f"{text.text}-back" @@ -59,7 +59,7 @@ async def generate(self, text: RequestType): @service( resources={"cpu": "2"}, traffic={"timeout": 30}, - nova={"enabled": True, "namespace": "inference"}, + dynemo={"enabled": True, "namespace": "inference"}, ) class Middle: backend = depends(Backend) @@ -67,7 +67,7 @@ class Middle: def __init__(self) -> None: print("Starting middle") - @nova_endpoint() + @dynemo_endpoint() async def generate(self, text: RequestType): """Forward requests to backend.""" text = f"{text.text}-mid" diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/processor.py b/examples/python_rs/llm/vllm/sdk_kv_router/processor.py index 0f16c4078d98..7e3b6dae9993 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/processor.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/processor.py @@ -29,11 +29,11 @@ from common.chat_processor import ChatProcessor, ProcessMixIn from common.protocol import MyRequestOutput, Tokens, vLLMGenerateRequest -from compoundai import depends, nova_endpoint, service, tdist_context +from compoundai import depends, dynemo_endpoint, service, tdist_context @service( - nova={ + dynemo={ "enabled": True, "namespace": "triton-init", }, @@ -82,7 +82,6 @@ async def generate_responses( # Deserialize the response from the engine # Creates correct vLLM objects for each field output = MyRequestOutput.model_validate_json(resp.data()) - # OpenAIServingChat.chat_completion_stream_generator() method expects a RequestOutput object yield RequestOutput( request_id=output.request_id, prompt=output.prompt, @@ -93,7 +92,7 @@ async def generate_responses( metrics=output.metrics, ) - @nova_endpoint() + @dynemo_endpoint() async def generate(self, raw_request: ChatCompletionRequest): request_id = str(uuid.uuid4()) ( @@ -110,7 +109,7 @@ async def generate(self, raw_request: ChatCompletionRequest): worker_id = worker break runtime = tdist_context["runtime"] - comp_ns, comp_name = VllmEngine.nova_address() + comp_ns, comp_name = VllmEngine.dynemo_address() worker_client = ( await runtime.namespace(comp_ns) .component(comp_name) diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/router.py b/examples/python_rs/llm/vllm/sdk_kv_router/router.py index 9f4eb6a1d227..860f2d6bb435 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/router.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/router.py @@ -17,7 +17,7 @@ import bentoml from common.protocol import Tokens -from compoundai import async_onstart, nova_endpoint, service, tdist_context +from compoundai import async_onstart, dynemo_endpoint, service, tdist_context with bentoml.importing(): from dynemo.runtime import KvRouter @@ -33,7 +33,7 @@ class RoutingStrategy(Enum): @service( - nova={ + dynemo={ "enabled": True, "namespace": "triton-init", }, @@ -79,7 +79,7 @@ async def init_engine(self): await kv_listener.create_service() self.router = KvRouter(self.runtime, kv_listener) - @nova_endpoint() + @dynemo_endpoint() async def generate(self, request: Tokens): lora_id = 0 worker_id = "" diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/worker.py b/examples/python_rs/llm/vllm/sdk_kv_router/worker.py index f9b183042327..ab17a9e2034d 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/worker.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/worker.py @@ -27,7 +27,7 @@ from compoundai import ( async_onstart, - nova_endpoint, + dynemo_endpoint, server_context, service, tdist_context, @@ -41,7 +41,7 @@ @service( - nova={ + dynemo={ "enabled": True, "namespace": "triton-init", }, @@ -86,7 +86,7 @@ async def init_engine(self): task = asyncio.create_task(self.create_metrics_publisher_endpoint()) task.add_done_callback(lambda _: print("metrics publisher endpoint created")) - @nova_endpoint() + @dynemo_endpoint() async def generate(self, request: vLLMGenerateRequest): sampling_params = request.sampling_params # rust HTTP requires Delta streaming From 0500cd367b9fcfae61ee683202e0b5e6c810cd83 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Wed, 5 Mar 2025 18:45:59 -0800 Subject: [PATCH 05/29] style: formatting --- deploy/compoundai/sdk/src/compoundai/sdk/decorators.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/decorators.py b/deploy/compoundai/sdk/src/compoundai/sdk/decorators.py index 6936982b93eb..c3e8b2ee173c 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/decorators.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/decorators.py @@ -58,7 +58,9 @@ async def __call__(self, *args: t.Any, **kwargs: t.Any) -> Any: return await self.func(*args, **kwargs) -def dynemo_endpoint(name: str | None = None) -> t.Callable[[t.Callable], DynemoEndpoint]: +def dynemo_endpoint( + name: str | None = None, +) -> t.Callable[[t.Callable], DynemoEndpoint]: """Decorator for Dynemo endpoints. Args: From 84c45952480d956bc13a6f69e911712ff2d97381 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Wed, 5 Mar 2025 18:48:34 -0800 Subject: [PATCH 06/29] chore: add license headers --- .../llm/vllm/sdk_basic_service/README.md | 17 +++++++++++++++++ .../llm/vllm/sdk_basic_service/basic.py | 15 +++++++++++++++ .../python_rs/llm/vllm/sdk_kv_router/README.md | 17 +++++++++++++++++ .../llm/vllm/sdk_kv_router/__init__.py | 14 ++++++++++++++ .../llm/vllm/sdk_kv_router/frontend.py | 15 +++++++++++++++ 5 files changed, 78 insertions(+) diff --git a/examples/python_rs/llm/vllm/sdk_basic_service/README.md b/examples/python_rs/llm/vllm/sdk_basic_service/README.md index 6bb70bd68b04..28df36289352 100644 --- a/examples/python_rs/llm/vllm/sdk_basic_service/README.md +++ b/examples/python_rs/llm/vllm/sdk_basic_service/README.md @@ -1,3 +1,20 @@ + + ## Overview Pipeline Architecture: diff --git a/examples/python_rs/llm/vllm/sdk_basic_service/basic.py b/examples/python_rs/llm/vllm/sdk_basic_service/basic.py index 5f273828b984..74e9dec33178 100644 --- a/examples/python_rs/llm/vllm/sdk_basic_service/basic.py +++ b/examples/python_rs/llm/vllm/sdk_basic_service/basic.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + from compoundai import api from compoundai.sdk.decorators import dynemo_endpoint from compoundai.sdk.dependency import depends diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/README.md b/examples/python_rs/llm/vllm/sdk_kv_router/README.md index de355c210de5..95e2ecf25b9d 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/README.md +++ b/examples/python_rs/llm/vllm/sdk_kv_router/README.md @@ -1,3 +1,20 @@ + + Run this example using command below ```bash diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/__init__.py b/examples/python_rs/llm/vllm/sdk_kv_router/__init__.py index e69de29bb2d1..3159bfe65645 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/__init__.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/__init__.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py b/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py index 91e5effc05f3..a120ee6de6f7 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + from compoundai import NOVA_IMAGE, api, depends, service from sdk_kv_router.processor import Processor From f5c36b630e4e76b6422646a7c3043f29be559623 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Wed, 5 Mar 2025 18:53:26 -0800 Subject: [PATCH 07/29] fix: update email and description --- deploy/compoundai/sdk/pyproject.toml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/deploy/compoundai/sdk/pyproject.toml b/deploy/compoundai/sdk/pyproject.toml index 0ae79fa1e8dd..b068a9eb1c0a 100644 --- a/deploy/compoundai/sdk/pyproject.toml +++ b/deploy/compoundai/sdk/pyproject.toml @@ -16,11 +16,10 @@ [project] name = "compoundai" version = "0.1.0" -description = "Add your description here" +description = "Distributed Inference Framework" readme = "README.md" authors = [ - { name = "mabdulwahhab", email = "mabdulwahhab@nvidia.com" }, - { name = "biswa.panda", email = "biswaranjanp@nvidia.com" } + { name = "NVIDIA Inc.", email = "sw-dl-dynemo@nvidia.com" }, ] dependencies = [ # TODO: currently compatible with bentoml==1.4.1, From 6bc55e1f987b92e2b99046655e346bdd4d7955dc Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Wed, 5 Mar 2025 19:07:05 -0800 Subject: [PATCH 08/29] fix: rename to dynemo and doc update --- deploy/compoundai/sdk/src/compoundai/__init__.py | 4 ++-- deploy/compoundai/sdk/src/compoundai/sdk/image.py | 10 ++++------ examples/python_rs/llm/vllm/sdk_kv_router/frontend.py | 4 ++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/deploy/compoundai/sdk/src/compoundai/__init__.py b/deploy/compoundai/sdk/src/compoundai/__init__.py index 80f4ef165078..b7323ecc9d13 100644 --- a/deploy/compoundai/sdk/src/compoundai/__init__.py +++ b/deploy/compoundai/sdk/src/compoundai/__init__.py @@ -17,7 +17,7 @@ from bentoml._internal.context import server_context from compoundai.sdk.decorators import async_onstart, dynemo_api, dynemo_endpoint from compoundai.sdk.dependency import depends -from compoundai.sdk.image import NOVA_IMAGE +from compoundai.sdk.image import DYNEMO_IMAGE from compoundai.sdk.service import service tdist_context = {} @@ -29,7 +29,7 @@ "dynemo_api", "dynemo_endpoint", "depends", - "NOVA_IMAGE", + "DYNEMO_IMAGE", "service", "tdist_context", ] diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/image.py b/deploy/compoundai/sdk/src/compoundai/sdk/image.py index eabf0fbb94ed..4556a631be63 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/image.py +++ b/deploy/compoundai/sdk/src/compoundai/sdk/image.py @@ -19,9 +19,7 @@ import bentoml -# TODO: "dynemo:latest-vllm" image will not be available to image builder -# so we need to use the dynemo-base image. We'd consider publishing the image to a public registry. -image_name = os.getenv( - "NOVA_IMAGE", "nvcr.io/nvidian/nim-llm-dev/yatai-bentos:dynemo-base-0886e19" -) -NOVA_IMAGE = bentoml.images.PythonImage(base_image=image_name) +# TODO: "dynemo:latest-vllm" image will not be available to image builder in k8s +# so We'd consider publishing the base image for releases to public nvcr.io registry. +image_name = os.getenv("DYNEMO_IMAGE", "dynemo:latest-vllm") +DYNEMO_IMAGE = bentoml.images.PythonImage(base_image=image_name) diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py b/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py index a120ee6de6f7..6b2f4d82a3fa 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py @@ -13,11 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -from compoundai import NOVA_IMAGE, api, depends, service +from compoundai import DYNEMO_IMAGE, api, depends, service from sdk_kv_router.processor import Processor -@service(traffic={"timeout": 10000}, image=NOVA_IMAGE) +@service(traffic={"timeout": 10000}, image=DYNEMO_IMAGE) class Frontend: processor = depends(Processor) From 24b809ab5f1f9c35824fcd6a7fdc250e41daac34 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Wed, 5 Mar 2025 19:39:12 -0800 Subject: [PATCH 09/29] fix: lint errors --- .../compoundai/sdk/src/compoundai/__init__.py | 4 ++-- .../sdk/src/compoundai/cli/serve_dynemo.py | 16 ++++++++-------- .../llm/vllm/sdk_basic_service/basic.py | 18 ++++++++++-------- .../llm/vllm/sdk_kv_router/processor.py | 4 ++-- .../python_rs/llm/vllm/sdk_kv_router/router.py | 5 ++--- .../python_rs/llm/vllm/sdk_kv_router/worker.py | 6 +++--- 6 files changed, 27 insertions(+), 26 deletions(-) diff --git a/deploy/compoundai/sdk/src/compoundai/__init__.py b/deploy/compoundai/sdk/src/compoundai/__init__.py index b7323ecc9d13..5b0418fc2559 100644 --- a/deploy/compoundai/sdk/src/compoundai/__init__.py +++ b/deploy/compoundai/sdk/src/compoundai/__init__.py @@ -20,7 +20,7 @@ from compoundai.sdk.image import DYNEMO_IMAGE from compoundai.sdk.service import service -tdist_context = {} +dynemo_context = {} __all__ = [ "api", @@ -31,5 +31,5 @@ "depends", "DYNEMO_IMAGE", "service", - "tdist_context", + "dynemo_context", ] diff --git a/deploy/compoundai/sdk/src/compoundai/cli/serve_dynemo.py b/deploy/compoundai/sdk/src/compoundai/cli/serve_dynemo.py index 17c40eb32ce4..1b49a10c5f29 100644 --- a/deploy/compoundai/sdk/src/compoundai/cli/serve_dynemo.py +++ b/deploy/compoundai/sdk/src/compoundai/cli/serve_dynemo.py @@ -26,7 +26,7 @@ from typing import Any import click -from compoundai import tdist_context +from compoundai import dynemo_context from dynemo.runtime import DistributedRuntime, dynemo_endpoint, dynemo_worker @@ -72,9 +72,9 @@ def main( from bentoml._internal.log import configure_server_logging run_id = generate_run_id() - tdist_context["service_name"] = service_name - tdist_context["runner_map"] = runner_map - tdist_context["worker_id"] = worker_id + dynemo_context["service_name"] = service_name + dynemo_context["runner_map"] = runner_map + dynemo_context["worker_id"] = worker_id # Import service first to check configuration service = import_service(bento_identifier) @@ -106,8 +106,8 @@ def main( @dynemo_worker() async def worker(runtime: DistributedRuntime): - global tdist_context - tdist_context["runtime"] = runtime + global dynemo_context + dynemo_context["runtime"] = runtime if service_name and service_name != service.name: server_context.service_type = "service" else: @@ -145,8 +145,8 @@ async def worker(runtime: DistributedRuntime): logger.info(f"[{run_id}] Registering endpoint '{name}'") endpoints.append(td_endpoint) # Bind an instance of inner to the endpoint - tdist_context["component"] = component - tdist_context["endpoints"] = endpoints + dynemo_context["component"] = component + dynemo_context["endpoints"] = endpoints class_instance = service.inner() twm = [] for name, endpoint in dynemo_endpoints.items(): diff --git a/examples/python_rs/llm/vllm/sdk_basic_service/basic.py b/examples/python_rs/llm/vllm/sdk_basic_service/basic.py index 74e9dec33178..0561926e8083 100644 --- a/examples/python_rs/llm/vllm/sdk_basic_service/basic.py +++ b/examples/python_rs/llm/vllm/sdk_basic_service/basic.py @@ -63,10 +63,11 @@ def __init__(self) -> None: print("Starting backend") @dynemo_endpoint() - async def generate(self, text: RequestType): + async def generate(self, req: RequestType): """Generate tokens.""" - text = f"{text.text}-back" - print(f"Backend received: {text}") + req_text = req.text + print(f"Backend received: {req_text}") + text = f"{req_text}-back" for token in text.split(): yield f"Backend: {token}" @@ -83,12 +84,13 @@ def __init__(self) -> None: print("Starting middle") @dynemo_endpoint() - async def generate(self, text: RequestType): + async def generate(self, req: RequestType): """Forward requests to backend.""" - text = f"{text.text}-mid" - print(f"Middle received: {text}") - txt = RequestType(text=text) - async for response in self.backend.generate(txt.model_dump_json()): + req_text = req.text + print(f"Middle received: {req_text}") + text = f"{req_text}-mid" + next_request = RequestType(text=text).model_dump_json() + async for response in self.backend.generate(next_request): print(f"Middle received response: {response}") yield f"Middle: {response}" diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/processor.py b/examples/python_rs/llm/vllm/sdk_kv_router/processor.py index 7e3b6dae9993..7d0d65ab2bd5 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/processor.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/processor.py @@ -29,7 +29,7 @@ from common.chat_processor import ChatProcessor, ProcessMixIn from common.protocol import MyRequestOutput, Tokens, vLLMGenerateRequest -from compoundai import depends, dynemo_endpoint, service, tdist_context +from compoundai import depends, dynemo_context, dynemo_endpoint, service @service( @@ -108,7 +108,7 @@ async def generate(self, raw_request: ChatCompletionRequest): ): worker_id = worker break - runtime = tdist_context["runtime"] + runtime = dynemo_context["runtime"] comp_ns, comp_name = VllmEngine.dynemo_address() worker_client = ( await runtime.namespace(comp_ns) diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/router.py b/examples/python_rs/llm/vllm/sdk_kv_router/router.py index 860f2d6bb435..ac7ce7c61f43 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/router.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/router.py @@ -17,7 +17,7 @@ import bentoml from common.protocol import Tokens -from compoundai import async_onstart, dynemo_endpoint, service, tdist_context +from compoundai import async_onstart, dynemo_context, dynemo_endpoint, service with bentoml.importing(): from dynemo.runtime import KvRouter @@ -48,9 +48,8 @@ class Router: def __init__(self): self.model_name = "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B" self.routing_strategy = RoutingStrategy.PREFIX - self.runtime = tdist_context["runtime"] + self.runtime = dynemo_context["runtime"] self.min_workers = 1 - self.router = None @async_onstart async def init_engine(self): diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/worker.py b/examples/python_rs/llm/vllm/sdk_kv_router/worker.py index ab17a9e2034d..45b1a9c771c5 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/worker.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/worker.py @@ -27,10 +27,10 @@ from compoundai import ( async_onstart, + dynemo_context, dynemo_endpoint, server_context, service, - tdist_context, ) from dynemo.llm import KvMetricsPublisher @@ -62,7 +62,7 @@ def __init__(self): block_size=64, max_model_len=16384, ) - VLLM_WORKER_ID = tdist_context["endpoints"][0].lease_id() + VLLM_WORKER_ID = dynemo_context["endpoints"][0].lease_id() os.environ["VLLM_WORKER_ID"] = str(VLLM_WORKER_ID) os.environ["VLLM_KV_NAMESPACE"] = "triton-init" os.environ["VLLM_KV_COMPONENT"] = "vllm" @@ -72,7 +72,7 @@ def __init__(self): super().__init__(self.engine_args) async def create_metrics_publisher_endpoint(self): - component = tdist_context["component"] + component = dynemo_context["component"] await self.metrics_publisher.create_endpoint(component) @async_onstart From ae1e99f26e33d069e58b0d6eb9c94b8d9ef6129d Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Thu, 6 Mar 2025 11:46:43 -0800 Subject: [PATCH 10/29] Update container/Dockerfile.vllm_nixl Co-authored-by: Neelay Shah --- container/Dockerfile.vllm_nixl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container/Dockerfile.vllm_nixl b/container/Dockerfile.vllm_nixl index d2fe50dcb442..d6a151b4cce8 100644 --- a/container/Dockerfile.vllm_nixl +++ b/container/Dockerfile.vllm_nixl @@ -242,7 +242,7 @@ ENV VLLM_KV_CAPI_PATH="/opt/dynemo/bindings/lib/libdynemo_llm_capi.so" # FIXME: Copy more specific folders in for dev/debug after directory restructure COPY . /workspace - +# Install dynemo sdk for local dev and cluster deployment RUN source /opt/dynemo/venv/bin/activate && \ cd /workspace/deploy/compoundai/sdk && \ uv pip install -e . From f5b13bc1376e0294066cc22dd9f40dcb60be425c Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Thu, 6 Mar 2025 13:53:40 -0800 Subject: [PATCH 11/29] feat: reafactor compoundai to dynemo sdk --- container/Dockerfile.vllm | 2 +- container/Dockerfile.vllm_nixl | 2 +- deploy/compoundai/sdk/uv.lock | 1160 -------------- .../api-server/.air.toml | 0 deploy/{compoundai => dynemo}/api-server/.env | 0 .../api-server/.gitignore | 0 .../api-server/Dockerfile | 0 .../api-server/Earthfile | 0 .../api-server/api/common/client/client.go | 0 .../api-server/api/common/consts/consts.go | 0 .../api-server/api/common/consts/k8s.go | 0 .../api-server/api/common/env/env.go | 0 .../api-server/api/common/env/nds.go | 0 .../api-server/api/common/env/scope.go | 0 .../api-server/api/common/utils/utils.go | 0 .../api-server/api/controllers/cluster.go | 0 .../api-server/api/controllers/common.go | 0 .../api/controllers/compound_component.go | 0 .../api-server/api/controllers/deployment.go | 0 .../api/controllers/deployment_revision.go | 0 .../api-server/api/controllers/health.go | 0 .../api-server/api/controllers/info.go | 0 .../api/controllers/organization.go | 0 .../api/controllers/organization_member.go | 0 .../api-server/api/controllers/proxy.go | 0 .../api-server/api/controllers/user.go | 0 .../api-server/api/controllers/version.go | 0 .../api-server/api/converters/base.go | 0 .../api-server/api/converters/cluster.go | 0 .../api/converters/compound_component.go | 0 .../api-server/api/converters/deployment.go | 0 .../api/converters/deployment_revision.go | 0 .../api/converters/deployment_target.go | 0 .../api-server/api/converters/resource.go | 0 .../api-server/api/crds/base.go | 0 .../api/crds/compoundai_nim_deployment.go | 0 .../api/crds/compoundai_nim_request.go | 0 .../api-server/api/crds/consts.go | 0 .../api-server/api/database/database.go | 0 .../api-server/api/main.go | 0 .../api-server/api/mocks/mock.go | 0 .../api-server/api/models/associate.go | 0 .../api-server/api/models/base.go | 0 .../api-server/api/models/cluster.go | 0 .../api/models/compound_component.go | 0 .../api-server/api/models/deployment.go | 0 .../api/models/deployment_option.go | 0 .../api/models/deployment_revision.go | 0 .../api/models/deployment_target.go | 0 .../api-server/api/models/resource.go | 0 .../api-server/api/models/visibility.go | 0 .../api-server/api/routes/routes.go | 0 .../api-server/api/runtime/runtime.go | 0 .../api-server/api/schemas/base.go | 0 .../api-server/api/schemas/cluster.go | 0 .../api-server/api/schemas/compound_ai.go | 0 .../api/schemas/compound_component.go | 0 .../api-server/api/schemas/compound_nim.go | 0 .../api/schemas/compound_nim_version.go | 0 .../api-server/api/schemas/deployment.go | 0 .../api/schemas/deployment_revision.go | 0 .../api/schemas/deployment_revision_status.go | 0 .../api/schemas/deployment_status.go | 0 .../api/schemas/deployment_target.go | 0 .../api-server/api/schemas/event.go | 0 .../api/schemas/external_service.go | 0 .../api-server/api/schemas/label.go | 0 .../api-server/api/schemas/list.go | 0 .../api-server/api/schemas/organization.go | 0 .../api/schemas/organization_member.go | 0 .../api-server/api/schemas/ownership.go | 0 .../api-server/api/schemas/resource.go | 0 .../api-server/api/schemas/resource_type.go | 0 .../api-server/api/schemas/user.go | 0 .../api-server/api/schemas/version.go | 0 .../api-server/api/schemasv2/cluster.go | 0 .../api-server/api/schemasv2/deployment.go | 0 .../api-server/api/services/base.go | 0 .../api-server/api/services/cluster.go | 0 .../api/services/compoundai_component.go | 0 .../api-server/api/services/datastore.go | 0 .../api-server/api/services/deployment.go | 0 .../api/services/deployment_manager.go | 0 .../api/services/deployment_revision.go | 0 .../api/services/deployment_target.go | 0 .../api-server/api/services/k8s.go | 0 .../api-server/api/services/k8s_informers.go | 0 .../api-server/docker-compose.yaml | 0 .../api-server/docs/data_model.md | 0 .../api-server/docs/k8s.md | 0 .../api-server/docs/workflow.md | 0 .../{compoundai => dynemo}/api-server/go.mod | 0 .../{compoundai => dynemo}/api-server/go.sum | 0 .../api-server/tests/integration/.env | 0 .../api-server/tests/integration/api_test.go | 0 .../api-server/tests/integration/client.go | 0 .../tests/integration/containers.go | 0 .../tests/integration/fixtures/dms.go | 0 .../tests/integration/fixtures/k8s.go | 0 .../tests/integration/fixtures/nds.go | 0 .../tests/integration/fixtures/schemas.go | 0 .../tests/integration/fixtures/schemasv2.go | 0 .../operator/.dockerignore | 0 .../operator/.gitignore | 0 .../operator/.golangci.yml | 0 .../{compoundai => dynemo}/operator/Earthfile | 0 .../operator/LICENSE.txt | 0 .../{compoundai => dynemo}/operator/Makefile | 0 .../{compoundai => dynemo}/operator/PROJECT | 0 .../{compoundai => dynemo}/operator/README.md | 0 .../operator/api/compoundai/README.md | 0 .../operator/api/compoundai/common/common.go | 0 .../common/zz_generated.deepcopy.go | 0 .../api/compoundai/conversion/conversion.go | 0 .../api/compoundai/modelschemas/api_token.go | 0 .../api/compoundai/modelschemas/bento.go | 0 .../api/compoundai/modelschemas/cluster.go | 0 .../api/compoundai/modelschemas/deployment.go | 0 .../modelschemas/deployment_revision.go | 0 .../deployment_snapshot_canary_rule.go | 0 .../modelschemas/deployment_target.go | 0 .../modelschemas/docker_registry.go | 0 .../api/compoundai/modelschemas/event.go | 0 .../api/compoundai/modelschemas/kube_pod.go | 0 .../api/compoundai/modelschemas/label.go | 0 .../api/compoundai/modelschemas/member.go | 0 .../api/compoundai/modelschemas/model.go | 0 .../compoundai/modelschemas/organization.go | 0 .../api/compoundai/modelschemas/resource.go | 0 .../modelschemas/resource_instance.go | 0 .../api/compoundai/modelschemas/tag.go | 0 .../modelschemas/terminal_record.go | 0 .../api/compoundai/modelschemas/user.go | 0 .../modelschemas/yatai_component.go | 0 .../api/compoundai/schemasv1/api_token.go | 0 .../operator/api/compoundai/schemasv1/base.go | 0 .../api/compoundai/schemasv1/bento.go | 0 .../compoundai/schemasv1/bento_repository.go | 0 .../api/compoundai/schemasv1/cluster.go | 0 .../compoundai/schemasv1/cluster_member.go | 0 .../api/compoundai/schemasv1/deployment.go | 0 .../schemasv1/deployment_revision.go | 0 .../compoundai/schemasv1/deployment_target.go | 0 .../api/compoundai/schemasv1/event.go | 0 .../api/compoundai/schemasv1/kube_pod.go | 0 .../api/compoundai/schemasv1/kube_resource.go | 0 .../api/compoundai/schemasv1/label.go | 0 .../operator/api/compoundai/schemasv1/list.go | 0 .../api/compoundai/schemasv1/member.go | 0 .../api/compoundai/schemasv1/model.go | 0 .../compoundai/schemasv1/model_repository.go | 0 .../operator/api/compoundai/schemasv1/msg.go | 0 .../api/compoundai/schemasv1/organization.go | 0 .../schemasv1/organization_member.go | 0 .../operator/api/compoundai/schemasv1/q.go | 0 .../api/compoundai/schemasv1/resource.go | 0 .../api/compoundai/schemasv1/subscription.go | 0 .../compoundai/schemasv1/terminal_record.go | 0 .../api/compoundai/schemasv1/upload.go | 0 .../operator/api/compoundai/schemasv1/user.go | 0 .../api/compoundai/schemasv1/version.go | 0 .../api/compoundai/schemasv1/websocket.go | 0 .../compoundai/schemasv1/yatai_component.go | 0 .../api/compoundai/yatai-client/client.go | 0 .../operator/api/v1alpha1/common.go | 0 .../v1alpha1/compoundaideployment_types.go | 0 .../api/v1alpha1/compoundainim_types.go | 0 .../v1alpha1/compoundainimdeployment_types.go | 0 .../v1alpha1/compoundainimrequest_types.go | 0 .../api/v1alpha1/groupversion_info.go | 0 .../operator/api/v1alpha1/shared.go | 0 .../api/v1alpha1/zz_generated.deepcopy.go | 0 .../operator/cmd/main.go | 0 .../nvidia.com_compoundaideployments.yaml | 0 .../nvidia.com_compoundainimdeployments.yaml | 0 .../nvidia.com_compoundainimrequests.yaml | 0 .../crd/bases/nvidia.com_compoundainims.yaml | 0 .../operator/config/crd/kustomization.yaml | 0 .../operator/config/crd/kustomizeconfig.yaml | 0 .../config/default/kustomization.yaml | 0 .../default/manager_auth_proxy_patch.yaml | 0 .../config/manager/kustomization.yaml | 0 .../operator/config/manager/manager.yaml | 0 .../config/prometheus/kustomization.yaml | 0 .../operator/config/prometheus/monitor.yaml | 0 .../rbac/auth_proxy_client_clusterrole.yaml | 0 .../operator/config/rbac/auth_proxy_role.yaml | 0 .../config/rbac/auth_proxy_role_binding.yaml | 0 .../config/rbac/auth_proxy_service.yaml | 0 .../rbac/compoundainim_editor_role.yaml | 0 .../rbac/compoundainim_viewer_role.yaml | 0 .../compoundainimdeployment_editor_role.yaml | 0 .../compoundainimdeployment_viewer_role.yaml | 0 .../compoundainimrequest_editor_role.yaml | 0 .../compoundainimrequest_viewer_role.yaml | 0 .../operator/config/rbac/kustomization.yaml | 0 .../config/rbac/leader_election_role.yaml | 0 .../rbac/leader_election_role_binding.yaml | 0 .../operator/config/rbac/role.yaml | 0 .../operator/config/rbac/role_binding.yaml | 0 .../operator/config/rbac/service_account.yaml | 0 .../config/samples/kustomization.yaml | 0 ...dia.com_v1alpha1_compoundaideployment.yaml | 0 .../nvidia.com_v1alpha1_compoundainim.yaml | 0 ....com_v1alpha1_compoundainimdeployment.yaml | 0 ...dia.com_v1alpha1_compoundainimrequest.yaml | 0 deploy/{compoundai => dynemo}/operator/go.mod | 0 deploy/{compoundai => dynemo}/operator/go.sum | 0 .../operator/hack/boilerplate.go.txt_ | 0 .../operator/internal/archive/tar.go | 0 .../operator/internal/archive/tar_test.go | 0 .../operator/internal/archive/test.tar | Bin .../operator/internal/archive/test2.tar | Bin .../operator/internal/controller/common.go | 0 .../compoundaideployment_controller.go | 0 .../compoundainimdeployment_controller.go | 0 .../compoundainimrequest_controller.go | 0 .../internal/controller/suite_test.go | 0 .../testing/prometheus/prometheusrule.yaml | 0 .../testing/prometheus/servicemonitor.yaml | 0 .../internal/controller_common/predicate.go | 0 .../internal/controller_common/resource.go | 0 .../controller_common/resource_test.go | 0 .../operator/internal/envoy/envoy.go | 0 .../operator/internal/nim/nim.go | 0 .../operator/internal/nim/nim_test.go | 0 .../operator/pkg/compoundai/README.md | 0 .../operator/pkg/compoundai/config/config.go | 0 .../operator/pkg/compoundai/consts/consts.go | 0 .../operator/pkg/compoundai/consts/env.go | 0 .../operator/pkg/compoundai/consts/kube.go | 0 .../operator/pkg/compoundai/reqcli/http.go | 0 .../operator/pkg/compoundai/system/env.go | 0 .../operator/pkg/compoundai/system/ingress.go | 0 .../operator/pkg/compoundai/system/network.go | 0 .../operator/pkg/compoundai/utils/url.go | 0 .../operator/test/e2e/e2e_suite_test.go | 0 .../operator/test/e2e/e2e_test.go | 0 .../operator/test/utils/utils.go | 0 deploy/{compoundai => dynemo}/sdk/README.md | 0 .../{compoundai => dynemo}/sdk/pyproject.toml | 14 +- .../sdk/src/dynemo/sdk}/__init__.py | 8 +- .../sdk/src/dynemo/sdk}/cli/cli.py | 4 +- .../sdk/src/dynemo/sdk}/cli/serve.py | 0 .../sdk/src/dynemo/sdk}/cli/serve_dynemo.py | 0 .../sdk/src/dynemo/sdk}/cli/serving.py | 0 .../sdk/src/dynemo/sdk}/cli/start.py | 0 .../sdk/src/dynemo/sdk/lib}/__init__.py | 0 .../sdk/src/dynemo/sdk/lib}/decorators.py | 0 .../sdk/src/dynemo/sdk/lib}/dependency.py | 2 +- .../sdk/src/dynemo/sdk/lib}/image.py | 0 .../sdk/src/dynemo/sdk/lib}/service.py | 2 +- deploy/dynemo/sdk/uv.lock | 1355 +++++++++++++++++ 253 files changed, 1376 insertions(+), 1173 deletions(-) delete mode 100644 deploy/compoundai/sdk/uv.lock rename deploy/{compoundai => dynemo}/api-server/.air.toml (100%) rename deploy/{compoundai => dynemo}/api-server/.env (100%) rename deploy/{compoundai => dynemo}/api-server/.gitignore (100%) rename deploy/{compoundai => dynemo}/api-server/Dockerfile (100%) rename deploy/{compoundai => dynemo}/api-server/Earthfile (100%) rename deploy/{compoundai => dynemo}/api-server/api/common/client/client.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/common/consts/consts.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/common/consts/k8s.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/common/env/env.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/common/env/nds.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/common/env/scope.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/common/utils/utils.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/controllers/cluster.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/controllers/common.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/controllers/compound_component.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/controllers/deployment.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/controllers/deployment_revision.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/controllers/health.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/controllers/info.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/controllers/organization.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/controllers/organization_member.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/controllers/proxy.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/controllers/user.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/controllers/version.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/converters/base.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/converters/cluster.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/converters/compound_component.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/converters/deployment.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/converters/deployment_revision.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/converters/deployment_target.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/converters/resource.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/crds/base.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/crds/compoundai_nim_deployment.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/crds/compoundai_nim_request.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/crds/consts.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/database/database.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/main.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/mocks/mock.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/models/associate.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/models/base.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/models/cluster.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/models/compound_component.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/models/deployment.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/models/deployment_option.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/models/deployment_revision.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/models/deployment_target.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/models/resource.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/models/visibility.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/routes/routes.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/runtime/runtime.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/base.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/cluster.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/compound_ai.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/compound_component.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/compound_nim.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/compound_nim_version.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/deployment.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/deployment_revision.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/deployment_revision_status.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/deployment_status.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/deployment_target.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/event.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/external_service.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/label.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/list.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/organization.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/organization_member.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/ownership.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/resource.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/resource_type.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/user.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemas/version.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemasv2/cluster.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/schemasv2/deployment.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/services/base.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/services/cluster.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/services/compoundai_component.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/services/datastore.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/services/deployment.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/services/deployment_manager.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/services/deployment_revision.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/services/deployment_target.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/services/k8s.go (100%) rename deploy/{compoundai => dynemo}/api-server/api/services/k8s_informers.go (100%) rename deploy/{compoundai => dynemo}/api-server/docker-compose.yaml (100%) rename deploy/{compoundai => dynemo}/api-server/docs/data_model.md (100%) rename deploy/{compoundai => dynemo}/api-server/docs/k8s.md (100%) rename deploy/{compoundai => dynemo}/api-server/docs/workflow.md (100%) rename deploy/{compoundai => dynemo}/api-server/go.mod (100%) rename deploy/{compoundai => dynemo}/api-server/go.sum (100%) rename deploy/{compoundai => dynemo}/api-server/tests/integration/.env (100%) rename deploy/{compoundai => dynemo}/api-server/tests/integration/api_test.go (100%) rename deploy/{compoundai => dynemo}/api-server/tests/integration/client.go (100%) rename deploy/{compoundai => dynemo}/api-server/tests/integration/containers.go (100%) rename deploy/{compoundai => dynemo}/api-server/tests/integration/fixtures/dms.go (100%) rename deploy/{compoundai => dynemo}/api-server/tests/integration/fixtures/k8s.go (100%) rename deploy/{compoundai => dynemo}/api-server/tests/integration/fixtures/nds.go (100%) rename deploy/{compoundai => dynemo}/api-server/tests/integration/fixtures/schemas.go (100%) rename deploy/{compoundai => dynemo}/api-server/tests/integration/fixtures/schemasv2.go (100%) rename deploy/{compoundai => dynemo}/operator/.dockerignore (100%) rename deploy/{compoundai => dynemo}/operator/.gitignore (100%) rename deploy/{compoundai => dynemo}/operator/.golangci.yml (100%) rename deploy/{compoundai => dynemo}/operator/Earthfile (100%) rename deploy/{compoundai => dynemo}/operator/LICENSE.txt (100%) rename deploy/{compoundai => dynemo}/operator/Makefile (100%) rename deploy/{compoundai => dynemo}/operator/PROJECT (100%) rename deploy/{compoundai => dynemo}/operator/README.md (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/README.md (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/common/common.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/common/zz_generated.deepcopy.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/conversion/conversion.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/api_token.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/bento.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/cluster.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/deployment.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/deployment_revision.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/deployment_snapshot_canary_rule.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/deployment_target.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/docker_registry.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/event.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/kube_pod.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/label.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/member.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/model.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/organization.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/resource.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/resource_instance.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/tag.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/terminal_record.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/user.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/modelschemas/yatai_component.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/api_token.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/base.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/bento.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/bento_repository.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/cluster.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/cluster_member.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/deployment.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/deployment_revision.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/deployment_target.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/event.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/kube_pod.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/kube_resource.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/label.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/list.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/member.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/model.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/model_repository.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/msg.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/organization.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/organization_member.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/q.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/resource.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/subscription.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/terminal_record.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/upload.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/user.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/version.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/websocket.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/schemasv1/yatai_component.go (100%) rename deploy/{compoundai => dynemo}/operator/api/compoundai/yatai-client/client.go (100%) rename deploy/{compoundai => dynemo}/operator/api/v1alpha1/common.go (100%) rename deploy/{compoundai => dynemo}/operator/api/v1alpha1/compoundaideployment_types.go (100%) rename deploy/{compoundai => dynemo}/operator/api/v1alpha1/compoundainim_types.go (100%) rename deploy/{compoundai => dynemo}/operator/api/v1alpha1/compoundainimdeployment_types.go (100%) rename deploy/{compoundai => dynemo}/operator/api/v1alpha1/compoundainimrequest_types.go (100%) rename deploy/{compoundai => dynemo}/operator/api/v1alpha1/groupversion_info.go (100%) rename deploy/{compoundai => dynemo}/operator/api/v1alpha1/shared.go (100%) rename deploy/{compoundai => dynemo}/operator/api/v1alpha1/zz_generated.deepcopy.go (100%) rename deploy/{compoundai => dynemo}/operator/cmd/main.go (100%) rename deploy/{compoundai => dynemo}/operator/config/crd/bases/nvidia.com_compoundaideployments.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/crd/bases/nvidia.com_compoundainimdeployments.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/crd/bases/nvidia.com_compoundainimrequests.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/crd/bases/nvidia.com_compoundainims.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/crd/kustomization.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/crd/kustomizeconfig.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/default/kustomization.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/default/manager_auth_proxy_patch.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/manager/kustomization.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/manager/manager.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/prometheus/kustomization.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/prometheus/monitor.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/auth_proxy_client_clusterrole.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/auth_proxy_role.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/auth_proxy_role_binding.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/auth_proxy_service.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/compoundainim_editor_role.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/compoundainim_viewer_role.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/compoundainimdeployment_editor_role.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/compoundainimdeployment_viewer_role.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/compoundainimrequest_editor_role.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/compoundainimrequest_viewer_role.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/kustomization.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/leader_election_role.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/leader_election_role_binding.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/role.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/role_binding.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/rbac/service_account.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/samples/kustomization.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/samples/nvidia.com_v1alpha1_compoundaideployment.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/samples/nvidia.com_v1alpha1_compoundainim.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/samples/nvidia.com_v1alpha1_compoundainimdeployment.yaml (100%) rename deploy/{compoundai => dynemo}/operator/config/samples/nvidia.com_v1alpha1_compoundainimrequest.yaml (100%) rename deploy/{compoundai => dynemo}/operator/go.mod (100%) rename deploy/{compoundai => dynemo}/operator/go.sum (100%) rename deploy/{compoundai => dynemo}/operator/hack/boilerplate.go.txt_ (100%) rename deploy/{compoundai => dynemo}/operator/internal/archive/tar.go (100%) rename deploy/{compoundai => dynemo}/operator/internal/archive/tar_test.go (100%) rename deploy/{compoundai => dynemo}/operator/internal/archive/test.tar (100%) rename deploy/{compoundai => dynemo}/operator/internal/archive/test2.tar (100%) rename deploy/{compoundai => dynemo}/operator/internal/controller/common.go (100%) rename deploy/{compoundai => dynemo}/operator/internal/controller/compoundaideployment_controller.go (100%) rename deploy/{compoundai => dynemo}/operator/internal/controller/compoundainimdeployment_controller.go (100%) rename deploy/{compoundai => dynemo}/operator/internal/controller/compoundainimrequest_controller.go (100%) rename deploy/{compoundai => dynemo}/operator/internal/controller/suite_test.go (100%) rename deploy/{compoundai => dynemo}/operator/internal/controller/testing/prometheus/prometheusrule.yaml (100%) rename deploy/{compoundai => dynemo}/operator/internal/controller/testing/prometheus/servicemonitor.yaml (100%) rename deploy/{compoundai => dynemo}/operator/internal/controller_common/predicate.go (100%) rename deploy/{compoundai => dynemo}/operator/internal/controller_common/resource.go (100%) rename deploy/{compoundai => dynemo}/operator/internal/controller_common/resource_test.go (100%) rename deploy/{compoundai => dynemo}/operator/internal/envoy/envoy.go (100%) rename deploy/{compoundai => dynemo}/operator/internal/nim/nim.go (100%) rename deploy/{compoundai => dynemo}/operator/internal/nim/nim_test.go (100%) rename deploy/{compoundai => dynemo}/operator/pkg/compoundai/README.md (100%) rename deploy/{compoundai => dynemo}/operator/pkg/compoundai/config/config.go (100%) rename deploy/{compoundai => dynemo}/operator/pkg/compoundai/consts/consts.go (100%) rename deploy/{compoundai => dynemo}/operator/pkg/compoundai/consts/env.go (100%) rename deploy/{compoundai => dynemo}/operator/pkg/compoundai/consts/kube.go (100%) rename deploy/{compoundai => dynemo}/operator/pkg/compoundai/reqcli/http.go (100%) rename deploy/{compoundai => dynemo}/operator/pkg/compoundai/system/env.go (100%) rename deploy/{compoundai => dynemo}/operator/pkg/compoundai/system/ingress.go (100%) rename deploy/{compoundai => dynemo}/operator/pkg/compoundai/system/network.go (100%) rename deploy/{compoundai => dynemo}/operator/pkg/compoundai/utils/url.go (100%) rename deploy/{compoundai => dynemo}/operator/test/e2e/e2e_suite_test.go (100%) rename deploy/{compoundai => dynemo}/operator/test/e2e/e2e_test.go (100%) rename deploy/{compoundai => dynemo}/operator/test/utils/utils.go (100%) rename deploy/{compoundai => dynemo}/sdk/README.md (100%) rename deploy/{compoundai => dynemo}/sdk/pyproject.toml (78%) rename deploy/{compoundai/sdk/src/compoundai => dynemo/sdk/src/dynemo/sdk}/__init__.py (83%) rename deploy/{compoundai/sdk/src/compoundai => dynemo/sdk/src/dynemo/sdk}/cli/cli.py (96%) rename deploy/{compoundai/sdk/src/compoundai => dynemo/sdk/src/dynemo/sdk}/cli/serve.py (100%) rename deploy/{compoundai/sdk/src/compoundai => dynemo/sdk/src/dynemo/sdk}/cli/serve_dynemo.py (100%) rename deploy/{compoundai/sdk/src/compoundai => dynemo/sdk/src/dynemo/sdk}/cli/serving.py (100%) rename deploy/{compoundai/sdk/src/compoundai => dynemo/sdk/src/dynemo/sdk}/cli/start.py (100%) rename deploy/{compoundai/sdk/src/compoundai/sdk => dynemo/sdk/src/dynemo/sdk/lib}/__init__.py (100%) rename deploy/{compoundai/sdk/src/compoundai/sdk => dynemo/sdk/src/dynemo/sdk/lib}/decorators.py (100%) rename deploy/{compoundai/sdk/src/compoundai/sdk => dynemo/sdk/src/dynemo/sdk/lib}/dependency.py (99%) rename deploy/{compoundai/sdk/src/compoundai/sdk => dynemo/sdk/src/dynemo/sdk/lib}/image.py (100%) rename deploy/{compoundai/sdk/src/compoundai/sdk => dynemo/sdk/src/dynemo/sdk/lib}/service.py (99%) create mode 100644 deploy/dynemo/sdk/uv.lock diff --git a/container/Dockerfile.vllm b/container/Dockerfile.vllm index 4a994d0a46cf..d07a67ec435c 100644 --- a/container/Dockerfile.vllm +++ b/container/Dockerfile.vllm @@ -119,7 +119,7 @@ ENV VLLM_KV_CAPI_PATH="/opt/dynemo/bindings/lib/libdynemo_llm_capi.so" COPY . /workspace RUN source /opt/dynemo/venv/bin/activate && \ - cd /workspace/deploy/compoundai/sdk && \ + cd /workspace/deploy/dynemo/sdk && \ uv pip install -e . # FIXME: May want a modification with dynemo-distributed banner on entry diff --git a/container/Dockerfile.vllm_nixl b/container/Dockerfile.vllm_nixl index d6a151b4cce8..c951d0145169 100644 --- a/container/Dockerfile.vllm_nixl +++ b/container/Dockerfile.vllm_nixl @@ -244,7 +244,7 @@ ENV VLLM_KV_CAPI_PATH="/opt/dynemo/bindings/lib/libdynemo_llm_capi.so" COPY . /workspace # Install dynemo sdk for local dev and cluster deployment RUN source /opt/dynemo/venv/bin/activate && \ - cd /workspace/deploy/compoundai/sdk && \ + cd /workspace/deploy/dynemo/sdk && \ uv pip install -e . # FIXME: May want a modification with dynemo-distributed banner on entry diff --git a/deploy/compoundai/sdk/uv.lock b/deploy/compoundai/sdk/uv.lock deleted file mode 100644 index 418057a9f6de..000000000000 --- a/deploy/compoundai/sdk/uv.lock +++ /dev/null @@ -1,1160 +0,0 @@ -version = 1 -revision = 1 -requires-python = "==3.10.*" - -[[package]] -name = "a2wsgi" -version = "1.10.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ab/76/0823bd7f0ac429489d19e8c03e9a5a7856e6c2c561e641cc62f54ec4ea04/a2wsgi-1.10.8.tar.gz", hash = "sha256:fc00bab1fc792f89a8ce1b491b2ad1717b145d8caefb75d0a8586946edc97cb2", size = 18729 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/55/54/1e14731678ec375875c65df3d020714361230d3b8aa8188d2290d07dabe4/a2wsgi-1.10.8-py3-none-any.whl", hash = "sha256:7fbdb3ef81ea46e6bbd0dcadc1ff9a7919197626c50c303ecafe400ce8099ad0", size = 17328 }, -] - -[[package]] -name = "aiohappyeyeballs" -version = "2.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/08/07/508f9ebba367fc3370162e53a3cfd12f5652ad79f0e0bfdf9f9847c6f159/aiohappyeyeballs-2.4.6.tar.gz", hash = "sha256:9b05052f9042985d32ecbe4b59a77ae19c006a78f1344d7fdad69d28ded3d0b0", size = 21726 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/44/4c/03fb05f56551828ec67ceb3665e5dc51638042d204983a03b0a1541475b6/aiohappyeyeballs-2.4.6-py3-none-any.whl", hash = "sha256:147ec992cf873d74f5062644332c539fcd42956dc69453fe5204195e560517e1", size = 14543 }, -] - -[[package]] -name = "aiohttp" -version = "3.11.12" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohappyeyeballs" }, - { name = "aiosignal" }, - { name = "async-timeout" }, - { name = "attrs" }, - { name = "frozenlist" }, - { name = "multidict" }, - { name = "propcache" }, - { name = "yarl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/37/4b/952d49c73084fb790cb5c6ead50848c8e96b4980ad806cf4d2ad341eaa03/aiohttp-3.11.12.tar.gz", hash = "sha256:7603ca26d75b1b86160ce1bbe2787a0b706e592af5b2504e12caa88a217767b0", size = 7673175 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/65/42/3880e133590820aa7bc6d068eb7d8e0ad9fdce9b4663f92b821d3f6b5601/aiohttp-3.11.12-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:aa8a8caca81c0a3e765f19c6953416c58e2f4cc1b84829af01dd1c771bb2f91f", size = 708721 }, - { url = "https://files.pythonhosted.org/packages/d8/8c/04869803bed108b25afad75f94c651b287851843caacbec6677d8f2d572b/aiohttp-3.11.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84ede78acde96ca57f6cf8ccb8a13fbaf569f6011b9a52f870c662d4dc8cd854", size = 468596 }, - { url = "https://files.pythonhosted.org/packages/4f/f4/9074011f0d1335b161c953fb32545b6667cf24465e1932b9767874995c7e/aiohttp-3.11.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:584096938a001378484aa4ee54e05dc79c7b9dd933e271c744a97b3b6f644957", size = 455758 }, - { url = "https://files.pythonhosted.org/packages/fd/68/06298c57ef8f534065930b805e6dbd83613f0534447922782fb9920fce28/aiohttp-3.11.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:392432a2dde22b86f70dd4a0e9671a349446c93965f261dbaecfaf28813e5c42", size = 1584797 }, - { url = "https://files.pythonhosted.org/packages/bd/1e/cee6b51fcb3b1c4185a7dc62b3113bc136fae07f39386c88c90b7f79f199/aiohttp-3.11.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:88d385b8e7f3a870146bf5ea31786ef7463e99eb59e31db56e2315535d811f55", size = 1632535 }, - { url = "https://files.pythonhosted.org/packages/71/1f/42424462b7a09da362e1711090db9f8d68a37a33f0aab51307335517c599/aiohttp-3.11.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b10a47e5390c4b30a0d58ee12581003be52eedd506862ab7f97da7a66805befb", size = 1668484 }, - { url = "https://files.pythonhosted.org/packages/f6/79/0e25542bbe3c2bfd7a12c7a49c7bce73b09a836f65079e4b77bc2bafc89e/aiohttp-3.11.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b5263dcede17b6b0c41ef0c3ccce847d82a7da98709e75cf7efde3e9e3b5cae", size = 1589708 }, - { url = "https://files.pythonhosted.org/packages/d1/13/93ae26b75e23f7d3a613872e472fae836ca100dc5bde5936ebc93ada8890/aiohttp-3.11.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50c5c7b8aa5443304c55c262c5693b108c35a3b61ef961f1e782dd52a2f559c7", size = 1544752 }, - { url = "https://files.pythonhosted.org/packages/cf/5e/48847fad1b014ef92ef18ea1339a3b58eb81d3bc717b94c3627f5d2a42c5/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d1c031a7572f62f66f1257db37ddab4cb98bfaf9b9434a3b4840bf3560f5e788", size = 1529417 }, - { url = "https://files.pythonhosted.org/packages/ae/56/fbd4ea019303f4877f0e0b8c9de92e9db24338e7545570d3f275f3c74c53/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:7e44eba534381dd2687be50cbd5f2daded21575242ecfdaf86bbeecbc38dae8e", size = 1557808 }, - { url = "https://files.pythonhosted.org/packages/f1/43/112189cf6b3c482ecdd6819b420eaa0c2033426f28d741bb7f19db5dd2bb/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:145a73850926018ec1681e734cedcf2716d6a8697d90da11284043b745c286d5", size = 1536765 }, - { url = "https://files.pythonhosted.org/packages/30/12/59986547de8306e06c7b30e547ccda02d29636e152366caba2dd8627bfe1/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2c311e2f63e42c1bf86361d11e2c4a59f25d9e7aabdbdf53dc38b885c5435cdb", size = 1607621 }, - { url = "https://files.pythonhosted.org/packages/aa/9b/af3b323b20df3318ed20d701d8242e523d59c842ca93f23134b05c9d5054/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ea756b5a7bac046d202a9a3889b9a92219f885481d78cd318db85b15cc0b7bcf", size = 1628977 }, - { url = "https://files.pythonhosted.org/packages/36/62/adf5a331a7bda475cc326dde393fa2bc5849060b1b37ac3d1bee1953f2cd/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:526c900397f3bbc2db9cb360ce9c35134c908961cdd0ac25b1ae6ffcaa2507ff", size = 1564455 }, - { url = "https://files.pythonhosted.org/packages/90/c4/4a24291f22f111a854dfdb54dc94d4e0a5229ccbb7bc7f0bed972aa50410/aiohttp-3.11.12-cp310-cp310-win32.whl", hash = "sha256:b8d3bb96c147b39c02d3db086899679f31958c5d81c494ef0fc9ef5bb1359b3d", size = 416768 }, - { url = "https://files.pythonhosted.org/packages/51/69/5221c8006acb7bb10d9e8e2238fb216571bddc2e00a8d95bcfbe2f579c57/aiohttp-3.11.12-cp310-cp310-win_amd64.whl", hash = "sha256:7fe3d65279bfbee8de0fb4f8c17fc4e893eed2dba21b2f680e930cc2b09075c5", size = 442170 }, -] - -[[package]] -name = "aiosignal" -version = "1.3.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "frozenlist" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, -] - -[[package]] -name = "aiosqlite" -version = "0.21.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/13/7d/8bca2bf9a247c2c5dfeec1d7a5f40db6518f88d314b8bca9da29670d2671/aiosqlite-0.21.0.tar.gz", hash = "sha256:131bb8056daa3bc875608c631c678cda73922a2d4ba8aec373b19f18c17e7aa3", size = 13454 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/10/6c25ed6de94c49f88a91fa5018cb4c0f3625f31d5be9f771ebe5cc7cd506/aiosqlite-0.21.0-py3-none-any.whl", hash = "sha256:2549cf4057f95f53dcba16f2b64e8e2791d7e1adedb13197dd8ed77bb226d7d0", size = 15792 }, -] - -[[package]] -name = "annotated-types" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, -] - -[[package]] -name = "anyio" -version = "4.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "exceptiongroup" }, - { name = "idna" }, - { name = "sniffio" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, -] - -[[package]] -name = "appdirs" -version = "1.4.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566 }, -] - -[[package]] -name = "asgiref" -version = "3.8.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/29/38/b3395cc9ad1b56d2ddac9970bc8f4141312dbaec28bc7c218b0dfafd0f42/asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590", size = 35186 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", size = 23828 }, -] - -[[package]] -name = "async-timeout" -version = "5.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233 }, -] - -[[package]] -name = "attrs" -version = "25.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/49/7c/fdf464bcc51d23881d110abd74b512a42b3d5d376a55a831b44c603ae17f/attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e", size = 810562 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/30/d4986a882011f9df997a55e6becd864812ccfcd821d64aac8570ee39f719/attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a", size = 63152 }, -] - -[[package]] -name = "bentoml" -version = "1.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "a2wsgi" }, - { name = "aiohttp" }, - { name = "aiosqlite" }, - { name = "attrs" }, - { name = "cattrs" }, - { name = "click" }, - { name = "click-option-group" }, - { name = "cloudpickle" }, - { name = "fs" }, - { name = "httpx" }, - { name = "httpx-ws" }, - { name = "jinja2" }, - { name = "kantoku" }, - { name = "numpy" }, - { name = "nvidia-ml-py" }, - { name = "opentelemetry-api" }, - { name = "opentelemetry-instrumentation" }, - { name = "opentelemetry-instrumentation-aiohttp-client" }, - { name = "opentelemetry-instrumentation-asgi" }, - { name = "opentelemetry-sdk" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "opentelemetry-util-http" }, - { name = "packaging" }, - { name = "pathspec" }, - { name = "pip-requirements-parser" }, - { name = "prometheus-client" }, - { name = "psutil" }, - { name = "pydantic" }, - { name = "python-dateutil" }, - { name = "python-dotenv" }, - { name = "python-json-logger" }, - { name = "python-multipart" }, - { name = "pyyaml" }, - { name = "questionary" }, - { name = "rich" }, - { name = "schema" }, - { name = "simple-di" }, - { name = "starlette" }, - { name = "tomli" }, - { name = "tomli-w" }, - { name = "uvicorn" }, - { name = "watchfiles" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ce/ff/17a161f61d0aae6eba7a801323da4b8de0c98b1ce31c5d5370c5d0cf5997/bentoml-1.4.2.tar.gz", hash = "sha256:d83e2b138cee1f8ac758ede69c413bdb309c2f1df0d71176547bb4604c8ca903", size = 966659 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/bb/54cc91840209e155c6e7092dc865bad8df5dc1ecaf24cc54f8bf32cca03f/bentoml-1.4.2-py3-none-any.whl", hash = "sha256:bec93162c1115461b9f60147d0dbb370a467b26c723f58556c023b4b7d96be8c", size = 1146823 }, -] - -[[package]] -name = "cattrs" -version = "23.1.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "exceptiongroup" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/68/d4/27f9fd840e74d51b6d6a024d39ff495b56ffde71d28eb82758b7b85d0617/cattrs-23.1.2.tar.gz", hash = "sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657", size = 39998 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/ba/05df14efaa0624fac6b1510e87f5ce446208d2f6ce50270a89b6268aebfe/cattrs-23.1.2-py3-none-any.whl", hash = "sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4", size = 50845 }, -] - -[[package]] -name = "certifi" -version = "2025.1.31" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, -] - -[[package]] -name = "cffi" -version = "1.17.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, - { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, - { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, - { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, - { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, - { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, - { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, - { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, - { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, - { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, - { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, - { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, -] - -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, -] - -[[package]] -name = "click-option-group" -version = "0.5.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e7/b8/91054601a2e05fd9060cb1baf56be5b24145817b059e078669e1099529c7/click-option-group-0.5.6.tar.gz", hash = "sha256:97d06703873518cc5038509443742b25069a3c7562d1ea72ff08bfadde1ce777", size = 16517 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/af/75/81ea958bc0f7e410257cb2a42531b93a7695a31930cde87192c010a52c50/click_option_group-0.5.6-py3-none-any.whl", hash = "sha256:38a26d963ee3ad93332ddf782f9259c5bdfe405e73408d943ef5e7d0c3767ec7", size = 12467 }, -] - -[[package]] -name = "cloudpickle" -version = "3.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/39/069100b84d7418bc358d81669d5748efb14b9cceacd2f9c75f550424132f/cloudpickle-3.1.1.tar.gz", hash = "sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64", size = 22113 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/e8/64c37fadfc2816a7701fa8a6ed8d87327c7d54eacfbfb6edab14a2f2be75/cloudpickle-3.1.1-py3-none-any.whl", hash = "sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e", size = 20992 }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "compoundai" -version = "0.1.0" -source = { editable = "." } -dependencies = [ - { name = "bentoml" }, - { name = "types-psutil" }, -] - -[package.metadata] -requires-dist = [ - { name = "bentoml", specifier = ">=1.4.1" }, - { name = "types-psutil", specifier = "==7.0.0.20250218" }, -] - -[[package]] -name = "deprecated" -version = "1.2.18" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "wrapt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 }, -] - -[[package]] -name = "exceptiongroup" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, -] - -[[package]] -name = "frozenlist" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/79/29d44c4af36b2b240725dce566b20f63f9b36ef267aaaa64ee7466f4f2f8/frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a", size = 94451 }, - { url = "https://files.pythonhosted.org/packages/47/47/0c999aeace6ead8a44441b4f4173e2261b18219e4ad1fe9a479871ca02fc/frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb", size = 54301 }, - { url = "https://files.pythonhosted.org/packages/8d/60/107a38c1e54176d12e06e9d4b5d755b677d71d1219217cee063911b1384f/frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec", size = 52213 }, - { url = "https://files.pythonhosted.org/packages/17/62/594a6829ac5679c25755362a9dc93486a8a45241394564309641425d3ff6/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5", size = 240946 }, - { url = "https://files.pythonhosted.org/packages/7e/75/6c8419d8f92c80dd0ee3f63bdde2702ce6398b0ac8410ff459f9b6f2f9cb/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76", size = 264608 }, - { url = "https://files.pythonhosted.org/packages/88/3e/82a6f0b84bc6fb7e0be240e52863c6d4ab6098cd62e4f5b972cd31e002e8/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17", size = 261361 }, - { url = "https://files.pythonhosted.org/packages/fd/85/14e5f9ccac1b64ff2f10c927b3ffdf88772aea875882406f9ba0cec8ad84/frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba", size = 231649 }, - { url = "https://files.pythonhosted.org/packages/ee/59/928322800306f6529d1852323014ee9008551e9bb027cc38d276cbc0b0e7/frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d", size = 241853 }, - { url = "https://files.pythonhosted.org/packages/7d/bd/e01fa4f146a6f6c18c5d34cab8abdc4013774a26c4ff851128cd1bd3008e/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2", size = 243652 }, - { url = "https://files.pythonhosted.org/packages/a5/bd/e4771fd18a8ec6757033f0fa903e447aecc3fbba54e3630397b61596acf0/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f", size = 241734 }, - { url = "https://files.pythonhosted.org/packages/21/13/c83821fa5544af4f60c5d3a65d054af3213c26b14d3f5f48e43e5fb48556/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c", size = 260959 }, - { url = "https://files.pythonhosted.org/packages/71/f3/1f91c9a9bf7ed0e8edcf52698d23f3c211d8d00291a53c9f115ceb977ab1/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab", size = 262706 }, - { url = "https://files.pythonhosted.org/packages/4c/22/4a256fdf5d9bcb3ae32622c796ee5ff9451b3a13a68cfe3f68e2c95588ce/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5", size = 250401 }, - { url = "https://files.pythonhosted.org/packages/af/89/c48ebe1f7991bd2be6d5f4ed202d94960c01b3017a03d6954dd5fa9ea1e8/frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb", size = 45498 }, - { url = "https://files.pythonhosted.org/packages/28/2f/cc27d5f43e023d21fe5c19538e08894db3d7e081cbf582ad5ed366c24446/frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4", size = 51622 }, - { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 }, -] - -[[package]] -name = "fs" -version = "2.4.16" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "appdirs" }, - { name = "setuptools" }, - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5d/a9/af5bfd5a92592c16cdae5c04f68187a309be8a146b528eac3c6e30edbad2/fs-2.4.16.tar.gz", hash = "sha256:ae97c7d51213f4b70b6a958292530289090de3a7e15841e108fbe144f069d313", size = 187441 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/5c/a3d95dc1ec6cdeb032d789b552ecc76effa3557ea9186e1566df6aac18df/fs-2.4.16-py2.py3-none-any.whl", hash = "sha256:660064febbccda264ae0b6bace80a8d1be9e089e0a5eb2427b7d517f9a91545c", size = 135261 }, -] - -[[package]] -name = "h11" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, -] - -[[package]] -name = "httpcore" -version = "1.0.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, -] - -[[package]] -name = "httpx-ws" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "httpcore" }, - { name = "httpx" }, - { name = "wsproto" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a2/bc/ec7e7ac18dc6303187c7999c4b224bd3214745cd757b85ca14c8523c2a7f/httpx_ws-0.7.1.tar.gz", hash = "sha256:72f355d4b9b16d8fa59e5e68efdfcb1f3c7dca944901b373791245c8f67f9f95", size = 24114 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/5b/a27d1c8eda1fdce8c0668a3ea7e09bcc43986f5b306703c46b0f42d2165f/httpx_ws-0.7.1-py3-none-any.whl", hash = "sha256:7970e470840d8e6c17bd45ed4e7af06f9144a4a9decab2ff226f3ff9accb65b4", size = 14438 }, -] - -[[package]] -name = "idna" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, -] - -[[package]] -name = "importlib-metadata" -version = "8.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", size = 55304 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", size = 26514 }, -] - -[[package]] -name = "jinja2" -version = "3.1.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 }, -] - -[[package]] -name = "kantoku" -version = "0.18.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "psutil" }, - { name = "pyzmq" }, - { name = "tornado" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b3/c8/cdcfa607db73d3c270ca3b50fc6521e4ab5776ae9159239729882d9c6592/kantoku-0.18.1.tar.gz", hash = "sha256:6d25065f9da68949aa8181c59151a4670230720ac2b054059fcf6daf1f618740", size = 88803 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/07/4b66a56638d18a01079a5227057a6864ac3e3dbfe2166e16bb1b7d68db96/kantoku-0.18.1-py3-none-any.whl", hash = "sha256:eec46610e17001a090b9f39f820592e1d2205648f95bdd57df85f0d94ebd1b07", size = 118218 }, -] - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mdurl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, -] - -[[package]] -name = "markupsafe" -version = "3.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 }, - { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 }, - { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 }, - { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 }, - { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 }, - { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 }, - { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 }, - { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 }, - { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 }, - { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 }, -] - -[[package]] -name = "mdurl" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, -] - -[[package]] -name = "multidict" -version = "6.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/29/68/259dee7fd14cf56a17c554125e534f6274c2860159692a414d0b402b9a6d/multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60", size = 48628 }, - { url = "https://files.pythonhosted.org/packages/50/79/53ba256069fe5386a4a9e80d4e12857ced9de295baf3e20c68cdda746e04/multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1", size = 29327 }, - { url = "https://files.pythonhosted.org/packages/ff/10/71f1379b05b196dae749b5ac062e87273e3f11634f447ebac12a571d90ae/multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53", size = 29689 }, - { url = "https://files.pythonhosted.org/packages/71/45/70bac4f87438ded36ad4793793c0095de6572d433d98575a5752629ef549/multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5", size = 126639 }, - { url = "https://files.pythonhosted.org/packages/80/cf/17f35b3b9509b4959303c05379c4bfb0d7dd05c3306039fc79cf035bbac0/multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581", size = 134315 }, - { url = "https://files.pythonhosted.org/packages/ef/1f/652d70ab5effb33c031510a3503d4d6efc5ec93153562f1ee0acdc895a57/multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56", size = 129471 }, - { url = "https://files.pythonhosted.org/packages/a6/64/2dd6c4c681688c0165dea3975a6a4eab4944ea30f35000f8b8af1df3148c/multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429", size = 124585 }, - { url = "https://files.pythonhosted.org/packages/87/56/e6ee5459894c7e554b57ba88f7257dc3c3d2d379cb15baaa1e265b8c6165/multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748", size = 116957 }, - { url = "https://files.pythonhosted.org/packages/36/9e/616ce5e8d375c24b84f14fc263c7ef1d8d5e8ef529dbc0f1df8ce71bb5b8/multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db", size = 128609 }, - { url = "https://files.pythonhosted.org/packages/8c/4f/4783e48a38495d000f2124020dc96bacc806a4340345211b1ab6175a6cb4/multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056", size = 123016 }, - { url = "https://files.pythonhosted.org/packages/3e/b3/4950551ab8fc39862ba5e9907dc821f896aa829b4524b4deefd3e12945ab/multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76", size = 133542 }, - { url = "https://files.pythonhosted.org/packages/96/4d/f0ce6ac9914168a2a71df117935bb1f1781916acdecbb43285e225b484b8/multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160", size = 130163 }, - { url = "https://files.pythonhosted.org/packages/be/72/17c9f67e7542a49dd252c5ae50248607dfb780bcc03035907dafefb067e3/multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7", size = 126832 }, - { url = "https://files.pythonhosted.org/packages/71/9f/72d719e248cbd755c8736c6d14780533a1606ffb3fbb0fbd77da9f0372da/multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0", size = 26402 }, - { url = "https://files.pythonhosted.org/packages/04/5a/d88cd5d00a184e1ddffc82aa2e6e915164a6d2641ed3606e766b5d2f275a/multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d", size = 28800 }, - { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 }, -] - -[[package]] -name = "numpy" -version = "2.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fb/90/8956572f5c4ae52201fdec7ba2044b2c882832dcec7d5d0922c9e9acf2de/numpy-2.2.3.tar.gz", hash = "sha256:dbdc15f0c81611925f382dfa97b3bd0bc2c1ce19d4fe50482cb0ddc12ba30020", size = 20262700 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/e1/1816d5d527fa870b260a1c2c5904d060caad7515637bd54f495a5ce13ccd/numpy-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cbc6472e01952d3d1b2772b720428f8b90e2deea8344e854df22b0618e9cce71", size = 21232911 }, - { url = "https://files.pythonhosted.org/packages/29/46/9f25dc19b359f10c0e52b6bac25d3181eb1f4b4d04c9846a32cf5ea52762/numpy-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdfe0c22692a30cd830c0755746473ae66c4a8f2e7bd508b35fb3b6a0813d787", size = 14371955 }, - { url = "https://files.pythonhosted.org/packages/72/d7/de941296e6b09a5c81d3664ad912f1496a0ecdd2f403318e5e35604ff70f/numpy-2.2.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:e37242f5324ffd9f7ba5acf96d774f9276aa62a966c0bad8dae692deebec7716", size = 5410476 }, - { url = "https://files.pythonhosted.org/packages/36/ce/55f685995110f8a268fdca0f198c9a84fa87b39512830965cc1087af6391/numpy-2.2.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95172a21038c9b423e68be78fd0be6e1b97674cde269b76fe269a5dfa6fadf0b", size = 6945730 }, - { url = "https://files.pythonhosted.org/packages/4f/84/abdb9f6e22576d89c259401c3234d4755b322539491bbcffadc8bcb120d3/numpy-2.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5b47c440210c5d1d67e1cf434124e0b5c395eee1f5806fdd89b553ed1acd0a3", size = 14350752 }, - { url = "https://files.pythonhosted.org/packages/e9/88/3870cfa9bef4dffb3a326507f430e6007eeac258ebeef6b76fc542aef66d/numpy-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0391ea3622f5c51a2e29708877d56e3d276827ac5447d7f45e9bc4ade8923c52", size = 16399386 }, - { url = "https://files.pythonhosted.org/packages/02/10/3f629682dd0b457525c131945329c4e81e2dadeb11256e6ce4c9a1a6fb41/numpy-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f6b3dfc7661f8842babd8ea07e9897fe3d9b69a1d7e5fbb743e4160f9387833b", size = 15561826 }, - { url = "https://files.pythonhosted.org/packages/da/18/fd35673ba9751eba449d4ce5d24d94e3b612cdbfba79348da71488c0b7ac/numpy-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1ad78ce7f18ce4e7df1b2ea4019b5817a2f6a8a16e34ff2775f646adce0a5027", size = 18188593 }, - { url = "https://files.pythonhosted.org/packages/ce/4c/c0f897b580ea59484b4cc96a441fea50333b26675a60a1421bc912268b5f/numpy-2.2.3-cp310-cp310-win32.whl", hash = "sha256:5ebeb7ef54a7be11044c33a17b2624abe4307a75893c001a4800857956b41094", size = 6590421 }, - { url = "https://files.pythonhosted.org/packages/e5/5b/aaabbfc7060c5c8f0124c5deb5e114a3b413a548bbc64e372c5b5db36165/numpy-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:596140185c7fa113563c67c2e894eabe0daea18cf8e33851738c19f70ce86aeb", size = 12925667 }, - { url = "https://files.pythonhosted.org/packages/0a/b5/a7839f5478be8f859cb880f13d90fcfe4b0ec7a9ebaff2bcc30d96760596/numpy-2.2.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3c2ec8a0f51d60f1e9c0c5ab116b7fc104b165ada3f6c58abf881cb2eb16044d", size = 21064244 }, - { url = "https://files.pythonhosted.org/packages/29/e8/5da32ffcaa7a72f7ecd82f90c062140a061eb823cb88e90279424e515cf4/numpy-2.2.3-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:ed2cf9ed4e8ebc3b754d398cba12f24359f018b416c380f577bbae112ca52fc9", size = 6809418 }, - { url = "https://files.pythonhosted.org/packages/a8/a9/68aa7076c7656a7308a0f73d0a2ced8c03f282c9fd98fa7ce21c12634087/numpy-2.2.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39261798d208c3095ae4f7bc8eaeb3481ea8c6e03dc48028057d3cbdbdb8937e", size = 16215461 }, - { url = "https://files.pythonhosted.org/packages/17/7f/d322a4125405920401450118dbdc52e0384026bd669939484670ce8b2ab9/numpy-2.2.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:783145835458e60fa97afac25d511d00a1eca94d4a8f3ace9fe2043003c678e4", size = 12839607 }, -] - -[[package]] -name = "nvidia-ml-py" -version = "12.570.86" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ad/6e/7b0c9b88c7d520fb8639024a1a3b6dd1db03bf2c17ae85040c8758d2eb6f/nvidia_ml_py-12.570.86.tar.gz", hash = "sha256:0508d4a0c7b6d015cf574530b95a62ed4fc89da3b8b47e1aefe6777db170ec8b", size = 43147 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/a8/ec37169be4e2b7063b9076ed3fe0661e87335fbca665eed3f48c415cb234/nvidia_ml_py-12.570.86-py3-none-any.whl", hash = "sha256:58907de35a845abd13dcb227f18298f3b5dd94a72d04c9e594e77711e95c0b51", size = 44442 }, -] - -[[package]] -name = "opentelemetry-api" -version = "1.30.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "deprecated" }, - { name = "importlib-metadata" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2b/6d/bbbf879826b7f3c89a45252010b5796fb1f1a0d45d9dc4709db0ef9a06c8/opentelemetry_api-1.30.0.tar.gz", hash = "sha256:375893400c1435bf623f7dfb3bcd44825fe6b56c34d0667c542ea8257b1a1240", size = 63703 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/36/0a/eea862fae6413d8181b23acf8e13489c90a45f17986ee9cf4eab8a0b9ad9/opentelemetry_api-1.30.0-py3-none-any.whl", hash = "sha256:d5f5284890d73fdf47f843dda3210edf37a38d66f44f2b5aedc1e89ed455dc09", size = 64955 }, -] - -[[package]] -name = "opentelemetry-instrumentation" -version = "0.51b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "packaging" }, - { name = "wrapt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ec/5a/4c7f02235ac1269b48f3855f6be1afc641f31d4888d28b90b732fbce7141/opentelemetry_instrumentation-0.51b0.tar.gz", hash = "sha256:4ca266875e02f3988536982467f7ef8c32a38b8895490ddce9ad9604649424fa", size = 27760 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/2c/48fa93f1acca9f79a06da0df7bfe916632ecc7fce1971067b3e46bcae55b/opentelemetry_instrumentation-0.51b0-py3-none-any.whl", hash = "sha256:c6de8bd26b75ec8b0e54dff59e198946e29de6a10ec65488c357d4b34aa5bdcf", size = 30923 }, -] - -[[package]] -name = "opentelemetry-instrumentation-aiohttp-client" -version = "0.51b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-instrumentation" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "opentelemetry-util-http" }, - { name = "wrapt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/77/9d8cd3716357a61822987a37c94a475e414c7cf1474e7bb4417cac7bda44/opentelemetry_instrumentation_aiohttp_client-0.51b0.tar.gz", hash = "sha256:b87fb8c017cd2f19fef0a632c984b5b8cec5bffb0b043456cd1ca01994650bb5", size = 13626 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/ad/55e3c49369fe2eef25c8b0b4d2a658411f04424666e5682994005a298aee/opentelemetry_instrumentation_aiohttp_client-0.51b0-py3-none-any.whl", hash = "sha256:0d44d56cfa515364fcb633e2baeefd363f542372aeceede68c4993db35f44f21", size = 11638 }, -] - -[[package]] -name = "opentelemetry-instrumentation-asgi" -version = "0.51b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "asgiref" }, - { name = "opentelemetry-api" }, - { name = "opentelemetry-instrumentation" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "opentelemetry-util-http" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9e/67/8aa6e1129f641f0f3f8786e6c5d18c1f2bbe490bd4b0e91a6879e85154d2/opentelemetry_instrumentation_asgi-0.51b0.tar.gz", hash = "sha256:b3fe97c00f0bfa934371a69674981d76591c68d937b6422a5716ca21081b4148", size = 24201 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/7e/0a95ab37302729543631a789ba8e71dea75c520495739dbbbdfdc580b401/opentelemetry_instrumentation_asgi-0.51b0-py3-none-any.whl", hash = "sha256:e8072993db47303b633c6ec1bc74726ba4d32bd0c46c28dfadf99f79521a324c", size = 16340 }, -] - -[[package]] -name = "opentelemetry-sdk" -version = "1.30.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/93/ee/d710062e8a862433d1be0b85920d0c653abe318878fef2d14dfe2c62ff7b/opentelemetry_sdk-1.30.0.tar.gz", hash = "sha256:c9287a9e4a7614b9946e933a67168450b9ab35f08797eb9bc77d998fa480fa18", size = 158633 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/97/28/64d781d6adc6bda2260067ce2902bd030cf45aec657e02e28c5b4480b976/opentelemetry_sdk-1.30.0-py3-none-any.whl", hash = "sha256:14fe7afc090caad881addb6926cec967129bd9260c4d33ae6a217359f6b61091", size = 118717 }, -] - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.51b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "deprecated" }, - { name = "opentelemetry-api" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1e/c0/0f9ef4605fea7f2b83d55dd0b0d7aebe8feead247cd6facd232b30907b4f/opentelemetry_semantic_conventions-0.51b0.tar.gz", hash = "sha256:3fabf47f35d1fd9aebcdca7e6802d86bd5ebc3bc3408b7e3248dde6e87a18c47", size = 107191 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/75/d7bdbb6fd8630b4cafb883482b75c4fc276b6426619539d266e32ac53266/opentelemetry_semantic_conventions-0.51b0-py3-none-any.whl", hash = "sha256:fdc777359418e8d06c86012c3dc92c88a6453ba662e941593adb062e48c2eeae", size = 177416 }, -] - -[[package]] -name = "opentelemetry-util-http" -version = "0.51b0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/64/32510c0a803465eb6ef1f5bd514d0f5627f8abc9444ed94f7240faf6fcaa/opentelemetry_util_http-0.51b0.tar.gz", hash = "sha256:05edd19ca1cc3be3968b1e502fd94816901a365adbeaab6b6ddb974384d3a0b9", size = 8043 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/dd/c371eeb9cc78abbdad231a27ce1a196a37ef96328d876ccbb381dea4c8ee/opentelemetry_util_http-0.51b0-py3-none-any.whl", hash = "sha256:0561d7a6e9c422b9ef9ae6e77eafcfcd32a2ab689f5e801475cbb67f189efa20", size = 7304 }, -] - -[[package]] -name = "packaging" -version = "24.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, -] - -[[package]] -name = "pathspec" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, -] - -[[package]] -name = "pip-requirements-parser" -version = "32.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, - { name = "pyparsing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5e/2a/63b574101850e7f7b306ddbdb02cb294380d37948140eecd468fae392b54/pip-requirements-parser-32.0.1.tar.gz", hash = "sha256:b4fa3a7a0be38243123cf9d1f3518da10c51bdb165a2b2985566247f9155a7d3", size = 209359 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/d0/d04f1d1e064ac901439699ee097f58688caadea42498ec9c4b4ad2ef84ab/pip_requirements_parser-32.0.1-py3-none-any.whl", hash = "sha256:4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526", size = 35648 }, -] - -[[package]] -name = "prometheus-client" -version = "0.21.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/62/14/7d0f567991f3a9af8d1cd4f619040c93b68f09a02b6d0b6ab1b2d1ded5fe/prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", size = 78551 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301", size = 54682 }, -] - -[[package]] -name = "prompt-toolkit" -version = "3.0.50" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "wcwidth" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a1/e1/bd15cb8ffdcfeeb2bdc215de3c3cffca11408d829e4b8416dcfe71ba8854/prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab", size = 429087 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816 }, -] - -[[package]] -name = "propcache" -version = "0.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/92/76/f941e63d55c0293ff7829dd21e7cf1147e90a526756869a9070f287a68c9/propcache-0.3.0.tar.gz", hash = "sha256:a8fd93de4e1d278046345f49e2238cdb298589325849b2645d4a94c53faeffc5", size = 42722 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/f0/dc9ec44d2e63c13f816a16398c039329736712440ff82b682dd9a78d2258/propcache-0.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:efa44f64c37cc30c9f05932c740a8b40ce359f51882c70883cc95feac842da4d", size = 79574 }, - { url = "https://files.pythonhosted.org/packages/99/3a/33a207dfcb3ee1131ea23a2aeb726c3c4994f89546d7eadf8c50627c8b63/propcache-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2383a17385d9800b6eb5855c2f05ee550f803878f344f58b6e194de08b96352c", size = 45898 }, - { url = "https://files.pythonhosted.org/packages/af/68/0bde765c9f5dc02b4466d2838600af38c81b184c26c6d3cd44643ac668e3/propcache-0.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3e7420211f5a65a54675fd860ea04173cde60a7cc20ccfbafcccd155225f8bc", size = 45418 }, - { url = "https://files.pythonhosted.org/packages/06/a6/c682669bae41199358e16cc7b1c818f91c5f9e925cc863dabd98ce32716a/propcache-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3302c5287e504d23bb0e64d2a921d1eb4a03fb93a0a0aa3b53de059f5a5d737d", size = 205116 }, - { url = "https://files.pythonhosted.org/packages/fb/ae/82cfb50267d9a1baa0340728eb9e32245a68538fef929d7bb786d01c11a8/propcache-0.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7e2e068a83552ddf7a39a99488bcba05ac13454fb205c847674da0352602082f", size = 219405 }, - { url = "https://files.pythonhosted.org/packages/ab/16/7b6b2bf8c207cfd0e5ca3d41aea397392de9899867ec024f88c94f9ae2ab/propcache-0.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d913d36bdaf368637b4f88d554fb9cb9d53d6920b9c5563846555938d5450bf", size = 217656 }, - { url = "https://files.pythonhosted.org/packages/f4/eb/41447de61eb5454891658d0fb9b1d7d35d49a4a5dd2e0c86f2c332e8b7e1/propcache-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ee1983728964d6070ab443399c476de93d5d741f71e8f6e7880a065f878e0b9", size = 205414 }, - { url = "https://files.pythonhosted.org/packages/03/b6/9719878f8b5b20d37ee663a40f8dcbf888559e4d3be2ba2fe5c790fc28d2/propcache-0.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36ca5e9a21822cc1746023e88f5c0af6fce3af3b85d4520efb1ce4221bed75cc", size = 195746 }, - { url = "https://files.pythonhosted.org/packages/bb/ec/b79c3210ba459800d1a8f1afeb81d7b503893555a7b79c24082ff26d3314/propcache-0.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9ecde3671e62eeb99e977f5221abcf40c208f69b5eb986b061ccec317c82ebd0", size = 198651 }, - { url = "https://files.pythonhosted.org/packages/48/f6/2b0140bc47013e43575973068e72ad51ee9f22f2dad42e6d6e362d715125/propcache-0.3.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d383bf5e045d7f9d239b38e6acadd7b7fdf6c0087259a84ae3475d18e9a2ae8b", size = 195858 }, - { url = "https://files.pythonhosted.org/packages/97/3d/2fa19303d87aa21f9a42dcd870d6088a2a776ff5518e394d50412c3679a6/propcache-0.3.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8cb625bcb5add899cb8ba7bf716ec1d3e8f7cdea9b0713fa99eadf73b6d4986f", size = 197181 }, - { url = "https://files.pythonhosted.org/packages/09/f3/a2170ffc9fa774c1dfd52294113c0fa6cdc5b71dbfd7129bb9378fdd8b42/propcache-0.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5fa159dcee5dba00c1def3231c249cf261185189205073bde13797e57dd7540a", size = 207411 }, - { url = "https://files.pythonhosted.org/packages/d6/1e/cb8a6c82178efffa0b00dc463f36cd086f747345585140aeb95d5cb93666/propcache-0.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a7080b0159ce05f179cfac592cda1a82898ca9cd097dacf8ea20ae33474fbb25", size = 210724 }, - { url = "https://files.pythonhosted.org/packages/2b/72/6e273543337a3e22cf462eb836f065a9830b4d41baeb1f58db2695c934f3/propcache-0.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ed7161bccab7696a473fe7ddb619c1d75963732b37da4618ba12e60899fefe4f", size = 203511 }, - { url = "https://files.pythonhosted.org/packages/f3/ea/7412c79bcec06597c967d49789f5a1f7fd76a8654908feeaefafb7447c9a/propcache-0.3.0-cp310-cp310-win32.whl", hash = "sha256:bf0d9a171908f32d54f651648c7290397b8792f4303821c42a74e7805bfb813c", size = 40600 }, - { url = "https://files.pythonhosted.org/packages/a3/42/488c90190491f3e61bd2c2fb0b3d91c1c78778270dde2f0b6633fc9ff723/propcache-0.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:42924dc0c9d73e49908e35bbdec87adedd651ea24c53c29cac103ede0ea1d340", size = 44714 }, - { url = "https://files.pythonhosted.org/packages/b5/35/6c4c6fc8774a9e3629cd750dc24a7a4fb090a25ccd5c3246d127b70f9e22/propcache-0.3.0-py3-none-any.whl", hash = "sha256:67dda3c7325691c2081510e92c561f465ba61b975f481735aefdfc845d2cd043", size = 12101 }, -] - -[[package]] -name = "psutil" -version = "7.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, - { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, - { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, - { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, - { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, - { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, - { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, -] - -[[package]] -name = "pycparser" -version = "2.22" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, -] - -[[package]] -name = "pydantic" -version = "2.10.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, -] - -[[package]] -name = "pydantic-core" -version = "2.27.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/bc/fed5f74b5d802cf9a03e83f60f18864e90e3aed7223adaca5ffb7a8d8d64/pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", size = 1895938 }, - { url = "https://files.pythonhosted.org/packages/71/2a/185aff24ce844e39abb8dd680f4e959f0006944f4a8a0ea372d9f9ae2e53/pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", size = 1815684 }, - { url = "https://files.pythonhosted.org/packages/c3/43/fafabd3d94d159d4f1ed62e383e264f146a17dd4d48453319fd782e7979e/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", size = 1829169 }, - { url = "https://files.pythonhosted.org/packages/a2/d1/f2dfe1a2a637ce6800b799aa086d079998959f6f1215eb4497966efd2274/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", size = 1867227 }, - { url = "https://files.pythonhosted.org/packages/7d/39/e06fcbcc1c785daa3160ccf6c1c38fea31f5754b756e34b65f74e99780b5/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", size = 2037695 }, - { url = "https://files.pythonhosted.org/packages/7a/67/61291ee98e07f0650eb756d44998214231f50751ba7e13f4f325d95249ab/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", size = 2741662 }, - { url = "https://files.pythonhosted.org/packages/32/90/3b15e31b88ca39e9e626630b4c4a1f5a0dfd09076366f4219429e6786076/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", size = 1993370 }, - { url = "https://files.pythonhosted.org/packages/ff/83/c06d333ee3a67e2e13e07794995c1535565132940715931c1c43bfc85b11/pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", size = 1996813 }, - { url = "https://files.pythonhosted.org/packages/7c/f7/89be1c8deb6e22618a74f0ca0d933fdcb8baa254753b26b25ad3acff8f74/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", size = 2005287 }, - { url = "https://files.pythonhosted.org/packages/b7/7d/8eb3e23206c00ef7feee17b83a4ffa0a623eb1a9d382e56e4aa46fd15ff2/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", size = 2128414 }, - { url = "https://files.pythonhosted.org/packages/4e/99/fe80f3ff8dd71a3ea15763878d464476e6cb0a2db95ff1c5c554133b6b83/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", size = 2155301 }, - { url = "https://files.pythonhosted.org/packages/2b/a3/e50460b9a5789ca1451b70d4f52546fa9e2b420ba3bfa6100105c0559238/pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", size = 1816685 }, - { url = "https://files.pythonhosted.org/packages/57/4c/a8838731cb0f2c2a39d3535376466de6049034d7b239c0202a64aaa05533/pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", size = 1982876 }, - { url = "https://files.pythonhosted.org/packages/46/72/af70981a341500419e67d5cb45abe552a7c74b66326ac8877588488da1ac/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", size = 1891159 }, - { url = "https://files.pythonhosted.org/packages/ad/3d/c5913cccdef93e0a6a95c2d057d2c2cba347815c845cda79ddd3c0f5e17d/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", size = 1768331 }, - { url = "https://files.pythonhosted.org/packages/f6/f0/a3ae8fbee269e4934f14e2e0e00928f9346c5943174f2811193113e58252/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", size = 1822467 }, - { url = "https://files.pythonhosted.org/packages/d7/7a/7bbf241a04e9f9ea24cd5874354a83526d639b02674648af3f350554276c/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", size = 1979797 }, - { url = "https://files.pythonhosted.org/packages/4f/5f/4784c6107731f89e0005a92ecb8a2efeafdb55eb992b8e9d0a2be5199335/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", size = 1987839 }, - { url = "https://files.pythonhosted.org/packages/6d/a7/61246562b651dff00de86a5f01b6e4befb518df314c54dec187a78d81c84/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", size = 1998861 }, - { url = "https://files.pythonhosted.org/packages/86/aa/837821ecf0c022bbb74ca132e117c358321e72e7f9702d1b6a03758545e2/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", size = 2116582 }, - { url = "https://files.pythonhosted.org/packages/81/b0/5e74656e95623cbaa0a6278d16cf15e10a51f6002e3ec126541e95c29ea3/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", size = 2151985 }, - { url = "https://files.pythonhosted.org/packages/63/37/3e32eeb2a451fddaa3898e2163746b0cffbbdbb4740d38372db0490d67f3/pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", size = 2004715 }, -] - -[[package]] -name = "pygments" -version = "2.19.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, -] - -[[package]] -name = "pyparsing" -version = "3.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8b/1a/3544f4f299a47911c2ab3710f534e52fea62a633c96806995da5d25be4b2/pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a", size = 1067694 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/a7/c8a2d361bf89c0d9577c934ebb7421b25dc84bf3a8e3ac0a40aed9acc547/pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1", size = 107716 }, -] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, -] - -[[package]] -name = "python-dotenv" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, -] - -[[package]] -name = "python-json-logger" -version = "3.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/c4/358cd13daa1d912ef795010897a483ab2f0b41c9ea1b35235a8b2f7d15a7/python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008", size = 16287 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/72/2f30cf26664fcfa0bd8ec5ee62ec90c03bd485e4a294d92aabc76c5203a5/python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090", size = 14924 }, -] - -[[package]] -name = "python-multipart" -version = "0.0.20" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, -] - -[[package]] -name = "pyyaml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199 }, - { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758 }, - { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463 }, - { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280 }, - { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239 }, - { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802 }, - { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527 }, - { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052 }, - { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774 }, -] - -[[package]] -name = "pyzmq" -version = "26.2.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "implementation_name == 'pypy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5a/e3/8d0382cb59feb111c252b54e8728257416a38ffcb2243c4e4775a3c990fe/pyzmq-26.2.1.tar.gz", hash = "sha256:17d72a74e5e9ff3829deb72897a175333d3ef5b5413948cae3cf7ebf0b02ecca", size = 278433 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/70/3d/c2d9d46c033d1b51692ea49a22439f7f66d91d5c938e8b5c56ed7a2151c2/pyzmq-26.2.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:f39d1227e8256d19899d953e6e19ed2ccb689102e6d85e024da5acf410f301eb", size = 1345451 }, - { url = "https://files.pythonhosted.org/packages/0e/df/4754a8abcdeef280651f9bb51446c47659910940b392a66acff7c37f5cef/pyzmq-26.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a23948554c692df95daed595fdd3b76b420a4939d7a8a28d6d7dea9711878641", size = 942766 }, - { url = "https://files.pythonhosted.org/packages/74/da/e6053a3b13c912eded6c2cdeee22ff3a4c33820d17f9eb24c7b6e957ffe7/pyzmq-26.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95f5728b367a042df146cec4340d75359ec6237beebf4a8f5cf74657c65b9257", size = 678488 }, - { url = "https://files.pythonhosted.org/packages/9e/50/614934145244142401ca174ca81071777ab93aa88173973ba0154f491e09/pyzmq-26.2.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95f7b01b3f275504011cf4cf21c6b885c8d627ce0867a7e83af1382ebab7b3ff", size = 917115 }, - { url = "https://files.pythonhosted.org/packages/80/2b/ebeb7bc4fc8e9e61650b2e09581597355a4341d413fa9b2947d7a6558119/pyzmq-26.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80a00370a2ef2159c310e662c7c0f2d030f437f35f478bb8b2f70abd07e26b24", size = 874162 }, - { url = "https://files.pythonhosted.org/packages/79/48/93210621c331ad16313dc2849801411fbae10d91d878853933f2a85df8e7/pyzmq-26.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:8531ed35dfd1dd2af95f5d02afd6545e8650eedbf8c3d244a554cf47d8924459", size = 874180 }, - { url = "https://files.pythonhosted.org/packages/f0/8b/40924b4d8e33bfdd54c1970fb50f327e39b90b902f897cf09b30b2e9ac48/pyzmq-26.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cdb69710e462a38e6039cf17259d328f86383a06c20482cc154327968712273c", size = 1208139 }, - { url = "https://files.pythonhosted.org/packages/c8/b2/82d6675fc89bd965eae13c45002c792d33f06824589844b03f8ea8fc6d86/pyzmq-26.2.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e7eeaef81530d0b74ad0d29eec9997f1c9230c2f27242b8d17e0ee67662c8f6e", size = 1520666 }, - { url = "https://files.pythonhosted.org/packages/9d/e2/5ff15f2d3f920dcc559d477bd9bb3faacd6d79fcf7c5448e585c78f84849/pyzmq-26.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:361edfa350e3be1f987e592e834594422338d7174364763b7d3de5b0995b16f3", size = 1420056 }, - { url = "https://files.pythonhosted.org/packages/40/a2/f9bbeccf7f75aa0d8963e224e5730abcefbf742e1f2ae9ea60fd9d6ff72b/pyzmq-26.2.1-cp310-cp310-win32.whl", hash = "sha256:637536c07d2fb6a354988b2dd1d00d02eb5dd443f4bbee021ba30881af1c28aa", size = 583874 }, - { url = "https://files.pythonhosted.org/packages/56/b1/44f513135843272f0e12f5aebf4af35839e2a88eb45411f2c8c010d8c856/pyzmq-26.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:45fad32448fd214fbe60030aa92f97e64a7140b624290834cc9b27b3a11f9473", size = 647367 }, - { url = "https://files.pythonhosted.org/packages/27/9c/1bef14a37b02d651a462811bbdb1390b61cd4a5b5e95cbd7cc2d60ef848c/pyzmq-26.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:d9da0289d8201c8a29fd158aaa0dfe2f2e14a181fd45e2dc1fbf969a62c1d594", size = 561784 }, - { url = "https://files.pythonhosted.org/packages/65/d1/e630a75cfb2534574a1258fda54d02f13cf80b576d4ce6d2aa478dc67829/pyzmq-26.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:380816d298aed32b1a97b4973a4865ef3be402a2e760204509b52b6de79d755d", size = 847743 }, - { url = "https://files.pythonhosted.org/packages/27/df/f94a711b4f6c4b41e227f9a938103f52acf4c2e949d91cbc682495a48155/pyzmq-26.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97cbb368fd0debdbeb6ba5966aa28e9a1ae3396c7386d15569a6ca4be4572b99", size = 570991 }, - { url = "https://files.pythonhosted.org/packages/bf/08/0c6f97fb3c9dbfa23382f0efaf8f9aa1396a08a3358974eaae3ee659ed5c/pyzmq-26.2.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf7b5942c6b0dafcc2823ddd9154f419147e24f8df5b41ca8ea40a6db90615c", size = 799664 }, - { url = "https://files.pythonhosted.org/packages/05/14/f4d4fd8bb8988c667845734dd756e9ee65b9a17a010d5f288dfca14a572d/pyzmq-26.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fe6e28a8856aea808715f7a4fc11f682b9d29cac5d6262dd8fe4f98edc12d53", size = 758156 }, - { url = "https://files.pythonhosted.org/packages/e3/fe/72e7e166bda3885810bee7b23049133e142f7c80c295bae02c562caeea16/pyzmq-26.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bd8fdee945b877aa3bffc6a5a8816deb048dab0544f9df3731ecd0e54d8c84c9", size = 556563 }, -] - -[[package]] -name = "questionary" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "prompt-toolkit" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a8/b8/d16eb579277f3de9e56e5ad25280fab52fc5774117fb70362e8c2e016559/questionary-2.1.0.tar.gz", hash = "sha256:6302cdd645b19667d8f6e6634774e9538bfcd1aad9be287e743d96cacaf95587", size = 26775 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/3f/11dd4cd4f39e05128bfd20138faea57bec56f9ffba6185d276e3107ba5b2/questionary-2.1.0-py3-none-any.whl", hash = "sha256:44174d237b68bc828e4878c763a9ad6790ee61990e0ae72927694ead57bab8ec", size = 36747 }, -] - -[[package]] -name = "rich" -version = "13.9.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, - { name = "pygments" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, -] - -[[package]] -name = "schema" -version = "0.7.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d4/01/0ea2e66bad2f13271e93b729c653747614784d3ebde219679e41ccdceecd/schema-0.7.7.tar.gz", hash = "sha256:7da553abd2958a19dc2547c388cde53398b39196175a9be59ea1caf5ab0a1807", size = 44245 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/1b/81855a88c6db2b114d5b2e9f96339190d5ee4d1b981d217fa32127bb00e0/schema-0.7.7-py2.py3-none-any.whl", hash = "sha256:5d976a5b50f36e74e2157b47097b60002bd4d42e65425fcc9c9befadb4255dde", size = 18632 }, -] - -[[package]] -name = "setuptools" -version = "75.8.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/92/ec/089608b791d210aec4e7f97488e67ab0d33add3efccb83a056cbafe3a2a6/setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6", size = 1343222 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/8a/b9dc7678803429e4a3bc9ba462fa3dd9066824d3c607490235c6a796be5a/setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3", size = 1228782 }, -] - -[[package]] -name = "simple-di" -version = "0.1.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/b8/f2e3d1d6eac545c897a9b8ae339f2f2437a0e0b00bf0df3767109bede14d/simple_di-0.1.5.tar.gz", hash = "sha256:192b999dee4cd4fb11a5d861165caad02d8f0617c0f806fc5b09f905f1a03ca0", size = 9331 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/6d/02014c8b1e34bae98b9b7fb5e9a4bc17aecdc28dfb08083e1fa9e4731b7d/simple_di-0.1.5-py3-none-any.whl", hash = "sha256:e3fb6242f18f389a3c2d571dd51ade47c74cdbc4550590894664ad59bfb2a345", size = 9823 }, -] - -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, -] - -[[package]] -name = "starlette" -version = "0.46.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/44/b6/fb9a32e3c5d59b1e383c357534c63c2d3caa6f25bf3c59dd89d296ecbaec/starlette-0.46.0.tar.gz", hash = "sha256:b359e4567456b28d473d0193f34c0de0ed49710d75ef183a74a5ce0499324f50", size = 2575568 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/94/8af675a62e3c91c2dee47cf92e602cfac86e8767b1a1ac3caf1b327c2ab0/starlette-0.46.0-py3-none-any.whl", hash = "sha256:913f0798bd90ba90a9156383bcf1350a17d6259451d0d8ee27fc0cf2db609038", size = 71991 }, -] - -[[package]] -name = "tomli" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, -] - -[[package]] -name = "tomli-w" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675 }, -] - -[[package]] -name = "tornado" -version = "6.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 }, - { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 }, - { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 }, - { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 }, - { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 }, - { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 }, - { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 }, - { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 }, - { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 }, - { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, -] - -[[package]] -name = "types-psutil" -version = "7.0.0.20250218" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/7c/145600d30456e7ccbb499abcf718aab2bd830e604a0ae8eb32b67cd346a6/types_psutil-7.0.0.20250218.tar.gz", hash = "sha256:1e642cdafe837b240295b23b1cbd4691d80b08a07d29932143cbbae30eb0db9c", size = 19828 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/50/c8/f4365293408da4a9bcb1849d3efd8c60427cffff68cbb98ab1b81851d8bb/types_psutil-7.0.0.20250218-py3-none-any.whl", hash = "sha256:1447a30c282aafefcf8941ece854e1100eee7b0296a9d9be9977292f0269b121", size = 22763 }, -] - -[[package]] -name = "typing-extensions" -version = "4.12.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, -] - -[[package]] -name = "uvicorn" -version = "0.34.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "h11" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, -] - -[[package]] -name = "watchfiles" -version = "1.0.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f5/26/c705fc77d0a9ecdb9b66f1e2976d95b81df3cae518967431e7dbf9b5e219/watchfiles-1.0.4.tar.gz", hash = "sha256:6ba473efd11062d73e4f00c2b730255f9c1bdd73cd5f9fe5b5da8dbd4a717205", size = 94625 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/14/02/22fcaed0396730b0d362bc8d1ffb3be2658fd473eecbb2ba84243e157f11/watchfiles-1.0.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ba5bb3073d9db37c64520681dd2650f8bd40902d991e7b4cfaeece3e32561d08", size = 395212 }, - { url = "https://files.pythonhosted.org/packages/e9/3d/ec5a2369a46edf3ebe092c39d9ae48e8cb6dacbde51c4b4f98936c524269/watchfiles-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9f25d0ba0fe2b6d2c921cf587b2bf4c451860086534f40c384329fb96e2044d1", size = 384815 }, - { url = "https://files.pythonhosted.org/packages/df/b4/898991cececbe171e67142c31905510203649569d9817848f47c4177ee42/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47eb32ef8c729dbc4f4273baece89398a4d4b5d21a1493efea77a17059f4df8a", size = 450680 }, - { url = "https://files.pythonhosted.org/packages/58/f7/d4aa3000e812cfb5e5c2c6c0a3ec9d0a46a42489a8727edd160631c4e210/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:076f293100db3b0b634514aa0d294b941daa85fc777f9c698adb1009e5aca0b1", size = 455923 }, - { url = "https://files.pythonhosted.org/packages/dd/95/7e2e4c6aba1b02fb5c76d2f6a450b85215921ec5f8f7ad5efd075369563f/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1eacd91daeb5158c598fe22d7ce66d60878b6294a86477a4715154990394c9b3", size = 482339 }, - { url = "https://files.pythonhosted.org/packages/bb/67/4265b0fabcc2ef2c9e3e8802ba7908cf718a357ebfb49c72e53787156a48/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13c2ce7b72026cfbca120d652f02c7750f33b4c9395d79c9790b27f014c8a5a2", size = 519908 }, - { url = "https://files.pythonhosted.org/packages/0d/96/b57802d5f8164bdf070befb4fd3dec4edba5a364ec0670965a97eb8098ce/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:90192cdc15ab7254caa7765a98132a5a41471cf739513cc9bcf7d2ffcc0ec7b2", size = 501410 }, - { url = "https://files.pythonhosted.org/packages/8b/18/6db0de4e8911ba14e31853201b40c0fa9fea5ecf3feb86b0ad58f006dfc3/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278aaa395f405972e9f523bd786ed59dfb61e4b827856be46a42130605fd0899", size = 452876 }, - { url = "https://files.pythonhosted.org/packages/df/df/092a961815edf723a38ba2638c49491365943919c3526cc9cf82c42786a6/watchfiles-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a462490e75e466edbb9fc4cd679b62187153b3ba804868452ef0577ec958f5ff", size = 615353 }, - { url = "https://files.pythonhosted.org/packages/f3/cf/b85fe645de4ff82f3f436c5e9032379fce37c303f6396a18f9726cc34519/watchfiles-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8d0d0630930f5cd5af929040e0778cf676a46775753e442a3f60511f2409f48f", size = 613187 }, - { url = "https://files.pythonhosted.org/packages/f6/d4/a9fea27aef4dd69689bc3556718c1157a7accb72aa035ece87c1fa8483b5/watchfiles-1.0.4-cp310-cp310-win32.whl", hash = "sha256:cc27a65069bcabac4552f34fd2dce923ce3fcde0721a16e4fb1b466d63ec831f", size = 270799 }, - { url = "https://files.pythonhosted.org/packages/df/02/dbe9d4439f15dd4ad0720b6e039bde9d66d1f830331f34c18eb70fa6608e/watchfiles-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:8b1f135238e75d075359cf506b27bf3f4ca12029c47d3e769d8593a2024ce161", size = 284145 }, - { url = "https://files.pythonhosted.org/packages/6f/06/175d5ac6b838fb319008c0cd981d7bf289317c510154d411d3584ca2b67b/watchfiles-1.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdcc92daeae268de1acf5b7befcd6cfffd9a047098199056c72e4623f531de18", size = 396269 }, - { url = "https://files.pythonhosted.org/packages/86/ee/5db93b0b57dc0587abdbac4149296ee73275f615d790a82cb5598af0557f/watchfiles-1.0.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8d3d9203705b5797f0af7e7e5baa17c8588030aaadb7f6a86107b7247303817", size = 386010 }, - { url = "https://files.pythonhosted.org/packages/75/61/fe0dc5fedf152bfc085a53711f740701f6bdb8ab6b5c950402b681d4858b/watchfiles-1.0.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdef5a1be32d0b07dcea3318a0be95d42c98ece24177820226b56276e06b63b0", size = 450913 }, - { url = "https://files.pythonhosted.org/packages/9f/dd/3c7731af3baf1a9957afc643d176f94480921a690ec3237c9f9d11301c08/watchfiles-1.0.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:342622287b5604ddf0ed2d085f3a589099c9ae8b7331df3ae9845571586c4f3d", size = 453474 }, -] - -[[package]] -name = "wcwidth" -version = "0.2.13" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, -] - -[[package]] -name = "wrapt" -version = "1.17.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/d1/1daec934997e8b160040c78d7b31789f19b122110a75eca3d4e8da0049e1/wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984", size = 53307 }, - { url = "https://files.pythonhosted.org/packages/1b/7b/13369d42651b809389c1a7153baa01d9700430576c81a2f5c5e460df0ed9/wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22", size = 38486 }, - { url = "https://files.pythonhosted.org/packages/62/bf/e0105016f907c30b4bd9e377867c48c34dc9c6c0c104556c9c9126bd89ed/wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7", size = 38777 }, - { url = "https://files.pythonhosted.org/packages/27/70/0f6e0679845cbf8b165e027d43402a55494779295c4b08414097b258ac87/wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c", size = 83314 }, - { url = "https://files.pythonhosted.org/packages/0f/77/0576d841bf84af8579124a93d216f55d6f74374e4445264cb378a6ed33eb/wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72", size = 74947 }, - { url = "https://files.pythonhosted.org/packages/90/ec/00759565518f268ed707dcc40f7eeec38637d46b098a1f5143bff488fe97/wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061", size = 82778 }, - { url = "https://files.pythonhosted.org/packages/f8/5a/7cffd26b1c607b0b0c8a9ca9d75757ad7620c9c0a9b4a25d3f8a1480fafc/wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2", size = 81716 }, - { url = "https://files.pythonhosted.org/packages/7e/09/dccf68fa98e862df7e6a60a61d43d644b7d095a5fc36dbb591bbd4a1c7b2/wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c", size = 74548 }, - { url = "https://files.pythonhosted.org/packages/b7/8e/067021fa3c8814952c5e228d916963c1115b983e21393289de15128e867e/wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62", size = 81334 }, - { url = "https://files.pythonhosted.org/packages/4b/0d/9d4b5219ae4393f718699ca1c05f5ebc0c40d076f7e65fd48f5f693294fb/wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563", size = 36427 }, - { url = "https://files.pythonhosted.org/packages/72/6a/c5a83e8f61aec1e1aeef939807602fb880e5872371e95df2137142f5c58e/wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f", size = 38774 }, - { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, -] - -[[package]] -name = "wsproto" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c9/4a/44d3c295350d776427904d73c189e10aeae66d7f555bb2feee16d1e4ba5a/wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", size = 53425 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226 }, -] - -[[package]] -name = "yarl" -version = "1.18.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "multidict" }, - { name = "propcache" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b7/9d/4b94a8e6d2b51b599516a5cb88e5bc99b4d8d4583e468057eaa29d5f0918/yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", size = 181062 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/98/e005bc608765a8a5569f58e650961314873c8469c333616eb40bff19ae97/yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34", size = 141458 }, - { url = "https://files.pythonhosted.org/packages/df/5d/f8106b263b8ae8a866b46d9be869ac01f9b3fb7f2325f3ecb3df8003f796/yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7", size = 94365 }, - { url = "https://files.pythonhosted.org/packages/56/3e/d8637ddb9ba69bf851f765a3ee288676f7cf64fb3be13760c18cbc9d10bd/yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed", size = 92181 }, - { url = "https://files.pythonhosted.org/packages/76/f9/d616a5c2daae281171de10fba41e1c0e2d8207166fc3547252f7d469b4e1/yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde", size = 315349 }, - { url = "https://files.pythonhosted.org/packages/bb/b4/3ea5e7b6f08f698b3769a06054783e434f6d59857181b5c4e145de83f59b/yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b", size = 330494 }, - { url = "https://files.pythonhosted.org/packages/55/f1/e0fc810554877b1b67420568afff51b967baed5b53bcc983ab164eebf9c9/yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5", size = 326927 }, - { url = "https://files.pythonhosted.org/packages/a9/42/b1753949b327b36f210899f2dd0a0947c0c74e42a32de3f8eb5c7d93edca/yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc", size = 319703 }, - { url = "https://files.pythonhosted.org/packages/f0/6d/e87c62dc9635daefb064b56f5c97df55a2e9cc947a2b3afd4fd2f3b841c7/yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd", size = 310246 }, - { url = "https://files.pythonhosted.org/packages/e3/ef/e2e8d1785cdcbd986f7622d7f0098205f3644546da7919c24b95790ec65a/yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990", size = 319730 }, - { url = "https://files.pythonhosted.org/packages/fc/15/8723e22345bc160dfde68c4b3ae8b236e868f9963c74015f1bc8a614101c/yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db", size = 321681 }, - { url = "https://files.pythonhosted.org/packages/86/09/bf764e974f1516efa0ae2801494a5951e959f1610dd41edbfc07e5e0f978/yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62", size = 324812 }, - { url = "https://files.pythonhosted.org/packages/f6/4c/20a0187e3b903c97d857cf0272d687c1b08b03438968ae8ffc50fe78b0d6/yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760", size = 337011 }, - { url = "https://files.pythonhosted.org/packages/c9/71/6244599a6e1cc4c9f73254a627234e0dad3883ece40cc33dce6265977461/yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b", size = 338132 }, - { url = "https://files.pythonhosted.org/packages/af/f5/e0c3efaf74566c4b4a41cb76d27097df424052a064216beccae8d303c90f/yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690", size = 331849 }, - { url = "https://files.pythonhosted.org/packages/8a/b8/3d16209c2014c2f98a8f658850a57b716efb97930aebf1ca0d9325933731/yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6", size = 84309 }, - { url = "https://files.pythonhosted.org/packages/fd/b7/2e9a5b18eb0fe24c3a0e8bae994e812ed9852ab4fd067c0107fadde0d5f0/yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8", size = 90484 }, - { url = "https://files.pythonhosted.org/packages/f5/4b/a06e0ec3d155924f77835ed2d167ebd3b211a7b0853da1cf8d8414d784ef/yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", size = 45109 }, -] - -[[package]] -name = "zipp" -version = "3.21.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 }, -] diff --git a/deploy/compoundai/api-server/.air.toml b/deploy/dynemo/api-server/.air.toml similarity index 100% rename from deploy/compoundai/api-server/.air.toml rename to deploy/dynemo/api-server/.air.toml diff --git a/deploy/compoundai/api-server/.env b/deploy/dynemo/api-server/.env similarity index 100% rename from deploy/compoundai/api-server/.env rename to deploy/dynemo/api-server/.env diff --git a/deploy/compoundai/api-server/.gitignore b/deploy/dynemo/api-server/.gitignore similarity index 100% rename from deploy/compoundai/api-server/.gitignore rename to deploy/dynemo/api-server/.gitignore diff --git a/deploy/compoundai/api-server/Dockerfile b/deploy/dynemo/api-server/Dockerfile similarity index 100% rename from deploy/compoundai/api-server/Dockerfile rename to deploy/dynemo/api-server/Dockerfile diff --git a/deploy/compoundai/api-server/Earthfile b/deploy/dynemo/api-server/Earthfile similarity index 100% rename from deploy/compoundai/api-server/Earthfile rename to deploy/dynemo/api-server/Earthfile diff --git a/deploy/compoundai/api-server/api/common/client/client.go b/deploy/dynemo/api-server/api/common/client/client.go similarity index 100% rename from deploy/compoundai/api-server/api/common/client/client.go rename to deploy/dynemo/api-server/api/common/client/client.go diff --git a/deploy/compoundai/api-server/api/common/consts/consts.go b/deploy/dynemo/api-server/api/common/consts/consts.go similarity index 100% rename from deploy/compoundai/api-server/api/common/consts/consts.go rename to deploy/dynemo/api-server/api/common/consts/consts.go diff --git a/deploy/compoundai/api-server/api/common/consts/k8s.go b/deploy/dynemo/api-server/api/common/consts/k8s.go similarity index 100% rename from deploy/compoundai/api-server/api/common/consts/k8s.go rename to deploy/dynemo/api-server/api/common/consts/k8s.go diff --git a/deploy/compoundai/api-server/api/common/env/env.go b/deploy/dynemo/api-server/api/common/env/env.go similarity index 100% rename from deploy/compoundai/api-server/api/common/env/env.go rename to deploy/dynemo/api-server/api/common/env/env.go diff --git a/deploy/compoundai/api-server/api/common/env/nds.go b/deploy/dynemo/api-server/api/common/env/nds.go similarity index 100% rename from deploy/compoundai/api-server/api/common/env/nds.go rename to deploy/dynemo/api-server/api/common/env/nds.go diff --git a/deploy/compoundai/api-server/api/common/env/scope.go b/deploy/dynemo/api-server/api/common/env/scope.go similarity index 100% rename from deploy/compoundai/api-server/api/common/env/scope.go rename to deploy/dynemo/api-server/api/common/env/scope.go diff --git a/deploy/compoundai/api-server/api/common/utils/utils.go b/deploy/dynemo/api-server/api/common/utils/utils.go similarity index 100% rename from deploy/compoundai/api-server/api/common/utils/utils.go rename to deploy/dynemo/api-server/api/common/utils/utils.go diff --git a/deploy/compoundai/api-server/api/controllers/cluster.go b/deploy/dynemo/api-server/api/controllers/cluster.go similarity index 100% rename from deploy/compoundai/api-server/api/controllers/cluster.go rename to deploy/dynemo/api-server/api/controllers/cluster.go diff --git a/deploy/compoundai/api-server/api/controllers/common.go b/deploy/dynemo/api-server/api/controllers/common.go similarity index 100% rename from deploy/compoundai/api-server/api/controllers/common.go rename to deploy/dynemo/api-server/api/controllers/common.go diff --git a/deploy/compoundai/api-server/api/controllers/compound_component.go b/deploy/dynemo/api-server/api/controllers/compound_component.go similarity index 100% rename from deploy/compoundai/api-server/api/controllers/compound_component.go rename to deploy/dynemo/api-server/api/controllers/compound_component.go diff --git a/deploy/compoundai/api-server/api/controllers/deployment.go b/deploy/dynemo/api-server/api/controllers/deployment.go similarity index 100% rename from deploy/compoundai/api-server/api/controllers/deployment.go rename to deploy/dynemo/api-server/api/controllers/deployment.go diff --git a/deploy/compoundai/api-server/api/controllers/deployment_revision.go b/deploy/dynemo/api-server/api/controllers/deployment_revision.go similarity index 100% rename from deploy/compoundai/api-server/api/controllers/deployment_revision.go rename to deploy/dynemo/api-server/api/controllers/deployment_revision.go diff --git a/deploy/compoundai/api-server/api/controllers/health.go b/deploy/dynemo/api-server/api/controllers/health.go similarity index 100% rename from deploy/compoundai/api-server/api/controllers/health.go rename to deploy/dynemo/api-server/api/controllers/health.go diff --git a/deploy/compoundai/api-server/api/controllers/info.go b/deploy/dynemo/api-server/api/controllers/info.go similarity index 100% rename from deploy/compoundai/api-server/api/controllers/info.go rename to deploy/dynemo/api-server/api/controllers/info.go diff --git a/deploy/compoundai/api-server/api/controllers/organization.go b/deploy/dynemo/api-server/api/controllers/organization.go similarity index 100% rename from deploy/compoundai/api-server/api/controllers/organization.go rename to deploy/dynemo/api-server/api/controllers/organization.go diff --git a/deploy/compoundai/api-server/api/controllers/organization_member.go b/deploy/dynemo/api-server/api/controllers/organization_member.go similarity index 100% rename from deploy/compoundai/api-server/api/controllers/organization_member.go rename to deploy/dynemo/api-server/api/controllers/organization_member.go diff --git a/deploy/compoundai/api-server/api/controllers/proxy.go b/deploy/dynemo/api-server/api/controllers/proxy.go similarity index 100% rename from deploy/compoundai/api-server/api/controllers/proxy.go rename to deploy/dynemo/api-server/api/controllers/proxy.go diff --git a/deploy/compoundai/api-server/api/controllers/user.go b/deploy/dynemo/api-server/api/controllers/user.go similarity index 100% rename from deploy/compoundai/api-server/api/controllers/user.go rename to deploy/dynemo/api-server/api/controllers/user.go diff --git a/deploy/compoundai/api-server/api/controllers/version.go b/deploy/dynemo/api-server/api/controllers/version.go similarity index 100% rename from deploy/compoundai/api-server/api/controllers/version.go rename to deploy/dynemo/api-server/api/controllers/version.go diff --git a/deploy/compoundai/api-server/api/converters/base.go b/deploy/dynemo/api-server/api/converters/base.go similarity index 100% rename from deploy/compoundai/api-server/api/converters/base.go rename to deploy/dynemo/api-server/api/converters/base.go diff --git a/deploy/compoundai/api-server/api/converters/cluster.go b/deploy/dynemo/api-server/api/converters/cluster.go similarity index 100% rename from deploy/compoundai/api-server/api/converters/cluster.go rename to deploy/dynemo/api-server/api/converters/cluster.go diff --git a/deploy/compoundai/api-server/api/converters/compound_component.go b/deploy/dynemo/api-server/api/converters/compound_component.go similarity index 100% rename from deploy/compoundai/api-server/api/converters/compound_component.go rename to deploy/dynemo/api-server/api/converters/compound_component.go diff --git a/deploy/compoundai/api-server/api/converters/deployment.go b/deploy/dynemo/api-server/api/converters/deployment.go similarity index 100% rename from deploy/compoundai/api-server/api/converters/deployment.go rename to deploy/dynemo/api-server/api/converters/deployment.go diff --git a/deploy/compoundai/api-server/api/converters/deployment_revision.go b/deploy/dynemo/api-server/api/converters/deployment_revision.go similarity index 100% rename from deploy/compoundai/api-server/api/converters/deployment_revision.go rename to deploy/dynemo/api-server/api/converters/deployment_revision.go diff --git a/deploy/compoundai/api-server/api/converters/deployment_target.go b/deploy/dynemo/api-server/api/converters/deployment_target.go similarity index 100% rename from deploy/compoundai/api-server/api/converters/deployment_target.go rename to deploy/dynemo/api-server/api/converters/deployment_target.go diff --git a/deploy/compoundai/api-server/api/converters/resource.go b/deploy/dynemo/api-server/api/converters/resource.go similarity index 100% rename from deploy/compoundai/api-server/api/converters/resource.go rename to deploy/dynemo/api-server/api/converters/resource.go diff --git a/deploy/compoundai/api-server/api/crds/base.go b/deploy/dynemo/api-server/api/crds/base.go similarity index 100% rename from deploy/compoundai/api-server/api/crds/base.go rename to deploy/dynemo/api-server/api/crds/base.go diff --git a/deploy/compoundai/api-server/api/crds/compoundai_nim_deployment.go b/deploy/dynemo/api-server/api/crds/compoundai_nim_deployment.go similarity index 100% rename from deploy/compoundai/api-server/api/crds/compoundai_nim_deployment.go rename to deploy/dynemo/api-server/api/crds/compoundai_nim_deployment.go diff --git a/deploy/compoundai/api-server/api/crds/compoundai_nim_request.go b/deploy/dynemo/api-server/api/crds/compoundai_nim_request.go similarity index 100% rename from deploy/compoundai/api-server/api/crds/compoundai_nim_request.go rename to deploy/dynemo/api-server/api/crds/compoundai_nim_request.go diff --git a/deploy/compoundai/api-server/api/crds/consts.go b/deploy/dynemo/api-server/api/crds/consts.go similarity index 100% rename from deploy/compoundai/api-server/api/crds/consts.go rename to deploy/dynemo/api-server/api/crds/consts.go diff --git a/deploy/compoundai/api-server/api/database/database.go b/deploy/dynemo/api-server/api/database/database.go similarity index 100% rename from deploy/compoundai/api-server/api/database/database.go rename to deploy/dynemo/api-server/api/database/database.go diff --git a/deploy/compoundai/api-server/api/main.go b/deploy/dynemo/api-server/api/main.go similarity index 100% rename from deploy/compoundai/api-server/api/main.go rename to deploy/dynemo/api-server/api/main.go diff --git a/deploy/compoundai/api-server/api/mocks/mock.go b/deploy/dynemo/api-server/api/mocks/mock.go similarity index 100% rename from deploy/compoundai/api-server/api/mocks/mock.go rename to deploy/dynemo/api-server/api/mocks/mock.go diff --git a/deploy/compoundai/api-server/api/models/associate.go b/deploy/dynemo/api-server/api/models/associate.go similarity index 100% rename from deploy/compoundai/api-server/api/models/associate.go rename to deploy/dynemo/api-server/api/models/associate.go diff --git a/deploy/compoundai/api-server/api/models/base.go b/deploy/dynemo/api-server/api/models/base.go similarity index 100% rename from deploy/compoundai/api-server/api/models/base.go rename to deploy/dynemo/api-server/api/models/base.go diff --git a/deploy/compoundai/api-server/api/models/cluster.go b/deploy/dynemo/api-server/api/models/cluster.go similarity index 100% rename from deploy/compoundai/api-server/api/models/cluster.go rename to deploy/dynemo/api-server/api/models/cluster.go diff --git a/deploy/compoundai/api-server/api/models/compound_component.go b/deploy/dynemo/api-server/api/models/compound_component.go similarity index 100% rename from deploy/compoundai/api-server/api/models/compound_component.go rename to deploy/dynemo/api-server/api/models/compound_component.go diff --git a/deploy/compoundai/api-server/api/models/deployment.go b/deploy/dynemo/api-server/api/models/deployment.go similarity index 100% rename from deploy/compoundai/api-server/api/models/deployment.go rename to deploy/dynemo/api-server/api/models/deployment.go diff --git a/deploy/compoundai/api-server/api/models/deployment_option.go b/deploy/dynemo/api-server/api/models/deployment_option.go similarity index 100% rename from deploy/compoundai/api-server/api/models/deployment_option.go rename to deploy/dynemo/api-server/api/models/deployment_option.go diff --git a/deploy/compoundai/api-server/api/models/deployment_revision.go b/deploy/dynemo/api-server/api/models/deployment_revision.go similarity index 100% rename from deploy/compoundai/api-server/api/models/deployment_revision.go rename to deploy/dynemo/api-server/api/models/deployment_revision.go diff --git a/deploy/compoundai/api-server/api/models/deployment_target.go b/deploy/dynemo/api-server/api/models/deployment_target.go similarity index 100% rename from deploy/compoundai/api-server/api/models/deployment_target.go rename to deploy/dynemo/api-server/api/models/deployment_target.go diff --git a/deploy/compoundai/api-server/api/models/resource.go b/deploy/dynemo/api-server/api/models/resource.go similarity index 100% rename from deploy/compoundai/api-server/api/models/resource.go rename to deploy/dynemo/api-server/api/models/resource.go diff --git a/deploy/compoundai/api-server/api/models/visibility.go b/deploy/dynemo/api-server/api/models/visibility.go similarity index 100% rename from deploy/compoundai/api-server/api/models/visibility.go rename to deploy/dynemo/api-server/api/models/visibility.go diff --git a/deploy/compoundai/api-server/api/routes/routes.go b/deploy/dynemo/api-server/api/routes/routes.go similarity index 100% rename from deploy/compoundai/api-server/api/routes/routes.go rename to deploy/dynemo/api-server/api/routes/routes.go diff --git a/deploy/compoundai/api-server/api/runtime/runtime.go b/deploy/dynemo/api-server/api/runtime/runtime.go similarity index 100% rename from deploy/compoundai/api-server/api/runtime/runtime.go rename to deploy/dynemo/api-server/api/runtime/runtime.go diff --git a/deploy/compoundai/api-server/api/schemas/base.go b/deploy/dynemo/api-server/api/schemas/base.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/base.go rename to deploy/dynemo/api-server/api/schemas/base.go diff --git a/deploy/compoundai/api-server/api/schemas/cluster.go b/deploy/dynemo/api-server/api/schemas/cluster.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/cluster.go rename to deploy/dynemo/api-server/api/schemas/cluster.go diff --git a/deploy/compoundai/api-server/api/schemas/compound_ai.go b/deploy/dynemo/api-server/api/schemas/compound_ai.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/compound_ai.go rename to deploy/dynemo/api-server/api/schemas/compound_ai.go diff --git a/deploy/compoundai/api-server/api/schemas/compound_component.go b/deploy/dynemo/api-server/api/schemas/compound_component.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/compound_component.go rename to deploy/dynemo/api-server/api/schemas/compound_component.go diff --git a/deploy/compoundai/api-server/api/schemas/compound_nim.go b/deploy/dynemo/api-server/api/schemas/compound_nim.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/compound_nim.go rename to deploy/dynemo/api-server/api/schemas/compound_nim.go diff --git a/deploy/compoundai/api-server/api/schemas/compound_nim_version.go b/deploy/dynemo/api-server/api/schemas/compound_nim_version.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/compound_nim_version.go rename to deploy/dynemo/api-server/api/schemas/compound_nim_version.go diff --git a/deploy/compoundai/api-server/api/schemas/deployment.go b/deploy/dynemo/api-server/api/schemas/deployment.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/deployment.go rename to deploy/dynemo/api-server/api/schemas/deployment.go diff --git a/deploy/compoundai/api-server/api/schemas/deployment_revision.go b/deploy/dynemo/api-server/api/schemas/deployment_revision.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/deployment_revision.go rename to deploy/dynemo/api-server/api/schemas/deployment_revision.go diff --git a/deploy/compoundai/api-server/api/schemas/deployment_revision_status.go b/deploy/dynemo/api-server/api/schemas/deployment_revision_status.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/deployment_revision_status.go rename to deploy/dynemo/api-server/api/schemas/deployment_revision_status.go diff --git a/deploy/compoundai/api-server/api/schemas/deployment_status.go b/deploy/dynemo/api-server/api/schemas/deployment_status.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/deployment_status.go rename to deploy/dynemo/api-server/api/schemas/deployment_status.go diff --git a/deploy/compoundai/api-server/api/schemas/deployment_target.go b/deploy/dynemo/api-server/api/schemas/deployment_target.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/deployment_target.go rename to deploy/dynemo/api-server/api/schemas/deployment_target.go diff --git a/deploy/compoundai/api-server/api/schemas/event.go b/deploy/dynemo/api-server/api/schemas/event.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/event.go rename to deploy/dynemo/api-server/api/schemas/event.go diff --git a/deploy/compoundai/api-server/api/schemas/external_service.go b/deploy/dynemo/api-server/api/schemas/external_service.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/external_service.go rename to deploy/dynemo/api-server/api/schemas/external_service.go diff --git a/deploy/compoundai/api-server/api/schemas/label.go b/deploy/dynemo/api-server/api/schemas/label.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/label.go rename to deploy/dynemo/api-server/api/schemas/label.go diff --git a/deploy/compoundai/api-server/api/schemas/list.go b/deploy/dynemo/api-server/api/schemas/list.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/list.go rename to deploy/dynemo/api-server/api/schemas/list.go diff --git a/deploy/compoundai/api-server/api/schemas/organization.go b/deploy/dynemo/api-server/api/schemas/organization.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/organization.go rename to deploy/dynemo/api-server/api/schemas/organization.go diff --git a/deploy/compoundai/api-server/api/schemas/organization_member.go b/deploy/dynemo/api-server/api/schemas/organization_member.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/organization_member.go rename to deploy/dynemo/api-server/api/schemas/organization_member.go diff --git a/deploy/compoundai/api-server/api/schemas/ownership.go b/deploy/dynemo/api-server/api/schemas/ownership.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/ownership.go rename to deploy/dynemo/api-server/api/schemas/ownership.go diff --git a/deploy/compoundai/api-server/api/schemas/resource.go b/deploy/dynemo/api-server/api/schemas/resource.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/resource.go rename to deploy/dynemo/api-server/api/schemas/resource.go diff --git a/deploy/compoundai/api-server/api/schemas/resource_type.go b/deploy/dynemo/api-server/api/schemas/resource_type.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/resource_type.go rename to deploy/dynemo/api-server/api/schemas/resource_type.go diff --git a/deploy/compoundai/api-server/api/schemas/user.go b/deploy/dynemo/api-server/api/schemas/user.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/user.go rename to deploy/dynemo/api-server/api/schemas/user.go diff --git a/deploy/compoundai/api-server/api/schemas/version.go b/deploy/dynemo/api-server/api/schemas/version.go similarity index 100% rename from deploy/compoundai/api-server/api/schemas/version.go rename to deploy/dynemo/api-server/api/schemas/version.go diff --git a/deploy/compoundai/api-server/api/schemasv2/cluster.go b/deploy/dynemo/api-server/api/schemasv2/cluster.go similarity index 100% rename from deploy/compoundai/api-server/api/schemasv2/cluster.go rename to deploy/dynemo/api-server/api/schemasv2/cluster.go diff --git a/deploy/compoundai/api-server/api/schemasv2/deployment.go b/deploy/dynemo/api-server/api/schemasv2/deployment.go similarity index 100% rename from deploy/compoundai/api-server/api/schemasv2/deployment.go rename to deploy/dynemo/api-server/api/schemasv2/deployment.go diff --git a/deploy/compoundai/api-server/api/services/base.go b/deploy/dynemo/api-server/api/services/base.go similarity index 100% rename from deploy/compoundai/api-server/api/services/base.go rename to deploy/dynemo/api-server/api/services/base.go diff --git a/deploy/compoundai/api-server/api/services/cluster.go b/deploy/dynemo/api-server/api/services/cluster.go similarity index 100% rename from deploy/compoundai/api-server/api/services/cluster.go rename to deploy/dynemo/api-server/api/services/cluster.go diff --git a/deploy/compoundai/api-server/api/services/compoundai_component.go b/deploy/dynemo/api-server/api/services/compoundai_component.go similarity index 100% rename from deploy/compoundai/api-server/api/services/compoundai_component.go rename to deploy/dynemo/api-server/api/services/compoundai_component.go diff --git a/deploy/compoundai/api-server/api/services/datastore.go b/deploy/dynemo/api-server/api/services/datastore.go similarity index 100% rename from deploy/compoundai/api-server/api/services/datastore.go rename to deploy/dynemo/api-server/api/services/datastore.go diff --git a/deploy/compoundai/api-server/api/services/deployment.go b/deploy/dynemo/api-server/api/services/deployment.go similarity index 100% rename from deploy/compoundai/api-server/api/services/deployment.go rename to deploy/dynemo/api-server/api/services/deployment.go diff --git a/deploy/compoundai/api-server/api/services/deployment_manager.go b/deploy/dynemo/api-server/api/services/deployment_manager.go similarity index 100% rename from deploy/compoundai/api-server/api/services/deployment_manager.go rename to deploy/dynemo/api-server/api/services/deployment_manager.go diff --git a/deploy/compoundai/api-server/api/services/deployment_revision.go b/deploy/dynemo/api-server/api/services/deployment_revision.go similarity index 100% rename from deploy/compoundai/api-server/api/services/deployment_revision.go rename to deploy/dynemo/api-server/api/services/deployment_revision.go diff --git a/deploy/compoundai/api-server/api/services/deployment_target.go b/deploy/dynemo/api-server/api/services/deployment_target.go similarity index 100% rename from deploy/compoundai/api-server/api/services/deployment_target.go rename to deploy/dynemo/api-server/api/services/deployment_target.go diff --git a/deploy/compoundai/api-server/api/services/k8s.go b/deploy/dynemo/api-server/api/services/k8s.go similarity index 100% rename from deploy/compoundai/api-server/api/services/k8s.go rename to deploy/dynemo/api-server/api/services/k8s.go diff --git a/deploy/compoundai/api-server/api/services/k8s_informers.go b/deploy/dynemo/api-server/api/services/k8s_informers.go similarity index 100% rename from deploy/compoundai/api-server/api/services/k8s_informers.go rename to deploy/dynemo/api-server/api/services/k8s_informers.go diff --git a/deploy/compoundai/api-server/docker-compose.yaml b/deploy/dynemo/api-server/docker-compose.yaml similarity index 100% rename from deploy/compoundai/api-server/docker-compose.yaml rename to deploy/dynemo/api-server/docker-compose.yaml diff --git a/deploy/compoundai/api-server/docs/data_model.md b/deploy/dynemo/api-server/docs/data_model.md similarity index 100% rename from deploy/compoundai/api-server/docs/data_model.md rename to deploy/dynemo/api-server/docs/data_model.md diff --git a/deploy/compoundai/api-server/docs/k8s.md b/deploy/dynemo/api-server/docs/k8s.md similarity index 100% rename from deploy/compoundai/api-server/docs/k8s.md rename to deploy/dynemo/api-server/docs/k8s.md diff --git a/deploy/compoundai/api-server/docs/workflow.md b/deploy/dynemo/api-server/docs/workflow.md similarity index 100% rename from deploy/compoundai/api-server/docs/workflow.md rename to deploy/dynemo/api-server/docs/workflow.md diff --git a/deploy/compoundai/api-server/go.mod b/deploy/dynemo/api-server/go.mod similarity index 100% rename from deploy/compoundai/api-server/go.mod rename to deploy/dynemo/api-server/go.mod diff --git a/deploy/compoundai/api-server/go.sum b/deploy/dynemo/api-server/go.sum similarity index 100% rename from deploy/compoundai/api-server/go.sum rename to deploy/dynemo/api-server/go.sum diff --git a/deploy/compoundai/api-server/tests/integration/.env b/deploy/dynemo/api-server/tests/integration/.env similarity index 100% rename from deploy/compoundai/api-server/tests/integration/.env rename to deploy/dynemo/api-server/tests/integration/.env diff --git a/deploy/compoundai/api-server/tests/integration/api_test.go b/deploy/dynemo/api-server/tests/integration/api_test.go similarity index 100% rename from deploy/compoundai/api-server/tests/integration/api_test.go rename to deploy/dynemo/api-server/tests/integration/api_test.go diff --git a/deploy/compoundai/api-server/tests/integration/client.go b/deploy/dynemo/api-server/tests/integration/client.go similarity index 100% rename from deploy/compoundai/api-server/tests/integration/client.go rename to deploy/dynemo/api-server/tests/integration/client.go diff --git a/deploy/compoundai/api-server/tests/integration/containers.go b/deploy/dynemo/api-server/tests/integration/containers.go similarity index 100% rename from deploy/compoundai/api-server/tests/integration/containers.go rename to deploy/dynemo/api-server/tests/integration/containers.go diff --git a/deploy/compoundai/api-server/tests/integration/fixtures/dms.go b/deploy/dynemo/api-server/tests/integration/fixtures/dms.go similarity index 100% rename from deploy/compoundai/api-server/tests/integration/fixtures/dms.go rename to deploy/dynemo/api-server/tests/integration/fixtures/dms.go diff --git a/deploy/compoundai/api-server/tests/integration/fixtures/k8s.go b/deploy/dynemo/api-server/tests/integration/fixtures/k8s.go similarity index 100% rename from deploy/compoundai/api-server/tests/integration/fixtures/k8s.go rename to deploy/dynemo/api-server/tests/integration/fixtures/k8s.go diff --git a/deploy/compoundai/api-server/tests/integration/fixtures/nds.go b/deploy/dynemo/api-server/tests/integration/fixtures/nds.go similarity index 100% rename from deploy/compoundai/api-server/tests/integration/fixtures/nds.go rename to deploy/dynemo/api-server/tests/integration/fixtures/nds.go diff --git a/deploy/compoundai/api-server/tests/integration/fixtures/schemas.go b/deploy/dynemo/api-server/tests/integration/fixtures/schemas.go similarity index 100% rename from deploy/compoundai/api-server/tests/integration/fixtures/schemas.go rename to deploy/dynemo/api-server/tests/integration/fixtures/schemas.go diff --git a/deploy/compoundai/api-server/tests/integration/fixtures/schemasv2.go b/deploy/dynemo/api-server/tests/integration/fixtures/schemasv2.go similarity index 100% rename from deploy/compoundai/api-server/tests/integration/fixtures/schemasv2.go rename to deploy/dynemo/api-server/tests/integration/fixtures/schemasv2.go diff --git a/deploy/compoundai/operator/.dockerignore b/deploy/dynemo/operator/.dockerignore similarity index 100% rename from deploy/compoundai/operator/.dockerignore rename to deploy/dynemo/operator/.dockerignore diff --git a/deploy/compoundai/operator/.gitignore b/deploy/dynemo/operator/.gitignore similarity index 100% rename from deploy/compoundai/operator/.gitignore rename to deploy/dynemo/operator/.gitignore diff --git a/deploy/compoundai/operator/.golangci.yml b/deploy/dynemo/operator/.golangci.yml similarity index 100% rename from deploy/compoundai/operator/.golangci.yml rename to deploy/dynemo/operator/.golangci.yml diff --git a/deploy/compoundai/operator/Earthfile b/deploy/dynemo/operator/Earthfile similarity index 100% rename from deploy/compoundai/operator/Earthfile rename to deploy/dynemo/operator/Earthfile diff --git a/deploy/compoundai/operator/LICENSE.txt b/deploy/dynemo/operator/LICENSE.txt similarity index 100% rename from deploy/compoundai/operator/LICENSE.txt rename to deploy/dynemo/operator/LICENSE.txt diff --git a/deploy/compoundai/operator/Makefile b/deploy/dynemo/operator/Makefile similarity index 100% rename from deploy/compoundai/operator/Makefile rename to deploy/dynemo/operator/Makefile diff --git a/deploy/compoundai/operator/PROJECT b/deploy/dynemo/operator/PROJECT similarity index 100% rename from deploy/compoundai/operator/PROJECT rename to deploy/dynemo/operator/PROJECT diff --git a/deploy/compoundai/operator/README.md b/deploy/dynemo/operator/README.md similarity index 100% rename from deploy/compoundai/operator/README.md rename to deploy/dynemo/operator/README.md diff --git a/deploy/compoundai/operator/api/compoundai/README.md b/deploy/dynemo/operator/api/compoundai/README.md similarity index 100% rename from deploy/compoundai/operator/api/compoundai/README.md rename to deploy/dynemo/operator/api/compoundai/README.md diff --git a/deploy/compoundai/operator/api/compoundai/common/common.go b/deploy/dynemo/operator/api/compoundai/common/common.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/common/common.go rename to deploy/dynemo/operator/api/compoundai/common/common.go diff --git a/deploy/compoundai/operator/api/compoundai/common/zz_generated.deepcopy.go b/deploy/dynemo/operator/api/compoundai/common/zz_generated.deepcopy.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/common/zz_generated.deepcopy.go rename to deploy/dynemo/operator/api/compoundai/common/zz_generated.deepcopy.go diff --git a/deploy/compoundai/operator/api/compoundai/conversion/conversion.go b/deploy/dynemo/operator/api/compoundai/conversion/conversion.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/conversion/conversion.go rename to deploy/dynemo/operator/api/compoundai/conversion/conversion.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/api_token.go b/deploy/dynemo/operator/api/compoundai/modelschemas/api_token.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/api_token.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/api_token.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/bento.go b/deploy/dynemo/operator/api/compoundai/modelschemas/bento.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/bento.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/bento.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/cluster.go b/deploy/dynemo/operator/api/compoundai/modelschemas/cluster.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/cluster.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/cluster.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/deployment.go b/deploy/dynemo/operator/api/compoundai/modelschemas/deployment.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/deployment.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/deployment.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/deployment_revision.go b/deploy/dynemo/operator/api/compoundai/modelschemas/deployment_revision.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/deployment_revision.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/deployment_revision.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/deployment_snapshot_canary_rule.go b/deploy/dynemo/operator/api/compoundai/modelschemas/deployment_snapshot_canary_rule.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/deployment_snapshot_canary_rule.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/deployment_snapshot_canary_rule.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/deployment_target.go b/deploy/dynemo/operator/api/compoundai/modelschemas/deployment_target.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/deployment_target.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/deployment_target.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/docker_registry.go b/deploy/dynemo/operator/api/compoundai/modelschemas/docker_registry.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/docker_registry.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/docker_registry.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/event.go b/deploy/dynemo/operator/api/compoundai/modelschemas/event.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/event.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/event.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/kube_pod.go b/deploy/dynemo/operator/api/compoundai/modelschemas/kube_pod.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/kube_pod.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/kube_pod.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/label.go b/deploy/dynemo/operator/api/compoundai/modelschemas/label.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/label.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/label.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/member.go b/deploy/dynemo/operator/api/compoundai/modelschemas/member.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/member.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/member.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/model.go b/deploy/dynemo/operator/api/compoundai/modelschemas/model.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/model.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/model.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/organization.go b/deploy/dynemo/operator/api/compoundai/modelschemas/organization.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/organization.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/organization.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/resource.go b/deploy/dynemo/operator/api/compoundai/modelschemas/resource.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/resource.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/resource.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/resource_instance.go b/deploy/dynemo/operator/api/compoundai/modelschemas/resource_instance.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/resource_instance.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/resource_instance.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/tag.go b/deploy/dynemo/operator/api/compoundai/modelschemas/tag.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/tag.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/tag.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/terminal_record.go b/deploy/dynemo/operator/api/compoundai/modelschemas/terminal_record.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/terminal_record.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/terminal_record.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/user.go b/deploy/dynemo/operator/api/compoundai/modelschemas/user.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/user.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/user.go diff --git a/deploy/compoundai/operator/api/compoundai/modelschemas/yatai_component.go b/deploy/dynemo/operator/api/compoundai/modelschemas/yatai_component.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/modelschemas/yatai_component.go rename to deploy/dynemo/operator/api/compoundai/modelschemas/yatai_component.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/api_token.go b/deploy/dynemo/operator/api/compoundai/schemasv1/api_token.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/api_token.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/api_token.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/base.go b/deploy/dynemo/operator/api/compoundai/schemasv1/base.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/base.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/base.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/bento.go b/deploy/dynemo/operator/api/compoundai/schemasv1/bento.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/bento.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/bento.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/bento_repository.go b/deploy/dynemo/operator/api/compoundai/schemasv1/bento_repository.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/bento_repository.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/bento_repository.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/cluster.go b/deploy/dynemo/operator/api/compoundai/schemasv1/cluster.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/cluster.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/cluster.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/cluster_member.go b/deploy/dynemo/operator/api/compoundai/schemasv1/cluster_member.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/cluster_member.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/cluster_member.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/deployment.go b/deploy/dynemo/operator/api/compoundai/schemasv1/deployment.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/deployment.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/deployment.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/deployment_revision.go b/deploy/dynemo/operator/api/compoundai/schemasv1/deployment_revision.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/deployment_revision.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/deployment_revision.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/deployment_target.go b/deploy/dynemo/operator/api/compoundai/schemasv1/deployment_target.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/deployment_target.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/deployment_target.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/event.go b/deploy/dynemo/operator/api/compoundai/schemasv1/event.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/event.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/event.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/kube_pod.go b/deploy/dynemo/operator/api/compoundai/schemasv1/kube_pod.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/kube_pod.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/kube_pod.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/kube_resource.go b/deploy/dynemo/operator/api/compoundai/schemasv1/kube_resource.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/kube_resource.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/kube_resource.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/label.go b/deploy/dynemo/operator/api/compoundai/schemasv1/label.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/label.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/label.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/list.go b/deploy/dynemo/operator/api/compoundai/schemasv1/list.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/list.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/list.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/member.go b/deploy/dynemo/operator/api/compoundai/schemasv1/member.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/member.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/member.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/model.go b/deploy/dynemo/operator/api/compoundai/schemasv1/model.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/model.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/model.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/model_repository.go b/deploy/dynemo/operator/api/compoundai/schemasv1/model_repository.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/model_repository.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/model_repository.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/msg.go b/deploy/dynemo/operator/api/compoundai/schemasv1/msg.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/msg.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/msg.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/organization.go b/deploy/dynemo/operator/api/compoundai/schemasv1/organization.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/organization.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/organization.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/organization_member.go b/deploy/dynemo/operator/api/compoundai/schemasv1/organization_member.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/organization_member.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/organization_member.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/q.go b/deploy/dynemo/operator/api/compoundai/schemasv1/q.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/q.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/q.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/resource.go b/deploy/dynemo/operator/api/compoundai/schemasv1/resource.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/resource.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/resource.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/subscription.go b/deploy/dynemo/operator/api/compoundai/schemasv1/subscription.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/subscription.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/subscription.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/terminal_record.go b/deploy/dynemo/operator/api/compoundai/schemasv1/terminal_record.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/terminal_record.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/terminal_record.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/upload.go b/deploy/dynemo/operator/api/compoundai/schemasv1/upload.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/upload.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/upload.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/user.go b/deploy/dynemo/operator/api/compoundai/schemasv1/user.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/user.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/user.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/version.go b/deploy/dynemo/operator/api/compoundai/schemasv1/version.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/version.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/version.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/websocket.go b/deploy/dynemo/operator/api/compoundai/schemasv1/websocket.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/websocket.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/websocket.go diff --git a/deploy/compoundai/operator/api/compoundai/schemasv1/yatai_component.go b/deploy/dynemo/operator/api/compoundai/schemasv1/yatai_component.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/schemasv1/yatai_component.go rename to deploy/dynemo/operator/api/compoundai/schemasv1/yatai_component.go diff --git a/deploy/compoundai/operator/api/compoundai/yatai-client/client.go b/deploy/dynemo/operator/api/compoundai/yatai-client/client.go similarity index 100% rename from deploy/compoundai/operator/api/compoundai/yatai-client/client.go rename to deploy/dynemo/operator/api/compoundai/yatai-client/client.go diff --git a/deploy/compoundai/operator/api/v1alpha1/common.go b/deploy/dynemo/operator/api/v1alpha1/common.go similarity index 100% rename from deploy/compoundai/operator/api/v1alpha1/common.go rename to deploy/dynemo/operator/api/v1alpha1/common.go diff --git a/deploy/compoundai/operator/api/v1alpha1/compoundaideployment_types.go b/deploy/dynemo/operator/api/v1alpha1/compoundaideployment_types.go similarity index 100% rename from deploy/compoundai/operator/api/v1alpha1/compoundaideployment_types.go rename to deploy/dynemo/operator/api/v1alpha1/compoundaideployment_types.go diff --git a/deploy/compoundai/operator/api/v1alpha1/compoundainim_types.go b/deploy/dynemo/operator/api/v1alpha1/compoundainim_types.go similarity index 100% rename from deploy/compoundai/operator/api/v1alpha1/compoundainim_types.go rename to deploy/dynemo/operator/api/v1alpha1/compoundainim_types.go diff --git a/deploy/compoundai/operator/api/v1alpha1/compoundainimdeployment_types.go b/deploy/dynemo/operator/api/v1alpha1/compoundainimdeployment_types.go similarity index 100% rename from deploy/compoundai/operator/api/v1alpha1/compoundainimdeployment_types.go rename to deploy/dynemo/operator/api/v1alpha1/compoundainimdeployment_types.go diff --git a/deploy/compoundai/operator/api/v1alpha1/compoundainimrequest_types.go b/deploy/dynemo/operator/api/v1alpha1/compoundainimrequest_types.go similarity index 100% rename from deploy/compoundai/operator/api/v1alpha1/compoundainimrequest_types.go rename to deploy/dynemo/operator/api/v1alpha1/compoundainimrequest_types.go diff --git a/deploy/compoundai/operator/api/v1alpha1/groupversion_info.go b/deploy/dynemo/operator/api/v1alpha1/groupversion_info.go similarity index 100% rename from deploy/compoundai/operator/api/v1alpha1/groupversion_info.go rename to deploy/dynemo/operator/api/v1alpha1/groupversion_info.go diff --git a/deploy/compoundai/operator/api/v1alpha1/shared.go b/deploy/dynemo/operator/api/v1alpha1/shared.go similarity index 100% rename from deploy/compoundai/operator/api/v1alpha1/shared.go rename to deploy/dynemo/operator/api/v1alpha1/shared.go diff --git a/deploy/compoundai/operator/api/v1alpha1/zz_generated.deepcopy.go b/deploy/dynemo/operator/api/v1alpha1/zz_generated.deepcopy.go similarity index 100% rename from deploy/compoundai/operator/api/v1alpha1/zz_generated.deepcopy.go rename to deploy/dynemo/operator/api/v1alpha1/zz_generated.deepcopy.go diff --git a/deploy/compoundai/operator/cmd/main.go b/deploy/dynemo/operator/cmd/main.go similarity index 100% rename from deploy/compoundai/operator/cmd/main.go rename to deploy/dynemo/operator/cmd/main.go diff --git a/deploy/compoundai/operator/config/crd/bases/nvidia.com_compoundaideployments.yaml b/deploy/dynemo/operator/config/crd/bases/nvidia.com_compoundaideployments.yaml similarity index 100% rename from deploy/compoundai/operator/config/crd/bases/nvidia.com_compoundaideployments.yaml rename to deploy/dynemo/operator/config/crd/bases/nvidia.com_compoundaideployments.yaml diff --git a/deploy/compoundai/operator/config/crd/bases/nvidia.com_compoundainimdeployments.yaml b/deploy/dynemo/operator/config/crd/bases/nvidia.com_compoundainimdeployments.yaml similarity index 100% rename from deploy/compoundai/operator/config/crd/bases/nvidia.com_compoundainimdeployments.yaml rename to deploy/dynemo/operator/config/crd/bases/nvidia.com_compoundainimdeployments.yaml diff --git a/deploy/compoundai/operator/config/crd/bases/nvidia.com_compoundainimrequests.yaml b/deploy/dynemo/operator/config/crd/bases/nvidia.com_compoundainimrequests.yaml similarity index 100% rename from deploy/compoundai/operator/config/crd/bases/nvidia.com_compoundainimrequests.yaml rename to deploy/dynemo/operator/config/crd/bases/nvidia.com_compoundainimrequests.yaml diff --git a/deploy/compoundai/operator/config/crd/bases/nvidia.com_compoundainims.yaml b/deploy/dynemo/operator/config/crd/bases/nvidia.com_compoundainims.yaml similarity index 100% rename from deploy/compoundai/operator/config/crd/bases/nvidia.com_compoundainims.yaml rename to deploy/dynemo/operator/config/crd/bases/nvidia.com_compoundainims.yaml diff --git a/deploy/compoundai/operator/config/crd/kustomization.yaml b/deploy/dynemo/operator/config/crd/kustomization.yaml similarity index 100% rename from deploy/compoundai/operator/config/crd/kustomization.yaml rename to deploy/dynemo/operator/config/crd/kustomization.yaml diff --git a/deploy/compoundai/operator/config/crd/kustomizeconfig.yaml b/deploy/dynemo/operator/config/crd/kustomizeconfig.yaml similarity index 100% rename from deploy/compoundai/operator/config/crd/kustomizeconfig.yaml rename to deploy/dynemo/operator/config/crd/kustomizeconfig.yaml diff --git a/deploy/compoundai/operator/config/default/kustomization.yaml b/deploy/dynemo/operator/config/default/kustomization.yaml similarity index 100% rename from deploy/compoundai/operator/config/default/kustomization.yaml rename to deploy/dynemo/operator/config/default/kustomization.yaml diff --git a/deploy/compoundai/operator/config/default/manager_auth_proxy_patch.yaml b/deploy/dynemo/operator/config/default/manager_auth_proxy_patch.yaml similarity index 100% rename from deploy/compoundai/operator/config/default/manager_auth_proxy_patch.yaml rename to deploy/dynemo/operator/config/default/manager_auth_proxy_patch.yaml diff --git a/deploy/compoundai/operator/config/manager/kustomization.yaml b/deploy/dynemo/operator/config/manager/kustomization.yaml similarity index 100% rename from deploy/compoundai/operator/config/manager/kustomization.yaml rename to deploy/dynemo/operator/config/manager/kustomization.yaml diff --git a/deploy/compoundai/operator/config/manager/manager.yaml b/deploy/dynemo/operator/config/manager/manager.yaml similarity index 100% rename from deploy/compoundai/operator/config/manager/manager.yaml rename to deploy/dynemo/operator/config/manager/manager.yaml diff --git a/deploy/compoundai/operator/config/prometheus/kustomization.yaml b/deploy/dynemo/operator/config/prometheus/kustomization.yaml similarity index 100% rename from deploy/compoundai/operator/config/prometheus/kustomization.yaml rename to deploy/dynemo/operator/config/prometheus/kustomization.yaml diff --git a/deploy/compoundai/operator/config/prometheus/monitor.yaml b/deploy/dynemo/operator/config/prometheus/monitor.yaml similarity index 100% rename from deploy/compoundai/operator/config/prometheus/monitor.yaml rename to deploy/dynemo/operator/config/prometheus/monitor.yaml diff --git a/deploy/compoundai/operator/config/rbac/auth_proxy_client_clusterrole.yaml b/deploy/dynemo/operator/config/rbac/auth_proxy_client_clusterrole.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/auth_proxy_client_clusterrole.yaml rename to deploy/dynemo/operator/config/rbac/auth_proxy_client_clusterrole.yaml diff --git a/deploy/compoundai/operator/config/rbac/auth_proxy_role.yaml b/deploy/dynemo/operator/config/rbac/auth_proxy_role.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/auth_proxy_role.yaml rename to deploy/dynemo/operator/config/rbac/auth_proxy_role.yaml diff --git a/deploy/compoundai/operator/config/rbac/auth_proxy_role_binding.yaml b/deploy/dynemo/operator/config/rbac/auth_proxy_role_binding.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/auth_proxy_role_binding.yaml rename to deploy/dynemo/operator/config/rbac/auth_proxy_role_binding.yaml diff --git a/deploy/compoundai/operator/config/rbac/auth_proxy_service.yaml b/deploy/dynemo/operator/config/rbac/auth_proxy_service.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/auth_proxy_service.yaml rename to deploy/dynemo/operator/config/rbac/auth_proxy_service.yaml diff --git a/deploy/compoundai/operator/config/rbac/compoundainim_editor_role.yaml b/deploy/dynemo/operator/config/rbac/compoundainim_editor_role.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/compoundainim_editor_role.yaml rename to deploy/dynemo/operator/config/rbac/compoundainim_editor_role.yaml diff --git a/deploy/compoundai/operator/config/rbac/compoundainim_viewer_role.yaml b/deploy/dynemo/operator/config/rbac/compoundainim_viewer_role.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/compoundainim_viewer_role.yaml rename to deploy/dynemo/operator/config/rbac/compoundainim_viewer_role.yaml diff --git a/deploy/compoundai/operator/config/rbac/compoundainimdeployment_editor_role.yaml b/deploy/dynemo/operator/config/rbac/compoundainimdeployment_editor_role.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/compoundainimdeployment_editor_role.yaml rename to deploy/dynemo/operator/config/rbac/compoundainimdeployment_editor_role.yaml diff --git a/deploy/compoundai/operator/config/rbac/compoundainimdeployment_viewer_role.yaml b/deploy/dynemo/operator/config/rbac/compoundainimdeployment_viewer_role.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/compoundainimdeployment_viewer_role.yaml rename to deploy/dynemo/operator/config/rbac/compoundainimdeployment_viewer_role.yaml diff --git a/deploy/compoundai/operator/config/rbac/compoundainimrequest_editor_role.yaml b/deploy/dynemo/operator/config/rbac/compoundainimrequest_editor_role.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/compoundainimrequest_editor_role.yaml rename to deploy/dynemo/operator/config/rbac/compoundainimrequest_editor_role.yaml diff --git a/deploy/compoundai/operator/config/rbac/compoundainimrequest_viewer_role.yaml b/deploy/dynemo/operator/config/rbac/compoundainimrequest_viewer_role.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/compoundainimrequest_viewer_role.yaml rename to deploy/dynemo/operator/config/rbac/compoundainimrequest_viewer_role.yaml diff --git a/deploy/compoundai/operator/config/rbac/kustomization.yaml b/deploy/dynemo/operator/config/rbac/kustomization.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/kustomization.yaml rename to deploy/dynemo/operator/config/rbac/kustomization.yaml diff --git a/deploy/compoundai/operator/config/rbac/leader_election_role.yaml b/deploy/dynemo/operator/config/rbac/leader_election_role.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/leader_election_role.yaml rename to deploy/dynemo/operator/config/rbac/leader_election_role.yaml diff --git a/deploy/compoundai/operator/config/rbac/leader_election_role_binding.yaml b/deploy/dynemo/operator/config/rbac/leader_election_role_binding.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/leader_election_role_binding.yaml rename to deploy/dynemo/operator/config/rbac/leader_election_role_binding.yaml diff --git a/deploy/compoundai/operator/config/rbac/role.yaml b/deploy/dynemo/operator/config/rbac/role.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/role.yaml rename to deploy/dynemo/operator/config/rbac/role.yaml diff --git a/deploy/compoundai/operator/config/rbac/role_binding.yaml b/deploy/dynemo/operator/config/rbac/role_binding.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/role_binding.yaml rename to deploy/dynemo/operator/config/rbac/role_binding.yaml diff --git a/deploy/compoundai/operator/config/rbac/service_account.yaml b/deploy/dynemo/operator/config/rbac/service_account.yaml similarity index 100% rename from deploy/compoundai/operator/config/rbac/service_account.yaml rename to deploy/dynemo/operator/config/rbac/service_account.yaml diff --git a/deploy/compoundai/operator/config/samples/kustomization.yaml b/deploy/dynemo/operator/config/samples/kustomization.yaml similarity index 100% rename from deploy/compoundai/operator/config/samples/kustomization.yaml rename to deploy/dynemo/operator/config/samples/kustomization.yaml diff --git a/deploy/compoundai/operator/config/samples/nvidia.com_v1alpha1_compoundaideployment.yaml b/deploy/dynemo/operator/config/samples/nvidia.com_v1alpha1_compoundaideployment.yaml similarity index 100% rename from deploy/compoundai/operator/config/samples/nvidia.com_v1alpha1_compoundaideployment.yaml rename to deploy/dynemo/operator/config/samples/nvidia.com_v1alpha1_compoundaideployment.yaml diff --git a/deploy/compoundai/operator/config/samples/nvidia.com_v1alpha1_compoundainim.yaml b/deploy/dynemo/operator/config/samples/nvidia.com_v1alpha1_compoundainim.yaml similarity index 100% rename from deploy/compoundai/operator/config/samples/nvidia.com_v1alpha1_compoundainim.yaml rename to deploy/dynemo/operator/config/samples/nvidia.com_v1alpha1_compoundainim.yaml diff --git a/deploy/compoundai/operator/config/samples/nvidia.com_v1alpha1_compoundainimdeployment.yaml b/deploy/dynemo/operator/config/samples/nvidia.com_v1alpha1_compoundainimdeployment.yaml similarity index 100% rename from deploy/compoundai/operator/config/samples/nvidia.com_v1alpha1_compoundainimdeployment.yaml rename to deploy/dynemo/operator/config/samples/nvidia.com_v1alpha1_compoundainimdeployment.yaml diff --git a/deploy/compoundai/operator/config/samples/nvidia.com_v1alpha1_compoundainimrequest.yaml b/deploy/dynemo/operator/config/samples/nvidia.com_v1alpha1_compoundainimrequest.yaml similarity index 100% rename from deploy/compoundai/operator/config/samples/nvidia.com_v1alpha1_compoundainimrequest.yaml rename to deploy/dynemo/operator/config/samples/nvidia.com_v1alpha1_compoundainimrequest.yaml diff --git a/deploy/compoundai/operator/go.mod b/deploy/dynemo/operator/go.mod similarity index 100% rename from deploy/compoundai/operator/go.mod rename to deploy/dynemo/operator/go.mod diff --git a/deploy/compoundai/operator/go.sum b/deploy/dynemo/operator/go.sum similarity index 100% rename from deploy/compoundai/operator/go.sum rename to deploy/dynemo/operator/go.sum diff --git a/deploy/compoundai/operator/hack/boilerplate.go.txt_ b/deploy/dynemo/operator/hack/boilerplate.go.txt_ similarity index 100% rename from deploy/compoundai/operator/hack/boilerplate.go.txt_ rename to deploy/dynemo/operator/hack/boilerplate.go.txt_ diff --git a/deploy/compoundai/operator/internal/archive/tar.go b/deploy/dynemo/operator/internal/archive/tar.go similarity index 100% rename from deploy/compoundai/operator/internal/archive/tar.go rename to deploy/dynemo/operator/internal/archive/tar.go diff --git a/deploy/compoundai/operator/internal/archive/tar_test.go b/deploy/dynemo/operator/internal/archive/tar_test.go similarity index 100% rename from deploy/compoundai/operator/internal/archive/tar_test.go rename to deploy/dynemo/operator/internal/archive/tar_test.go diff --git a/deploy/compoundai/operator/internal/archive/test.tar b/deploy/dynemo/operator/internal/archive/test.tar similarity index 100% rename from deploy/compoundai/operator/internal/archive/test.tar rename to deploy/dynemo/operator/internal/archive/test.tar diff --git a/deploy/compoundai/operator/internal/archive/test2.tar b/deploy/dynemo/operator/internal/archive/test2.tar similarity index 100% rename from deploy/compoundai/operator/internal/archive/test2.tar rename to deploy/dynemo/operator/internal/archive/test2.tar diff --git a/deploy/compoundai/operator/internal/controller/common.go b/deploy/dynemo/operator/internal/controller/common.go similarity index 100% rename from deploy/compoundai/operator/internal/controller/common.go rename to deploy/dynemo/operator/internal/controller/common.go diff --git a/deploy/compoundai/operator/internal/controller/compoundaideployment_controller.go b/deploy/dynemo/operator/internal/controller/compoundaideployment_controller.go similarity index 100% rename from deploy/compoundai/operator/internal/controller/compoundaideployment_controller.go rename to deploy/dynemo/operator/internal/controller/compoundaideployment_controller.go diff --git a/deploy/compoundai/operator/internal/controller/compoundainimdeployment_controller.go b/deploy/dynemo/operator/internal/controller/compoundainimdeployment_controller.go similarity index 100% rename from deploy/compoundai/operator/internal/controller/compoundainimdeployment_controller.go rename to deploy/dynemo/operator/internal/controller/compoundainimdeployment_controller.go diff --git a/deploy/compoundai/operator/internal/controller/compoundainimrequest_controller.go b/deploy/dynemo/operator/internal/controller/compoundainimrequest_controller.go similarity index 100% rename from deploy/compoundai/operator/internal/controller/compoundainimrequest_controller.go rename to deploy/dynemo/operator/internal/controller/compoundainimrequest_controller.go diff --git a/deploy/compoundai/operator/internal/controller/suite_test.go b/deploy/dynemo/operator/internal/controller/suite_test.go similarity index 100% rename from deploy/compoundai/operator/internal/controller/suite_test.go rename to deploy/dynemo/operator/internal/controller/suite_test.go diff --git a/deploy/compoundai/operator/internal/controller/testing/prometheus/prometheusrule.yaml b/deploy/dynemo/operator/internal/controller/testing/prometheus/prometheusrule.yaml similarity index 100% rename from deploy/compoundai/operator/internal/controller/testing/prometheus/prometheusrule.yaml rename to deploy/dynemo/operator/internal/controller/testing/prometheus/prometheusrule.yaml diff --git a/deploy/compoundai/operator/internal/controller/testing/prometheus/servicemonitor.yaml b/deploy/dynemo/operator/internal/controller/testing/prometheus/servicemonitor.yaml similarity index 100% rename from deploy/compoundai/operator/internal/controller/testing/prometheus/servicemonitor.yaml rename to deploy/dynemo/operator/internal/controller/testing/prometheus/servicemonitor.yaml diff --git a/deploy/compoundai/operator/internal/controller_common/predicate.go b/deploy/dynemo/operator/internal/controller_common/predicate.go similarity index 100% rename from deploy/compoundai/operator/internal/controller_common/predicate.go rename to deploy/dynemo/operator/internal/controller_common/predicate.go diff --git a/deploy/compoundai/operator/internal/controller_common/resource.go b/deploy/dynemo/operator/internal/controller_common/resource.go similarity index 100% rename from deploy/compoundai/operator/internal/controller_common/resource.go rename to deploy/dynemo/operator/internal/controller_common/resource.go diff --git a/deploy/compoundai/operator/internal/controller_common/resource_test.go b/deploy/dynemo/operator/internal/controller_common/resource_test.go similarity index 100% rename from deploy/compoundai/operator/internal/controller_common/resource_test.go rename to deploy/dynemo/operator/internal/controller_common/resource_test.go diff --git a/deploy/compoundai/operator/internal/envoy/envoy.go b/deploy/dynemo/operator/internal/envoy/envoy.go similarity index 100% rename from deploy/compoundai/operator/internal/envoy/envoy.go rename to deploy/dynemo/operator/internal/envoy/envoy.go diff --git a/deploy/compoundai/operator/internal/nim/nim.go b/deploy/dynemo/operator/internal/nim/nim.go similarity index 100% rename from deploy/compoundai/operator/internal/nim/nim.go rename to deploy/dynemo/operator/internal/nim/nim.go diff --git a/deploy/compoundai/operator/internal/nim/nim_test.go b/deploy/dynemo/operator/internal/nim/nim_test.go similarity index 100% rename from deploy/compoundai/operator/internal/nim/nim_test.go rename to deploy/dynemo/operator/internal/nim/nim_test.go diff --git a/deploy/compoundai/operator/pkg/compoundai/README.md b/deploy/dynemo/operator/pkg/compoundai/README.md similarity index 100% rename from deploy/compoundai/operator/pkg/compoundai/README.md rename to deploy/dynemo/operator/pkg/compoundai/README.md diff --git a/deploy/compoundai/operator/pkg/compoundai/config/config.go b/deploy/dynemo/operator/pkg/compoundai/config/config.go similarity index 100% rename from deploy/compoundai/operator/pkg/compoundai/config/config.go rename to deploy/dynemo/operator/pkg/compoundai/config/config.go diff --git a/deploy/compoundai/operator/pkg/compoundai/consts/consts.go b/deploy/dynemo/operator/pkg/compoundai/consts/consts.go similarity index 100% rename from deploy/compoundai/operator/pkg/compoundai/consts/consts.go rename to deploy/dynemo/operator/pkg/compoundai/consts/consts.go diff --git a/deploy/compoundai/operator/pkg/compoundai/consts/env.go b/deploy/dynemo/operator/pkg/compoundai/consts/env.go similarity index 100% rename from deploy/compoundai/operator/pkg/compoundai/consts/env.go rename to deploy/dynemo/operator/pkg/compoundai/consts/env.go diff --git a/deploy/compoundai/operator/pkg/compoundai/consts/kube.go b/deploy/dynemo/operator/pkg/compoundai/consts/kube.go similarity index 100% rename from deploy/compoundai/operator/pkg/compoundai/consts/kube.go rename to deploy/dynemo/operator/pkg/compoundai/consts/kube.go diff --git a/deploy/compoundai/operator/pkg/compoundai/reqcli/http.go b/deploy/dynemo/operator/pkg/compoundai/reqcli/http.go similarity index 100% rename from deploy/compoundai/operator/pkg/compoundai/reqcli/http.go rename to deploy/dynemo/operator/pkg/compoundai/reqcli/http.go diff --git a/deploy/compoundai/operator/pkg/compoundai/system/env.go b/deploy/dynemo/operator/pkg/compoundai/system/env.go similarity index 100% rename from deploy/compoundai/operator/pkg/compoundai/system/env.go rename to deploy/dynemo/operator/pkg/compoundai/system/env.go diff --git a/deploy/compoundai/operator/pkg/compoundai/system/ingress.go b/deploy/dynemo/operator/pkg/compoundai/system/ingress.go similarity index 100% rename from deploy/compoundai/operator/pkg/compoundai/system/ingress.go rename to deploy/dynemo/operator/pkg/compoundai/system/ingress.go diff --git a/deploy/compoundai/operator/pkg/compoundai/system/network.go b/deploy/dynemo/operator/pkg/compoundai/system/network.go similarity index 100% rename from deploy/compoundai/operator/pkg/compoundai/system/network.go rename to deploy/dynemo/operator/pkg/compoundai/system/network.go diff --git a/deploy/compoundai/operator/pkg/compoundai/utils/url.go b/deploy/dynemo/operator/pkg/compoundai/utils/url.go similarity index 100% rename from deploy/compoundai/operator/pkg/compoundai/utils/url.go rename to deploy/dynemo/operator/pkg/compoundai/utils/url.go diff --git a/deploy/compoundai/operator/test/e2e/e2e_suite_test.go b/deploy/dynemo/operator/test/e2e/e2e_suite_test.go similarity index 100% rename from deploy/compoundai/operator/test/e2e/e2e_suite_test.go rename to deploy/dynemo/operator/test/e2e/e2e_suite_test.go diff --git a/deploy/compoundai/operator/test/e2e/e2e_test.go b/deploy/dynemo/operator/test/e2e/e2e_test.go similarity index 100% rename from deploy/compoundai/operator/test/e2e/e2e_test.go rename to deploy/dynemo/operator/test/e2e/e2e_test.go diff --git a/deploy/compoundai/operator/test/utils/utils.go b/deploy/dynemo/operator/test/utils/utils.go similarity index 100% rename from deploy/compoundai/operator/test/utils/utils.go rename to deploy/dynemo/operator/test/utils/utils.go diff --git a/deploy/compoundai/sdk/README.md b/deploy/dynemo/sdk/README.md similarity index 100% rename from deploy/compoundai/sdk/README.md rename to deploy/dynemo/sdk/README.md diff --git a/deploy/compoundai/sdk/pyproject.toml b/deploy/dynemo/sdk/pyproject.toml similarity index 78% rename from deploy/compoundai/sdk/pyproject.toml rename to deploy/dynemo/sdk/pyproject.toml index b068a9eb1c0a..9a424e05e5ee 100644 --- a/deploy/compoundai/sdk/pyproject.toml +++ b/deploy/dynemo/sdk/pyproject.toml @@ -14,9 +14,9 @@ # limitations under the License. [project] -name = "compoundai" +name = "dynemo-sdk" version = "0.1.0" -description = "Distributed Inference Framework" +description = "Distributed Inference Framework - SDK" readme = "README.md" authors = [ { name = "NVIDIA Inc.", email = "sw-dl-dynemo@nvidia.com" }, @@ -24,13 +24,21 @@ authors = [ dependencies = [ # TODO: currently compatible with bentoml==1.4.1, # v1.4.2 has removed normalize_identifier which is used in compoundai + # "dynemo=={dynemo_version}", "bentoml==1.4.1", "types-psutil==7.0.0.20250218", ] [project.scripts] -compoundai = "compoundai.cli.cli:cli" +dynemo-sdk = "dynemo.sdk.cli.cli:cli" + +[tool.setuptools] +namespace-packages = ["dynemo"] +package-dir = {"dynemo.sdk" = "src/dynemo/sdk"} [build-system] requires = ["hatchling"] build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["src/dynemo"] \ No newline at end of file diff --git a/deploy/compoundai/sdk/src/compoundai/__init__.py b/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py similarity index 83% rename from deploy/compoundai/sdk/src/compoundai/__init__.py rename to deploy/dynemo/sdk/src/dynemo/sdk/__init__.py index 5b0418fc2559..59153ffeb7c0 100644 --- a/deploy/compoundai/sdk/src/compoundai/__init__.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py @@ -15,10 +15,10 @@ from bentoml import api from bentoml._internal.context import server_context -from compoundai.sdk.decorators import async_onstart, dynemo_api, dynemo_endpoint -from compoundai.sdk.dependency import depends -from compoundai.sdk.image import DYNEMO_IMAGE -from compoundai.sdk.service import service +from dynemo.sdk.lib.decorators import async_onstart, dynemo_api, dynemo_endpoint +from dynemo.sdk.lib.dependency import depends +from dynemo.sdk.lib.image import DYNEMO_IMAGE +from dynemo.sdk.lib.service import service dynemo_context = {} diff --git a/deploy/compoundai/sdk/src/compoundai/cli/cli.py b/deploy/dynemo/sdk/src/dynemo/sdk/cli/cli.py similarity index 96% rename from deploy/compoundai/sdk/src/compoundai/cli/cli.py rename to deploy/dynemo/sdk/src/dynemo/sdk/cli/cli.py index 7de93e0fd747..a80734fc0f97 100644 --- a/deploy/compoundai/sdk/src/compoundai/cli/cli.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/cli/cli.py @@ -34,8 +34,8 @@ def create_bentoml_cli() -> click.Command: from bentoml_cli.models import model_command from bentoml_cli.secret import secret_command from bentoml_cli.utils import BentoMLCommandGroup, get_entry_points - from compoundai.cli.serve import serve_command - from compoundai.cli.start import start_command + from dynemo.sdk.cli.serve import serve_command + from dynemo.sdk.cli.start import start_command server_context.service_type = "cli" diff --git a/deploy/compoundai/sdk/src/compoundai/cli/serve.py b/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve.py similarity index 100% rename from deploy/compoundai/sdk/src/compoundai/cli/serve.py rename to deploy/dynemo/sdk/src/dynemo/sdk/cli/serve.py diff --git a/deploy/compoundai/sdk/src/compoundai/cli/serve_dynemo.py b/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve_dynemo.py similarity index 100% rename from deploy/compoundai/sdk/src/compoundai/cli/serve_dynemo.py rename to deploy/dynemo/sdk/src/dynemo/sdk/cli/serve_dynemo.py diff --git a/deploy/compoundai/sdk/src/compoundai/cli/serving.py b/deploy/dynemo/sdk/src/dynemo/sdk/cli/serving.py similarity index 100% rename from deploy/compoundai/sdk/src/compoundai/cli/serving.py rename to deploy/dynemo/sdk/src/dynemo/sdk/cli/serving.py diff --git a/deploy/compoundai/sdk/src/compoundai/cli/start.py b/deploy/dynemo/sdk/src/dynemo/sdk/cli/start.py similarity index 100% rename from deploy/compoundai/sdk/src/compoundai/cli/start.py rename to deploy/dynemo/sdk/src/dynemo/sdk/cli/start.py diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/__init__.py b/deploy/dynemo/sdk/src/dynemo/sdk/lib/__init__.py similarity index 100% rename from deploy/compoundai/sdk/src/compoundai/sdk/__init__.py rename to deploy/dynemo/sdk/src/dynemo/sdk/lib/__init__.py diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/decorators.py b/deploy/dynemo/sdk/src/dynemo/sdk/lib/decorators.py similarity index 100% rename from deploy/compoundai/sdk/src/compoundai/sdk/decorators.py rename to deploy/dynemo/sdk/src/dynemo/sdk/lib/decorators.py diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py b/deploy/dynemo/sdk/src/dynemo/sdk/lib/dependency.py similarity index 99% rename from deploy/compoundai/sdk/src/compoundai/sdk/dependency.py rename to deploy/dynemo/sdk/src/dynemo/sdk/lib/dependency.py index a4f2a7b64d6a..cf27058d0807 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/dependency.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/lib/dependency.py @@ -18,7 +18,7 @@ from _bentoml_sdk.service import Service from _bentoml_sdk.service.dependency import Dependency -from compoundai.sdk.service import CompoundService +from dynemo.sdk.lib.service import CompoundService T = TypeVar("T") diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/image.py b/deploy/dynemo/sdk/src/dynemo/sdk/lib/image.py similarity index 100% rename from deploy/compoundai/sdk/src/compoundai/sdk/image.py rename to deploy/dynemo/sdk/src/dynemo/sdk/lib/image.py diff --git a/deploy/compoundai/sdk/src/compoundai/sdk/service.py b/deploy/dynemo/sdk/src/dynemo/sdk/lib/service.py similarity index 99% rename from deploy/compoundai/sdk/src/compoundai/sdk/service.py rename to deploy/dynemo/sdk/src/dynemo/sdk/lib/service.py index 70dbdfebe43b..f60902e08e02 100644 --- a/deploy/compoundai/sdk/src/compoundai/sdk/service.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/lib/service.py @@ -21,7 +21,7 @@ from _bentoml_sdk import Service, ServiceConfig from _bentoml_sdk.images import Image -from compoundai.sdk.decorators import DynemoEndpoint +from dynemo.sdk.lib.decorators import DynemoEndpoint T = TypeVar("T", bound=object) diff --git a/deploy/dynemo/sdk/uv.lock b/deploy/dynemo/sdk/uv.lock new file mode 100644 index 000000000000..9a7fbf57cec1 --- /dev/null +++ b/deploy/dynemo/sdk/uv.lock @@ -0,0 +1,1355 @@ +version = 1 +revision = 1 +requires-python = ">=3.12" + +[[package]] +name = "a2wsgi" +version = "1.10.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/76/0823bd7f0ac429489d19e8c03e9a5a7856e6c2c561e641cc62f54ec4ea04/a2wsgi-1.10.8.tar.gz", hash = "sha256:fc00bab1fc792f89a8ce1b491b2ad1717b145d8caefb75d0a8586946edc97cb2", size = 18729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/54/1e14731678ec375875c65df3d020714361230d3b8aa8188d2290d07dabe4/a2wsgi-1.10.8-py3-none-any.whl", hash = "sha256:7fbdb3ef81ea46e6bbd0dcadc1ff9a7919197626c50c303ecafe400ce8099ad0", size = 17328 }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/08/07/508f9ebba367fc3370162e53a3cfd12f5652ad79f0e0bfdf9f9847c6f159/aiohappyeyeballs-2.4.6.tar.gz", hash = "sha256:9b05052f9042985d32ecbe4b59a77ae19c006a78f1344d7fdad69d28ded3d0b0", size = 21726 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/4c/03fb05f56551828ec67ceb3665e5dc51638042d204983a03b0a1541475b6/aiohappyeyeballs-2.4.6-py3-none-any.whl", hash = "sha256:147ec992cf873d74f5062644332c539fcd42956dc69453fe5204195e560517e1", size = 14543 }, +] + +[[package]] +name = "aiohttp" +version = "3.11.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/4b/952d49c73084fb790cb5c6ead50848c8e96b4980ad806cf4d2ad341eaa03/aiohttp-3.11.12.tar.gz", hash = "sha256:7603ca26d75b1b86160ce1bbe2787a0b706e592af5b2504e12caa88a217767b0", size = 7673175 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/d0/94346961acb476569fca9a644cc6f9a02f97ef75961a6b8d2b35279b8d1f/aiohttp-3.11.12-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e392804a38353900c3fd8b7cacbea5132888f7129f8e241915e90b85f00e3250", size = 704837 }, + { url = "https://files.pythonhosted.org/packages/a9/af/05c503f1cc8f97621f199ef4b8db65fb88b8bc74a26ab2adb74789507ad3/aiohttp-3.11.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8fa1510b96c08aaad49303ab11f8803787c99222288f310a62f493faf883ede1", size = 464218 }, + { url = "https://files.pythonhosted.org/packages/f2/48/b9949eb645b9bd699153a2ec48751b985e352ab3fed9d98c8115de305508/aiohttp-3.11.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dc065a4285307607df3f3686363e7f8bdd0d8ab35f12226362a847731516e42c", size = 456166 }, + { url = "https://files.pythonhosted.org/packages/14/fb/980981807baecb6f54bdd38beb1bd271d9a3a786e19a978871584d026dcf/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddb31f8474695cd61fc9455c644fc1606c164b93bff2490390d90464b4655df", size = 1682528 }, + { url = "https://files.pythonhosted.org/packages/90/cb/77b1445e0a716914e6197b0698b7a3640590da6c692437920c586764d05b/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dec0000d2d8621d8015c293e24589d46fa218637d820894cb7356c77eca3259", size = 1737154 }, + { url = "https://files.pythonhosted.org/packages/ff/24/d6fb1f4cede9ccbe98e4def6f3ed1e1efcb658871bbf29f4863ec646bf38/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3552fe98e90fdf5918c04769f338a87fa4f00f3b28830ea9b78b1bdc6140e0d", size = 1793435 }, + { url = "https://files.pythonhosted.org/packages/17/e2/9f744cee0861af673dc271a3351f59ebd5415928e20080ab85be25641471/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dfe7f984f28a8ae94ff3a7953cd9678550dbd2a1f9bda5dd9c5ae627744c78e", size = 1692010 }, + { url = "https://files.pythonhosted.org/packages/90/c4/4a1235c1df544223eb57ba553ce03bc706bdd065e53918767f7fa1ff99e0/aiohttp-3.11.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a481a574af914b6e84624412666cbfbe531a05667ca197804ecc19c97b8ab1b0", size = 1619481 }, + { url = "https://files.pythonhosted.org/packages/60/70/cf12d402a94a33abda86dd136eb749b14c8eb9fec1e16adc310e25b20033/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1987770fb4887560363b0e1a9b75aa303e447433c41284d3af2840a2f226d6e0", size = 1641578 }, + { url = "https://files.pythonhosted.org/packages/1b/25/7211973fda1f5e833fcfd98ccb7f9ce4fbfc0074e3e70c0157a751d00db8/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a4ac6a0f0f6402854adca4e3259a623f5c82ec3f0c049374133bcb243132baf9", size = 1684463 }, + { url = "https://files.pythonhosted.org/packages/93/60/b5905b4d0693f6018b26afa9f2221fefc0dcbd3773fe2dff1a20fb5727f1/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c96a43822f1f9f69cc5c3706af33239489a6294be486a0447fb71380070d4d5f", size = 1646691 }, + { url = "https://files.pythonhosted.org/packages/b4/fc/ba1b14d6fdcd38df0b7c04640794b3683e949ea10937c8a58c14d697e93f/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a5e69046f83c0d3cb8f0d5bd9b8838271b1bc898e01562a04398e160953e8eb9", size = 1702269 }, + { url = "https://files.pythonhosted.org/packages/5e/39/18c13c6f658b2ba9cc1e0c6fb2d02f98fd653ad2addcdf938193d51a9c53/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:68d54234c8d76d8ef74744f9f9fc6324f1508129e23da8883771cdbb5818cbef", size = 1734782 }, + { url = "https://files.pythonhosted.org/packages/9f/d2/ccc190023020e342419b265861877cd8ffb75bec37b7ddd8521dd2c6deb8/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9fd9dcf9c91affe71654ef77426f5cf8489305e1c66ed4816f5a21874b094b9", size = 1694740 }, + { url = "https://files.pythonhosted.org/packages/3f/54/186805bcada64ea90ea909311ffedcd74369bfc6e880d39d2473314daa36/aiohttp-3.11.12-cp312-cp312-win32.whl", hash = "sha256:0ed49efcd0dc1611378beadbd97beb5d9ca8fe48579fc04a6ed0844072261b6a", size = 411530 }, + { url = "https://files.pythonhosted.org/packages/3d/63/5eca549d34d141bcd9de50d4e59b913f3641559460c739d5e215693cb54a/aiohttp-3.11.12-cp312-cp312-win_amd64.whl", hash = "sha256:54775858c7f2f214476773ce785a19ee81d1294a6bedc5cc17225355aab74802", size = 437860 }, + { url = "https://files.pythonhosted.org/packages/c3/9b/cea185d4b543ae08ee478373e16653722c19fcda10d2d0646f300ce10791/aiohttp-3.11.12-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:413ad794dccb19453e2b97c2375f2ca3cdf34dc50d18cc2693bd5aed7d16f4b9", size = 698148 }, + { url = "https://files.pythonhosted.org/packages/91/5c/80d47fe7749fde584d1404a68ade29bcd7e58db8fa11fa38e8d90d77e447/aiohttp-3.11.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a93d28ed4b4b39e6f46fd240896c29b686b75e39cc6992692e3922ff6982b4c", size = 460831 }, + { url = "https://files.pythonhosted.org/packages/8e/f9/de568f8a8ca6b061d157c50272620c53168d6e3eeddae78dbb0f7db981eb/aiohttp-3.11.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d589264dbba3b16e8951b6f145d1e6b883094075283dafcab4cdd564a9e353a0", size = 453122 }, + { url = "https://files.pythonhosted.org/packages/8b/fd/b775970a047543bbc1d0f66725ba72acef788028fce215dc959fd15a8200/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5148ca8955affdfeb864aca158ecae11030e952b25b3ae15d4e2b5ba299bad2", size = 1665336 }, + { url = "https://files.pythonhosted.org/packages/82/9b/aff01d4f9716245a1b2965f02044e4474fadd2bcfe63cf249ca788541886/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:525410e0790aab036492eeea913858989c4cb070ff373ec3bc322d700bdf47c1", size = 1718111 }, + { url = "https://files.pythonhosted.org/packages/e0/a9/166fd2d8b2cc64f08104aa614fad30eee506b563154081bf88ce729bc665/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bd8695be2c80b665ae3f05cb584093a1e59c35ecb7d794d1edd96e8cc9201d7", size = 1775293 }, + { url = "https://files.pythonhosted.org/packages/13/c5/0d3c89bd9e36288f10dc246f42518ce8e1c333f27636ac78df091c86bb4a/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0203433121484b32646a5f5ea93ae86f3d9559d7243f07e8c0eab5ff8e3f70e", size = 1677338 }, + { url = "https://files.pythonhosted.org/packages/72/b2/017db2833ef537be284f64ead78725984db8a39276c1a9a07c5c7526e238/aiohttp-3.11.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40cd36749a1035c34ba8d8aaf221b91ca3d111532e5ccb5fa8c3703ab1b967ed", size = 1603365 }, + { url = "https://files.pythonhosted.org/packages/fc/72/b66c96a106ec7e791e29988c222141dd1219d7793ffb01e72245399e08d2/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a7442662afebbf7b4c6d28cb7aab9e9ce3a5df055fc4116cc7228192ad6cb484", size = 1618464 }, + { url = "https://files.pythonhosted.org/packages/3f/50/e68a40f267b46a603bab569d48d57f23508801614e05b3369898c5b2910a/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8a2fb742ef378284a50766e985804bd6adb5adb5aa781100b09befdbfa757b65", size = 1657827 }, + { url = "https://files.pythonhosted.org/packages/c5/1d/aafbcdb1773d0ba7c20793ebeedfaba1f3f7462f6fc251f24983ed738aa7/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2cee3b117a8d13ab98b38d5b6bdcd040cfb4181068d05ce0c474ec9db5f3c5bb", size = 1616700 }, + { url = "https://files.pythonhosted.org/packages/b0/5e/6cd9724a2932f36e2a6b742436a36d64784322cfb3406ca773f903bb9a70/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f6a19bcab7fbd8f8649d6595624856635159a6527861b9cdc3447af288a00c00", size = 1685643 }, + { url = "https://files.pythonhosted.org/packages/8b/38/ea6c91d5c767fd45a18151675a07c710ca018b30aa876a9f35b32fa59761/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e4cecdb52aaa9994fbed6b81d4568427b6002f0a91c322697a4bfcc2b2363f5a", size = 1715487 }, + { url = "https://files.pythonhosted.org/packages/8e/24/e9edbcb7d1d93c02e055490348df6f955d675e85a028c33babdcaeda0853/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:30f546358dfa0953db92ba620101fefc81574f87b2346556b90b5f3ef16e55ce", size = 1672948 }, + { url = "https://files.pythonhosted.org/packages/25/be/0b1fb737268e003198f25c3a68c2135e76e4754bf399a879b27bd508a003/aiohttp-3.11.12-cp313-cp313-win32.whl", hash = "sha256:ce1bb21fc7d753b5f8a5d5a4bae99566386b15e716ebdb410154c16c91494d7f", size = 410396 }, + { url = "https://files.pythonhosted.org/packages/68/fd/677def96a75057b0a26446b62f8fbb084435b20a7d270c99539c26573bfd/aiohttp-3.11.12-cp313-cp313-win_amd64.whl", hash = "sha256:f7914ab70d2ee8ab91c13e5402122edbc77821c66d2758abb53aabe87f013287", size = 436234 }, +] + +[[package]] +name = "aiosignal" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, +] + +[[package]] +name = "aiosqlite" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/7d/8bca2bf9a247c2c5dfeec1d7a5f40db6518f88d314b8bca9da29670d2671/aiosqlite-0.21.0.tar.gz", hash = "sha256:131bb8056daa3bc875608c631c678cda73922a2d4ba8aec373b19f18c17e7aa3", size = 13454 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/10/6c25ed6de94c49f88a91fa5018cb4c0f3625f31d5be9f771ebe5cc7cd506/aiosqlite-0.21.0-py3-none-any.whl", hash = "sha256:2549cf4057f95f53dcba16f2b64e8e2791d7e1adedb13197dd8ed77bb226d7d0", size = 15792 }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "anyio" +version = "4.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, +] + +[[package]] +name = "appdirs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566 }, +] + +[[package]] +name = "asgiref" +version = "3.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/29/38/b3395cc9ad1b56d2ddac9970bc8f4141312dbaec28bc7c218b0dfafd0f42/asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590", size = 35186 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", size = 23828 }, +] + +[[package]] +name = "attrs" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/7c/fdf464bcc51d23881d110abd74b512a42b3d5d376a55a831b44c603ae17f/attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e", size = 810562 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/30/d4986a882011f9df997a55e6becd864812ccfcd821d64aac8570ee39f719/attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a", size = 63152 }, +] + +[[package]] +name = "bentoml" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "a2wsgi" }, + { name = "aiohttp" }, + { name = "aiosqlite" }, + { name = "attrs" }, + { name = "cattrs" }, + { name = "click" }, + { name = "click-option-group" }, + { name = "cloudpickle" }, + { name = "deepmerge" }, + { name = "fs" }, + { name = "httpx" }, + { name = "httpx-ws" }, + { name = "inflection" }, + { name = "jinja2" }, + { name = "kantoku" }, + { name = "numpy" }, + { name = "nvidia-ml-py" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-instrumentation-aiohttp-client" }, + { name = "opentelemetry-instrumentation-asgi" }, + { name = "opentelemetry-sdk" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "pip-requirements-parser" }, + { name = "prometheus-client" }, + { name = "psutil" }, + { name = "pydantic" }, + { name = "python-dateutil" }, + { name = "python-dotenv" }, + { name = "python-json-logger" }, + { name = "python-multipart" }, + { name = "pyyaml" }, + { name = "questionary" }, + { name = "rich" }, + { name = "schema" }, + { name = "simple-di" }, + { name = "starlette" }, + { name = "tomli-w" }, + { name = "uv" }, + { name = "uvicorn" }, + { name = "watchfiles" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/5e/acb7cbd1b757f7e585a28b5d568a6c25ceb785e98ad20ec9f5d7dc45afb9/bentoml-1.4.1.tar.gz", hash = "sha256:20c538eb8367b04ecf0c691ea5805fa71b2d82c3a3cabcb3720a109e09653381", size = 968403 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/de/6d65c876a1c3b5d809e20c6a18e2678f76542fd8452bd49b1b64633e554b/bentoml-1.4.1-py3-none-any.whl", hash = "sha256:3b622f5301bd55043f528be6677c660005acbf4619eef38d60d98e6b7ce05ad2", size = 1148727 }, +] + +[[package]] +name = "cattrs" +version = "23.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/d4/27f9fd840e74d51b6d6a024d39ff495b56ffde71d28eb82758b7b85d0617/cattrs-23.1.2.tar.gz", hash = "sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657", size = 39998 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/ba/05df14efaa0624fac6b1510e87f5ce446208d2f6ce50270a89b6268aebfe/cattrs-23.1.2-py3-none-any.whl", hash = "sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4", size = 50845 }, +] + +[[package]] +name = "certifi" +version = "2025.1.31" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, +] + +[[package]] +name = "click-option-group" +version = "0.5.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/b8/91054601a2e05fd9060cb1baf56be5b24145817b059e078669e1099529c7/click-option-group-0.5.6.tar.gz", hash = "sha256:97d06703873518cc5038509443742b25069a3c7562d1ea72ff08bfadde1ce777", size = 16517 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/75/81ea958bc0f7e410257cb2a42531b93a7695a31930cde87192c010a52c50/click_option_group-0.5.6-py3-none-any.whl", hash = "sha256:38a26d963ee3ad93332ddf782f9259c5bdfe405e73408d943ef5e7d0c3767ec7", size = 12467 }, +] + +[[package]] +name = "cloudpickle" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/39/069100b84d7418bc358d81669d5748efb14b9cceacd2f9c75f550424132f/cloudpickle-3.1.1.tar.gz", hash = "sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64", size = 22113 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/e8/64c37fadfc2816a7701fa8a6ed8d87327c7d54eacfbfb6edab14a2f2be75/cloudpickle-3.1.1-py3-none-any.whl", hash = "sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e", size = 20992 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "deepmerge" +version = "2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/3a/b0ba594708f1ad0bc735884b3ad854d3ca3bdc1d741e56e40bbda6263499/deepmerge-2.0.tar.gz", hash = "sha256:5c3d86081fbebd04dd5de03626a0607b809a98fb6ccba5770b62466fe940ff20", size = 19890 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/82/e5d2c1c67d19841e9edc74954c827444ae826978499bde3dfc1d007c8c11/deepmerge-2.0-py3-none-any.whl", hash = "sha256:6de9ce507115cff0bed95ff0ce9ecc31088ef50cbdf09bc90a09349a318b3d00", size = 13475 }, +] + +[[package]] +name = "deprecated" +version = "1.2.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 }, +] + +[[package]] +name = "dynemo-sdk" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "bentoml" }, + { name = "types-psutil" }, +] + +[package.metadata] +requires-dist = [ + { name = "bentoml", specifier = "==1.4.1" }, + { name = "types-psutil", specifier = "==7.0.0.20250218" }, +] + +[[package]] +name = "frozenlist" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/73/fa6d1a96ab7fd6e6d1c3500700963eab46813847f01ef0ccbaa726181dd5/frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", size = 94026 }, + { url = "https://files.pythonhosted.org/packages/ab/04/ea8bf62c8868b8eada363f20ff1b647cf2e93377a7b284d36062d21d81d1/frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", size = 54150 }, + { url = "https://files.pythonhosted.org/packages/d0/9a/8e479b482a6f2070b26bda572c5e6889bb3ba48977e81beea35b5ae13ece/frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", size = 51927 }, + { url = "https://files.pythonhosted.org/packages/e3/12/2aad87deb08a4e7ccfb33600871bbe8f0e08cb6d8224371387f3303654d7/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a", size = 282647 }, + { url = "https://files.pythonhosted.org/packages/77/f2/07f06b05d8a427ea0060a9cef6e63405ea9e0d761846b95ef3fb3be57111/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", size = 289052 }, + { url = "https://files.pythonhosted.org/packages/bd/9f/8bf45a2f1cd4aa401acd271b077989c9267ae8463e7c8b1eb0d3f561b65e/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", size = 291719 }, + { url = "https://files.pythonhosted.org/packages/41/d1/1f20fd05a6c42d3868709b7604c9f15538a29e4f734c694c6bcfc3d3b935/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", size = 267433 }, + { url = "https://files.pythonhosted.org/packages/af/f2/64b73a9bb86f5a89fb55450e97cd5c1f84a862d4ff90d9fd1a73ab0f64a5/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", size = 283591 }, + { url = "https://files.pythonhosted.org/packages/29/e2/ffbb1fae55a791fd6c2938dd9ea779509c977435ba3940b9f2e8dc9d5316/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", size = 273249 }, + { url = "https://files.pythonhosted.org/packages/2e/6e/008136a30798bb63618a114b9321b5971172a5abddff44a100c7edc5ad4f/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", size = 271075 }, + { url = "https://files.pythonhosted.org/packages/ae/f0/4e71e54a026b06724cec9b6c54f0b13a4e9e298cc8db0f82ec70e151f5ce/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", size = 285398 }, + { url = "https://files.pythonhosted.org/packages/4d/36/70ec246851478b1c0b59f11ef8ade9c482ff447c1363c2bd5fad45098b12/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", size = 294445 }, + { url = "https://files.pythonhosted.org/packages/37/e0/47f87544055b3349b633a03c4d94b405956cf2437f4ab46d0928b74b7526/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", size = 280569 }, + { url = "https://files.pythonhosted.org/packages/f9/7c/490133c160fb6b84ed374c266f42800e33b50c3bbab1652764e6e1fc498a/frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", size = 44721 }, + { url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", size = 51329 }, + { url = "https://files.pythonhosted.org/packages/da/3b/915f0bca8a7ea04483622e84a9bd90033bab54bdf485479556c74fd5eaf5/frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", size = 91538 }, + { url = "https://files.pythonhosted.org/packages/c7/d1/a7c98aad7e44afe5306a2b068434a5830f1470675f0e715abb86eb15f15b/frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", size = 52849 }, + { url = "https://files.pythonhosted.org/packages/3a/c8/76f23bf9ab15d5f760eb48701909645f686f9c64fbb8982674c241fbef14/frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", size = 50583 }, + { url = "https://files.pythonhosted.org/packages/1f/22/462a3dd093d11df623179d7754a3b3269de3b42de2808cddef50ee0f4f48/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", size = 265636 }, + { url = "https://files.pythonhosted.org/packages/80/cf/e075e407fc2ae7328155a1cd7e22f932773c8073c1fc78016607d19cc3e5/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", size = 270214 }, + { url = "https://files.pythonhosted.org/packages/a1/58/0642d061d5de779f39c50cbb00df49682832923f3d2ebfb0fedf02d05f7f/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", size = 273905 }, + { url = "https://files.pythonhosted.org/packages/ab/66/3fe0f5f8f2add5b4ab7aa4e199f767fd3b55da26e3ca4ce2cc36698e50c4/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", size = 250542 }, + { url = "https://files.pythonhosted.org/packages/f6/b8/260791bde9198c87a465224e0e2bb62c4e716f5d198fc3a1dacc4895dbd1/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", size = 267026 }, + { url = "https://files.pythonhosted.org/packages/2e/a4/3d24f88c527f08f8d44ade24eaee83b2627793fa62fa07cbb7ff7a2f7d42/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", size = 257690 }, + { url = "https://files.pythonhosted.org/packages/de/9a/d311d660420b2beeff3459b6626f2ab4fb236d07afbdac034a4371fe696e/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", size = 253893 }, + { url = "https://files.pythonhosted.org/packages/c6/23/e491aadc25b56eabd0f18c53bb19f3cdc6de30b2129ee0bc39cd387cd560/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", size = 267006 }, + { url = "https://files.pythonhosted.org/packages/08/c4/ab918ce636a35fb974d13d666dcbe03969592aeca6c3ab3835acff01f79c/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", size = 276157 }, + { url = "https://files.pythonhosted.org/packages/c0/29/3b7a0bbbbe5a34833ba26f686aabfe982924adbdcafdc294a7a129c31688/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", size = 264642 }, + { url = "https://files.pythonhosted.org/packages/ab/42/0595b3dbffc2e82d7fe658c12d5a5bafcd7516c6bf2d1d1feb5387caa9c1/frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", size = 44914 }, + { url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", size = 51167 }, + { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 }, +] + +[[package]] +name = "fs" +version = "2.4.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appdirs" }, + { name = "setuptools" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/a9/af5bfd5a92592c16cdae5c04f68187a309be8a146b528eac3c6e30edbad2/fs-2.4.16.tar.gz", hash = "sha256:ae97c7d51213f4b70b6a958292530289090de3a7e15841e108fbe144f069d313", size = 187441 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/5c/a3d95dc1ec6cdeb032d789b552ecc76effa3557ea9186e1566df6aac18df/fs-2.4.16-py2.py3-none-any.whl", hash = "sha256:660064febbccda264ae0b6bace80a8d1be9e089e0a5eb2427b7d517f9a91545c", size = 135261 }, +] + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, +] + +[[package]] +name = "httpx-ws" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "httpcore" }, + { name = "httpx" }, + { name = "wsproto" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/bc/ec7e7ac18dc6303187c7999c4b224bd3214745cd757b85ca14c8523c2a7f/httpx_ws-0.7.1.tar.gz", hash = "sha256:72f355d4b9b16d8fa59e5e68efdfcb1f3c7dca944901b373791245c8f67f9f95", size = 24114 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/5b/a27d1c8eda1fdce8c0668a3ea7e09bcc43986f5b306703c46b0f42d2165f/httpx_ws-0.7.1-py3-none-any.whl", hash = "sha256:7970e470840d8e6c17bd45ed4e7af06f9144a4a9decab2ff226f3ff9accb65b4", size = 14438 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "importlib-metadata" +version = "8.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", size = 55304 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", size = 26514 }, +] + +[[package]] +name = "inflection" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/7e/691d061b7329bc8d54edbf0ec22fbfb2afe61facb681f9aaa9bff7a27d04/inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417", size = 15091 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2", size = 9454 }, +] + +[[package]] +name = "jinja2" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 }, +] + +[[package]] +name = "kantoku" +version = "0.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/c8/cdcfa607db73d3c270ca3b50fc6521e4ab5776ae9159239729882d9c6592/kantoku-0.18.1.tar.gz", hash = "sha256:6d25065f9da68949aa8181c59151a4670230720ac2b054059fcf6daf1f618740", size = 88803 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/07/4b66a56638d18a01079a5227057a6864ac3e3dbfe2166e16bb1b7d68db96/kantoku-0.18.1-py3-none-any.whl", hash = "sha256:eec46610e17001a090b9f39f820592e1d2205648f95bdd57df85f0d94ebd1b07", size = 118218 }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[package]] +name = "multidict" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/16/92057c74ba3b96d5e211b553895cd6dc7cc4d1e43d9ab8fafc727681ef71/multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", size = 48713 }, + { url = "https://files.pythonhosted.org/packages/94/3d/37d1b8893ae79716179540b89fc6a0ee56b4a65fcc0d63535c6f5d96f217/multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", size = 29516 }, + { url = "https://files.pythonhosted.org/packages/a2/12/adb6b3200c363062f805275b4c1e656be2b3681aada66c80129932ff0bae/multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", size = 29557 }, + { url = "https://files.pythonhosted.org/packages/47/e9/604bb05e6e5bce1e6a5cf80a474e0f072e80d8ac105f1b994a53e0b28c42/multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", size = 130170 }, + { url = "https://files.pythonhosted.org/packages/7e/13/9efa50801785eccbf7086b3c83b71a4fb501a4d43549c2f2f80b8787d69f/multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", size = 134836 }, + { url = "https://files.pythonhosted.org/packages/bf/0f/93808b765192780d117814a6dfcc2e75de6dcc610009ad408b8814dca3ba/multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", size = 133475 }, + { url = "https://files.pythonhosted.org/packages/d3/c8/529101d7176fe7dfe1d99604e48d69c5dfdcadb4f06561f465c8ef12b4df/multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", size = 131049 }, + { url = "https://files.pythonhosted.org/packages/ca/0c/fc85b439014d5a58063e19c3a158a889deec399d47b5269a0f3b6a2e28bc/multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", size = 120370 }, + { url = "https://files.pythonhosted.org/packages/db/46/d4416eb20176492d2258fbd47b4abe729ff3b6e9c829ea4236f93c865089/multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", size = 125178 }, + { url = "https://files.pythonhosted.org/packages/5b/46/73697ad7ec521df7de5531a32780bbfd908ded0643cbe457f981a701457c/multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", size = 119567 }, + { url = "https://files.pythonhosted.org/packages/cd/ed/51f060e2cb0e7635329fa6ff930aa5cffa17f4c7f5c6c3ddc3500708e2f2/multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", size = 129822 }, + { url = "https://files.pythonhosted.org/packages/df/9e/ee7d1954b1331da3eddea0c4e08d9142da5f14b1321c7301f5014f49d492/multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", size = 128656 }, + { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360 }, + { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382 }, + { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529 }, + { url = "https://files.pythonhosted.org/packages/22/67/1c7c0f39fe069aa4e5d794f323be24bf4d33d62d2a348acdb7991f8f30db/multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", size = 48771 }, + { url = "https://files.pythonhosted.org/packages/3c/25/c186ee7b212bdf0df2519eacfb1981a017bda34392c67542c274651daf23/multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", size = 29533 }, + { url = "https://files.pythonhosted.org/packages/67/5e/04575fd837e0958e324ca035b339cea174554f6f641d3fb2b4f2e7ff44a2/multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", size = 29595 }, + { url = "https://files.pythonhosted.org/packages/d3/b2/e56388f86663810c07cfe4a3c3d87227f3811eeb2d08450b9e5d19d78876/multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", size = 130094 }, + { url = "https://files.pythonhosted.org/packages/6c/ee/30ae9b4186a644d284543d55d491fbd4239b015d36b23fea43b4c94f7052/multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", size = 134876 }, + { url = "https://files.pythonhosted.org/packages/84/c7/70461c13ba8ce3c779503c70ec9d0345ae84de04521c1f45a04d5f48943d/multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", size = 133500 }, + { url = "https://files.pythonhosted.org/packages/4a/9f/002af221253f10f99959561123fae676148dd730e2daa2cd053846a58507/multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", size = 131099 }, + { url = "https://files.pythonhosted.org/packages/82/42/d1c7a7301d52af79d88548a97e297f9d99c961ad76bbe6f67442bb77f097/multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", size = 120403 }, + { url = "https://files.pythonhosted.org/packages/68/f3/471985c2c7ac707547553e8f37cff5158030d36bdec4414cb825fbaa5327/multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", size = 125348 }, + { url = "https://files.pythonhosted.org/packages/67/2c/e6df05c77e0e433c214ec1d21ddd203d9a4770a1f2866a8ca40a545869a0/multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", size = 119673 }, + { url = "https://files.pythonhosted.org/packages/c5/cd/bc8608fff06239c9fb333f9db7743a1b2eafe98c2666c9a196e867a3a0a4/multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", size = 129927 }, + { url = "https://files.pythonhosted.org/packages/44/8e/281b69b7bc84fc963a44dc6e0bbcc7150e517b91df368a27834299a526ac/multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", size = 128711 }, + { url = "https://files.pythonhosted.org/packages/12/a4/63e7cd38ed29dd9f1881d5119f272c898ca92536cdb53ffe0843197f6c85/multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", size = 125519 }, + { url = "https://files.pythonhosted.org/packages/38/e0/4f5855037a72cd8a7a2f60a3952d9aa45feedb37ae7831642102604e8a37/multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", size = 26426 }, + { url = "https://files.pythonhosted.org/packages/7e/a5/17ee3a4db1e310b7405f5d25834460073a8ccd86198ce044dfaf69eac073/multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", size = 28531 }, + { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 }, +] + +[[package]] +name = "numpy" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/90/8956572f5c4ae52201fdec7ba2044b2c882832dcec7d5d0922c9e9acf2de/numpy-2.2.3.tar.gz", hash = "sha256:dbdc15f0c81611925f382dfa97b3bd0bc2c1ce19d4fe50482cb0ddc12ba30020", size = 20262700 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ec/43628dcf98466e087812142eec6d1c1a6c6bdfdad30a0aa07b872dc01f6f/numpy-2.2.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12c045f43b1d2915eca6b880a7f4a256f59d62df4f044788c8ba67709412128d", size = 20929458 }, + { url = "https://files.pythonhosted.org/packages/9b/c0/2f4225073e99a5c12350954949ed19b5d4a738f541d33e6f7439e33e98e4/numpy-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:87eed225fd415bbae787f93a457af7f5990b92a334e346f72070bf569b9c9c95", size = 14115299 }, + { url = "https://files.pythonhosted.org/packages/ca/fa/d2c5575d9c734a7376cc1592fae50257ec95d061b27ee3dbdb0b3b551eb2/numpy-2.2.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:712a64103d97c404e87d4d7c47fb0c7ff9acccc625ca2002848e0d53288b90ea", size = 5145723 }, + { url = "https://files.pythonhosted.org/packages/eb/dc/023dad5b268a7895e58e791f28dc1c60eb7b6c06fcbc2af8538ad069d5f3/numpy-2.2.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a5ae282abe60a2db0fd407072aff4599c279bcd6e9a2475500fc35b00a57c532", size = 6678797 }, + { url = "https://files.pythonhosted.org/packages/3f/19/bcd641ccf19ac25abb6fb1dcd7744840c11f9d62519d7057b6ab2096eb60/numpy-2.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5266de33d4c3420973cf9ae3b98b54a2a6d53a559310e3236c4b2b06b9c07d4e", size = 14067362 }, + { url = "https://files.pythonhosted.org/packages/39/04/78d2e7402fb479d893953fb78fa7045f7deb635ec095b6b4f0260223091a/numpy-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b787adbf04b0db1967798dba8da1af07e387908ed1553a0d6e74c084d1ceafe", size = 16116679 }, + { url = "https://files.pythonhosted.org/packages/d0/a1/e90f7aa66512be3150cb9d27f3d9995db330ad1b2046474a13b7040dfd92/numpy-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:34c1b7e83f94f3b564b35f480f5652a47007dd91f7c839f404d03279cc8dd021", size = 15264272 }, + { url = "https://files.pythonhosted.org/packages/dc/b6/50bd027cca494de4fa1fc7bf1662983d0ba5f256fa0ece2c376b5eb9b3f0/numpy-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4d8335b5f1b6e2bce120d55fb17064b0262ff29b459e8493d1785c18ae2553b8", size = 17880549 }, + { url = "https://files.pythonhosted.org/packages/96/30/f7bf4acb5f8db10a96f73896bdeed7a63373137b131ca18bd3dab889db3b/numpy-2.2.3-cp312-cp312-win32.whl", hash = "sha256:4d9828d25fb246bedd31e04c9e75714a4087211ac348cb39c8c5f99dbb6683fe", size = 6293394 }, + { url = "https://files.pythonhosted.org/packages/42/6e/55580a538116d16ae7c9aa17d4edd56e83f42126cb1dfe7a684da7925d2c/numpy-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:83807d445817326b4bcdaaaf8e8e9f1753da04341eceec705c001ff342002e5d", size = 12626357 }, + { url = "https://files.pythonhosted.org/packages/0e/8b/88b98ed534d6a03ba8cddb316950fe80842885709b58501233c29dfa24a9/numpy-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bfdb06b395385ea9b91bf55c1adf1b297c9fdb531552845ff1d3ea6e40d5aba", size = 20916001 }, + { url = "https://files.pythonhosted.org/packages/d9/b4/def6ec32c725cc5fbd8bdf8af80f616acf075fe752d8a23e895da8c67b70/numpy-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:23c9f4edbf4c065fddb10a4f6e8b6a244342d95966a48820c614891e5059bb50", size = 14130721 }, + { url = "https://files.pythonhosted.org/packages/20/60/70af0acc86495b25b672d403e12cb25448d79a2b9658f4fc45e845c397a8/numpy-2.2.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:a0c03b6be48aaf92525cccf393265e02773be8fd9551a2f9adbe7db1fa2b60f1", size = 5130999 }, + { url = "https://files.pythonhosted.org/packages/2e/69/d96c006fb73c9a47bcb3611417cf178049aae159afae47c48bd66df9c536/numpy-2.2.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:2376e317111daa0a6739e50f7ee2a6353f768489102308b0d98fcf4a04f7f3b5", size = 6665299 }, + { url = "https://files.pythonhosted.org/packages/5a/3f/d8a877b6e48103733ac224ffa26b30887dc9944ff95dffdfa6c4ce3d7df3/numpy-2.2.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fb62fe3d206d72fe1cfe31c4a1106ad2b136fcc1606093aeab314f02930fdf2", size = 14064096 }, + { url = "https://files.pythonhosted.org/packages/e4/43/619c2c7a0665aafc80efca465ddb1f260287266bdbdce517396f2f145d49/numpy-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52659ad2534427dffcc36aac76bebdd02b67e3b7a619ac67543bc9bfe6b7cdb1", size = 16114758 }, + { url = "https://files.pythonhosted.org/packages/d9/79/ee4fe4f60967ccd3897aa71ae14cdee9e3c097e3256975cc9575d393cb42/numpy-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b416af7d0ed3271cad0f0a0d0bee0911ed7eba23e66f8424d9f3dfcdcae1304", size = 15259880 }, + { url = "https://files.pythonhosted.org/packages/fb/c8/8b55cf05db6d85b7a7d414b3d1bd5a740706df00bfa0824a08bf041e52ee/numpy-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1402da8e0f435991983d0a9708b779f95a8c98c6b18a171b9f1be09005e64d9d", size = 17876721 }, + { url = "https://files.pythonhosted.org/packages/21/d6/b4c2f0564b7dcc413117b0ffbb818d837e4b29996b9234e38b2025ed24e7/numpy-2.2.3-cp313-cp313-win32.whl", hash = "sha256:136553f123ee2951bfcfbc264acd34a2fc2f29d7cdf610ce7daf672b6fbaa693", size = 6290195 }, + { url = "https://files.pythonhosted.org/packages/97/e7/7d55a86719d0de7a6a597949f3febefb1009435b79ba510ff32f05a8c1d7/numpy-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5b732c8beef1d7bc2d9e476dbba20aaff6167bf205ad9aa8d30913859e82884b", size = 12619013 }, + { url = "https://files.pythonhosted.org/packages/a6/1f/0b863d5528b9048fd486a56e0b97c18bf705e88736c8cea7239012119a54/numpy-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:435e7a933b9fda8126130b046975a968cc2d833b505475e588339e09f7672890", size = 20944621 }, + { url = "https://files.pythonhosted.org/packages/aa/99/b478c384f7a0a2e0736177aafc97dc9152fc036a3fdb13f5a3ab225f1494/numpy-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7678556eeb0152cbd1522b684dcd215250885993dd00adb93679ec3c0e6e091c", size = 14142502 }, + { url = "https://files.pythonhosted.org/packages/fb/61/2d9a694a0f9cd0a839501d362de2a18de75e3004576a3008e56bdd60fcdb/numpy-2.2.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2e8da03bd561504d9b20e7a12340870dfc206c64ea59b4cfee9fceb95070ee94", size = 5176293 }, + { url = "https://files.pythonhosted.org/packages/33/35/51e94011b23e753fa33f891f601e5c1c9a3d515448659b06df9d40c0aa6e/numpy-2.2.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:c9aa4496fd0e17e3843399f533d62857cef5900facf93e735ef65aa4bbc90ef0", size = 6691874 }, + { url = "https://files.pythonhosted.org/packages/ff/cf/06e37619aad98a9d03bd8d65b8e3041c3a639be0f5f6b0a0e2da544538d4/numpy-2.2.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4ca91d61a4bf61b0f2228f24bbfa6a9facd5f8af03759fe2a655c50ae2c6610", size = 14036826 }, + { url = "https://files.pythonhosted.org/packages/0c/93/5d7d19955abd4d6099ef4a8ee006f9ce258166c38af259f9e5558a172e3e/numpy-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:deaa09cd492e24fd9b15296844c0ad1b3c976da7907e1c1ed3a0ad21dded6f76", size = 16096567 }, + { url = "https://files.pythonhosted.org/packages/af/53/d1c599acf7732d81f46a93621dab6aa8daad914b502a7a115b3f17288ab2/numpy-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:246535e2f7496b7ac85deffe932896a3577be7af8fb7eebe7146444680297e9a", size = 15242514 }, + { url = "https://files.pythonhosted.org/packages/53/43/c0f5411c7b3ea90adf341d05ace762dad8cb9819ef26093e27b15dd121ac/numpy-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:daf43a3d1ea699402c5a850e5313680ac355b4adc9770cd5cfc2940e7861f1bf", size = 17872920 }, + { url = "https://files.pythonhosted.org/packages/5b/57/6dbdd45ab277aff62021cafa1e15f9644a52f5b5fc840bc7591b4079fb58/numpy-2.2.3-cp313-cp313t-win32.whl", hash = "sha256:cf802eef1f0134afb81fef94020351be4fe1d6681aadf9c5e862af6602af64ef", size = 6346584 }, + { url = "https://files.pythonhosted.org/packages/97/9b/484f7d04b537d0a1202a5ba81c6f53f1846ae6c63c2127f8df869ed31342/numpy-2.2.3-cp313-cp313t-win_amd64.whl", hash = "sha256:aee2512827ceb6d7f517c8b85aa5d3923afe8fc7a57d028cffcd522f1c6fd082", size = 12706784 }, +] + +[[package]] +name = "nvidia-ml-py" +version = "12.570.86" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/6e/7b0c9b88c7d520fb8639024a1a3b6dd1db03bf2c17ae85040c8758d2eb6f/nvidia_ml_py-12.570.86.tar.gz", hash = "sha256:0508d4a0c7b6d015cf574530b95a62ed4fc89da3b8b47e1aefe6777db170ec8b", size = 43147 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/a8/ec37169be4e2b7063b9076ed3fe0661e87335fbca665eed3f48c415cb234/nvidia_ml_py-12.570.86-py3-none-any.whl", hash = "sha256:58907de35a845abd13dcb227f18298f3b5dd94a72d04c9e594e77711e95c0b51", size = 44442 }, +] + +[[package]] +name = "opentelemetry-api" +version = "1.30.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "importlib-metadata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2b/6d/bbbf879826b7f3c89a45252010b5796fb1f1a0d45d9dc4709db0ef9a06c8/opentelemetry_api-1.30.0.tar.gz", hash = "sha256:375893400c1435bf623f7dfb3bcd44825fe6b56c34d0667c542ea8257b1a1240", size = 63703 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/0a/eea862fae6413d8181b23acf8e13489c90a45f17986ee9cf4eab8a0b9ad9/opentelemetry_api-1.30.0-py3-none-any.whl", hash = "sha256:d5f5284890d73fdf47f843dda3210edf37a38d66f44f2b5aedc1e89ed455dc09", size = 64955 }, +] + +[[package]] +name = "opentelemetry-instrumentation" +version = "0.51b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "packaging" }, + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ec/5a/4c7f02235ac1269b48f3855f6be1afc641f31d4888d28b90b732fbce7141/opentelemetry_instrumentation-0.51b0.tar.gz", hash = "sha256:4ca266875e02f3988536982467f7ef8c32a38b8895490ddce9ad9604649424fa", size = 27760 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/2c/48fa93f1acca9f79a06da0df7bfe916632ecc7fce1971067b3e46bcae55b/opentelemetry_instrumentation-0.51b0-py3-none-any.whl", hash = "sha256:c6de8bd26b75ec8b0e54dff59e198946e29de6a10ec65488c357d4b34aa5bdcf", size = 30923 }, +] + +[[package]] +name = "opentelemetry-instrumentation-aiohttp-client" +version = "0.51b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/77/9d8cd3716357a61822987a37c94a475e414c7cf1474e7bb4417cac7bda44/opentelemetry_instrumentation_aiohttp_client-0.51b0.tar.gz", hash = "sha256:b87fb8c017cd2f19fef0a632c984b5b8cec5bffb0b043456cd1ca01994650bb5", size = 13626 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/ad/55e3c49369fe2eef25c8b0b4d2a658411f04424666e5682994005a298aee/opentelemetry_instrumentation_aiohttp_client-0.51b0-py3-none-any.whl", hash = "sha256:0d44d56cfa515364fcb633e2baeefd363f542372aeceede68c4993db35f44f21", size = 11638 }, +] + +[[package]] +name = "opentelemetry-instrumentation-asgi" +version = "0.51b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/67/8aa6e1129f641f0f3f8786e6c5d18c1f2bbe490bd4b0e91a6879e85154d2/opentelemetry_instrumentation_asgi-0.51b0.tar.gz", hash = "sha256:b3fe97c00f0bfa934371a69674981d76591c68d937b6422a5716ca21081b4148", size = 24201 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/7e/0a95ab37302729543631a789ba8e71dea75c520495739dbbbdfdc580b401/opentelemetry_instrumentation_asgi-0.51b0-py3-none-any.whl", hash = "sha256:e8072993db47303b633c6ec1bc74726ba4d32bd0c46c28dfadf99f79521a324c", size = 16340 }, +] + +[[package]] +name = "opentelemetry-sdk" +version = "1.30.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/ee/d710062e8a862433d1be0b85920d0c653abe318878fef2d14dfe2c62ff7b/opentelemetry_sdk-1.30.0.tar.gz", hash = "sha256:c9287a9e4a7614b9946e933a67168450b9ab35f08797eb9bc77d998fa480fa18", size = 158633 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/28/64d781d6adc6bda2260067ce2902bd030cf45aec657e02e28c5b4480b976/opentelemetry_sdk-1.30.0-py3-none-any.whl", hash = "sha256:14fe7afc090caad881addb6926cec967129bd9260c4d33ae6a217359f6b61091", size = 118717 }, +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.51b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "opentelemetry-api" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1e/c0/0f9ef4605fea7f2b83d55dd0b0d7aebe8feead247cd6facd232b30907b4f/opentelemetry_semantic_conventions-0.51b0.tar.gz", hash = "sha256:3fabf47f35d1fd9aebcdca7e6802d86bd5ebc3bc3408b7e3248dde6e87a18c47", size = 107191 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/75/d7bdbb6fd8630b4cafb883482b75c4fc276b6426619539d266e32ac53266/opentelemetry_semantic_conventions-0.51b0-py3-none-any.whl", hash = "sha256:fdc777359418e8d06c86012c3dc92c88a6453ba662e941593adb062e48c2eeae", size = 177416 }, +] + +[[package]] +name = "opentelemetry-util-http" +version = "0.51b0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/64/32510c0a803465eb6ef1f5bd514d0f5627f8abc9444ed94f7240faf6fcaa/opentelemetry_util_http-0.51b0.tar.gz", hash = "sha256:05edd19ca1cc3be3968b1e502fd94816901a365adbeaab6b6ddb974384d3a0b9", size = 8043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/dd/c371eeb9cc78abbdad231a27ce1a196a37ef96328d876ccbb381dea4c8ee/opentelemetry_util_http-0.51b0-py3-none-any.whl", hash = "sha256:0561d7a6e9c422b9ef9ae6e77eafcfcd32a2ab689f5e801475cbb67f189efa20", size = 7304 }, +] + +[[package]] +name = "packaging" +version = "24.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, +] + +[[package]] +name = "pip-requirements-parser" +version = "32.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/2a/63b574101850e7f7b306ddbdb02cb294380d37948140eecd468fae392b54/pip-requirements-parser-32.0.1.tar.gz", hash = "sha256:b4fa3a7a0be38243123cf9d1f3518da10c51bdb165a2b2985566247f9155a7d3", size = 209359 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/d0/d04f1d1e064ac901439699ee097f58688caadea42498ec9c4b4ad2ef84ab/pip_requirements_parser-32.0.1-py3-none-any.whl", hash = "sha256:4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526", size = 35648 }, +] + +[[package]] +name = "prometheus-client" +version = "0.21.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/62/14/7d0f567991f3a9af8d1cd4f619040c93b68f09a02b6d0b6ab1b2d1ded5fe/prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", size = 78551 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301", size = 54682 }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/e1/bd15cb8ffdcfeeb2bdc215de3c3cffca11408d829e4b8416dcfe71ba8854/prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab", size = 429087 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816 }, +] + +[[package]] +name = "propcache" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/76/f941e63d55c0293ff7829dd21e7cf1147e90a526756869a9070f287a68c9/propcache-0.3.0.tar.gz", hash = "sha256:a8fd93de4e1d278046345f49e2238cdb298589325849b2645d4a94c53faeffc5", size = 42722 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/2c/921f15dc365796ec23975b322b0078eae72995c7b4d49eba554c6a308d70/propcache-0.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e53d19c2bf7d0d1e6998a7e693c7e87300dd971808e6618964621ccd0e01fe4e", size = 79867 }, + { url = "https://files.pythonhosted.org/packages/11/a5/4a6cc1a559d1f2fb57ea22edc4245158cdffae92f7f92afcee2913f84417/propcache-0.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a61a68d630e812b67b5bf097ab84e2cd79b48c792857dc10ba8a223f5b06a2af", size = 46109 }, + { url = "https://files.pythonhosted.org/packages/e1/6d/28bfd3af3a567ad7d667348e7f46a520bda958229c4d545ba138a044232f/propcache-0.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb91d20fa2d3b13deea98a690534697742029f4fb83673a3501ae6e3746508b5", size = 45635 }, + { url = "https://files.pythonhosted.org/packages/73/20/d75b42eaffe5075eac2f4e168f6393d21c664c91225288811d85451b2578/propcache-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67054e47c01b7b349b94ed0840ccae075449503cf1fdd0a1fdd98ab5ddc2667b", size = 242159 }, + { url = "https://files.pythonhosted.org/packages/a5/fb/4b537dd92f9fd4be68042ec51c9d23885ca5fafe51ec24c58d9401034e5f/propcache-0.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:997e7b8f173a391987df40f3b52c423e5850be6f6df0dcfb5376365440b56667", size = 248163 }, + { url = "https://files.pythonhosted.org/packages/e7/af/8a9db04ac596d531ca0ef7dde518feaadfcdabef7b17d6a5ec59ee3effc2/propcache-0.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d663fd71491dde7dfdfc899d13a067a94198e90695b4321084c6e450743b8c7", size = 248794 }, + { url = "https://files.pythonhosted.org/packages/9d/c4/ecfc988879c0fd9db03228725b662d76cf484b6b46f7e92fee94e4b52490/propcache-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8884ba1a0fe7210b775106b25850f5e5a9dc3c840d1ae9924ee6ea2eb3acbfe7", size = 243912 }, + { url = "https://files.pythonhosted.org/packages/04/a2/298dd27184faa8b7d91cc43488b578db218b3cc85b54d912ed27b8c5597a/propcache-0.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa806bbc13eac1ab6291ed21ecd2dd426063ca5417dd507e6be58de20e58dfcf", size = 229402 }, + { url = "https://files.pythonhosted.org/packages/be/0d/efe7fec316ca92dbf4bc4a9ba49ca889c43ca6d48ab1d6fa99fc94e5bb98/propcache-0.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6f4d7a7c0aff92e8354cceca6fe223973ddf08401047920df0fcb24be2bd5138", size = 226896 }, + { url = "https://files.pythonhosted.org/packages/60/63/72404380ae1d9c96d96e165aa02c66c2aae6072d067fc4713da5cde96762/propcache-0.3.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9be90eebc9842a93ef8335291f57b3b7488ac24f70df96a6034a13cb58e6ff86", size = 221447 }, + { url = "https://files.pythonhosted.org/packages/9d/18/b8392cab6e0964b67a30a8f4dadeaff64dc7022b5a34bb1d004ea99646f4/propcache-0.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bf15fc0b45914d9d1b706f7c9c4f66f2b7b053e9517e40123e137e8ca8958b3d", size = 222440 }, + { url = "https://files.pythonhosted.org/packages/6f/be/105d9ceda0f97eff8c06bac1673448b2db2a497444de3646464d3f5dc881/propcache-0.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5a16167118677d94bb48bfcd91e420088854eb0737b76ec374b91498fb77a70e", size = 234104 }, + { url = "https://files.pythonhosted.org/packages/cb/c9/f09a4ec394cfcce4053d8b2a04d622b5f22d21ba9bb70edd0cad061fa77b/propcache-0.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:41de3da5458edd5678b0f6ff66691507f9885f5fe6a0fb99a5d10d10c0fd2d64", size = 239086 }, + { url = "https://files.pythonhosted.org/packages/ea/aa/96f7f9ed6def82db67c972bdb7bd9f28b95d7d98f7e2abaf144c284bf609/propcache-0.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:728af36011bb5d344c4fe4af79cfe186729efb649d2f8b395d1572fb088a996c", size = 230991 }, + { url = "https://files.pythonhosted.org/packages/5a/11/bee5439de1307d06fad176f7143fec906e499c33d7aff863ea8428b8e98b/propcache-0.3.0-cp312-cp312-win32.whl", hash = "sha256:6b5b7fd6ee7b54e01759f2044f936dcf7dea6e7585f35490f7ca0420fe723c0d", size = 40337 }, + { url = "https://files.pythonhosted.org/packages/e4/17/e5789a54a0455a61cb9efc4ca6071829d992220c2998a27c59aeba749f6f/propcache-0.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:2d15bc27163cd4df433e75f546b9ac31c1ba7b0b128bfb1b90df19082466ff57", size = 44404 }, + { url = "https://files.pythonhosted.org/packages/3a/0f/a79dd23a0efd6ee01ab0dc9750d8479b343bfd0c73560d59d271eb6a99d4/propcache-0.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a2b9bf8c79b660d0ca1ad95e587818c30ccdb11f787657458d6f26a1ea18c568", size = 77287 }, + { url = "https://files.pythonhosted.org/packages/b8/51/76675703c90de38ac75adb8deceb3f3ad99b67ff02a0fa5d067757971ab8/propcache-0.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b0c1a133d42c6fc1f5fbcf5c91331657a1ff822e87989bf4a6e2e39b818d0ee9", size = 44923 }, + { url = "https://files.pythonhosted.org/packages/01/9b/fd5ddbee66cf7686e73c516227c2fd9bf471dbfed0f48329d095ea1228d3/propcache-0.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bb2f144c6d98bb5cbc94adeb0447cfd4c0f991341baa68eee3f3b0c9c0e83767", size = 44325 }, + { url = "https://files.pythonhosted.org/packages/13/1c/6961f11eb215a683b34b903b82bde486c606516c1466bf1fa67f26906d51/propcache-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1323cd04d6e92150bcc79d0174ce347ed4b349d748b9358fd2e497b121e03c8", size = 225116 }, + { url = "https://files.pythonhosted.org/packages/ef/ea/f8410c40abcb2e40dffe9adeed017898c930974650a63e5c79b886aa9f73/propcache-0.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b812b3cb6caacd072276ac0492d249f210006c57726b6484a1e1805b3cfeea0", size = 229905 }, + { url = "https://files.pythonhosted.org/packages/ef/5a/a9bf90894001468bf8e6ea293bb00626cc9ef10f8eb7996e9ec29345c7ed/propcache-0.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:742840d1d0438eb7ea4280f3347598f507a199a35a08294afdcc560c3739989d", size = 233221 }, + { url = "https://files.pythonhosted.org/packages/dd/ce/fffdddd9725b690b01d345c1156b4c2cc6dca09ab5c23a6d07b8f37d6e2f/propcache-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c6e7e4f9167fddc438cd653d826f2222222564daed4116a02a184b464d3ef05", size = 227627 }, + { url = "https://files.pythonhosted.org/packages/58/ae/45c89a5994a334735a3032b48e8e4a98c05d9536ddee0719913dc27da548/propcache-0.3.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a94ffc66738da99232ddffcf7910e0f69e2bbe3a0802e54426dbf0714e1c2ffe", size = 214217 }, + { url = "https://files.pythonhosted.org/packages/01/84/bc60188c3290ff8f5f4a92b9ca2d93a62e449c8daf6fd11ad517ad136926/propcache-0.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c6ec957025bf32b15cbc6b67afe233c65b30005e4c55fe5768e4bb518d712f1", size = 212921 }, + { url = "https://files.pythonhosted.org/packages/14/b3/39d60224048feef7a96edabb8217dc3f75415457e5ebbef6814f8b2a27b5/propcache-0.3.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:549722908de62aa0b47a78b90531c022fa6e139f9166be634f667ff45632cc92", size = 208200 }, + { url = "https://files.pythonhosted.org/packages/9d/b3/0a6720b86791251273fff8a01bc8e628bc70903513bd456f86cde1e1ef84/propcache-0.3.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5d62c4f6706bff5d8a52fd51fec6069bef69e7202ed481486c0bc3874912c787", size = 208400 }, + { url = "https://files.pythonhosted.org/packages/e9/4f/bb470f3e687790547e2e78105fb411f54e0cdde0d74106ccadd2521c6572/propcache-0.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:24c04f8fbf60094c531667b8207acbae54146661657a1b1be6d3ca7773b7a545", size = 218116 }, + { url = "https://files.pythonhosted.org/packages/34/71/277f7f9add469698ac9724c199bfe06f85b199542121a71f65a80423d62a/propcache-0.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7c5f5290799a3f6539cc5e6f474c3e5c5fbeba74a5e1e5be75587746a940d51e", size = 222911 }, + { url = "https://files.pythonhosted.org/packages/92/e3/a7b9782aef5a2fc765b1d97da9ec7aed2f25a4e985703608e73232205e3f/propcache-0.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4fa0e7c9c3cf7c276d4f6ab9af8adddc127d04e0fcabede315904d2ff76db626", size = 216563 }, + { url = "https://files.pythonhosted.org/packages/ab/76/0583ca2c551aa08ffcff87b2c6849c8f01c1f6fb815a5226f0c5c202173e/propcache-0.3.0-cp313-cp313-win32.whl", hash = "sha256:ee0bd3a7b2e184e88d25c9baa6a9dc609ba25b76daae942edfb14499ac7ec374", size = 39763 }, + { url = "https://files.pythonhosted.org/packages/80/ec/c6a84f9a36f608379b95f0e786c111d5465926f8c62f12be8cdadb02b15c/propcache-0.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1c8f7d896a16da9455f882870a507567d4f58c53504dc2d4b1e1d386dfe4588a", size = 43650 }, + { url = "https://files.pythonhosted.org/packages/ee/95/7d32e3560f5bf83fc2f2a4c1b0c181d327d53d5f85ebd045ab89d4d97763/propcache-0.3.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e560fd75aaf3e5693b91bcaddd8b314f4d57e99aef8a6c6dc692f935cc1e6bbf", size = 82140 }, + { url = "https://files.pythonhosted.org/packages/86/89/752388f12e6027a5e63f5d075f15291ded48e2d8311314fff039da5a9b11/propcache-0.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:65a37714b8ad9aba5780325228598a5b16c47ba0f8aeb3dc0514701e4413d7c0", size = 47296 }, + { url = "https://files.pythonhosted.org/packages/1b/4c/b55c98d586c69180d3048984a57a5ea238bdeeccf82dbfcd598e935e10bb/propcache-0.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:07700939b2cbd67bfb3b76a12e1412405d71019df00ca5697ce75e5ef789d829", size = 46724 }, + { url = "https://files.pythonhosted.org/packages/0f/b6/67451a437aed90c4e951e320b5b3d7eb584ade1d5592f6e5e8f678030989/propcache-0.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c0fdbdf6983526e269e5a8d53b7ae3622dd6998468821d660d0daf72779aefa", size = 291499 }, + { url = "https://files.pythonhosted.org/packages/ee/ff/e4179facd21515b24737e1e26e02615dfb5ed29416eed4cf5bc6ac5ce5fb/propcache-0.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:794c3dd744fad478b6232289c866c25406ecdfc47e294618bdf1697e69bd64a6", size = 293911 }, + { url = "https://files.pythonhosted.org/packages/76/8d/94a8585992a064a23bd54f56c5e58c3b8bf0c0a06ae10e56f2353ae16c3d/propcache-0.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4544699674faf66fb6b4473a1518ae4999c1b614f0b8297b1cef96bac25381db", size = 293301 }, + { url = "https://files.pythonhosted.org/packages/b0/b8/2c860c92b4134f68c7716c6f30a0d723973f881c32a6d7a24c4ddca05fdf/propcache-0.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fddb8870bdb83456a489ab67c6b3040a8d5a55069aa6f72f9d872235fbc52f54", size = 281947 }, + { url = "https://files.pythonhosted.org/packages/cd/72/b564be7411b525d11757b713c757c21cd4dc13b6569c3b2b8f6d3c96fd5e/propcache-0.3.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f857034dc68d5ceb30fb60afb6ff2103087aea10a01b613985610e007053a121", size = 268072 }, + { url = "https://files.pythonhosted.org/packages/37/68/d94649e399e8d7fc051e5a4f2334efc567993525af083db145a70690a121/propcache-0.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02df07041e0820cacc8f739510078f2aadcfd3fc57eaeeb16d5ded85c872c89e", size = 275190 }, + { url = "https://files.pythonhosted.org/packages/d8/3c/446e125f5bbbc1922964dd67cb541c01cdb678d811297b79a4ff6accc843/propcache-0.3.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f47d52fd9b2ac418c4890aad2f6d21a6b96183c98021f0a48497a904199f006e", size = 254145 }, + { url = "https://files.pythonhosted.org/packages/f4/80/fd3f741483dc8e59f7ba7e05eaa0f4e11677d7db2077522b92ff80117a2a/propcache-0.3.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9ff4e9ecb6e4b363430edf2c6e50173a63e0820e549918adef70515f87ced19a", size = 257163 }, + { url = "https://files.pythonhosted.org/packages/dc/cf/6292b5ce6ed0017e6a89024a827292122cc41b6259b30ada0c6732288513/propcache-0.3.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ecc2920630283e0783c22e2ac94427f8cca29a04cfdf331467d4f661f4072dac", size = 280249 }, + { url = "https://files.pythonhosted.org/packages/e8/f0/fd9b8247b449fe02a4f96538b979997e229af516d7462b006392badc59a1/propcache-0.3.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:c441c841e82c5ba7a85ad25986014be8d7849c3cfbdb6004541873505929a74e", size = 288741 }, + { url = "https://files.pythonhosted.org/packages/64/71/cf831fdc2617f86cfd7f414cfc487d018e722dac8acc098366ce9bba0941/propcache-0.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c929916cbdb540d3407c66f19f73387f43e7c12fa318a66f64ac99da601bcdf", size = 277061 }, + { url = "https://files.pythonhosted.org/packages/42/78/9432542a35d944abeca9e02927a0de38cd7a298466d8ffa171536e2381c3/propcache-0.3.0-cp313-cp313t-win32.whl", hash = "sha256:0c3e893c4464ebd751b44ae76c12c5f5c1e4f6cbd6fbf67e3783cd93ad221863", size = 42252 }, + { url = "https://files.pythonhosted.org/packages/6f/45/960365f4f8978f48ebb56b1127adf33a49f2e69ecd46ac1f46d6cf78a79d/propcache-0.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:75e872573220d1ee2305b35c9813626e620768248425f58798413e9c39741f46", size = 46425 }, + { url = "https://files.pythonhosted.org/packages/b5/35/6c4c6fc8774a9e3629cd750dc24a7a4fb090a25ccd5c3246d127b70f9e22/propcache-0.3.0-py3-none-any.whl", hash = "sha256:67dda3c7325691c2081510e92c561f465ba61b975f481735aefdfc845d2cd043", size = 12101 }, +] + +[[package]] +name = "psutil" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pydantic" +version = "2.10.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, +] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, + { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, + { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, + { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, + { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, + { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, + { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, + { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, + { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, + { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, + { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, + { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, + { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, + { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + +[[package]] +name = "pyparsing" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/1a/3544f4f299a47911c2ab3710f534e52fea62a633c96806995da5d25be4b2/pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a", size = 1067694 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/a7/c8a2d361bf89c0d9577c934ebb7421b25dc84bf3a8e3ac0a40aed9acc547/pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1", size = 107716 }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "python-dotenv" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, +] + +[[package]] +name = "python-json-logger" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/c4/358cd13daa1d912ef795010897a483ab2f0b41c9ea1b35235a8b2f7d15a7/python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008", size = 16287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/72/2f30cf26664fcfa0bd8ec5ee62ec90c03bd485e4a294d92aabc76c5203a5/python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090", size = 14924 }, +] + +[[package]] +name = "python-multipart" +version = "0.0.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "pyzmq" +version = "26.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/e3/8d0382cb59feb111c252b54e8728257416a38ffcb2243c4e4775a3c990fe/pyzmq-26.2.1.tar.gz", hash = "sha256:17d72a74e5e9ff3829deb72897a175333d3ef5b5413948cae3cf7ebf0b02ecca", size = 278433 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/b9/260a74786f162c7f521f5f891584a51d5a42fd15f5dcaa5c9226b2865fcc/pyzmq-26.2.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:a6549ecb0041dafa55b5932dcbb6c68293e0bd5980b5b99f5ebb05f9a3b8a8f3", size = 1348495 }, + { url = "https://files.pythonhosted.org/packages/bf/73/8a0757e4b68f5a8ccb90ddadbb76c6a5f880266cdb18be38c99bcdc17aaa/pyzmq-26.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0250c94561f388db51fd0213cdccbd0b9ef50fd3c57ce1ac937bf3034d92d72e", size = 945035 }, + { url = "https://files.pythonhosted.org/packages/cf/de/f02ec973cd33155bb772bae33ace774acc7cc71b87b25c4829068bec35de/pyzmq-26.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ee4297d9e4b34b5dc1dd7ab5d5ea2cbba8511517ef44104d2915a917a56dc8", size = 671213 }, + { url = "https://files.pythonhosted.org/packages/d1/80/8fc583085f85ac91682744efc916888dd9f11f9f75a31aef1b78a5486c6c/pyzmq-26.2.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2a9cb17fd83b7a3a3009901aca828feaf20aa2451a8a487b035455a86549c09", size = 908750 }, + { url = "https://files.pythonhosted.org/packages/c3/25/0b4824596f261a3cc512ab152448b383047ff5f143a6906a36876415981c/pyzmq-26.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:786dd8a81b969c2081b31b17b326d3a499ddd1856e06d6d79ad41011a25148da", size = 865416 }, + { url = "https://files.pythonhosted.org/packages/a1/d1/6fda77a034d02034367b040973fd3861d945a5347e607bd2e98c99f20599/pyzmq-26.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2d88ba221a07fc2c5581565f1d0fe8038c15711ae79b80d9462e080a1ac30435", size = 865922 }, + { url = "https://files.pythonhosted.org/packages/ad/81/48f7fd8a71c427412e739ce576fc1ee14f3dc34527ca9b0076e471676183/pyzmq-26.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c84c1297ff9f1cd2440da4d57237cb74be21fdfe7d01a10810acba04e79371a", size = 1201526 }, + { url = "https://files.pythonhosted.org/packages/c7/d8/818f15c6ef36b5450e435cbb0d3a51599fc884a5d2b27b46b9c00af68ef1/pyzmq-26.2.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:46d4ebafc27081a7f73a0f151d0c38d4291656aa134344ec1f3d0199ebfbb6d4", size = 1512808 }, + { url = "https://files.pythonhosted.org/packages/d9/c4/b3edb7d0ae82ad6fb1a8cdb191a4113c427a01e85139906f3b655b07f4f8/pyzmq-26.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:91e2bfb8e9a29f709d51b208dd5f441dc98eb412c8fe75c24ea464734ccdb48e", size = 1411836 }, + { url = "https://files.pythonhosted.org/packages/69/1c/151e3d42048f02cc5cd6dfc241d9d36b38375b4dee2e728acb5c353a6d52/pyzmq-26.2.1-cp312-cp312-win32.whl", hash = "sha256:4a98898fdce380c51cc3e38ebc9aa33ae1e078193f4dc641c047f88b8c690c9a", size = 581378 }, + { url = "https://files.pythonhosted.org/packages/b6/b9/d59a7462848aaab7277fddb253ae134a570520115d80afa85e952287e6bc/pyzmq-26.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:a0741edbd0adfe5f30bba6c5223b78c131b5aa4a00a223d631e5ef36e26e6d13", size = 643737 }, + { url = "https://files.pythonhosted.org/packages/55/09/f37e707937cce328944c1d57e5e50ab905011d35252a0745c4f7e5822a76/pyzmq-26.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:e5e33b1491555843ba98d5209439500556ef55b6ab635f3a01148545498355e5", size = 558303 }, + { url = "https://files.pythonhosted.org/packages/4f/2e/fa7a91ce349975971d6aa925b4c7e1a05abaae99b97ade5ace758160c43d/pyzmq-26.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:099b56ef464bc355b14381f13355542e452619abb4c1e57a534b15a106bf8e23", size = 942331 }, + { url = "https://files.pythonhosted.org/packages/64/2b/1f10b34b6dc7ff4b40f668ea25ba9b8093ce61d874c784b90229b367707b/pyzmq-26.2.1-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:651726f37fcbce9f8dd2a6dab0f024807929780621890a4dc0c75432636871be", size = 1345831 }, + { url = "https://files.pythonhosted.org/packages/4c/8d/34884cbd4a8ec050841b5fb58d37af136766a9f95b0b2634c2971deb09da/pyzmq-26.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57dd4d91b38fa4348e237a9388b4423b24ce9c1695bbd4ba5a3eada491e09399", size = 670773 }, + { url = "https://files.pythonhosted.org/packages/0f/f4/d4becfcf9e416ad2564f18a6653f7c6aa917da08df5c3760edb0baa1c863/pyzmq-26.2.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d51a7bfe01a48e1064131f3416a5439872c533d756396be2b39e3977b41430f9", size = 908836 }, + { url = "https://files.pythonhosted.org/packages/07/fa/ab105f1b86b85cb2e821239f1d0900fccd66192a91d97ee04661b5436b4d/pyzmq-26.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7154d228502e18f30f150b7ce94f0789d6b689f75261b623f0fdc1eec642aab", size = 865369 }, + { url = "https://files.pythonhosted.org/packages/c9/48/15d5f415504572dd4b92b52db5de7a5befc76bb75340ba9f36f71306a66d/pyzmq-26.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:f1f31661a80cc46aba381bed475a9135b213ba23ca7ff6797251af31510920ce", size = 865676 }, + { url = "https://files.pythonhosted.org/packages/7e/35/2d91bcc7ccbb56043dd4d2c1763f24a8de5f05e06a134f767a7fb38e149c/pyzmq-26.2.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:290c96f479504439b6129a94cefd67a174b68ace8a8e3f551b2239a64cfa131a", size = 1201457 }, + { url = "https://files.pythonhosted.org/packages/6d/bb/aa7c5119307a5762b8dca6c9db73e3ab4bccf32b15d7c4f376271ff72b2b/pyzmq-26.2.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f2c307fbe86e18ab3c885b7e01de942145f539165c3360e2af0f094dd440acd9", size = 1513035 }, + { url = "https://files.pythonhosted.org/packages/4f/4c/527e6650c2fccec7750b783301329c8a8716d59423818afb67282304ce5a/pyzmq-26.2.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:b314268e716487bfb86fcd6f84ebbe3e5bec5fac75fdf42bc7d90fdb33f618ad", size = 1411881 }, + { url = "https://files.pythonhosted.org/packages/89/9f/e4412ea1b3e220acc21777a5edba8885856403d29c6999aaf00a9459eb03/pyzmq-26.2.1-cp313-cp313-win32.whl", hash = "sha256:edb550616f567cd5603b53bb52a5f842c0171b78852e6fc7e392b02c2a1504bb", size = 581354 }, + { url = "https://files.pythonhosted.org/packages/55/cd/f89dd3e9fc2da0d1619a82c4afb600c86b52bc72d7584953d460bc8d5027/pyzmq-26.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:100a826a029c8ef3d77a1d4c97cbd6e867057b5806a7276f2bac1179f893d3bf", size = 643560 }, + { url = "https://files.pythonhosted.org/packages/a7/99/5de4f8912860013f1116f818a0047659bc20d71d1bc1d48f874bdc2d7b9c/pyzmq-26.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:6991ee6c43e0480deb1b45d0c7c2bac124a6540cba7db4c36345e8e092da47ce", size = 558037 }, + { url = "https://files.pythonhosted.org/packages/06/0b/63b6d7a2f07a77dbc9768c6302ae2d7518bed0c6cee515669ca0d8ec743e/pyzmq-26.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:25e720dba5b3a3bb2ad0ad5d33440babd1b03438a7a5220511d0c8fa677e102e", size = 938580 }, + { url = "https://files.pythonhosted.org/packages/85/38/e5e2c3ffa23ea5f95f1c904014385a55902a11a67cd43c10edf61a653467/pyzmq-26.2.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:9ec6abfb701437142ce9544bd6a236addaf803a32628d2260eb3dbd9a60e2891", size = 1339670 }, + { url = "https://files.pythonhosted.org/packages/d2/87/da5519ed7f8b31e4beee8f57311ec02926822fe23a95120877354cd80144/pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e1eb9d2bfdf5b4e21165b553a81b2c3bd5be06eeddcc4e08e9692156d21f1f6", size = 660983 }, + { url = "https://files.pythonhosted.org/packages/f6/e8/1ca6a2d59562e04d326a026c9e3f791a6f1a276ebde29da478843a566fdb/pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90dc731d8e3e91bcd456aa7407d2eba7ac6f7860e89f3766baabb521f2c1de4a", size = 896509 }, + { url = "https://files.pythonhosted.org/packages/5c/e5/0b4688f7c74bea7e4f1e920da973fcd7d20175f4f1181cb9b692429c6bb9/pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6a93d684278ad865fc0b9e89fe33f6ea72d36da0e842143891278ff7fd89c3", size = 853196 }, + { url = "https://files.pythonhosted.org/packages/8f/35/c17241da01195001828319e98517683dad0ac4df6fcba68763d61b630390/pyzmq-26.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c1bb37849e2294d519117dd99b613c5177934e5c04a5bb05dd573fa42026567e", size = 855133 }, + { url = "https://files.pythonhosted.org/packages/d2/14/268ee49bbecc3f72e225addeac7f0e2bd5808747b78c7bf7f87ed9f9d5a8/pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:632a09c6d8af17b678d84df442e9c3ad8e4949c109e48a72f805b22506c4afa7", size = 1191612 }, + { url = "https://files.pythonhosted.org/packages/5e/02/6394498620b1b4349b95c534f3ebc3aef95f39afbdced5ed7ee315c49c14/pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:fc409c18884eaf9ddde516d53af4f2db64a8bc7d81b1a0c274b8aa4e929958e8", size = 1500824 }, + { url = "https://files.pythonhosted.org/packages/17/fc/b79f0b72891cbb9917698add0fede71dfb64e83fa3481a02ed0e78c34be7/pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:17f88622b848805d3f6427ce1ad5a2aa3cf61f12a97e684dab2979802024d460", size = 1399943 }, +] + +[[package]] +name = "questionary" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "prompt-toolkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/b8/d16eb579277f3de9e56e5ad25280fab52fc5774117fb70362e8c2e016559/questionary-2.1.0.tar.gz", hash = "sha256:6302cdd645b19667d8f6e6634774e9538bfcd1aad9be287e743d96cacaf95587", size = 26775 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/3f/11dd4cd4f39e05128bfd20138faea57bec56f9ffba6185d276e3107ba5b2/questionary-2.1.0-py3-none-any.whl", hash = "sha256:44174d237b68bc828e4878c763a9ad6790ee61990e0ae72927694ead57bab8ec", size = 36747 }, +] + +[[package]] +name = "rich" +version = "13.9.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, +] + +[[package]] +name = "schema" +version = "0.7.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/01/0ea2e66bad2f13271e93b729c653747614784d3ebde219679e41ccdceecd/schema-0.7.7.tar.gz", hash = "sha256:7da553abd2958a19dc2547c388cde53398b39196175a9be59ea1caf5ab0a1807", size = 44245 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/1b/81855a88c6db2b114d5b2e9f96339190d5ee4d1b981d217fa32127bb00e0/schema-0.7.7-py2.py3-none-any.whl", hash = "sha256:5d976a5b50f36e74e2157b47097b60002bd4d42e65425fcc9c9befadb4255dde", size = 18632 }, +] + +[[package]] +name = "setuptools" +version = "75.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ec/089608b791d210aec4e7f97488e67ab0d33add3efccb83a056cbafe3a2a6/setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6", size = 1343222 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/8a/b9dc7678803429e4a3bc9ba462fa3dd9066824d3c607490235c6a796be5a/setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3", size = 1228782 }, +] + +[[package]] +name = "simple-di" +version = "0.1.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/b8/f2e3d1d6eac545c897a9b8ae339f2f2437a0e0b00bf0df3767109bede14d/simple_di-0.1.5.tar.gz", hash = "sha256:192b999dee4cd4fb11a5d861165caad02d8f0617c0f806fc5b09f905f1a03ca0", size = 9331 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/6d/02014c8b1e34bae98b9b7fb5e9a4bc17aecdc28dfb08083e1fa9e4731b7d/simple_di-0.1.5-py3-none-any.whl", hash = "sha256:e3fb6242f18f389a3c2d571dd51ade47c74cdbc4550590894664ad59bfb2a345", size = 9823 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "starlette" +version = "0.46.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/b6/fb9a32e3c5d59b1e383c357534c63c2d3caa6f25bf3c59dd89d296ecbaec/starlette-0.46.0.tar.gz", hash = "sha256:b359e4567456b28d473d0193f34c0de0ed49710d75ef183a74a5ce0499324f50", size = 2575568 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/94/8af675a62e3c91c2dee47cf92e602cfac86e8767b1a1ac3caf1b327c2ab0/starlette-0.46.0-py3-none-any.whl", hash = "sha256:913f0798bd90ba90a9156383bcf1350a17d6259451d0d8ee27fc0cf2db609038", size = 71991 }, +] + +[[package]] +name = "tomli-w" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675 }, +] + +[[package]] +name = "tornado" +version = "6.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 }, + { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 }, + { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 }, + { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 }, + { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 }, + { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 }, + { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 }, + { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 }, + { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 }, + { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, +] + +[[package]] +name = "types-psutil" +version = "7.0.0.20250218" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/7c/145600d30456e7ccbb499abcf718aab2bd830e604a0ae8eb32b67cd346a6/types_psutil-7.0.0.20250218.tar.gz", hash = "sha256:1e642cdafe837b240295b23b1cbd4691d80b08a07d29932143cbbae30eb0db9c", size = 19828 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/c8/f4365293408da4a9bcb1849d3efd8c60427cffff68cbb98ab1b81851d8bb/types_psutil-7.0.0.20250218-py3-none-any.whl", hash = "sha256:1447a30c282aafefcf8941ece854e1100eee7b0296a9d9be9977292f0269b121", size = 22763 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "uv" +version = "0.6.5" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/40/ac0b8050e145ae7dab029e8590046f9f96af4c6a36a4c4ee328a81e56062/uv-0.6.5-py3-none-linux_armv6l.whl", hash = "sha256:c5676fc7cdd088e2c3342593c1d2dc379bf86a83301af7b0dfe8d45801a50d85", size = 15517362 }, + { url = "https://files.pythonhosted.org/packages/c9/15/68beb9094e976c9403d8b79de76601f793250d0ecb84cb69d5940ba36729/uv-0.6.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:b5445a509f500bbf18faba4e7cf5cc9763617c335d58afaa5f3e5a6e388dd4ee", size = 14914536 }, + { url = "https://files.pythonhosted.org/packages/1c/49/42d917ec3a6d79751d54862ac8d5170b1f509680bcad506d949f5d365aaa/uv-0.6.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c5683bccfc2b92cdc2f91e2904baa8ee2b5893b33ac8acac25e702ce7d3e5415", size = 15264210 }, + { url = "https://files.pythonhosted.org/packages/ad/4c/446c039726dc6f04cd963f2a0813ec4e35c57d3566a9daf0272e2c5e311d/uv-0.6.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43847ef95d56c239de940339e5cfc2ade58249005e8ab97244fdb69fb9761572", size = 15974263 }, + { url = "https://files.pythonhosted.org/packages/8b/c6/46f5334c73846bb9afd883ca9a1f41262d677a3ee0e3ff0063acef5a8a05/uv-0.6.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ef0b2f810d87aa9bbad15c3ab113e555871f14c9cd8ad2205338fb0358aaf52d", size = 16842142 }, + { url = "https://files.pythonhosted.org/packages/a3/b4/b01cfa179b6e65aeb58eaf89bd3a6880082ec0fa391f93cc786db65ace03/uv-0.6.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9b56fa88951fab3bc7164255d844de9ad048e6a04a95f1c2774637e06889efe6", size = 16539261 }, + { url = "https://files.pythonhosted.org/packages/cb/cc/1e00721e749ecc4d2cf8d233a9f9585108afcd62e3da4a2784f15d1f3a65/uv-0.6.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f3b3f21b2385545f499f6cc21f44eac3bbb0f6cb98fbf9c6d3e58db186c8a41", size = 20699878 }, + { url = "https://files.pythonhosted.org/packages/66/32/ad9944c9716360c82fb62516aca72bdeaedf7991483383f3a06734cb2cf4/uv-0.6.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15dae245979add192c4845947da1a9141f95c19403d1c0d75019182e6882e7d4", size = 16249288 }, +] + +[[package]] +name = "uvicorn" +version = "0.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, +] + +[[package]] +name = "watchfiles" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/26/c705fc77d0a9ecdb9b66f1e2976d95b81df3cae518967431e7dbf9b5e219/watchfiles-1.0.4.tar.gz", hash = "sha256:6ba473efd11062d73e4f00c2b730255f9c1bdd73cd5f9fe5b5da8dbd4a717205", size = 94625 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/1a/8f4d9a1461709756ace48c98f07772bc6d4519b1e48b5fa24a4061216256/watchfiles-1.0.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:229e6ec880eca20e0ba2f7e2249c85bae1999d330161f45c78d160832e026ee2", size = 391345 }, + { url = "https://files.pythonhosted.org/packages/bc/d2/6750b7b3527b1cdaa33731438432e7238a6c6c40a9924049e4cebfa40805/watchfiles-1.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5717021b199e8353782dce03bd8a8f64438832b84e2885c4a645f9723bf656d9", size = 381515 }, + { url = "https://files.pythonhosted.org/packages/4e/17/80500e42363deef1e4b4818729ed939aaddc56f82f4e72b2508729dd3c6b/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0799ae68dfa95136dde7c472525700bd48777875a4abb2ee454e3ab18e9fc712", size = 449767 }, + { url = "https://files.pythonhosted.org/packages/10/37/1427fa4cfa09adbe04b1e97bced19a29a3462cc64c78630787b613a23f18/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43b168bba889886b62edb0397cab5b6490ffb656ee2fcb22dec8bfeb371a9e12", size = 455677 }, + { url = "https://files.pythonhosted.org/packages/c5/7a/39e9397f3a19cb549a7d380412fd9e507d4854eddc0700bfad10ef6d4dba/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb2c46e275fbb9f0c92e7654b231543c7bbfa1df07cdc4b99fa73bedfde5c844", size = 482219 }, + { url = "https://files.pythonhosted.org/packages/45/2d/7113931a77e2ea4436cad0c1690c09a40a7f31d366f79c6f0a5bc7a4f6d5/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:857f5fc3aa027ff5e57047da93f96e908a35fe602d24f5e5d8ce64bf1f2fc733", size = 518830 }, + { url = "https://files.pythonhosted.org/packages/f9/1b/50733b1980fa81ef3c70388a546481ae5fa4c2080040100cd7bf3bf7b321/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55ccfd27c497b228581e2838d4386301227fc0cb47f5a12923ec2fe4f97b95af", size = 497997 }, + { url = "https://files.pythonhosted.org/packages/2b/b4/9396cc61b948ef18943e7c85ecfa64cf940c88977d882da57147f62b34b1/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c11ea22304d17d4385067588123658e9f23159225a27b983f343fcffc3e796a", size = 452249 }, + { url = "https://files.pythonhosted.org/packages/fb/69/0c65a5a29e057ad0dc691c2fa6c23b2983c7dabaa190ba553b29ac84c3cc/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:74cb3ca19a740be4caa18f238298b9d472c850f7b2ed89f396c00a4c97e2d9ff", size = 614412 }, + { url = "https://files.pythonhosted.org/packages/7f/b9/319fcba6eba5fad34327d7ce16a6b163b39741016b1996f4a3c96b8dd0e1/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7cce76c138a91e720d1df54014a047e680b652336e1b73b8e3ff3158e05061e", size = 611982 }, + { url = "https://files.pythonhosted.org/packages/f1/47/143c92418e30cb9348a4387bfa149c8e0e404a7c5b0585d46d2f7031b4b9/watchfiles-1.0.4-cp312-cp312-win32.whl", hash = "sha256:b045c800d55bc7e2cadd47f45a97c7b29f70f08a7c2fa13241905010a5493f94", size = 271822 }, + { url = "https://files.pythonhosted.org/packages/ea/94/b0165481bff99a64b29e46e07ac2e0df9f7a957ef13bec4ceab8515f44e3/watchfiles-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:c2acfa49dd0ad0bf2a9c0bb9a985af02e89345a7189be1efc6baa085e0f72d7c", size = 285441 }, + { url = "https://files.pythonhosted.org/packages/11/de/09fe56317d582742d7ca8c2ca7b52a85927ebb50678d9b0fa8194658f536/watchfiles-1.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:22bb55a7c9e564e763ea06c7acea24fc5d2ee5dfc5dafc5cfbedfe58505e9f90", size = 277141 }, + { url = "https://files.pythonhosted.org/packages/08/98/f03efabec64b5b1fa58c0daab25c68ef815b0f320e54adcacd0d6847c339/watchfiles-1.0.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:8012bd820c380c3d3db8435e8cf7592260257b378b649154a7948a663b5f84e9", size = 390954 }, + { url = "https://files.pythonhosted.org/packages/16/09/4dd49ba0a32a45813debe5fb3897955541351ee8142f586303b271a02b40/watchfiles-1.0.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa216f87594f951c17511efe5912808dfcc4befa464ab17c98d387830ce07b60", size = 381133 }, + { url = "https://files.pythonhosted.org/packages/76/59/5aa6fc93553cd8d8ee75c6247763d77c02631aed21551a97d94998bf1dae/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c9953cf85529c05b24705639ffa390f78c26449e15ec34d5339e8108c7c407", size = 449516 }, + { url = "https://files.pythonhosted.org/packages/4c/aa/df4b6fe14b6317290b91335b23c96b488d365d65549587434817e06895ea/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cf684aa9bba4cd95ecb62c822a56de54e3ae0598c1a7f2065d51e24637a3c5d", size = 454820 }, + { url = "https://files.pythonhosted.org/packages/5e/71/185f8672f1094ce48af33252c73e39b48be93b761273872d9312087245f6/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f44a39aee3cbb9b825285ff979ab887a25c5d336e5ec3574f1506a4671556a8d", size = 481550 }, + { url = "https://files.pythonhosted.org/packages/85/d7/50ebba2c426ef1a5cb17f02158222911a2e005d401caf5d911bfca58f4c4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38320582736922be8c865d46520c043bff350956dfc9fbaee3b2df4e1740a4b", size = 518647 }, + { url = "https://files.pythonhosted.org/packages/f0/7a/4c009342e393c545d68987e8010b937f72f47937731225b2b29b7231428f/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39f4914548b818540ef21fd22447a63e7be6e24b43a70f7642d21f1e73371590", size = 497547 }, + { url = "https://files.pythonhosted.org/packages/0f/7c/1cf50b35412d5c72d63b2bf9a4fffee2e1549a245924960dd087eb6a6de4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f12969a3765909cf5dc1e50b2436eb2c0e676a3c75773ab8cc3aa6175c16e902", size = 452179 }, + { url = "https://files.pythonhosted.org/packages/d6/a9/3db1410e1c1413735a9a472380e4f431ad9a9e81711cda2aaf02b7f62693/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0986902677a1a5e6212d0c49b319aad9cc48da4bd967f86a11bde96ad9676ca1", size = 614125 }, + { url = "https://files.pythonhosted.org/packages/f2/e1/0025d365cf6248c4d1ee4c3d2e3d373bdd3f6aff78ba4298f97b4fad2740/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:308ac265c56f936636e3b0e3f59e059a40003c655228c131e1ad439957592303", size = 611911 }, + { url = "https://files.pythonhosted.org/packages/55/55/035838277d8c98fc8c917ac9beeb0cd6c59d675dc2421df5f9fcf44a0070/watchfiles-1.0.4-cp313-cp313-win32.whl", hash = "sha256:aee397456a29b492c20fda2d8961e1ffb266223625346ace14e4b6d861ba9c80", size = 271152 }, + { url = "https://files.pythonhosted.org/packages/f0/e5/96b8e55271685ddbadc50ce8bc53aa2dff278fb7ac4c2e473df890def2dc/watchfiles-1.0.4-cp313-cp313-win_amd64.whl", hash = "sha256:d6097538b0ae5c1b88c3b55afa245a66793a8fec7ada6755322e465fb1a0e8cc", size = 285216 }, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, +] + +[[package]] +name = "wrapt" +version = "1.17.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799 }, + { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821 }, + { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919 }, + { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721 }, + { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899 }, + { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222 }, + { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707 }, + { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685 }, + { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567 }, + { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672 }, + { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865 }, + { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 }, + { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 }, + { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 }, + { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 }, + { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 }, + { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174 }, + { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 }, + { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 }, + { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 }, + { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 }, + { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 }, + { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 }, + { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 }, + { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 }, + { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 }, + { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 }, + { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339 }, + { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 }, + { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 }, + { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 }, + { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 }, + { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 }, + { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, +] + +[[package]] +name = "wsproto" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/4a/44d3c295350d776427904d73c189e10aeae66d7f555bb2feee16d1e4ba5a/wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", size = 53425 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226 }, +] + +[[package]] +name = "yarl" +version = "1.18.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/9d/4b94a8e6d2b51b599516a5cb88e5bc99b4d8d4583e468057eaa29d5f0918/yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", size = 181062 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/85/bd2e2729752ff4c77338e0102914897512e92496375e079ce0150a6dc306/yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50", size = 142644 }, + { url = "https://files.pythonhosted.org/packages/ff/74/1178322cc0f10288d7eefa6e4a85d8d2e28187ccab13d5b844e8b5d7c88d/yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576", size = 94962 }, + { url = "https://files.pythonhosted.org/packages/be/75/79c6acc0261e2c2ae8a1c41cf12265e91628c8c58ae91f5ff59e29c0787f/yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640", size = 92795 }, + { url = "https://files.pythonhosted.org/packages/6b/32/927b2d67a412c31199e83fefdce6e645247b4fb164aa1ecb35a0f9eb2058/yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2", size = 332368 }, + { url = "https://files.pythonhosted.org/packages/19/e5/859fca07169d6eceeaa4fde1997c91d8abde4e9a7c018e371640c2da2b71/yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75", size = 342314 }, + { url = "https://files.pythonhosted.org/packages/08/75/76b63ccd91c9e03ab213ef27ae6add2e3400e77e5cdddf8ed2dbc36e3f21/yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512", size = 341987 }, + { url = "https://files.pythonhosted.org/packages/1a/e1/a097d5755d3ea8479a42856f51d97eeff7a3a7160593332d98f2709b3580/yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba", size = 336914 }, + { url = "https://files.pythonhosted.org/packages/0b/42/e1b4d0e396b7987feceebe565286c27bc085bf07d61a59508cdaf2d45e63/yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb", size = 325765 }, + { url = "https://files.pythonhosted.org/packages/7e/18/03a5834ccc9177f97ca1bbb245b93c13e58e8225276f01eedc4cc98ab820/yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272", size = 344444 }, + { url = "https://files.pythonhosted.org/packages/c8/03/a713633bdde0640b0472aa197b5b86e90fbc4c5bc05b727b714cd8a40e6d/yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6", size = 340760 }, + { url = "https://files.pythonhosted.org/packages/eb/99/f6567e3f3bbad8fd101886ea0276c68ecb86a2b58be0f64077396cd4b95e/yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e", size = 346484 }, + { url = "https://files.pythonhosted.org/packages/8e/a9/84717c896b2fc6cb15bd4eecd64e34a2f0a9fd6669e69170c73a8b46795a/yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb", size = 359864 }, + { url = "https://files.pythonhosted.org/packages/1e/2e/d0f5f1bef7ee93ed17e739ec8dbcb47794af891f7d165fa6014517b48169/yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393", size = 364537 }, + { url = "https://files.pythonhosted.org/packages/97/8a/568d07c5d4964da5b02621a517532adb8ec5ba181ad1687191fffeda0ab6/yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285", size = 357861 }, + { url = "https://files.pythonhosted.org/packages/7d/e3/924c3f64b6b3077889df9a1ece1ed8947e7b61b0a933f2ec93041990a677/yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2", size = 84097 }, + { url = "https://files.pythonhosted.org/packages/34/45/0e055320daaabfc169b21ff6174567b2c910c45617b0d79c68d7ab349b02/yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477", size = 90399 }, + { url = "https://files.pythonhosted.org/packages/30/c7/c790513d5328a8390be8f47be5d52e141f78b66c6c48f48d241ca6bd5265/yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb", size = 140789 }, + { url = "https://files.pythonhosted.org/packages/30/aa/a2f84e93554a578463e2edaaf2300faa61c8701f0898725842c704ba5444/yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa", size = 94144 }, + { url = "https://files.pythonhosted.org/packages/c6/fc/d68d8f83714b221a85ce7866832cba36d7c04a68fa6a960b908c2c84f325/yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782", size = 91974 }, + { url = "https://files.pythonhosted.org/packages/56/4e/d2563d8323a7e9a414b5b25341b3942af5902a2263d36d20fb17c40411e2/yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0", size = 333587 }, + { url = "https://files.pythonhosted.org/packages/25/c9/cfec0bc0cac8d054be223e9f2c7909d3e8442a856af9dbce7e3442a8ec8d/yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482", size = 344386 }, + { url = "https://files.pythonhosted.org/packages/ab/5d/4c532190113b25f1364d25f4c319322e86232d69175b91f27e3ebc2caf9a/yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186", size = 345421 }, + { url = "https://files.pythonhosted.org/packages/23/d1/6cdd1632da013aa6ba18cee4d750d953104a5e7aac44e249d9410a972bf5/yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58", size = 339384 }, + { url = "https://files.pythonhosted.org/packages/9a/c4/6b3c39bec352e441bd30f432cda6ba51681ab19bb8abe023f0d19777aad1/yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53", size = 326689 }, + { url = "https://files.pythonhosted.org/packages/23/30/07fb088f2eefdc0aa4fc1af4e3ca4eb1a3aadd1ce7d866d74c0f124e6a85/yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2", size = 345453 }, + { url = "https://files.pythonhosted.org/packages/63/09/d54befb48f9cd8eec43797f624ec37783a0266855f4930a91e3d5c7717f8/yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8", size = 341872 }, + { url = "https://files.pythonhosted.org/packages/91/26/fd0ef9bf29dd906a84b59f0cd1281e65b0c3e08c6aa94b57f7d11f593518/yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1", size = 347497 }, + { url = "https://files.pythonhosted.org/packages/d9/b5/14ac7a256d0511b2ac168d50d4b7d744aea1c1aa20c79f620d1059aab8b2/yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a", size = 359981 }, + { url = "https://files.pythonhosted.org/packages/ca/b3/d493221ad5cbd18bc07e642894030437e405e1413c4236dd5db6e46bcec9/yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10", size = 366229 }, + { url = "https://files.pythonhosted.org/packages/04/56/6a3e2a5d9152c56c346df9b8fb8edd2c8888b1e03f96324d457e5cf06d34/yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8", size = 360383 }, + { url = "https://files.pythonhosted.org/packages/fd/b7/4b3c7c7913a278d445cc6284e59b2e62fa25e72758f888b7a7a39eb8423f/yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d", size = 310152 }, + { url = "https://files.pythonhosted.org/packages/f5/d5/688db678e987c3e0fb17867970700b92603cadf36c56e5fb08f23e822a0c/yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c", size = 315723 }, + { url = "https://files.pythonhosted.org/packages/f5/4b/a06e0ec3d155924f77835ed2d167ebd3b211a7b0853da1cf8d8414d784ef/yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", size = 45109 }, +] + +[[package]] +name = "zipp" +version = "3.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 }, +] From b8f71e4afa8987db9e2e9af13a2264f61c6c1edb Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Thu, 6 Mar 2025 14:58:31 -0800 Subject: [PATCH 12/29] style: lint fix --- deploy/dynemo/sdk/src/dynemo/sdk/__init__.py | 1 + deploy/dynemo/sdk/src/dynemo/sdk/cli/cli.py | 1 + deploy/dynemo/sdk/src/dynemo/sdk/lib/dependency.py | 1 + deploy/dynemo/sdk/src/dynemo/sdk/lib/service.py | 1 + 4 files changed, 4 insertions(+) diff --git a/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py b/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py index 59153ffeb7c0..c3510abb2baa 100644 --- a/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py @@ -15,6 +15,7 @@ from bentoml import api from bentoml._internal.context import server_context + from dynemo.sdk.lib.decorators import async_onstart, dynemo_api, dynemo_endpoint from dynemo.sdk.lib.dependency import depends from dynemo.sdk.lib.image import DYNEMO_IMAGE diff --git a/deploy/dynemo/sdk/src/dynemo/sdk/cli/cli.py b/deploy/dynemo/sdk/src/dynemo/sdk/cli/cli.py index a80734fc0f97..db8b7cb4998d 100644 --- a/deploy/dynemo/sdk/src/dynemo/sdk/cli/cli.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/cli/cli.py @@ -34,6 +34,7 @@ def create_bentoml_cli() -> click.Command: from bentoml_cli.models import model_command from bentoml_cli.secret import secret_command from bentoml_cli.utils import BentoMLCommandGroup, get_entry_points + from dynemo.sdk.cli.serve import serve_command from dynemo.sdk.cli.start import start_command diff --git a/deploy/dynemo/sdk/src/dynemo/sdk/lib/dependency.py b/deploy/dynemo/sdk/src/dynemo/sdk/lib/dependency.py index cf27058d0807..aee4c060c1a1 100644 --- a/deploy/dynemo/sdk/src/dynemo/sdk/lib/dependency.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/lib/dependency.py @@ -18,6 +18,7 @@ from _bentoml_sdk.service import Service from _bentoml_sdk.service.dependency import Dependency + from dynemo.sdk.lib.service import CompoundService T = TypeVar("T") diff --git a/deploy/dynemo/sdk/src/dynemo/sdk/lib/service.py b/deploy/dynemo/sdk/src/dynemo/sdk/lib/service.py index f60902e08e02..c2d48ac3fe54 100644 --- a/deploy/dynemo/sdk/src/dynemo/sdk/lib/service.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/lib/service.py @@ -21,6 +21,7 @@ from _bentoml_sdk import Service, ServiceConfig from _bentoml_sdk.images import Image + from dynemo.sdk.lib.decorators import DynemoEndpoint T = TypeVar("T", bound=object) From a26de5f97bbe7dc239094512300d159154465407 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Thu, 6 Mar 2025 18:21:14 -0800 Subject: [PATCH 13/29] feat: rename compoundai to dyenmo.sdk --- .../python_rs/llm/vllm/sdk_basic_service/README.md | 2 +- .../python_rs/llm/vllm/sdk_basic_service/basic.py | 6 ++---- examples/python_rs/llm/vllm/sdk_kv_router/README.md | 2 +- examples/python_rs/llm/vllm/sdk_kv_router/frontend.py | 2 +- .../python_rs/llm/vllm/sdk_kv_router/processor.py | 6 +++--- examples/python_rs/llm/vllm/sdk_kv_router/router.py | 8 ++++---- examples/python_rs/llm/vllm/sdk_kv_router/worker.py | 11 +++++++---- 7 files changed, 19 insertions(+), 18 deletions(-) diff --git a/examples/python_rs/llm/vllm/sdk_basic_service/README.md b/examples/python_rs/llm/vllm/sdk_basic_service/README.md index 28df36289352..615fd02701ef 100644 --- a/examples/python_rs/llm/vllm/sdk_basic_service/README.md +++ b/examples/python_rs/llm/vllm/sdk_basic_service/README.md @@ -45,5 +45,5 @@ Launch all three services using a single command - ```bash cd /workspace/examples/python_rs/llm/vllm -compoundai serve sdk_basic_service.basic:Frontend +dynemo-sdk serve sdk_basic_service.basic:Frontend ``` diff --git a/examples/python_rs/llm/vllm/sdk_basic_service/basic.py b/examples/python_rs/llm/vllm/sdk_basic_service/basic.py index 0561926e8083..53ba90324b08 100644 --- a/examples/python_rs/llm/vllm/sdk_basic_service/basic.py +++ b/examples/python_rs/llm/vllm/sdk_basic_service/basic.py @@ -13,12 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -from compoundai import api -from compoundai.sdk.decorators import dynemo_endpoint -from compoundai.sdk.dependency import depends -from compoundai.sdk.service import service from pydantic import BaseModel +from dynemo.sdk import api, depends, dynemo_endpoint, service + """ Pipeline Architecture: diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/README.md b/examples/python_rs/llm/vllm/sdk_kv_router/README.md index 95e2ecf25b9d..3c008db337e5 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/README.md +++ b/examples/python_rs/llm/vllm/sdk_kv_router/README.md @@ -21,7 +21,7 @@ Run this example using command below cd /workspace/examples/python_rs/llm/vllm -compoundai serve sdk_kv_router.frontend:Frontend +dynemo-sdk serve sdk_kv_router.frontend:Frontend ``` diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py b/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py index 6b2f4d82a3fa..98f3af21ba44 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from compoundai import DYNEMO_IMAGE, api, depends, service +from dynemo.sdk import DYNEMO_IMAGE, api, depends, service from sdk_kv_router.processor import Processor diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/processor.py b/examples/python_rs/llm/vllm/sdk_kv_router/processor.py index 7d0d65ab2bd5..70d6f669a9b2 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/processor.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/processor.py @@ -29,13 +29,13 @@ from common.chat_processor import ChatProcessor, ProcessMixIn from common.protocol import MyRequestOutput, Tokens, vLLMGenerateRequest -from compoundai import depends, dynemo_context, dynemo_endpoint, service +from dynemo.sdk import depends, dynemo_context, dynemo_endpoint, service @service( dynemo={ "enabled": True, - "namespace": "triton-init", + "namespace": "dynemo", }, resources={"cpu": "10", "memory": "20Gi"}, workers=1, @@ -109,7 +109,7 @@ async def generate(self, raw_request: ChatCompletionRequest): worker_id = worker break runtime = dynemo_context["runtime"] - comp_ns, comp_name = VllmEngine.dynemo_address() + comp_ns, comp_name = VllmEngine.dynemo_address() # type: ignore worker_client = ( await runtime.namespace(comp_ns) .component(comp_name) diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/router.py b/examples/python_rs/llm/vllm/sdk_kv_router/router.py index ac7ce7c61f43..96c8594b44a8 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/router.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/router.py @@ -17,7 +17,7 @@ import bentoml from common.protocol import Tokens -from compoundai import async_onstart, dynemo_context, dynemo_endpoint, service +from dynemo.sdk import async_onstart, dynemo_context, dynemo_endpoint, service with bentoml.importing(): from dynemo.runtime import KvRouter @@ -35,7 +35,7 @@ class RoutingStrategy(Enum): @service( dynemo={ "enabled": True, - "namespace": "triton-init", + "namespace": "dynemo", }, resources={"cpu": "10", "memory": "20Gi"}, workers=1, @@ -54,7 +54,7 @@ def __init__(self): @async_onstart async def init_engine(self): workers_client = ( - await self.runtime.namespace("triton-init") + await self.runtime.namespace("dynemo") .component("VllmEngine") .endpoint("generate") .client() @@ -74,7 +74,7 @@ async def init_engine(self): ) await asyncio.sleep(5) - kv_listener = self.runtime.namespace("triton-init").component(self.model_name) + kv_listener = self.runtime.namespace("dynemo").component(self.model_name) await kv_listener.create_service() self.router = KvRouter(self.runtime, kv_listener) diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/worker.py b/examples/python_rs/llm/vllm/sdk_kv_router/worker.py index 45b1a9c771c5..61a051f53806 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/worker.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/worker.py @@ -15,6 +15,7 @@ import asyncio import os +from typing import Optional import bentoml @@ -24,8 +25,9 @@ from vllm.sampling_params import RequestOutputKind from common.base_engine import BaseVllmEngine from common.protocol import MyRequestOutput, vLLMGenerateRequest + from vllm.engine.multiprocessing.client import MQLLMEngineClient -from compoundai import ( +from dynemo.sdk import ( async_onstart, dynemo_context, dynemo_endpoint, @@ -43,7 +45,7 @@ @service( dynemo={ "enabled": True, - "namespace": "triton-init", + "namespace": "dynemo", }, resources={"gpu": 1, "cpu": "10", "memory": "20Gi"}, workers=1, @@ -64,11 +66,12 @@ def __init__(self): ) VLLM_WORKER_ID = dynemo_context["endpoints"][0].lease_id() os.environ["VLLM_WORKER_ID"] = str(VLLM_WORKER_ID) - os.environ["VLLM_KV_NAMESPACE"] = "triton-init" + os.environ["VLLM_KV_NAMESPACE"] = "dynemo" os.environ["VLLM_KV_COMPONENT"] = "vllm" vllm_logger.info(f"Generate endpoint ID: {VLLM_WORKER_ID}") os.environ["CUDA_VISIBLE_DEVICES"] = f"{server_context.worker_index - 1}" self.metrics_publisher = KvMetricsPublisher() + self.engine_client: Optional[MQLLMEngineClient] = None super().__init__(self.engine_args) async def create_metrics_publisher_endpoint(self): @@ -92,7 +95,7 @@ async def generate(self, request: vLLMGenerateRequest): # rust HTTP requires Delta streaming sampling_params.output_kind = RequestOutputKind.DELTA - async for response in self.engine_client.generate( + async for response in self.engine_client.generate( # type: ignore request.engine_prompt, sampling_params, request.request_id ): # MyRequestOutput takes care of serializing the response as From 4e0fd868814121f1c2b2cf837ab4bb13720e80e4 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Thu, 6 Mar 2025 18:22:03 -0800 Subject: [PATCH 14/29] feat: rename compoundai to dyenmo.sdk and fix mypy issues --- deploy/dynemo/sdk/src/dynemo/sdk/cli/serve.py | 2 +- deploy/dynemo/sdk/src/dynemo/sdk/cli/serve_dynemo.py | 5 ++--- deploy/dynemo/sdk/src/dynemo/sdk/cli/serving.py | 4 ++-- deploy/dynemo/sdk/src/dynemo/sdk/cli/start.py | 2 +- deploy/dynemo/sdk/src/dynemo/sdk/lib/__init__.py | 2 +- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve.py b/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve.py index 9ff9b58496f3..b9eb8342b5ef 100644 --- a/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve.py @@ -318,7 +318,7 @@ def serve( else: # bentoml>=1.2 # from _bentoml_impl.server import serve_http - from compoundai.cli.serving import serve_http # type: ignore + from dynemo.sdk.cli.serving import serve_http # type: ignore svc.inject_config() serve_http( diff --git a/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve_dynemo.py b/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve_dynemo.py index 1b49a10c5f29..3c1a7cf1a97e 100644 --- a/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve_dynemo.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve_dynemo.py @@ -26,11 +26,10 @@ from typing import Any import click -from compoundai import dynemo_context - +from dynemo.sdk import dynemo_context from dynemo.runtime import DistributedRuntime, dynemo_endpoint, dynemo_worker -logger = logging.getLogger("compoundai.serve.dynemo") +logger = logging.getLogger("dynemo.sdk.serve.dynemo") logger.setLevel(logging.INFO) diff --git a/deploy/dynemo/sdk/src/dynemo/sdk/cli/serving.py b/deploy/dynemo/sdk/src/dynemo/sdk/cli/serving.py index 2917a8a3e30a..66503df237a8 100644 --- a/deploy/dynemo/sdk/src/dynemo/sdk/cli/serving.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/cli/serving.py @@ -177,7 +177,7 @@ def create_dynemo_watcher( # Create Dynemo-specific worker args args = [ "-m", - "compoundai.cli.serve_dynemo", # Use our Dynemo worker module + "dynemo.sdk.cli.serve_dynemo", # Use our Dynemo worker module bento_identifier, "--service-name", svc.name, @@ -410,7 +410,7 @@ def serve_http( # Create Dynemo-specific watcher using existing socket args = [ "-m", - "compoundai.cli.serve_dynemo", # Use our Dynemo worker module + "dynemo.sdk.cli.serve_dynemo", # Use our Dynemo worker module bento_identifier, "--service-name", svc.name, diff --git a/deploy/dynemo/sdk/src/dynemo/sdk/cli/start.py b/deploy/dynemo/sdk/src/dynemo/sdk/cli/start.py index 69affec6f5da..da050ecc0e1b 100644 --- a/deploy/dynemo/sdk/src/dynemo/sdk/cli/start.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/cli/start.py @@ -238,7 +238,7 @@ def start( ) else: # for >=1.2 bentos - from compoundai.cli.serving import serve_http + from dynemo.sdk.cli.serving import serve_http print(f"Starting service {service_name}") svc.inject_config() diff --git a/deploy/dynemo/sdk/src/dynemo/sdk/lib/__init__.py b/deploy/dynemo/sdk/src/dynemo/sdk/lib/__init__.py index 6574c3dbe77b..8f5730a253af 100644 --- a/deploy/dynemo/sdk/src/dynemo/sdk/lib/__init__.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/lib/__init__.py @@ -15,4 +15,4 @@ def main() -> None: - print("Hello from compoundai!") + print("Hello from dyenmo sdk!") From 2ad1acf9edcae2c66847bfe47ef259e9e45f92dc Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Thu, 6 Mar 2025 18:36:06 -0800 Subject: [PATCH 15/29] feat: update pyproject and instructions --- .../python_rs/llm/vllm/sdk_basic_service/README.md | 14 +++++++++++++- pyproject.toml | 4 ++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/examples/python_rs/llm/vllm/sdk_basic_service/README.md b/examples/python_rs/llm/vllm/sdk_basic_service/README.md index 615fd02701ef..d7f2c8236afc 100644 --- a/examples/python_rs/llm/vllm/sdk_basic_service/README.md +++ b/examples/python_rs/llm/vllm/sdk_basic_service/README.md @@ -40,10 +40,22 @@ Users/Clients (HTTP) ## Unified serve -Launch all three services using a single command - +1. Launch all three services using a single command - ```bash cd /workspace/examples/python_rs/llm/vllm dynemo-sdk serve sdk_basic_service.basic:Frontend ``` + +2. Send request to frontend using curl - + +```bash +curl -X 'POST' \ + 'http://localhost:3000/generate' \ + -H 'accept: text/event-stream' \ + -H 'Content-Type: application/json' \ + -d '{ + "text": "test" +}' +``` \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 8f7d59edf4a9..cf6b840bbd21 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -138,3 +138,7 @@ check_untyped_defs = true # Skip mypy analysis on internal dependencies of vllm module = ["vllm.*"] follow_imports = "skip" + +# declare namespace packages +[tool.setuptools] +namespace-packages = ["dynemo", "dynemo.sdk"] From defc34121787eb29813218ddc179a492a524c13d Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Thu, 6 Mar 2025 18:40:47 -0800 Subject: [PATCH 16/29] style: lint --- deploy/dynemo/sdk/src/dynemo/sdk/cli/serve_dynemo.py | 3 ++- examples/python_rs/llm/vllm/sdk_kv_router/frontend.py | 3 ++- examples/python_rs/llm/vllm/sdk_kv_router/processor.py | 2 +- examples/python_rs/llm/vllm/sdk_kv_router/router.py | 1 + examples/python_rs/llm/vllm/sdk_kv_router/worker.py | 5 ++--- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve_dynemo.py b/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve_dynemo.py index 3c1a7cf1a97e..dd611e0c798d 100644 --- a/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve_dynemo.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/cli/serve_dynemo.py @@ -26,8 +26,9 @@ from typing import Any import click -from dynemo.sdk import dynemo_context + from dynemo.runtime import DistributedRuntime, dynemo_endpoint, dynemo_worker +from dynemo.sdk import dynemo_context logger = logging.getLogger("dynemo.sdk.serve.dynemo") logger.setLevel(logging.INFO) diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py b/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py index 98f3af21ba44..bbd585e609c3 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/frontend.py @@ -13,9 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -from dynemo.sdk import DYNEMO_IMAGE, api, depends, service from sdk_kv_router.processor import Processor +from dynemo.sdk import DYNEMO_IMAGE, api, depends, service + @service(traffic={"timeout": 10000}, image=DYNEMO_IMAGE) class Frontend: diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/processor.py b/examples/python_rs/llm/vllm/sdk_kv_router/processor.py index 70d6f669a9b2..9600f6e32282 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/processor.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/processor.py @@ -109,7 +109,7 @@ async def generate(self, raw_request: ChatCompletionRequest): worker_id = worker break runtime = dynemo_context["runtime"] - comp_ns, comp_name = VllmEngine.dynemo_address() # type: ignore + comp_ns, comp_name = VllmEngine.dynemo_address() # type: ignore worker_client = ( await runtime.namespace(comp_ns) .component(comp_name) diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/router.py b/examples/python_rs/llm/vllm/sdk_kv_router/router.py index 96c8594b44a8..3c4c17f9b536 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/router.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/router.py @@ -17,6 +17,7 @@ import bentoml from common.protocol import Tokens + from dynemo.sdk import async_onstart, dynemo_context, dynemo_endpoint, service with bentoml.importing(): diff --git a/examples/python_rs/llm/vllm/sdk_kv_router/worker.py b/examples/python_rs/llm/vllm/sdk_kv_router/worker.py index 61a051f53806..f7d90966b4b3 100644 --- a/examples/python_rs/llm/vllm/sdk_kv_router/worker.py +++ b/examples/python_rs/llm/vllm/sdk_kv_router/worker.py @@ -27,6 +27,7 @@ from common.protocol import MyRequestOutput, vLLMGenerateRequest from vllm.engine.multiprocessing.client import MQLLMEngineClient +from dynemo.llm import KvMetricsPublisher from dynemo.sdk import ( async_onstart, dynemo_context, @@ -35,8 +36,6 @@ service, ) -from dynemo.llm import KvMetricsPublisher - lease_id = None ## TODO: metrics_publisher.create_endpoint(worker_component), @@ -95,7 +94,7 @@ async def generate(self, request: vLLMGenerateRequest): # rust HTTP requires Delta streaming sampling_params.output_kind = RequestOutputKind.DELTA - async for response in self.engine_client.generate( # type: ignore + async for response in self.engine_client.generate( # type: ignore request.engine_prompt, sampling_params, request.request_id ): # MyRequestOutput takes care of serializing the response as From cc71998508458e3dcbfb4c68b35a7d6096634b09 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Thu, 6 Mar 2025 21:49:15 -0800 Subject: [PATCH 17/29] fix skip mypy analysis on deps of bentoml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index cf6b840bbd21..832a00a25a11 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -136,7 +136,7 @@ check_untyped_defs = true [[tool.mypy.overrides]] # Skip mypy analysis on internal dependencies of vllm -module = ["vllm.*"] +module = ["vllm.*", "bentoml.*"] follow_imports = "skip" # declare namespace packages From a75f736e6a18d1e0cd35a11fa58fe5535d251a3f Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Thu, 6 Mar 2025 22:38:03 -0800 Subject: [PATCH 18/29] fix: install dynemo sdk in docker image as well --- container/Dockerfile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/container/Dockerfile b/container/Dockerfile index 25041c48eabc..e196335cd432 100644 --- a/container/Dockerfile +++ b/container/Dockerfile @@ -165,7 +165,9 @@ RUN mkdir /opt/dynemo && \ uv venv /opt/dynemo/venv --python 3.12 && \ source /opt/dynemo/venv/bin/activate && \ uv build --wheel --out-dir /workspace/dist && \ - uv pip install /workspace/dist/dynemo*cp312*.whl + uv pip install /workspace/dist/dynemo*cp312*.whl && \ + cd /workspace/deploy/dynemo/sdk && \ + uv build --wheel --out-dir /workspace/dist # Package the bindings RUN mkdir -p /opt/dynemo/bindings/wheels && \ @@ -177,7 +179,8 @@ RUN mkdir -p /opt/dynemo/bindings/wheels && \ # Install dynemo.runtime and dynemo.llm wheels globally in container for tests that # currently run without virtual environment activated. # TODO: In future, we may use a virtualenv for everything and remove this. -RUN pip install /opt/dynemo/bindings/wheels/dynemo*cp312*.whl +RUN cd /opt/dynemo/bindings/wheels && \ + pip install dynemo*cp312*.whl dynemo_sdk*any.whl # Copy everything in after ginstall steps to avoid re-running build/install # commands on unrelated changes in other dirs. From cc5f13a9c744a64784671fc2915e44a8b2abd8fa Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Fri, 7 Mar 2025 01:01:46 -0800 Subject: [PATCH 19/29] fix: container build --- container/Dockerfile | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/container/Dockerfile b/container/Dockerfile index e196335cd432..35c214205a29 100644 --- a/container/Dockerfile +++ b/container/Dockerfile @@ -154,6 +154,9 @@ RUN cd examples/rust && \ cp target/release/http /usr/local/bin/ && \ cp target/release/llmctl /usr/local/bin/ +COPY deploy/dynemo/sdk /workspace/deploy/dynemo/sdk + + # Generate C bindings. Note that this is required for TRTLLM backend re-build COPY lib/bindings /workspace/lib/bindings RUN cd lib/bindings/c/ && \ @@ -167,7 +170,8 @@ RUN mkdir /opt/dynemo && \ uv build --wheel --out-dir /workspace/dist && \ uv pip install /workspace/dist/dynemo*cp312*.whl && \ cd /workspace/deploy/dynemo/sdk && \ - uv build --wheel --out-dir /workspace/dist + uv build --wheel --out-dir /workspace/dist && \ + uv pip install /workspace/dist/dynemo_sdk*any.whl # Package the bindings RUN mkdir -p /opt/dynemo/bindings/wheels && \ @@ -180,7 +184,8 @@ RUN mkdir -p /opt/dynemo/bindings/wheels && \ # currently run without virtual environment activated. # TODO: In future, we may use a virtualenv for everything and remove this. RUN cd /opt/dynemo/bindings/wheels && \ - pip install dynemo*cp312*.whl dynemo_sdk*any.whl + pip install dynemo*cp312*.whl && \ + pip install /workspace/dist/dynemo_sdk*any.whl # Copy everything in after ginstall steps to avoid re-running build/install # commands on unrelated changes in other dirs. From 62e755b2842db2aff9f7a40d19f698faeb4662a0 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Fri, 7 Mar 2025 09:30:35 -0800 Subject: [PATCH 20/29] fix: ignore bentoml inspections --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1acad6b4c373..6bcbeea17114 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -134,8 +134,9 @@ check_untyped_defs = true [[tool.mypy.overrides]] # Skip mypy analysis on internal dependencies of vllm -module = ["vllm.*", "bentoml.*"] +module = ["vllm.*", "bentoml.*", "fs.*", "_bentoml_sdk.*"] follow_imports = "skip" +ignore_missing_imports = true # declare namespace packages [tool.setuptools] From 7f275aef0e1caac0b020a430d384feb097a26232 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Fri, 7 Mar 2025 09:31:24 -0800 Subject: [PATCH 21/29] fix: mypy --- container/Dockerfile.vllm | 3 --- container/Dockerfile.vllm_nixl | 5 +---- deploy/dynemo/sdk/src/dynemo/sdk/__init__.py | 4 ++-- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/container/Dockerfile.vllm b/container/Dockerfile.vllm index d07a67ec435c..d27db0674aff 100644 --- a/container/Dockerfile.vllm +++ b/container/Dockerfile.vllm @@ -118,9 +118,6 @@ ENV VLLM_KV_CAPI_PATH="/opt/dynemo/bindings/lib/libdynemo_llm_capi.so" # FIXME: Copy more specific folders in for dev/debug after directory restructure COPY . /workspace -RUN source /opt/dynemo/venv/bin/activate && \ - cd /workspace/deploy/dynemo/sdk && \ - uv pip install -e . # FIXME: May want a modification with dynemo-distributed banner on entry ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"] diff --git a/container/Dockerfile.vllm_nixl b/container/Dockerfile.vllm_nixl index f8991e4de766..70f915a89ae1 100644 --- a/container/Dockerfile.vllm_nixl +++ b/container/Dockerfile.vllm_nixl @@ -247,10 +247,7 @@ ENV VLLM_KV_CAPI_PATH="/opt/dynemo/bindings/lib/libdynemo_llm_capi.so" # FIXME: Copy more specific folders in for dev/debug after directory restructure COPY . /workspace -# Install dynemo sdk for local dev and cluster deployment -RUN source /opt/dynemo/venv/bin/activate && \ - cd /workspace/deploy/dynemo/sdk && \ - uv pip install -e . + # FIXME: May want a modification with dynemo-distributed banner on entry ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"] diff --git a/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py b/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py index c3510abb2baa..6fe2114e9e2e 100644 --- a/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py @@ -13,8 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -from bentoml import api -from bentoml._internal.context import server_context +from bentoml import api # type: ignore +from bentoml._internal.context import server_context # type: ignore from dynemo.sdk.lib.decorators import async_onstart, dynemo_api, dynemo_endpoint from dynemo.sdk.lib.dependency import depends From d0cd7346fd7fb6ab98884d353916a96e482b598e Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Fri, 7 Mar 2025 09:55:11 -0800 Subject: [PATCH 22/29] fix: mypy --- container/Dockerfile.vllm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/container/Dockerfile.vllm b/container/Dockerfile.vllm index d27db0674aff..d0cd1ed23799 100644 --- a/container/Dockerfile.vllm +++ b/container/Dockerfile.vllm @@ -100,10 +100,14 @@ COPY lib/bindings /workspace/lib/bindings RUN cd lib/bindings/c && \ cargo build --release --locked && cargo doc --no-deps +COPY deploy/dynemo/sdk /workspace/deploy/dynemo/sdk # Build dynemo wheel RUN source /opt/dynemo/venv/bin/activate && \ uv build --wheel --out-dir /workspace/dist && \ - uv pip install /workspace/dist/dynemo*cp312*.whl + uv pip install /workspace/dist/dynemo*cp312*.whl && \ + cd /workspace/deploy/dynemo/sdk && \ + uv build --wheel --out-dir /workspace/dist && \ + uv pip install /workspace/dist/dynemo_sdk*any.whl # Package the bindings RUN mkdir -p /opt/dynemo/bindings/wheels && \ @@ -118,7 +122,6 @@ ENV VLLM_KV_CAPI_PATH="/opt/dynemo/bindings/lib/libdynemo_llm_capi.so" # FIXME: Copy more specific folders in for dev/debug after directory restructure COPY . /workspace - # FIXME: May want a modification with dynemo-distributed banner on entry ENTRYPOINT ["/opt/nvidia/nvidia_entrypoint.sh"] From a2501ac05070c71269b428279e2acf4d1179d4f8 Mon Sep 17 00:00:00 2001 From: nnshah1 Date: Fri, 7 Mar 2025 11:45:27 -0800 Subject: [PATCH 23/29] ignore pending and deprecation warning for select packages --- pyproject.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 6bcbeea17114..b3361b67fb8a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -95,7 +95,11 @@ xfail_strict = true log_cli_level = "INFO" filterwarnings = [ "error", + "ignore:.*pkg_resources.*:DeprecationWarning", + "ignore:.*multipart.*:PendingDeprecationWarning" ] + + # NOTE: Can also manually mark tests with @pytest.mark.asyncio asyncio_mode = "auto" markers = [ From 2bf87f4b6b94793c485a8b304a5c2a2a369f494c Mon Sep 17 00:00:00 2001 From: nnshah1 Date: Fri, 7 Mar 2025 11:50:59 -0800 Subject: [PATCH 24/29] update for mypy --- deploy/dynemo/sdk/src/dynemo/sdk/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py b/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py index afb9149a309f..e63ce50d53c2 100644 --- a/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/__init__.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +from typing import Any + from bentoml import api # type: ignore from bentoml._internal.context import server_context # type: ignore @@ -21,7 +23,7 @@ from dynemo.sdk.lib.image import DYNEMO_IMAGE from dynemo.sdk.lib.service import service -dynemo_context = {} +dynemo_context: dict[str, Any] = {} __all__ = [ "api", From 050ff0f537b51b3a6af6add80e369ea24952a653 Mon Sep 17 00:00:00 2001 From: nnshah1 Date: Fri, 7 Mar 2025 12:05:59 -0800 Subject: [PATCH 25/29] update with optional to capture none case --- deploy/dynemo/sdk/src/dynemo/sdk/lib/service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/dynemo/sdk/src/dynemo/sdk/lib/service.py b/deploy/dynemo/sdk/src/dynemo/sdk/lib/service.py index c2d48ac3fe54..b08d98acbe85 100644 --- a/deploy/dynemo/sdk/src/dynemo/sdk/lib/service.py +++ b/deploy/dynemo/sdk/src/dynemo/sdk/lib/service.py @@ -69,7 +69,7 @@ def is_dynemo_component(self) -> bool: """Check if this service is configured as a Dynemo component""" return self._dynemo_config.enabled - def dynemo_address(self) -> Tuple[str, str]: + def dynemo_address(self) -> Tuple[Optional[str], Optional[str]]: """Get the Dynemo address for this component in namespace/name format""" if not self.is_dynemo_component(): raise ValueError("Service is not configured as a Dynemo component") From fce5d7b426a371f97baaed95aea3a6334b5b2ba9 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Fri, 7 Mar 2025 12:27:12 -0800 Subject: [PATCH 26/29] test: add types library stub for PyYAML --- container/deps/requirements.test.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/container/deps/requirements.test.txt b/container/deps/requirements.test.txt index 7872e91db6f6..30ec86f3d0cc 100644 --- a/container/deps/requirements.test.txt +++ b/container/deps/requirements.test.txt @@ -21,3 +21,5 @@ pytest-cov pytest-md-report pytest-mypy pytest-timeout +# add types library stub for PyYAML +types-PyYAML \ No newline at end of file From bca0e9209624446a49aaf5fbfe9a00d4cf371024 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Fri, 7 Mar 2025 12:32:35 -0800 Subject: [PATCH 27/29] test: add types library stub for PyYAML --- container/deps/requirements.test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container/deps/requirements.test.txt b/container/deps/requirements.test.txt index 30ec86f3d0cc..c3a57fb0a78c 100644 --- a/container/deps/requirements.test.txt +++ b/container/deps/requirements.test.txt @@ -22,4 +22,4 @@ pytest-md-report pytest-mypy pytest-timeout # add types library stub for PyYAML -types-PyYAML \ No newline at end of file +types-PyYAML From dd704cf9da83d02d9d15169c71755fb10df9ddf9 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Fri, 7 Mar 2025 12:42:25 -0800 Subject: [PATCH 28/29] fix: update downstream ci pipeline --- Earthfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Earthfile b/Earthfile index dfb488c8bd66..c416e7dfa0c4 100644 --- a/Earthfile +++ b/Earthfile @@ -26,17 +26,17 @@ golang-base: ############### ALL TARGETS ############################## all-test: - BUILD ./deploy/compoundai/operator+test -# BUILD ./deploy/compoundai/api-server+test #TODO: mkhadkevich earthly tests fail https://gitlab-master.nvidia.com/aire/microservices/compoundai/-/jobs/144475821 + BUILD ./deploy/dynemo/operator+test +# BUILD ./deploy/dynemo/api-server+test #TODO: mkhadkevich earthly tests fail https://gitlab-master.nvidia.com/aire/microservices/compoundai/-/jobs/144475821 all-docker: ARG CI_REGISTRY_IMAGE=my-registry ARG CI_COMMIT_SHA=latest - BUILD ./deploy/compoundai/operator+docker --CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE --CI_COMMIT_SHA=$CI_COMMIT_SHA - BUILD ./deploy/compoundai/api-server+docker --CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE --CI_COMMIT_SHA=$CI_COMMIT_SHA + BUILD ./deploy/dynemo/operator+docker --CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE --CI_COMMIT_SHA=$CI_COMMIT_SHA + BUILD ./deploy/dynemo/api-server+docker --CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE --CI_COMMIT_SHA=$CI_COMMIT_SHA all-lint: - BUILD ./deploy/compoundai/operator+lint + BUILD ./deploy/dynemo/operator+lint all: BUILD +all-test From 4615dcbc127b08a3406d6e57b656e5d6496e7379 Mon Sep 17 00:00:00 2001 From: Biswa Panda Date: Fri, 7 Mar 2025 13:07:50 -0800 Subject: [PATCH 29/29] fix: vllm nixl image --- container/Dockerfile.vllm_nixl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/container/Dockerfile.vllm_nixl b/container/Dockerfile.vllm_nixl index 70f915a89ae1..ae922768626b 100644 --- a/container/Dockerfile.vllm_nixl +++ b/container/Dockerfile.vllm_nixl @@ -230,10 +230,14 @@ COPY lib/bindings /workspace/lib/bindings RUN cd lib/bindings/c && \ cargo build --release --locked && cargo doc --no-deps +COPY deploy/dynemo/sdk /workspace/deploy/dynemo/sdk # Build dynemo wheel RUN source /opt/dynemo/venv/bin/activate && \ uv build --wheel --out-dir /workspace/dist && \ - uv pip install /workspace/dist/dynemo*cp312*.whl + uv pip install /workspace/dist/dynemo*cp312*.whl && \ + cd /workspace/deploy/dynemo/sdk && \ + uv build --wheel --out-dir /workspace/dist && \ + uv pip install /workspace/dist/dynemo_sdk*any.whl # Package the bindings RUN mkdir -p /opt/dynemo/bindings/wheels && \