diff --git a/.flake-modules/just-flake.nix b/.flake-modules/just-flake.nix deleted file mode 100644 index 2208a58c..00000000 --- a/.flake-modules/just-flake.nix +++ /dev/null @@ -1,54 +0,0 @@ -# Provides pretty banner & command index for this flake - -# Top-level parameters that are bound to the provider flake -# These are passed from `flake.nix` using importApply -{ - localSelf, - flake-parts-lib, - nixpkgs-lib, - just-flake, - ... -}: - -# These values would bind to the consumer flake when this flake module is imported: -{ - config, - self, - inputs, - getSystem, - moduleWithSystem, - withSystem, - ... -}: - -# The actual flake-parts module configuration -{ - imports = [ just-flake.flakeModule ]; - perSystem = - { - config, - self', - inputs', - pkgs, - system, - ... - }: - { - just-flake.features = { - # treefmt.enable = true; - # rust.enable = true; - # convco.enable = true; - # hello = { - # enable = true; - # justfile = '' - # hello: - # echo Hello World - # ''; - # }; - }; - - make-shells.default = { - inputsFrom = [ config.just-flake.outputs.devShell ]; - }; - }; -} diff --git a/engines/mlx/main.py b/engines/mlx/main.py deleted file mode 100644 index a4f37c5b..00000000 --- a/engines/mlx/main.py +++ /dev/null @@ -1,6 +0,0 @@ -def main(): - print("Hello from mlx!") - - -if __name__ == "__main__": - main() diff --git a/engines/mlx/pyproject.toml b/engines/mlx/pyproject.toml deleted file mode 100644 index 35487320..00000000 --- a/engines/mlx/pyproject.toml +++ /dev/null @@ -1,24 +0,0 @@ -[project] -name = "exo-engine-mlx" -version = "0.1.0" -description = "MLX inference backend for the Exo project" -readme = "README.md" -requires-python = ">=3.13" -dependencies = [] - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.hatch.build] -clean = true - -[tool.hatch.build.targets.wheel] -packages = [] -include = ["*"] -exclude = ["*.md", "pyproject.toml"] - -[tool.hatch.build.targets.sdist] -packages = [] -include = ["*"] -exclude = ["*.md", "pyproject.toml"] \ No newline at end of file diff --git a/flake.lock b/flake.lock index 7e9d54e3..35e1853d 100644 --- a/flake.lock +++ b/flake.lock @@ -23,11 +23,11 @@ ] }, "locked": { - "lastModified": 1754420989, - "narHash": "sha256-3e4wHzNwTMg7GaeLH9A091DMaO9AfFxUjpfqbddCUeo=", + "lastModified": 1754487366, + "narHash": "sha256-pHYj8gUBapuUzKV/kN/tR3Zvqc7o6gdFB9XKXIp1SQ8=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "7f38f25a44023a21a504bd3fd9d4f41c4a39f55c", + "rev": "af66ad14b28a127c5c0f3bbb298218fc63528a18", "type": "github" }, "original": { @@ -51,21 +51,6 @@ "type": "github" } }, - "just-flake": { - "locked": { - "lastModified": 1713316411, - "narHash": "sha256-NkJfU6H+6vgHkPtZ2ESbZ/h2wnsDQrZvB4vbdUIBx8Q=", - "owner": "juspay", - "repo": "just-flake", - "rev": "0e33952a4bcd16cd54ee3aba8111606c237d4526", - "type": "github" - }, - "original": { - "owner": "juspay", - "repo": "just-flake", - "type": "github" - } - }, "make-shell": { "inputs": { "flake-compat": "flake-compat" @@ -86,11 +71,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1753939845, - "narHash": "sha256-K2ViRJfdVGE8tpJejs8Qpvvejks1+A4GQej/lBk5y7I=", + "lastModified": 1755615617, + "narHash": "sha256-HMwfAJBdrr8wXAkbGhtcby1zGFvs+StOp19xNsbqdOg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "94def634a20494ee057c76998843c015909d6311", + "rev": "20075955deac2583bb12f07151c2df830ef346b4", "type": "github" }, "original": { @@ -104,7 +89,6 @@ "inputs": { "flake-parts": "flake-parts", "flake-root": "flake-root", - "just-flake": "just-flake", "make-shell": "make-shell", "nixpkgs": "nixpkgs" } diff --git a/flake.nix b/flake.nix index fd3f2c31..17253618 100644 --- a/flake.nix +++ b/flake.nix @@ -17,9 +17,6 @@ # 1. ${lib.getExe config.flake-root.package} # 2. $FLAKE_ROOT environment-varible flake-root.url = "github:srid/flake-root"; - - # Provides flake integration with [Just](https://just.systems/man/en/) - just-flake.url = "github:juspay/just-flake"; }; outputs = @@ -50,9 +47,6 @@ # instantiate all the flake modules, passing custom arguments to them as needed flakeModules = { flakeRoot = importApply' ./.flake-modules/flake-root.nix { inherit (inputs) flake-root; }; - justFlake = importApply' ./.flake-modules/just-flake.nix { - inherit (inputs) just-flake; - }; goForwarder = importApply' ./.flake-modules/go-forwarder.nix { }; }; in @@ -60,7 +54,6 @@ imports = [ inputs.make-shell.flakeModules.default flakeModules.flakeRoot - flakeModules.justFlake flakeModules.goForwarder ./.flake-modules/macmon.nix ]; @@ -121,6 +114,11 @@ LD_LIBRARY_PATH = "${pkgs.stdenv.cc.cc.lib}/lib"; }; + shellHook = '' + export GO_BUILD_DIR=$(git rev-parse --show-toplevel)/build; + export DASHBOARD_DIR=$(git rev-parse --show-toplevel)/dashboard; + ''; + # Arbitrary mkDerivation arguments should be changed to be attributes of the `additionalArguments` option additionalArguments = { }; }; diff --git a/justfile b/justfile index 35ebb3e3..4265a568 100644 --- a/justfile +++ b/justfile @@ -1,18 +1,6 @@ -# See flake.nix (just-flake) -import "just-flake.just" - default: @just --list -regenerate-protobufs: - #!/usr/bin/env bash - if [ -f shared/protobufs/schemas/*.proto ]; then - protoc --proto_path=shared/protobufs/schemas --python_out=shared/protobufs/types --pyi_out=shared/protobufs/types shared/protobufs/schemas/*.proto - uv run ruff format ./shared/protobufs/types - else - echo "No .proto files found in shared/protobufs/schemas/" - fi - fmt: uv run ruff format master worker shared engines/* @@ -37,15 +25,13 @@ sync: sync-clean: uv sync --all-packages --force-reinstall --no-cache -protobufs: - just regenerate-protobufs - -build: regenerate-protobufs +build: uv build --all-packages # Build the Go forwarder binary build-forwarder: - HASH=$(uv run scripts/hashdir.py) && cd networking/forwarder && go build -buildvcs=false -o ../../build/forwarder -ldflags "-X 'main.SourceHash=${HASH}'" . + HASH=$(uv run scripts/hashdir.py) && go build -C networking/forwarder -buildvcs=false -o $GO_BUILD_DIR/forwarder -ldflags "-X 'main.SourceHash=${HASH}'" + chmod 0755 $GO_BUILD_DIR/forwarder # Run forwarder tests test-forwarder: @@ -61,4 +47,4 @@ run n="1" clean="false": for i in $(seq 2 "{{n}}"); do \ if [ "{{clean}}" = "true" ]; then ./run.sh -rc; else ./run.sh -r; fi; \ done; \ - fi \ No newline at end of file + fi diff --git a/master/pyproject.toml b/master/pyproject.toml deleted file mode 100644 index d1343631..00000000 --- a/master/pyproject.toml +++ /dev/null @@ -1,28 +0,0 @@ -[project] -name = "exo-master" -version = "0.1.0" -description = "Master service for the Exo project" -readme = "README.md" -requires-python = ">=3.13" -dependencies = [ - "exo-shared", - "fastapi>=0.116.0", - "uvicorn>=0.35.0", -] - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.hatch.build] -clean = true - -[tool.hatch.build.targets.wheel] -packages = [] -include = ["*"] -exclude = ["*.md", "pyproject.toml"] - -[tool.hatch.build.targets.sdist] -packages = [] -include = ["*"] -exclude = ["*.md", "pyproject.toml"] diff --git a/pyproject.toml b/pyproject.toml index 8a696e0f..20f8b5b6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,15 +7,36 @@ requires-python = ">=3.13" dependencies = [ "aiofiles>=24.1.0", "aiohttp>=3.12.14", - "exo-master", - "exo-worker", "types-aiofiles>=24.1.0.20250708", "typeguard>=4.4.4", "pydantic>=2.11.7", "base58>=2.1.1", "cryptography>=45.0.5", + "fastapi>=0.116.1", + "uvicorn>=0.35.0", + "filelock>=3.18.0", + "aiosqlite>=0.21.0", + "networkx>=3.5", + "openai>=1.99.9", + "pathlib>=1.0.1", + "protobuf>=6.32.0", + "rich>=14.1.0", + "rustworkx>=0.17.1", + "sqlmodel>=0.0.24", + "sqlalchemy[asyncio]>=2.0.43", + "greenlet>=3.2.4", + "huggingface-hub>=0.33.4", + "mlx==0.26.3", + "mlx-lm @ https://github.com/ml-explore/mlx-lm.git", + "psutil>=7.0.0", + "transformers>=4.55.2", ] +[project.scripts] +exo-master = "exo.master.main:main" +exo-worker = "exo.worker.main:main" +#exo = "exo.main:main" + # dependencies only required for development [dependency-groups] dev = [ @@ -36,33 +57,12 @@ darwin = [ [tool.uv.workspace] members = [ - "master", - "worker", - "shared", - "engines/*", - "scripts" + "scripts", ] -[tool.uv.sources] -exo-shared = { workspace = true } -exo-master = { workspace = true } -exo-worker = { workspace = true } -exo-engine-mlx = { workspace = true } - [build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.hatch.build] -clean = true - -[tool.hatch.build.targets.wheel] -packages = [] -only-include = ["pyproject.toml", "README.md"] - -[tool.hatch.build.targets.sdist] -packages = [] -only-include = ["pyproject.toml", "README.md"] +requires = ["uv_build>=0.8.9,<0.9.0"] +build-backend = "uv_build" ### # type-checker configuration @@ -81,15 +81,9 @@ reportInvalidCast = "error" reportUnnecessaryCast = "error" reportUnnecessaryTypeIgnoreComment = "error" -include = ["master", "worker", "shared", "engines/*"] pythonVersion = "3.13" pythonPlatform = "Darwin" -stubPath = "shared/protobufs/types" -ignore = [ - "shared/protobufs/types/**/*", -] - ### # uv configuration ### diff --git a/scripts/pyproject.toml b/scripts/pyproject.toml index 7bf304a2..8d10af64 100644 --- a/scripts/pyproject.toml +++ b/scripts/pyproject.toml @@ -5,26 +5,10 @@ description = "Scripts for the Exo project" readme = "README.md" requires-python = ">=3.13" dependencies = [ - "exo-shared", + "shared", "huggingface_hub>=0.33.4", ] [build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.hatch.metadata] -allow-direct-references = true - -[tool.hatch.build] -clean = true - -[tool.hatch.build.targets.wheel] -packages = [] -include = ["*"] -exclude = ["*.md", "pyproject.toml"] - -[tool.hatch.build.targets.sdist] -packages = [] -include = ["*"] -exclude = ["*.md", "pyproject.toml"] +requires = ["uv_build>=0.8.9,<0.9.0"] +build-backend = "uv_build" diff --git a/worker/__init__.py b/scripts/src/exo_scripts/__init__.py similarity index 100% rename from worker/__init__.py rename to scripts/src/exo_scripts/__init__.py diff --git a/scripts/read_events.py b/scripts/src/exo_scripts/read_events.py similarity index 98% rename from scripts/read_events.py rename to scripts/src/exo_scripts/read_events.py index 2187306f..f8da5679 100644 --- a/scripts/read_events.py +++ b/scripts/src/exo_scripts/read_events.py @@ -8,11 +8,11 @@ import sys from logging import Logger from typing import List, Optional, Any, Sequence, Tuple -from shared.types.state import State -from shared.apply import apply -from shared.db.sqlite.event_log_manager import EventLogManager, EventLogConfig -from shared.types.events.components import EventFromEventLog -from shared.types.events import Event +from exo.shared.types.state import State +from exo.shared.apply import apply +from exo.shared.db.sqlite.event_log_manager import EventLogManager, EventLogConfig +from exo.shared.types.events.components import EventFromEventLog +from exo.shared.types.events import Event # Globals logger: Logger = Logger('helper_log') diff --git a/scripts/test_download.py b/scripts/src/exo_scripts/test_download.py similarity index 74% rename from scripts/test_download.py rename to scripts/src/exo_scripts/test_download.py index 12c91b64..4a09a104 100644 --- a/scripts/test_download.py +++ b/scripts/src/exo_scripts/test_download.py @@ -1,4 +1,4 @@ -from worker.download.download_utils import * +from exo.worker.download.download_utils import * async def main(): meta = await file_meta( diff --git a/shared/protobufs/types/.gitkeep b/shared/protobufs/types/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/shared/protobufs/types/mlx/nn/__init__.pyi b/shared/protobufs/types/mlx/nn/__init__.pyi deleted file mode 100644 index 464c4f1a..00000000 --- a/shared/protobufs/types/mlx/nn/__init__.pyi +++ /dev/null @@ -1,3 +0,0 @@ -from mlx.nn.layers import * -from mlx.nn import init as init, losses as losses -from mlx.nn.utils import average_gradients as average_gradients, value_and_grad as value_and_grad \ No newline at end of file diff --git a/shared/pyproject.toml b/shared/pyproject.toml deleted file mode 100644 index 6df028ca..00000000 --- a/shared/pyproject.toml +++ /dev/null @@ -1,51 +0,0 @@ -[project] -name = "exo-shared" -version = "0.1.0" -description = "Shared utilities for the Exo project" -readme = "README.md" -requires-python = ">=3.13" -dependencies = [ - "filelock>=3.18.0", - "aiosqlite>=0.20.0", - "networkx>=3.5", - "openai>=1.93.0", - "pathlib>=1.0.1", - "protobuf>=6.31.1", - "pydantic>=2.11.7", - "rich>=14.0.0", - "rustworkx>=0.16.0", - "sqlmodel>=0.0.22", - "sqlalchemy[asyncio]>=2.0.0", - "greenlet>=3.2.3", - "cryptography>=44.0.0", - "base58>=2.1.1", -] - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.hatch.build] -clean = true - -[tool.hatch.build.targets.wheel] -packages = [] -include = ["*"] -exclude = ["protobufs/schemas", "*.md", "pyproject.toml"] - -[tool.hatch.build.targets.sdist] -packages = [] -include = ["*"] -exclude = ["protobufs/schemas", "*.md", "pyproject.toml"] - -[dependency-groups] -dev = [ - "types-protobuf>=6.30.2.20250516", - "pytest>=8.4.0", - "pytest-asyncio>=1.0.0", -] - -[tool.pytest.ini_options] -log_cli = true -log_cli_level = "INFO" -asyncio_mode = "auto" diff --git a/worker/tests/test_handlers/__init__.py b/src/exo/__init__.py similarity index 100% rename from worker/tests/test_handlers/__init__.py rename to src/exo/__init__.py diff --git a/worker/tests/test_integration/__init__.py b/src/exo/engines/mlx/__init__.py similarity index 100% rename from worker/tests/test_integration/__init__.py rename to src/exo/engines/mlx/__init__.py diff --git a/engines/mlx/auto_parallel.py b/src/exo/engines/mlx/auto_parallel.py similarity index 98% rename from engines/mlx/auto_parallel.py rename to src/exo/engines/mlx/auto_parallel.py index a75d356e..83598a7a 100644 --- a/engines/mlx/auto_parallel.py +++ b/src/exo/engines/mlx/auto_parallel.py @@ -3,7 +3,7 @@ from typing import Protocol, cast, override import mlx.core as mx import mlx.nn as nn -from shared.types.worker.shards import PipelineShardMetadata +from exo.shared.types.worker.shards import PipelineShardMetadata class IdentityLayer(nn.Module): diff --git a/engines/mlx/utils_mlx.py b/src/exo/engines/mlx/utils_mlx.py similarity index 93% rename from engines/mlx/utils_mlx.py rename to src/exo/engines/mlx/utils_mlx.py index 43a5f1a4..c21c8c92 100644 --- a/engines/mlx/utils_mlx.py +++ b/src/exo/engines/mlx/utils_mlx.py @@ -13,13 +13,13 @@ from mlx_lm.tokenizer_utils import TokenizerWrapper, load_tokenizer # type: ign from mlx_lm.utils import load_model # type: ignore from pydantic import RootModel -from engines.mlx.auto_parallel import auto_parallel -from shared.types.api import ChatCompletionMessage -from shared.types.common import Host -from shared.types.tasks import ChatCompletionTaskParams -from shared.types.worker.shards import ShardMetadata -from worker.download.download_utils import build_model_path -from worker.runner.communication import runner_print +from exo.engines.mlx.auto_parallel import auto_parallel +from exo.shared.types.api import ChatCompletionMessage +from exo.shared.types.common import Host +from exo.shared.types.tasks import ChatCompletionTaskParams +from exo.shared.types.worker.shards import ShardMetadata +from exo.worker.download.download_utils import build_model_path +from exo.worker.runner.communication import runner_print # Needed for 8 bit model resource.setrlimit(resource.RLIMIT_NOFILE, (2048, 4096)) diff --git a/src/exo/main.py b/src/exo/main.py new file mode 100644 index 00000000..708a6a64 --- /dev/null +++ b/src/exo/main.py @@ -0,0 +1,2 @@ +def main(): + print("Hello world!") diff --git a/engines/mlx/README.md b/src/exo/master/__init__.py similarity index 100% rename from engines/mlx/README.md rename to src/exo/master/__init__.py diff --git a/master/api.py b/src/exo/master/api.py similarity index 90% rename from master/api.py rename to src/exo/master/api.py index 60250bae..207983f3 100644 --- a/master/api.py +++ b/src/exo/master/api.py @@ -1,7 +1,7 @@ import asyncio import time from collections.abc import AsyncGenerator -from pathlib import Path +import os from typing import Callable, List, Sequence, final import uvicorn @@ -10,10 +10,10 @@ from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import StreamingResponse from fastapi.staticfiles import StaticFiles -from shared.db.sqlite.connector import AsyncSQLiteEventStorage -from shared.models.model_cards import MODEL_CARDS -from shared.models.model_meta import get_model_meta -from shared.types.api import ( +from exo.shared.db.sqlite.connector import AsyncSQLiteEventStorage +from exo.shared.models.model_cards import MODEL_CARDS +from exo.shared.models.model_meta import get_model_meta +from exo.shared.types.api import ( ChatCompletionMessage, ChatCompletionResponse, CreateInstanceResponse, @@ -23,10 +23,10 @@ from shared.types.api import ( ModelListModel, StreamingChoiceResponse, ) -from shared.types.common import CommandId -from shared.types.events import ChunkGenerated, Event -from shared.types.events.chunks import TokenChunk -from shared.types.events.commands import ( +from exo.shared.types.common import CommandId +from exo.shared.types.events import ChunkGenerated, Event +from exo.shared.types.events.chunks import TokenChunk +from exo.shared.types.events.commands import ( ChatCompletionCommand, Command, CommandType, @@ -34,17 +34,12 @@ from shared.types.events.commands import ( DeleteInstanceCommand, TaskFinishedCommand, ) -from shared.types.events.components import EventFromEventLog -from shared.types.models import ModelMetadata -from shared.types.state import State -from shared.types.tasks import ChatCompletionTaskParams -from shared.types.worker.common import InstanceId -from shared.types.worker.instances import Instance - -# TODO: Make sure that when we package the app the dashboard is in the right place. -_ROOT_DIR = Path(__file__).resolve().parents[1] -_DASHBOARD_DIR = _ROOT_DIR / "dashboard" - +from exo.shared.types.events.components import EventFromEventLog +from exo.shared.types.models import ModelMetadata +from exo.shared.types.state import State +from exo.shared.types.tasks import ChatCompletionTaskParams +from exo.shared.types.worker.common import InstanceId +from exo.shared.types.worker.instances import Instance def chunk_to_response(chunk: TokenChunk) -> ChatCompletionResponse: return ChatCompletionResponse( @@ -81,7 +76,7 @@ class API: self._setup_cors() self._setup_routes() - self._app.mount("/", StaticFiles(directory=_DASHBOARD_DIR, html=True), name="dashboard") + self._app.mount("/", StaticFiles(directory=os.environ["DASHBOARD_DIR"], html=True), name="dashboard") def _setup_cors(self) -> None: self._app.add_middleware( diff --git a/master/election_callback.py b/src/exo/master/election_callback.py similarity index 89% rename from master/election_callback.py rename to src/exo/master/election_callback.py index a3cba9b4..61e7c7e6 100644 --- a/master/election_callback.py +++ b/src/exo/master/election_callback.py @@ -1,6 +1,6 @@ from logging import Logger -from master.forwarder_supervisor import ForwarderRole, ForwarderSupervisor +from exo.master.forwarder_supervisor import ForwarderRole, ForwarderSupervisor class ElectionCallbacks: diff --git a/master/env.py b/src/exo/master/env.py similarity index 86% rename from master/env.py rename to src/exo/master/env.py index a63914c2..3b703d93 100644 --- a/master/env.py +++ b/src/exo/master/env.py @@ -1,6 +1,6 @@ from pathlib import Path -from shared.env import BaseEnv +from exo.shared.env import BaseEnv class MasterEnvironmentSchema(BaseEnv): diff --git a/master/forwarder_supervisor.py b/src/exo/master/forwarder_supervisor.py similarity index 98% rename from master/forwarder_supervisor.py rename to src/exo/master/forwarder_supervisor.py index 4e7fa918..a8f5bba1 100644 --- a/master/forwarder_supervisor.py +++ b/src/exo/master/forwarder_supervisor.py @@ -5,13 +5,13 @@ from enum import Enum from logging import Logger from pathlib import Path -from shared.constants import ( +from exo.shared.constants import ( EXO_GLOBAL_EVENT_DB, EXO_WORKER_EVENT_DB, LIBP2P_GLOBAL_EVENTS_TOPIC, LIBP2P_WORKER_EVENTS_TOPIC, ) -from shared.types.common import NodeId +from exo.shared.types.common import NodeId class ForwarderRole(str, Enum): diff --git a/master/main.py b/src/exo/master/main.py similarity index 89% rename from master/main.py rename to src/exo/master/main.py index 9bb4551e..6c1fc038 100644 --- a/master/main.py +++ b/src/exo/master/main.py @@ -6,16 +6,16 @@ import traceback from pathlib import Path from typing import List -from master.api import start_fastapi_server -from master.election_callback import ElectionCallbacks -from master.forwarder_supervisor import ForwarderRole, ForwarderSupervisor -from master.placement import get_instance_placements, get_transition_events -from shared.apply import apply -from shared.db.sqlite.config import EventLogConfig -from shared.db.sqlite.connector import AsyncSQLiteEventStorage -from shared.db.sqlite.event_log_manager import EventLogManager -from shared.types.common import CommandId, NodeId -from shared.types.events import ( +from exo.master.api import start_fastapi_server +from exo.master.election_callback import ElectionCallbacks +from exo.master.forwarder_supervisor import ForwarderRole, ForwarderSupervisor +from exo.master.placement import get_instance_placements, get_transition_events +from exo.shared.apply import apply +from exo.shared.db.sqlite.config import EventLogConfig +from exo.shared.db.sqlite.connector import AsyncSQLiteEventStorage +from exo.shared.db.sqlite.event_log_manager import EventLogManager +from exo.shared.types.common import CommandId, NodeId +from exo.shared.types.events import ( Event, Heartbeat, InstanceDeleted, @@ -24,17 +24,17 @@ from shared.types.events import ( TopologyEdgeDeleted, TopologyNodeCreated, ) -from shared.types.events.commands import ( +from exo.shared.types.events.commands import ( ChatCompletionCommand, Command, CreateInstanceCommand, DeleteInstanceCommand, TaskFinishedCommand, ) -from shared.types.state import State -from shared.types.tasks import ChatCompletionTask, TaskId, TaskStatus, TaskType -from shared.types.worker.instances import Instance -from shared.utils import Keypair, get_node_id_keypair +from exo.shared.types.state import State +from exo.shared.types.tasks import ChatCompletionTask, TaskId, TaskStatus, TaskType +from exo.shared.types.worker.instances import Instance +from exo.shared.utils import Keypair, get_node_id_keypair class Master: @@ -176,7 +176,7 @@ class Master: await asyncio.sleep(0.1) -async def main(): +async def async_main(): logger = logging.getLogger('master_logger') logger.setLevel(logging.INFO) if not logger.handlers: @@ -211,9 +211,11 @@ async def main(): logger.info('Running FastAPI server in a separate thread. Listening on port 8000.') master = Master(node_id_keypair, node_id, command_buffer, global_events, worker_events, - Path("./build/forwarder"), logger) + Path(os.environ["GO_BUILD_DIR"])/"forwarder", logger) await master.run() +def main(): + asyncio.run(async_main()) if __name__ == "__main__": - asyncio.run(main()) + main() diff --git a/master/placement.py b/src/exo/master/placement.py similarity index 74% rename from master/placement.py rename to src/exo/master/placement.py index ed25cc2a..e047cfa0 100644 --- a/master/placement.py +++ b/src/exo/master/placement.py @@ -1,34 +1,26 @@ -import json import random from collections.abc import Mapping from copy import deepcopy from functools import singledispatch from typing import Sequence -from master.utils.placement_utils import ( +from exo.master.utils.placement_utils import ( filter_cycles_by_memory, get_hosts_from_subgraph, get_shard_assignments, get_smallest_cycles, ) -from shared.topology import Topology -from shared.types.common import Host, NodeId -from shared.types.events import Event, InstanceCreated, InstanceDeleted -from shared.types.events.commands import CreateInstanceCommand, DeleteInstanceCommand -from shared.types.worker.common import InstanceId -from shared.types.worker.instances import Instance, InstanceStatus +from exo.shared.topology import Topology +from exo.shared.types.common import Host +from exo.shared.types.events import Event, InstanceCreated, InstanceDeleted +from exo.shared.types.events.commands import CreateInstanceCommand, DeleteInstanceCommand +from exo.shared.types.worker.common import InstanceId +from exo.shared.types.worker.instances import Instance, InstanceStatus def random_ephemeral_port() -> int: return random.randint(49152, 65535) -DEVICE_ORDERING: list[str] = [] -with open('nodes.json', ('r')) as f: - device_json: list[str] = json.load(f) # type: ignore - for device in device_json: - DEVICE_ORDERING.append(NodeId(device)) -assert len(DEVICE_ORDERING) == 4 - @singledispatch def get_instance_placements( command: CreateInstanceCommand, @@ -61,20 +53,7 @@ def get_instance_placements( if topology.get_subgraph_from_nodes(cycle).is_thunderbolt_cycle(cycle) ] - nodes_01, nodes_23 = None, None - for cycle in smallest_cycles: - cycle_ids = [x.node_id for x in cycle] - if nodes_01 is None and set(cycle_ids) == set(DEVICE_ORDERING[:2]): - nodes_01= cycle - if nodes_23 is None and set(cycle_ids) == set(DEVICE_ORDERING[2:]): - nodes_23= cycle - - if nodes_01: - selected_cycle = nodes_01 - elif nodes_23: - selected_cycle = nodes_23 - else: - selected_cycle = max(smallest_cycles, key=lambda cycle: sum(node.node_profile.memory.ram_available for node in cycle if node.node_profile is not None)) + selected_cycle = max(smallest_cycles, key=lambda cycle: sum(node.node_profile.memory.ram_available for node in cycle if node.node_profile is not None)) shard_assignments = get_shard_assignments(command.model_meta, selected_cycle) diff --git a/master/tests/api_utils_test.py b/src/exo/master/tests/api_utils_test.py similarity index 97% rename from master/tests/api_utils_test.py rename to src/exo/master/tests/api_utils_test.py index a51622d1..0b3a666a 100644 --- a/master/tests/api_utils_test.py +++ b/src/exo/master/tests/api_utils_test.py @@ -19,7 +19,7 @@ from openai.types.chat import ( ) from openai.types.chat.chat_completion_chunk import ChatCompletionChunk, Choice -from master.main import main as master_main +from exo.master.main import async_main as master_main _P = ParamSpec("_P") _R = TypeVar("_R") diff --git a/master/tests/conftest.py b/src/exo/master/tests/conftest.py similarity index 88% rename from master/tests/conftest.py rename to src/exo/master/tests/conftest.py index bc1a3b75..f951d802 100644 --- a/master/tests/conftest.py +++ b/src/exo/master/tests/conftest.py @@ -1,13 +1,13 @@ import pytest -from shared.types.common import NodeId -from shared.types.multiaddr import Multiaddr -from shared.types.profiling import ( +from exo.shared.types.common import NodeId +from exo.shared.types.multiaddr import Multiaddr +from exo.shared.types.profiling import ( MemoryPerformanceProfile, NodePerformanceProfile, SystemPerformanceProfile, ) -from shared.types.topology import Connection, ConnectionProfile, Node +from exo.shared.types.topology import Connection, ConnectionProfile, Node @pytest.fixture diff --git a/master/tests/test_api.py b/src/exo/master/tests/test_api.py similarity index 96% rename from master/tests/test_api.py rename to src/exo/master/tests/test_api.py index 61375e20..a0867c3a 100644 --- a/master/tests/test_api.py +++ b/src/exo/master/tests/test_api.py @@ -2,7 +2,7 @@ import asyncio import pytest -from master.tests.api_utils_test import ( +from exo.master.tests.api_utils_test import ( ChatMessage, stream_chatgpt_response, with_master_main, diff --git a/master/tests/test_forwarder_supervisor.py b/src/exo/master/tests/test_forwarder_supervisor.py similarity index 98% rename from master/tests/test_forwarder_supervisor.py rename to src/exo/master/tests/test_forwarder_supervisor.py index c9413c52..295f6039 100644 --- a/master/tests/test_forwarder_supervisor.py +++ b/src/exo/master/tests/test_forwarder_supervisor.py @@ -13,18 +13,18 @@ from unittest.mock import AsyncMock, MagicMock import pytest import pytest_asyncio -from master.election_callback import ElectionCallbacks -from master.forwarder_supervisor import ( +from exo.master.election_callback import ElectionCallbacks +from exo.master.forwarder_supervisor import ( ForwarderRole, ForwarderSupervisor, ) -from shared.constants import ( +from exo.shared.constants import ( EXO_GLOBAL_EVENT_DB, EXO_WORKER_EVENT_DB, LIBP2P_GLOBAL_EVENTS_TOPIC, LIBP2P_WORKER_EVENTS_TOPIC, ) -from shared.types.common import NodeId +from exo.shared.types.common import NodeId # Mock forwarder script content MOCK_FORWARDER_SCRIPT = '''#!/usr/bin/env python3 diff --git a/master/tests/test_master.py b/src/exo/master/tests/test_master.py similarity index 85% rename from master/tests/test_master.py rename to src/exo/master/tests/test_master.py index 6e3f9731..fa32c7f3 100644 --- a/master/tests/test_master.py +++ b/src/exo/master/tests/test_master.py @@ -6,35 +6,35 @@ from typing import List, Sequence import pytest -from master.main import Master -from shared.db.sqlite.config import EventLogConfig -from shared.db.sqlite.connector import AsyncSQLiteEventStorage -from shared.db.sqlite.event_log_manager import EventLogManager -from shared.types.api import ChatCompletionMessage, ChatCompletionTaskParams -from shared.types.common import NodeId -from shared.types.events import Event, EventFromEventLog, Heartbeat, TaskCreated -from shared.types.events._events import ( +from exo.master.main import Master +from exo.shared.db.sqlite.config import EventLogConfig +from exo.shared.db.sqlite.connector import AsyncSQLiteEventStorage +from exo.shared.db.sqlite.event_log_manager import EventLogManager +from exo.shared.types.api import ChatCompletionMessage, ChatCompletionTaskParams +from exo.shared.types.common import NodeId +from exo.shared.types.events import Event, EventFromEventLog, Heartbeat, TaskCreated +from exo.shared.types.events._events import ( InstanceCreated, NodePerformanceMeasured, TopologyNodeCreated, ) -from shared.types.events.commands import ( +from exo.shared.types.events.commands import ( ChatCompletionCommand, Command, CommandId, CreateInstanceCommand, ) -from shared.types.models import ModelMetadata -from shared.types.profiling import ( +from exo.shared.types.models import ModelMetadata +from exo.shared.types.profiling import ( MemoryPerformanceProfile, NodePerformanceProfile, SystemPerformanceProfile, ) -from shared.types.tasks import ChatCompletionTask, TaskStatus, TaskType -from shared.types.worker.common import InstanceId -from shared.types.worker.instances import Instance, InstanceStatus, ShardAssignments -from shared.types.worker.shards import PartitionStrategy, PipelineShardMetadata -from shared.utils import Keypair +from exo.shared.types.tasks import ChatCompletionTask, TaskStatus, TaskType +from exo.shared.types.worker.common import InstanceId +from exo.shared.types.worker.instances import Instance, InstanceStatus, ShardAssignments +from exo.shared.types.worker.shards import PartitionStrategy, PipelineShardMetadata +from exo.shared.utils import Keypair def _create_forwarder_dummy_binary() -> Path: diff --git a/master/tests/test_placement.py b/src/exo/master/tests/test_placement.py similarity index 92% rename from master/tests/test_placement.py rename to src/exo/master/tests/test_placement.py index d12e986c..c901498d 100644 --- a/master/tests/test_placement.py +++ b/src/exo/master/tests/test_placement.py @@ -2,18 +2,18 @@ from typing import Callable import pytest -from master.placement import get_instance_placements, get_transition_events -from shared.topology import Topology -from shared.types.common import CommandId, NodeId -from shared.types.events._events import ( +from exo.master.placement import get_instance_placements, get_transition_events +from exo.shared.topology import Topology +from exo.shared.types.common import CommandId, NodeId +from exo.shared.types.events._events import ( _EventType, # pyright: ignore[reportPrivateUsage] ) -from shared.types.events.commands import CreateInstanceCommand -from shared.types.models import ModelMetadata -from shared.types.topology import Connection, Node -from shared.types.worker.common import InstanceId -from shared.types.worker.instances import Instance, InstanceStatus -from shared.types.worker.runners import ShardAssignments +from exo.shared.types.events.commands import CreateInstanceCommand +from exo.shared.types.models import ModelMetadata +from exo.shared.types.topology import Connection, Node +from exo.shared.types.worker.common import InstanceId +from exo.shared.types.worker.instances import Instance, InstanceStatus +from exo.shared.types.worker.runners import ShardAssignments @pytest.fixture diff --git a/master/tests/test_placement_utils.py b/src/exo/master/tests/test_placement_utils.py similarity index 96% rename from master/tests/test_placement_utils.py rename to src/exo/master/tests/test_placement_utils.py index 646aa994..2e505779 100644 --- a/master/tests/test_placement_utils.py +++ b/src/exo/master/tests/test_placement_utils.py @@ -3,16 +3,16 @@ from typing import Callable import pytest -from master.utils.placement_utils import ( +from exo.master.utils.placement_utils import ( filter_cycles_by_memory, get_hosts_from_subgraph, get_shard_assignments, get_smallest_cycles, ) -from shared.topology import Topology -from shared.types.common import Host, NodeId -from shared.types.models import ModelMetadata -from shared.types.topology import Connection, Node +from exo.shared.topology import Topology +from exo.shared.types.common import Host, NodeId +from exo.shared.types.models import ModelMetadata +from exo.shared.types.topology import Connection, Node @pytest.fixture diff --git a/master/tests/test_topology.py b/src/exo/master/tests/test_topology.py similarity index 97% rename from master/tests/test_topology.py rename to src/exo/master/tests/test_topology.py index 9172adbb..32624723 100644 --- a/master/tests/test_topology.py +++ b/src/exo/master/tests/test_topology.py @@ -1,13 +1,13 @@ import pytest -from shared.topology import Topology -from shared.types.multiaddr import Multiaddr -from shared.types.profiling import ( +from exo.shared.topology import Topology +from exo.shared.types.multiaddr import Multiaddr +from exo.shared.types.profiling import ( MemoryPerformanceProfile, NodePerformanceProfile, SystemPerformanceProfile, ) -from shared.types.topology import Connection, ConnectionProfile, Node, NodeId +from exo.shared.types.topology import Connection, ConnectionProfile, Node, NodeId @pytest.fixture diff --git a/master/utils/placement_utils.py b/src/exo/master/utils/placement_utils.py similarity index 88% rename from master/utils/placement_utils.py rename to src/exo/master/utils/placement_utils.py index 29d041a4..86cf14d2 100644 --- a/master/utils/placement_utils.py +++ b/src/exo/master/utils/placement_utils.py @@ -2,14 +2,14 @@ from typing import TypeGuard, cast from pydantic import BaseModel -from shared.topology import Topology -from shared.types.common import Host, NodeId -from shared.types.models import ModelMetadata -from shared.types.profiling import NodePerformanceProfile -from shared.types.topology import Node -from shared.types.worker.common import RunnerId -from shared.types.worker.runners import ShardAssignments -from shared.types.worker.shards import PipelineShardMetadata +from exo.shared.topology import Topology +from exo.shared.types.common import Host, NodeId +from exo.shared.types.models import ModelMetadata +from exo.shared.types.profiling import NodePerformanceProfile +from exo.shared.types.topology import Node +from exo.shared.types.worker.common import RunnerId +from exo.shared.types.worker.runners import ShardAssignments +from exo.shared.types.worker.shards import PipelineShardMetadata class NodeWithProfile(BaseModel): diff --git a/shared/__init__.py b/src/exo/shared/__init__.py similarity index 100% rename from shared/__init__.py rename to src/exo/shared/__init__.py diff --git a/shared/apply/__init__.py b/src/exo/shared/apply/__init__.py similarity index 100% rename from shared/apply/__init__.py rename to src/exo/shared/apply/__init__.py diff --git a/shared/apply/apply.py b/src/exo/shared/apply/apply.py similarity index 93% rename from shared/apply/apply.py rename to src/exo/shared/apply/apply.py index 1201027c..134ce3c8 100644 --- a/shared/apply/apply.py +++ b/src/exo/shared/apply/apply.py @@ -4,8 +4,8 @@ import copy from functools import singledispatch from typing import Mapping -from shared.types.common import NodeId -from shared.types.events import ( +from exo.shared.types.common import NodeId +from exo.shared.types.events import ( Event, EventFromEventLog, InstanceActivated, @@ -26,13 +26,13 @@ from shared.types.events import ( TopologyNodeCreated, WorkerStatusUpdated, ) -from shared.types.profiling import NodePerformanceProfile -from shared.types.state import State -from shared.types.tasks import Task, TaskId, TaskStatus -from shared.types.topology import Connection, Node -from shared.types.worker.common import NodeStatus, RunnerId -from shared.types.worker.instances import Instance, InstanceId, InstanceStatus -from shared.types.worker.runners import RunnerStatus +from exo.shared.types.profiling import NodePerformanceProfile +from exo.shared.types.state import State +from exo.shared.types.tasks import Task, TaskId, TaskStatus +from exo.shared.types.topology import Connection, Node +from exo.shared.types.worker.common import NodeStatus, RunnerId +from exo.shared.types.worker.instances import Instance, InstanceId, InstanceStatus +from exo.shared.types.worker.runners import RunnerStatus @singledispatch diff --git a/shared/constants.py b/src/exo/shared/constants.py similarity index 100% rename from shared/constants.py rename to src/exo/shared/constants.py diff --git a/shared/db/__init__.py b/src/exo/shared/db/__init__.py similarity index 100% rename from shared/db/__init__.py rename to src/exo/shared/db/__init__.py diff --git a/shared/db/sqlite/__init__.py b/src/exo/shared/db/sqlite/__init__.py similarity index 100% rename from shared/db/sqlite/__init__.py rename to src/exo/shared/db/sqlite/__init__.py diff --git a/shared/db/sqlite/config.py b/src/exo/shared/db/sqlite/config.py similarity index 85% rename from shared/db/sqlite/config.py rename to src/exo/shared/db/sqlite/config.py index 1294eb6d..dda4753a 100644 --- a/shared/db/sqlite/config.py +++ b/src/exo/shared/db/sqlite/config.py @@ -3,7 +3,7 @@ from pathlib import Path from pydantic import BaseModel -from shared.constants import EXO_GLOBAL_EVENT_DB, EXO_WORKER_EVENT_DB +from exo.shared.constants import EXO_GLOBAL_EVENT_DB, EXO_WORKER_EVENT_DB class EventLogType(str, Enum): diff --git a/shared/db/sqlite/connector.py b/src/exo/shared/db/sqlite/connector.py similarity index 98% rename from shared/db/sqlite/connector.py rename to src/exo/shared/db/sqlite/connector.py index df328367..e5b9793d 100644 --- a/shared/db/sqlite/connector.py +++ b/src/exo/shared/db/sqlite/connector.py @@ -12,9 +12,9 @@ from sqlalchemy import text from sqlalchemy.exc import OperationalError from sqlalchemy.ext.asyncio import AsyncConnection, AsyncSession, create_async_engine -from shared.types.events import Event, EventParser, NodeId -from shared.types.events._events import Heartbeat -from shared.types.events.components import EventFromEventLog +from exo.shared.types.events import Event, EventParser, NodeId +from exo.shared.types.events._events import Heartbeat +from exo.shared.types.events.components import EventFromEventLog from .types import StoredEvent diff --git a/shared/db/sqlite/event_log_manager.py b/src/exo/shared/db/sqlite/event_log_manager.py similarity index 95% rename from shared/db/sqlite/event_log_manager.py rename to src/exo/shared/db/sqlite/event_log_manager.py index a35b0d24..bf09c44c 100644 --- a/shared/db/sqlite/event_log_manager.py +++ b/src/exo/shared/db/sqlite/event_log_manager.py @@ -4,9 +4,9 @@ from typing import Dict, Optional, cast from sqlalchemy.exc import OperationalError -from shared.constants import EXO_HOME -from shared.db.sqlite.config import EventLogConfig, EventLogType -from shared.db.sqlite.connector import AsyncSQLiteEventStorage +from exo.shared.constants import EXO_HOME +from exo.shared.db.sqlite.config import EventLogConfig, EventLogType +from exo.shared.db.sqlite.connector import AsyncSQLiteEventStorage class EventLogManager: diff --git a/shared/db/sqlite/types.py b/src/exo/shared/db/sqlite/types.py similarity index 91% rename from shared/db/sqlite/types.py rename to src/exo/shared/db/sqlite/types.py index 262fe4a7..3a1cf48e 100644 --- a/shared/db/sqlite/types.py +++ b/src/exo/shared/db/sqlite/types.py @@ -4,9 +4,9 @@ from typing import Any, Protocol, Sequence from sqlalchemy import DateTime, Index from sqlmodel import JSON, Column, Field, SQLModel -from shared.types.common import NodeId -from shared.types.events import Event -from shared.types.events.components import EventFromEventLog +from exo.shared.types.common import NodeId +from exo.shared.types.events import Event +from exo.shared.types.events.components import EventFromEventLog class StoredEvent(SQLModel, table=True): diff --git a/shared/env.py b/src/exo/shared/env.py similarity index 100% rename from shared/env.py rename to src/exo/shared/env.py diff --git a/shared/logging/common.py b/src/exo/shared/logging/common.py similarity index 100% rename from shared/logging/common.py rename to src/exo/shared/logging/common.py diff --git a/shared/models/model_cards.py b/src/exo/shared/models/model_cards.py similarity index 99% rename from shared/models/model_cards.py rename to src/exo/shared/models/model_cards.py index 62165ee1..a61d2ecd 100644 --- a/shared/models/model_cards.py +++ b/src/exo/shared/models/model_cards.py @@ -2,7 +2,7 @@ from typing import List from pydantic import BaseModel -from shared.types.models import ModelMetadata +from exo.shared.types.models import ModelMetadata class ModelCard(BaseModel): diff --git a/shared/models/model_meta.py b/src/exo/shared/models/model_meta.py similarity index 97% rename from shared/models/model_meta.py rename to src/exo/shared/models/model_meta.py index 5d422329..57532053 100644 --- a/shared/models/model_meta.py +++ b/src/exo/shared/models/model_meta.py @@ -5,8 +5,8 @@ import aiofiles.os as aios from huggingface_hub import model_info from pydantic import BaseModel, Field -from shared.types.models import ModelMetadata -from worker.download.download_utils import ( +from exo.shared.types.models import ModelMetadata +from exo.worker.download.download_utils import ( ModelSafetensorsIndex, download_file_with_retry, ensure_models_dir, diff --git a/shared/openai_compat.py b/src/exo/shared/openai_compat.py similarity index 100% rename from shared/openai_compat.py rename to src/exo/shared/openai_compat.py diff --git a/shared/tests/__init__.py b/src/exo/shared/tests/__init__.py similarity index 100% rename from shared/tests/__init__.py rename to src/exo/shared/tests/__init__.py diff --git a/shared/tests/conftest.py b/src/exo/shared/tests/conftest.py similarity index 100% rename from shared/tests/conftest.py rename to src/exo/shared/tests/conftest.py diff --git a/shared/tests/test_node_id_persistence.py b/src/exo/shared/tests/test_node_id_persistence.py similarity index 96% rename from shared/tests/test_node_id_persistence.py rename to src/exo/shared/tests/test_node_id_persistence.py index 6417e416..1f41cf99 100644 --- a/shared/tests/test_node_id_persistence.py +++ b/src/exo/shared/tests/test_node_id_persistence.py @@ -13,8 +13,8 @@ from typing import Optional from pytest import LogCaptureFixture -from shared.constants import EXO_NODE_ID_KEYPAIR -from shared.utils import get_node_id_keypair +from exo.shared.constants import EXO_NODE_ID_KEYPAIR +from exo.shared.utils import get_node_id_keypair NUM_CONCURRENT_PROCS = 10 diff --git a/shared/tests/test_sqlite_connector.py b/src/exo/shared/tests/test_sqlite_connector.py similarity index 98% rename from shared/tests/test_sqlite_connector.py rename to src/exo/shared/tests/test_sqlite_connector.py index 5963cc8e..30979e5c 100644 --- a/shared/tests/test_sqlite_connector.py +++ b/src/exo/shared/tests/test_sqlite_connector.py @@ -9,10 +9,10 @@ import pytest from sqlalchemy import text from sqlalchemy.ext.asyncio import AsyncSession -from shared.db.sqlite import AsyncSQLiteEventStorage, EventLogConfig -from shared.types.common import CommandId, NodeId -from shared.types.events import ChunkGenerated -from shared.types.events.chunks import ChunkType, TokenChunk +from exo.shared.db.sqlite import AsyncSQLiteEventStorage, EventLogConfig +from exo.shared.types.common import CommandId, NodeId +from exo.shared.types.events import ChunkGenerated +from exo.shared.types.events.chunks import ChunkType, TokenChunk # Type ignore comment for all protected member access in this test file # pyright: reportPrivateUsage=false diff --git a/shared/tests/test_state_serialization.py b/src/exo/shared/tests/test_state_serialization.py similarity index 83% rename from shared/tests/test_state_serialization.py rename to src/exo/shared/tests/test_state_serialization.py index 35d42c1e..2497c437 100644 --- a/shared/tests/test_state_serialization.py +++ b/src/exo/shared/tests/test_state_serialization.py @@ -1,9 +1,9 @@ from __future__ import annotations -from shared.types.common import NodeId -from shared.types.multiaddr import Multiaddr -from shared.types.state import State -from shared.types.topology import Connection +from exo.shared.types.common import NodeId +from exo.shared.types.multiaddr import Multiaddr +from exo.shared.types.state import State +from exo.shared.types.topology import Connection def test_state_serialization_roundtrip() -> None: diff --git a/shared/topology.py b/src/exo/shared/topology.py similarity index 97% rename from shared/topology.py rename to src/exo/shared/topology.py index e9185ce6..9322c721 100644 --- a/shared/topology.py +++ b/src/exo/shared/topology.py @@ -4,10 +4,10 @@ from typing import Iterable import rustworkx as rx from pydantic import BaseModel, ConfigDict -from shared.types.common import NodeId -from shared.types.multiaddr import Multiaddr -from shared.types.profiling import ConnectionProfile, NodePerformanceProfile -from shared.types.topology import Connection, Node, TopologyProto +from exo.shared.types.common import NodeId +from exo.shared.types.multiaddr import Multiaddr +from exo.shared.types.profiling import ConnectionProfile, NodePerformanceProfile +from exo.shared.types.topology import Connection, Node, TopologyProto class TopologySnapshot(BaseModel): diff --git a/shared/types/api.py b/src/exo/shared/types/api.py similarity index 94% rename from shared/types/api.py rename to src/exo/shared/types/api.py index a166866d..fc05d160 100644 --- a/shared/types/api.py +++ b/src/exo/shared/types/api.py @@ -3,10 +3,10 @@ from typing import Any, List, Literal from pydantic import BaseModel, Field -from shared.openai_compat import FinishReason -from shared.types.common import CommandId -from shared.types.models import ModelMetadata -from shared.types.worker.instances import InstanceId +from exo.shared.openai_compat import FinishReason +from exo.shared.types.common import CommandId +from exo.shared.types.models import ModelMetadata +from exo.shared.types.worker.instances import InstanceId class ModelListModel(BaseModel): diff --git a/shared/types/common.py b/src/exo/shared/types/common.py similarity index 100% rename from shared/types/common.py rename to src/exo/shared/types/common.py diff --git a/shared/types/events/__init__.py b/src/exo/shared/types/events/__init__.py similarity index 100% rename from shared/types/events/__init__.py rename to src/exo/shared/types/events/__init__.py diff --git a/shared/types/events/_events.py b/src/exo/shared/types/events/_events.py similarity index 94% rename from shared/types/events/_events.py rename to src/exo/shared/types/events/_events.py index b74d185a..b61be0e5 100644 --- a/shared/types/events/_events.py +++ b/src/exo/shared/types/events/_events.py @@ -14,21 +14,21 @@ from typing import ( from pydantic import Field -from shared.constants import get_error_reporting_message -from shared.topology import Connection, ConnectionProfile, NodePerformanceProfile -from shared.types.common import NodeId -from shared.types.events.chunks import CommandId, GenerationChunk -from shared.types.tasks import Task, TaskId, TaskStatus -from shared.types.worker.common import InstanceId, NodeStatus -from shared.types.worker.instances import Instance -from shared.types.worker.runners import RunnerId, RunnerStatus +from exo.shared.constants import get_error_reporting_message +from exo.shared.topology import Connection, ConnectionProfile, NodePerformanceProfile +from exo.shared.types.common import NodeId +from exo.shared.types.events.chunks import CommandId, GenerationChunk +from exo.shared.types.tasks import Task, TaskId, TaskStatus +from exo.shared.types.worker.common import InstanceId, NodeStatus +from exo.shared.types.worker.instances import Instance +from exo.shared.types.worker.runners import RunnerId, RunnerStatus if TYPE_CHECKING: pass from pydantic import BaseModel -from shared.types.common import ID +from exo.shared.types.common import ID class EventId(ID): diff --git a/shared/types/events/chunks.py b/src/exo/shared/types/events/chunks.py similarity index 93% rename from shared/types/events/chunks.py rename to src/exo/shared/types/events/chunks.py index f060075c..ebf68ace 100644 --- a/shared/types/events/chunks.py +++ b/src/exo/shared/types/events/chunks.py @@ -3,9 +3,9 @@ from typing import Annotated, Literal from pydantic import BaseModel, Field, TypeAdapter -from shared.openai_compat import FinishReason -from shared.types.common import CommandId -from shared.types.models import ModelId +from exo.shared.openai_compat import FinishReason +from exo.shared.types.common import CommandId +from exo.shared.types.models import ModelId class ChunkType(str, Enum): diff --git a/shared/types/events/commands.py b/src/exo/shared/types/events/commands.py similarity index 84% rename from shared/types/events/commands.py rename to src/exo/shared/types/events/commands.py index cac56d38..8f60f18b 100644 --- a/shared/types/events/commands.py +++ b/src/exo/shared/types/events/commands.py @@ -3,12 +3,12 @@ from typing import Annotated, Callable, Literal, Sequence from pydantic import BaseModel, Field, TypeAdapter -from shared.types.api import ChatCompletionTaskParams -from shared.types.common import CommandId -from shared.types.events import Event -from shared.types.models import ModelMetadata -from shared.types.state import State -from shared.types.worker.common import InstanceId +from exo.shared.types.api import ChatCompletionTaskParams +from exo.shared.types.common import CommandId +from exo.shared.types.events import Event +from exo.shared.types.models import ModelMetadata +from exo.shared.types.state import State +from exo.shared.types.worker.common import InstanceId # TODO: We need to have a distinction between create instance and spin up instance. diff --git a/shared/types/events/components.py b/src/exo/shared/types/events/components.py similarity index 90% rename from shared/types/events/components.py rename to src/exo/shared/types/events/components.py index f32e22cc..b9ef7620 100644 --- a/shared/types/events/components.py +++ b/src/exo/shared/types/events/components.py @@ -12,8 +12,8 @@ from typing import Callable from pydantic import BaseModel, Field, model_validator -from shared.types.common import NodeId -from shared.types.state import State +from exo.shared.types.common import NodeId +from exo.shared.types.state import State from ._events import Event diff --git a/shared/types/graphs/pydantic.py b/src/exo/shared/types/graphs/pydantic.py similarity index 100% rename from shared/types/graphs/pydantic.py rename to src/exo/shared/types/graphs/pydantic.py diff --git a/shared/types/models.py b/src/exo/shared/types/models.py similarity index 100% rename from shared/types/models.py rename to src/exo/shared/types/models.py diff --git a/shared/types/multiaddr.py b/src/exo/shared/types/multiaddr.py similarity index 100% rename from shared/types/multiaddr.py rename to src/exo/shared/types/multiaddr.py diff --git a/shared/types/profiling.py b/src/exo/shared/types/profiling.py similarity index 100% rename from shared/types/profiling.py rename to src/exo/shared/types/profiling.py diff --git a/shared/types/request.py b/src/exo/shared/types/request.py similarity index 87% rename from shared/types/request.py rename to src/exo/shared/types/request.py index 49cbbf31..0e8d6b4c 100644 --- a/shared/types/request.py +++ b/src/exo/shared/types/request.py @@ -1,11 +1,11 @@ from pydantic import BaseModel -from shared.types.api import ( +from exo.shared.types.api import ( ChatCompletionTaskParams, CreateInstanceTaskParams, DeleteInstanceTaskParams, ) -from shared.types.events import CommandId +from exo.shared.types.events import CommandId class ChatCompletionCommand(BaseModel): diff --git a/shared/types/state.py b/src/exo/shared/types/state.py similarity index 79% rename from shared/types/state.py rename to src/exo/shared/types/state.py index 24a0c424..bf9eca8f 100644 --- a/shared/types/state.py +++ b/src/exo/shared/types/state.py @@ -3,13 +3,13 @@ from typing import Any, cast from pydantic import BaseModel, ConfigDict, Field, field_validator -from shared.topology import Topology -from shared.types.common import NodeId -from shared.types.profiling import NodePerformanceProfile -from shared.types.tasks import Task, TaskId -from shared.types.worker.common import InstanceId, NodeStatus -from shared.types.worker.instances import Instance -from shared.types.worker.runners import RunnerId, RunnerStatus +from exo.shared.topology import Topology +from exo.shared.types.common import NodeId +from exo.shared.types.profiling import NodePerformanceProfile +from exo.shared.types.tasks import Task, TaskId +from exo.shared.types.worker.common import InstanceId, NodeStatus +from exo.shared.types.worker.instances import Instance +from exo.shared.types.worker.runners import RunnerId, RunnerStatus def _encode_topology(topo: "Topology") -> dict[str, Any]: # noqa: D401 @@ -53,8 +53,8 @@ class State(BaseModel): return value # Lazy import to avoid circular dependencies. - from shared.topology import Topology as _Topology - from shared.topology import TopologySnapshot + from exo.shared.topology import Topology as _Topology + from exo.shared.topology import TopologySnapshot if isinstance(value, Mapping): # likely a snapshot-dict coming from JSON snapshot = TopologySnapshot(**cast(dict[str, Any], value)) # type: ignore[arg-type] diff --git a/shared/types/tasks.py b/src/exo/shared/types/tasks.py similarity index 82% rename from shared/types/tasks.py rename to src/exo/shared/types/tasks.py index c4958eb2..ea609f28 100644 --- a/shared/types/tasks.py +++ b/src/exo/shared/types/tasks.py @@ -3,9 +3,9 @@ from typing import Annotated, Literal, Optional from pydantic import BaseModel, Field -from shared.types.api import ChatCompletionTaskParams -from shared.types.common import ID, CommandId -from shared.types.worker.common import InstanceId +from exo.shared.types.api import ChatCompletionTaskParams +from exo.shared.types.common import ID, CommandId +from exo.shared.types.worker.common import InstanceId class TaskId(ID): diff --git a/shared/types/topology.py b/src/exo/shared/types/topology.py similarity index 93% rename from shared/types/topology.py rename to src/exo/shared/types/topology.py index dc871347..fc87b484 100644 --- a/shared/types/topology.py +++ b/src/exo/shared/types/topology.py @@ -2,9 +2,9 @@ from typing import Iterable, Protocol from pydantic import BaseModel, ConfigDict -from shared.types.common import NodeId -from shared.types.multiaddr import Multiaddr -from shared.types.profiling import ConnectionProfile, NodePerformanceProfile +from exo.shared.types.common import NodeId +from exo.shared.types.multiaddr import Multiaddr +from exo.shared.types.profiling import ConnectionProfile, NodePerformanceProfile class Connection(BaseModel): diff --git a/shared/types/worker/commands_runner.py b/src/exo/shared/types/worker/commands_runner.py similarity index 93% rename from shared/types/worker/commands_runner.py rename to src/exo/shared/types/worker/commands_runner.py index 0cf2f89c..19f96f68 100644 --- a/shared/types/worker/commands_runner.py +++ b/src/exo/shared/types/worker/commands_runner.py @@ -3,10 +3,10 @@ from typing import Annotated, Generic, Literal, TypeVar from pydantic import BaseModel, Field, TypeAdapter -from shared.openai_compat import FinishReason -from shared.types.common import Host -from shared.types.tasks import ChatCompletionTaskParams -from shared.types.worker.shards import ShardMetadata +from exo.shared.openai_compat import FinishReason +from exo.shared.types.common import Host +from exo.shared.types.tasks import ChatCompletionTaskParams +from exo.shared.types.worker.shards import ShardMetadata ## Messages passed TO the runner diff --git a/shared/types/worker/common.py b/src/exo/shared/types/worker/common.py similarity index 90% rename from shared/types/worker/common.py rename to src/exo/shared/types/worker/common.py index 2d22785c..2f72de6f 100644 --- a/shared/types/worker/common.py +++ b/src/exo/shared/types/worker/common.py @@ -1,6 +1,6 @@ from enum import Enum -from shared.types.common import ID +from exo.shared.types.common import ID class InstanceId(ID): diff --git a/shared/types/worker/downloads.py b/src/exo/shared/types/worker/downloads.py similarity index 92% rename from shared/types/worker/downloads.py rename to src/exo/shared/types/worker/downloads.py index a9e40c19..8415dc55 100644 --- a/shared/types/worker/downloads.py +++ b/src/exo/shared/types/worker/downloads.py @@ -10,9 +10,9 @@ from typing import ( from pydantic import BaseModel, Field, PositiveInt -from shared.types.common import NodeId -from shared.types.models import ModelId -from shared.types.worker.shards import ShardMetadata +from exo.shared.types.common import NodeId +from exo.shared.types.models import ModelId +from exo.shared.types.worker.shards import ShardMetadata class DownloadProgressData(BaseModel): diff --git a/shared/types/worker/instances.py b/src/exo/shared/types/worker/instances.py similarity index 69% rename from shared/types/worker/instances.py rename to src/exo/shared/types/worker/instances.py index 61961afc..9b0521c4 100644 --- a/shared/types/worker/instances.py +++ b/src/exo/shared/types/worker/instances.py @@ -2,9 +2,9 @@ from enum import Enum from pydantic import BaseModel -from shared.types.common import Host -from shared.types.worker.common import InstanceId -from shared.types.worker.runners import ( +from exo.shared.types.common import Host +from exo.shared.types.worker.common import InstanceId +from exo.shared.types.worker.runners import ( ShardAssignments, ) diff --git a/shared/types/worker/ops.py b/src/exo/shared/types/worker/ops.py similarity index 89% rename from shared/types/worker/ops.py rename to src/exo/shared/types/worker/ops.py index 0987f3c7..b06dc0e1 100644 --- a/shared/types/worker/ops.py +++ b/src/exo/shared/types/worker/ops.py @@ -3,11 +3,11 @@ from typing import Annotated, Generic, Literal, TypeVar, Union from pydantic import BaseModel, Field -from shared.types.common import Host -from shared.types.events import InstanceId -from shared.types.tasks import Task -from shared.types.worker.common import RunnerId -from shared.types.worker.shards import ShardMetadata +from exo.shared.types.common import Host +from exo.shared.types.events import InstanceId +from exo.shared.types.tasks import Task +from exo.shared.types.worker.common import RunnerId +from exo.shared.types.worker.shards import ShardMetadata class RunnerOpType(str, Enum): diff --git a/shared/types/worker/resource_monitor.py b/src/exo/shared/types/worker/resource_monitor.py similarity index 96% rename from shared/types/worker/resource_monitor.py rename to src/exo/shared/types/worker/resource_monitor.py index ee5267fc..0bcdcfa4 100644 --- a/shared/types/worker/resource_monitor.py +++ b/src/exo/shared/types/worker/resource_monitor.py @@ -3,7 +3,7 @@ from abc import ABC, abstractmethod from collections.abc import Coroutine from typing import Callable, List, Set -from shared.types.profiling import ( +from exo.shared.types.profiling import ( MemoryPerformanceProfile, SystemPerformanceProfile, ) diff --git a/shared/types/worker/runners.py b/src/exo/shared/types/worker/runners.py similarity index 90% rename from shared/types/worker/runners.py rename to src/exo/shared/types/worker/runners.py index c1428f7e..2abbc838 100644 --- a/shared/types/worker/runners.py +++ b/src/exo/shared/types/worker/runners.py @@ -4,11 +4,11 @@ from typing import Annotated, Generic, Literal, TypeVar from pydantic import BaseModel, Field, TypeAdapter, model_validator -from shared.types.common import NodeId -from shared.types.models import ModelId -from shared.types.worker.common import RunnerId -from shared.types.worker.downloads import DownloadProgress -from shared.types.worker.shards import ShardMetadata +from exo.shared.types.common import NodeId +from exo.shared.types.models import ModelId +from exo.shared.types.worker.common import RunnerId +from exo.shared.types.worker.downloads import DownloadProgress +from exo.shared.types.worker.shards import ShardMetadata class RunnerStatusType(str, Enum): diff --git a/shared/types/worker/shards.py b/src/exo/shared/types/worker/shards.py similarity index 95% rename from shared/types/worker/shards.py rename to src/exo/shared/types/worker/shards.py index 3e22e433..62266652 100644 --- a/shared/types/worker/shards.py +++ b/src/exo/shared/types/worker/shards.py @@ -3,8 +3,8 @@ from typing import Annotated, Generic, Literal, Optional, TypeVar from pydantic import BaseModel, Field, TypeAdapter -from shared.types.common import NodeId -from shared.types.models import ModelId, ModelMetadata +from exo.shared.types.common import NodeId +from exo.shared.types.models import ModelId, ModelMetadata class PartitionStrategy(str, Enum): diff --git a/shared/utils.py b/src/exo/shared/utils.py similarity index 99% rename from shared/utils.py rename to src/exo/shared/utils.py index ee3f6cc5..df45ec6f 100644 --- a/shared/utils.py +++ b/src/exo/shared/utils.py @@ -11,7 +11,7 @@ from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import ed25519 from filelock import FileLock -from shared.constants import EXO_NODE_ID_KEYPAIR +from exo.shared.constants import EXO_NODE_ID_KEYPAIR @final diff --git a/worker/NOTES.md b/src/exo/worker/NOTES.md similarity index 100% rename from worker/NOTES.md rename to src/exo/worker/NOTES.md diff --git a/master/README.md b/src/exo/worker/__init__.py similarity index 100% rename from master/README.md rename to src/exo/worker/__init__.py diff --git a/worker/common.py b/src/exo/worker/common.py similarity index 70% rename from worker/common.py rename to src/exo/worker/common.py index ffbe07db..49c1e077 100644 --- a/worker/common.py +++ b/src/exo/worker/common.py @@ -3,17 +3,17 @@ from typing import Optional from pydantic import BaseModel, ConfigDict -from shared.types.common import Host -from shared.types.events import ( +from exo.shared.types.common import Host +from exo.shared.types.events import ( InstanceId, RunnerStatusUpdated, ) -from shared.types.worker.common import RunnerId -from shared.types.worker.runners import ( +from exo.shared.types.worker.common import RunnerId +from exo.shared.types.worker.runners import ( RunnerStatus, ) -from shared.types.worker.shards import ShardMetadata -from worker.runner.runner_supervisor import RunnerSupervisor +from exo.shared.types.worker.shards import ShardMetadata +from exo.worker.runner.runner_supervisor import RunnerSupervisor class AssignedRunner(BaseModel): diff --git a/worker/download/conftest.py b/src/exo/worker/download/conftest.py similarity index 81% rename from worker/download/conftest.py rename to src/exo/worker/download/conftest.py index 9f60b97a..eb96acd2 100644 --- a/worker/download/conftest.py +++ b/src/exo/worker/download/conftest.py @@ -1,8 +1,8 @@ import pytest -from shared.models.model_meta import get_model_meta -from shared.types.models import ModelMetadata -from shared.types.worker.shards import PipelineShardMetadata +from exo.shared.models.model_meta import get_model_meta +from exo.shared.types.models import ModelMetadata +from exo.shared.types.worker.shards import PipelineShardMetadata @pytest.fixture diff --git a/worker/download/download_utils.py b/src/exo/worker/download/download_utils.py similarity index 99% rename from worker/download/download_utils.py rename to src/exo/worker/download/download_utils.py index c2094107..b88b7577 100644 --- a/worker/download/download_utils.py +++ b/src/exo/worker/download/download_utils.py @@ -14,9 +14,9 @@ import aiofiles.os as aios import aiohttp from pydantic import BaseModel, DirectoryPath, Field, TypeAdapter -from shared.constants import EXO_HOME -from shared.types.worker.shards import ShardMetadata -from worker.download.huggingface_utils import ( +from exo.shared.constants import EXO_HOME +from exo.shared.types.worker.shards import ShardMetadata +from exo.worker.download.huggingface_utils import ( filter_repo_objects, get_allow_patterns, get_auth_headers, diff --git a/worker/download/huggingface_utils.py b/src/exo/worker/download/huggingface_utils.py similarity index 98% rename from worker/download/huggingface_utils.py rename to src/exo/worker/download/huggingface_utils.py index a3d8a781..56d118c5 100644 --- a/worker/download/huggingface_utils.py +++ b/src/exo/worker/download/huggingface_utils.py @@ -6,7 +6,7 @@ from typing import Callable, Dict, Generator, Iterable, List, Optional, TypeVar, import aiofiles import aiofiles.os as aios -from shared.types.worker.shards import ShardMetadata +from exo.shared.types.worker.shards import ShardMetadata T = TypeVar("T") diff --git a/worker/download/impl_shard_downloader.py b/src/exo/worker/download/impl_shard_downloader.py similarity index 95% rename from worker/download/impl_shard_downloader.py rename to src/exo/worker/download/impl_shard_downloader.py index dff56912..170e68c6 100644 --- a/worker/download/impl_shard_downloader.py +++ b/src/exo/worker/download/impl_shard_downloader.py @@ -2,15 +2,15 @@ import asyncio from pathlib import Path from typing import AsyncIterator, Callable, Dict, List, Optional -from shared.models.model_cards import MODEL_CARDS -from shared.models.model_meta import get_model_meta -from shared.types.worker.shards import ( +from exo.shared.models.model_cards import MODEL_CARDS +from exo.shared.models.model_meta import get_model_meta +from exo.shared.types.worker.shards import ( PartitionStrategy, PipelineShardMetadata, ShardMetadata, ) -from worker.download.download_utils import RepoDownloadProgress, download_shard -from worker.download.shard_downloader import ShardDownloader +from exo.worker.download.download_utils import RepoDownloadProgress, download_shard +from exo.worker.download.shard_downloader import ShardDownloader def exo_shard_downloader(max_parallel_downloads: int = 8) -> ShardDownloader: diff --git a/worker/download/shard_downloader.py b/src/exo/worker/download/shard_downloader.py similarity index 96% rename from worker/download/shard_downloader.py rename to src/exo/worker/download/shard_downloader.py index 27b88411..6fcba625 100644 --- a/worker/download/shard_downloader.py +++ b/src/exo/worker/download/shard_downloader.py @@ -3,13 +3,13 @@ from datetime import timedelta from pathlib import Path from typing import AsyncIterator, Callable -from shared.types.models import ModelMetadata -from shared.types.worker.shards import ( +from exo.shared.types.models import ModelMetadata +from exo.shared.types.worker.shards import ( PartitionStrategy, PipelineShardMetadata, ShardMetadata, ) -from worker.download.download_utils import RepoDownloadProgress +from exo.worker.download.download_utils import RepoDownloadProgress # TODO: the PipelineShardMetadata getting reinstantiated is a bit messy. Shoudl this be a classmethod? diff --git a/worker/main.py b/src/exo/worker/main.py similarity index 82% rename from worker/main.py rename to src/exo/worker/main.py index cd4149b7..189f668a 100644 --- a/worker/main.py +++ b/src/exo/worker/main.py @@ -1,22 +1,22 @@ import asyncio import logging -from shared.apply import apply -from shared.db.sqlite.event_log_manager import EventLogConfig, EventLogManager -from shared.types.common import NodeId -from shared.types.events import ( +from exo.shared.apply import apply +from exo.shared.db.sqlite.event_log_manager import EventLogConfig, EventLogManager +from exo.shared.types.common import NodeId +from exo.shared.types.events import ( NodePerformanceMeasured, ) -from shared.types.profiling import NodePerformanceProfile -from shared.types.worker.ops import ( +from exo.shared.types.profiling import NodePerformanceProfile +from exo.shared.types.worker.ops import ( ExecuteTaskOp, RunnerOp, ) -from shared.utils import Keypair, get_node_id_keypair -from worker.download.impl_shard_downloader import exo_shard_downloader -from worker.plan import plan -from worker.utils.profile import start_polling_node_metrics -from worker.worker import Worker +from exo.shared.utils import Keypair, get_node_id_keypair +from exo.worker.download.impl_shard_downloader import exo_shard_downloader +from exo.worker.plan import plan +from exo.worker.utils.profile import start_polling_node_metrics +from exo.worker.worker import Worker async def run(worker_state: Worker, logger: logging.Logger): @@ -61,7 +61,7 @@ async def run(worker_state: Worker, logger: logging.Logger): -async def main(): +async def async_main(): node_id_keypair: Keypair = get_node_id_keypair() node_id = NodeId(node_id_keypair.to_peer_id().to_base58()) logger: logging.Logger = logging.getLogger('worker_logger') @@ -86,5 +86,8 @@ async def main(): await run(worker, logger) +def main(): + asyncio.run(async_main()) + if __name__ == "__main__": - asyncio.run(main()) + main() diff --git a/worker/plan.py b/src/exo/worker/plan.py similarity index 96% rename from worker/plan.py rename to src/exo/worker/plan.py index 3edb97e2..a0be6920 100644 --- a/worker/plan.py +++ b/src/exo/worker/plan.py @@ -1,13 +1,13 @@ from typing import Mapping -from shared.types.common import NodeId -from shared.types.events import ( +from exo.shared.types.common import NodeId +from exo.shared.types.events import ( InstanceId, ) -from shared.types.tasks import Task, TaskId, TaskStatus -from shared.types.worker.common import RunnerId -from shared.types.worker.instances import Instance, InstanceStatus -from shared.types.worker.ops import ( +from exo.shared.types.tasks import Task, TaskId, TaskStatus +from exo.shared.types.worker.common import RunnerId +from exo.shared.types.worker.instances import Instance, InstanceStatus +from exo.shared.types.worker.ops import ( AssignRunnerOp, ExecuteTaskOp, RunnerDownOp, @@ -16,7 +16,7 @@ from shared.types.worker.ops import ( RunnerUpOp, UnassignRunnerOp, ) -from shared.types.worker.runners import ( +from exo.shared.types.worker.runners import ( DownloadingRunnerStatus, FailedRunnerStatus, InactiveRunnerStatus, @@ -25,7 +25,7 @@ from shared.types.worker.runners import ( RunnerStatusType, RunningRunnerStatus, ) -from worker.common import AssignedRunner +from exo.worker.common import AssignedRunner def unassign_runners(instances: Mapping[InstanceId, Instance], state_runners: Mapping[RunnerId, RunnerStatus], assigned_runners: dict[RunnerId, AssignedRunner]) -> UnassignRunnerOp | None: diff --git a/worker/runner/communication.py b/src/exo/worker/runner/communication.py similarity index 96% rename from worker/runner/communication.py rename to src/exo/worker/runner/communication.py index 57660154..044d10c5 100644 --- a/worker/runner/communication.py +++ b/src/exo/worker/runner/communication.py @@ -2,7 +2,7 @@ import asyncio import sys import traceback -from shared.types.worker.commands_runner import ( +from exo.shared.types.worker.commands_runner import ( ErrorResponse, PrintResponse, RunnerMessage, diff --git a/worker/runner/runner.py b/src/exo/worker/runner/runner.py similarity index 95% rename from worker/runner/runner.py rename to src/exo/worker/runner/runner.py index 03f6817c..fef5645c 100644 --- a/worker/runner/runner.py +++ b/src/exo/worker/runner/runner.py @@ -10,15 +10,15 @@ import mlx.nn as nn from mlx_lm.generate import stream_generate # type: ignore from mlx_lm.tokenizer_utils import TokenizerWrapper -from engines.mlx.utils_mlx import ( +from exo.engines.mlx.utils_mlx import ( apply_chat_template, initialize_mlx, mlx_force_oom, warmup_inference, ) -from shared.openai_compat import FinishReason -from shared.types.tasks import ChatCompletionTaskParams -from shared.types.worker.commands_runner import ( +from exo.shared.openai_compat import FinishReason +from exo.shared.types.tasks import ChatCompletionTaskParams +from exo.shared.types.worker.commands_runner import ( ChatTaskMessage, ExitMessage, FinishedResponse, @@ -27,8 +27,8 @@ from shared.types.worker.commands_runner import ( RunnerMessage, SetupMessage, ) -from shared.utils import ensure_type -from worker.runner.communication import ( +from exo.shared.utils import ensure_type +from exo.worker.runner.communication import ( runner_print, runner_read_message, runner_write_error, diff --git a/worker/runner/runner_supervisor.py b/src/exo/worker/runner/runner_supervisor.py similarity index 96% rename from worker/runner/runner_supervisor.py rename to src/exo/worker/runner/runner_supervisor.py index fbc50ea5..be94d2cc 100644 --- a/worker/runner/runner_supervisor.py +++ b/src/exo/worker/runner/runner_supervisor.py @@ -8,10 +8,10 @@ from typing import Any, Callable, Optional import psutil -from shared.types.common import CommandId, Host -from shared.types.events.chunks import GenerationChunk, TokenChunk -from shared.types.tasks import ChatCompletionTaskParams, Task -from shared.types.worker.commands_runner import ( +from exo.shared.types.common import CommandId, Host +from exo.shared.types.events.chunks import GenerationChunk, TokenChunk +from exo.shared.types.tasks import ChatCompletionTaskParams, Task +from exo.shared.types.worker.commands_runner import ( ChatTaskMessage, ErrorResponse, FinishedResponse, @@ -22,13 +22,13 @@ from shared.types.worker.commands_runner import ( RunnerResponse, SetupMessage, ) -from shared.types.worker.common import RunnerError -from shared.types.worker.shards import ShardMetadata -from worker.runner.communication import ( +from exo.shared.types.worker.common import RunnerError +from exo.shared.types.worker.shards import ShardMetadata +from exo.worker.runner.communication import ( supervisor_read_response, supervisor_write_message, ) -from worker.runner.utils import ( +from exo.worker.runner.utils import ( get_init_timeout, get_prefil_timeout, get_runner_command, diff --git a/worker/runner/utils.py b/src/exo/worker/runner/utils.py similarity index 91% rename from worker/runner/utils.py rename to src/exo/worker/runner/utils.py index fb1df0b7..2b04f424 100644 --- a/worker/runner/utils.py +++ b/src/exo/worker/runner/utils.py @@ -5,8 +5,8 @@ from logging import Logger import psutil -from shared.constants import LB_DISK_GBPS, LB_MEMBW_GBPS, LB_TFLOPS -from shared.types.worker.shards import ShardMetadata +from exo.shared.constants import LB_DISK_GBPS, LB_MEMBW_GBPS, LB_TFLOPS +from exo.shared.types.worker.shards import ShardMetadata async def kill_process_tree(runner_process: asyncio.subprocess.Process, logger: Logger) -> None: @@ -47,7 +47,7 @@ async def kill_process_tree(runner_process: asyncio.subprocess.Process, logger: def get_runner_command() -> list[str]: python = sys.executable - return [python, "-m", "worker.runner.runner"] + return [python, "-m", "exo.worker.runner.runner"] def get_weights_size_kb(model_shard_meta: ShardMetadata) -> float: return (model_shard_meta.end_layer - model_shard_meta.start_layer) / model_shard_meta.n_layers * model_shard_meta.model_meta.storage_size_kilobytes diff --git a/worker/tests/__init__.py b/src/exo/worker/tests/__init__.py similarity index 100% rename from worker/tests/__init__.py rename to src/exo/worker/tests/__init__.py diff --git a/worker/tests/conftest.py b/src/exo/worker/tests/conftest.py similarity index 88% rename from worker/tests/conftest.py rename to src/exo/worker/tests/conftest.py index 328ace7c..e13624e3 100644 --- a/worker/tests/conftest.py +++ b/src/exo/worker/tests/conftest.py @@ -4,21 +4,21 @@ from typing import Callable, Optional import pytest -from shared.models.model_meta import get_model_meta -from shared.types.api import ChatCompletionMessage, ChatCompletionTaskParams -from shared.types.common import Host, NodeId -from shared.types.models import ModelId, ModelMetadata -from shared.types.tasks import ( +from exo.shared.models.model_meta import get_model_meta +from exo.shared.types.api import ChatCompletionMessage, ChatCompletionTaskParams +from exo.shared.types.common import Host, NodeId +from exo.shared.types.models import ModelId, ModelMetadata +from exo.shared.types.tasks import ( ChatCompletionTask, TaskId, TaskStatus, TaskType, ) -from shared.types.worker.common import InstanceId -from shared.types.worker.instances import Instance, InstanceStatus -from shared.types.worker.runners import RunnerId, ShardAssignments -from shared.types.worker.shards import PipelineShardMetadata -from worker.tests.constants import ( +from exo.shared.types.worker.common import InstanceId +from exo.shared.types.worker.instances import Instance, InstanceStatus +from exo.shared.types.worker.runners import RunnerId, ShardAssignments +from exo.shared.types.worker.shards import PipelineShardMetadata +from exo.worker.tests.constants import ( COMMAND_1_ID, INSTANCE_1_ID, MODEL_A_ID, diff --git a/worker/tests/constants.py b/src/exo/worker/tests/constants.py similarity index 81% rename from worker/tests/constants.py rename to src/exo/worker/tests/constants.py index 8e139a13..49ff6876 100644 --- a/worker/tests/constants.py +++ b/src/exo/worker/tests/constants.py @@ -1,9 +1,9 @@ from typing import Final -from shared.types.common import CommandId, NodeId -from shared.types.models import ModelId -from shared.types.tasks import TaskId -from shared.types.worker.common import InstanceId, RunnerId +from exo.shared.types.common import CommandId, NodeId +from exo.shared.types.models import ModelId +from exo.shared.types.tasks import TaskId +from exo.shared.types.worker.common import InstanceId, RunnerId MASTER_NODE_ID = NodeId("ffffffff-aaaa-4aaa-8aaa-aaaaaaaaaaaa") diff --git a/worker/tests/test_download.py b/src/exo/worker/tests/test_download.py similarity index 89% rename from worker/tests/test_download.py rename to src/exo/worker/tests/test_download.py index c44d6e65..6331562b 100644 --- a/worker/tests/test_download.py +++ b/src/exo/worker/tests/test_download.py @@ -3,9 +3,9 @@ from typing import Callable import pytest -from shared.types.worker.shards import PipelineShardMetadata -from worker.download.impl_shard_downloader import exo_shard_downloader -from worker.download.shard_downloader import ShardDownloader +from exo.shared.types.worker.shards import PipelineShardMetadata +from exo.worker.download.impl_shard_downloader import exo_shard_downloader +from exo.worker.download.shard_downloader import ShardDownloader @pytest.mark.slow diff --git a/shared/README.md b/src/exo/worker/tests/test_handlers/__init__.py similarity index 100% rename from shared/README.md rename to src/exo/worker/tests/test_handlers/__init__.py diff --git a/worker/tests/test_handlers/conftest.py b/src/exo/worker/tests/test_handlers/conftest.py similarity index 79% rename from worker/tests/test_handlers/conftest.py rename to src/exo/worker/tests/test_handlers/conftest.py index 9f7801c6..a6d96ef6 100644 --- a/worker/tests/test_handlers/conftest.py +++ b/src/exo/worker/tests/test_handlers/conftest.py @@ -3,18 +3,18 @@ from typing import Callable import pytest -from shared.db.sqlite.event_log_manager import EventLogConfig, EventLogManager -from shared.types.common import NodeId -from shared.types.worker.common import InstanceId -from shared.types.worker.instances import Instance -from shared.types.worker.ops import ( +from exo.shared.db.sqlite.event_log_manager import EventLogConfig, EventLogManager +from exo.shared.types.common import NodeId +from exo.shared.types.worker.common import InstanceId +from exo.shared.types.worker.instances import Instance +from exo.shared.types.worker.ops import ( AssignRunnerOp, RunnerUpOp, ) -from shared.types.worker.runners import RunnerId -from worker.download.shard_downloader import NoopShardDownloader -from worker.tests.constants import INSTANCE_1_ID, NODE_A, RUNNER_1_ID -from worker.worker import Worker +from exo.shared.types.worker.runners import RunnerId +from exo.worker.download.shard_downloader import NoopShardDownloader +from exo.worker.tests.constants import INSTANCE_1_ID, NODE_A, RUNNER_1_ID +from exo.worker.worker import Worker @pytest.fixture diff --git a/worker/tests/test_handlers/test_handlers_happy.py b/src/exo/worker/tests/test_handlers/test_handlers_happy.py similarity index 89% rename from worker/tests/test_handlers/test_handlers_happy.py rename to src/exo/worker/tests/test_handlers/test_handlers_happy.py index 5d2dc0b8..a11750a5 100644 --- a/worker/tests/test_handlers/test_handlers_happy.py +++ b/src/exo/worker/tests/test_handlers/test_handlers_happy.py @@ -2,35 +2,35 @@ from typing import Callable import pytest -from shared.types.common import NodeId -from shared.types.events import ( +from exo.shared.types.common import NodeId +from exo.shared.types.events import ( ChunkGenerated, RunnerDeleted, RunnerStatusUpdated, TaskStateUpdated, ) -from shared.types.events.chunks import TokenChunk -from shared.types.tasks import ChatCompletionTask, TaskStatus -from shared.types.worker.common import RunnerId -from shared.types.worker.instances import Instance, InstanceId -from shared.types.worker.ops import ( +from exo.shared.types.events.chunks import TokenChunk +from exo.shared.types.tasks import ChatCompletionTask, TaskStatus +from exo.shared.types.worker.common import RunnerId +from exo.shared.types.worker.instances import Instance, InstanceId +from exo.shared.types.worker.ops import ( AssignRunnerOp, ExecuteTaskOp, RunnerDownOp, RunnerUpOp, UnassignRunnerOp, ) -from shared.types.worker.runners import ( +from exo.shared.types.worker.runners import ( DownloadingRunnerStatus, InactiveRunnerStatus, LoadedRunnerStatus, RunningRunnerStatus, ) -from worker.main import Worker -from worker.tests.constants import ( +from exo.worker.main import Worker +from exo.worker.tests.constants import ( RUNNER_1_ID, ) -from worker.tests.test_handlers.utils import read_events_op +from exo.worker.tests.test_handlers.utils import read_events_op @pytest.mark.asyncio diff --git a/worker/tests/test_handlers/test_handlers_sad.py b/src/exo/worker/tests/test_handlers/test_handlers_sad.py similarity index 84% rename from worker/tests/test_handlers/test_handlers_sad.py rename to src/exo/worker/tests/test_handlers/test_handlers_sad.py index c3a01b57..588cee8a 100644 --- a/worker/tests/test_handlers/test_handlers_sad.py +++ b/src/exo/worker/tests/test_handlers/test_handlers_sad.py @@ -5,16 +5,16 @@ from typing import Callable import pytest -from shared.types.tasks import ChatCompletionTask -from shared.types.worker.common import RunnerError -from shared.types.worker.instances import Instance -from shared.types.worker.ops import ( +from exo.shared.types.tasks import ChatCompletionTask +from exo.shared.types.worker.common import RunnerError +from exo.shared.types.worker.instances import Instance +from exo.shared.types.worker.ops import ( ExecuteTaskOp, RunnerUpOp, ) -from worker.main import Worker -from worker.tests.constants import RUNNER_1_ID -from worker.tests.test_handlers.utils import read_events_op +from exo.worker.main import Worker +from exo.worker.tests.constants import RUNNER_1_ID +from exo.worker.tests.test_handlers.utils import read_events_op @pytest.mark.asyncio diff --git a/worker/tests/test_handlers/utils.py b/src/exo/worker/tests/test_handlers/utils.py similarity index 64% rename from worker/tests/test_handlers/utils.py rename to src/exo/worker/tests/test_handlers/utils.py index 8e97949b..4b095342 100644 --- a/worker/tests/test_handlers/utils.py +++ b/src/exo/worker/tests/test_handlers/utils.py @@ -2,13 +2,13 @@ -from shared.types.events import ( +from exo.shared.types.events import ( Event, ) -from shared.types.worker.ops import ( +from exo.shared.types.worker.ops import ( RunnerOp, ) -from worker.main import Worker +from exo.worker.main import Worker async def read_events_op(worker: Worker, op: RunnerOp) -> list[Event]: diff --git a/shared/protobufs/schemas/.gitkeep b/src/exo/worker/tests/test_integration/__init__.py similarity index 100% rename from shared/protobufs/schemas/.gitkeep rename to src/exo/worker/tests/test_integration/__init__.py diff --git a/worker/tests/test_integration/conftest.py b/src/exo/worker/tests/test_integration/conftest.py similarity index 72% rename from worker/tests/test_integration/conftest.py rename to src/exo/worker/tests/test_integration/conftest.py index df3bc8ea..4e00d414 100644 --- a/worker/tests/test_integration/conftest.py +++ b/src/exo/worker/tests/test_integration/conftest.py @@ -4,12 +4,12 @@ from typing import Awaitable, Callable import pytest -from shared.db.sqlite.connector import AsyncSQLiteEventStorage -from shared.db.sqlite.event_log_manager import EventLogConfig, EventLogManager -from shared.types.common import NodeId -from worker.download.shard_downloader import NoopShardDownloader -from worker.main import run -from worker.worker import Worker +from exo.shared.db.sqlite.connector import AsyncSQLiteEventStorage +from exo.shared.db.sqlite.event_log_manager import EventLogConfig, EventLogManager +from exo.shared.types.common import NodeId +from exo.worker.download.shard_downloader import NoopShardDownloader +from exo.worker.main import run +from exo.worker.worker import Worker @pytest.fixture diff --git a/worker/tests/test_integration/integration_utils.py b/src/exo/worker/tests/test_integration/integration_utils.py similarity index 90% rename from worker/tests/test_integration/integration_utils.py rename to src/exo/worker/tests/test_integration/integration_utils.py index 482687fd..c059613a 100644 --- a/worker/tests/test_integration/integration_utils.py +++ b/src/exo/worker/tests/test_integration/integration_utils.py @@ -3,10 +3,10 @@ import asyncio from typing import Callable, Optional, Tuple, TypeVar -from shared.db.sqlite.connector import AsyncSQLiteEventStorage -from shared.types.events import ChunkGenerated, TaskStateUpdated -from shared.types.events.chunks import TokenChunk -from shared.types.tasks import TaskId, TaskStatus +from exo.shared.db.sqlite.connector import AsyncSQLiteEventStorage +from exo.shared.types.events import ChunkGenerated, TaskStateUpdated +from exo.shared.types.events.chunks import TokenChunk +from exo.shared.types.tasks import TaskId, TaskStatus async def read_streaming_response(global_events: AsyncSQLiteEventStorage, filter_task: Optional[TaskId] = None) -> Tuple[bool, bool, str]: diff --git a/worker/tests/test_integration/test_creation.py b/src/exo/worker/tests/test_integration/test_creation.py similarity index 100% rename from worker/tests/test_integration/test_creation.py rename to src/exo/worker/tests/test_integration/test_creation.py diff --git a/worker/tests/test_integration/test_inference.py b/src/exo/worker/tests/test_integration/test_inference.py similarity index 89% rename from worker/tests/test_integration/test_inference.py rename to src/exo/worker/tests/test_integration/test_inference.py index e2b78955..bb2c5966 100644 --- a/worker/tests/test_integration/test_inference.py +++ b/src/exo/worker/tests/test_integration/test_inference.py @@ -3,27 +3,27 @@ from logging import Logger from typing import Awaitable, Callable # TaskStateUpdated and ChunkGenerated are used in test_worker_integration_utils.py -from shared.db.sqlite.connector import AsyncSQLiteEventStorage -from shared.db.sqlite.event_log_manager import EventLogConfig, EventLogManager -from shared.types.api import ChatCompletionMessage, ChatCompletionTaskParams -from shared.types.common import CommandId, Host, NodeId -from shared.types.events import ( +from exo.shared.db.sqlite.connector import AsyncSQLiteEventStorage +from exo.shared.db.sqlite.event_log_manager import EventLogConfig, EventLogManager +from exo.shared.types.api import ChatCompletionMessage, ChatCompletionTaskParams +from exo.shared.types.common import CommandId, Host, NodeId +from exo.shared.types.events import ( InstanceCreated, InstanceDeleted, TaskCreated, ) -from shared.types.models import ModelId -from shared.types.tasks import ChatCompletionTask, Task, TaskId, TaskStatus, TaskType -from shared.types.worker.common import InstanceId, RunnerId -from shared.types.worker.instances import ( +from exo.shared.types.models import ModelId +from exo.shared.types.tasks import ChatCompletionTask, Task, TaskId, TaskStatus, TaskType +from exo.shared.types.worker.common import InstanceId, RunnerId +from exo.shared.types.worker.instances import ( Instance, InstanceStatus, ShardAssignments, ) -from shared.types.worker.shards import PipelineShardMetadata -from worker.download.shard_downloader import NoopShardDownloader -from worker.main import run -from worker.tests.constants import ( +from exo.shared.types.worker.shards import PipelineShardMetadata +from exo.worker.download.shard_downloader import NoopShardDownloader +from exo.worker.main import run +from exo.worker.tests.constants import ( INSTANCE_1_ID, MASTER_NODE_ID, NODE_A, @@ -32,10 +32,10 @@ from worker.tests.constants import ( RUNNER_2_ID, TASK_1_ID, ) -from worker.tests.test_integration.integration_utils import ( +from exo.worker.tests.test_integration.integration_utils import ( read_streaming_response, ) -from worker.worker import Worker +from exo.worker.worker import Worker async def test_runner_inference( diff --git a/worker/tests/test_integration/test_inference_sad.py b/src/exo/worker/tests/test_integration/test_inference_sad.py similarity index 90% rename from worker/tests/test_integration/test_inference_sad.py rename to src/exo/worker/tests/test_integration/test_inference_sad.py index 82de4c7d..8e2d25fa 100644 --- a/worker/tests/test_integration/test_inference_sad.py +++ b/src/exo/worker/tests/test_integration/test_inference_sad.py @@ -7,9 +7,9 @@ import pytest from _pytest.monkeypatch import MonkeyPatch # TaskStateUpdated and ChunkGenerated are used in test_worker_integration_utils.py -from shared.db.sqlite.connector import AsyncSQLiteEventStorage -from shared.types.common import NodeId -from shared.types.events import ( +from exo.shared.db.sqlite.connector import AsyncSQLiteEventStorage +from exo.shared.types.common import NodeId +from exo.shared.types.events import ( ChunkGenerated, InstanceCreated, InstanceDeleted, @@ -17,25 +17,25 @@ from shared.types.events import ( TaskCreated, TaskStateUpdated, ) -from shared.types.events._events import TaskFailed -from shared.types.events.chunks import GenerationChunk, TokenChunk -from shared.types.tasks import Task, TaskId, TaskStatus -from shared.types.worker.common import InstanceId, RunnerId -from shared.types.worker.instances import ( +from exo.shared.types.events._events import TaskFailed +from exo.shared.types.events.chunks import GenerationChunk, TokenChunk +from exo.shared.types.tasks import Task, TaskId, TaskStatus +from exo.shared.types.worker.common import InstanceId, RunnerId +from exo.shared.types.worker.instances import ( Instance, InstanceStatus, ) -from shared.types.worker.runners import FailedRunnerStatus -from worker.main import Worker -from worker.runner.runner_supervisor import RunnerSupervisor -from worker.tests.constants import ( +from exo.shared.types.worker.runners import FailedRunnerStatus +from exo.worker.main import Worker +from exo.worker.runner.runner_supervisor import RunnerSupervisor +from exo.worker.tests.constants import ( INSTANCE_1_ID, MASTER_NODE_ID, NODE_A, RUNNER_1_ID, TASK_1_ID, ) -from worker.tests.test_integration.integration_utils import until_event_with_timeout +from exo.worker.tests.test_integration.integration_utils import until_event_with_timeout @pytest.fixture diff --git a/worker/tests/test_integration/test_instantiation.py b/src/exo/worker/tests/test_integration/test_instantiation.py similarity index 85% rename from worker/tests/test_integration/test_instantiation.py rename to src/exo/worker/tests/test_integration/test_instantiation.py index b635c727..21f296b1 100644 --- a/worker/tests/test_integration/test_instantiation.py +++ b/src/exo/worker/tests/test_integration/test_instantiation.py @@ -2,31 +2,31 @@ import asyncio from typing import Awaitable, Callable # TaskStateUpdated and ChunkGenerated are used in test_worker_integration_utils.py -from shared.db.sqlite.connector import AsyncSQLiteEventStorage -from shared.types.common import NodeId +from exo.shared.db.sqlite.connector import AsyncSQLiteEventStorage +from exo.shared.types.common import NodeId # TaskStateUpdated and ChunkGenerated are used in test_worker_integration_utils.py -from shared.types.events import ( +from exo.shared.types.events import ( InstanceCreated, InstanceDeleted, RunnerStatusUpdated, ) -from shared.types.worker.common import InstanceId, RunnerId -from shared.types.worker.instances import ( +from exo.shared.types.worker.common import InstanceId, RunnerId +from exo.shared.types.worker.instances import ( Instance, InstanceStatus, ) -from shared.types.worker.runners import ( +from exo.shared.types.worker.runners import ( FailedRunnerStatus, ) -from worker.main import Worker -from worker.tests.constants import ( +from exo.worker.main import Worker +from exo.worker.tests.constants import ( INSTANCE_1_ID, MASTER_NODE_ID, NODE_A, RUNNER_1_ID, ) -from worker.tests.test_integration.integration_utils import until_event_with_timeout +from exo.worker.tests.test_integration.integration_utils import until_event_with_timeout async def test_runner_spinup_exception( diff --git a/worker/tests/test_integration/test_instantiation_sad.py b/src/exo/worker/tests/test_integration/test_instantiation_sad.py similarity index 84% rename from worker/tests/test_integration/test_instantiation_sad.py rename to src/exo/worker/tests/test_integration/test_instantiation_sad.py index c0fd5515..a84b52d5 100644 --- a/worker/tests/test_integration/test_instantiation_sad.py +++ b/src/exo/worker/tests/test_integration/test_instantiation_sad.py @@ -2,31 +2,31 @@ import asyncio from typing import Awaitable, Callable # TaskStateUpdated and ChunkGenerated are used in test_worker_integration_utils.py -from shared.db.sqlite.connector import AsyncSQLiteEventStorage -from shared.types.common import NodeId +from exo.shared.db.sqlite.connector import AsyncSQLiteEventStorage +from exo.shared.types.common import NodeId # TaskStateUpdated and ChunkGenerated are used in test_worker_integration_utils.py -from shared.types.events import ( +from exo.shared.types.events import ( InstanceCreated, InstanceDeleted, RunnerStatusUpdated, ) -from shared.types.worker.common import InstanceId, RunnerId -from shared.types.worker.instances import ( +from exo.shared.types.worker.common import InstanceId, RunnerId +from exo.shared.types.worker.instances import ( Instance, InstanceStatus, ) -from shared.types.worker.runners import ( +from exo.shared.types.worker.runners import ( FailedRunnerStatus, ) -from worker.main import Worker -from worker.tests.constants import ( +from exo.worker.main import Worker +from exo.worker.tests.constants import ( INSTANCE_1_ID, MASTER_NODE_ID, NODE_A, RUNNER_1_ID, ) -from worker.tests.test_integration.integration_utils import until_event_with_timeout +from exo.worker.tests.test_integration.integration_utils import until_event_with_timeout async def test_runner_spinup_exception( diff --git a/worker/tests/test_multimodel/test_inference_llama70B.py b/src/exo/worker/tests/test_multimodel/test_inference_llama70B.py similarity index 90% rename from worker/tests/test_multimodel/test_inference_llama70B.py rename to src/exo/worker/tests/test_multimodel/test_inference_llama70B.py index 71a67df5..c6c96197 100644 --- a/worker/tests/test_multimodel/test_inference_llama70B.py +++ b/src/exo/worker/tests/test_multimodel/test_inference_llama70B.py @@ -6,27 +6,27 @@ from typing import Callable import pytest # TaskStateUpdated and ChunkGenerated are used in test_worker_integration_utils.py -from shared.db.sqlite.event_log_manager import EventLogConfig, EventLogManager -from shared.models.model_meta import get_model_meta -from shared.types.api import ChatCompletionMessage, ChatCompletionTaskParams -from shared.types.common import Host -from shared.types.events import ( +from exo.shared.db.sqlite.event_log_manager import EventLogConfig, EventLogManager +from exo.shared.models.model_meta import get_model_meta +from exo.shared.types.api import ChatCompletionMessage, ChatCompletionTaskParams +from exo.shared.types.common import Host +from exo.shared.types.events import ( InstanceCreated, InstanceDeleted, TaskCreated, ) -from shared.types.models import ModelId, ModelMetadata -from shared.types.tasks import ChatCompletionTask, Task, TaskId, TaskStatus, TaskType -from shared.types.worker.common import InstanceId -from shared.types.worker.instances import ( +from exo.shared.types.models import ModelId, ModelMetadata +from exo.shared.types.tasks import ChatCompletionTask, Task, TaskId, TaskStatus, TaskType +from exo.shared.types.worker.common import InstanceId +from exo.shared.types.worker.instances import ( Instance, InstanceStatus, ShardAssignments, ) -from shared.types.worker.shards import PipelineShardMetadata -from worker.download.shard_downloader import NoopShardDownloader -from worker.main import run -from worker.tests.constants import ( +from exo.shared.types.worker.shards import PipelineShardMetadata +from exo.worker.download.shard_downloader import NoopShardDownloader +from exo.worker.main import run +from exo.worker.tests.constants import ( COMMAND_1_ID, COMMAND_2_ID, INSTANCE_1_ID, @@ -38,10 +38,10 @@ from worker.tests.constants import ( TASK_1_ID, TASK_2_ID, ) -from worker.tests.test_integration.integration_utils import ( +from exo.worker.tests.test_integration.integration_utils import ( read_streaming_response, ) -from worker.worker import Worker +from exo.worker.worker import Worker MODEL_ID = 'mlx-community/Llama-3.3-70B-Instruct-4bit' diff --git a/worker/tests/test_plan/test_worker_plan.py b/src/exo/worker/tests/test_plan/test_worker_plan.py similarity index 96% rename from worker/tests/test_plan/test_worker_plan.py rename to src/exo/worker/tests/test_plan/test_worker_plan.py index a14521cb..d6ae4e7c 100644 --- a/worker/tests/test_plan/test_worker_plan.py +++ b/src/exo/worker/tests/test_plan/test_worker_plan.py @@ -4,39 +4,39 @@ import logging import pytest -from shared.types.api import ChatCompletionMessage -from shared.types.state import State -from shared.types.tasks import ( +from exo.shared.types.api import ChatCompletionMessage +from exo.shared.types.state import State +from exo.shared.types.tasks import ( ChatCompletionTask, ChatCompletionTaskParams, TaskStatus, TaskType, ) -from shared.types.worker.common import NodeStatus -from shared.types.worker.downloads import ( +from exo.shared.types.worker.common import NodeStatus +from exo.shared.types.worker.downloads import ( DownloadPending, ) -from shared.types.worker.instances import InstanceStatus -from shared.types.worker.ops import ( +from exo.shared.types.worker.instances import InstanceStatus +from exo.shared.types.worker.ops import ( AssignRunnerOp, ExecuteTaskOp, RunnerDownOp, RunnerUpOp, UnassignRunnerOp, ) -from shared.types.worker.runners import ( +from exo.shared.types.worker.runners import ( DownloadingRunnerStatus, FailedRunnerStatus, InactiveRunnerStatus, LoadedRunnerStatus, RunningRunnerStatus, ) -from shared.types.worker.shards import PipelineShardMetadata -from worker.common import AssignedRunner -from worker.download.shard_downloader import NoopShardDownloader -from worker.main import Worker -from worker.plan import plan -from worker.tests.constants import ( +from exo.shared.types.worker.shards import PipelineShardMetadata +from exo.worker.common import AssignedRunner +from exo.worker.download.shard_downloader import NoopShardDownloader +from exo.worker.main import Worker +from exo.worker.plan import plan +from exo.worker.tests.constants import ( COMMAND_1_ID, INSTANCE_1_ID, MODEL_A_ID, @@ -46,7 +46,7 @@ from worker.tests.constants import ( RUNNER_2_ID, TASK_1_ID, ) -from worker.tests.test_plan.test_worker_plan_utils import ( +from exo.worker.tests.test_plan.test_worker_plan_utils import ( InProcessRunner, PlanTestCase, make_downloading_status, diff --git a/worker/tests/test_plan/test_worker_plan_utils.py b/src/exo/worker/tests/test_plan/test_worker_plan_utils.py similarity index 91% rename from worker/tests/test_plan/test_worker_plan_utils.py rename to src/exo/worker/tests/test_plan/test_worker_plan_utils.py index 49283013..f5a2ac5a 100644 --- a/worker/tests/test_plan/test_worker_plan_utils.py +++ b/src/exo/worker/tests/test_plan/test_worker_plan_utils.py @@ -5,24 +5,24 @@ from typing import List, NotRequired, Optional, TypedDict from typing_extensions import Literal -from shared.models.model_cards import MODEL_CARDS, ModelCard -from shared.types.api import ChatCompletionMessage, ChatCompletionTaskParams -from shared.types.common import CommandId, NodeId -from shared.types.models import ModelId, ModelMetadata -from shared.types.state import State -from shared.types.tasks import ChatCompletionTask, TaskId, TaskStatus, TaskType -from shared.types.worker.common import InstanceId, NodeStatus, RunnerId -from shared.types.worker.downloads import DownloadOngoing, DownloadProgressData -from shared.types.worker.instances import Instance, InstanceStatus -from shared.types.worker.ops import RunnerOp -from shared.types.worker.runners import ( +from exo.shared.models.model_cards import MODEL_CARDS, ModelCard +from exo.shared.types.api import ChatCompletionMessage, ChatCompletionTaskParams +from exo.shared.types.common import CommandId, NodeId +from exo.shared.types.models import ModelId, ModelMetadata +from exo.shared.types.state import State +from exo.shared.types.tasks import ChatCompletionTask, TaskId, TaskStatus, TaskType +from exo.shared.types.worker.common import InstanceId, NodeStatus, RunnerId +from exo.shared.types.worker.downloads import DownloadOngoing, DownloadProgressData +from exo.shared.types.worker.instances import Instance, InstanceStatus +from exo.shared.types.worker.ops import RunnerOp +from exo.shared.types.worker.runners import ( DownloadingRunnerStatus, RunnerStatus, RunningRunnerStatus, ShardAssignments, ) -from shared.types.worker.shards import PipelineShardMetadata -from worker.tests.constants import COMMAND_1_ID, INSTANCE_1_ID, MODEL_A_ID +from exo.shared.types.worker.shards import PipelineShardMetadata +from exo.worker.tests.constants import COMMAND_1_ID, INSTANCE_1_ID, MODEL_A_ID class RunnerSpecDict(TypedDict): diff --git a/worker/tests/test_runner_connection.py b/src/exo/worker/tests/test_runner_connection.py similarity index 90% rename from worker/tests/test_runner_connection.py rename to src/exo/worker/tests/test_runner_connection.py index 434f0a7f..80d4c530 100644 --- a/worker/tests/test_runner_connection.py +++ b/src/exo/worker/tests/test_runner_connection.py @@ -5,16 +5,16 @@ from typing import Callable import pytest -from shared.db.sqlite.event_log_manager import EventLogConfig, EventLogManager -from shared.types.common import Host -from shared.types.events import InstanceCreated, InstanceDeleted -from shared.types.models import ModelId -from shared.types.worker.instances import Instance, InstanceStatus, ShardAssignments -from shared.types.worker.runners import FailedRunnerStatus -from shared.types.worker.shards import PipelineShardMetadata -from worker.download.shard_downloader import NoopShardDownloader -from worker.main import run -from worker.tests.constants import ( +from exo.shared.db.sqlite.event_log_manager import EventLogConfig, EventLogManager +from exo.shared.types.common import Host +from exo.shared.types.events import InstanceCreated, InstanceDeleted +from exo.shared.types.models import ModelId +from exo.shared.types.worker.instances import Instance, InstanceStatus, ShardAssignments +from exo.shared.types.worker.runners import FailedRunnerStatus +from exo.shared.types.worker.shards import PipelineShardMetadata +from exo.worker.download.shard_downloader import NoopShardDownloader +from exo.worker.main import run +from exo.worker.tests.constants import ( INSTANCE_1_ID, MASTER_NODE_ID, NODE_A, @@ -22,7 +22,7 @@ from worker.tests.constants import ( RUNNER_1_ID, RUNNER_2_ID, ) -from worker.worker import Worker +from exo.worker.worker import Worker @pytest.fixture @@ -102,7 +102,7 @@ async def check_runner_connection( origin=MASTER_NODE_ID ) - from worker.runner.runner_supervisor import RunnerSupervisor + from exo.worker.runner.runner_supervisor import RunnerSupervisor async def wait_for_runner_supervisor(worker: Worker, timeout: float = 5.0) -> RunnerSupervisor | None: end = asyncio.get_event_loop().time() + timeout diff --git a/worker/tests/test_serdes.py b/src/exo/worker/tests/test_serdes.py similarity index 81% rename from worker/tests/test_serdes.py rename to src/exo/worker/tests/test_serdes.py index 29484833..4239b17d 100644 --- a/worker/tests/test_serdes.py +++ b/src/exo/worker/tests/test_serdes.py @@ -2,15 +2,15 @@ from typing import Callable, TypeVar from pydantic import BaseModel, TypeAdapter -from shared.types.common import Host -from shared.types.tasks import Task, TaskId -from shared.types.worker.commands_runner import ( +from exo.shared.types.common import Host +from exo.shared.types.tasks import Task, TaskId +from exo.shared.types.worker.commands_runner import ( ChatTaskMessage, RunnerMessageTypeAdapter, SetupMessage, ) -from shared.types.worker.common import InstanceId -from shared.types.worker.shards import PipelineShardMetadata +from exo.shared.types.worker.common import InstanceId +from exo.shared.types.worker.shards import PipelineShardMetadata T = TypeVar("T", bound=BaseModel) diff --git a/worker/tests/test_spinup_timeout.py b/src/exo/worker/tests/test_spinup_timeout.py similarity index 75% rename from worker/tests/test_spinup_timeout.py rename to src/exo/worker/tests/test_spinup_timeout.py index c01363fa..b46eb73e 100644 --- a/worker/tests/test_spinup_timeout.py +++ b/src/exo/worker/tests/test_spinup_timeout.py @@ -5,18 +5,18 @@ from typing import Callable import pytest -from shared.types.events import ( +from exo.shared.types.events import ( Event, ) -from shared.types.events._events import RunnerStatusUpdated -from shared.types.tasks import Task, TaskId -from shared.types.worker.instances import Instance, InstanceId -from shared.types.worker.ops import ( +from exo.shared.types.events._events import RunnerStatusUpdated +from exo.shared.types.tasks import Task, TaskId +from exo.shared.types.worker.instances import Instance, InstanceId +from exo.shared.types.worker.ops import ( RunnerUpOp, ) -from shared.types.worker.runners import FailedRunnerStatus -from worker.main import Worker -from worker.tests.constants import RUNNER_1_ID +from exo.shared.types.worker.runners import FailedRunnerStatus +from exo.worker.main import Worker +from exo.worker.tests.constants import RUNNER_1_ID # To enable this test, run pytest with: ENABLE_SPINUP_TIMEOUT_TEST=true pytest diff --git a/worker/tests/test_supervisor/test_memory.py b/src/exo/worker/tests/test_supervisor/test_memory.py similarity index 76% rename from worker/tests/test_supervisor/test_memory.py rename to src/exo/worker/tests/test_supervisor/test_memory.py index 76140d67..5eb97b5f 100644 --- a/worker/tests/test_supervisor/test_memory.py +++ b/src/exo/worker/tests/test_supervisor/test_memory.py @@ -5,14 +5,14 @@ from typing import Callable import psutil import pytest -from shared.models.model_meta import get_model_meta -from shared.types.common import Host -from shared.types.models import ModelMetadata -from shared.types.tasks import Task, TaskId -from shared.types.worker.common import InstanceId, RunnerError -from shared.types.worker.shards import PipelineShardMetadata -from worker.runner.runner_supervisor import RunnerSupervisor -from worker.tests.constants import INSTANCE_1_ID, TASK_1_ID +from exo.shared.models.model_meta import get_model_meta +from exo.shared.types.common import Host +from exo.shared.types.models import ModelMetadata +from exo.shared.types.tasks import Task, TaskId +from exo.shared.types.worker.common import InstanceId, RunnerError +from exo.shared.types.worker.shards import PipelineShardMetadata +from exo.worker.runner.runner_supervisor import RunnerSupervisor +from exo.worker.tests.constants import INSTANCE_1_ID, TASK_1_ID def get_memory_mb(process: Process) -> float: diff --git a/worker/tests/test_supervisor/test_oom.py b/src/exo/worker/tests/test_supervisor/test_oom.py similarity index 79% rename from worker/tests/test_supervisor/test_oom.py rename to src/exo/worker/tests/test_supervisor/test_oom.py index 200ae253..aa2cb6bb 100644 --- a/worker/tests/test_supervisor/test_oom.py +++ b/src/exo/worker/tests/test_supervisor/test_oom.py @@ -3,15 +3,15 @@ from typing import Callable import pytest -from shared.types.common import Host -from shared.types.tasks import ( +from exo.shared.types.common import Host +from exo.shared.types.tasks import ( Task, TaskId, ) -from shared.types.worker.common import InstanceId, RunnerError -from shared.types.worker.shards import PipelineShardMetadata -from worker.runner.runner_supervisor import RunnerSupervisor -from worker.tests.constants import INSTANCE_1_ID, TASK_1_ID +from exo.shared.types.worker.common import InstanceId, RunnerError +from exo.shared.types.worker.shards import PipelineShardMetadata +from exo.worker.runner.runner_supervisor import RunnerSupervisor +from exo.worker.tests.constants import INSTANCE_1_ID, TASK_1_ID @pytest.fixture diff --git a/worker/tests/test_supervisor/test_supervisor.py b/src/exo/worker/tests/test_supervisor/test_supervisor.py similarity index 95% rename from worker/tests/test_supervisor/test_supervisor.py rename to src/exo/worker/tests/test_supervisor/test_supervisor.py index 710da912..5faf3e57 100644 --- a/worker/tests/test_supervisor/test_supervisor.py +++ b/src/exo/worker/tests/test_supervisor/test_supervisor.py @@ -4,18 +4,18 @@ from typing import Callable import pytest -from shared.openai_compat import FinishReason -from shared.types.common import Host -from shared.types.events.chunks import TokenChunk -from shared.types.tasks import ( +from exo.shared.openai_compat import FinishReason +from exo.shared.types.common import Host +from exo.shared.types.events.chunks import TokenChunk +from exo.shared.types.tasks import ( ChatCompletionTaskParams, Task, TaskId, TaskType, ) -from shared.types.worker.common import InstanceId -from shared.types.worker.shards import PipelineShardMetadata -from worker.runner.runner_supervisor import RunnerSupervisor +from exo.shared.types.worker.common import InstanceId +from exo.shared.types.worker.shards import PipelineShardMetadata +from exo.worker.runner.runner_supervisor import RunnerSupervisor @pytest.fixture diff --git a/worker/tests/test_supervisor/test_supervisor_sad.py b/src/exo/worker/tests/test_supervisor/test_supervisor_sad.py similarity index 88% rename from worker/tests/test_supervisor/test_supervisor_sad.py rename to src/exo/worker/tests/test_supervisor/test_supervisor_sad.py index 71986bff..bffae9f5 100644 --- a/worker/tests/test_supervisor/test_supervisor_sad.py +++ b/src/exo/worker/tests/test_supervisor/test_supervisor_sad.py @@ -4,12 +4,12 @@ from typing import Callable import pytest -from shared.types.common import Host -from shared.types.tasks import Task, TaskId -from shared.types.worker.common import InstanceId, RunnerError -from shared.types.worker.shards import PipelineShardMetadata -from worker.runner.runner_supervisor import RunnerSupervisor -from worker.tests.constants import INSTANCE_1_ID, TASK_1_ID +from exo.shared.types.common import Host +from exo.shared.types.tasks import Task, TaskId +from exo.shared.types.worker.common import InstanceId, RunnerError +from exo.shared.types.worker.shards import PipelineShardMetadata +from exo.worker.runner.runner_supervisor import RunnerSupervisor +from exo.worker.tests.constants import INSTANCE_1_ID, TASK_1_ID @pytest.mark.asyncio diff --git a/worker/utils/__init__.py b/src/exo/worker/utils/__init__.py similarity index 100% rename from worker/utils/__init__.py rename to src/exo/worker/utils/__init__.py diff --git a/worker/utils/macmon/.DS_Store b/src/exo/worker/utils/macmon/.DS_Store similarity index 100% rename from worker/utils/macmon/.DS_Store rename to src/exo/worker/utils/macmon/.DS_Store diff --git a/worker/utils/macmon/__init__.py b/src/exo/worker/utils/macmon/__init__.py similarity index 100% rename from worker/utils/macmon/__init__.py rename to src/exo/worker/utils/macmon/__init__.py diff --git a/worker/utils/macmon/macmon.py b/src/exo/worker/utils/macmon/macmon.py similarity index 100% rename from worker/utils/macmon/macmon.py rename to src/exo/worker/utils/macmon/macmon.py diff --git a/worker/utils/profile.py b/src/exo/worker/utils/profile.py similarity index 96% rename from worker/utils/profile.py rename to src/exo/worker/utils/profile.py index 50a54c83..d1763eb3 100644 --- a/worker/utils/profile.py +++ b/src/exo/worker/utils/profile.py @@ -3,18 +3,18 @@ import os import platform from typing import Any, Callable, Coroutine -from shared.types.profiling import ( +from exo.shared.types.profiling import ( MemoryPerformanceProfile, NodePerformanceProfile, SystemPerformanceProfile, ) -from worker.utils.macmon.macmon import ( +from exo.worker.utils.macmon.macmon import ( Metrics, ) -from worker.utils.macmon.macmon import ( +from exo.worker.utils.macmon.macmon import ( get_metrics_async as macmon_get_metrics_async, ) -from worker.utils.system_info import ( +from exo.worker.utils.system_info import ( get_mac_friendly_name_async, get_mac_system_info_async, get_network_interface_info_async, diff --git a/worker/utils/system_info.py b/src/exo/worker/utils/system_info.py similarity index 99% rename from worker/utils/system_info.py rename to src/exo/worker/utils/system_info.py index 798a8990..b5e2a0c8 100644 --- a/worker/utils/system_info.py +++ b/src/exo/worker/utils/system_info.py @@ -5,7 +5,7 @@ from typing import Dict, List, Optional from pydantic import BaseModel, Field -from shared.types.profiling import NetworkInterfaceInfo +from exo.shared.types.profiling import NetworkInterfaceInfo class SystemInfo(BaseModel): diff --git a/worker/worker.py b/src/exo/worker/worker.py similarity index 95% rename from worker/worker.py rename to src/exo/worker/worker.py index 9f430386..25dfd36b 100644 --- a/worker/worker.py +++ b/src/exo/worker/worker.py @@ -5,9 +5,9 @@ from asyncio import Queue from functools import partial from typing import AsyncGenerator, Optional -from shared.db.sqlite import AsyncSQLiteEventStorage -from shared.types.common import NodeId -from shared.types.events import ( +from exo.shared.db.sqlite import AsyncSQLiteEventStorage +from exo.shared.types.common import NodeId +from exo.shared.types.events import ( ChunkGenerated, Event, InstanceDeleted, @@ -16,16 +16,16 @@ from shared.types.events import ( TaskFailed, TaskStateUpdated, ) -from shared.types.state import State -from shared.types.tasks import TaskId, TaskStatus -from shared.types.worker.common import RunnerId -from shared.types.worker.downloads import ( +from exo.shared.types.state import State +from exo.shared.types.tasks import TaskId, TaskStatus +from exo.shared.types.worker.common import RunnerId +from exo.shared.types.worker.downloads import ( DownloadCompleted, DownloadOngoing, DownloadPending, DownloadProgressData, ) -from shared.types.worker.ops import ( +from exo.shared.types.worker.ops import ( AssignRunnerOp, ExecuteTaskOp, RunnerDownOp, @@ -35,17 +35,17 @@ from shared.types.worker.ops import ( RunnerUpOp, UnassignRunnerOp, ) -from shared.types.worker.runners import ( +from exo.shared.types.worker.runners import ( DownloadingRunnerStatus, FailedRunnerStatus, InactiveRunnerStatus, LoadedRunnerStatus, RunningRunnerStatus, ) -from shared.types.worker.shards import ShardMetadata -from worker.common import AssignedRunner -from worker.download.shard_downloader import RepoDownloadProgress, ShardDownloader -from worker.runner.runner_supervisor import RunnerSupervisor +from exo.shared.types.worker.shards import ShardMetadata +from exo.worker.common import AssignedRunner +from exo.worker.download.shard_downloader import RepoDownloadProgress, ShardDownloader +from exo.worker.runner.runner_supervisor import RunnerSupervisor class Worker: diff --git a/uv.lock b/uv.lock index 9a0ec757..f8fb5d9f 100644 --- a/uv.lock +++ b/uv.lock @@ -13,11 +13,7 @@ supported-markers = [ [manifest] members = [ "exo", - "exo-engine-mlx", - "exo-master", "exo-scripts", - "exo-shared", - "exo-worker", ] [[package]] @@ -40,7 +36,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.12.14" +version = "3.12.15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -51,23 +47,23 @@ dependencies = [ { name = "propcache", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "yarl", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e6/0b/e39ad954107ebf213a2325038a3e7a506be3d98e1435e1f82086eec4cde2/aiohttp-3.12.14.tar.gz", hash = "sha256:6e06e120e34d93100de448fd941522e11dafa78ef1a893c179901b7d66aa29f2", size = 7822921, upload-time = "2025-07-10T13:05:33.968Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/e7/d92a237d8802ca88483906c388f7c201bbe96cd80a165ffd0ac2f6a8d59f/aiohttp-3.12.15.tar.gz", hash = "sha256:4fc61385e9c98d72fcdf47e6dd81833f47b2f77c114c29cd64a361be57a763a2", size = 7823716, upload-time = "2025-07-29T05:52:32.215Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/48/e0d2fa8ac778008071e7b79b93ab31ef14ab88804d7ba71b5c964a7c844e/aiohttp-3.12.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3143a7893d94dc82bc409f7308bc10d60285a3cd831a68faf1aa0836c5c3c767", size = 695471, upload-time = "2025-07-10T13:04:20.124Z" }, - { url = "https://files.pythonhosted.org/packages/8d/e7/f73206afa33100804f790b71092888f47df65fd9a4cd0e6800d7c6826441/aiohttp-3.12.14-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3d62ac3d506cef54b355bd34c2a7c230eb693880001dfcda0bf88b38f5d7af7e", size = 473128, upload-time = "2025-07-10T13:04:21.928Z" }, - { url = "https://files.pythonhosted.org/packages/df/e2/4dd00180be551a6e7ee979c20fc7c32727f4889ee3fd5b0586e0d47f30e1/aiohttp-3.12.14-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:48e43e075c6a438937c4de48ec30fa8ad8e6dfef122a038847456bfe7b947b63", size = 465426, upload-time = "2025-07-10T13:04:24.071Z" }, - { url = "https://files.pythonhosted.org/packages/de/dd/525ed198a0bb674a323e93e4d928443a680860802c44fa7922d39436b48b/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:077b4488411a9724cecc436cbc8c133e0d61e694995b8de51aaf351c7578949d", size = 1704252, upload-time = "2025-07-10T13:04:26.049Z" }, - { url = "https://files.pythonhosted.org/packages/d8/b1/01e542aed560a968f692ab4fc4323286e8bc4daae83348cd63588e4f33e3/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d8c35632575653f297dcbc9546305b2c1133391089ab925a6a3706dfa775ccab", size = 1685514, upload-time = "2025-07-10T13:04:28.186Z" }, - { url = "https://files.pythonhosted.org/packages/b3/06/93669694dc5fdabdc01338791e70452d60ce21ea0946a878715688d5a191/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b8ce87963f0035c6834b28f061df90cf525ff7c9b6283a8ac23acee6502afd4", size = 1737586, upload-time = "2025-07-10T13:04:30.195Z" }, - { url = "https://files.pythonhosted.org/packages/a5/3a/18991048ffc1407ca51efb49ba8bcc1645961f97f563a6c480cdf0286310/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0a2cf66e32a2563bb0766eb24eae7e9a269ac0dc48db0aae90b575dc9583026", size = 1786958, upload-time = "2025-07-10T13:04:32.482Z" }, - { url = "https://files.pythonhosted.org/packages/30/a8/81e237f89a32029f9b4a805af6dffc378f8459c7b9942712c809ff9e76e5/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdea089caf6d5cde975084a884c72d901e36ef9c2fd972c9f51efbbc64e96fbd", size = 1709287, upload-time = "2025-07-10T13:04:34.493Z" }, - { url = "https://files.pythonhosted.org/packages/8c/e3/bd67a11b0fe7fc12c6030473afd9e44223d456f500f7cf526dbaa259ae46/aiohttp-3.12.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7865f27db67d49e81d463da64a59365ebd6b826e0e4847aa111056dcb9dc88", size = 1622990, upload-time = "2025-07-10T13:04:36.433Z" }, - { url = "https://files.pythonhosted.org/packages/83/ba/e0cc8e0f0d9ce0904e3cf2d6fa41904e379e718a013c721b781d53dcbcca/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0ab5b38a6a39781d77713ad930cb5e7feea6f253de656a5f9f281a8f5931b086", size = 1676015, upload-time = "2025-07-10T13:04:38.958Z" }, - { url = "https://files.pythonhosted.org/packages/d8/b3/1e6c960520bda094c48b56de29a3d978254637ace7168dd97ddc273d0d6c/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:9b3b15acee5c17e8848d90a4ebc27853f37077ba6aec4d8cb4dbbea56d156933", size = 1707678, upload-time = "2025-07-10T13:04:41.275Z" }, - { url = "https://files.pythonhosted.org/packages/0a/19/929a3eb8c35b7f9f076a462eaa9830b32c7f27d3395397665caa5e975614/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e4c972b0bdaac167c1e53e16a16101b17c6d0ed7eac178e653a07b9f7fad7151", size = 1650274, upload-time = "2025-07-10T13:04:43.483Z" }, - { url = "https://files.pythonhosted.org/packages/22/e5/81682a6f20dd1b18ce3d747de8eba11cbef9b270f567426ff7880b096b48/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7442488b0039257a3bdbc55f7209587911f143fca11df9869578db6c26feeeb8", size = 1726408, upload-time = "2025-07-10T13:04:45.577Z" }, - { url = "https://files.pythonhosted.org/packages/8c/17/884938dffaa4048302985483f77dfce5ac18339aad9b04ad4aaa5e32b028/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f68d3067eecb64c5e9bab4a26aa11bd676f4c70eea9ef6536b0a4e490639add3", size = 1759879, upload-time = "2025-07-10T13:04:47.663Z" }, - { url = "https://files.pythonhosted.org/packages/95/78/53b081980f50b5cf874359bde707a6eacd6c4be3f5f5c93937e48c9d0025/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f88d3704c8b3d598a08ad17d06006cb1ca52a1182291f04979e305c8be6c9758", size = 1708770, upload-time = "2025-07-10T13:04:49.944Z" }, + { url = "https://files.pythonhosted.org/packages/f2/33/918091abcf102e39d15aba2476ad9e7bd35ddb190dcdd43a854000d3da0d/aiohttp-3.12.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9f922ffd05034d439dde1c77a20461cf4a1b0831e6caa26151fe7aa8aaebc315", size = 696741, upload-time = "2025-07-29T05:51:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2a/7495a81e39a998e400f3ecdd44a62107254803d1681d9189be5c2e4530cd/aiohttp-3.12.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ee8a8ac39ce45f3e55663891d4b1d15598c157b4d494a4613e704c8b43112cd", size = 474407, upload-time = "2025-07-29T05:51:21.165Z" }, + { url = "https://files.pythonhosted.org/packages/49/fc/a9576ab4be2dcbd0f73ee8675d16c707cfc12d5ee80ccf4015ba543480c9/aiohttp-3.12.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3eae49032c29d356b94eee45a3f39fdf4b0814b397638c2f718e96cfadf4c4e4", size = 466703, upload-time = "2025-07-29T05:51:22.948Z" }, + { url = "https://files.pythonhosted.org/packages/09/2f/d4bcc8448cf536b2b54eed48f19682031ad182faa3a3fee54ebe5b156387/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97752ff12cc12f46a9b20327104448042fce5c33a624f88c18f66f9368091c7", size = 1705532, upload-time = "2025-07-29T05:51:25.211Z" }, + { url = "https://files.pythonhosted.org/packages/f1/f3/59406396083f8b489261e3c011aa8aee9df360a96ac8fa5c2e7e1b8f0466/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:894261472691d6fe76ebb7fcf2e5870a2ac284c7406ddc95823c8598a1390f0d", size = 1686794, upload-time = "2025-07-29T05:51:27.145Z" }, + { url = "https://files.pythonhosted.org/packages/dc/71/164d194993a8d114ee5656c3b7ae9c12ceee7040d076bf7b32fb98a8c5c6/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fa5d9eb82ce98959fc1031c28198b431b4d9396894f385cb63f1e2f3f20ca6b", size = 1738865, upload-time = "2025-07-29T05:51:29.366Z" }, + { url = "https://files.pythonhosted.org/packages/1c/00/d198461b699188a93ead39cb458554d9f0f69879b95078dce416d3209b54/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fa751efb11a541f57db59c1dd821bec09031e01452b2b6217319b3a1f34f3d", size = 1788238, upload-time = "2025-07-29T05:51:31.285Z" }, + { url = "https://files.pythonhosted.org/packages/85/b8/9e7175e1fa0ac8e56baa83bf3c214823ce250d0028955dfb23f43d5e61fd/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5346b93e62ab51ee2a9d68e8f73c7cf96ffb73568a23e683f931e52450e4148d", size = 1710566, upload-time = "2025-07-29T05:51:33.219Z" }, + { url = "https://files.pythonhosted.org/packages/59/e4/16a8eac9df39b48ae102ec030fa9f726d3570732e46ba0c592aeeb507b93/aiohttp-3.12.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:049ec0360f939cd164ecbfd2873eaa432613d5e77d6b04535e3d1fbae5a9e645", size = 1624270, upload-time = "2025-07-29T05:51:35.195Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/cd84dee7b6ace0740908fd0af170f9fab50c2a41ccbc3806aabcb1050141/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b52dcf013b57464b6d1e51b627adfd69a8053e84b7103a7cd49c030f9ca44461", size = 1677294, upload-time = "2025-07-29T05:51:37.215Z" }, + { url = "https://files.pythonhosted.org/packages/ce/42/d0f1f85e50d401eccd12bf85c46ba84f947a84839c8a1c2c5f6e8ab1eb50/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:9b2af240143dd2765e0fb661fd0361a1b469cab235039ea57663cda087250ea9", size = 1708958, upload-time = "2025-07-29T05:51:39.328Z" }, + { url = "https://files.pythonhosted.org/packages/d5/6b/f6fa6c5790fb602538483aa5a1b86fcbad66244997e5230d88f9412ef24c/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ac77f709a2cde2cc71257ab2d8c74dd157c67a0558a0d2799d5d571b4c63d44d", size = 1651553, upload-time = "2025-07-29T05:51:41.356Z" }, + { url = "https://files.pythonhosted.org/packages/04/36/a6d36ad545fa12e61d11d1932eef273928b0495e6a576eb2af04297fdd3c/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:47f6b962246f0a774fbd3b6b7be25d59b06fdb2f164cf2513097998fc6a29693", size = 1727688, upload-time = "2025-07-29T05:51:43.452Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c8/f195e5e06608a97a4e52c5d41c7927301bf757a8e8bb5bbf8cef6c314961/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:760fb7db442f284996e39cf9915a94492e1896baac44f06ae551974907922b64", size = 1761157, upload-time = "2025-07-29T05:51:45.643Z" }, + { url = "https://files.pythonhosted.org/packages/05/6a/ea199e61b67f25ba688d3ce93f63b49b0a4e3b3d380f03971b4646412fc6/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad702e57dc385cae679c39d318def49aef754455f237499d5b99bea4ef582e51", size = 1710050, upload-time = "2025-07-29T05:51:48.203Z" }, ] [[package]] @@ -105,15 +101,15 @@ wheels = [ [[package]] name = "anyio" -version = "4.9.0" +version = "4.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "sniffio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/b4/636b3b65173d3ce9a38ef5f0522789614e590dab6a8d505340a4efe4c567/anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", size = 213252, upload-time = "2025-08-04T08:54:26.451Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" }, + { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] [[package]] @@ -135,12 +131,21 @@ wheels = [ ] [[package]] -name = "certifi" -version = "2025.7.14" +name = "braq" +version = "0.0.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981, upload-time = "2025-07-14T03:29:28.449Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/3b/1b918c408e11ca33f9b9dcecc8e08eac7762887dd42b584f0efb6fe26c55/braq-0.0.12.tar.gz", hash = "sha256:51dae51b863cbba2cd37da163df06b7dc5124904d2c26b92bda54c1bde66d74b", size = 15272, upload-time = "2024-12-10T20:48:53.856Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722, upload-time = "2025-07-14T03:29:26.863Z" }, + { url = "https://files.pythonhosted.org/packages/f3/53/ed5082619966b1d15b5c039ac722ba99956d92d4b08a9bd5eb4c3535cc1f/braq-0.0.12-py3-none-any.whl", hash = "sha256:41b7bdd0d004faef693751615fbb11c53ac0b886c772b83aea61ea6dc2f6e518", size = 26392, upload-time = "2024-12-10T20:48:50.813Z" }, +] + +[[package]] +name = "certifi" +version = "2025.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" }, ] [[package]] @@ -165,22 +170,29 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.4.2" +version = "3.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, - { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, - { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, - { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, - { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, - { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, - { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, - { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, - { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, - { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, - { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, - { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" }, + { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" }, + { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" }, + { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" }, + { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" }, + { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" }, + { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" }, + { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" }, + { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" }, + { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" }, + { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" }, + { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, ] [[package]] @@ -194,33 +206,33 @@ wheels = [ [[package]] name = "cryptography" -version = "45.0.5" +version = "45.0.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "(platform_python_implementation != 'PyPy' and sys_platform == 'darwin') or (platform_python_implementation != 'PyPy' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/1e/49527ac611af559665f71cbb8f92b332b5ec9c6fbc4e88b0f8e92f5e85df/cryptography-45.0.5.tar.gz", hash = "sha256:72e76caa004ab63accdf26023fccd1d087f6d90ec6048ff33ad0445abf7f605a", size = 744903, upload-time = "2025-07-02T13:06:25.941Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/0d/d13399c94234ee8f3df384819dc67e0c5ce215fb751d567a55a1f4b028c7/cryptography-45.0.6.tar.gz", hash = "sha256:5c966c732cf6e4a276ce83b6e4c729edda2df6929083a952cc7da973c539c719", size = 744949, upload-time = "2025-08-05T23:59:27.93Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/fb/09e28bc0c46d2c547085e60897fea96310574c70fb21cd58a730a45f3403/cryptography-45.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:101ee65078f6dd3e5a028d4f19c07ffa4dd22cce6a20eaa160f8b5219911e7d8", size = 7043092, upload-time = "2025-07-02T13:05:01.514Z" }, - { url = "https://files.pythonhosted.org/packages/b1/05/2194432935e29b91fb649f6149c1a4f9e6d3d9fc880919f4ad1bcc22641e/cryptography-45.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a264aae5f7fbb089dbc01e0242d3b67dffe3e6292e1f5182122bdf58e65215d", size = 4205926, upload-time = "2025-07-02T13:05:04.741Z" }, - { url = "https://files.pythonhosted.org/packages/07/8b/9ef5da82350175e32de245646b1884fc01124f53eb31164c77f95a08d682/cryptography-45.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e74d30ec9c7cb2f404af331d5b4099a9b322a8a6b25c4632755c8757345baac5", size = 4429235, upload-time = "2025-07-02T13:05:07.084Z" }, - { url = "https://files.pythonhosted.org/packages/7c/e1/c809f398adde1994ee53438912192d92a1d0fc0f2d7582659d9ef4c28b0c/cryptography-45.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3af26738f2db354aafe492fb3869e955b12b2ef2e16908c8b9cb928128d42c57", size = 4209785, upload-time = "2025-07-02T13:05:09.321Z" }, - { url = "https://files.pythonhosted.org/packages/d0/8b/07eb6bd5acff58406c5e806eff34a124936f41a4fb52909ffa4d00815f8c/cryptography-45.0.5-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e6c00130ed423201c5bc5544c23359141660b07999ad82e34e7bb8f882bb78e0", size = 3893050, upload-time = "2025-07-02T13:05:11.069Z" }, - { url = "https://files.pythonhosted.org/packages/ec/ef/3333295ed58d900a13c92806b67e62f27876845a9a908c939f040887cca9/cryptography-45.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:dd420e577921c8c2d31289536c386aaa30140b473835e97f83bc71ea9d2baf2d", size = 4457379, upload-time = "2025-07-02T13:05:13.32Z" }, - { url = "https://files.pythonhosted.org/packages/d9/9d/44080674dee514dbb82b21d6fa5d1055368f208304e2ab1828d85c9de8f4/cryptography-45.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d05a38884db2ba215218745f0781775806bde4f32e07b135348355fe8e4991d9", size = 4209355, upload-time = "2025-07-02T13:05:15.017Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d8/0749f7d39f53f8258e5c18a93131919ac465ee1f9dccaf1b3f420235e0b5/cryptography-45.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ad0caded895a00261a5b4aa9af828baede54638754b51955a0ac75576b831b27", size = 4456087, upload-time = "2025-07-02T13:05:16.945Z" }, - { url = "https://files.pythonhosted.org/packages/09/d7/92acac187387bf08902b0bf0699816f08553927bdd6ba3654da0010289b4/cryptography-45.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9024beb59aca9d31d36fcdc1604dd9bbeed0a55bface9f1908df19178e2f116e", size = 4332873, upload-time = "2025-07-02T13:05:18.743Z" }, - { url = "https://files.pythonhosted.org/packages/03/c2/840e0710da5106a7c3d4153c7215b2736151bba60bf4491bdb421df5056d/cryptography-45.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:91098f02ca81579c85f66df8a588c78f331ca19089763d733e34ad359f474174", size = 4564651, upload-time = "2025-07-02T13:05:21.382Z" }, - { url = "https://files.pythonhosted.org/packages/fe/2b/160ce8c2765e7a481ce57d55eba1546148583e7b6f85514472b1d151711d/cryptography-45.0.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f3562c2f23c612f2e4a6964a61d942f891d29ee320edb62ff48ffb99f3de9ae8", size = 7017143, upload-time = "2025-07-02T13:05:27.229Z" }, - { url = "https://files.pythonhosted.org/packages/c2/e7/2187be2f871c0221a81f55ee3105d3cf3e273c0a0853651d7011eada0d7e/cryptography-45.0.5-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3fcfbefc4a7f332dece7272a88e410f611e79458fab97b5efe14e54fe476f4fd", size = 4197780, upload-time = "2025-07-02T13:05:29.299Z" }, - { url = "https://files.pythonhosted.org/packages/b9/cf/84210c447c06104e6be9122661159ad4ce7a8190011669afceeaea150524/cryptography-45.0.5-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:460f8c39ba66af7db0545a8c6f2eabcbc5a5528fc1cf6c3fa9a1e44cec33385e", size = 4420091, upload-time = "2025-07-02T13:05:31.221Z" }, - { url = "https://files.pythonhosted.org/packages/3e/6a/cb8b5c8bb82fafffa23aeff8d3a39822593cee6e2f16c5ca5c2ecca344f7/cryptography-45.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9b4cf6318915dccfe218e69bbec417fdd7c7185aa7aab139a2c0beb7468c89f0", size = 4198711, upload-time = "2025-07-02T13:05:33.062Z" }, - { url = "https://files.pythonhosted.org/packages/04/f7/36d2d69df69c94cbb2473871926daf0f01ad8e00fe3986ac3c1e8c4ca4b3/cryptography-45.0.5-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2089cc8f70a6e454601525e5bf2779e665d7865af002a5dec8d14e561002e135", size = 3883299, upload-time = "2025-07-02T13:05:34.94Z" }, - { url = "https://files.pythonhosted.org/packages/82/c7/f0ea40f016de72f81288e9fe8d1f6748036cb5ba6118774317a3ffc6022d/cryptography-45.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0027d566d65a38497bc37e0dd7c2f8ceda73597d2ac9ba93810204f56f52ebc7", size = 4450558, upload-time = "2025-07-02T13:05:37.288Z" }, - { url = "https://files.pythonhosted.org/packages/06/ae/94b504dc1a3cdf642d710407c62e86296f7da9e66f27ab12a1ee6fdf005b/cryptography-45.0.5-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:be97d3a19c16a9be00edf79dca949c8fa7eff621763666a145f9f9535a5d7f42", size = 4198020, upload-time = "2025-07-02T13:05:39.102Z" }, - { url = "https://files.pythonhosted.org/packages/05/2b/aaf0adb845d5dabb43480f18f7ca72e94f92c280aa983ddbd0bcd6ecd037/cryptography-45.0.5-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:7760c1c2e1a7084153a0f68fab76e754083b126a47d0117c9ed15e69e2103492", size = 4449759, upload-time = "2025-07-02T13:05:41.398Z" }, - { url = "https://files.pythonhosted.org/packages/91/e4/f17e02066de63e0100a3a01b56f8f1016973a1d67551beaf585157a86b3f/cryptography-45.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6ff8728d8d890b3dda5765276d1bc6fb099252915a2cd3aff960c4c195745dd0", size = 4319991, upload-time = "2025-07-02T13:05:43.64Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2e/e2dbd629481b499b14516eed933f3276eb3239f7cee2dcfa4ee6b44d4711/cryptography-45.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7259038202a47fdecee7e62e0fd0b0738b6daa335354396c6ddebdbe1206af2a", size = 4554189, upload-time = "2025-07-02T13:05:46.045Z" }, + { url = "https://files.pythonhosted.org/packages/8c/29/2793d178d0eda1ca4a09a7c4e09a5185e75738cc6d526433e8663b460ea6/cryptography-45.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74", size = 7042702, upload-time = "2025-08-05T23:58:23.464Z" }, + { url = "https://files.pythonhosted.org/packages/b3/b6/cabd07410f222f32c8d55486c464f432808abaa1f12af9afcbe8f2f19030/cryptography-45.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f", size = 4206483, upload-time = "2025-08-05T23:58:27.132Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9e/f9c7d36a38b1cfeb1cc74849aabe9bf817990f7603ff6eb485e0d70e0b27/cryptography-45.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e40b80ecf35ec265c452eea0ba94c9587ca763e739b8e559c128d23bff7ebbbf", size = 4429679, upload-time = "2025-08-05T23:58:29.152Z" }, + { url = "https://files.pythonhosted.org/packages/9c/2a/4434c17eb32ef30b254b9e8b9830cee4e516f08b47fdd291c5b1255b8101/cryptography-45.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:00e8724bdad672d75e6f069b27970883179bd472cd24a63f6e620ca7e41cc0c5", size = 4210553, upload-time = "2025-08-05T23:58:30.596Z" }, + { url = "https://files.pythonhosted.org/packages/ef/1d/09a5df8e0c4b7970f5d1f3aff1b640df6d4be28a64cae970d56c6cf1c772/cryptography-45.0.6-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a3085d1b319d35296176af31c90338eeb2ddac8104661df79f80e1d9787b8b2", size = 3894499, upload-time = "2025-08-05T23:58:32.03Z" }, + { url = "https://files.pythonhosted.org/packages/79/62/120842ab20d9150a9d3a6bdc07fe2870384e82f5266d41c53b08a3a96b34/cryptography-45.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1b7fa6a1c1188c7ee32e47590d16a5a0646270921f8020efc9a511648e1b2e08", size = 4458484, upload-time = "2025-08-05T23:58:33.526Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/1bc3634d45ddfed0871bfba52cf8f1ad724761662a0c792b97a951fb1b30/cryptography-45.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:275ba5cc0d9e320cd70f8e7b96d9e59903c815ca579ab96c1e37278d231fc402", size = 4210281, upload-time = "2025-08-05T23:58:35.445Z" }, + { url = "https://files.pythonhosted.org/packages/7d/fe/ffb12c2d83d0ee625f124880a1f023b5878f79da92e64c37962bbbe35f3f/cryptography-45.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f4028f29a9f38a2025abedb2e409973709c660d44319c61762202206ed577c42", size = 4456890, upload-time = "2025-08-05T23:58:36.923Z" }, + { url = "https://files.pythonhosted.org/packages/8c/8e/b3f3fe0dc82c77a0deb5f493b23311e09193f2268b77196ec0f7a36e3f3e/cryptography-45.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ee411a1b977f40bd075392c80c10b58025ee5c6b47a822a33c1198598a7a5f05", size = 4333247, upload-time = "2025-08-05T23:58:38.781Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a6/c3ef2ab9e334da27a1d7b56af4a2417d77e7806b2e0f90d6267ce120d2e4/cryptography-45.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e2a21a8eda2d86bb604934b6b37691585bd095c1f788530c1fcefc53a82b3453", size = 4565045, upload-time = "2025-08-05T23:58:40.415Z" }, + { url = "https://files.pythonhosted.org/packages/5b/af/bcfbea93a30809f126d51c074ee0fac5bd9d57d068edf56c2a73abedbea4/cryptography-45.0.6-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:3436128a60a5e5490603ab2adbabc8763613f638513ffa7d311c900a8349a2a0", size = 7020111, upload-time = "2025-08-05T23:58:45.316Z" }, + { url = "https://files.pythonhosted.org/packages/98/c6/ea5173689e014f1a8470899cd5beeb358e22bb3cf5a876060f9d1ca78af4/cryptography-45.0.6-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0d9ef57b6768d9fa58e92f4947cea96ade1233c0e236db22ba44748ffedca394", size = 4198169, upload-time = "2025-08-05T23:58:47.121Z" }, + { url = "https://files.pythonhosted.org/packages/ba/73/b12995edc0c7e2311ffb57ebd3b351f6b268fed37d93bfc6f9856e01c473/cryptography-45.0.6-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea3c42f2016a5bbf71825537c2ad753f2870191134933196bee408aac397b3d9", size = 4421273, upload-time = "2025-08-05T23:58:48.557Z" }, + { url = "https://files.pythonhosted.org/packages/f7/6e/286894f6f71926bc0da67408c853dd9ba953f662dcb70993a59fd499f111/cryptography-45.0.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:20ae4906a13716139d6d762ceb3e0e7e110f7955f3bc3876e3a07f5daadec5f3", size = 4199211, upload-time = "2025-08-05T23:58:50.139Z" }, + { url = "https://files.pythonhosted.org/packages/de/34/a7f55e39b9623c5cb571d77a6a90387fe557908ffc44f6872f26ca8ae270/cryptography-45.0.6-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dac5ec199038b8e131365e2324c03d20e97fe214af051d20c49db129844e8b3", size = 3883732, upload-time = "2025-08-05T23:58:52.253Z" }, + { url = "https://files.pythonhosted.org/packages/f9/b9/c6d32edbcba0cd9f5df90f29ed46a65c4631c4fbe11187feb9169c6ff506/cryptography-45.0.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:18f878a34b90d688982e43f4b700408b478102dd58b3e39de21b5ebf6509c301", size = 4450655, upload-time = "2025-08-05T23:58:53.848Z" }, + { url = "https://files.pythonhosted.org/packages/77/2d/09b097adfdee0227cfd4c699b3375a842080f065bab9014248933497c3f9/cryptography-45.0.6-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5bd6020c80c5b2b2242d6c48487d7b85700f5e0038e67b29d706f98440d66eb5", size = 4198956, upload-time = "2025-08-05T23:58:55.209Z" }, + { url = "https://files.pythonhosted.org/packages/55/66/061ec6689207d54effdff535bbdf85cc380d32dd5377173085812565cf38/cryptography-45.0.6-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:eccddbd986e43014263eda489abbddfbc287af5cddfd690477993dbb31e31016", size = 4449859, upload-time = "2025-08-05T23:58:56.639Z" }, + { url = "https://files.pythonhosted.org/packages/41/ff/e7d5a2ad2d035e5a2af116e1a3adb4d8fcd0be92a18032917a089c6e5028/cryptography-45.0.6-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:550ae02148206beb722cfe4ef0933f9352bab26b087af00e48fdfb9ade35c5b3", size = 4320254, upload-time = "2025-08-05T23:58:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/82/27/092d311af22095d288f4db89fcaebadfb2f28944f3d790a4cf51fe5ddaeb/cryptography-45.0.6-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5b64e668fc3528e77efa51ca70fadcd6610e8ab231e3e06ae2bab3b31c2b8ed9", size = 4554815, upload-time = "2025-08-05T23:59:00.283Z" }, ] [[package]] @@ -239,13 +251,29 @@ source = { editable = "." } dependencies = [ { name = "aiofiles", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "aiohttp", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "aiosqlite", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "base58", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "cryptography", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "exo-master", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "exo-worker", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "fastapi", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "filelock", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "greenlet", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "huggingface-hub", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "mlx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "mlx-lm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "networkx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "openai", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pathlib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "psutil", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "rich", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "rustworkx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "sqlalchemy", extra = ["asyncio"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "sqlmodel", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "transformers", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typeguard", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "types-aiofiles", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "uvicorn", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] [package.optional-dependencies] @@ -264,14 +292,30 @@ dev = [ requires-dist = [ { name = "aiofiles", specifier = ">=24.1.0" }, { name = "aiohttp", specifier = ">=3.12.14" }, + { name = "aiosqlite", specifier = ">=0.21.0" }, { name = "base58", specifier = ">=2.1.1" }, { name = "cryptography", specifier = ">=45.0.5" }, - { name = "exo-master", editable = "master" }, - { name = "exo-worker", editable = "worker" }, + { name = "fastapi", specifier = ">=0.116.1" }, + { name = "filelock", specifier = ">=3.18.0" }, + { name = "greenlet", specifier = ">=3.2.4" }, + { name = "huggingface-hub", specifier = ">=0.33.4" }, + { name = "mlx", specifier = "==0.26.3" }, { name = "mlx", marker = "extra == 'darwin'" }, + { name = "mlx-lm", git = "https://github.com/ml-explore/mlx-lm.git" }, + { name = "networkx", specifier = ">=3.5" }, + { name = "openai", specifier = ">=1.99.9" }, + { name = "pathlib", specifier = ">=1.0.1" }, + { name = "protobuf", specifier = ">=6.32.0" }, + { name = "psutil", specifier = ">=7.0.0" }, { name = "pydantic", specifier = ">=2.11.7" }, + { name = "rich", specifier = ">=14.1.0" }, + { name = "rustworkx", specifier = ">=0.17.1" }, + { name = "sqlalchemy", extras = ["asyncio"], specifier = ">=2.0.43" }, + { name = "sqlmodel", specifier = ">=0.0.24" }, + { name = "transformers", specifier = ">=4.55.2" }, { name = "typeguard", specifier = ">=4.4.4" }, { name = "types-aiofiles", specifier = ">=24.1.0.20250708" }, + { name = "uvicorn", specifier = ">=0.35.0" }, ] provides-extras = ["darwin"] @@ -282,117 +326,19 @@ dev = [ { name = "ruff", specifier = ">=0.11.13" }, ] -[[package]] -name = "exo-engine-mlx" -version = "0.1.0" -source = { editable = "engines/mlx" } - -[[package]] -name = "exo-master" -version = "0.1.0" -source = { editable = "master" } -dependencies = [ - { name = "exo-shared", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "fastapi", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "uvicorn", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] - -[package.metadata] -requires-dist = [ - { name = "exo-shared", editable = "shared" }, - { name = "fastapi", specifier = ">=0.116.0" }, - { name = "uvicorn", specifier = ">=0.35.0" }, -] - [[package]] name = "exo-scripts" version = "0.1.0" source = { editable = "scripts" } dependencies = [ - { name = "exo-shared", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "huggingface-hub", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "shared", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] [package.metadata] requires-dist = [ - { name = "exo-shared", editable = "shared" }, { name = "huggingface-hub", specifier = ">=0.33.4" }, -] - -[[package]] -name = "exo-shared" -version = "0.1.0" -source = { editable = "shared" } -dependencies = [ - { name = "aiosqlite", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "base58", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "cryptography", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "filelock", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "greenlet", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "networkx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "openai", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pathlib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "rich", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "rustworkx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "sqlalchemy", extra = ["asyncio"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "sqlmodel", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] - -[package.dev-dependencies] -dev = [ - { name = "pytest", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pytest-asyncio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "types-protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] - -[package.metadata] -requires-dist = [ - { name = "aiosqlite", specifier = ">=0.20.0" }, - { name = "base58", specifier = ">=2.1.1" }, - { name = "cryptography", specifier = ">=44.0.0" }, - { name = "filelock", specifier = ">=3.18.0" }, - { name = "greenlet", specifier = ">=3.2.3" }, - { name = "networkx", specifier = ">=3.5" }, - { name = "openai", specifier = ">=1.93.0" }, - { name = "pathlib", specifier = ">=1.0.1" }, - { name = "protobuf", specifier = ">=6.31.1" }, - { name = "pydantic", specifier = ">=2.11.7" }, - { name = "rich", specifier = ">=14.0.0" }, - { name = "rustworkx", specifier = ">=0.16.0" }, - { name = "sqlalchemy", extras = ["asyncio"], specifier = ">=2.0.0" }, - { name = "sqlmodel", specifier = ">=0.0.22" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "pytest", specifier = ">=8.4.0" }, - { name = "pytest-asyncio", specifier = ">=1.0.0" }, - { name = "types-protobuf", specifier = ">=6.30.2.20250516" }, -] - -[[package]] -name = "exo-worker" -version = "0.1.0" -source = { editable = "worker" } -dependencies = [ - { name = "exo-shared", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "huggingface-hub", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "mlx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "mlx-lm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "psutil", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "transformers", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] - -[package.metadata] -requires-dist = [ - { name = "exo-shared", editable = "shared" }, - { name = "huggingface-hub", specifier = ">=0.33.4" }, - { name = "mlx", specifier = ">=0.26.3" }, - { name = "mlx-lm", git = "https://github.com/ml-explore/mlx-lm.git" }, - { name = "psutil", specifier = ">=7.0.0" }, - { name = "transformers", specifier = ">=4.55.0" }, + { name = "shared" }, ] [[package]] @@ -411,11 +357,11 @@ wheels = [ [[package]] name = "filelock" -version = "3.18.0" +version = "3.19.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload-time = "2025-03-14T07:11:40.47Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload-time = "2025-08-14T16:56:03.016Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload-time = "2025-03-14T07:11:39.145Z" }, + { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload-time = "2025-08-14T16:56:01.633Z" }, ] [[package]] @@ -468,24 +414,24 @@ wheels = [ [[package]] name = "greenlet" -version = "3.2.3" +version = "3.2.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c9/92/bb85bd6e80148a4d2e0c59f7c0c2891029f8fd510183afc7d8d2feeed9b6/greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365", size = 185752, upload-time = "2025-06-05T16:16:09.955Z" } +sdist = { url = "https://files.pythonhosted.org/packages/03/b8/704d753a5a45507a7aab61f18db9509302ed3d0a27ac7e0359ec2905b1a6/greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d", size = 188260, upload-time = "2025-08-07T13:24:33.51Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/cf/f5c0b23309070ae93de75c90d29300751a5aacefc0a3ed1b1d8edb28f08b/greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad", size = 270732, upload-time = "2025-06-05T16:10:08.26Z" }, - { url = "https://files.pythonhosted.org/packages/48/ae/91a957ba60482d3fecf9be49bc3948f341d706b52ddb9d83a70d42abd498/greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef", size = 639033, upload-time = "2025-06-05T16:38:53.983Z" }, - { url = "https://files.pythonhosted.org/packages/6f/df/20ffa66dd5a7a7beffa6451bdb7400d66251374ab40b99981478c69a67a8/greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3", size = 652999, upload-time = "2025-06-05T16:41:37.89Z" }, - { url = "https://files.pythonhosted.org/packages/51/b4/ebb2c8cb41e521f1d72bf0465f2f9a2fd803f674a88db228887e6847077e/greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95", size = 647368, upload-time = "2025-06-05T16:48:21.467Z" }, - { url = "https://files.pythonhosted.org/packages/8e/6a/1e1b5aa10dced4ae876a322155705257748108b7fd2e4fae3f2a091fe81a/greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb", size = 650037, upload-time = "2025-06-05T16:13:06.402Z" }, - { url = "https://files.pythonhosted.org/packages/26/f2/ad51331a157c7015c675702e2d5230c243695c788f8f75feba1af32b3617/greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b", size = 608402, upload-time = "2025-06-05T16:12:51.91Z" }, - { url = "https://files.pythonhosted.org/packages/26/bc/862bd2083e6b3aff23300900a956f4ea9a4059de337f5c8734346b9b34fc/greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0", size = 1119577, upload-time = "2025-06-05T16:36:49.787Z" }, - { url = "https://files.pythonhosted.org/packages/86/94/1fc0cc068cfde885170e01de40a619b00eaa8f2916bf3541744730ffb4c3/greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36", size = 1147121, upload-time = "2025-06-05T16:12:42.527Z" }, - { url = "https://files.pythonhosted.org/packages/d8/ca/accd7aa5280eb92b70ed9e8f7fd79dc50a2c21d8c73b9a0856f5b564e222/greenlet-3.2.3-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:3d04332dddb10b4a211b68111dabaee2e1a073663d117dc10247b5b1642bac86", size = 271479, upload-time = "2025-06-05T16:10:47.525Z" }, - { url = "https://files.pythonhosted.org/packages/55/71/01ed9895d9eb49223280ecc98a557585edfa56b3d0e965b9fa9f7f06b6d9/greenlet-3.2.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8186162dffde068a465deab08fc72c767196895c39db26ab1c17c0b77a6d8b97", size = 683952, upload-time = "2025-06-05T16:38:55.125Z" }, - { url = "https://files.pythonhosted.org/packages/ea/61/638c4bdf460c3c678a0a1ef4c200f347dff80719597e53b5edb2fb27ab54/greenlet-3.2.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f4bfbaa6096b1b7a200024784217defedf46a07c2eee1a498e94a1b5f8ec5728", size = 696917, upload-time = "2025-06-05T16:41:38.959Z" }, - { url = "https://files.pythonhosted.org/packages/22/cc/0bd1a7eb759d1f3e3cc2d1bc0f0b487ad3cc9f34d74da4b80f226fde4ec3/greenlet-3.2.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ed6cfa9200484d234d8394c70f5492f144b20d4533f69262d530a1a082f6ee9a", size = 692443, upload-time = "2025-06-05T16:48:23.113Z" }, - { url = "https://files.pythonhosted.org/packages/67/10/b2a4b63d3f08362662e89c103f7fe28894a51ae0bc890fabf37d1d780e52/greenlet-3.2.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:02b0df6f63cd15012bed5401b47829cfd2e97052dc89da3cfaf2c779124eb892", size = 692995, upload-time = "2025-06-05T16:13:07.972Z" }, - { url = "https://files.pythonhosted.org/packages/5a/c6/ad82f148a4e3ce9564056453a71529732baf5448ad53fc323e37efe34f66/greenlet-3.2.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86c2d68e87107c1792e2e8d5399acec2487a4e993ab76c792408e59394d52141", size = 655320, upload-time = "2025-06-05T16:12:53.453Z" }, + { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, + { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, + { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload-time = "2025-08-07T13:53:16.314Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" }, + { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, + { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, + { url = "https://files.pythonhosted.org/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210, upload-time = "2025-08-07T13:18:24.072Z" }, + { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" }, + { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" }, + { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload-time = "2025-08-07T13:45:30.969Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" }, + { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" }, + { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" }, ] [[package]] @@ -499,16 +445,16 @@ wheels = [ [[package]] name = "hf-xet" -version = "1.1.5" +version = "1.1.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ed/d4/7685999e85945ed0d7f0762b686ae7015035390de1161dcea9d5276c134c/hf_xet-1.1.5.tar.gz", hash = "sha256:69ebbcfd9ec44fdc2af73441619eeb06b94ee34511bbcf57cd423820090f5694", size = 495969, upload-time = "2025-06-20T21:48:38.007Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7a/49/91010b59debc7c862a5fd426d343134dd9a68778dbe570234b6495a4e204/hf_xet-1.1.8.tar.gz", hash = "sha256:62a0043e441753bbc446dcb5a3fe40a4d03f5fb9f13589ef1df9ab19252beb53", size = 484065, upload-time = "2025-08-18T22:01:03.584Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/89/a1119eebe2836cb25758e7661d6410d3eae982e2b5e974bcc4d250be9012/hf_xet-1.1.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f52c2fa3635b8c37c7764d8796dfa72706cc4eded19d638331161e82b0792e23", size = 2687929, upload-time = "2025-06-20T21:48:32.284Z" }, - { url = "https://files.pythonhosted.org/packages/de/5f/2c78e28f309396e71ec8e4e9304a6483dcbc36172b5cea8f291994163425/hf_xet-1.1.5-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:9fa6e3ee5d61912c4a113e0708eaaef987047616465ac7aa30f7121a48fc1af8", size = 2556338, upload-time = "2025-06-20T21:48:30.079Z" }, - { url = "https://files.pythonhosted.org/packages/6d/2f/6cad7b5fe86b7652579346cb7f85156c11761df26435651cbba89376cd2c/hf_xet-1.1.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc874b5c843e642f45fd85cda1ce599e123308ad2901ead23d3510a47ff506d1", size = 3102894, upload-time = "2025-06-20T21:48:28.114Z" }, - { url = "https://files.pythonhosted.org/packages/d0/54/0fcf2b619720a26fbb6cc941e89f2472a522cd963a776c089b189559447f/hf_xet-1.1.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dbba1660e5d810bd0ea77c511a99e9242d920790d0e63c0e4673ed36c4022d18", size = 3002134, upload-time = "2025-06-20T21:48:25.906Z" }, - { url = "https://files.pythonhosted.org/packages/f3/92/1d351ac6cef7c4ba8c85744d37ffbfac2d53d0a6c04d2cabeba614640a78/hf_xet-1.1.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ab34c4c3104133c495785d5d8bba3b1efc99de52c02e759cf711a91fd39d3a14", size = 3171009, upload-time = "2025-06-20T21:48:33.987Z" }, - { url = "https://files.pythonhosted.org/packages/c9/65/4b2ddb0e3e983f2508528eb4501288ae2f84963586fbdfae596836d5e57a/hf_xet-1.1.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:83088ecea236d5113de478acb2339f92c95b4fb0462acaa30621fac02f5a534a", size = 3279245, upload-time = "2025-06-20T21:48:36.051Z" }, + { url = "https://files.pythonhosted.org/packages/9c/91/5814db3a0d4a65fb6a87f0931ae28073b87f06307701fe66e7c41513bfb4/hf_xet-1.1.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3d5f82e533fc51c7daad0f9b655d9c7811b5308e5890236828bd1dd3ed8fea74", size = 2752357, upload-time = "2025-08-18T22:00:58.777Z" }, + { url = "https://files.pythonhosted.org/packages/70/72/ce898516e97341a7a9d450609e130e108643389110261eaee6deb1ba8545/hf_xet-1.1.8-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e2dba5896bca3ab61d0bef4f01a1647004de59640701b37e37eaa57087bbd9d", size = 2613142, upload-time = "2025-08-18T22:00:57.252Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d6/13af5f916cef795ac2b5e4cc1de31f2e0e375f4475d50799915835f301c2/hf_xet-1.1.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfe5700bc729be3d33d4e9a9b5cc17a951bf8c7ada7ba0c9198a6ab2053b7453", size = 3175859, upload-time = "2025-08-18T22:00:55.978Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ed/34a193c9d1d72b7c3901b3b5153b1be9b2736b832692e1c3f167af537102/hf_xet-1.1.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:09e86514c3c4284ed8a57d6b0f3d089f9836a0af0a1ceb3c9dd664f1f3eaefef", size = 3074178, upload-time = "2025-08-18T22:00:54.147Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1b/de6817b4bf65385280252dff5c9cceeedfbcb27ddb93923639323c1034a4/hf_xet-1.1.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4a9b99ab721d385b83f4fc8ee4e0366b0b59dce03b5888a86029cc0ca634efbf", size = 3238122, upload-time = "2025-08-18T22:01:00.546Z" }, + { url = "https://files.pythonhosted.org/packages/b7/13/874c85c7ed519ec101deb654f06703d9e5e68d34416730f64c4755ada36a/hf_xet-1.1.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:25b9d43333bbef39aeae1616789ec329c21401a7fe30969d538791076227b591", size = 3344325, upload-time = "2025-08-18T22:01:02.013Z" }, ] [[package]] @@ -541,7 +487,7 @@ wheels = [ [[package]] name = "huggingface-hub" -version = "0.34.3" +version = "0.34.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -553,9 +499,9 @@ dependencies = [ { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/b4/e6b465eca5386b52cf23cb6df8644ad318a6b0e12b4b96a7e0be09cbfbcc/huggingface_hub-0.34.3.tar.gz", hash = "sha256:d58130fd5aa7408480681475491c0abd7e835442082fbc3ef4d45b6c39f83853", size = 456800, upload-time = "2025-07-29T08:38:53.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/45/c9/bdbe19339f76d12985bc03572f330a01a93c04dffecaaea3061bdd7fb892/huggingface_hub-0.34.4.tar.gz", hash = "sha256:a4228daa6fb001be3f4f4bdaf9a0db00e1739235702848df00885c9b5742c85c", size = 459768, upload-time = "2025-08-08T09:14:52.365Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/a8/4677014e771ed1591a87b63a2392ce6923baf807193deef302dcfde17542/huggingface_hub-0.34.3-py3-none-any.whl", hash = "sha256:5444550099e2d86e68b2898b09e85878fbd788fc2957b506c6a79ce060e39492", size = 558847, upload-time = "2025-07-29T08:38:51.904Z" }, + { url = "https://files.pythonhosted.org/packages/39/7b/bb06b061991107cd8783f300adff3e7b7f284e330fd82f507f2a1417b11d/huggingface_hub-0.34.4-py3-none-any.whl", hash = "sha256:9b365d781739c93ff90c359844221beef048403f1bc1f1c123c191257c3c890a", size = 561452, upload-time = "2025-08-08T09:14:50.159Z" }, ] [[package]] @@ -620,16 +566,29 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/4a/4175a563579e884192ba6e81725fc0448b042024419be8d83aa8a80a3f44/jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5", size = 354213, upload-time = "2025-05-18T19:04:41.894Z" }, ] +[[package]] +name = "kvf" +version = "0.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "braq", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "paradict", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/f8/e1826c156d4f97cf4662a6110cbbcfd91b5e5570c8a88bf0a8270718621e/kvf-0.0.3.tar.gz", hash = "sha256:f4885b1bbe66c8c20fdabe5cedeb3c0e5d12a54ac495f9e5fcf6fed0e0c51b73", size = 4938, upload-time = "2024-12-10T20:49:13.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/db/4a8d3b1fef45cabcadf36f9a2231b2cde3dddd3a58ab1723119c7fbce34f/kvf-0.0.3-py3-none-any.whl", hash = "sha256:9d666e51cae512e3f95c55b77524e34d0095b278c81f96f7bbc7d37b5bd545c6", size = 4716, upload-time = "2024-12-10T20:49:11.815Z" }, +] + [[package]] name = "markdown-it-py" -version = "3.0.0" +version = "4.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } 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, upload-time = "2023-06-03T06:41:11.019Z" }, + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] [[package]] @@ -679,7 +638,7 @@ wheels = [ [[package]] name = "mlx-lm" version = "0.26.3" -source = { git = "https://github.com/ml-explore/mlx-lm.git#d5bdab1a22b053d75194ce4d225df9fc1635a400" } +source = { git = "https://github.com/ml-explore/mlx-lm.git#e7f241094c6f95b6b058f270db7fe6d413411a2c" } dependencies = [ { name = "jinja2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "mlx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -691,41 +650,41 @@ dependencies = [ [[package]] name = "multidict" -version = "6.6.3" +version = "6.6.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3d/2c/5dad12e82fbdf7470f29bff2171484bf07cb3b16ada60a6589af8f376440/multidict-6.6.3.tar.gz", hash = "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc", size = 101006, upload-time = "2025-06-30T15:53:46.929Z" } +sdist = { url = "https://files.pythonhosted.org/packages/69/7f/0652e6ed47ab288e3756ea9c0df8b14950781184d4bd7883f4d87dd41245/multidict-6.6.4.tar.gz", hash = "sha256:d2d4e4787672911b48350df02ed3fa3fffdc2f2e8ca06dd6afdf34189b76a9dd", size = 101843, upload-time = "2025-08-11T12:08:48.217Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/1d/0bebcbbb4f000751fbd09957257903d6e002943fc668d841a4cf2fb7f872/multidict-6.6.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:540d3c06d48507357a7d57721e5094b4f7093399a0106c211f33540fdc374d55", size = 75843, upload-time = "2025-06-30T15:52:16.155Z" }, - { url = "https://files.pythonhosted.org/packages/07/8f/cbe241b0434cfe257f65c2b1bcf9e8d5fb52bc708c5061fb29b0fed22bdf/multidict-6.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9c19cea2a690f04247d43f366d03e4eb110a0dc4cd1bbeee4d445435428ed35b", size = 45053, upload-time = "2025-06-30T15:52:17.429Z" }, - { url = "https://files.pythonhosted.org/packages/32/d2/0b3b23f9dbad5b270b22a3ac3ea73ed0a50ef2d9a390447061178ed6bdb8/multidict-6.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7af039820cfd00effec86bda5d8debef711a3e86a1d3772e85bea0f243a4bd65", size = 43273, upload-time = "2025-06-30T15:52:19.346Z" }, - { url = "https://files.pythonhosted.org/packages/fd/fe/6eb68927e823999e3683bc49678eb20374ba9615097d085298fd5b386564/multidict-6.6.3-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:500b84f51654fdc3944e936f2922114349bf8fdcac77c3092b03449f0e5bc2b3", size = 237124, upload-time = "2025-06-30T15:52:20.773Z" }, - { url = "https://files.pythonhosted.org/packages/e7/ab/320d8507e7726c460cb77117848b3834ea0d59e769f36fdae495f7669929/multidict-6.6.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3fc723ab8a5c5ed6c50418e9bfcd8e6dceba6c271cee6728a10a4ed8561520c", size = 256892, upload-time = "2025-06-30T15:52:22.242Z" }, - { url = "https://files.pythonhosted.org/packages/76/60/38ee422db515ac69834e60142a1a69111ac96026e76e8e9aa347fd2e4591/multidict-6.6.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:94c47ea3ade005b5976789baaed66d4de4480d0a0bf31cef6edaa41c1e7b56a6", size = 240547, upload-time = "2025-06-30T15:52:23.736Z" }, - { url = "https://files.pythonhosted.org/packages/27/fb/905224fde2dff042b030c27ad95a7ae744325cf54b890b443d30a789b80e/multidict-6.6.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dbc7cf464cc6d67e83e136c9f55726da3a30176f020a36ead246eceed87f1cd8", size = 266223, upload-time = "2025-06-30T15:52:25.185Z" }, - { url = "https://files.pythonhosted.org/packages/76/35/dc38ab361051beae08d1a53965e3e1a418752fc5be4d3fb983c5582d8784/multidict-6.6.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:900eb9f9da25ada070f8ee4a23f884e0ee66fe4e1a38c3af644256a508ad81ca", size = 267262, upload-time = "2025-06-30T15:52:26.969Z" }, - { url = "https://files.pythonhosted.org/packages/1f/a3/0a485b7f36e422421b17e2bbb5a81c1af10eac1d4476f2ff92927c730479/multidict-6.6.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c6df517cf177da5d47ab15407143a89cd1a23f8b335f3a28d57e8b0a3dbb884", size = 254345, upload-time = "2025-06-30T15:52:28.467Z" }, - { url = "https://files.pythonhosted.org/packages/b4/59/bcdd52c1dab7c0e0d75ff19cac751fbd5f850d1fc39172ce809a74aa9ea4/multidict-6.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ef421045f13879e21c994b36e728d8e7d126c91a64b9185810ab51d474f27e7", size = 252248, upload-time = "2025-06-30T15:52:29.938Z" }, - { url = "https://files.pythonhosted.org/packages/bb/a4/2d96aaa6eae8067ce108d4acee6f45ced5728beda55c0f02ae1072c730d1/multidict-6.6.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6c1e61bb4f80895c081790b6b09fa49e13566df8fbff817da3f85b3a8192e36b", size = 250115, upload-time = "2025-06-30T15:52:31.416Z" }, - { url = "https://files.pythonhosted.org/packages/25/d2/ed9f847fa5c7d0677d4f02ea2c163d5e48573de3f57bacf5670e43a5ffaa/multidict-6.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e5e8523bb12d7623cd8300dbd91b9e439a46a028cd078ca695eb66ba31adee3c", size = 249649, upload-time = "2025-06-30T15:52:32.996Z" }, - { url = "https://files.pythonhosted.org/packages/1f/af/9155850372563fc550803d3f25373308aa70f59b52cff25854086ecb4a79/multidict-6.6.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ef58340cc896219e4e653dade08fea5c55c6df41bcc68122e3be3e9d873d9a7b", size = 261203, upload-time = "2025-06-30T15:52:34.521Z" }, - { url = "https://files.pythonhosted.org/packages/36/2f/c6a728f699896252cf309769089568a33c6439626648843f78743660709d/multidict-6.6.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc9dc435ec8699e7b602b94fe0cd4703e69273a01cbc34409af29e7820f777f1", size = 258051, upload-time = "2025-06-30T15:52:35.999Z" }, - { url = "https://files.pythonhosted.org/packages/d0/60/689880776d6b18fa2b70f6cc74ff87dd6c6b9b47bd9cf74c16fecfaa6ad9/multidict-6.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9e864486ef4ab07db5e9cb997bad2b681514158d6954dd1958dfb163b83d53e6", size = 249601, upload-time = "2025-06-30T15:52:37.473Z" }, - { url = "https://files.pythonhosted.org/packages/3a/58/aaf8114cf34966e084a8cc9517771288adb53465188843d5a19862cb6dc3/multidict-6.6.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:02fd8f32d403a6ff13864b0851f1f523d4c988051eea0471d4f1fd8010f11134", size = 82811, upload-time = "2025-06-30T15:52:43.281Z" }, - { url = "https://files.pythonhosted.org/packages/71/af/5402e7b58a1f5b987a07ad98f2501fdba2a4f4b4c30cf114e3ce8db64c87/multidict-6.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f3aa090106b1543f3f87b2041eef3c156c8da2aed90c63a2fbed62d875c49c37", size = 48304, upload-time = "2025-06-30T15:52:45.026Z" }, - { url = "https://files.pythonhosted.org/packages/39/65/ab3c8cafe21adb45b24a50266fd747147dec7847425bc2a0f6934b3ae9ce/multidict-6.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e924fb978615a5e33ff644cc42e6aa241effcf4f3322c09d4f8cebde95aff5f8", size = 46775, upload-time = "2025-06-30T15:52:46.459Z" }, - { url = "https://files.pythonhosted.org/packages/49/ba/9fcc1b332f67cc0c0c8079e263bfab6660f87fe4e28a35921771ff3eea0d/multidict-6.6.3-cp313-cp313t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:b9fe5a0e57c6dbd0e2ce81ca66272282c32cd11d31658ee9553849d91289e1c1", size = 229773, upload-time = "2025-06-30T15:52:47.88Z" }, - { url = "https://files.pythonhosted.org/packages/a4/14/0145a251f555f7c754ce2dcbcd012939bbd1f34f066fa5d28a50e722a054/multidict-6.6.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b24576f208793ebae00280c59927c3b7c2a3b1655e443a25f753c4611bc1c373", size = 250083, upload-time = "2025-06-30T15:52:49.366Z" }, - { url = "https://files.pythonhosted.org/packages/9e/d4/d5c0bd2bbb173b586c249a151a26d2fb3ec7d53c96e42091c9fef4e1f10c/multidict-6.6.3-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:135631cb6c58eac37d7ac0df380294fecdc026b28837fa07c02e459c7fb9c54e", size = 228980, upload-time = "2025-06-30T15:52:50.903Z" }, - { url = "https://files.pythonhosted.org/packages/21/32/c9a2d8444a50ec48c4733ccc67254100c10e1c8ae8e40c7a2d2183b59b97/multidict-6.6.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:274d416b0df887aef98f19f21578653982cfb8a05b4e187d4a17103322eeaf8f", size = 257776, upload-time = "2025-06-30T15:52:52.764Z" }, - { url = "https://files.pythonhosted.org/packages/68/d0/14fa1699f4ef629eae08ad6201c6b476098f5efb051b296f4c26be7a9fdf/multidict-6.6.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e252017a817fad7ce05cafbe5711ed40faeb580e63b16755a3a24e66fa1d87c0", size = 256882, upload-time = "2025-06-30T15:52:54.596Z" }, - { url = "https://files.pythonhosted.org/packages/da/88/84a27570fbe303c65607d517a5f147cd2fc046c2d1da02b84b17b9bdc2aa/multidict-6.6.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4cc8d848cd4fe1cdee28c13ea79ab0ed37fc2e89dd77bac86a2e7959a8c3bc", size = 247816, upload-time = "2025-06-30T15:52:56.175Z" }, - { url = "https://files.pythonhosted.org/packages/1c/60/dca352a0c999ce96a5d8b8ee0b2b9f729dcad2e0b0c195f8286269a2074c/multidict-6.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9e236a7094b9c4c1b7585f6b9cca34b9d833cf079f7e4c49e6a4a6ec9bfdc68f", size = 245341, upload-time = "2025-06-30T15:52:57.752Z" }, - { url = "https://files.pythonhosted.org/packages/50/ef/433fa3ed06028f03946f3993223dada70fb700f763f70c00079533c34578/multidict-6.6.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e0cb0ab69915c55627c933f0b555a943d98ba71b4d1c57bc0d0a66e2567c7471", size = 235854, upload-time = "2025-06-30T15:52:59.74Z" }, - { url = "https://files.pythonhosted.org/packages/1b/1f/487612ab56fbe35715320905215a57fede20de7db40a261759690dc80471/multidict-6.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:81ef2f64593aba09c5212a3d0f8c906a0d38d710a011f2f42759704d4557d3f2", size = 243432, upload-time = "2025-06-30T15:53:01.602Z" }, - { url = "https://files.pythonhosted.org/packages/da/6f/ce8b79de16cd885c6f9052c96a3671373d00c59b3ee635ea93e6e81b8ccf/multidict-6.6.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:b9cbc60010de3562545fa198bfc6d3825df430ea96d2cc509c39bd71e2e7d648", size = 252731, upload-time = "2025-06-30T15:53:03.517Z" }, - { url = "https://files.pythonhosted.org/packages/bb/fe/a2514a6aba78e5abefa1624ca85ae18f542d95ac5cde2e3815a9fbf369aa/multidict-6.6.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:70d974eaaa37211390cd02ef93b7e938de564bbffa866f0b08d07e5e65da783d", size = 247086, upload-time = "2025-06-30T15:53:05.48Z" }, - { url = "https://files.pythonhosted.org/packages/8c/22/b788718d63bb3cce752d107a57c85fcd1a212c6c778628567c9713f9345a/multidict-6.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3713303e4a6663c6d01d648a68f2848701001f3390a030edaaf3fc949c90bf7c", size = 243338, upload-time = "2025-06-30T15:53:07.522Z" }, - { url = "https://files.pythonhosted.org/packages/d8/30/9aec301e9772b098c1f5c0ca0279237c9766d94b97802e9888010c64b0ed/multidict-6.6.3-py3-none-any.whl", hash = "sha256:8db10f29c7541fc5da4defd8cd697e1ca429db743fa716325f236079b96f775a", size = 12313, upload-time = "2025-06-30T15:53:45.437Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5d/e1db626f64f60008320aab00fbe4f23fc3300d75892a3381275b3d284580/multidict-6.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f46a6e8597f9bd71b31cc708195d42b634c8527fecbcf93febf1052cacc1f16e", size = 75848, upload-time = "2025-08-11T12:07:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/4c/aa/8b6f548d839b6c13887253af4e29c939af22a18591bfb5d0ee6f1931dae8/multidict-6.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:22e38b2bc176c5eb9c0a0e379f9d188ae4cd8b28c0f53b52bce7ab0a9e534657", size = 45060, upload-time = "2025-08-11T12:07:21.163Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c6/f5e97e5d99a729bc2aa58eb3ebfa9f1e56a9b517cc38c60537c81834a73f/multidict-6.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5df8afd26f162da59e218ac0eefaa01b01b2e6cd606cffa46608f699539246da", size = 43269, upload-time = "2025-08-11T12:07:22.392Z" }, + { url = "https://files.pythonhosted.org/packages/dc/31/d54eb0c62516776f36fe67f84a732f97e0b0e12f98d5685bebcc6d396910/multidict-6.6.4-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:49517449b58d043023720aa58e62b2f74ce9b28f740a0b5d33971149553d72aa", size = 237158, upload-time = "2025-08-11T12:07:23.636Z" }, + { url = "https://files.pythonhosted.org/packages/c4/1c/8a10c1c25b23156e63b12165a929d8eb49a6ed769fdbefb06e6f07c1e50d/multidict-6.6.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae9408439537c5afdca05edd128a63f56a62680f4b3c234301055d7a2000220f", size = 257076, upload-time = "2025-08-11T12:07:25.049Z" }, + { url = "https://files.pythonhosted.org/packages/ad/86/90e20b5771d6805a119e483fd3d1e8393e745a11511aebca41f0da38c3e2/multidict-6.6.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:87a32d20759dc52a9e850fe1061b6e41ab28e2998d44168a8a341b99ded1dba0", size = 240694, upload-time = "2025-08-11T12:07:26.458Z" }, + { url = "https://files.pythonhosted.org/packages/e7/49/484d3e6b535bc0555b52a0a26ba86e4d8d03fd5587d4936dc59ba7583221/multidict-6.6.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:52e3c8d43cdfff587ceedce9deb25e6ae77daba560b626e97a56ddcad3756879", size = 266350, upload-time = "2025-08-11T12:07:27.94Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b4/aa4c5c379b11895083d50021e229e90c408d7d875471cb3abf721e4670d6/multidict-6.6.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ad8850921d3a8d8ff6fbef790e773cecfc260bbfa0566998980d3fa8f520bc4a", size = 267250, upload-time = "2025-08-11T12:07:29.303Z" }, + { url = "https://files.pythonhosted.org/packages/80/e5/5e22c5bf96a64bdd43518b1834c6d95a4922cc2066b7d8e467dae9b6cee6/multidict-6.6.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:497a2954adc25c08daff36f795077f63ad33e13f19bfff7736e72c785391534f", size = 254900, upload-time = "2025-08-11T12:07:30.764Z" }, + { url = "https://files.pythonhosted.org/packages/17/38/58b27fed927c07035abc02befacab42491e7388ca105e087e6e0215ead64/multidict-6.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:024ce601f92d780ca1617ad4be5ac15b501cc2414970ffa2bb2bbc2bd5a68fa5", size = 252355, upload-time = "2025-08-11T12:07:32.205Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a1/dad75d23a90c29c02b5d6f3d7c10ab36c3197613be5d07ec49c7791e186c/multidict-6.6.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a693fc5ed9bdd1c9e898013e0da4dcc640de7963a371c0bd458e50e046bf6438", size = 250061, upload-time = "2025-08-11T12:07:33.623Z" }, + { url = "https://files.pythonhosted.org/packages/b8/1a/ac2216b61c7f116edab6dc3378cca6c70dc019c9a457ff0d754067c58b20/multidict-6.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:190766dac95aab54cae5b152a56520fd99298f32a1266d66d27fdd1b5ac00f4e", size = 249675, upload-time = "2025-08-11T12:07:34.958Z" }, + { url = "https://files.pythonhosted.org/packages/d4/79/1916af833b800d13883e452e8e0977c065c4ee3ab7a26941fbfdebc11895/multidict-6.6.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:34d8f2a5ffdceab9dcd97c7a016deb2308531d5f0fced2bb0c9e1df45b3363d7", size = 261247, upload-time = "2025-08-11T12:07:36.588Z" }, + { url = "https://files.pythonhosted.org/packages/c5/65/d1f84fe08ac44a5fc7391cbc20a7cedc433ea616b266284413fd86062f8c/multidict-6.6.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:59e8d40ab1f5a8597abcef00d04845155a5693b5da00d2c93dbe88f2050f2812", size = 257960, upload-time = "2025-08-11T12:07:39.735Z" }, + { url = "https://files.pythonhosted.org/packages/13/b5/29ec78057d377b195ac2c5248c773703a6b602e132a763e20ec0457e7440/multidict-6.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:467fe64138cfac771f0e949b938c2e1ada2b5af22f39692aa9258715e9ea613a", size = 250078, upload-time = "2025-08-11T12:07:41.525Z" }, + { url = "https://files.pythonhosted.org/packages/64/94/0a8e63e36c049b571c9ae41ee301ada29c3fee9643d9c2548d7d558a1d99/multidict-6.6.4-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6c84378acd4f37d1b507dfa0d459b449e2321b3ba5f2338f9b085cf7a7ba95eb", size = 82812, upload-time = "2025-08-11T12:07:48.402Z" }, + { url = "https://files.pythonhosted.org/packages/25/1a/be8e369dfcd260d2070a67e65dd3990dd635cbd735b98da31e00ea84cd4e/multidict-6.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0e0558693063c75f3d952abf645c78f3c5dfdd825a41d8c4d8156fc0b0da6e7e", size = 48313, upload-time = "2025-08-11T12:07:49.679Z" }, + { url = "https://files.pythonhosted.org/packages/26/5a/dd4ade298674b2f9a7b06a32c94ffbc0497354df8285f27317c66433ce3b/multidict-6.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3f8e2384cb83ebd23fd07e9eada8ba64afc4c759cd94817433ab8c81ee4b403f", size = 46777, upload-time = "2025-08-11T12:07:51.318Z" }, + { url = "https://files.pythonhosted.org/packages/89/db/98aa28bc7e071bfba611ac2ae803c24e96dd3a452b4118c587d3d872c64c/multidict-6.6.4-cp313-cp313t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:f996b87b420995a9174b2a7c1a8daf7db4750be6848b03eb5e639674f7963773", size = 229321, upload-time = "2025-08-11T12:07:52.965Z" }, + { url = "https://files.pythonhosted.org/packages/c7/bc/01ddda2a73dd9d167bd85d0e8ef4293836a8f82b786c63fb1a429bc3e678/multidict-6.6.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc356250cffd6e78416cf5b40dc6a74f1edf3be8e834cf8862d9ed5265cf9b0e", size = 249954, upload-time = "2025-08-11T12:07:54.423Z" }, + { url = "https://files.pythonhosted.org/packages/06/78/6b7c0f020f9aa0acf66d0ab4eb9f08375bac9a50ff5e3edb1c4ccd59eafc/multidict-6.6.4-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:dadf95aa862714ea468a49ad1e09fe00fcc9ec67d122f6596a8d40caf6cec7d0", size = 228612, upload-time = "2025-08-11T12:07:55.914Z" }, + { url = "https://files.pythonhosted.org/packages/00/44/3faa416f89b2d5d76e9d447296a81521e1c832ad6e40b92f990697b43192/multidict-6.6.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7dd57515bebffd8ebd714d101d4c434063322e4fe24042e90ced41f18b6d3395", size = 257528, upload-time = "2025-08-11T12:07:57.371Z" }, + { url = "https://files.pythonhosted.org/packages/05/5f/77c03b89af0fcb16f018f668207768191fb9dcfb5e3361a5e706a11db2c9/multidict-6.6.4-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:967af5f238ebc2eb1da4e77af5492219fbd9b4b812347da39a7b5f5c72c0fa45", size = 256329, upload-time = "2025-08-11T12:07:58.844Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e9/ed750a2a9afb4f8dc6f13dc5b67b514832101b95714f1211cd42e0aafc26/multidict-6.6.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a4c6875c37aae9794308ec43e3530e4aa0d36579ce38d89979bbf89582002bb", size = 247928, upload-time = "2025-08-11T12:08:01.037Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b5/e0571bc13cda277db7e6e8a532791d4403dacc9850006cb66d2556e649c0/multidict-6.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7f683a551e92bdb7fac545b9c6f9fa2aebdeefa61d607510b3533286fcab67f5", size = 245228, upload-time = "2025-08-11T12:08:02.96Z" }, + { url = "https://files.pythonhosted.org/packages/f3/a3/69a84b0eccb9824491f06368f5b86e72e4af54c3067c37c39099b6687109/multidict-6.6.4-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:3ba5aaf600edaf2a868a391779f7a85d93bed147854925f34edd24cc70a3e141", size = 235869, upload-time = "2025-08-11T12:08:04.746Z" }, + { url = "https://files.pythonhosted.org/packages/a9/9d/28802e8f9121a6a0804fa009debf4e753d0a59969ea9f70be5f5fdfcb18f/multidict-6.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:580b643b7fd2c295d83cad90d78419081f53fd532d1f1eb67ceb7060f61cff0d", size = 243446, upload-time = "2025-08-11T12:08:06.332Z" }, + { url = "https://files.pythonhosted.org/packages/38/ea/6c98add069b4878c1d66428a5f5149ddb6d32b1f9836a826ac764b9940be/multidict-6.6.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:37b7187197da6af3ee0b044dbc9625afd0c885f2800815b228a0e70f9a7f473d", size = 252299, upload-time = "2025-08-11T12:08:07.931Z" }, + { url = "https://files.pythonhosted.org/packages/3a/09/8fe02d204473e14c0af3affd50af9078839dfca1742f025cca765435d6b4/multidict-6.6.4-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e1b93790ed0bc26feb72e2f08299691ceb6da5e9e14a0d13cc74f1869af327a0", size = 246926, upload-time = "2025-08-11T12:08:09.467Z" }, + { url = "https://files.pythonhosted.org/packages/37/3d/7b1e10d774a6df5175ecd3c92bff069e77bed9ec2a927fdd4ff5fe182f67/multidict-6.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a506a77ddee1efcca81ecbeae27ade3e09cdf21a8ae854d766c2bb4f14053f92", size = 243383, upload-time = "2025-08-11T12:08:10.981Z" }, + { url = "https://files.pythonhosted.org/packages/fd/69/b547032297c7e63ba2af494edba695d781af8a0c6e89e4d06cf848b21d80/multidict-6.6.4-py3-none-any.whl", hash = "sha256:27d8f8e125c07cb954e54d75d04905a9bba8a439c1d84aca94949d4d03d8601c", size = 12313, upload-time = "2025-08-11T12:08:46.891Z" }, ] [[package]] @@ -739,31 +698,47 @@ wheels = [ [[package]] name = "numpy" -version = "2.3.1" +version = "2.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/19/d7c972dfe90a353dbd3efbbe1d14a5951de80c99c9dc1b93cd998d51dc0f/numpy-2.3.1.tar.gz", hash = "sha256:1ec9ae20a4226da374362cca3c62cd753faf2f951440b0e3b98e93c235441d2b", size = 20390372, upload-time = "2025-06-21T12:28:33.469Z" } +sdist = { url = "https://files.pythonhosted.org/packages/37/7d/3fec4199c5ffb892bed55cff901e4f39a58c81df9c44c280499e92cad264/numpy-2.3.2.tar.gz", hash = "sha256:e0486a11ec30cdecb53f184d496d1c6a20786c81e55e41640270130056f8ee48", size = 20489306, upload-time = "2025-07-24T21:32:07.553Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/bd/35ad97006d8abff8631293f8ea6adf07b0108ce6fec68da3c3fcca1197f2/numpy-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25a1992b0a3fdcdaec9f552ef10d8103186f5397ab45e2d25f8ac51b1a6b97e8", size = 20889381, upload-time = "2025-06-21T12:19:04.103Z" }, - { url = "https://files.pythonhosted.org/packages/f1/4f/df5923874d8095b6062495b39729178eef4a922119cee32a12ee1bd4664c/numpy-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7dea630156d39b02a63c18f508f85010230409db5b2927ba59c8ba4ab3e8272e", size = 14152726, upload-time = "2025-06-21T12:19:25.599Z" }, - { url = "https://files.pythonhosted.org/packages/8c/0f/a1f269b125806212a876f7efb049b06c6f8772cf0121139f97774cd95626/numpy-2.3.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bada6058dd886061f10ea15f230ccf7dfff40572e99fef440a4a857c8728c9c0", size = 5105145, upload-time = "2025-06-21T12:19:34.782Z" }, - { url = "https://files.pythonhosted.org/packages/6d/63/a7f7fd5f375b0361682f6ffbf686787e82b7bbd561268e4f30afad2bb3c0/numpy-2.3.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:a894f3816eb17b29e4783e5873f92faf55b710c2519e5c351767c51f79d8526d", size = 6639409, upload-time = "2025-06-21T12:19:45.228Z" }, - { url = "https://files.pythonhosted.org/packages/bf/0d/1854a4121af895aab383f4aa233748f1df4671ef331d898e32426756a8a6/numpy-2.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:18703df6c4a4fee55fd3d6e5a253d01c5d33a295409b03fda0c86b3ca2ff41a1", size = 14257630, upload-time = "2025-06-21T12:20:06.544Z" }, - { url = "https://files.pythonhosted.org/packages/50/30/af1b277b443f2fb08acf1c55ce9d68ee540043f158630d62cef012750f9f/numpy-2.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5902660491bd7a48b2ec16c23ccb9124b8abfd9583c5fdfa123fe6b421e03de1", size = 16627546, upload-time = "2025-06-21T12:20:31.002Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ec/3b68220c277e463095342d254c61be8144c31208db18d3fd8ef02712bcd6/numpy-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:36890eb9e9d2081137bd78d29050ba63b8dab95dff7912eadf1185e80074b2a0", size = 15562538, upload-time = "2025-06-21T12:20:54.322Z" }, - { url = "https://files.pythonhosted.org/packages/77/2b/4014f2bcc4404484021c74d4c5ee8eb3de7e3f7ac75f06672f8dcf85140a/numpy-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a780033466159c2270531e2b8ac063704592a0bc62ec4a1b991c7c40705eb0e8", size = 18360327, upload-time = "2025-06-21T12:21:21.053Z" }, - { url = "https://files.pythonhosted.org/packages/ea/19/a029cd335cf72f79d2644dcfc22d90f09caa86265cbbde3b5702ccef6890/numpy-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b0b5397374f32ec0649dd98c652a1798192042e715df918c20672c62fb52d4b8", size = 20987593, upload-time = "2025-06-21T12:21:51.664Z" }, - { url = "https://files.pythonhosted.org/packages/25/91/8ea8894406209107d9ce19b66314194675d31761fe2cb3c84fe2eeae2f37/numpy-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c5bdf2015ccfcee8253fb8be695516ac4457c743473a43290fd36eba6a1777eb", size = 14300523, upload-time = "2025-06-21T12:22:13.583Z" }, - { url = "https://files.pythonhosted.org/packages/a6/7f/06187b0066eefc9e7ce77d5f2ddb4e314a55220ad62dd0bfc9f2c44bac14/numpy-2.3.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d70f20df7f08b90a2062c1f07737dd340adccf2068d0f1b9b3d56e2038979fee", size = 5227993, upload-time = "2025-06-21T12:22:22.53Z" }, - { url = "https://files.pythonhosted.org/packages/e8/ec/a926c293c605fa75e9cfb09f1e4840098ed46d2edaa6e2152ee35dc01ed3/numpy-2.3.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:2fb86b7e58f9ac50e1e9dd1290154107e47d1eef23a0ae9145ded06ea606f992", size = 6736652, upload-time = "2025-06-21T12:22:33.629Z" }, - { url = "https://files.pythonhosted.org/packages/e3/62/d68e52fb6fde5586650d4c0ce0b05ff3a48ad4df4ffd1b8866479d1d671d/numpy-2.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:23ab05b2d241f76cb883ce8b9a93a680752fbfcbd51c50eff0b88b979e471d8c", size = 14331561, upload-time = "2025-06-21T12:22:55.056Z" }, - { url = "https://files.pythonhosted.org/packages/fc/ec/b74d3f2430960044bdad6900d9f5edc2dc0fb8bf5a0be0f65287bf2cbe27/numpy-2.3.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ce2ce9e5de4703a673e705183f64fd5da5bf36e7beddcb63a25ee2286e71ca48", size = 16693349, upload-time = "2025-06-21T12:23:20.53Z" }, - { url = "https://files.pythonhosted.org/packages/0d/15/def96774b9d7eb198ddadfcbd20281b20ebb510580419197e225f5c55c3e/numpy-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c4913079974eeb5c16ccfd2b1f09354b8fed7e0d6f2cab933104a09a6419b1ee", size = 15642053, upload-time = "2025-06-21T12:23:43.697Z" }, - { url = "https://files.pythonhosted.org/packages/2b/57/c3203974762a759540c6ae71d0ea2341c1fa41d84e4971a8e76d7141678a/numpy-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:010ce9b4f00d5c036053ca684c77441f2f2c934fd23bee058b4d6f196efd8280", size = 18434184, upload-time = "2025-06-21T12:24:10.708Z" }, + { url = "https://files.pythonhosted.org/packages/1c/c0/c6bb172c916b00700ed3bf71cb56175fd1f7dbecebf8353545d0b5519f6c/numpy-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c8d9727f5316a256425892b043736d63e89ed15bbfe6556c5ff4d9d4448ff3b3", size = 20949074, upload-time = "2025-07-24T20:43:07.813Z" }, + { url = "https://files.pythonhosted.org/packages/20/4e/c116466d22acaf4573e58421c956c6076dc526e24a6be0903219775d862e/numpy-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:efc81393f25f14d11c9d161e46e6ee348637c0a1e8a54bf9dedc472a3fae993b", size = 14177311, upload-time = "2025-07-24T20:43:29.335Z" }, + { url = "https://files.pythonhosted.org/packages/78/45/d4698c182895af189c463fc91d70805d455a227261d950e4e0f1310c2550/numpy-2.3.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dd937f088a2df683cbb79dda9a772b62a3e5a8a7e76690612c2737f38c6ef1b6", size = 5106022, upload-time = "2025-07-24T20:43:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/9f/76/3e6880fef4420179309dba72a8c11f6166c431cf6dee54c577af8906f914/numpy-2.3.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:11e58218c0c46c80509186e460d79fbdc9ca1eb8d8aee39d8f2dc768eb781089", size = 6640135, upload-time = "2025-07-24T20:43:49.28Z" }, + { url = "https://files.pythonhosted.org/packages/34/fa/87ff7f25b3c4ce9085a62554460b7db686fef1e0207e8977795c7b7d7ba1/numpy-2.3.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5ad4ebcb683a1f99f4f392cc522ee20a18b2bb12a2c1c42c3d48d5a1adc9d3d2", size = 14278147, upload-time = "2025-07-24T20:44:10.328Z" }, + { url = "https://files.pythonhosted.org/packages/1d/0f/571b2c7a3833ae419fe69ff7b479a78d313581785203cc70a8db90121b9a/numpy-2.3.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:938065908d1d869c7d75d8ec45f735a034771c6ea07088867f713d1cd3bbbe4f", size = 16635989, upload-time = "2025-07-24T20:44:34.88Z" }, + { url = "https://files.pythonhosted.org/packages/24/5a/84ae8dca9c9a4c592fe11340b36a86ffa9fd3e40513198daf8a97839345c/numpy-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66459dccc65d8ec98cc7df61307b64bf9e08101f9598755d42d8ae65d9a7a6ee", size = 16053052, upload-time = "2025-07-24T20:44:58.872Z" }, + { url = "https://files.pythonhosted.org/packages/57/7c/e5725d99a9133b9813fcf148d3f858df98511686e853169dbaf63aec6097/numpy-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a7af9ed2aa9ec5950daf05bb11abc4076a108bd3c7db9aa7251d5f107079b6a6", size = 18577955, upload-time = "2025-07-24T20:45:26.714Z" }, + { url = "https://files.pythonhosted.org/packages/80/23/8278f40282d10c3f258ec3ff1b103d4994bcad78b0cba9208317f6bb73da/numpy-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e6ecfeddfa83b02318f4d84acf15fbdbf9ded18e46989a15a8b6995dfbf85ab", size = 21047395, upload-time = "2025-07-24T20:45:58.821Z" }, + { url = "https://files.pythonhosted.org/packages/1f/2d/624f2ce4a5df52628b4ccd16a4f9437b37c35f4f8a50d00e962aae6efd7a/numpy-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:508b0eada3eded10a3b55725b40806a4b855961040180028f52580c4729916a2", size = 14300374, upload-time = "2025-07-24T20:46:20.207Z" }, + { url = "https://files.pythonhosted.org/packages/f6/62/ff1e512cdbb829b80a6bd08318a58698867bca0ca2499d101b4af063ee97/numpy-2.3.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:754d6755d9a7588bdc6ac47dc4ee97867271b17cee39cb87aef079574366db0a", size = 5228864, upload-time = "2025-07-24T20:46:30.58Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8e/74bc18078fff03192d4032cfa99d5a5ca937807136d6f5790ce07ca53515/numpy-2.3.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f66e7d2b2d7712410d3bc5684149040ef5f19856f20277cd17ea83e5006286", size = 6737533, upload-time = "2025-07-24T20:46:46.111Z" }, + { url = "https://files.pythonhosted.org/packages/19/ea/0731efe2c9073ccca5698ef6a8c3667c4cf4eea53fcdcd0b50140aba03bc/numpy-2.3.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de6ea4e5a65d5a90c7d286ddff2b87f3f4ad61faa3db8dabe936b34c2275b6f8", size = 14352007, upload-time = "2025-07-24T20:47:07.1Z" }, + { url = "https://files.pythonhosted.org/packages/cf/90/36be0865f16dfed20f4bc7f75235b963d5939707d4b591f086777412ff7b/numpy-2.3.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3ef07ec8cbc8fc9e369c8dcd52019510c12da4de81367d8b20bc692aa07573a", size = 16701914, upload-time = "2025-07-24T20:47:32.459Z" }, + { url = "https://files.pythonhosted.org/packages/94/30/06cd055e24cb6c38e5989a9e747042b4e723535758e6153f11afea88c01b/numpy-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:27c9f90e7481275c7800dc9c24b7cc40ace3fdb970ae4d21eaff983a32f70c91", size = 16132708, upload-time = "2025-07-24T20:47:58.129Z" }, + { url = "https://files.pythonhosted.org/packages/9a/14/ecede608ea73e58267fd7cb78f42341b3b37ba576e778a1a06baffbe585c/numpy-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:07b62978075b67eee4065b166d000d457c82a1efe726cce608b9db9dd66a73a5", size = 18651678, upload-time = "2025-07-24T20:48:25.402Z" }, + { url = "https://files.pythonhosted.org/packages/c9/7c/7659048aaf498f7611b783e000c7268fcc4dcf0ce21cd10aad7b2e8f9591/numpy-2.3.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:448a66d052d0cf14ce9865d159bfc403282c9bc7bb2a31b03cc18b651eca8b1a", size = 20950906, upload-time = "2025-07-24T20:50:30.346Z" }, + { url = "https://files.pythonhosted.org/packages/80/db/984bea9d4ddf7112a04cfdfb22b1050af5757864cfffe8e09e44b7f11a10/numpy-2.3.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:546aaf78e81b4081b2eba1d105c3b34064783027a06b3ab20b6eba21fb64132b", size = 14185607, upload-time = "2025-07-24T20:50:51.923Z" }, + { url = "https://files.pythonhosted.org/packages/e4/76/b3d6f414f4eca568f469ac112a3b510938d892bc5a6c190cb883af080b77/numpy-2.3.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:87c930d52f45df092f7578889711a0768094debf73cfcde105e2d66954358125", size = 5114110, upload-time = "2025-07-24T20:51:01.041Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d2/6f5e6826abd6bca52392ed88fe44a4b52aacb60567ac3bc86c67834c3a56/numpy-2.3.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:8dc082ea901a62edb8f59713c6a7e28a85daddcb67454c839de57656478f5b19", size = 6642050, upload-time = "2025-07-24T20:51:11.64Z" }, + { url = "https://files.pythonhosted.org/packages/c4/43/f12b2ade99199e39c73ad182f103f9d9791f48d885c600c8e05927865baf/numpy-2.3.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:af58de8745f7fa9ca1c0c7c943616c6fe28e75d0c81f5c295810e3c83b5be92f", size = 14296292, upload-time = "2025-07-24T20:51:33.488Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f9/77c07d94bf110a916b17210fac38680ed8734c236bfed9982fd8524a7b47/numpy-2.3.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed5527c4cf10f16c6d0b6bee1f89958bccb0ad2522c8cadc2efd318bcd545f5", size = 16638913, upload-time = "2025-07-24T20:51:58.517Z" }, + { url = "https://files.pythonhosted.org/packages/9b/d1/9d9f2c8ea399cc05cfff8a7437453bd4e7d894373a93cdc46361bbb49a7d/numpy-2.3.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:095737ed986e00393ec18ec0b21b47c22889ae4b0cd2d5e88342e08b01141f58", size = 16071180, upload-time = "2025-07-24T20:52:22.827Z" }, + { url = "https://files.pythonhosted.org/packages/4c/41/82e2c68aff2a0c9bf315e47d61951099fed65d8cb2c8d9dc388cb87e947e/numpy-2.3.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5e40e80299607f597e1a8a247ff8d71d79c5b52baa11cc1cce30aa92d2da6e0", size = 18576809, upload-time = "2025-07-24T20:52:51.015Z" }, + { url = "https://files.pythonhosted.org/packages/8b/3e/075752b79140b78ddfc9c0a1634d234cfdbc6f9bbbfa6b7504e445ad7d19/numpy-2.3.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:4d002ecf7c9b53240be3bb69d80f86ddbd34078bae04d87be81c1f58466f264e", size = 21047524, upload-time = "2025-07-24T20:53:22.086Z" }, + { url = "https://files.pythonhosted.org/packages/fe/6d/60e8247564a72426570d0e0ea1151b95ce5bd2f1597bb878a18d32aec855/numpy-2.3.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:293b2192c6bcce487dbc6326de5853787f870aeb6c43f8f9c6496db5b1781e45", size = 14300519, upload-time = "2025-07-24T20:53:44.053Z" }, + { url = "https://files.pythonhosted.org/packages/4d/73/d8326c442cd428d47a067070c3ac6cc3b651a6e53613a1668342a12d4479/numpy-2.3.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0a4f2021a6da53a0d580d6ef5db29947025ae8b35b3250141805ea9a32bbe86b", size = 5228972, upload-time = "2025-07-24T20:53:53.81Z" }, + { url = "https://files.pythonhosted.org/packages/34/2e/e71b2d6dad075271e7079db776196829019b90ce3ece5c69639e4f6fdc44/numpy-2.3.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9c144440db4bf3bb6372d2c3e49834cc0ff7bb4c24975ab33e01199e645416f2", size = 6737439, upload-time = "2025-07-24T20:54:04.742Z" }, + { url = "https://files.pythonhosted.org/packages/15/b0/d004bcd56c2c5e0500ffc65385eb6d569ffd3363cb5e593ae742749b2daa/numpy-2.3.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f92d6c2a8535dc4fe4419562294ff957f83a16ebdec66df0805e473ffaad8bd0", size = 14352479, upload-time = "2025-07-24T20:54:25.819Z" }, + { url = "https://files.pythonhosted.org/packages/11/e3/285142fcff8721e0c99b51686426165059874c150ea9ab898e12a492e291/numpy-2.3.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cefc2219baa48e468e3db7e706305fcd0c095534a192a08f31e98d83a7d45fb0", size = 16702805, upload-time = "2025-07-24T20:54:50.814Z" }, + { url = "https://files.pythonhosted.org/packages/33/c3/33b56b0e47e604af2c7cd065edca892d180f5899599b76830652875249a3/numpy-2.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:76c3e9501ceb50b2ff3824c3589d5d1ab4ac857b0ee3f8f49629d0de55ecf7c2", size = 16133830, upload-time = "2025-07-24T20:55:17.306Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ae/7b1476a1f4d6a48bc669b8deb09939c56dd2a439db1ab03017844374fb67/numpy-2.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:122bf5ed9a0221b3419672493878ba4967121514b1d7d4656a7580cd11dddcbf", size = 18652665, upload-time = "2025-07-24T20:55:46.665Z" }, ] [[package]] name = "openai" -version = "1.97.1" +version = "1.100.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -775,9 +750,9 @@ dependencies = [ { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/57/1c471f6b3efb879d26686d31582997615e969f3bb4458111c9705e56332e/openai-1.97.1.tar.gz", hash = "sha256:a744b27ae624e3d4135225da9b1c89c107a2a7e5bc4c93e5b7b5214772ce7a4e", size = 494267, upload-time = "2025-07-22T13:10:12.607Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/36/e2e24d419438a5e66aa6445ec663194395226293d214bfe615df562b2253/openai-1.100.2.tar.gz", hash = "sha256:787b4c3c8a65895182c58c424f790c25c790cc9a0330e34f73d55b6ee5a00e32", size = 507954, upload-time = "2025-08-19T15:32:47.854Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/35/412a0e9c3f0d37c94ed764b8ac7adae2d834dbd20e69f6aca582118e0f55/openai-1.97.1-py3-none-any.whl", hash = "sha256:4e96bbdf672ec3d44968c9ea39d2c375891db1acc1794668d8149d5fa6000606", size = 764380, upload-time = "2025-07-22T13:10:10.689Z" }, + { url = "https://files.pythonhosted.org/packages/db/8d/9ab1599c7942b3d04784ac5473905dc543aeb30a1acce3591d0b425682db/openai-1.100.2-py3-none-any.whl", hash = "sha256:54d3457b2c8d7303a1bc002a058de46bdd8f37a8117751c7cf4ed4438051f151", size = 787755, upload-time = "2025-08-19T15:32:46.252Z" }, ] [[package]] @@ -789,6 +764,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] +[[package]] +name = "paradict" +version = "0.0.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/40/83/8cf8d94be55ab9ea783e1f8ece06059cd986bb482ad69f7be549839b9e07/paradict-0.0.16.tar.gz", hash = "sha256:d909d122bf47028a45334eb2280d1e1bcb401fda89986af42c39fd2fadf9de4d", size = 61471, upload-time = "2024-12-10T21:23:49.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/f9/a9807d307ba1837bb8799e1337f41edcdbb92ef6090668dc50f483a168bf/paradict-0.0.16-py3-none-any.whl", hash = "sha256:28df79f0dc0e68c8f8a3e9b7c75e67a85305ef7298653fc7a369a1bf4f58cb20", size = 61735, upload-time = "2024-12-10T21:23:45.408Z" }, +] + [[package]] name = "pathlib" version = "1.0.1" @@ -846,14 +830,14 @@ wheels = [ [[package]] name = "protobuf" -version = "6.31.1" +version = "6.32.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/f3/b9655a711b32c19720253f6f06326faf90580834e2e83f840472d752bc8b/protobuf-6.31.1.tar.gz", hash = "sha256:d8cac4c982f0b957a4dc73a80e2ea24fab08e679c0de9deb835f4a12d69aca9a", size = 441797, upload-time = "2025-05-28T19:25:54.947Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/df/fb4a8eeea482eca989b51cffd274aac2ee24e825f0bf3cbce5281fa1567b/protobuf-6.32.0.tar.gz", hash = "sha256:a81439049127067fc49ec1d36e25c6ee1d1a2b7be930675f919258d03c04e7d2", size = 440614, upload-time = "2025-08-14T21:21:25.015Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/c9/b9689a2a250264a84e66c46d8862ba788ee7a641cdca39bccf64f59284b7/protobuf-6.31.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:6f1227473dc43d44ed644425268eb7c2e488ae245d51c6866d19fe158e207402", size = 425604, upload-time = "2025-05-28T19:25:45.702Z" }, - { url = "https://files.pythonhosted.org/packages/76/a1/7a5a94032c83375e4fe7e7f56e3976ea6ac90c5e85fac8576409e25c39c3/protobuf-6.31.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:a40fc12b84c154884d7d4c4ebd675d5b3b5283e155f324049ae396b95ddebc39", size = 322115, upload-time = "2025-05-28T19:25:47.128Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b1/b59d405d64d31999244643d88c45c8241c58f17cc887e73bcb90602327f8/protobuf-6.31.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:4ee898bf66f7a8b0bd21bce523814e6fbd8c6add948045ce958b73af7e8878c6", size = 321070, upload-time = "2025-05-28T19:25:50.036Z" }, - { url = "https://files.pythonhosted.org/packages/f7/af/ab3c51ab7507a7325e98ffe691d9495ee3d3aa5f589afad65ec920d39821/protobuf-6.31.1-py3-none-any.whl", hash = "sha256:720a6c7e6b77288b85063569baae8536671b39f15cc22037ec7045658d80489e", size = 168724, upload-time = "2025-05-28T19:25:53.926Z" }, + { url = "https://files.pythonhosted.org/packages/cc/5b/0d421533c59c789e9c9894683efac582c06246bf24bb26b753b149bd88e4/protobuf-6.32.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d52691e5bee6c860fff9a1c86ad26a13afbeb4b168cd4445c922b7e2cf85aaf0", size = 426449, upload-time = "2025-08-14T21:21:16.687Z" }, + { url = "https://files.pythonhosted.org/packages/ec/7b/607764ebe6c7a23dcee06e054fd1de3d5841b7648a90fd6def9a3bb58c5e/protobuf-6.32.0-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:501fe6372fd1c8ea2a30b4d9be8f87955a64d6be9c88a973996cef5ef6f0abf1", size = 322869, upload-time = "2025-08-14T21:21:18.282Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/2e730bd1c25392fc32e3268e02446f0d77cb51a2c3a8486b1798e34d5805/protobuf-6.32.0-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:75a2aab2bd1aeb1f5dc7c5f33bcb11d82ea8c055c9becbb41c26a8c43fd7092c", size = 322009, upload-time = "2025-08-14T21:21:19.893Z" }, + { url = "https://files.pythonhosted.org/packages/9c/f2/80ffc4677aac1bc3519b26bc7f7f5de7fce0ee2f7e36e59e27d8beb32dd1/protobuf-6.32.0-py3-none-any.whl", hash = "sha256:ba377e5b67b908c8f3072a57b63e2c6a4cbd18aea4ed98d2584350dbf46f2783", size = 169287, upload-time = "2025-08-14T21:21:23.515Z" }, ] [[package]] @@ -970,28 +954,37 @@ wheels = [ [[package]] name = "regex" -version = "2024.11.6" +version = "2025.7.34" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494, upload-time = "2024-11-06T20:12:31.635Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/de/e13fa6dc61d78b30ba47481f99933a3b49a57779d625c392d8036770a60d/regex-2025.7.34.tar.gz", hash = "sha256:9ead9765217afd04a86822dfcd4ed2747dfe426e887da413b15ff0ac2457e21a", size = 400714, upload-time = "2025-07-31T00:21:16.262Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525, upload-time = "2024-11-06T20:10:45.19Z" }, - { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324, upload-time = "2024-11-06T20:10:47.177Z" }, - { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617, upload-time = "2024-11-06T20:10:49.312Z" }, - { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023, upload-time = "2024-11-06T20:10:51.102Z" }, - { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072, upload-time = "2024-11-06T20:10:52.926Z" }, - { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130, upload-time = "2024-11-06T20:10:54.828Z" }, - { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857, upload-time = "2024-11-06T20:10:56.634Z" }, - { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006, upload-time = "2024-11-06T20:10:59.369Z" }, - { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650, upload-time = "2024-11-06T20:11:02.042Z" }, - { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545, upload-time = "2024-11-06T20:11:03.933Z" }, - { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045, upload-time = "2024-11-06T20:11:06.497Z" }, - { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182, upload-time = "2024-11-06T20:11:09.06Z" }, - { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733, upload-time = "2024-11-06T20:11:11.256Z" }, + { url = "https://files.pythonhosted.org/packages/15/16/b709b2119975035169a25aa8e4940ca177b1a2e25e14f8d996d09130368e/regex-2025.7.34-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c3c9740a77aeef3f5e3aaab92403946a8d34437db930a0280e7e81ddcada61f5", size = 485334, upload-time = "2025-07-31T00:19:56.58Z" }, + { url = "https://files.pythonhosted.org/packages/94/a6/c09136046be0595f0331bc58a0e5f89c2d324cf734e0b0ec53cf4b12a636/regex-2025.7.34-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:69ed3bc611540f2ea70a4080f853741ec698be556b1df404599f8724690edbcd", size = 289942, upload-time = "2025-07-31T00:19:57.943Z" }, + { url = "https://files.pythonhosted.org/packages/36/91/08fc0fd0f40bdfb0e0df4134ee37cfb16e66a1044ac56d36911fd01c69d2/regex-2025.7.34-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d03c6f9dcd562c56527c42b8530aad93193e0b3254a588be1f2ed378cdfdea1b", size = 285991, upload-time = "2025-07-31T00:19:59.837Z" }, + { url = "https://files.pythonhosted.org/packages/be/2f/99dc8f6f756606f0c214d14c7b6c17270b6bbe26d5c1f05cde9dbb1c551f/regex-2025.7.34-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6164b1d99dee1dfad33f301f174d8139d4368a9fb50bf0a3603b2eaf579963ad", size = 797415, upload-time = "2025-07-31T00:20:01.668Z" }, + { url = "https://files.pythonhosted.org/packages/62/cf/2fcdca1110495458ba4e95c52ce73b361cf1cafd8a53b5c31542cde9a15b/regex-2025.7.34-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1e4f4f62599b8142362f164ce776f19d79bdd21273e86920a7b604a4275b4f59", size = 862487, upload-time = "2025-07-31T00:20:03.142Z" }, + { url = "https://files.pythonhosted.org/packages/90/38/899105dd27fed394e3fae45607c1983e138273ec167e47882fc401f112b9/regex-2025.7.34-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:72a26dcc6a59c057b292f39d41465d8233a10fd69121fa24f8f43ec6294e5415", size = 910717, upload-time = "2025-07-31T00:20:04.727Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f6/4716198dbd0bcc9c45625ac4c81a435d1c4d8ad662e8576dac06bab35b17/regex-2025.7.34-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5273fddf7a3e602695c92716c420c377599ed3c853ea669c1fe26218867002f", size = 801943, upload-time = "2025-07-31T00:20:07.1Z" }, + { url = "https://files.pythonhosted.org/packages/40/5d/cff8896d27e4e3dd11dd72ac78797c7987eb50fe4debc2c0f2f1682eb06d/regex-2025.7.34-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c1844be23cd40135b3a5a4dd298e1e0c0cb36757364dd6cdc6025770363e06c1", size = 786664, upload-time = "2025-07-31T00:20:08.818Z" }, + { url = "https://files.pythonhosted.org/packages/10/29/758bf83cf7b4c34f07ac3423ea03cee3eb3176941641e4ccc05620f6c0b8/regex-2025.7.34-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dde35e2afbbe2272f8abee3b9fe6772d9b5a07d82607b5788e8508974059925c", size = 856457, upload-time = "2025-07-31T00:20:10.328Z" }, + { url = "https://files.pythonhosted.org/packages/d7/30/c19d212b619963c5b460bfed0ea69a092c6a43cba52a973d46c27b3e2975/regex-2025.7.34-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f3f6e8e7af516a7549412ce57613e859c3be27d55341a894aacaa11703a4c31a", size = 849008, upload-time = "2025-07-31T00:20:11.823Z" }, + { url = "https://files.pythonhosted.org/packages/9e/b8/3c35da3b12c87e3cc00010ef6c3a4ae787cff0bc381aa3d251def219969a/regex-2025.7.34-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:469142fb94a869beb25b5f18ea87646d21def10fbacb0bcb749224f3509476f0", size = 788101, upload-time = "2025-07-31T00:20:13.729Z" }, + { url = "https://files.pythonhosted.org/packages/ac/23/6376f3a23cf2f3c00514b1cdd8c990afb4dfbac3cb4a68b633c6b7e2e307/regex-2025.7.34-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:8283afe7042d8270cecf27cca558873168e771183d4d593e3c5fe5f12402212a", size = 485385, upload-time = "2025-07-31T00:20:19.692Z" }, + { url = "https://files.pythonhosted.org/packages/73/5b/6d4d3a0b4d312adbfd6d5694c8dddcf1396708976dd87e4d00af439d962b/regex-2025.7.34-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6c053f9647e3421dd2f5dff8172eb7b4eec129df9d1d2f7133a4386319b47435", size = 289788, upload-time = "2025-07-31T00:20:21.941Z" }, + { url = "https://files.pythonhosted.org/packages/92/71/5862ac9913746e5054d01cb9fb8125b3d0802c0706ef547cae1e7f4428fa/regex-2025.7.34-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a16dd56bbcb7d10e62861c3cd000290ddff28ea142ffb5eb3470f183628011ac", size = 286136, upload-time = "2025-07-31T00:20:26.146Z" }, + { url = "https://files.pythonhosted.org/packages/27/df/5b505dc447eb71278eba10d5ec940769ca89c1af70f0468bfbcb98035dc2/regex-2025.7.34-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69c593ff5a24c0d5c1112b0df9b09eae42b33c014bdca7022d6523b210b69f72", size = 797753, upload-time = "2025-07-31T00:20:27.919Z" }, + { url = "https://files.pythonhosted.org/packages/86/38/3e3dc953d13998fa047e9a2414b556201dbd7147034fbac129392363253b/regex-2025.7.34-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98d0ce170fcde1a03b5df19c5650db22ab58af375aaa6ff07978a85c9f250f0e", size = 863263, upload-time = "2025-07-31T00:20:29.803Z" }, + { url = "https://files.pythonhosted.org/packages/68/e5/3ff66b29dde12f5b874dda2d9dec7245c2051f2528d8c2a797901497f140/regex-2025.7.34-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d72765a4bff8c43711d5b0f5b452991a9947853dfa471972169b3cc0ba1d0751", size = 910103, upload-time = "2025-07-31T00:20:31.313Z" }, + { url = "https://files.pythonhosted.org/packages/9e/fe/14176f2182125977fba3711adea73f472a11f3f9288c1317c59cd16ad5e6/regex-2025.7.34-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4494f8fd95a77eb434039ad8460e64d57baa0434f1395b7da44015bef650d0e4", size = 801709, upload-time = "2025-07-31T00:20:33.323Z" }, + { url = "https://files.pythonhosted.org/packages/5a/0d/80d4e66ed24f1ba876a9e8e31b709f9fd22d5c266bf5f3ab3c1afe683d7d/regex-2025.7.34-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4f42b522259c66e918a0121a12429b2abcf696c6f967fa37bdc7b72e61469f98", size = 786726, upload-time = "2025-07-31T00:20:35.252Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/c3ebb30e04a56c046f5c85179dc173818551037daae2c0c940c7b19152cb/regex-2025.7.34-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:aaef1f056d96a0a5d53ad47d019d5b4c66fe4be2da87016e0d43b7242599ffc7", size = 857306, upload-time = "2025-07-31T00:20:37.12Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b2/a4dc5d8b14f90924f27f0ac4c4c4f5e195b723be98adecc884f6716614b6/regex-2025.7.34-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:656433e5b7dccc9bc0da6312da8eb897b81f5e560321ec413500e5367fcd5d47", size = 848494, upload-time = "2025-07-31T00:20:38.818Z" }, + { url = "https://files.pythonhosted.org/packages/0d/21/9ac6e07a4c5e8646a90b56b61f7e9dac11ae0747c857f91d3d2bc7c241d9/regex-2025.7.34-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e91eb2c62c39705e17b4d42d4b86c4e86c884c0d15d9c5a47d0835f8387add8e", size = 787850, upload-time = "2025-07-31T00:20:40.478Z" }, ] [[package]] name = "requests" -version = "2.32.4" +version = "2.32.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -999,83 +992,97 @@ dependencies = [ { name = "idna", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "urllib3", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] [[package]] name = "rich" -version = "14.0.0" +version = "14.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pygments", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload-time = "2025-03-30T14:15:14.23Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441, upload-time = "2025-07-25T07:32:58.125Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload-time = "2025-03-30T14:15:12.283Z" }, + { url = "https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368, upload-time = "2025-07-25T07:32:56.73Z" }, ] [[package]] name = "ruff" -version = "0.12.4" +version = "0.12.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9b/ce/8d7dbedede481245b489b769d27e2934730791a9a82765cb94566c6e6abd/ruff-0.12.4.tar.gz", hash = "sha256:13efa16df6c6eeb7d0f091abae50f58e9522f3843edb40d56ad52a5a4a4b6873", size = 5131435, upload-time = "2025-07-17T17:27:19.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/45/2e403fa7007816b5fbb324cb4f8ed3c7402a927a0a0cb2b6279879a8bfdc/ruff-0.12.9.tar.gz", hash = "sha256:fbd94b2e3c623f659962934e52c2bea6fc6da11f667a427a368adaf3af2c866a", size = 5254702, upload-time = "2025-08-14T16:08:55.2Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/9f/517bc5f61bad205b7f36684ffa5415c013862dee02f55f38a217bdbe7aa4/ruff-0.12.4-py3-none-linux_armv6l.whl", hash = "sha256:cb0d261dac457ab939aeb247e804125a5d521b21adf27e721895b0d3f83a0d0a", size = 10188824, upload-time = "2025-07-17T17:26:31.412Z" }, - { url = "https://files.pythonhosted.org/packages/28/83/691baae5a11fbbde91df01c565c650fd17b0eabed259e8b7563de17c6529/ruff-0.12.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:55c0f4ca9769408d9b9bac530c30d3e66490bd2beb2d3dae3e4128a1f05c7442", size = 10884521, upload-time = "2025-07-17T17:26:35.084Z" }, - { url = "https://files.pythonhosted.org/packages/d6/8d/756d780ff4076e6dd035d058fa220345f8c458391f7edfb1c10731eedc75/ruff-0.12.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a8224cc3722c9ad9044da7f89c4c1ec452aef2cfe3904365025dd2f51daeae0e", size = 10277653, upload-time = "2025-07-17T17:26:37.897Z" }, - { url = "https://files.pythonhosted.org/packages/8d/97/8eeee0f48ece153206dce730fc9e0e0ca54fd7f261bb3d99c0a4343a1892/ruff-0.12.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9949d01d64fa3672449a51ddb5d7548b33e130240ad418884ee6efa7a229586", size = 10485993, upload-time = "2025-07-17T17:26:40.68Z" }, - { url = "https://files.pythonhosted.org/packages/49/b8/22a43d23a1f68df9b88f952616c8508ea6ce4ed4f15353b8168c48b2d7e7/ruff-0.12.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:be0593c69df9ad1465e8a2d10e3defd111fdb62dcd5be23ae2c06da77e8fcffb", size = 10022824, upload-time = "2025-07-17T17:26:43.564Z" }, - { url = "https://files.pythonhosted.org/packages/cd/70/37c234c220366993e8cffcbd6cadbf332bfc848cbd6f45b02bade17e0149/ruff-0.12.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7dea966bcb55d4ecc4cc3270bccb6f87a337326c9dcd3c07d5b97000dbff41c", size = 11524414, upload-time = "2025-07-17T17:26:46.219Z" }, - { url = "https://files.pythonhosted.org/packages/14/77/c30f9964f481b5e0e29dd6a1fae1f769ac3fd468eb76fdd5661936edd262/ruff-0.12.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afcfa3ab5ab5dd0e1c39bf286d829e042a15e966b3726eea79528e2e24d8371a", size = 12419216, upload-time = "2025-07-17T17:26:48.883Z" }, - { url = "https://files.pythonhosted.org/packages/6e/79/af7fe0a4202dce4ef62c5e33fecbed07f0178f5b4dd9c0d2fcff5ab4a47c/ruff-0.12.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c057ce464b1413c926cdb203a0f858cd52f3e73dcb3270a3318d1630f6395bb3", size = 11976756, upload-time = "2025-07-17T17:26:51.754Z" }, - { url = "https://files.pythonhosted.org/packages/09/d1/33fb1fc00e20a939c305dbe2f80df7c28ba9193f7a85470b982815a2dc6a/ruff-0.12.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64b90d1122dc2713330350626b10d60818930819623abbb56535c6466cce045", size = 11020019, upload-time = "2025-07-17T17:26:54.265Z" }, - { url = "https://files.pythonhosted.org/packages/64/f4/e3cd7f7bda646526f09693e2e02bd83d85fff8a8222c52cf9681c0d30843/ruff-0.12.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2abc48f3d9667fdc74022380b5c745873499ff827393a636f7a59da1515e7c57", size = 11277890, upload-time = "2025-07-17T17:26:56.914Z" }, - { url = "https://files.pythonhosted.org/packages/5e/d0/69a85fb8b94501ff1a4f95b7591505e8983f38823da6941eb5b6badb1e3a/ruff-0.12.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2b2449dc0c138d877d629bea151bee8c0ae3b8e9c43f5fcaafcd0c0d0726b184", size = 10348539, upload-time = "2025-07-17T17:26:59.381Z" }, - { url = "https://files.pythonhosted.org/packages/16/a0/91372d1cb1678f7d42d4893b88c252b01ff1dffcad09ae0c51aa2542275f/ruff-0.12.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:56e45bb11f625db55f9b70477062e6a1a04d53628eda7784dce6e0f55fd549eb", size = 10009579, upload-time = "2025-07-17T17:27:02.462Z" }, - { url = "https://files.pythonhosted.org/packages/23/1b/c4a833e3114d2cc0f677e58f1df6c3b20f62328dbfa710b87a1636a5e8eb/ruff-0.12.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:478fccdb82ca148a98a9ff43658944f7ab5ec41c3c49d77cd99d44da019371a1", size = 10942982, upload-time = "2025-07-17T17:27:05.343Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ce/ce85e445cf0a5dd8842f2f0c6f0018eedb164a92bdf3eda51984ffd4d989/ruff-0.12.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0fc426bec2e4e5f4c4f182b9d2ce6a75c85ba9bcdbe5c6f2a74fcb8df437df4b", size = 11343331, upload-time = "2025-07-17T17:27:08.652Z" }, + { url = "https://files.pythonhosted.org/packages/ad/20/53bf098537adb7b6a97d98fcdebf6e916fcd11b2e21d15f8c171507909cc/ruff-0.12.9-py3-none-linux_armv6l.whl", hash = "sha256:fcebc6c79fcae3f220d05585229463621f5dbf24d79fdc4936d9302e177cfa3e", size = 11759705, upload-time = "2025-08-14T16:08:12.968Z" }, + { url = "https://files.pythonhosted.org/packages/20/4d/c764ee423002aac1ec66b9d541285dd29d2c0640a8086c87de59ebbe80d5/ruff-0.12.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aed9d15f8c5755c0e74467731a007fcad41f19bcce41cd75f768bbd687f8535f", size = 12527042, upload-time = "2025-08-14T16:08:16.54Z" }, + { url = "https://files.pythonhosted.org/packages/8b/45/cfcdf6d3eb5fc78a5b419e7e616d6ccba0013dc5b180522920af2897e1be/ruff-0.12.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5b15ea354c6ff0d7423814ba6d44be2807644d0c05e9ed60caca87e963e93f70", size = 11724457, upload-time = "2025-08-14T16:08:18.686Z" }, + { url = "https://files.pythonhosted.org/packages/72/e6/44615c754b55662200c48bebb02196dbb14111b6e266ab071b7e7297b4ec/ruff-0.12.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d596c2d0393c2502eaabfef723bd74ca35348a8dac4267d18a94910087807c53", size = 11949446, upload-time = "2025-08-14T16:08:21.059Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d1/9b7d46625d617c7df520d40d5ac6cdcdf20cbccb88fad4b5ecd476a6bb8d/ruff-0.12.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b15599931a1a7a03c388b9c5df1bfa62be7ede6eb7ef753b272381f39c3d0ff", size = 11566350, upload-time = "2025-08-14T16:08:23.433Z" }, + { url = "https://files.pythonhosted.org/packages/59/20/b73132f66f2856bc29d2d263c6ca457f8476b0bbbe064dac3ac3337a270f/ruff-0.12.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d02faa2977fb6f3f32ddb7828e212b7dd499c59eb896ae6c03ea5c303575756", size = 13270430, upload-time = "2025-08-14T16:08:25.837Z" }, + { url = "https://files.pythonhosted.org/packages/a2/21/eaf3806f0a3d4c6be0a69d435646fba775b65f3f2097d54898b0fd4bb12e/ruff-0.12.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:17d5b6b0b3a25259b69ebcba87908496e6830e03acfb929ef9fd4c58675fa2ea", size = 14264717, upload-time = "2025-08-14T16:08:27.907Z" }, + { url = "https://files.pythonhosted.org/packages/d2/82/1d0c53bd37dcb582b2c521d352fbf4876b1e28bc0d8894344198f6c9950d/ruff-0.12.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72db7521860e246adbb43f6ef464dd2a532ef2ef1f5dd0d470455b8d9f1773e0", size = 13684331, upload-time = "2025-08-14T16:08:30.352Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2f/1c5cf6d8f656306d42a686f1e207f71d7cebdcbe7b2aa18e4e8a0cb74da3/ruff-0.12.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a03242c1522b4e0885af63320ad754d53983c9599157ee33e77d748363c561ce", size = 12739151, upload-time = "2025-08-14T16:08:32.55Z" }, + { url = "https://files.pythonhosted.org/packages/47/09/25033198bff89b24d734e6479e39b1968e4c992e82262d61cdccaf11afb9/ruff-0.12.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fc83e4e9751e6c13b5046d7162f205d0a7bac5840183c5beebf824b08a27340", size = 12954992, upload-time = "2025-08-14T16:08:34.816Z" }, + { url = "https://files.pythonhosted.org/packages/52/8e/d0dbf2f9dca66c2d7131feefc386523404014968cd6d22f057763935ab32/ruff-0.12.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:881465ed56ba4dd26a691954650de6ad389a2d1fdb130fe51ff18a25639fe4bb", size = 12899569, upload-time = "2025-08-14T16:08:36.852Z" }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b614d7c08515b1428ed4d3f1d4e3d687deffb2479703b90237682586fa66/ruff-0.12.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:43f07a3ccfc62cdb4d3a3348bf0588358a66da756aa113e071b8ca8c3b9826af", size = 11751983, upload-time = "2025-08-14T16:08:39.314Z" }, + { url = "https://files.pythonhosted.org/packages/58/d6/383e9f818a2441b1a0ed898d7875f11273f10882f997388b2b51cb2ae8b5/ruff-0.12.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:07adb221c54b6bba24387911e5734357f042e5669fa5718920ee728aba3cbadc", size = 11538635, upload-time = "2025-08-14T16:08:41.297Z" }, + { url = "https://files.pythonhosted.org/packages/20/9c/56f869d314edaa9fc1f491706d1d8a47747b9d714130368fbd69ce9024e9/ruff-0.12.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f5cd34fabfdea3933ab85d72359f118035882a01bff15bd1d2b15261d85d5f66", size = 12534346, upload-time = "2025-08-14T16:08:43.39Z" }, + { url = "https://files.pythonhosted.org/packages/bd/4b/d8b95c6795a6c93b439bc913ee7a94fda42bb30a79285d47b80074003ee7/ruff-0.12.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f6be1d2ca0686c54564da8e7ee9e25f93bdd6868263805f8c0b8fc6a449db6d7", size = 13017021, upload-time = "2025-08-14T16:08:45.889Z" }, ] [[package]] name = "rustworkx" -version = "0.16.0" +version = "0.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/c4/6d6ef39e57610d54c5f106dc3dece9eebce8b9d52d561ae092e3aede1b66/rustworkx-0.16.0.tar.gz", hash = "sha256:9f0dcb83f38d5ca2c3a683eb9b6951c8aec3262fbfe5141946a7ee5ba37e0bb6", size = 349524, upload-time = "2025-01-24T01:22:34.686Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/70/36f5916aee41ffe4f604ad75742eb1bb1b849fb568e010555f9d159cd93e/rustworkx-0.16.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:476a6c67b0142acd941691943750cc6737a48372304489969c2b62d30aaf4c27", size = 2141999, upload-time = "2025-01-24T01:21:50.3Z" }, - { url = "https://files.pythonhosted.org/packages/94/47/7e7c37fb73efcc87be6414b235534605c4008a4cdbd92a61db23b878eecd/rustworkx-0.16.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bef2ef42870f806af93979b457e240f6dfa4f867ca33965c620f3a804409ed3a", size = 1940309, upload-time = "2025-01-24T01:21:52.053Z" }, - { url = "https://files.pythonhosted.org/packages/c6/42/a6d6b3137be55ef1d887becdf6b64b0917c7d437bd483065a88500a55603/rustworkx-0.16.0-cp39-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0db3a73bf68b3e66c08322a2fc95d3aa663d037d9b4e49c3509da4898d3529cc", size = 2195350, upload-time = "2025-01-24T01:21:53.785Z" }, - { url = "https://files.pythonhosted.org/packages/59/d2/1bc99df831c132c4b7420a85ce9150e065f4c993798f31b6a4229f238398/rustworkx-0.16.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f12a13d7486234fa2a84746d5e41f436bf9df43548043e7a232f48804ff8c61", size = 1971689, upload-time = "2025-01-24T17:09:26.338Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3b/1125e7eb834f4408bcec3cee79947efd504c715fb7ab1876f8cd4bbca497/rustworkx-0.16.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89efd5c3a4653ddacc55ca39f28b261d43deec7d678f8f8fc6b76b5087f1dfea", size = 3297342, upload-time = "2025-01-24T03:18:48.885Z" }, - { url = "https://files.pythonhosted.org/packages/4f/e2/e21187b255c6211d71db0d08a44fc16771038b2af41712d66c408d9bec16/rustworkx-0.16.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec0c12aac8c54910ace20ac6ada4b890cd39f95f69100514715f8ad7af9041e4", size = 2110107, upload-time = "2025-01-24T01:21:58.884Z" }, - { url = "https://files.pythonhosted.org/packages/3c/79/e3fcff21f31253ea85ef196bf2fcabad7802b11468f7d3a5d592cd0ac789/rustworkx-0.16.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d650e39fc1a1534335f7517358ebfc3478bb235428463cfcd7c5750d50377b33", size = 2007544, upload-time = "2025-01-26T04:16:53.807Z" }, - { url = "https://files.pythonhosted.org/packages/67/04/741ed09c2b0dc0f360f85270c1179ed433785372ac9ab6ab26d3dd3ae02d/rustworkx-0.16.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:293180b83509ee9bff4c3af7ccc1024f6528d61b65d0cb7320bd31924f10cb71", size = 2172787, upload-time = "2025-01-24T01:22:01.282Z" }, + { url = "https://files.pythonhosted.org/packages/20/24/8972ed631fa05fdec05a7bb7f1fc0f8e78ee761ab37e8a93d1ed396ba060/rustworkx-0.17.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c08fb8db041db052da404839b064ebfb47dcce04ba9a3e2eb79d0c65ab011da4", size = 2257491, upload-time = "2025-08-13T01:43:31.466Z" }, + { url = "https://files.pythonhosted.org/packages/23/ae/7b6bbae5e0487ee42072dc6a46edf5db9731a0701ed648db22121fb7490c/rustworkx-0.17.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:4ef8e327dadf6500edd76fedb83f6d888b9266c58bcdbffd5a40c33835c9dd26", size = 2040175, upload-time = "2025-08-13T01:43:33.762Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ea/c17fb9428c8f0dcc605596f9561627a5b9ef629d356204ee5088cfcf52c6/rustworkx-0.17.1-cp39-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b809e0aa2927c68574b196f993233e269980918101b0dd235289c4f3ddb2115", size = 2324771, upload-time = "2025-08-13T01:43:35.553Z" }, + { url = "https://files.pythonhosted.org/packages/d7/40/ec8b3b8b0f8c0b768690c454b8dcc2781b4f2c767f9f1215539c7909e35b/rustworkx-0.17.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e82c46a92fb0fd478b7372e15ca524c287485fdecaed37b8bb68f4df2720f2", size = 2068584, upload-time = "2025-08-13T01:43:37.261Z" }, + { url = "https://files.pythonhosted.org/packages/d9/22/713b900d320d06ce8677e71bba0ec5df0037f1d83270bff5db3b271c10d7/rustworkx-0.17.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42170075d8a7319e89ff63062c2f1d1116ced37b6f044f3bf36d10b60a107aa4", size = 2380949, upload-time = "2025-08-13T01:52:17.435Z" }, + { url = "https://files.pythonhosted.org/packages/20/4b/54be84b3b41a19caf0718a2b6bb280dde98c8626c809c969f16aad17458f/rustworkx-0.17.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65cba97fa95470239e2d65eb4db1613f78e4396af9f790ff771b0e5476bfd887", size = 2562069, upload-time = "2025-08-13T02:09:27.222Z" }, + { url = "https://files.pythonhosted.org/packages/39/5b/281bb21d091ab4e36cf377088366d55d0875fa2347b3189c580ec62b44c7/rustworkx-0.17.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246cc252053f89e36209535b9c58755960197e6ae08d48d3973760141c62ac95", size = 2221186, upload-time = "2025-08-13T01:43:38.598Z" }, + { url = "https://files.pythonhosted.org/packages/cc/2d/30a941a21b81e9db50c4c3ef8a64c5ee1c8eea3a90506ca0326ce39d021f/rustworkx-0.17.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c10d25e9f0e87d6a273d1ea390b636b4fb3fede2094bf0cb3fe565d696a91b48", size = 2123510, upload-time = "2025-08-13T01:43:40.288Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ef/c9199e4b6336ee5a9f1979c11b5779c5cf9ab6f8386e0b9a96c8ffba7009/rustworkx-0.17.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:48784a673cf8d04f3cd246fa6b53fd1ccc4d83304503463bd561c153517bccc1", size = 2302783, upload-time = "2025-08-13T01:43:42.073Z" }, ] [[package]] name = "safetensors" -version = "0.5.3" +version = "0.6.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/71/7e/2d5d6ee7b40c0682315367ec7475693d110f512922d582fef1bd4a63adc3/safetensors-0.5.3.tar.gz", hash = "sha256:b6b0d6ecacec39a4fdd99cc19f4576f5219ce858e6fd8dbe7609df0b8dc56965", size = 67210, upload-time = "2025-02-26T09:15:13.155Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/cc/738f3011628920e027a11754d9cae9abec1aed00f7ae860abbf843755233/safetensors-0.6.2.tar.gz", hash = "sha256:43ff2aa0e6fa2dc3ea5524ac7ad93a9839256b8703761e76e2d0b2a3fa4f15d9", size = 197968, upload-time = "2025-08-08T13:13:58.654Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/ae/88f6c49dbd0cc4da0e08610019a3c78a7d390879a919411a410a1876d03a/safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073", size = 436917, upload-time = "2025-02-26T09:15:03.702Z" }, - { url = "https://files.pythonhosted.org/packages/b8/3b/11f1b4a2f5d2ab7da34ecc062b0bc301f2be024d110a6466726bec8c055c/safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21d01c14ff6c415c485616b8b0bf961c46b3b343ca59110d38d744e577f9cce7", size = 418419, upload-time = "2025-02-26T09:15:01.765Z" }, - { url = "https://files.pythonhosted.org/packages/5d/9a/add3e6fef267658075c5a41573c26d42d80c935cdc992384dfae435feaef/safetensors-0.5.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11bce6164887cd491ca75c2326a113ba934be596e22b28b1742ce27b1d076467", size = 459493, upload-time = "2025-02-26T09:14:51.812Z" }, - { url = "https://files.pythonhosted.org/packages/df/5c/bf2cae92222513cc23b3ff85c4a1bb2811a2c3583ac0f8e8d502751de934/safetensors-0.5.3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a243be3590bc3301c821da7a18d87224ef35cbd3e5f5727e4e0728b8172411e", size = 472400, upload-time = "2025-02-26T09:14:53.549Z" }, - { url = "https://files.pythonhosted.org/packages/58/11/7456afb740bd45782d0f4c8e8e1bb9e572f1bf82899fb6ace58af47b4282/safetensors-0.5.3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8bd84b12b1670a6f8e50f01e28156422a2bc07fb16fc4e98bded13039d688a0d", size = 522891, upload-time = "2025-02-26T09:14:55.717Z" }, - { url = "https://files.pythonhosted.org/packages/57/3d/fe73a9d2ace487e7285f6e157afee2383bd1ddb911b7cb44a55cf812eae3/safetensors-0.5.3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:391ac8cab7c829452175f871fcaf414aa1e292b5448bd02620f675a7f3e7abb9", size = 537694, upload-time = "2025-02-26T09:14:57.036Z" }, - { url = "https://files.pythonhosted.org/packages/a6/f8/dae3421624fcc87a89d42e1898a798bc7ff72c61f38973a65d60df8f124c/safetensors-0.5.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cead1fa41fc54b1e61089fa57452e8834f798cb1dc7a09ba3524f1eb08e0317a", size = 471642, upload-time = "2025-02-26T09:15:00.544Z" }, - { url = "https://files.pythonhosted.org/packages/ce/20/1fbe16f9b815f6c5a672f5b760951e20e17e43f67f231428f871909a37f6/safetensors-0.5.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1077f3e94182d72618357b04b5ced540ceb71c8a813d3319f1aba448e68a770d", size = 502241, upload-time = "2025-02-26T09:14:58.303Z" }, - { url = "https://files.pythonhosted.org/packages/5f/18/8e108846b506487aa4629fe4116b27db65c3dde922de2c8e0cc1133f3f29/safetensors-0.5.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:799021e78287bac619c7b3f3606730a22da4cda27759ddf55d37c8db7511c74b", size = 638001, upload-time = "2025-02-26T09:15:05.79Z" }, - { url = "https://files.pythonhosted.org/packages/82/5a/c116111d8291af6c8c8a8b40628fe833b9db97d8141c2a82359d14d9e078/safetensors-0.5.3-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df26da01aaac504334644e1b7642fa000bfec820e7cef83aeac4e355e03195ff", size = 734013, upload-time = "2025-02-26T09:15:07.892Z" }, - { url = "https://files.pythonhosted.org/packages/7d/ff/41fcc4d3b7de837963622e8610d998710705bbde9a8a17221d85e5d0baad/safetensors-0.5.3-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:32c3ef2d7af8b9f52ff685ed0bc43913cdcde135089ae322ee576de93eae5135", size = 670687, upload-time = "2025-02-26T09:15:09.979Z" }, - { url = "https://files.pythonhosted.org/packages/40/ad/2b113098e69c985a3d8fbda4b902778eae4a35b7d5188859b4a63d30c161/safetensors-0.5.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:37f1521be045e56fc2b54c606d4455573e717b2d887c579ee1dbba5f868ece04", size = 643147, upload-time = "2025-02-26T09:15:11.185Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b1/3f5fd73c039fc87dba3ff8b5d528bfc5a32b597fea8e7a6a4800343a17c7/safetensors-0.6.2-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:9c85ede8ec58f120bad982ec47746981e210492a6db876882aa021446af8ffba", size = 454797, upload-time = "2025-08-08T13:13:52.066Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c9/bb114c158540ee17907ec470d01980957fdaf87b4aa07914c24eba87b9c6/safetensors-0.6.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d6675cf4b39c98dbd7d940598028f3742e0375a6b4d4277e76beb0c35f4b843b", size = 432206, upload-time = "2025-08-08T13:13:50.931Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8e/f70c34e47df3110e8e0bb268d90db8d4be8958a54ab0336c9be4fe86dac8/safetensors-0.6.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d2d2b3ce1e2509c68932ca03ab8f20570920cd9754b05063d4368ee52833ecd", size = 473261, upload-time = "2025-08-08T13:13:41.259Z" }, + { url = "https://files.pythonhosted.org/packages/2a/f5/be9c6a7c7ef773e1996dc214e73485286df1836dbd063e8085ee1976f9cb/safetensors-0.6.2-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:93de35a18f46b0f5a6a1f9e26d91b442094f2df02e9fd7acf224cfec4238821a", size = 485117, upload-time = "2025-08-08T13:13:43.506Z" }, + { url = "https://files.pythonhosted.org/packages/c9/55/23f2d0a2c96ed8665bf17a30ab4ce5270413f4d74b6d87dd663258b9af31/safetensors-0.6.2-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89a89b505f335640f9120fac65ddeb83e40f1fd081cb8ed88b505bdccec8d0a1", size = 616154, upload-time = "2025-08-08T13:13:45.096Z" }, + { url = "https://files.pythonhosted.org/packages/98/c6/affb0bd9ce02aa46e7acddbe087912a04d953d7a4d74b708c91b5806ef3f/safetensors-0.6.2-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc4d0d0b937e04bdf2ae6f70cd3ad51328635fe0e6214aa1fc811f3b576b3bda", size = 520713, upload-time = "2025-08-08T13:13:46.25Z" }, + { url = "https://files.pythonhosted.org/packages/fe/5d/5a514d7b88e310c8b146e2404e0dc161282e78634d9358975fd56dfd14be/safetensors-0.6.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8045db2c872db8f4cbe3faa0495932d89c38c899c603f21e9b6486951a5ecb8f", size = 485835, upload-time = "2025-08-08T13:13:49.373Z" }, + { url = "https://files.pythonhosted.org/packages/7a/7b/4fc3b2ba62c352b2071bea9cfbad330fadda70579f617506ae1a2f129cab/safetensors-0.6.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:81e67e8bab9878bb568cffbc5f5e655adb38d2418351dc0859ccac158f753e19", size = 521503, upload-time = "2025-08-08T13:13:47.651Z" }, + { url = "https://files.pythonhosted.org/packages/5a/50/0057e11fe1f3cead9254315a6c106a16dd4b1a19cd247f7cc6414f6b7866/safetensors-0.6.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b0e4d029ab0a0e0e4fdf142b194514695b1d7d3735503ba700cf36d0fc7136ce", size = 652256, upload-time = "2025-08-08T13:13:53.167Z" }, + { url = "https://files.pythonhosted.org/packages/e9/29/473f789e4ac242593ac1656fbece6e1ecd860bb289e635e963667807afe3/safetensors-0.6.2-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:fa48268185c52bfe8771e46325a1e21d317207bcabcb72e65c6e28e9ffeb29c7", size = 747281, upload-time = "2025-08-08T13:13:54.656Z" }, + { url = "https://files.pythonhosted.org/packages/68/52/f7324aad7f2df99e05525c84d352dc217e0fa637a4f603e9f2eedfbe2c67/safetensors-0.6.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:d83c20c12c2d2f465997c51b7ecb00e407e5f94d7dec3ea0cc11d86f60d3fde5", size = 692286, upload-time = "2025-08-08T13:13:55.884Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/cad1d9762868c7c5dc70c8620074df28ebb1a8e4c17d4c0cb031889c457e/safetensors-0.6.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d944cea65fad0ead848b6ec2c37cc0b197194bec228f8020054742190e9312ac", size = 655957, upload-time = "2025-08-08T13:13:57.029Z" }, +] + +[[package]] +name = "shared" +version = "0.0.32" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "kvf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "paradict", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3f/39/f39c2560ac971efbf437f7ffa1d82a12fa77f50b0127e6e5ec5cc8d377df/shared-0.0.32.tar.gz", hash = "sha256:7308adc95c0dab14d0c99635cd8049d1f004cc7fef7396d3fe47323c34ec58c6", size = 7793, upload-time = "2024-12-10T20:49:22.469Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/03/da58e40386d8ebcdfa3617070a95ca1deb5a5e6aa3d4e15ea2045173d5ac/shared-0.0.32-py3-none-any.whl", hash = "sha256:f17962c0f0fe6a23015accc7cac029e1c24c4b14578094e1f7033a7a7ef16140", size = 29304, upload-time = "2024-12-10T20:49:19.763Z" }, ] [[package]] @@ -1089,21 +1096,21 @@ wheels = [ [[package]] name = "sqlalchemy" -version = "2.0.41" +version = "2.0.43" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64' and sys_platform == 'darwin') or (python_full_version < '3.14' and platform_machine == 'WIN32' and sys_platform == 'darwin') or (python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'darwin') or (python_full_version < '3.14' and platform_machine == 'amd64' and sys_platform == 'darwin') or (python_full_version < '3.14' and platform_machine == 'ppc64le' and sys_platform == 'darwin') or (python_full_version < '3.14' and platform_machine == 'win32' and sys_platform == 'darwin') or (python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.14' and platform_machine == 'AMD64' and sys_platform == 'linux') or (python_full_version < '3.14' and platform_machine == 'WIN32' and sys_platform == 'linux') or (python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.14' and platform_machine == 'amd64' and sys_platform == 'linux') or (python_full_version < '3.14' and platform_machine == 'ppc64le' and sys_platform == 'linux') or (python_full_version < '3.14' and platform_machine == 'win32' and sys_platform == 'linux') or (python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/66/45b165c595ec89aa7dcc2c1cd222ab269bc753f1fc7a1e68f8481bd957bf/sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", size = 9689424, upload-time = "2025-05-14T17:10:32.339Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/bc/d59b5d97d27229b0e009bd9098cd81af71c2fa5549c580a0a67b9bed0496/sqlalchemy-2.0.43.tar.gz", hash = "sha256:788bfcef6787a7764169cfe9859fe425bf44559619e1d9f56f5bddf2ebf6f417", size = 9762949, upload-time = "2025-08-11T14:24:58.438Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/ad/2e1c6d4f235a97eeef52d0200d8ddda16f6c4dd70ae5ad88c46963440480/sqlalchemy-2.0.41-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443", size = 2115491, upload-time = "2025-05-14T17:55:31.177Z" }, - { url = "https://files.pythonhosted.org/packages/cf/8d/be490e5db8400dacc89056f78a52d44b04fbf75e8439569d5b879623a53b/sqlalchemy-2.0.41-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc", size = 2102827, upload-time = "2025-05-14T17:55:34.921Z" }, - { url = "https://files.pythonhosted.org/packages/a0/72/c97ad430f0b0e78efaf2791342e13ffeafcbb3c06242f01a3bb8fe44f65d/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1", size = 3225224, upload-time = "2025-05-14T17:50:41.418Z" }, - { url = "https://files.pythonhosted.org/packages/5e/51/5ba9ea3246ea068630acf35a6ba0d181e99f1af1afd17e159eac7e8bc2b8/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a", size = 3230045, upload-time = "2025-05-14T17:51:54.722Z" }, - { url = "https://files.pythonhosted.org/packages/78/2f/8c14443b2acea700c62f9b4a8bad9e49fc1b65cfb260edead71fd38e9f19/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d", size = 3159357, upload-time = "2025-05-14T17:50:43.483Z" }, - { url = "https://files.pythonhosted.org/packages/fc/b2/43eacbf6ccc5276d76cea18cb7c3d73e294d6fb21f9ff8b4eef9b42bbfd5/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23", size = 3197511, upload-time = "2025-05-14T17:51:57.308Z" }, - { url = "https://files.pythonhosted.org/packages/1c/fc/9ba22f01b5cdacc8f5ed0d22304718d2c758fce3fd49a5372b886a86f37c/sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", size = 1911224, upload-time = "2025-05-14T17:39:42.154Z" }, + { url = "https://files.pythonhosted.org/packages/41/1c/a7260bd47a6fae7e03768bf66451437b36451143f36b285522b865987ced/sqlalchemy-2.0.43-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e7c08f57f75a2bb62d7ee80a89686a5e5669f199235c6d1dac75cd59374091c3", size = 2130598, upload-time = "2025-08-11T15:51:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/8e/84/8a337454e82388283830b3586ad7847aa9c76fdd4f1df09cdd1f94591873/sqlalchemy-2.0.43-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14111d22c29efad445cd5021a70a8b42f7d9152d8ba7f73304c4d82460946aaa", size = 2118415, upload-time = "2025-08-11T15:51:17.256Z" }, + { url = "https://files.pythonhosted.org/packages/cf/ff/22ab2328148492c4d71899d62a0e65370ea66c877aea017a244a35733685/sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b27b56eb2f82653168cefe6cb8e970cdaf4f3a6cb2c5e3c3c1cf3158968ff9", size = 3248707, upload-time = "2025-08-11T15:52:38.444Z" }, + { url = "https://files.pythonhosted.org/packages/dc/29/11ae2c2b981de60187f7cbc84277d9d21f101093d1b2e945c63774477aba/sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c5a9da957c56e43d72126a3f5845603da00e0293720b03bde0aacffcf2dc04f", size = 3253602, upload-time = "2025-08-11T15:56:37.348Z" }, + { url = "https://files.pythonhosted.org/packages/b8/61/987b6c23b12c56d2be451bc70900f67dd7d989d52b1ee64f239cf19aec69/sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d79f9fdc9584ec83d1b3c75e9f4595c49017f5594fee1a2217117647225d738", size = 3183248, upload-time = "2025-08-11T15:52:39.865Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/29d216002d4593c2ce1c0ec2cec46dda77bfbcd221e24caa6e85eff53d89/sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9df7126fd9db49e3a5a3999442cc67e9ee8971f3cb9644250107d7296cb2a164", size = 3219363, upload-time = "2025-08-11T15:56:39.11Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d9/13bdde6521f322861fab67473cec4b1cc8999f3871953531cf61945fad92/sqlalchemy-2.0.43-py3-none-any.whl", hash = "sha256:1681c21dd2ccee222c2fe0bef671d1aef7c504087c9c4e800371cfcc8ac966fc", size = 1924759, upload-time = "2025-08-11T15:39:53.024Z" }, ] [package.optional-dependencies] @@ -1138,25 +1145,25 @@ wheels = [ [[package]] name = "tokenizers" -version = "0.21.2" +version = "0.21.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/2d/b0fce2b8201635f60e8c95990080f58461cc9ca3d5026de2e900f38a7f21/tokenizers-0.21.2.tar.gz", hash = "sha256:fdc7cffde3e2113ba0e6cc7318c40e3438a4d74bbc62bf04bcc63bdfb082ac77", size = 351545, upload-time = "2025-06-24T10:24:52.449Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/2f/402986d0823f8d7ca139d969af2917fefaa9b947d1fb32f6168c509f2492/tokenizers-0.21.4.tar.gz", hash = "sha256:fa23f85fbc9a02ec5c6978da172cdcbac23498c3ca9f3645c5c68740ac007880", size = 351253, upload-time = "2025-07-28T15:48:54.325Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/cc/2936e2d45ceb130a21d929743f1e9897514691bec123203e10837972296f/tokenizers-0.21.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:342b5dfb75009f2255ab8dec0041287260fed5ce00c323eb6bab639066fef8ec", size = 2875206, upload-time = "2025-06-24T10:24:42.755Z" }, - { url = "https://files.pythonhosted.org/packages/6c/e6/33f41f2cc7861faeba8988e7a77601407bf1d9d28fc79c5903f8f77df587/tokenizers-0.21.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:126df3205d6f3a93fea80c7a8a266a78c1bd8dd2fe043386bafdd7736a23e45f", size = 2732655, upload-time = "2025-06-24T10:24:41.56Z" }, - { url = "https://files.pythonhosted.org/packages/33/2b/1791eb329c07122a75b01035b1a3aa22ad139f3ce0ece1b059b506d9d9de/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a32cd81be21168bd0d6a0f0962d60177c447a1aa1b1e48fa6ec9fc728ee0b12", size = 3019202, upload-time = "2025-06-24T10:24:31.791Z" }, - { url = "https://files.pythonhosted.org/packages/05/15/fd2d8104faa9f86ac68748e6f7ece0b5eb7983c7efc3a2c197cb98c99030/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8bd8999538c405133c2ab999b83b17c08b7fc1b48c1ada2469964605a709ef91", size = 2934539, upload-time = "2025-06-24T10:24:34.567Z" }, - { url = "https://files.pythonhosted.org/packages/a5/2e/53e8fd053e1f3ffbe579ca5f9546f35ac67cf0039ed357ad7ec57f5f5af0/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e9944e61239b083a41cf8fc42802f855e1dca0f499196df37a8ce219abac6eb", size = 3248665, upload-time = "2025-06-24T10:24:39.024Z" }, - { url = "https://files.pythonhosted.org/packages/00/15/79713359f4037aa8f4d1f06ffca35312ac83629da062670e8830917e2153/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:514cd43045c5d546f01142ff9c79a96ea69e4b5cda09e3027708cb2e6d5762ab", size = 3451305, upload-time = "2025-06-24T10:24:36.133Z" }, - { url = "https://files.pythonhosted.org/packages/38/5f/959f3a8756fc9396aeb704292777b84f02a5c6f25c3fc3ba7530db5feb2c/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1b9405822527ec1e0f7d8d2fdb287a5730c3a6518189c968254a8441b21faae", size = 3214757, upload-time = "2025-06-24T10:24:37.784Z" }, - { url = "https://files.pythonhosted.org/packages/c5/74/f41a432a0733f61f3d21b288de6dfa78f7acff309c6f0f323b2833e9189f/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed9a4d51c395103ad24f8e7eb976811c57fbec2af9f133df471afcd922e5020", size = 3121887, upload-time = "2025-06-24T10:24:40.293Z" }, - { url = "https://files.pythonhosted.org/packages/3c/6a/bc220a11a17e5d07b0dfb3b5c628621d4dcc084bccd27cfaead659963016/tokenizers-0.21.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2c41862df3d873665ec78b6be36fcc30a26e3d4902e9dd8608ed61d49a48bc19", size = 9091965, upload-time = "2025-06-24T10:24:44.431Z" }, - { url = "https://files.pythonhosted.org/packages/6c/bd/ac386d79c4ef20dc6f39c4706640c24823dca7ebb6f703bfe6b5f0292d88/tokenizers-0.21.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:ed21dc7e624e4220e21758b2e62893be7101453525e3d23264081c9ef9a6d00d", size = 9053372, upload-time = "2025-06-24T10:24:46.455Z" }, - { url = "https://files.pythonhosted.org/packages/63/7b/5440bf203b2a5358f074408f7f9c42884849cd9972879e10ee6b7a8c3b3d/tokenizers-0.21.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:0e73770507e65a0e0e2a1affd6b03c36e3bc4377bd10c9ccf51a82c77c0fe365", size = 9298632, upload-time = "2025-06-24T10:24:48.446Z" }, - { url = "https://files.pythonhosted.org/packages/a4/d2/faa1acac3f96a7427866e94ed4289949b2524f0c1878512516567d80563c/tokenizers-0.21.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:106746e8aa9014a12109e58d540ad5465b4c183768ea96c03cbc24c44d329958", size = 9470074, upload-time = "2025-06-24T10:24:50.378Z" }, + { url = "https://files.pythonhosted.org/packages/98/c6/fdb6f72bf6454f52eb4a2510be7fb0f614e541a2554d6210e370d85efff4/tokenizers-0.21.4-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:2ccc10a7c3bcefe0f242867dc914fc1226ee44321eb618cfe3019b5df3400133", size = 2863987, upload-time = "2025-07-28T15:48:44.877Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a6/28975479e35ddc751dc1ddc97b9b69bf7fcf074db31548aab37f8116674c/tokenizers-0.21.4-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:5e2f601a8e0cd5be5cc7506b20a79112370b9b3e9cb5f13f68ab11acd6ca7d60", size = 2732457, upload-time = "2025-07-28T15:48:43.265Z" }, + { url = "https://files.pythonhosted.org/packages/aa/8f/24f39d7b5c726b7b0be95dca04f344df278a3fe3a4deb15a975d194cbb32/tokenizers-0.21.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b376f5a1aee67b4d29032ee85511bbd1b99007ec735f7f35c8a2eb104eade5", size = 3012624, upload-time = "2025-07-28T13:22:43.895Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/26358925717687a58cb74d7a508de96649544fad5778f0cd9827398dc499/tokenizers-0.21.4-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2107ad649e2cda4488d41dfd031469e9da3fcbfd6183e74e4958fa729ffbf9c6", size = 2939681, upload-time = "2025-07-28T13:22:47.499Z" }, + { url = "https://files.pythonhosted.org/packages/99/6f/cc300fea5db2ab5ddc2c8aea5757a27b89c84469899710c3aeddc1d39801/tokenizers-0.21.4-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c73012da95afafdf235ba80047699df4384fdc481527448a078ffd00e45a7d9", size = 3247445, upload-time = "2025-07-28T15:48:39.711Z" }, + { url = "https://files.pythonhosted.org/packages/be/bf/98cb4b9c3c4afd8be89cfa6423704337dc20b73eb4180397a6e0d456c334/tokenizers-0.21.4-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f23186c40395fc390d27f519679a58023f368a0aad234af145e0f39ad1212732", size = 3428014, upload-time = "2025-07-28T13:22:49.569Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/96c1cc780e6ca7f01a57c13235dd05b7bc1c0f3588512ebe9d1331b5f5ae/tokenizers-0.21.4-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc88bb34e23a54cc42713d6d98af5f1bf79c07653d24fe984d2d695ba2c922a2", size = 3193197, upload-time = "2025-07-28T13:22:51.471Z" }, + { url = "https://files.pythonhosted.org/packages/f2/90/273b6c7ec78af547694eddeea9e05de771278bd20476525ab930cecaf7d8/tokenizers-0.21.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51b7eabb104f46c1c50b486520555715457ae833d5aee9ff6ae853d1130506ff", size = 3115426, upload-time = "2025-07-28T15:48:41.439Z" }, + { url = "https://files.pythonhosted.org/packages/91/43/c640d5a07e95f1cf9d2c92501f20a25f179ac53a4f71e1489a3dcfcc67ee/tokenizers-0.21.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:714b05b2e1af1288bd1bc56ce496c4cebb64a20d158ee802887757791191e6e2", size = 9089127, upload-time = "2025-07-28T15:48:46.472Z" }, + { url = "https://files.pythonhosted.org/packages/44/a1/dd23edd6271d4dca788e5200a807b49ec3e6987815cd9d0a07ad9c96c7c2/tokenizers-0.21.4-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:1340ff877ceedfa937544b7d79f5b7becf33a4cfb58f89b3b49927004ef66f78", size = 9055243, upload-time = "2025-07-28T15:48:48.539Z" }, + { url = "https://files.pythonhosted.org/packages/21/2b/b410d6e9021c4b7ddb57248304dc817c4d4970b73b6ee343674914701197/tokenizers-0.21.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:3c1f4317576e465ac9ef0d165b247825a2a4078bcd01cba6b54b867bdf9fdd8b", size = 9298237, upload-time = "2025-07-28T15:48:50.443Z" }, + { url = "https://files.pythonhosted.org/packages/b7/0a/42348c995c67e2e6e5c89ffb9cfd68507cbaeb84ff39c49ee6e0a6dd0fd2/tokenizers-0.21.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:c212aa4e45ec0bb5274b16b6f31dd3f1c41944025c2358faaa5782c754e84c24", size = 9461980, upload-time = "2025-07-28T15:48:52.325Z" }, ] [[package]] @@ -1170,7 +1177,7 @@ wheels = [ [[package]] name = "transformers" -version = "4.55.0" +version = "4.55.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -1184,9 +1191,9 @@ dependencies = [ { name = "tokenizers", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/27/5d/f7dc746eef83336a6b34197311fe0c1da0d1192f637c726c6a5cf0d83502/transformers-4.55.0.tar.gz", hash = "sha256:15aa138a05d07a15b30d191ea2c45e23061ebf9fcc928a1318e03fe2234f3ae1", size = 9569089, upload-time = "2025-08-05T16:13:48.997Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/a5/d8b8a1f3a051daeb5f11253bb69fc241f193d1c0566e299210ed9220ff4e/transformers-4.55.2.tar.gz", hash = "sha256:a45ec60c03474fd67adbce5c434685051b7608b3f4f167c25aa6aeb1cad16d4f", size = 9571466, upload-time = "2025-08-13T18:25:43.767Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/93/bcb22fb52ed65084c0199270832aa4cdd4b41296d896f3e7ade188bccb68/transformers-4.55.0-py3-none-any.whl", hash = "sha256:29d9b8800e32a4a831bb16efb5f762f6a9742fef9fce5d693ed018d19b106490", size = 11267905, upload-time = "2025-08-05T16:13:34.814Z" }, + { url = "https://files.pythonhosted.org/packages/db/5a/022ac010bedfb5119734cf9d743cf1d830cb4c604f53bb1552216f4344dc/transformers-4.55.2-py3-none-any.whl", hash = "sha256:097e3c2e2c0c9681db3da9d748d8f9d6a724c644514673d0030e8c5a1109f1f1", size = 11269748, upload-time = "2025-08-13T18:25:40.394Z" }, ] [[package]] @@ -1203,20 +1210,11 @@ wheels = [ [[package]] name = "types-aiofiles" -version = "24.1.0.20250708" +version = "24.1.0.20250809" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/d6/5c44761bc11cb5c7505013a39f397a9016bfb3a5c932032b2db16c38b87b/types_aiofiles-24.1.0.20250708.tar.gz", hash = "sha256:c8207ed7385491ce5ba94da02658164ebd66b69a44e892288c9f20cbbf5284ff", size = 14322, upload-time = "2025-07-08T03:14:44.814Z" } +sdist = { url = "https://files.pythonhosted.org/packages/03/b8/34a4f9da445a104d240bb26365a10ef68953bebdc812859ea46847c7fdcb/types_aiofiles-24.1.0.20250809.tar.gz", hash = "sha256:4dc9734330b1324d9251f92edfc94fd6827fbb829c593313f034a77ac33ae327", size = 14379, upload-time = "2025-08-09T03:14:41.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/e9/4e0cc79c630040aae0634ac9393341dc2aff1a5be454be9741cc6cc8989f/types_aiofiles-24.1.0.20250708-py3-none-any.whl", hash = "sha256:07f8f06465fd415d9293467d1c66cd074b2c3b62b679e26e353e560a8cf63720", size = 14320, upload-time = "2025-07-08T03:14:44.009Z" }, -] - -[[package]] -name = "types-protobuf" -version = "6.30.2.20250703" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/54/d63ce1eee8e93c4d710bbe2c663ec68e3672cf4f2fca26eecd20981c0c5d/types_protobuf-6.30.2.20250703.tar.gz", hash = "sha256:609a974754bbb71fa178fc641f51050395e8e1849f49d0420a6281ed8d1ddf46", size = 62300, upload-time = "2025-07-03T03:14:05.74Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/2b/5d0377c3d6e0f49d4847ad2c40629593fee4a5c9ec56eba26a15c708fbc0/types_protobuf-6.30.2.20250703-py3-none-any.whl", hash = "sha256:fa5aff9036e9ef432d703abbdd801b436a249b6802e4df5ef74513e272434e57", size = 76489, upload-time = "2025-07-03T03:14:04.453Z" }, + { url = "https://files.pythonhosted.org/packages/28/78/0d8ffa40e9ec6cbbabe4d93675092fea1cadc4c280495375fc1f2fa42793/types_aiofiles-24.1.0.20250809-py3-none-any.whl", hash = "sha256:657c83f876047ffc242b34bfcd9167f201d1b02e914ee854f16e589aa95c0d45", size = 14300, upload-time = "2025-08-09T03:14:40.438Z" }, ] [[package]] diff --git a/worker/README.md b/worker/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/worker/pyproject.toml b/worker/pyproject.toml index 1eefe599..dca88c33 100644 --- a/worker/pyproject.toml +++ b/worker/pyproject.toml @@ -1,11 +1,11 @@ [project] -name = "exo-worker" +name = "worker" version = "0.1.0" description = "Worker for the Exo project" readme = "README.md" requires-python = ">=3.13" dependencies = [ - "exo-shared", + "shared", "huggingface_hub>=0.33.4", "mlx>=0.26.3", "mlx-lm @ https://github.com/ml-explore/mlx-lm.git", @@ -14,21 +14,5 @@ dependencies = [ ] [build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.hatch.metadata] -allow-direct-references = true - -[tool.hatch.build] -clean = true - -[tool.hatch.build.targets.wheel] -packages = [] -include = ["*"] -exclude = ["*.md", "pyproject.toml"] - -[tool.hatch.build.targets.sdist] -packages = [] -include = ["*"] -exclude = ["*.md", "pyproject.toml"] +requires = ["uv_build>=0.8.9,<0.9.0"] +build-backend = "uv_build"