From 8cd6191c70f580fbfb96fe054434e68da9c5ec4c Mon Sep 17 00:00:00 2001 From: Evan Date: Sat, 21 Mar 2026 22:22:25 +0000 Subject: [PATCH] gotta move the cache soon --- flake.lock | 48 +- flake.nix | 29 +- {python => nix}/vllm_uv2nix_cmake.patch | 0 .../xgrammar_cmake.patch | 0 pyproject.toml | 23 +- python/exo_core/pyproject.toml | 17 +- .../exo_core/src/exo_core}/constants.py | 2 +- python/exo_core/src/exo_core/engine.py | 3 +- python/exo_core/src/exo_core/model_cards.py | 135 +-- .../src/exo_core/{pydantic.py => models.py} | 4 +- python/exo_core/src/exo_core/types/chunks.py | 2 +- python/exo_core/src/exo_core/types/common.py | 2 +- .../exo_core/src/exo_core/types/downloads.py | 165 ++++ .../exo_core/src/exo_core/types/instances.py | 6 +- .../src/exo_core/types/runner_response.py | 3 +- python/exo_core/src/exo_core/types/runners.py | 2 +- python/exo_core/src/exo_core/types/shards.py | 2 +- python/exo_core/src/exo_core/types/tasks.py | 2 +- .../exo_core/src/exo_core/utils/downloads.py | 80 +- .../src/exo_core/utils/huggingface.py | 3 +- python/exo_core/src/exo_core/utils/memory.py | 2 +- .../exo_core/src/exo_core/utils/paths.py | 0 python/mlx_engine/pyproject.toml | 5 +- .../src/mlx_engine/__init__.py} | 0 python/mlx_engine/uv.lock | 123 +++ python/parts.nix | 120 ++- python/vllm_engine/main.py | 6 - python/vllm_engine/pyproject.toml | 21 +- .../src/vllm_engine/prompt_format.py | 4 +- .../src/vllm_engine/vllm_generator.py | 42 +- src/exo/api/adapters/chat_completions.py | 25 +- src/exo/api/adapters/claude.py | 17 +- src/exo/api/adapters/ollama.py | 17 +- src/exo/api/adapters/responses.py | 25 +- src/exo/api/main.py | 56 +- src/exo/api/tests/test_cancel_command.py | 2 +- src/exo/api/tests/test_claude_api.py | 2 +- src/exo/api/tests/test_claude_tool_use.py | 4 +- .../api/tests/test_openai_responses_api.py | 2 +- src/exo/api/types/api.py | 15 +- src/exo/api/types/claude_api.py | 3 +- src/exo/api/types/ollama_api.py | 3 +- src/exo/api/types/openai_responses.py | 7 +- src/exo/download/coordinator.py | 28 +- src/exo/download/impl_shard_downloader.py | 6 +- src/exo/download/shard_downloader.py | 9 +- .../tests/test_download_verification.py | 51 +- src/exo/download/tests/test_offline_mode.py | 19 +- src/exo/download/tests/test_re_download.py | 12 +- src/exo/main.py | 6 +- src/exo/master/image_store.py | 3 +- src/exo/master/main.py | 32 +- src/exo/master/placement.py | 35 +- src/exo/master/placement_utils.py | 20 +- src/exo/master/tests/test_master.py | 16 +- src/exo/master/tests/test_placement.py | 16 +- src/exo/master/tests/test_placement_utils.py | 8 +- src/exo/master/tests/test_topology.py | 2 +- src/exo/routing/connection_message.py | 5 +- src/exo/routing/event_router.py | 2 +- src/exo/routing/router.py | 4 +- src/exo/routing/topics.py | 3 +- src/exo/shared/apply.py | 10 +- src/exo/shared/election.py | 4 +- src/exo/shared/tests/conftest.py | 7 +- .../test_apply/test_apply_node_download.py | 6 +- .../test_apply/test_apply_runner_deleted.py | 2 +- src/exo/shared/tests/test_election.py | 2 +- .../shared/tests/test_node_id_persistence.py | 2 +- .../tests/test_resolve_reasoning_params.py | 3 +- .../shared/tests/test_state_serialization.py | 3 +- src/exo/shared/tests/test_xdg_paths.py | 12 +- src/exo/shared/topology.py | 2 +- src/exo/shared/tracing.py | 3 +- src/exo/shared/types/commands.py | 14 +- src/exo/shared/types/events.py | 14 +- src/exo/shared/types/profiling.py | 4 +- src/exo/shared/types/state.py | 12 +- src/exo/shared/types/thunderbolt.py | 3 +- src/exo/shared/types/topology.py | 5 +- src/exo/shared/types/worker/downloads.py | 98 -- src/exo/utils/banner.py | 2 +- src/exo/utils/info_gatherer/info_gatherer.py | 6 +- src/exo/utils/info_gatherer/macmon.py | 2 +- src/exo/utils/info_gatherer/net_profile.py | 2 +- src/exo/utils/info_gatherer/nvml.py | 3 +- src/exo/utils/power_sampler.py | 2 +- src/exo/utils/tests/test_power_sampler.py | 2 +- src/exo/utils/tests/test_tagged.py | 2 +- .../worker/engines/image/distributed_model.py | 6 +- src/exo/worker/engines/image/generate.py | 10 +- .../worker/engines/image/pipeline/runner.py | 4 +- src/exo/worker/engines/mlx/auto_parallel.py | 2 +- src/exo/worker/engines/mlx/cache.py | 2 +- .../engines/mlx/generator/batch_generate.py | 10 +- .../worker/engines/mlx/generator/generate.py | 12 +- src/exo/worker/engines/mlx/utils_mlx.py | 24 +- src/exo/worker/main.py | 28 +- src/exo/worker/plan.py | 45 +- src/exo/worker/runner/bootstrap.py | 9 +- src/exo/worker/runner/image_models/runner.py | 64 +- .../runner/llm_inference/batch_generator.py | 12 +- .../llm_inference/model_output_parsers.py | 4 +- src/exo/worker/runner/llm_inference/runner.py | 54 +- src/exo/worker/runner/runner_supervisor.py | 44 +- src/exo/worker/tests/constants.py | 8 +- src/exo/worker/tests/unittests/conftest.py | 14 +- .../tests/unittests/test_mlx/conftest.py | 12 +- .../test_mlx/test_kv_prefix_cache.py | 4 +- .../test_pipeline_prefill_callbacks.py | 15 +- .../test_prefix_cache_architectures.py | 4 +- .../unittests/test_mlx/test_tokenizers.py | 7 +- .../test_plan/test_download_and_loading.py | 15 +- .../test_plan/test_runner_lifecycle.py | 9 +- .../test_plan/test_task_forwarding.py | 11 +- .../tests/unittests/test_plan/test_warmup.py | 9 +- .../unittests/test_runner/test_dsml_e2e.py | 3 +- .../test_runner/test_event_ordering.py | 54 +- .../test_runner/test_parse_gpt_oss.py | 5 +- .../test_runner/test_parse_tool_calls.py | 3 +- .../test_runner/test_runner_supervisor.py | 13 +- tests/headless_runner.py | 40 +- tmp/gen_card.py | 2 +- uv.lock | 860 ++++++++---------- 124 files changed, 1550 insertions(+), 1401 deletions(-) rename {python => nix}/vllm_uv2nix_cmake.patch (100%) rename python/nanobind_cmake.patch => nix/xgrammar_cmake.patch (100%) rename {src/exo/shared => python/exo_core/src/exo_core}/constants.py (97%) rename python/exo_core/src/exo_core/{pydantic.py => models.py} (92%) create mode 100644 python/exo_core/src/exo_core/types/downloads.py rename src/exo/download/download_utils.py => python/exo_core/src/exo_core/utils/downloads.py (93%) rename src/exo/download/huggingface_utils.py => python/exo_core/src/exo_core/utils/huggingface.py (99%) rename src/exo/utils/dashboard_path.py => python/exo_core/src/exo_core/utils/paths.py (100%) rename python/{py.typed => mlx_engine/src/mlx_engine/__init__.py} (100%) create mode 100644 python/mlx_engine/uv.lock delete mode 100644 python/vllm_engine/main.py delete mode 100644 src/exo/shared/types/worker/downloads.py diff --git a/flake.lock b/flake.lock index 86fb6e60..721e96db 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "crane": { "locked": { - "lastModified": 1767744144, - "narHash": "sha256-9/9ntI0D+HbN4G0TrK3KmHbTvwgswz7p8IEJsWyef8Q=", + "lastModified": 1773857772, + "narHash": "sha256-5xsK26KRHf0WytBtsBnQYC/lTWDhQuT57HJ7SzuqZcM=", "owner": "ipetkov", "repo": "crane", - "rev": "2fb033290bf6b23f226d4c8b32f7f7a16b043d7e", + "rev": "b556d7bbae5ff86e378451511873dfd07e4504cd", "type": "github" }, "original": { @@ -47,11 +47,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1768287139, - "narHash": "sha256-nsXFt0OzUi6K7dUzzJD5/v9e0Ic+fvclfIW936/43ZM=", + "lastModified": 1773990552, + "narHash": "sha256-5dJwbgX05hVWZj8Kf9Tmb3mYWUZzF0kn6GMYBJQtPDI=", "owner": "nix-community", "repo": "fenix", - "rev": "a4a3aa956931f90f35453cb519e4545e9ad7f773", + "rev": "a90c1a2e004e318a4463c9e87ae1f00788afba1b", "type": "github" }, "original": { @@ -83,11 +83,11 @@ ] }, "locked": { - "lastModified": 1768135262, - "narHash": "sha256-PVvu7OqHBGWN16zSi6tEmPwwHQ4rLPU9Plvs8/1TUBY=", + "lastModified": 1772408722, + "narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "80daad04eddbbf5a4d883996a73f3f542fa437ac", + "rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3", "type": "github" }, "original": { @@ -164,11 +164,11 @@ ] }, "locked": { - "lastModified": 1763662255, - "narHash": "sha256-4bocaOyLa3AfiS8KrWjZQYu+IAta05u3gYZzZ6zXbT0=", + "lastModified": 1773870109, + "narHash": "sha256-ZoTdqZP03DcdoyxvpFHCAek4bkPUTUPUF3oCCgc3dP4=", "owner": "pyproject-nix", "repo": "build-system-pkgs", - "rev": "042904167604c681a090c07eb6967b4dd4dae88c", + "rev": "b6e74f433b02fa4b8a7965ee24680f4867e2926f", "type": "github" }, "original": { @@ -184,11 +184,11 @@ ] }, "locked": { - "lastModified": 1764134915, - "narHash": "sha256-xaKvtPx6YAnA3HQVp5LwyYG1MaN4LLehpQI8xEdBvBY=", + "lastModified": 1773909723, + "narHash": "sha256-HmcZQ/hMPHR22Ri/6Sl7Z0B5J8nZa9bRnZJtDFInM7I=", "owner": "pyproject-nix", "repo": "pyproject.nix", - "rev": "2c8df1383b32e5443c921f61224b198a2282a657", + "rev": "d37dcf34ac7194eac4b0d10520d01298c434267d", "type": "github" }, "original": { @@ -214,11 +214,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1768224240, - "narHash": "sha256-Pp1dDrXKPBUJReZnnDElFyHYn67XTd48zRhToheLjtk=", + "lastModified": 1773946486, + "narHash": "sha256-xZHZj3Bk0cf17U9kgP9M/CFnAEoaZeOoGnQggfJSeGQ=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "725349602e525df37f377701e001fe8aab807878", + "rev": "304785c5bf672fe01adc4201bd01bf61c33d567f", "type": "github" }, "original": { @@ -257,11 +257,11 @@ ] }, "locked": { - "lastModified": 1768158989, - "narHash": "sha256-67vyT1+xClLldnumAzCTBvU0jLZ1YBcf4vANRWP3+Ak=", + "lastModified": 1773297127, + "narHash": "sha256-6E/yhXP7Oy/NbXtf1ktzmU8SdVqJQ09HC/48ebEGBpk=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "e96d59dff5c0d7fddb9d113ba108f03c3ef99eca", + "rev": "71b125cd05fbfd78cab3e070b73544abe24c5016", "type": "github" }, "original": { @@ -280,11 +280,11 @@ ] }, "locked": { - "lastModified": 1767701098, - "narHash": "sha256-CJhKZnWb3gumR9oTRjFvCg/6lYTGbZRU7xtvcyWIRwU=", + "lastModified": 1773958975, + "narHash": "sha256-Lr2k67KFPxPLqMtCWvwfg30S8huAEpEY9UcXHfi1Q+4=", "owner": "pyproject-nix", "repo": "uv2nix", - "rev": "9d357f0d2ce6f5f35ec7959d7e704452352eb4da", + "rev": "ffd52b90f29babbc4f309c29f2a2cdd6547be443", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 83418e11..5f05d1d1 100644 --- a/flake.nix +++ b/flake.nix @@ -72,18 +72,23 @@ ]; perSystem = - { config, self', inputs', pkgs, lib, system, ... }: + { config, self', pkgs, lib, system, ... }: let # Use pinned nixpkgs for swift-format (swift is broken on x86_64-linux in newer nixpkgs) pkgsSwift = import inputs.nixpkgs-swift { inherit system; }; in { + _module.args.cudaPkgs = import inputs.nixpkgs + { + inherit system; + config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "cuda-merged" "cuda_cuobjdump" "cuda_gdb" "cuda_nvcc" "cuda_nvdisasm" "cuda_nvprune" "cuda_cccl" "cuda_cudart" "cuda_cupti" "cuda_cuxxfilt" "cuda_nvml_dev" "cuda_nvrtc" "cuda_nvtx" "cuda_profiler_api" "cuda_sanitizer_api" "libcublas" "libcufft" "libcurand" "libcusolver" "libnvjitlink" "libcusparse" "libnpp" "cudnn" "libcusparse_lt" "libcufile" "libnvshmem" "libnvvm" "cuda_crt" ]; + cudaSupport = true; + cudaCapabilities = [ "12.1" ]; + }; # Allow unfree for metal-toolchain (needed for Darwin Metal packages) _module.args.pkgs = import inputs.nixpkgs { inherit system; - config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "metal-toolchain" "cuda-merged" "cuda_cuobjdump" "cuda_gdb" "cuda_nvcc" "cuda_nvdisasm" "cuda_nvprune" "cuda_cccl" "cuda_cudart" "cuda_cupti" "cuda_cuxxfilt" "cuda_nvml_dev" "cuda_nvrtc" "cuda_nvtx" "cuda_profiler_api" "cuda_sanitizer_api" "libcublas" "libcufft" "libcurand" "libcusolver" "libnvjitlink" "libcusparse" "libnpp" "cudnn" "libcusparse_lt" "libcufile" "libnvshmem" "libnvvm" "cuda_crt" ]; - cudaSupport = true; - cudaCapabilities = [ "12.1" ]; + config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "metal-toolchain" ]; overlays = lib.optionals (system == "aarch64-darwin") [ (import ./nix/apple-sdk-overlay.nix) ]; @@ -133,7 +138,7 @@ ); devShells = { - default = with pkgs; pkgs.mkShell { + default = with pkgs; mkShell { inputsFrom = [ self'.checks.cargo-build ]; packages = @@ -142,7 +147,8 @@ config.treefmt.build.wrapper # PYTHON - python313 + self'.packages.editable-venv + self'.packages.python uv ruff basedpyright @@ -168,10 +174,17 @@ macmon ]; - OPENSSL_NO_VENDOR = "1"; + env = { + UV_NO_SYNC = "1"; + UV_PYTHON = self'.packages.python.interpreter; + UV_PYTHON_DOWNLOADS = "never"; + OPENSSL_NO_VENDOR = "1"; + }; shellHook = '' - export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${python313}/lib" + unset PYTHONPATH + export REPO_ROOT=$(git rev-parse --show-toplevel) + export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${self'.packages.python}/lib" ${lib.optionalString stdenv.isLinux '' export LD_LIBRARY_PATH="${openssl.out}/lib:$LD_LIBRARY_PATH" ''} diff --git a/python/vllm_uv2nix_cmake.patch b/nix/vllm_uv2nix_cmake.patch similarity index 100% rename from python/vllm_uv2nix_cmake.patch rename to nix/vllm_uv2nix_cmake.patch diff --git a/python/nanobind_cmake.patch b/nix/xgrammar_cmake.patch similarity index 100% rename from python/nanobind_cmake.patch rename to nix/xgrammar_cmake.patch diff --git a/pyproject.toml b/pyproject.toml index 310e22bb..d27ca5a1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,7 @@ dependencies = [ "python-multipart>=0.0.21", "msgspec>=0.19.0", "zstandard>=0.23.0", + "exo_core", ] [project.scripts] @@ -45,28 +46,30 @@ dev = [ "pytest-env", "ruff>=0.11.13", ] -build = [ - "nanobind" -] +build = ["nanobind"] [project.optional-dependencies] mlx = ["mlx_engine"] -cuda = [ - "vllm_engine; sys_platform == 'linux' and platform_machine == 'aarch64'", -] +cuda = ["vllm_engine; sys_platform == 'linux'"] ### # workspace configuration ### [tool.uv.workspace] -members = ["rust/exo_pyo3_bindings", "bench", "python/exo_core"] +members = [ + "rust/exo_pyo3_bindings", + "bench", + "python/exo_core", + "python/vllm_engine", + "python/mlx_engine", +] [tool.uv.sources] exo_pyo3_bindings = { workspace = true } exo_core = { workspace = true } -mlx_engine = { path = "python/mlx_engine" } -vllm_engine = { path = "python/vllm_engine" } +mlx_engine = { workspace = true } +vllm_engine = { workspace = true } mlx = { git = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv.git", branch = "address-rdma-gpu-locks", marker = "sys_platform == 'darwin'" } mlx-lm = { git = "https://github.com/rltakashige/mlx-lm", branch = "leo/eval-left-padding-in-batched-rotation" } # Uncomment to use local mlx/mlx-lm development versions: @@ -132,7 +135,7 @@ environments = ["sys_platform == 'darwin'", "sys_platform == 'linux'"] conflicts = [[{ package = "exo", extra = "cuda" }, { package = "exo-bench" }]] [tool.uv.extra-build-dependencies] -xgrammar = [ "nanobind" ] +xgrammar = ["nanobind"] ### diff --git a/python/exo_core/pyproject.toml b/python/exo_core/pyproject.toml index 36f6717a..bafe5d41 100644 --- a/python/exo_core/pyproject.toml +++ b/python/exo_core/pyproject.toml @@ -5,8 +5,23 @@ description = "Add your description here" readme = "README.md" authors = [{ name = "Evan", email = "evanev7@gmail.com" }] requires-python = ">=3.13" -dependencies = ["pydantic"] +dependencies = ["pydantic>=2.13.0b2"] [build-system] requires = ["uv_build>=0.9.24,<0.10.0"] build-backend = "uv_build" + +[tool.basedpyright] +typeCheckingMode = "strict" +failOnWarnings = true + +reportAny = "error" +reportUnknownVariableType = "error" +reportUnknownParameterType = "error" +reportMissingParameterType = "error" +reportMissingTypeStubs = "error" +reportInvalidCast = "error" +reportUnnecessaryCast = "error" +reportUnnecessaryTypeIgnoreComment = "error" + +pythonVersion = "3.13" diff --git a/src/exo/shared/constants.py b/python/exo_core/src/exo_core/constants.py similarity index 97% rename from src/exo/shared/constants.py rename to python/exo_core/src/exo_core/constants.py index 69534298..86a29f4f 100644 --- a/src/exo/shared/constants.py +++ b/python/exo_core/src/exo_core/constants.py @@ -2,7 +2,7 @@ import os import sys from pathlib import Path -from exo.utils.dashboard_path import find_dashboard, find_resources +from exo_core.utils.paths import find_dashboard, find_resources _EXO_HOME_ENV = os.environ.get("EXO_HOME", None) diff --git a/python/exo_core/src/exo_core/engine.py b/python/exo_core/src/exo_core/engine.py index 3bdc7954..cca79965 100644 --- a/python/exo_core/src/exo_core/engine.py +++ b/python/exo_core/src/exo_core/engine.py @@ -2,8 +2,7 @@ from abc import ABC, abstractmethod from collections.abc import Callable, Iterable from typing import Self - -class TaskId(str): ... +from exo_core.types.tasks import TaskId class Cancelled: ... diff --git a/python/exo_core/src/exo_core/model_cards.py b/python/exo_core/src/exo_core/model_cards.py index e022e926..93fbc39e 100644 --- a/python/exo_core/src/exo_core/model_cards.py +++ b/python/exo_core/src/exo_core/model_cards.py @@ -1,31 +1,23 @@ from enum import Enum -from typing import Annotated, Any -import aiofiles import aiofiles.os as aios import tomlkit from anyio import Path, open_file -from exo.shared.types.common import ModelId -from exo.shared.types.memory import Memory -from exo.utils.pydantic_ext import CamelCaseModel -from huggingface_hub import model_info -from loguru import logger from pydantic import ( - AliasChoices, - BaseModel, - Field, PositiveInt, ValidationError, field_validator, - model_validator, ) from tomlkit.exceptions import TOMLKitError -from exo.shared.constants import ( +from exo_core.constants import ( EXO_CUSTOM_MODEL_CARDS_DIR, EXO_ENABLE_IMAGE_MODELS, RESOURCES_DIR, ) +from exo_core.models import CamelCaseModel +from exo_core.types.common import ModelId +from exo_core.utils.memory import Memory # kinda ugly... # TODO: load search path from config.toml @@ -127,6 +119,9 @@ class ModelCard(CamelCaseModel): @staticmethod async def fetch_from_hf(model_id: ModelId) -> "ModelCard": """Fetches storage size and number of layers for a Hugging Face model, returns Pydantic ModelMeta.""" + # needed to prevent circular imports + from exo_core.utils.downloads import fetch_config_data, fetch_safetensors_size + # TODO: failure if files do not exist config_data = await fetch_config_data(model_id) num_layers = config_data.layer_count @@ -165,119 +160,3 @@ def is_custom_card(model_id: ModelId) -> bool: ModelId(model_id).normalize() + ".toml" ) return os.path.isfile(str(card_path)) - - -class ConfigData(BaseModel): - model_config = {"extra": "ignore"} # Allow unknown fields - - architectures: list[str] | None = None - hidden_size: Annotated[int, Field(ge=0)] | None = None - num_key_value_heads: PositiveInt | None = None - layer_count: int = Field( - validation_alias=AliasChoices( - "num_hidden_layers", - "num_layers", - "n_layer", - "n_layers", - "num_decoder_layers", - "decoder_layers", - ) - ) - - @property - def supports_tensor(self) -> bool: - return self.architectures in [ - ["Glm4MoeLiteForCausalLM"], - ["GlmMoeDsaForCausalLM"], - ["DeepseekV32ForCausalLM"], - ["DeepseekV3ForCausalLM"], - ["Qwen3NextForCausalLM"], - ["Qwen3MoeForCausalLM"], - ["Qwen3_5MoeForConditionalGeneration"], - ["Qwen3_5ForConditionalGeneration"], - ["MiniMaxM2ForCausalLM"], - ["LlamaForCausalLM"], - ["GptOssForCausalLM"], - ["Step3p5ForCausalLM"], - ["NemotronHForCausalLM"], - ] - - @model_validator(mode="before") - @classmethod - def defer_to_text_config(cls, data: dict[str, Any]): - text_config = data.get("text_config") - if text_config is None: - return data - - for field in [ - "architectures", - "hidden_size", - "num_key_value_heads", - "num_hidden_layers", - "num_layers", - "n_layer", - "n_layers", - "num_decoder_layers", - "decoder_layers", - ]: - if (val := text_config.get(field)) is not None: # pyright: ignore[reportAny] - data[field] = val - - return data - - -async def fetch_config_data(model_id: ModelId) -> ConfigData: - """Downloads and parses config.json for a model.""" - from exo.download.download_utils import ( - download_file_with_retry, - ensure_models_dir, - ) - - target_dir = (await ensure_models_dir()) / model_id.normalize() - await aios.makedirs(target_dir, exist_ok=True) - config_path = await download_file_with_retry( - model_id, - "main", - "config.json", - target_dir, - lambda curr_bytes, total_bytes, is_renamed: logger.debug( - f"Downloading config.json for {model_id}: {curr_bytes}/{total_bytes} ({is_renamed=})" - ), - ) - async with aiofiles.open(config_path, "r") as f: - return ConfigData.model_validate_json(await f.read()) - - -async def fetch_safetensors_size(model_id: ModelId) -> Memory: - """Gets model size from safetensors index or falls back to HF API.""" - from exo.download.download_utils import ( - download_file_with_retry, - ensure_models_dir, - ) - from exo.shared.types.worker.downloads import ModelSafetensorsIndex - - target_dir = (await ensure_models_dir()) / model_id.normalize() - await aios.makedirs(target_dir, exist_ok=True) - try: - index_path = await download_file_with_retry( - model_id, - "main", - "model.safetensors.index.json", - target_dir, - lambda curr_bytes, total_bytes, is_renamed: logger.debug( - f"Downloading model.safetensors.index.json for {model_id}: {curr_bytes}/{total_bytes} ({is_renamed=})" - ), - ) - async with aiofiles.open(index_path, "r") as f: - index_data = ModelSafetensorsIndex.model_validate_json(await f.read()) - - metadata = index_data.metadata - if metadata is not None: - return Memory.from_bytes(metadata.total_size) - except FileNotFoundError: - pass - - info = model_info(model_id) - if info.safetensors is None: - raise ValueError(f"No safetensors info found for {model_id}") - return Memory.from_bytes(info.safetensors.total) diff --git a/python/exo_core/src/exo_core/pydantic.py b/python/exo_core/src/exo_core/models.py similarity index 92% rename from python/exo_core/src/exo_core/pydantic.py rename to python/exo_core/src/exo_core/models.py index 07c8dc5e..1232aac4 100644 --- a/python/exo_core/src/exo_core/pydantic.py +++ b/python/exo_core/src/exo_core/models.py @@ -1,4 +1,4 @@ -# pyright: reportAny=false, reportUnknownArgumentType=false, reportUnknownVariableType=false +# pyright: reportAny=false from typing import Any, Self @@ -42,7 +42,7 @@ class TaggedModel(CamelCaseModel): @model_validator(mode="wrap") @classmethod def _validate(cls, v: Any, handler: ValidatorFunctionWrapHandler) -> Self: - if isinstance(v, dict) and len(v) == 1 and cls.__name__ in v: + if isinstance(v, dict) and len(v) == 1 and cls.__name__ in v: # pyright: ignore[reportUnknownArgumentType] return handler(v[cls.__name__]) return handler(v) diff --git a/python/exo_core/src/exo_core/types/chunks.py b/python/exo_core/src/exo_core/types/chunks.py index 9146b1d3..dae484ef 100644 --- a/python/exo_core/src/exo_core/types/chunks.py +++ b/python/exo_core/src/exo_core/types/chunks.py @@ -10,7 +10,7 @@ from exo.api.types import ( Usage, ) from exo_core.model_cards import ModelId -from exo_core.pydantic import TaggedModel +from exo_core.models import TaggedModel from .common import CommandId diff --git a/python/exo_core/src/exo_core/types/common.py b/python/exo_core/src/exo_core/types/common.py index 295274ae..7a1bbe2d 100644 --- a/python/exo_core/src/exo_core/types/common.py +++ b/python/exo_core/src/exo_core/types/common.py @@ -4,7 +4,7 @@ from uuid import uuid4 from pydantic import GetCoreSchemaHandler, field_validator from pydantic_core import core_schema -from exo_core.pydantic import CamelCaseModel +from exo_core.models import CamelCaseModel class Id(str): diff --git a/python/exo_core/src/exo_core/types/downloads.py b/python/exo_core/src/exo_core/types/downloads.py new file mode 100644 index 00000000..1b673342 --- /dev/null +++ b/python/exo_core/src/exo_core/types/downloads.py @@ -0,0 +1,165 @@ +from datetime import timedelta +from typing import Annotated, Any, Literal + +from pydantic import ( + AliasChoices, + BaseModel, + ConfigDict, + Field, + PositiveInt, + model_validator, +) + +from exo_core.models import CamelCaseModel, TaggedModel +from exo_core.types.common import NodeId +from exo_core.types.shards import ShardMetadata +from exo_core.utils.memory import Memory + + +class DownloadProgressData(CamelCaseModel): + total: Memory + downloaded: Memory + downloaded_this_session: Memory + + completed_files: int + total_files: int + + speed: float + eta_ms: int + + files: dict[str, "DownloadProgressData"] + + +class BaseDownloadProgress(TaggedModel): + node_id: NodeId + shard_metadata: ShardMetadata + model_directory: str = "" + + +class DownloadPending(BaseDownloadProgress): + downloaded: Memory = Memory() + total: Memory = Memory() + + +class DownloadCompleted(BaseDownloadProgress): + total: Memory + read_only: bool = False + + +class DownloadFailed(BaseDownloadProgress): + error_message: str + + +class DownloadOngoing(BaseDownloadProgress): + download_progress: DownloadProgressData + + +DownloadProgress = ( + DownloadPending | DownloadCompleted | DownloadFailed | DownloadOngoing +) + + +class ModelSafetensorsIndexMetadata(BaseModel): + total_size: PositiveInt + + +class ModelSafetensorsIndex(BaseModel): + metadata: ModelSafetensorsIndexMetadata | None + weight_map: dict[str, str] + + +class FileListEntry(BaseModel): + type: Literal["file", "directory"] + path: str + size: int | None = None + + +class RepoFileDownloadProgress(BaseModel): + repo_id: str + repo_revision: str + file_path: str + downloaded: Memory + downloaded_this_session: Memory + total: Memory + speed: float + eta: timedelta + status: Literal["not_started", "in_progress", "complete"] + start_time: float + + model_config = ConfigDict(frozen=True) + + +class RepoDownloadProgress(BaseModel): + repo_id: str + repo_revision: str + shard: ShardMetadata + completed_files: int + total_files: int + downloaded: Memory + downloaded_this_session: Memory + total: Memory + overall_speed: float + overall_eta: timedelta + status: Literal["not_started", "in_progress", "complete"] + file_progress: dict[str, RepoFileDownloadProgress] = Field(default_factory=dict) + + model_config = ConfigDict(frozen=True) + + +class ConfigData(BaseModel): + model_config = {"extra": "ignore"} # Allow unknown fields + + architectures: list[str] | None = None + hidden_size: Annotated[int, Field(ge=0)] | None = None + num_key_value_heads: PositiveInt | None = None + layer_count: int = Field( + validation_alias=AliasChoices( + "num_hidden_layers", + "num_layers", + "n_layer", + "n_layers", + "num_decoder_layers", + "decoder_layers", + ) + ) + + @property + def supports_tensor(self) -> bool: + return self.architectures in [ + ["Glm4MoeLiteForCausalLM"], + ["GlmMoeDsaForCausalLM"], + ["DeepseekV32ForCausalLM"], + ["DeepseekV3ForCausalLM"], + ["Qwen3NextForCausalLM"], + ["Qwen3MoeForCausalLM"], + ["Qwen3_5MoeForConditionalGeneration"], + ["Qwen3_5ForConditionalGeneration"], + ["MiniMaxM2ForCausalLM"], + ["LlamaForCausalLM"], + ["GptOssForCausalLM"], + ["Step3p5ForCausalLM"], + ["NemotronHForCausalLM"], + ] + + @model_validator(mode="before") + @classmethod + def defer_to_text_config(cls, data: dict[str, Any]): + text_config = data.get("text_config") + if text_config is None: + return data + + for field in [ + "architectures", + "hidden_size", + "num_key_value_heads", + "num_hidden_layers", + "num_layers", + "n_layer", + "n_layers", + "num_decoder_layers", + "decoder_layers", + ]: + if (val := text_config.get(field)) is not None: # pyright: ignore[reportAny] + data[field] = val + + return data diff --git a/python/exo_core/src/exo_core/types/instances.py b/python/exo_core/src/exo_core/types/instances.py index da33f311..addb8f72 100644 --- a/python/exo_core/src/exo_core/types/instances.py +++ b/python/exo_core/src/exo_core/types/instances.py @@ -1,11 +1,11 @@ from enum import Enum -from exo.shared.types.common import Host, Id, NodeId -from exo.shared.types.worker.runners import RunnerId, ShardAssignments, ShardMetadata from pydantic import model_validator from exo_core.model_cards import ModelTask -from exo_core.pydantic_ext import CamelCaseModel, TaggedModel +from exo_core.models import CamelCaseModel, TaggedModel +from exo_core.types.common import Host, Id, NodeId +from exo_core.types.runners import RunnerId, ShardAssignments, ShardMetadata class InstanceId(Id): diff --git a/python/exo_core/src/exo_core/types/runner_response.py b/python/exo_core/src/exo_core/types/runner_response.py index 272c78bf..4e1f213d 100644 --- a/python/exo_core/src/exo_core/types/runner_response.py +++ b/python/exo_core/src/exo_core/types/runner_response.py @@ -1,8 +1,6 @@ from collections.abc import Generator from typing import Any, Literal -from exo.utils.pydantic_ext import TaggedModel - from exo.api.types import ( FinishReason, GenerationStats, @@ -11,6 +9,7 @@ from exo.api.types import ( TopLogprobItem, Usage, ) +from exo_core.models import TaggedModel class BaseRunnerResponse(TaggedModel): diff --git a/python/exo_core/src/exo_core/types/runners.py b/python/exo_core/src/exo_core/types/runners.py index 08d546ef..d6f89f6d 100644 --- a/python/exo_core/src/exo_core/types/runners.py +++ b/python/exo_core/src/exo_core/types/runners.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from pydantic import model_validator from exo_core.model_cards import ModelId -from exo_core.pydantic import CamelCaseModel, TaggedModel +from exo_core.models import CamelCaseModel, TaggedModel from exo_core.types.common import Id, NodeId from exo_core.types.shards import ShardMetadata diff --git a/python/exo_core/src/exo_core/types/shards.py b/python/exo_core/src/exo_core/types/shards.py index 3f7628e2..1b560059 100644 --- a/python/exo_core/src/exo_core/types/shards.py +++ b/python/exo_core/src/exo_core/types/shards.py @@ -4,7 +4,7 @@ from typing import TypeAlias, final from pydantic import Field from exo_core.model_cards import ModelCard -from exo_core.pydantic import TaggedModel +from exo_core.models import TaggedModel class Sharding(str, Enum): diff --git a/python/exo_core/src/exo_core/types/tasks.py b/python/exo_core/src/exo_core/types/tasks.py index b0eeb6b1..fb5a6e0f 100644 --- a/python/exo_core/src/exo_core/types/tasks.py +++ b/python/exo_core/src/exo_core/types/tasks.py @@ -6,7 +6,7 @@ from exo.api.types import ( ImageEditsTaskParams, ImageGenerationTaskParams, ) -from exo_core.pydantic import TaggedModel +from exo_core.models import TaggedModel from exo_core.types.common import CommandId, Id from exo_core.types.instances import BoundInstance, InstanceId from exo_core.types.runners import RunnerId diff --git a/src/exo/download/download_utils.py b/python/exo_core/src/exo_core/utils/downloads.py similarity index 93% rename from src/exo/download/download_utils.py rename to python/exo_core/src/exo_core/utils/downloads.py index be77ef4f..9efd8589 100644 --- a/src/exo/download/download_utils.py +++ b/python/exo_core/src/exo_core/utils/downloads.py @@ -15,11 +15,8 @@ import aiofiles import aiofiles.os as aios import aiohttp import certifi -from exo.shared.models.model_cards import ModelTask -from exo.shared.types.common import ModelId -from exo.shared.types.memory import Memory -from exo.shared.types.worker.shards import ShardMetadata from huggingface_hub import ( + model_info, snapshot_download, # pyright: ignore[reportUnknownVariableType] ) from loguru import logger @@ -27,21 +24,25 @@ from pydantic import ( TypeAdapter, ) -from exo.download.huggingface_utils import ( - filter_repo_objects, - get_allow_patterns, - get_auth_headers, - get_hf_endpoint, - get_hf_token, -) -from exo.shared.constants import EXO_MODELS_DIR, EXO_MODELS_PATH -from exo.shared.types.worker.downloads import ( +from exo_core.constants import EXO_MODELS_DIR, EXO_MODELS_PATH +from exo_core.types.common import ModelId +from exo_core.types.downloads import ( + ConfigData, DownloadProgressData, FileListEntry, ModelSafetensorsIndex, RepoDownloadProgress, RepoFileDownloadProgress, ) +from exo_core.types.shards import ShardMetadata +from exo_core.utils.huggingface import ( + filter_repo_objects, + get_allow_patterns, + get_auth_headers, + get_hf_endpoint, + get_hf_token, +) +from exo_core.utils.memory import Memory class HuggingFaceAuthenticationError(Exception): @@ -704,7 +705,9 @@ async def resolve_allow_patterns(shard: ShardMetadata) -> list[str]: return ["*"] -def is_image_model(shard: ShardMetadata) -> bool: +def _is_image_model(shard: ShardMetadata) -> bool: + from exo_core.model_cards import ModelTask + tasks = shard.model_card.tasks return ModelTask.TextToImage in tasks or ModelTask.ImageToImage in tasks @@ -762,7 +765,7 @@ async def download_shard( # For image models, skip root-level safetensors files since weights # are stored in component subdirectories (e.g., transformer/, vae/) - if is_image_model(shard): + if _is_image_model(shard): filtered_file_list = [ f for f in filtered_file_list @@ -881,3 +884,50 @@ async def download_shard( return target_dir / gguf.path, final_repo_progress else: return target_dir, final_repo_progress + + +async def fetch_config_data(model_id: ModelId) -> ConfigData: + """Downloads and parses config.json for a model.""" + + target_dir = (await ensure_models_dir()) / model_id.normalize() + await aios.makedirs(target_dir, exist_ok=True) + config_path = await download_file_with_retry( + model_id, + "main", + "config.json", + target_dir, + lambda curr_bytes, total_bytes, is_renamed: logger.debug( + f"Downloading config.json for {model_id}: {curr_bytes}/{total_bytes} ({is_renamed=})" + ), + ) + async with aiofiles.open(config_path, "r") as f: + return ConfigData.model_validate_json(await f.read()) + + +async def fetch_safetensors_size(model_id: ModelId) -> Memory: + """Gets model size from safetensors index or falls back to HF API.""" + target_dir = (await ensure_models_dir()) / model_id.normalize() + await aios.makedirs(target_dir, exist_ok=True) + try: + index_path = await download_file_with_retry( + model_id, + "main", + "model.safetensors.index.json", + target_dir, + lambda curr_bytes, total_bytes, is_renamed: logger.debug( + f"Downloading model.safetensors.index.json for {model_id}: {curr_bytes}/{total_bytes} ({is_renamed=})" + ), + ) + async with aiofiles.open(index_path, "r") as f: + index_data = ModelSafetensorsIndex.model_validate_json(await f.read()) + + metadata = index_data.metadata + if metadata is not None: + return Memory.from_bytes(metadata.total_size) + except FileNotFoundError: + pass + + info = model_info(model_id) + if info.safetensors is None: + raise ValueError(f"No safetensors info found for {model_id}") + return Memory.from_bytes(info.safetensors.total) diff --git a/src/exo/download/huggingface_utils.py b/python/exo_core/src/exo_core/utils/huggingface.py similarity index 99% rename from src/exo/download/huggingface_utils.py rename to python/exo_core/src/exo_core/utils/huggingface.py index 319b3985..dba57191 100644 --- a/src/exo/download/huggingface_utils.py +++ b/python/exo_core/src/exo_core/utils/huggingface.py @@ -5,9 +5,10 @@ from typing import Callable, Generator, Iterable import aiofiles import aiofiles.os as aios -from exo.shared.types.worker.shards import ShardMetadata from loguru import logger +from exo_core.types.shards import ShardMetadata + def filter_repo_objects[T]( items: Iterable[T], diff --git a/python/exo_core/src/exo_core/utils/memory.py b/python/exo_core/src/exo_core/utils/memory.py index 728c283a..46a747ac 100644 --- a/python/exo_core/src/exo_core/utils/memory.py +++ b/python/exo_core/src/exo_core/utils/memory.py @@ -1,7 +1,7 @@ from math import ceil from typing import Self, overload -from exo_core.pydantic import FrozenModel +from exo_core.models import FrozenModel class Memory(FrozenModel): diff --git a/src/exo/utils/dashboard_path.py b/python/exo_core/src/exo_core/utils/paths.py similarity index 100% rename from src/exo/utils/dashboard_path.py rename to python/exo_core/src/exo_core/utils/paths.py diff --git a/python/mlx_engine/pyproject.toml b/python/mlx_engine/pyproject.toml index e753dde2..9604c277 100644 --- a/python/mlx_engine/pyproject.toml +++ b/python/mlx_engine/pyproject.toml @@ -4,8 +4,11 @@ version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.13" -dependencies = [] +dependencies = ["exo_core"] [build-system] requires = ["uv_build>=0.8.9,<0.9.0"] build-backend = "uv_build" + +[tool.uv.sources] +exo_core = { workspace = true } diff --git a/python/py.typed b/python/mlx_engine/src/mlx_engine/__init__.py similarity index 100% rename from python/py.typed rename to python/mlx_engine/src/mlx_engine/__init__.py diff --git a/python/mlx_engine/uv.lock b/python/mlx_engine/uv.lock new file mode 100644 index 00000000..e384221f --- /dev/null +++ b/python/mlx_engine/uv.lock @@ -0,0 +1,123 @@ +version = 1 +revision = 3 +requires-python = ">=3.13" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "exo-core" +version = "0.1.0" +source = { directory = "../exo_core" } +dependencies = [ + { name = "pydantic" }, +] + +[package.metadata] +requires-dist = [{ name = "pydantic" }] + +[[package]] +name = "mlx-engine" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "exo-core" }, +] + +[package.metadata] +requires-dist = [{ name = "exo-core", directory = "../exo_core" }] + +[[package]] +name = "pydantic" +version = "2.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, + { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, + { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, + { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, + { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, + { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, + { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, + { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, + { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, + { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, + { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] diff --git a/python/parts.nix b/python/parts.nix index b5b4d2a3..2b2cfd9f 100644 --- a/python/parts.nix +++ b/python/parts.nix @@ -1,11 +1,11 @@ { inputs, ... }: { perSystem = - { config, self', pkgs, lib, system, ... }: + { self', pkgs, cudaPkgs, lib, ... }: let # Load workspace from uv.lock workspace = inputs.uv2nix.lib.workspace.loadWorkspace { - workspaceRoot = inputs.self; + workspaceRoot = ../.; }; # Create overlay from workspace @@ -35,16 +35,9 @@ inherit (pkgs.stdenv.hostPlatform) isDarwin isLinux; - python = pkgs.python313; - # Overlay to provide build systems and custom packages - buildSystemsOverlay = final: prev: + cudaOverlay = final: prev: let - addSetupTools = (old: { - nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ - final.setuptools - ]; - }); torchLibs = [ final.nvidia-cuda-runtime final.nvidia-cuda-nvrtc @@ -147,7 +140,7 @@ ''; }; - mergedCudaLibraries = with pkgs.cudaPackages_13; [ + mergedCudaLibraries = with cudaPkgs.cudaPackages_13; [ cuda_cudart # cuda_runtime.h, -lcudart cuda_cccl libcurand # curand_kernel.h @@ -159,25 +152,16 @@ libcublas ]; - cuda_cccl_compat = pkgs.runCommand "cuda-cccl-compat" {} '' - mkdir -p $out/include - ln -s ${pkgs.cudaPackages_13.cuda_cccl}/include $out/include/cccl - ''; + cuda_cccl_compat = pkgs.runCommand "cuda-cccl-compat" { } '' + mkdir -p $out/include + ln -s ${cudaPkgs.cudaPackages_13.cuda_cccl}/include $out/include/cccl + ''; cudaToolkitRoot = pkgs.symlinkJoin { - name = "cuda-merged-exo"; - paths = builtins.concatMap (p: [ (lib.getBin p) (lib.getLib p) (lib.getDev p) ]) (mergedCudaLibraries ++ [ pkgs.cudaPackages_13.cuda_nvcc cuda_cccl_compat ]); - }; - + name = "cuda-merged-exo"; + paths = builtins.concatMap (p: [ (lib.getBin p) (lib.getLib p) (lib.getDev p) ]) (mergedCudaLibraries ++ [ cudaPkgs.cudaPackages_13.cuda_nvcc cuda_cccl_compat ]); + }; in - { - # mlx-lm is a git dependency that needs setuptools - mlx-lm = prev.mlx-lm.overrideAttrs addSetupTools; - # rouge-score and sacrebleu don't declare setuptools as a build dependency - rouge-score = prev.rouge-score.overrideAttrs addSetupTools; - sacrebleu = prev.sacrebleu.overrideAttrs addSetupTools; - sqlitedict = prev.sqlitedict.overrideAttrs addSetupTools; - word2number = prev.word2number.overrideAttrs addSetupTools; fastsafetensors = prev.fastsafetensors.overrideAttrs (old: { nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ final.setuptools final.pybind11 ]; }); torch = prev.torch.overrideAttrs (old: { propagatedBuildInputs = (old.propagatedBuildInputs or [ ]) ++ torchLibs ++ [ final.typing-extensions final.numpy ]; @@ -203,16 +187,17 @@ ''; autoPatchelfIgnoreMissingDeps = (old.autoPatchelfIgnoreMissingDeps or [ ]) ++ [ "libcuda.so.1" ]; }); - xgrammar = prev.xgrammar.overrideAttrs (old: { nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ final.setuptools final.scikit-build-core final.packaging final.pathspec pkgs.cmake final.nanobind ]; + xgrammar = prev.xgrammar.overrideAttrs (old: { + nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ final.setuptools final.scikit-build-core final.packaging final.pathspec pkgs.cmake final.nanobind ]; - prePatch = '' -cat cpp/nanobind/CMakeLists.txt -''; - patches = (old.patches or [ ]) ++ [ ./nanobind_cmake.patch ]; -}); + prePatch = '' + cat cpp/nanobind/CMakeLists.txt + ''; + patches = (old.patches or [ ]) ++ [ ../nix/nanobind_cmake.patch ]; + }); vllm = prev.vllm.overrideAttrs (old: { - patches = (old.patches or [ ]) ++ [ ./vllm_uv2nix_cmake.patch ]; - nativeBuildInputs = with pkgs.cudaPackages_13; (old.nativeBuildInputs or [ ]) ++ [ + patches = (old.patches or [ ]) ++ [ ../nix/vllm_uv2nix_cmake.patch ]; + nativeBuildInputs = with cudaPkgs.cudaPackages_13; (old.nativeBuildInputs or [ ]) ++ [ final.setuptools final.setuptools-scm final.scikit-build-core @@ -224,7 +209,7 @@ cat cpp/nanobind/CMakeLists.txt pkgs.ninja pkgs.autoAddDriverRunpath ]; - buildInputs = with pkgs.cudaPackages_13; [ + buildInputs = with cudaPkgs.cudaPackages_13; [ libcufile cudnn nccl @@ -250,7 +235,7 @@ cat cpp/nanobind/CMakeLists.txt "-DVLLM_FLASH_ATTN_SRC_DIR=${lib.getDev vllm-flash-attn}" "-DQUTLASS_SRC_DIR=${lib.getDev qutlass}" "-DTORCH_CUDA_ARCH_LIST=12.0;12.1" - "-DCUTLASS_NVCC_ARCHS_ENABLED=${pkgs.cudaPackages_13.flags.cmakeCudaArchitecturesString}" + "-DCUTLASS_NVCC_ARCHS_ENABLED=${cudaPkgs.cudaPackages_13.flags.cmakeCudaArchitecturesString}" "-DCUDA_HOME=${cudaToolkitRoot}" "-DCAFFE2_USE_CUDNN=ON" "-DCAFFE2_USE_CUFILE=ON" @@ -258,6 +243,33 @@ cat cpp/nanobind/CMakeLists.txt ]; + }); + }; + + buildSystemsOverlay = final: prev: + let + addSetupTools = old: { + nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ + final.setuptools + ]; + }; + + in + { + # mlx-lm is a git dependency that needs setuptools + mlx-lm = prev.mlx-lm.overrideAttrs addSetupTools; + # rouge-score and sacrebleu don't declare setuptools as a build dependency + rouge-score = prev.rouge-score.overrideAttrs addSetupTools; + sacrebleu = prev.sacrebleu.overrideAttrs addSetupTools; + sqlitedict = prev.sqlitedict.overrideAttrs addSetupTools; + word2number = prev.word2number.overrideAttrs addSetupTools; + vllm = prev.vllm.overrideAttrs (old: { + nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ + final.setuptools + final.setuptools-scm + ]; + propagatedBuildInputs = (old.propagatedBuildInputs or [ ]) ++ [ final.torch ]; + VLLM_TARGET_DEVICE = "empty"; }); } // lib.optionalAttrs isDarwin { # Use our pure Nix-built MLX with Metal support (macOS only) @@ -295,6 +307,7 @@ cat cpp/nanobind/CMakeLists.txt ); + python = pkgs.python313; pythonSet = (pkgs.callPackage inputs.pyproject-nix.build.packages { inherit python; @@ -307,6 +320,31 @@ cat cpp/nanobind/CMakeLists.txt linuxOverlay ] ); + editablePythonSet = pythonSet.overrideScope ( + workspace.mkEditablePyprojectOverlay { root = "$REPO_ROOT"; members = [ "exo" "exo_core" "vllm_engine" "mlx_engine" "exo_bench" ]; } + ); + evenv = editablePythonSet.mkVirtualEnv "exo-dev-env" + { + exo = lib.optionals isDarwin [ "mlx" ]; + exo-pyo3-bindings = [ ]; + exo-bench = [ ]; + mlx-engine = [ ]; + vllm-engine = [ ]; + + } + ; + cudaPythonSet = (cudaPkgs.callPackage inputs.pyproject-nix.build.packages { + python = cudaPkgs.python313; + }).overrideScope ( + lib.composeManyExtensions [ + inputs.pyproject-build-systems.overlays.default + overlay + exoOverlay + buildSystemsOverlay + linuxOverlay + cudaOverlay + ] + ); # mlx-cpu and mlx-cuda-13 both ship mlx/ site-packages files; keep first. # mlx-cpu/mlx-cuda-13 and nvidia-cudnn-cu12/cu13 ship overlapping files. venvCollisionPaths = lib.optionals isLinux [ @@ -320,8 +358,8 @@ cat cpp/nanobind/CMakeLists.txt }).overrideAttrs { venvIgnoreCollisions = venvCollisionPaths; }; - exoCudaVenv = (pythonSet.mkVirtualEnv "exo-env" { - exo = [ "cuda" ]; + exoCudaVenv = (cudaPythonSet.mkVirtualEnv "exo-env" { + exo = lib.optionals cudaPkgs.config.cudaSupport [ "cuda" ]; exo-pyo3-bindings = [ ]; }).overrideAttrs { venvIgnoreCollisions = venvCollisionPaths; @@ -379,7 +417,7 @@ cat cpp/nanobind/CMakeLists.txt ${lib.optionalString isDarwin "--prefix PATH : ${pkgs.macmon}/bin"} ''; - exoCudaPackage = pkgs.runCommand "exo" + exoCudaPackage = cudaPkgs.runCommand "exo" { nativeBuildInputs = [ pkgs.makeWrapper ]; } @@ -406,6 +444,8 @@ cat cpp/nanobind/CMakeLists.txt exo-eval = mkBenchScript "exo-eval" (inputs.self + /bench/exo_eval.py); exo-eval-tool-calls = mkBenchScript "exo-eval-tool-calls" (inputs.self + /bench/eval_tool_calls.py); exo-get-all-models-on-cluster = mkSimplePythonScript "exo-get-all-models-on-cluster" (inputs.self + /tests/get_all_models_on_cluster.py); + editable-venv = evenv; + inherit python; }; checks = { diff --git a/python/vllm_engine/main.py b/python/vllm_engine/main.py deleted file mode 100644 index 86535116..00000000 --- a/python/vllm_engine/main.py +++ /dev/null @@ -1,6 +0,0 @@ -def main(): - print("Hello from vllm-runner!") - - -if __name__ == "__main__": - main() diff --git a/python/vllm_engine/pyproject.toml b/python/vllm_engine/pyproject.toml index 49fdfc9f..8d8813c4 100644 --- a/python/vllm_engine/pyproject.toml +++ b/python/vllm_engine/pyproject.toml @@ -6,16 +6,18 @@ readme = "README.md" requires-python = ">=3.13" dependencies = [ "torch>=2.10.0; sys_platform == 'linux'", - "vllm>=0.13.0; sys_platform == 'linux' and platform_machine == 'aarch64'", + "vllm>=0.13.0; sys_platform == 'linux'", "mlx-cuda-13==0.30.6; sys_platform == 'linux'", "fastsafetensors>=0.1.10; sys_platform == 'linux'", + "exo_core", ] [tool.uv] -environments = ["sys_platform == 'linux' and platform_machine == 'aarch64'"] +environments = ["sys_platform == 'linux'"] [tool.uv.sources] +exo_core = { workspace = true } vllm = { git = "https://github.com/hmellor/vllm.git", rev = "b99bedc737166ae5ca98cb9e3534b96e0c8c69aa" } torch = [ { index = "pytorch-cu130", marker = "platform_machine == 'aarch64'" }, @@ -35,3 +37,18 @@ explicit = true [build-system] requires = ["uv_build>=0.8.9,<0.9.0"] build-backend = "uv_build" + +[tool.basedpyright] +typeCheckingMode = "strict" +failOnWarnings = true + +reportAny = "error" +reportUnknownVariableType = "error" +reportUnknownParameterType = "error" +reportMissingParameterType = "error" +reportMissingTypeStubs = "error" +reportInvalidCast = "error" +reportUnnecessaryCast = "error" +reportUnnecessaryTypeIgnoreComment = "error" + +pythonVersion = "3.13" diff --git a/python/vllm_engine/src/vllm_engine/prompt_format.py b/python/vllm_engine/src/vllm_engine/prompt_format.py index d2092e43..63d5fdb1 100644 --- a/python/vllm_engine/src/vllm_engine/prompt_format.py +++ b/python/vllm_engine/src/vllm_engine/prompt_format.py @@ -1,5 +1,5 @@ -from exo.shared.types.common import ModelId -from exo.shared.types.text_generation import TextGenerationTaskParams +from exo_core.types.common import ModelId +from exo_core.types.text_generation import TextGenerationTaskParams from mlx_lm.tokenizer_utils import TokenizerWrapper from vllm.sampling_params import SamplingParams from vllm.v1.engine.llm_engine import LLMEngine diff --git a/python/vllm_engine/src/vllm_engine/vllm_generator.py b/python/vllm_engine/src/vllm_engine/vllm_generator.py index d6b9dd22..10f94de4 100644 --- a/python/vllm_engine/src/vllm_engine/vllm_generator.py +++ b/python/vllm_engine/src/vllm_engine/vllm_generator.py @@ -8,36 +8,36 @@ from collections.abc import Callable, Generator from dataclasses import dataclass, field import torch -from exo.shared.types.api import ( - CompletionTokensDetails, - GenerationStats, - PromptTokensDetails, - Usage, -) -from exo.shared.types.common import ModelId -from exo.shared.types.memory import Memory -from exo.shared.types.tasks import TaskId -from exo.shared.types.text_generation import TextGenerationTaskParams -from exo.shared.types.worker.runner_response import GenerationResponse -from exo.worker.engines.vllm.growable_cache import ( - get_model_runner, - patch_vllm, - set_prefix_cache, -) -from exo.worker.engines.vllm.kv_cache import TorchKVCache -from exo.worker.engines.vllm.prompt_format import ( - format_vllm_prompt, - make_vllm_sampling_params, -) +from exo_core.types.common import ModelId +from exo_core.types.runner_response import GenerationResponse +from exo_core.types.tasks import TaskId +from exo_core.types.text_generation import TextGenerationTaskParams +from exo_core.utils.memory import Memory from vllm.engine.arg_utils import EngineArgs from vllm.sampling_params import SamplingParams from vllm.v1.engine.llm_engine import LLMEngine from vllm.v1.kv_cache_interface import KVCacheConfig +from exo.api.types import ( + CompletionTokensDetails, + GenerationStats, + PromptTokensDetails, + Usage, +) from exo.worker.engines.mlx.cache import KVPrefixCache from exo.worker.engines.mlx.utils_mlx import get_eos_token_ids_for_model from exo.worker.runner.bootstrap import logger from exo.worker.runner.llm_inference.tool_parsers import ToolParser, infer_tool_parser +from vllm_engine.growable_cache import ( + get_model_runner, + patch_vllm, + set_prefix_cache, +) +from vllm_engine.kv_cache import TorchKVCache +from vllm_engine.prompt_format import ( + format_vllm_prompt, + make_vllm_sampling_params, +) def _build_layer_groups(kv_cache_config: KVCacheConfig) -> list[int]: diff --git a/src/exo/api/adapters/chat_completions.py b/src/exo/api/adapters/chat_completions.py index 2272cedc..3008356f 100644 --- a/src/exo/api/adapters/chat_completions.py +++ b/src/exo/api/adapters/chat_completions.py @@ -4,6 +4,19 @@ import time from collections.abc import AsyncGenerator from typing import Any +from exo_core.types.chunks import ( + ErrorChunk, + PrefillProgressChunk, + TokenChunk, + ToolCallChunk, +) +from exo_core.types.common import CommandId +from exo_core.types.text_generation import ( + InputMessage, + TextGenerationTaskParams, + resolve_reasoning_params, +) + from exo.api.types import ( ChatCompletionChoice, ChatCompletionMessage, @@ -19,18 +32,6 @@ from exo.api.types import ( ToolCall, Usage, ) -from exo.shared.types.chunks import ( - ErrorChunk, - PrefillProgressChunk, - TokenChunk, - ToolCallChunk, -) -from exo.shared.types.common import CommandId -from exo.shared.types.text_generation import ( - InputMessage, - TextGenerationTaskParams, - resolve_reasoning_params, -) def chat_request_to_text_generation( diff --git a/src/exo/api/adapters/claude.py b/src/exo/api/adapters/claude.py index 7ce94200..a755b6fc 100644 --- a/src/exo/api/adapters/claude.py +++ b/src/exo/api/adapters/claude.py @@ -5,6 +5,15 @@ import re from collections.abc import AsyncGenerator from typing import Any +from exo_core.types.chunks import ( + ErrorChunk, + PrefillProgressChunk, + TokenChunk, + ToolCallChunk, +) +from exo_core.types.common import CommandId +from exo_core.types.text_generation import InputMessage, TextGenerationTaskParams + from exo.api.types import FinishReason, Usage from exo.api.types.claude_api import ( ClaudeContentBlock, @@ -29,14 +38,6 @@ from exo.api.types.claude_api import ( ClaudeToolUseBlock, ClaudeUsage, ) -from exo.shared.types.chunks import ( - ErrorChunk, - PrefillProgressChunk, - TokenChunk, - ToolCallChunk, -) -from exo.shared.types.common import CommandId -from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams def finish_reason_to_claude_stop_reason( diff --git a/src/exo/api/adapters/ollama.py b/src/exo/api/adapters/ollama.py index eb39382e..f156b157 100644 --- a/src/exo/api/adapters/ollama.py +++ b/src/exo/api/adapters/ollama.py @@ -2,6 +2,15 @@ import json from collections.abc import AsyncGenerator from typing import Any +from exo_core.types.chunks import ( + ErrorChunk, + PrefillProgressChunk, + TokenChunk, + ToolCallChunk, +) +from exo_core.types.common import CommandId +from exo_core.types.text_generation import InputMessage, TextGenerationTaskParams + from exo.api.types.ollama_api import ( OllamaChatRequest, OllamaChatResponse, @@ -12,14 +21,6 @@ from exo.api.types.ollama_api import ( OllamaToolCall, OllamaToolFunction, ) -from exo.shared.types.chunks import ( - ErrorChunk, - PrefillProgressChunk, - TokenChunk, - ToolCallChunk, -) -from exo.shared.types.common import CommandId -from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams def _map_done_reason( diff --git a/src/exo/api/adapters/responses.py b/src/exo/api/adapters/responses.py index 014aeaf0..1bdb964c 100644 --- a/src/exo/api/adapters/responses.py +++ b/src/exo/api/adapters/responses.py @@ -4,6 +4,19 @@ from collections.abc import AsyncGenerator from itertools import count from typing import Any +from exo_core.types.chunks import ( + ErrorChunk, + PrefillProgressChunk, + TokenChunk, + ToolCallChunk, +) +from exo_core.types.common import CommandId +from exo_core.types.text_generation import ( + InputMessage, + TextGenerationTaskParams, + resolve_reasoning_params, +) + from exo.api.types import Usage from exo.api.types.openai_responses import ( FunctionCallInputItem, @@ -35,18 +48,6 @@ from exo.api.types.openai_responses import ( ResponseTextDoneEvent, ResponseUsage, ) -from exo.shared.types.chunks import ( - ErrorChunk, - PrefillProgressChunk, - TokenChunk, - ToolCallChunk, -) -from exo.shared.types.common import CommandId -from exo.shared.types.text_generation import ( - InputMessage, - TextGenerationTaskParams, - resolve_reasoning_params, -) def _format_sse(event: ResponsesStreamEvent) -> str: diff --git a/src/exo/api/main.py b/src/exo/api/main.py index 0b7f74f5..06fb7c0d 100644 --- a/src/exo/api/main.py +++ b/src/exo/api/main.py @@ -12,6 +12,34 @@ from uuid import uuid4 import anyio from anyio import BrokenResourceError +from exo_core.constants import ( + DASHBOARD_DIR, + EXO_CACHE_HOME, + EXO_EVENT_LOG_DIR, + EXO_IMAGE_CACHE_DIR, + EXO_MAX_CHUNK_SIZE, + EXO_TRACING_CACHE_DIR, +) +from exo_core.model_cards import ( + ModelCard, + ModelId, + delete_custom_card, + get_model_cards, + is_custom_card, +) +from exo_core.types.chunks import ( + ErrorChunk, + ImageChunk, + InputImageChunk, + PrefillProgressChunk, + TokenChunk, + ToolCallChunk, +) +from exo_core.types.common import CommandId, Id, NodeId, SystemId +from exo_core.types.downloads import DownloadCompleted +from exo_core.types.instances import Instance, InstanceId, InstanceMeta +from exo_core.types.shards import Sharding +from exo_core.utils.memory import Memory from fastapi import FastAPI, File, Form, HTTPException, Query, Request, UploadFile from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse, JSONResponse, StreamingResponse @@ -116,32 +144,9 @@ from exo.api.types.openai_responses import ( from exo.master.image_store import ImageStore from exo.master.placement import place_instance as get_instance_placements from exo.shared.apply import apply -from exo.shared.constants import ( - DASHBOARD_DIR, - EXO_CACHE_HOME, - EXO_EVENT_LOG_DIR, - EXO_IMAGE_CACHE_DIR, - EXO_MAX_CHUNK_SIZE, - EXO_TRACING_CACHE_DIR, -) from exo.shared.election import ElectionMessage from exo.shared.logging import InterceptLogger -from exo.shared.models.model_cards import ( - ModelCard, - ModelId, - delete_custom_card, - get_model_cards, - is_custom_card, -) from exo.shared.tracing import TraceEvent, compute_stats, export_trace, load_trace_file -from exo.shared.types.chunks import ( - ErrorChunk, - ImageChunk, - InputImageChunk, - PrefillProgressChunk, - TokenChunk, - ToolCallChunk, -) from exo.shared.types.commands import ( Command, CreateInstance, @@ -159,18 +164,13 @@ from exo.shared.types.commands import ( TaskFinished, TextGeneration, ) -from exo.shared.types.common import CommandId, Id, NodeId, SystemId from exo.shared.types.events import ( ChunkGenerated, Event, IndexedEvent, TracesMerged, ) -from exo.shared.types.memory import Memory from exo.shared.types.state import State -from exo.shared.types.worker.downloads import DownloadCompleted -from exo.shared.types.worker.instances import Instance, InstanceId, InstanceMeta -from exo.shared.types.worker.shards import Sharding from exo.utils.banner import print_startup_banner from exo.utils.channels import Receiver, Sender, channel from exo.utils.disk_event_log import DiskEventLog diff --git a/src/exo/api/tests/test_cancel_command.py b/src/exo/api/tests/test_cancel_command.py index 118b0fdf..6be6ef36 100644 --- a/src/exo/api/tests/test_cancel_command.py +++ b/src/exo/api/tests/test_cancel_command.py @@ -2,7 +2,7 @@ from typing import Any from unittest.mock import AsyncMock, MagicMock -from exo.shared.types.common import CommandId +from exo_core.types.common import CommandId from fastapi import FastAPI from fastapi.testclient import TestClient diff --git a/src/exo/api/tests/test_claude_api.py b/src/exo/api/tests/test_claude_api.py index da64c511..3e419670 100644 --- a/src/exo/api/tests/test_claude_api.py +++ b/src/exo/api/tests/test_claude_api.py @@ -2,7 +2,7 @@ import pydantic import pytest -from exo.shared.types.common import ModelId +from exo_core.types.common import ModelId from exo.api.adapters.claude import ( claude_request_to_text_generation, diff --git a/src/exo/api/tests/test_claude_tool_use.py b/src/exo/api/tests/test_claude_tool_use.py index cafd8df9..53a4631b 100644 --- a/src/exo/api/tests/test_claude_tool_use.py +++ b/src/exo/api/tests/test_claude_tool_use.py @@ -4,8 +4,8 @@ import json from collections.abc import AsyncGenerator from typing import Any, cast -from exo.shared.types.chunks import ErrorChunk, TokenChunk, ToolCallChunk -from exo.shared.types.common import CommandId, ModelId +from exo_core.types.chunks import ErrorChunk, TokenChunk, ToolCallChunk +from exo_core.types.common import CommandId, ModelId from exo.api.adapters.claude import ( ClaudeMessagesResponse, diff --git a/src/exo/api/tests/test_openai_responses_api.py b/src/exo/api/tests/test_openai_responses_api.py index 3271f705..dcd84b6e 100644 --- a/src/exo/api/tests/test_openai_responses_api.py +++ b/src/exo/api/tests/test_openai_responses_api.py @@ -6,7 +6,7 @@ The responses adapter converts it to TextGenerationTaskParams for the pipeline. import pydantic import pytest -from exo.shared.types.common import ModelId +from exo_core.types.common import ModelId from exo.api.types.openai_responses import ( ResponseInputMessage, diff --git a/src/exo/api/types/api.py b/src/exo/api/types/api.py index 828ee23b..458b7218 100644 --- a/src/exo/api/types/api.py +++ b/src/exo/api/types/api.py @@ -3,16 +3,15 @@ from collections.abc import Generator from typing import Annotated, Any, Literal, get_args from uuid import uuid4 +from exo_core.model_cards import ModelCard +from exo_core.models import CamelCaseModel +from exo_core.types.common import CommandId, ModelId, NodeId +from exo_core.types.instances import Instance, InstanceId, InstanceMeta +from exo_core.types.shards import Sharding, ShardMetadata +from exo_core.types.text_generation import ReasoningEffort +from exo_core.utils.memory import Memory from pydantic import BaseModel, Field, field_validator -from exo.shared.models.model_cards import ModelCard, ModelId -from exo.shared.types.common import CommandId, NodeId -from exo.shared.types.memory import Memory -from exo.shared.types.text_generation import ReasoningEffort -from exo.shared.types.worker.instances import Instance, InstanceId, InstanceMeta -from exo.shared.types.worker.shards import Sharding, ShardMetadata -from exo.utils.pydantic_ext import CamelCaseModel - FinishReason = Literal[ "stop", "length", "tool_calls", "content_filter", "function_call", "error" ] diff --git a/src/exo/api/types/claude_api.py b/src/exo/api/types/claude_api.py index 8eb18497..4fdb985d 100644 --- a/src/exo/api/types/claude_api.py +++ b/src/exo/api/types/claude_api.py @@ -2,10 +2,9 @@ from typing import Any, Literal +from exo_core.types.common import ModelId from pydantic import BaseModel, Field -from exo.shared.types.common import ModelId - # Tool definition types ClaudeToolInputSchema = dict[str, Any] diff --git a/src/exo/api/types/ollama_api.py b/src/exo/api/types/ollama_api.py index 12f22afe..d4a0c148 100644 --- a/src/exo/api/types/ollama_api.py +++ b/src/exo/api/types/ollama_api.py @@ -1,10 +1,9 @@ import time from typing import Any, Literal +from exo_core.model_cards import ModelId from pydantic import BaseModel, Field -from exo.shared.models.model_cards import ModelId - # https://github.com/ollama/ollama/blob/main/docs/api.md OllamaRole = Literal["system", "user", "assistant", "tool"] diff --git a/src/exo/api/types/openai_responses.py b/src/exo/api/types/openai_responses.py index eb21c4ae..a1d20eeb 100644 --- a/src/exo/api/types/openai_responses.py +++ b/src/exo/api/types/openai_responses.py @@ -3,17 +3,16 @@ These types model the OpenAI Responses API request/response format. ResponsesRequest is the API-level wire type; for the canonical internal task params type used by the inference pipeline, see -``exo.shared.types.text_generation.TextGenerationTaskParams``. +``exo_core.types.text_generation.TextGenerationTaskParams``. """ import time from typing import Any, Literal +from exo_core.types.common import ModelId +from exo_core.types.text_generation import ReasoningEffort from pydantic import BaseModel, Field -from exo.shared.types.common import ModelId -from exo.shared.types.text_generation import ReasoningEffort - # Type aliases ResponseStatus = Literal["completed", "failed", "in_progress", "incomplete"] ResponseRole = Literal["user", "assistant", "system", "developer"] diff --git a/src/exo/download/coordinator.py b/src/exo/download/coordinator.py index c0361fdf..568543bd 100644 --- a/src/exo/download/coordinator.py +++ b/src/exo/download/coordinator.py @@ -2,19 +2,26 @@ from dataclasses import dataclass, field import anyio from anyio import current_time -from exo.shared.models.model_cards import ModelId, get_model_cards -from exo.shared.types.common import NodeId -from exo.shared.types.worker.shards import PipelineShardMetadata, ShardMetadata -from loguru import logger - -from exo.download.download_utils import ( +from exo_core.constants import EXO_MODELS_DIR, EXO_MODELS_PATH +from exo_core.model_cards import ModelId, get_model_cards +from exo_core.types.common import NodeId +from exo_core.types.downloads import ( + DownloadCompleted, + DownloadFailed, + DownloadOngoing, + DownloadPending, + DownloadProgress, +) +from exo_core.types.shards import PipelineShardMetadata, ShardMetadata +from exo_core.utils.downloads import ( RepoDownloadProgress, delete_model, map_repo_download_progress_to_download_progress_data, resolve_model_in_path, ) +from loguru import logger + from exo.download.shard_downloader import ShardDownloader -from exo.shared.constants import EXO_MODELS_DIR, EXO_MODELS_PATH from exo.shared.types.commands import ( CancelDownload, DeleteDownload, @@ -25,13 +32,6 @@ from exo.shared.types.events import ( Event, NodeDownloadProgress, ) -from exo.shared.types.worker.downloads import ( - DownloadCompleted, - DownloadFailed, - DownloadOngoing, - DownloadPending, - DownloadProgress, -) from exo.utils.channels import Receiver, Sender from exo.utils.task_group import TaskGroup diff --git a/src/exo/download/impl_shard_downloader.py b/src/exo/download/impl_shard_downloader.py index f27b5308..53684a9e 100644 --- a/src/exo/download/impl_shard_downloader.py +++ b/src/exo/download/impl_shard_downloader.py @@ -4,14 +4,14 @@ from collections.abc import Awaitable from pathlib import Path from typing import AsyncIterator, Callable -from exo.shared.models.model_cards import ModelCard, ModelId, get_model_cards -from exo.shared.types.worker.shards import ( +from exo_core.model_cards import ModelCard, ModelId, get_model_cards +from exo_core.types.shards import ( PipelineShardMetadata, ShardMetadata, ) +from exo_core.utils.downloads import RepoDownloadProgress, download_shard from loguru import logger -from exo.download.download_utils import RepoDownloadProgress, download_shard from exo.download.shard_downloader import ShardDownloader diff --git a/src/exo/download/shard_downloader.py b/src/exo/download/shard_downloader.py index 9c5e2d9c..df6a635b 100644 --- a/src/exo/download/shard_downloader.py +++ b/src/exo/download/shard_downloader.py @@ -5,14 +5,13 @@ from datetime import timedelta from pathlib import Path from typing import AsyncIterator, Callable -from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask -from exo.shared.types.memory import Memory -from exo.shared.types.worker.shards import ( +from exo_core.model_cards import ModelCard, ModelId, ModelTask +from exo_core.types.shards import ( PipelineShardMetadata, ShardMetadata, ) - -from exo.download.download_utils import RepoDownloadProgress +from exo_core.utils.downloads import RepoDownloadProgress +from exo_core.utils.memory import Memory # TODO: the PipelineShardMetadata getting reinstantiated is a bit messy. Should this be a classmethod? diff --git a/src/exo/download/tests/test_download_verification.py b/src/exo/download/tests/test_download_verification.py index e3e92d32..81a856d3 100644 --- a/src/exo/download/tests/test_download_verification.py +++ b/src/exo/download/tests/test_download_verification.py @@ -9,15 +9,14 @@ from unittest.mock import AsyncMock, MagicMock, patch import aiofiles import aiofiles.os as aios import pytest -from exo.shared.types.common import ModelId -from exo.shared.types.memory import Memory -from pydantic import TypeAdapter - -from exo.download.download_utils import ( +from exo_core.types.common import ModelId +from exo_core.types.downloads import FileListEntry, RepoFileDownloadProgress +from exo_core.utils.downloads import ( delete_model, fetch_file_list_with_cache, ) -from exo.shared.types.worker.downloads import FileListEntry, RepoFileDownloadProgress +from exo_core.utils.memory import Memory +from pydantic import TypeAdapter @pytest.fixture @@ -30,7 +29,7 @@ async def temp_models_dir(tmp_path: Path) -> AsyncIterator[Path]: """Set up a temporary models directory for testing.""" models_dir = tmp_path / "models" await aios.makedirs(models_dir, exist_ok=True) - with patch("exo.download.download_utils.EXO_MODELS_DIR", models_dir): + with patch("exo_core.utils.downloads.EXO_MODELS_DIR", models_dir): yield models_dir @@ -42,7 +41,7 @@ class TestFileVerification: ) -> None: """Test that files with mismatched sizes are re-downloaded.""" # Import inside test to allow patching - from exo.download.download_utils import ( + from exo_core.utils.downloads import ( _download_file, # pyright: ignore[reportPrivateUsage] ) @@ -59,12 +58,12 @@ class TestFileVerification: with ( patch( - "exo.download.download_utils.file_meta", + "exo_core.utils.downloads.file_meta", new_callable=AsyncMock, return_value=(remote_size, remote_hash), ) as mock_file_meta, patch( - "exo.download.download_utils.create_http_session" + "exo_core.utils.downloads.create_http_session" ) as mock_session_factory, ): # Set up mock HTTP response for re-download @@ -90,7 +89,7 @@ class TestFileVerification: # Mock calc_hash to return the expected hash with patch( - "exo.download.download_utils.calc_hash", + "exo_core.utils.downloads.calc_hash", new_callable=AsyncMock, return_value=remote_hash, ): @@ -103,7 +102,7 @@ class TestFileVerification: self, model_id: ModelId, tmp_path: Path ) -> None: """Test that files with matching sizes are not re-downloaded.""" - from exo.download.download_utils import ( + from exo_core.utils.downloads import ( _download_file, # pyright: ignore[reportPrivateUsage] ) @@ -121,12 +120,12 @@ class TestFileVerification: with ( patch( - "exo.download.download_utils.file_meta", + "exo_core.utils.downloads.file_meta", new_callable=AsyncMock, return_value=(remote_size, remote_hash), ) as mock_file_meta, patch( - "exo.download.download_utils.create_http_session" + "exo_core.utils.downloads.create_http_session" ) as mock_session_factory, ): result = await _download_file( @@ -142,7 +141,7 @@ class TestFileVerification: self, model_id: ModelId, tmp_path: Path ) -> None: """Test that local files are used when network is unavailable.""" - from exo.download.download_utils import ( + from exo_core.utils.downloads import ( _download_file, # pyright: ignore[reportPrivateUsage] ) @@ -156,12 +155,12 @@ class TestFileVerification: with ( patch( - "exo.download.download_utils.file_meta", + "exo_core.utils.downloads.file_meta", new_callable=AsyncMock, side_effect=Exception("Network error"), ), patch( - "exo.download.download_utils.create_http_session" + "exo_core.utils.downloads.create_http_session" ) as mock_session_factory, ): result = await _download_file( @@ -188,9 +187,9 @@ class TestFileListCache: ] with ( - patch("exo.download.download_utils.EXO_MODELS_DIR", models_dir), + patch("exo_core.utils.downloads.EXO_MODELS_DIR", models_dir), patch( - "exo.download.download_utils.fetch_file_list_with_retry", + "exo_core.utils.downloads.fetch_file_list_with_retry", new_callable=AsyncMock, return_value=file_list, ) as mock_fetch, @@ -234,9 +233,9 @@ class TestFileListCache: ) with ( - patch("exo.download.download_utils.EXO_MODELS_DIR", models_dir), + patch("exo_core.utils.downloads.EXO_MODELS_DIR", models_dir), patch( - "exo.download.download_utils.fetch_file_list_with_retry", + "exo_core.utils.downloads.fetch_file_list_with_retry", new_callable=AsyncMock, side_effect=Exception("Network error"), ), @@ -252,9 +251,9 @@ class TestFileListCache: models_dir = tmp_path / "models" with ( - patch("exo.download.download_utils.EXO_MODELS_DIR", models_dir), + patch("exo_core.utils.downloads.EXO_MODELS_DIR", models_dir), patch( - "exo.download.download_utils.fetch_file_list_with_retry", + "exo_core.utils.downloads.fetch_file_list_with_retry", new_callable=AsyncMock, side_effect=Exception("Network error"), ), @@ -284,7 +283,7 @@ class TestModelDeletion: async with aiofiles.open(cache_dir / "file_list.json", "w") as f: await f.write("[]") - with patch("exo.download.download_utils.EXO_MODELS_DIR", models_dir): + with patch("exo_core.utils.downloads.EXO_MODELS_DIR", models_dir): result = await delete_model(model_id) assert result is True @@ -303,7 +302,7 @@ class TestModelDeletion: async with aiofiles.open(cache_dir / "file_list.json", "w") as f: await f.write("[]") - with patch("exo.download.download_utils.EXO_MODELS_DIR", models_dir): + with patch("exo_core.utils.downloads.EXO_MODELS_DIR", models_dir): result = await delete_model(model_id) # Returns False because model dir didn't exist @@ -318,7 +317,7 @@ class TestModelDeletion: models_dir = tmp_path / "models" await aios.makedirs(models_dir, exist_ok=True) - with patch("exo.download.download_utils.EXO_MODELS_DIR", models_dir): + with patch("exo_core.utils.downloads.EXO_MODELS_DIR", models_dir): result = await delete_model(model_id) assert result is False diff --git a/src/exo/download/tests/test_offline_mode.py b/src/exo/download/tests/test_offline_mode.py index ba1e63d5..3c21d048 100644 --- a/src/exo/download/tests/test_offline_mode.py +++ b/src/exo/download/tests/test_offline_mode.py @@ -7,14 +7,13 @@ from unittest.mock import AsyncMock, patch import aiofiles import aiofiles.os as aios import pytest -from exo.shared.types.common import ModelId - -from exo.download.download_utils import ( +from exo_core.types.common import ModelId +from exo_core.types.downloads import FileListEntry +from exo_core.utils.downloads import ( _download_file, # pyright: ignore[reportPrivateUsage] download_file_with_retry, fetch_file_list_with_cache, ) -from exo.shared.types.worker.downloads import FileListEntry @pytest.fixture @@ -26,7 +25,7 @@ def model_id() -> ModelId: async def temp_models_dir(tmp_path: Path) -> AsyncIterator[Path]: models_dir = tmp_path / "models" await aios.makedirs(models_dir, exist_ok=True) - with patch("exo.download.download_utils.EXO_MODELS_DIR", models_dir): + with patch("exo_core.utils.downloads.EXO_MODELS_DIR", models_dir): yield models_dir @@ -46,7 +45,7 @@ class TestDownloadFileOffline: await f.write(b"model weights data") with patch( - "exo.download.download_utils.file_meta", + "exo_core.utils.downloads.file_meta", new_callable=AsyncMock, ) as mock_file_meta: result = await _download_file( @@ -91,7 +90,7 @@ class TestDownloadFileOffline: await f.write(b"weights") with patch( - "exo.download.download_utils.file_meta", + "exo_core.utils.downloads.file_meta", new_callable=AsyncMock, ) as mock_file_meta: result = await _download_file( @@ -121,7 +120,7 @@ class TestDownloadFileWithRetryOffline: await f.write(b'{"model_type": "qwen2"}') with patch( - "exo.download.download_utils.file_meta", + "exo_core.utils.downloads.file_meta", new_callable=AsyncMock, ) as mock_file_meta: result = await download_file_with_retry( @@ -175,7 +174,7 @@ class TestFetchFileListOffline: ) with patch( - "exo.download.download_utils.fetch_file_list_with_retry", + "exo_core.utils.downloads.fetch_file_list_with_retry", new_callable=AsyncMock, ) as mock_fetch: result = await fetch_file_list_with_cache( @@ -209,7 +208,7 @@ class TestFetchFileListOffline: await f.write(b"x" * 500) with patch( - "exo.download.download_utils.fetch_file_list_with_retry", + "exo_core.utils.downloads.fetch_file_list_with_retry", new_callable=AsyncMock, ) as mock_fetch: result = await fetch_file_list_with_cache( diff --git a/src/exo/download/tests/test_re_download.py b/src/exo/download/tests/test_re_download.py index 56fa9343..a39b8ffd 100644 --- a/src/exo/download/tests/test_re_download.py +++ b/src/exo/download/tests/test_re_download.py @@ -8,13 +8,14 @@ from pathlib import Path from typing import Callable from unittest.mock import AsyncMock, patch -from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask -from exo.shared.types.common import NodeId, SystemId -from exo.shared.types.memory import Memory -from exo.shared.types.worker.shards import PipelineShardMetadata, ShardMetadata +from exo_core.model_cards import ModelCard, ModelId, ModelTask +from exo_core.types.common import NodeId, SystemId +from exo_core.types.downloads import DownloadCompleted +from exo_core.types.shards import PipelineShardMetadata, ShardMetadata +from exo_core.utils.downloads import RepoDownloadProgress +from exo_core.utils.memory import Memory from exo.download.coordinator import DownloadCoordinator -from exo.download.download_utils import RepoDownloadProgress from exo.download.impl_shard_downloader import SingletonShardDownloader from exo.download.shard_downloader import ShardDownloader from exo.shared.types.commands import ( @@ -23,7 +24,6 @@ from exo.shared.types.commands import ( StartDownload, ) from exo.shared.types.events import Event, NodeDownloadProgress -from exo.shared.types.worker.downloads import DownloadCompleted from exo.utils.channels import Receiver, Sender, channel NODE_ID = NodeId("aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa") diff --git a/src/exo/main.py b/src/exo/main.py index 3e08fa99..e91f31a2 100644 --- a/src/exo/main.py +++ b/src/exo/main.py @@ -7,6 +7,9 @@ from dataclasses import dataclass, field from typing import Self import anyio +from exo_core.constants import EXO_LOG +from exo_core.models import CamelCaseModel +from exo_core.types.common import NodeId, SessionId from loguru import logger from pydantic import PositiveInt @@ -17,12 +20,9 @@ from exo.download.impl_shard_downloader import exo_shard_downloader from exo.master.main import Master from exo.routing.event_router import EventRouter from exo.routing.router import Router, get_node_id_keypair -from exo.shared.constants import EXO_LOG from exo.shared.election import Election, ElectionResult from exo.shared.logging import logger_cleanup, logger_setup -from exo.shared.types.common import NodeId, SessionId from exo.utils.channels import Receiver, channel -from exo.utils.pydantic_ext import CamelCaseModel from exo.utils.task_group import TaskGroup from exo.worker.main import Worker diff --git a/src/exo/master/image_store.py b/src/exo/master/image_store.py index c9c3550c..17e8985c 100644 --- a/src/exo/master/image_store.py +++ b/src/exo/master/image_store.py @@ -1,10 +1,9 @@ import time from pathlib import Path +from exo_core.types.common import Id from pydantic import BaseModel -from exo.shared.types.common import Id - class StoredImage(BaseModel, frozen=True): image_id: Id diff --git a/src/exo/master/main.py b/src/exo/master/main.py index dc347741..7b7a1622 100644 --- a/src/exo/master/main.py +++ b/src/exo/master/main.py @@ -1,6 +1,22 @@ from datetime import datetime, timedelta, timezone import anyio +from exo_core.constants import EXO_EVENT_LOG_DIR, EXO_TRACING_ENABLED +from exo_core.types.common import CommandId, NodeId, SessionId, SystemId +from exo_core.types.instances import InstanceId +from exo_core.types.tasks import ( + ImageEdits as ImageEditsTask, +) +from exo_core.types.tasks import ( + ImageGeneration as ImageGenerationTask, +) +from exo_core.types.tasks import ( + TaskId, + TaskStatus, +) +from exo_core.types.tasks import ( + TextGeneration as TextGenerationTask, +) from loguru import logger from exo.master.placement import ( @@ -11,7 +27,6 @@ from exo.master.placement import ( place_instance, ) from exo.shared.apply import apply -from exo.shared.constants import EXO_EVENT_LOG_DIR, EXO_TRACING_ENABLED from exo.shared.types.commands import ( CreateInstance, DeleteInstance, @@ -27,7 +42,6 @@ from exo.shared.types.commands import ( TestCommand, TextGeneration, ) -from exo.shared.types.common import CommandId, NodeId, SessionId, SystemId from exo.shared.types.events import ( Event, GlobalForwarderEvent, @@ -45,20 +59,6 @@ from exo.shared.types.events import ( TracesMerged, ) from exo.shared.types.state import State -from exo.shared.types.tasks import ( - ImageEdits as ImageEditsTask, -) -from exo.shared.types.tasks import ( - ImageGeneration as ImageGenerationTask, -) -from exo.shared.types.tasks import ( - TaskId, - TaskStatus, -) -from exo.shared.types.tasks import ( - TextGeneration as TextGenerationTask, -) -from exo.shared.types.worker.instances import InstanceId from exo.utils.channels import Receiver, Sender from exo.utils.disk_event_log import DiskEventLog from exo.utils.event_buffer import MultiSourceBuffer diff --git a/src/exo/master/placement.py b/src/exo/master/placement.py index 9dca3f6f..c411f0fe 100644 --- a/src/exo/master/placement.py +++ b/src/exo/master/placement.py @@ -3,6 +3,24 @@ from collections.abc import Mapping from copy import deepcopy from typing import Sequence +from exo_core.model_cards import ModelId +from exo_core.types.common import NodeId +from exo_core.types.downloads import ( + DownloadOngoing, + DownloadProgress, +) +from exo_core.types.instances import ( + Instance, + InstanceId, + InstanceMeta, + MlxJacclInstance, + MlxRingInstance, + VllmInstance, +) +from exo_core.types.shards import Sharding +from exo_core.types.tasks import Task, TaskId, TaskStatus +from exo_core.utils.memory import Memory + from exo.master.placement_utils import ( Cycle, filter_cycles_by_memory, @@ -12,7 +30,6 @@ from exo.master.placement_utils import ( get_shard_assignments, get_smallest_cycles, ) -from exo.shared.models.model_cards import ModelId from exo.shared.topology import Topology from exo.shared.types.commands import ( CancelDownload, @@ -21,29 +38,13 @@ from exo.shared.types.commands import ( DownloadCommand, PlaceInstance, ) -from exo.shared.types.common import NodeId from exo.shared.types.events import ( Event, InstanceCreated, InstanceDeleted, TaskStatusUpdated, ) -from exo.shared.types.memory import Memory from exo.shared.types.profiling import MemoryUsage, NodeNetworkInfo -from exo.shared.types.tasks import Task, TaskId, TaskStatus -from exo.shared.types.worker.downloads import ( - DownloadOngoing, - DownloadProgress, -) -from exo.shared.types.worker.instances import ( - Instance, - InstanceId, - InstanceMeta, - MlxJacclInstance, - MlxRingInstance, - VllmInstance, -) -from exo.shared.types.worker.shards import Sharding def random_ephemeral_port() -> int: diff --git a/src/exo/master/placement_utils.py b/src/exo/master/placement_utils.py index eb78c8fa..b650e8f0 100644 --- a/src/exo/master/placement_utils.py +++ b/src/exo/master/placement_utils.py @@ -1,21 +1,21 @@ from collections.abc import Generator, Mapping -from loguru import logger - -from exo.shared.models.model_cards import ModelCard -from exo.shared.topology import Topology -from exo.shared.types.common import Host, NodeId -from exo.shared.types.memory import Memory -from exo.shared.types.profiling import MemoryUsage, NodeNetworkInfo -from exo.shared.types.topology import Cycle, RDMAConnection, SocketConnection -from exo.shared.types.worker.runners import RunnerId, ShardAssignments -from exo.shared.types.worker.shards import ( +from exo_core.model_cards import ModelCard +from exo_core.types.common import Host, NodeId +from exo_core.types.runners import RunnerId, ShardAssignments +from exo_core.types.shards import ( CfgShardMetadata, PipelineShardMetadata, Sharding, ShardMetadata, TensorShardMetadata, ) +from exo_core.utils.memory import Memory +from loguru import logger + +from exo.shared.topology import Topology +from exo.shared.types.profiling import MemoryUsage, NodeNetworkInfo +from exo.shared.types.topology import Cycle, RDMAConnection, SocketConnection def filter_cycles_by_memory( diff --git a/src/exo/master/tests/test_master.py b/src/exo/master/tests/test_master.py index de5a1f8e..602d4446 100644 --- a/src/exo/master/tests/test_master.py +++ b/src/exo/master/tests/test_master.py @@ -3,18 +3,18 @@ from typing import Sequence import anyio import pytest -from exo.shared.models.model_cards import ModelCard, ModelTask -from exo.shared.types.common import ModelId, NodeId, SessionId, SystemId -from exo.shared.types.memory import Memory -from exo.shared.types.tasks import TaskStatus -from exo.shared.types.tasks import TextGeneration as TextGenerationTask -from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams -from exo.shared.types.worker.instances import ( +from exo_core.model_cards import ModelCard, ModelTask +from exo_core.types.common import ModelId, NodeId, SessionId, SystemId +from exo_core.types.instances import ( InstanceMeta, MlxRingInstance, ShardAssignments, ) -from exo.shared.types.worker.shards import PipelineShardMetadata, Sharding +from exo_core.types.shards import PipelineShardMetadata, Sharding +from exo_core.types.tasks import TaskStatus +from exo_core.types.tasks import TextGeneration as TextGenerationTask +from exo_core.types.text_generation import InputMessage, TextGenerationTaskParams +from exo_core.utils.memory import Memory from loguru import logger from exo.master.main import Master diff --git a/src/exo/master/tests/test_placement.py b/src/exo/master/tests/test_placement.py index cdd7a6ab..ad510d17 100644 --- a/src/exo/master/tests/test_placement.py +++ b/src/exo/master/tests/test_placement.py @@ -1,18 +1,18 @@ import pytest -from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask -from exo.shared.types.common import CommandId, NodeId -from exo.shared.types.memory import Memory -from exo.shared.types.tasks import TaskId, TaskStatus, TextGeneration -from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams -from exo.shared.types.worker.instances import ( +from exo_core.model_cards import ModelCard, ModelId, ModelTask +from exo_core.types.common import CommandId, NodeId +from exo_core.types.instances import ( Instance, InstanceId, InstanceMeta, MlxJacclInstance, MlxRingInstance, ) -from exo.shared.types.worker.runners import ShardAssignments -from exo.shared.types.worker.shards import Sharding +from exo_core.types.runners import ShardAssignments +from exo_core.types.shards import Sharding +from exo_core.types.tasks import TaskId, TaskStatus, TextGeneration +from exo_core.types.text_generation import InputMessage, TextGenerationTaskParams +from exo_core.utils.memory import Memory from exo.master.placement import ( get_transition_events, diff --git a/src/exo/master/tests/test_placement_utils.py b/src/exo/master/tests/test_placement_utils.py index a3ed2ba0..31789e9c 100644 --- a/src/exo/master/tests/test_placement_utils.py +++ b/src/exo/master/tests/test_placement_utils.py @@ -1,12 +1,12 @@ import pytest -from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask -from exo.shared.types.common import NodeId -from exo.shared.types.memory import Memory -from exo.shared.types.worker.shards import ( +from exo_core.model_cards import ModelCard, ModelId, ModelTask +from exo_core.types.common import NodeId +from exo_core.types.shards import ( CfgShardMetadata, PipelineShardMetadata, Sharding, ) +from exo_core.utils.memory import Memory from exo.master.placement_utils import ( allocate_layers_proportionally, diff --git a/src/exo/master/tests/test_topology.py b/src/exo/master/tests/test_topology.py index ebc90249..5b5bac68 100644 --- a/src/exo/master/tests/test_topology.py +++ b/src/exo/master/tests/test_topology.py @@ -1,5 +1,5 @@ import pytest -from exo.shared.types.common import NodeId +from exo_core.types.common import NodeId from exo.shared.topology import Topology from exo.shared.types.multiaddr import Multiaddr diff --git a/src/exo/routing/connection_message.py b/src/exo/routing/connection_message.py index 3cc0362d..bca8a179 100644 --- a/src/exo/routing/connection_message.py +++ b/src/exo/routing/connection_message.py @@ -1,8 +1,7 @@ +from exo_core.models import CamelCaseModel +from exo_core.types.common import NodeId from exo_pyo3_bindings import PyFromSwarm -from exo.shared.types.common import NodeId -from exo.utils.pydantic_ext import CamelCaseModel - """Serialisable types for Connection Updates/Messages""" diff --git a/src/exo/routing/event_router.py b/src/exo/routing/event_router.py index 9fcda57b..40612d7f 100644 --- a/src/exo/routing/event_router.py +++ b/src/exo/routing/event_router.py @@ -4,10 +4,10 @@ from random import random import anyio from anyio import BrokenResourceError, ClosedResourceError from anyio.abc import CancelScope +from exo_core.types.common import SessionId, SystemId from loguru import logger from exo.shared.types.commands import ForwarderCommand, RequestEventLog -from exo.shared.types.common import SessionId, SystemId from exo.shared.types.events import ( Event, EventId, diff --git a/src/exo/routing/router.py b/src/exo/routing/router.py index 0d4f4190..98071e33 100644 --- a/src/exo/routing/router.py +++ b/src/exo/routing/router.py @@ -11,6 +11,8 @@ from anyio import ( move_on_after, sleep_forever, ) +from exo_core.constants import EXO_NODE_ID_KEYPAIR +from exo_core.models import CamelCaseModel from exo_pyo3_bindings import ( AllQueuesFullError, Keypair, @@ -22,9 +24,7 @@ from exo_pyo3_bindings import ( from filelock import FileLock from loguru import logger -from exo.shared.constants import EXO_NODE_ID_KEYPAIR from exo.utils.channels import Receiver, Sender, channel -from exo.utils.pydantic_ext import CamelCaseModel from exo.utils.task_group import TaskGroup from .connection_message import ConnectionMessage diff --git a/src/exo/routing/topics.py b/src/exo/routing/topics.py index 5d95a2a1..eaa9f807 100644 --- a/src/exo/routing/topics.py +++ b/src/exo/routing/topics.py @@ -1,6 +1,8 @@ from dataclasses import dataclass from enum import Enum +from exo_core.models import CamelCaseModel + from exo.routing.connection_message import ConnectionMessage from exo.shared.election import ElectionMessage from exo.shared.types.commands import ForwarderCommand, ForwarderDownloadCommand @@ -8,7 +10,6 @@ from exo.shared.types.events import ( GlobalForwarderEvent, LocalForwarderEvent, ) -from exo.utils.pydantic_ext import CamelCaseModel class PublishPolicy(str, Enum): diff --git a/src/exo/shared/apply.py b/src/exo/shared/apply.py index d1b5a342..29e78ac3 100644 --- a/src/exo/shared/apply.py +++ b/src/exo/shared/apply.py @@ -2,9 +2,13 @@ import copy from collections.abc import Mapping, Sequence from datetime import datetime +from exo_core.types.common import NodeId +from exo_core.types.downloads import DownloadProgress +from exo_core.types.instances import Instance, InstanceId +from exo_core.types.runners import RunnerId, RunnerShutdown, RunnerStatus +from exo_core.types.tasks import Task, TaskId, TaskStatus from loguru import logger -from exo.shared.types.common import NodeId from exo.shared.types.events import ( ChunkGenerated, Event, @@ -35,11 +39,7 @@ from exo.shared.types.profiling import ( ThunderboltBridgeStatus, ) from exo.shared.types.state import State -from exo.shared.types.tasks import Task, TaskId, TaskStatus from exo.shared.types.topology import Connection, RDMAConnection -from exo.shared.types.worker.downloads import DownloadProgress -from exo.shared.types.worker.instances import Instance, InstanceId -from exo.shared.types.worker.runners import RunnerId, RunnerShutdown, RunnerStatus from exo.utils.info_gatherer.info_gatherer import ( MacmonMetrics, MacThunderboltConnections, diff --git a/src/exo/shared/election.py b/src/exo/shared/election.py index 6f6e1f8f..2be700e1 100644 --- a/src/exo/shared/election.py +++ b/src/exo/shared/election.py @@ -6,13 +6,13 @@ from anyio import ( Event, get_cancelled_exc_class, ) +from exo_core.models import CamelCaseModel +from exo_core.types.common import NodeId, SessionId from loguru import logger from exo.routing.connection_message import ConnectionMessage from exo.shared.types.commands import ForwarderCommand -from exo.shared.types.common import NodeId, SessionId from exo.utils.channels import Receiver, Sender -from exo.utils.pydantic_ext import CamelCaseModel from exo.utils.task_group import TaskGroup DEFAULT_ELECTION_TIMEOUT = 3.0 diff --git a/src/exo/shared/tests/conftest.py b/src/exo/shared/tests/conftest.py index 0622cb0b..c534cea0 100644 --- a/src/exo/shared/tests/conftest.py +++ b/src/exo/shared/tests/conftest.py @@ -5,12 +5,11 @@ from typing import Generator import pytest from _pytest.logging import LogCaptureFixture +from exo_core.model_cards import ModelCard, ModelId, ModelTask +from exo_core.types.shards import PipelineShardMetadata, ShardMetadata +from exo_core.utils.memory import Memory from loguru import logger -from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask -from exo.shared.types.memory import Memory -from exo.shared.types.worker.shards import PipelineShardMetadata, ShardMetadata - @pytest.fixture(scope="session") def event_loop() -> Generator[asyncio.AbstractEventLoop, None, None]: diff --git a/src/exo/shared/tests/test_apply/test_apply_node_download.py b/src/exo/shared/tests/test_apply/test_apply_node_download.py index 1a527615..a1d053f0 100644 --- a/src/exo/shared/tests/test_apply/test_apply_node_download.py +++ b/src/exo/shared/tests/test_apply/test_apply_node_download.py @@ -1,11 +1,11 @@ -from exo.shared.types.common import NodeId -from exo.shared.types.memory import Memory +from exo_core.types.common import NodeId +from exo_core.types.downloads import DownloadCompleted +from exo_core.utils.memory import Memory from exo.shared.apply import apply_node_download_progress from exo.shared.tests.conftest import get_pipeline_shard_metadata from exo.shared.types.events import NodeDownloadProgress from exo.shared.types.state import State -from exo.shared.types.worker.downloads import DownloadCompleted from exo.worker.tests.constants import MODEL_A_ID, MODEL_B_ID diff --git a/src/exo/shared/tests/test_apply/test_apply_runner_deleted.py b/src/exo/shared/tests/test_apply/test_apply_runner_deleted.py index 68198890..c46b81d0 100644 --- a/src/exo/shared/tests/test_apply/test_apply_runner_deleted.py +++ b/src/exo/shared/tests/test_apply/test_apply_runner_deleted.py @@ -1,4 +1,4 @@ -from exo.shared.types.worker.runners import RunnerId, RunnerIdle, RunnerShutdown +from exo_core.types.runners import RunnerId, RunnerIdle, RunnerShutdown from exo.shared.apply import apply_runner_status_updated from exo.shared.types.events import RunnerStatusUpdated diff --git a/src/exo/shared/tests/test_election.py b/src/exo/shared/tests/test_election.py index 7ec66714..6c600066 100644 --- a/src/exo/shared/tests/test_election.py +++ b/src/exo/shared/tests/test_election.py @@ -1,10 +1,10 @@ import pytest from anyio import create_task_group, fail_after, move_on_after +from exo_core.types.common import NodeId, SessionId, SystemId from exo.routing.connection_message import ConnectionMessage from exo.shared.election import Election, ElectionMessage, ElectionResult from exo.shared.types.commands import ForwarderCommand, TestCommand -from exo.shared.types.common import NodeId, SessionId, SystemId from exo.utils.channels import channel # ======= # diff --git a/src/exo/shared/tests/test_node_id_persistence.py b/src/exo/shared/tests/test_node_id_persistence.py index ce9e56f5..350b8c19 100644 --- a/src/exo/shared/tests/test_node_id_persistence.py +++ b/src/exo/shared/tests/test_node_id_persistence.py @@ -7,11 +7,11 @@ from multiprocessing.queues import Queue as QueueT from multiprocessing.synchronize import Event as EventT from multiprocessing.synchronize import Semaphore as SemaphoreT +from exo_core.constants import EXO_NODE_ID_KEYPAIR from loguru import logger from pytest import LogCaptureFixture, mark from exo.routing.router import get_node_id_keypair -from exo.shared.constants import EXO_NODE_ID_KEYPAIR NUM_CONCURRENT_PROCS = 10 diff --git a/src/exo/shared/tests/test_resolve_reasoning_params.py b/src/exo/shared/tests/test_resolve_reasoning_params.py index 912469c2..c11a0bcd 100644 --- a/src/exo/shared/tests/test_resolve_reasoning_params.py +++ b/src/exo/shared/tests/test_resolve_reasoning_params.py @@ -1,6 +1,5 @@ import pytest - -from exo.shared.types.text_generation import resolve_reasoning_params +from exo_core.types.text_generation import resolve_reasoning_params def test_both_none_returns_none_none() -> None: diff --git a/src/exo/shared/tests/test_state_serialization.py b/src/exo/shared/tests/test_state_serialization.py index ec94156d..c9113f1b 100644 --- a/src/exo/shared/tests/test_state_serialization.py +++ b/src/exo/shared/tests/test_state_serialization.py @@ -1,4 +1,5 @@ -from exo.shared.types.common import NodeId +from exo_core.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, SocketConnection diff --git a/src/exo/shared/tests/test_xdg_paths.py b/src/exo/shared/tests/test_xdg_paths.py index 73f81d10..1dd9c1d4 100644 --- a/src/exo/shared/tests/test_xdg_paths.py +++ b/src/exo/shared/tests/test_xdg_paths.py @@ -23,7 +23,7 @@ def test_xdg_paths_on_linux(): # Re-import to pick up mocked values import importlib - import exo.shared.constants as constants + import exo_core.constants as constants importlib.reload(constants) @@ -46,7 +46,7 @@ def test_xdg_default_paths_on_linux(): ): import importlib - import exo.shared.constants as constants + import exo_core.constants as constants importlib.reload(constants) @@ -68,7 +68,7 @@ def test_legacy_exo_home_takes_precedence(): ): import importlib - import exo.shared.constants as constants + import exo_core.constants as constants importlib.reload(constants) @@ -87,7 +87,7 @@ def test_macos_uses_traditional_paths(): ): import importlib - import exo.shared.constants as constants + import exo_core.constants as constants importlib.reload(constants) @@ -99,7 +99,7 @@ def test_macos_uses_traditional_paths(): def test_node_id_in_config_dir(): """Test that node ID keypair is in the config directory.""" - import exo.shared.constants as constants + import exo_core.constants as constants assert constants.EXO_NODE_ID_KEYPAIR.parent == constants.EXO_CONFIG_HOME @@ -111,7 +111,7 @@ def test_models_in_data_dir(): with mock.patch.dict(os.environ, env, clear=True): import importlib - import exo.shared.constants as constants + import exo_core.constants as constants importlib.reload(constants) diff --git a/src/exo/shared/topology.py b/src/exo/shared/topology.py index 9d649a6f..7a6c4858 100644 --- a/src/exo/shared/topology.py +++ b/src/exo/shared/topology.py @@ -4,9 +4,9 @@ from dataclasses import dataclass, field from typing import Iterable import rustworkx as rx +from exo_core.types.common import NodeId from pydantic import BaseModel, ConfigDict -from exo.shared.types.common import NodeId from exo.shared.types.profiling import ( InterfaceType, NodeNetworkInfo, diff --git a/src/exo/shared/tracing.py b/src/exo/shared/tracing.py index e09834b9..7f894a5c 100644 --- a/src/exo/shared/tracing.py +++ b/src/exo/shared/tracing.py @@ -8,7 +8,8 @@ from dataclasses import dataclass, field from pathlib import Path from typing import cast, final -from exo.shared.constants import EXO_TRACING_ENABLED +from exo_core.constants import EXO_TRACING_ENABLED + from exo.worker.runner.bootstrap import logger # Context variable to track the current trace category for hierarchical nesting diff --git a/src/exo/shared/types/commands.py b/src/exo/shared/types/commands.py index fb55632e..6e44ea93 100644 --- a/src/exo/shared/types/commands.py +++ b/src/exo/shared/types/commands.py @@ -1,16 +1,16 @@ +from exo_core.model_cards import ModelCard +from exo_core.models import CamelCaseModel, TaggedModel +from exo_core.types.chunks import InputImageChunk +from exo_core.types.common import CommandId, ModelId, NodeId, SystemId +from exo_core.types.instances import Instance, InstanceId, InstanceMeta +from exo_core.types.shards import Sharding, ShardMetadata +from exo_core.types.text_generation import TextGenerationTaskParams from pydantic import Field from exo.api.types import ( ImageEditsTaskParams, ImageGenerationTaskParams, ) -from exo.shared.models.model_cards import ModelCard, ModelId -from exo.shared.types.chunks import InputImageChunk -from exo.shared.types.common import CommandId, NodeId, SystemId -from exo.shared.types.text_generation import TextGenerationTaskParams -from exo.shared.types.worker.instances import Instance, InstanceId, InstanceMeta -from exo.shared.types.worker.shards import Sharding, ShardMetadata -from exo.utils.pydantic_ext import CamelCaseModel, TaggedModel class BaseCommand(TaggedModel): diff --git a/src/exo/shared/types/events.py b/src/exo/shared/types/events.py index c9c2fc3a..b361410d 100644 --- a/src/exo/shared/types/events.py +++ b/src/exo/shared/types/events.py @@ -1,17 +1,17 @@ from datetime import datetime from typing import final +from exo_core.models import CamelCaseModel, FrozenModel, TaggedModel +from exo_core.types.chunks import GenerationChunk, InputImageChunk +from exo_core.types.common import CommandId, Id, NodeId, SessionId, SystemId +from exo_core.types.downloads import DownloadProgress +from exo_core.types.instances import Instance, InstanceId +from exo_core.types.runners import RunnerId, RunnerStatus +from exo_core.types.tasks import Task, TaskId, TaskStatus from pydantic import Field from exo.shared.topology import Connection -from exo.shared.types.chunks import GenerationChunk, InputImageChunk -from exo.shared.types.common import CommandId, Id, NodeId, SessionId, SystemId -from exo.shared.types.tasks import Task, TaskId, TaskStatus -from exo.shared.types.worker.downloads import DownloadProgress -from exo.shared.types.worker.instances import Instance, InstanceId -from exo.shared.types.worker.runners import RunnerId, RunnerStatus from exo.utils.info_gatherer.info_gatherer import GatheredInfo -from exo.utils.pydantic_ext import CamelCaseModel, FrozenModel, TaggedModel class EventId(Id): diff --git a/src/exo/shared/types/profiling.py b/src/exo/shared/types/profiling.py index ebd58804..76f69cda 100644 --- a/src/exo/shared/types/profiling.py +++ b/src/exo/shared/types/profiling.py @@ -4,10 +4,10 @@ from pathlib import Path from typing import Literal, Self import psutil +from exo_core.models import CamelCaseModel +from exo_core.utils.memory import Memory -from exo.shared.types.memory import Memory from exo.shared.types.thunderbolt import ThunderboltIdentifier -from exo.utils.pydantic_ext import CamelCaseModel class MemoryUsage(CamelCaseModel): diff --git a/src/exo/shared/types/state.py b/src/exo/shared/types/state.py index 88482263..5ff2568e 100644 --- a/src/exo/shared/types/state.py +++ b/src/exo/shared/types/state.py @@ -2,11 +2,16 @@ from collections.abc import Mapping, Sequence from datetime import datetime from typing import Any, cast +from exo_core.models import CamelCaseModel +from exo_core.types.common import NodeId +from exo_core.types.downloads import DownloadProgress +from exo_core.types.instances import Instance, InstanceId +from exo_core.types.runners import RunnerId, RunnerStatus +from exo_core.types.tasks import Task, TaskId from pydantic import ConfigDict, Field, field_serializer, field_validator from pydantic.alias_generators import to_camel from exo.shared.topology import Topology, TopologySnapshot -from exo.shared.types.common import NodeId from exo.shared.types.profiling import ( DiskUsage, MemoryUsage, @@ -17,11 +22,6 @@ from exo.shared.types.profiling import ( SystemPerformanceProfile, ThunderboltBridgeStatus, ) -from exo.shared.types.tasks import Task, TaskId -from exo.shared.types.worker.downloads import DownloadProgress -from exo.shared.types.worker.instances import Instance, InstanceId -from exo.shared.types.worker.runners import RunnerId, RunnerStatus -from exo.utils.pydantic_ext import CamelCaseModel class State(CamelCaseModel): diff --git a/src/exo/shared/types/thunderbolt.py b/src/exo/shared/types/thunderbolt.py index 809cf9fa..8d4a13ed 100644 --- a/src/exo/shared/types/thunderbolt.py +++ b/src/exo/shared/types/thunderbolt.py @@ -1,8 +1,7 @@ import anyio +from exo_core.models import CamelCaseModel from pydantic import BaseModel, Field -from exo.utils.pydantic_ext import CamelCaseModel - class ThunderboltConnection(CamelCaseModel): source_uuid: str diff --git a/src/exo/shared/types/topology.py b/src/exo/shared/types/topology.py index c388c6ab..2a4bc828 100644 --- a/src/exo/shared/types/topology.py +++ b/src/exo/shared/types/topology.py @@ -1,9 +1,10 @@ from collections.abc import Iterator from dataclasses import dataclass -from exo.shared.types.common import NodeId +from exo_core.models import FrozenModel +from exo_core.types.common import NodeId + from exo.shared.types.multiaddr import Multiaddr -from exo.utils.pydantic_ext import FrozenModel @dataclass(frozen=True) diff --git a/src/exo/shared/types/worker/downloads.py b/src/exo/shared/types/worker/downloads.py deleted file mode 100644 index 4165fb40..00000000 --- a/src/exo/shared/types/worker/downloads.py +++ /dev/null @@ -1,98 +0,0 @@ -from datetime import timedelta -from typing import Literal - -from exo.shared.types.common import NodeId -from exo.shared.types.memory import Memory -from exo.shared.types.worker.shards import ShardMetadata -from exo.utils.pydantic_ext import CamelCaseModel, TaggedModel -from pydantic import BaseModel, ConfigDict, Field, PositiveInt - - -class DownloadProgressData(CamelCaseModel): - total: Memory - downloaded: Memory - downloaded_this_session: Memory - - completed_files: int - total_files: int - - speed: float - eta_ms: int - - files: dict[str, "DownloadProgressData"] - - -class BaseDownloadProgress(TaggedModel): - node_id: NodeId - shard_metadata: ShardMetadata - model_directory: str = "" - - -class DownloadPending(BaseDownloadProgress): - downloaded: Memory = Memory() - total: Memory = Memory() - - -class DownloadCompleted(BaseDownloadProgress): - total: Memory - read_only: bool = False - - -class DownloadFailed(BaseDownloadProgress): - error_message: str - - -class DownloadOngoing(BaseDownloadProgress): - download_progress: DownloadProgressData - - -DownloadProgress = ( - DownloadPending | DownloadCompleted | DownloadFailed | DownloadOngoing -) - - -class ModelSafetensorsIndexMetadata(BaseModel): - total_size: PositiveInt - - -class ModelSafetensorsIndex(BaseModel): - metadata: ModelSafetensorsIndexMetadata | None - weight_map: dict[str, str] - - -class FileListEntry(BaseModel): - type: Literal["file", "directory"] - path: str - size: int | None = None - - -class RepoFileDownloadProgress(BaseModel): - repo_id: str - repo_revision: str - file_path: str - downloaded: Memory - downloaded_this_session: Memory - total: Memory - speed: float - eta: timedelta - status: Literal["not_started", "in_progress", "complete"] - start_time: float - - model_config = ConfigDict(frozen=True) - - -class RepoDownloadProgress(BaseModel): - repo_id: str - repo_revision: str - shard: ShardMetadata - completed_files: int - total_files: int - downloaded: Memory - downloaded_this_session: Memory - total: Memory - overall_speed: float - overall_eta: timedelta - status: Literal["not_started", "in_progress", "complete"] - file_progress: dict[str, RepoFileDownloadProgress] = Field(default_factory=dict) - - model_config = ConfigDict(frozen=True) diff --git a/src/exo/utils/banner.py b/src/exo/utils/banner.py index 2742832e..208f65a5 100644 --- a/src/exo/utils/banner.py +++ b/src/exo/utils/banner.py @@ -3,7 +3,7 @@ import os import sys import webbrowser -from exo.shared.constants import EXO_CONFIG_HOME +from exo_core.constants import EXO_CONFIG_HOME logger = logging.getLogger(__name__) diff --git a/src/exo/utils/info_gatherer/info_gatherer.py b/src/exo/utils/info_gatherer/info_gatherer.py index bc94d67d..40db497b 100644 --- a/src/exo/utils/info_gatherer/info_gatherer.py +++ b/src/exo/utils/info_gatherer/info_gatherer.py @@ -11,11 +11,12 @@ import anyio from anyio import fail_after, open_process, to_thread from anyio.streams.buffered import BufferedByteReceiveStream from anyio.streams.text import TextReceiveStream +from exo_core.constants import EXO_CONFIG_FILE, EXO_MODELS_DIR +from exo_core.models import TaggedModel +from exo_core.utils.memory import Memory from loguru import logger from pydantic import ValidationError -from exo.shared.constants import EXO_CONFIG_FILE, EXO_MODELS_DIR -from exo.shared.types.memory import Memory from exo.shared.types.profiling import ( DiskUsage, MemoryUsage, @@ -28,7 +29,6 @@ from exo.shared.types.thunderbolt import ( ThunderboltIdentifier, ) from exo.utils.channels import Sender -from exo.utils.pydantic_ext import TaggedModel from exo.utils.task_group import TaskGroup from .macmon import MacmonMetrics diff --git a/src/exo/utils/info_gatherer/macmon.py b/src/exo/utils/info_gatherer/macmon.py index 4fe714e2..200bb50b 100644 --- a/src/exo/utils/info_gatherer/macmon.py +++ b/src/exo/utils/info_gatherer/macmon.py @@ -1,9 +1,9 @@ from typing import Self +from exo_core.models import TaggedModel from pydantic import BaseModel from exo.shared.types.profiling import MemoryUsage, SystemPerformanceProfile -from exo.utils.pydantic_ext import TaggedModel class _TempMetrics(BaseModel, extra="ignore"): diff --git a/src/exo/utils/info_gatherer/net_profile.py b/src/exo/utils/info_gatherer/net_profile.py index 3255b207..0e3b70eb 100644 --- a/src/exo/utils/info_gatherer/net_profile.py +++ b/src/exo/utils/info_gatherer/net_profile.py @@ -4,10 +4,10 @@ from collections.abc import AsyncGenerator, Mapping import anyio import httpx from anyio import create_task_group +from exo_core.types.common import NodeId from loguru import logger from exo.shared.topology import Topology -from exo.shared.types.common import NodeId from exo.shared.types.profiling import NodeNetworkInfo from exo.utils.channels import Sender, channel diff --git a/src/exo/utils/info_gatherer/nvml.py b/src/exo/utils/info_gatherer/nvml.py index 0af27c95..bab05df6 100644 --- a/src/exo/utils/info_gatherer/nvml.py +++ b/src/exo/utils/info_gatherer/nvml.py @@ -1,6 +1,7 @@ # pyright: reportMissingImports=false +from exo_core.models import TaggedModel + from exo.shared.types.profiling import SystemPerformanceProfile -from exo.utils.pydantic_ext import TaggedModel try: from pynvml import ( diff --git a/src/exo/utils/power_sampler.py b/src/exo/utils/power_sampler.py index b8e985a1..e5be76b9 100644 --- a/src/exo/utils/power_sampler.py +++ b/src/exo/utils/power_sampler.py @@ -4,9 +4,9 @@ from collections.abc import Callable, Mapping from typing import final import anyio +from exo_core.types.common import NodeId from exo.api.types import NodePowerStats, PowerUsage -from exo.shared.types.common import NodeId from exo.shared.types.profiling import SystemPerformanceProfile diff --git a/src/exo/utils/tests/test_power_sampler.py b/src/exo/utils/tests/test_power_sampler.py index 6ea6d54e..b6bc320f 100644 --- a/src/exo/utils/tests/test_power_sampler.py +++ b/src/exo/utils/tests/test_power_sampler.py @@ -2,7 +2,7 @@ from collections.abc import Mapping import anyio import pytest -from exo.shared.types.common import NodeId +from exo_core.types.common import NodeId from exo.api.types import PowerUsage from exo.shared.types.profiling import SystemPerformanceProfile diff --git a/src/exo/utils/tests/test_tagged.py b/src/exo/utils/tests/test_tagged.py index bebec4b4..430611f0 100644 --- a/src/exo/utils/tests/test_tagged.py +++ b/src/exo/utils/tests/test_tagged.py @@ -1,6 +1,6 @@ import anyio import pytest -from exo.utils.pydantic_ext import TaggedModel +from exo_core.models import TaggedModel from pydantic import BaseModel, TypeAdapter, ValidationError diff --git a/src/exo/worker/engines/image/distributed_model.py b/src/exo/worker/engines/image/distributed_model.py index 40a4fd38..4e9188b7 100644 --- a/src/exo/worker/engines/image/distributed_model.py +++ b/src/exo/worker/engines/image/distributed_model.py @@ -3,13 +3,13 @@ from pathlib import Path from typing import Any, Literal, Optional import mlx.core as mx +from exo_core.types.instances import BoundInstance +from exo_core.types.shards import CfgShardMetadata, PipelineShardMetadata +from exo_core.utils.downloads import build_model_path from mflux.models.common.config.config import Config from PIL import Image from exo.api.types import AdvancedImageParams -from exo.download.download_utils import build_model_path -from exo.shared.types.worker.instances import BoundInstance -from exo.shared.types.worker.shards import CfgShardMetadata, PipelineShardMetadata from exo.worker.engines.image.config import ImageModelConfig from exo.worker.engines.image.models import ( create_adapter_for_model, diff --git a/src/exo/worker/engines/image/generate.py b/src/exo/worker/engines/image/generate.py index 15523e51..2c41878f 100644 --- a/src/exo/worker/engines/image/generate.py +++ b/src/exo/worker/engines/image/generate.py @@ -7,6 +7,11 @@ from pathlib import Path from typing import Generator, Literal import mlx.core as mx +from exo_core.types.runner_response import ( + ImageGenerationResponse, + PartialImageResponse, +) +from exo_core.utils.memory import Memory from PIL import Image from exo.api.types import ( @@ -16,11 +21,6 @@ from exo.api.types import ( ImageGenerationTaskParams, ImageSize, ) -from exo.shared.types.memory import Memory -from exo.shared.types.worker.runner_response import ( - ImageGenerationResponse, - PartialImageResponse, -) from exo.worker.engines.image.distributed_model import DistributedImageModel diff --git a/src/exo/worker/engines/image/pipeline/runner.py b/src/exo/worker/engines/image/pipeline/runner.py index 01ad7b05..dea73c0c 100644 --- a/src/exo/worker/engines/image/pipeline/runner.py +++ b/src/exo/worker/engines/image/pipeline/runner.py @@ -4,16 +4,16 @@ from math import ceil from typing import Any, Optional, final import mlx.core as mx +from exo_core.constants import EXO_TRACING_ENABLED +from exo_core.types.shards import CfgShardMetadata, PipelineShardMetadata from mflux.models.common.config.config import Config from mflux.utils.exceptions import StopImageGenerationException from tqdm import tqdm -from exo.shared.constants import EXO_TRACING_ENABLED from exo.shared.tracing import ( clear_trace_buffer, trace, ) -from exo.shared.types.worker.shards import CfgShardMetadata, PipelineShardMetadata from exo.worker.engines.image.config import ImageModelConfig from exo.worker.engines.image.models.base import ( ModelAdapter, diff --git a/src/exo/worker/engines/mlx/auto_parallel.py b/src/exo/worker/engines/mlx/auto_parallel.py index 031fa4a1..24c47016 100644 --- a/src/exo/worker/engines/mlx/auto_parallel.py +++ b/src/exo/worker/engines/mlx/auto_parallel.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING, Any, Literal, Protocol, cast import mlx.core as mx import mlx.nn as nn +from exo_core.types.shards import PipelineShardMetadata from mlx.nn.layers.distributed import ( shard_inplace, shard_linear, @@ -58,7 +59,6 @@ from mlx_lm.models.step3p5 import Step3p5MLP as Step35MLP from mlx_lm.models.step3p5 import Step3p5Model as Step35InnerModel from exo.shared.logging import logger -from exo.shared.types.worker.shards import PipelineShardMetadata if TYPE_CHECKING: from mlx_lm.models.cache import Cache diff --git a/src/exo/worker/engines/mlx/cache.py b/src/exo/worker/engines/mlx/cache.py index b04a244e..beefcd42 100644 --- a/src/exo/worker/engines/mlx/cache.py +++ b/src/exo/worker/engines/mlx/cache.py @@ -4,6 +4,7 @@ from typing import TYPE_CHECKING, cast import mlx.core as mx import psutil +from exo_core.utils.memory import Memory from mlx_lm.models.cache import ( ArraysCache, CacheList, @@ -13,7 +14,6 @@ from mlx_lm.models.cache import ( ) from mlx_lm.tokenizer_utils import TokenizerWrapper -from exo.shared.types.memory import Memory from exo.shared.types.mlx import KVCacheType, MLXCacheType, Model from exo.worker.engines.mlx.constants import CACHE_GROUP_SIZE, KV_CACHE_BITS from exo.worker.runner.bootstrap import logger diff --git a/src/exo/worker/engines/mlx/generator/batch_generate.py b/src/exo/worker/engines/mlx/generator/batch_generate.py index 247e0698..c9eb87bc 100644 --- a/src/exo/worker/engines/mlx/generator/batch_generate.py +++ b/src/exo/worker/engines/mlx/generator/batch_generate.py @@ -3,6 +3,11 @@ from dataclasses import dataclass, field from typing import Callable, cast import mlx.core as mx +from exo_core.types.common import ModelId +from exo_core.types.runner_response import GenerationResponse +from exo_core.types.tasks import TaskId +from exo_core.types.text_generation import TextGenerationTaskParams +from exo_core.utils.memory import Memory from mlx_lm.generate import ( BatchGenerator as MlxBatchGenerator, ) @@ -18,12 +23,7 @@ from exo.api.types import ( TopLogprobItem, Usage, ) -from exo.shared.types.common import ModelId -from exo.shared.types.memory import Memory from exo.shared.types.mlx import MLXCacheType, Model -from exo.shared.types.tasks import TaskId -from exo.shared.types.text_generation import TextGenerationTaskParams -from exo.shared.types.worker.runner_response import GenerationResponse from exo.worker.engines.mlx.cache import ( CacheSnapshot, KVPrefixCache, diff --git a/src/exo/worker/engines/mlx/generator/generate.py b/src/exo/worker/engines/mlx/generator/generate.py index fa4232b5..9cdf5f2a 100644 --- a/src/exo/worker/engines/mlx/generator/generate.py +++ b/src/exo/worker/engines/mlx/generator/generate.py @@ -5,6 +5,12 @@ from copy import deepcopy from typing import Callable, Generator, cast, get_args import mlx.core as mx +from exo_core.types.common import ModelId +from exo_core.types.runner_response import ( + GenerationResponse, +) +from exo_core.types.text_generation import InputMessage, TextGenerationTaskParams +from exo_core.utils.memory import Memory from mlx_lm.generate import ( maybe_quantize_kv_cache, stream_generate, @@ -21,13 +27,7 @@ from exo.api.types import ( TopLogprobItem, Usage, ) -from exo.shared.types.common import ModelId -from exo.shared.types.memory import Memory from exo.shared.types.mlx import MLXCacheType, Model -from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams -from exo.shared.types.worker.runner_response import ( - GenerationResponse, -) from exo.worker.engines.mlx.auto_parallel import ( PipelineFirstLayer, PipelineLastLayer, diff --git a/src/exo/worker/engines/mlx/utils_mlx.py b/src/exo/worker/engines/mlx/utils_mlx.py index 516c073c..8eca88b7 100644 --- a/src/exo/worker/engines/mlx/utils_mlx.py +++ b/src/exo/worker/engines/mlx/utils_mlx.py @@ -19,11 +19,11 @@ try: except ImportError: pass # transformers < 5.0 or bytes_to_unicode not available +from exo_core.model_cards import ModelId from mlx_lm.models.cache import KVCache from mlx_lm.models.deepseek_v3 import DeepseekV3Model from mlx_lm.tokenizer_utils import TokenizerWrapper -from exo.shared.models.model_cards import ModelId from exo.worker.engines.mlx.constants import TRUST_REMOTE_CODE try: @@ -34,26 +34,26 @@ import contextlib import mlx.core as mx import mlx.nn as nn -from mlx_lm.utils import load_model -from pydantic import RootModel - -from exo.download.download_utils import build_model_path -from exo.shared.types.common import Host -from exo.shared.types.memory import Memory -from exo.shared.types.mlx import Model -from exo.shared.types.tasks import TaskId, TextGeneration -from exo.shared.types.text_generation import TextGenerationTaskParams -from exo.shared.types.worker.instances import ( +from exo_core.types.common import Host +from exo_core.types.instances import ( BoundInstance, MlxJacclInstance, MlxRingInstance, ) -from exo.shared.types.worker.shards import ( +from exo_core.types.shards import ( CfgShardMetadata, PipelineShardMetadata, ShardMetadata, TensorShardMetadata, ) +from exo_core.types.tasks import TaskId, TextGeneration +from exo_core.types.text_generation import TextGenerationTaskParams +from exo_core.utils.downloads import build_model_path +from exo_core.utils.memory import Memory +from mlx_lm.utils import load_model +from pydantic import RootModel + +from exo.shared.types.mlx import Model from exo.worker.engines.mlx.auto_parallel import ( LayerLoadedCallback, TimeoutCallback, diff --git a/src/exo/worker/main.py b/src/exo/worker/main.py index 5389e78d..4327822a 100644 --- a/src/exo/worker/main.py +++ b/src/exo/worker/main.py @@ -3,18 +3,29 @@ from datetime import datetime, timezone import anyio from anyio import fail_after +from exo_core.model_cards import ModelId +from exo_core.types.common import CommandId, NodeId, SystemId +from exo_core.types.downloads import DownloadCompleted +from exo_core.types.runners import RunnerId +from exo_core.types.tasks import ( + CancelTask, + CreateRunner, + DownloadModel, + ImageEdits, + Shutdown, + Task, + TaskStatus, +) +from exo_core.utils.downloads import resolve_model_in_path from loguru import logger from exo.api.types import ImageEditsTaskParams -from exo.download.download_utils import resolve_model_in_path from exo.shared.apply import apply -from exo.shared.models.model_cards import ModelId from exo.shared.types.commands import ( ForwarderCommand, ForwarderDownloadCommand, StartDownload, ) -from exo.shared.types.common import CommandId, NodeId, SystemId from exo.shared.types.events import ( Event, IndexedEvent, @@ -28,18 +39,7 @@ from exo.shared.types.events import ( ) from exo.shared.types.multiaddr import Multiaddr from exo.shared.types.state import State -from exo.shared.types.tasks import ( - CancelTask, - CreateRunner, - DownloadModel, - ImageEdits, - Shutdown, - Task, - TaskStatus, -) from exo.shared.types.topology import Connection, SocketConnection -from exo.shared.types.worker.downloads import DownloadCompleted -from exo.shared.types.worker.runners import RunnerId from exo.utils.channels import Receiver, Sender, channel from exo.utils.info_gatherer.info_gatherer import GatheredInfo, InfoGatherer from exo.utils.info_gatherer.net_profile import check_reachable diff --git a/src/exo/worker/plan.py b/src/exo/worker/plan.py index 9b268ae6..f7082b58 100644 --- a/src/exo/worker/plan.py +++ b/src/exo/worker/plan.py @@ -2,8 +2,28 @@ from collections.abc import Mapping, Sequence -from exo.shared.types.common import CommandId, NodeId -from exo.shared.types.tasks import ( +from exo_core.types.common import CommandId, NodeId +from exo_core.types.downloads import ( + DownloadCompleted, + DownloadFailed, + DownloadOngoing, + DownloadProgress, +) +from exo_core.types.instances import BoundInstance, Instance, InstanceId +from exo_core.types.runners import ( + RunnerConnected, + RunnerConnecting, + RunnerFailed, + RunnerId, + RunnerIdle, + RunnerLoaded, + RunnerLoading, + RunnerReady, + RunnerRunning, + RunnerStatus, + RunnerWarmingUp, +) +from exo_core.types.tasks import ( CancelTask, ConnectToGroup, CreateRunner, @@ -18,26 +38,7 @@ from exo.shared.types.tasks import ( TaskStatus, TextGeneration, ) -from exo.shared.types.worker.downloads import ( - DownloadCompleted, - DownloadFailed, - DownloadOngoing, - DownloadProgress, -) -from exo.shared.types.worker.instances import BoundInstance, Instance, InstanceId -from exo.shared.types.worker.runners import ( - RunnerConnected, - RunnerConnecting, - RunnerFailed, - RunnerId, - RunnerIdle, - RunnerLoaded, - RunnerLoading, - RunnerReady, - RunnerRunning, - RunnerStatus, - RunnerWarmingUp, -) + from exo.worker.runner.runner_supervisor import RunnerSupervisor diff --git a/src/exo/worker/runner/bootstrap.py b/src/exo/worker/runner/bootstrap.py index 6fd0e900..ae959c79 100644 --- a/src/exo/worker/runner/bootstrap.py +++ b/src/exo/worker/runner/bootstrap.py @@ -5,11 +5,11 @@ import sys from pathlib import Path import loguru +from exo_core.types.instances import BoundInstance, VllmInstance +from exo_core.types.runners import RunnerFailed +from exo_core.types.tasks import Task, TaskId from exo.shared.types.events import Event, RunnerStatusUpdated -from exo.shared.types.tasks import Task, TaskId -from exo.shared.types.worker.instances import BoundInstance, VllmInstance -from exo.shared.types.worker.runners import RunnerFailed from exo.utils.channels import ClosedResourceError, MpReceiver, MpSender logger: "loguru.Logger" = loguru.logger @@ -72,7 +72,8 @@ def entrypoint( os.environ["VLLM_KV_CACHE_LAYOUT"] = "NHD" os.environ["VLLM_BATCH_INVARIANT"] = "1" _ensure_cuda_libs() - from exo.shared.constants import EXO_MODELS_DIR + from exo_core.constants import EXO_MODELS_DIR + from exo.worker.runner.llm_inference.runner import Runner, VllmBuilder model_id = bound_instance.bound_shard.model_card.model_id diff --git a/src/exo/worker/runner/image_models/runner.py b/src/exo/worker/runner/image_models/runner.py index 79eaf04f..a9fd1497 100644 --- a/src/exo/worker/runner/image_models/runner.py +++ b/src/exo/worker/runner/image_models/runner.py @@ -3,40 +3,16 @@ import time from typing import TYPE_CHECKING, Literal import mlx.core as mx - -from exo.api.types import ImageGenerationStats -from exo.shared.constants import EXO_MAX_CHUNK_SIZE, EXO_TRACING_ENABLED -from exo.shared.models.model_cards import ModelTask -from exo.shared.tracing import clear_trace_buffer, get_trace_buffer -from exo.shared.types.chunks import ErrorChunk, ImageChunk -from exo.shared.types.common import CommandId, ModelId -from exo.shared.types.events import ( - ChunkGenerated, - Event, - RunnerStatusUpdated, - TaskAcknowledged, - TaskStatusUpdated, - TraceEventData, - TracesCollected, -) -from exo.shared.types.tasks import ( - CANCEL_ALL_TASKS, - ConnectToGroup, - ImageEdits, - ImageGeneration, - LoadModel, - Shutdown, - StartWarmup, - Task, - TaskId, - TaskStatus, -) -from exo.shared.types.worker.instances import BoundInstance -from exo.shared.types.worker.runner_response import ( +from exo_core.constants import EXO_MAX_CHUNK_SIZE, EXO_TRACING_ENABLED +from exo_core.model_cards import ModelTask +from exo_core.types.chunks import ErrorChunk, ImageChunk +from exo_core.types.common import CommandId, ModelId +from exo_core.types.instances import BoundInstance +from exo_core.types.runner_response import ( ImageGenerationResponse, PartialImageResponse, ) -from exo.shared.types.worker.runners import ( +from exo_core.types.runners import ( RunnerConnected, RunnerConnecting, RunnerFailed, @@ -50,11 +26,35 @@ from exo.shared.types.worker.runners import ( RunnerStatus, RunnerWarmingUp, ) -from exo.shared.types.worker.shards import ( +from exo_core.types.shards import ( CfgShardMetadata, PipelineShardMetadata, ShardMetadata, ) +from exo_core.types.tasks import ( + CANCEL_ALL_TASKS, + ConnectToGroup, + ImageEdits, + ImageGeneration, + LoadModel, + Shutdown, + StartWarmup, + Task, + TaskId, + TaskStatus, +) + +from exo.api.types import ImageGenerationStats +from exo.shared.tracing import clear_trace_buffer, get_trace_buffer +from exo.shared.types.events import ( + ChunkGenerated, + Event, + RunnerStatusUpdated, + TaskAcknowledged, + TaskStatusUpdated, + TraceEventData, + TracesCollected, +) from exo.utils.channels import MpReceiver, MpSender from exo.worker.engines.image import ( DistributedImageModel, diff --git a/src/exo/worker/runner/llm_inference/batch_generator.py b/src/exo/worker/runner/llm_inference/batch_generator.py index a37e637d..3e7193a7 100644 --- a/src/exo/worker/runner/llm_inference/batch_generator.py +++ b/src/exo/worker/runner/llm_inference/batch_generator.py @@ -7,15 +7,15 @@ from dataclasses import dataclass, field from typing import TYPE_CHECKING import mlx.core as mx +from exo_core.constants import EXO_MAX_CONCURRENT_REQUESTS +from exo_core.types.chunks import ErrorChunk, PrefillProgressChunk +from exo_core.types.common import ModelId +from exo_core.types.runner_response import GenerationResponse, ToolCallResponse +from exo_core.types.tasks import CANCEL_ALL_TASKS, TaskId, TextGeneration +from exo_core.types.text_generation import TextGenerationTaskParams from mlx_lm.tokenizer_utils import TokenizerWrapper -from exo.shared.constants import EXO_MAX_CONCURRENT_REQUESTS -from exo.shared.types.chunks import ErrorChunk, PrefillProgressChunk -from exo.shared.types.common import ModelId from exo.shared.types.events import ChunkGenerated, Event -from exo.shared.types.tasks import CANCEL_ALL_TASKS, TaskId, TextGeneration -from exo.shared.types.text_generation import TextGenerationTaskParams -from exo.shared.types.worker.runner_response import GenerationResponse, ToolCallResponse from exo.utils.channels import MpReceiver, MpSender from exo.worker.engines.mlx.cache import KVPrefixCache from exo.worker.engines.mlx.generator.batch_generate import ExoBatchGenerator diff --git a/src/exo/worker/runner/llm_inference/model_output_parsers.py b/src/exo/worker/runner/llm_inference/model_output_parsers.py index fcf74790..aeb50617 100644 --- a/src/exo/worker/runner/llm_inference/model_output_parsers.py +++ b/src/exo/worker/runner/llm_inference/model_output_parsers.py @@ -2,6 +2,8 @@ from collections.abc import Generator from functools import cache from typing import Any +from exo_core.types.common import ModelId +from exo_core.types.runner_response import GenerationResponse, ToolCallResponse from mlx_lm.tokenizer_utils import TokenizerWrapper from openai_harmony import ( HarmonyEncodingName, @@ -12,8 +14,6 @@ from openai_harmony import ( ) from exo.api.types import ToolCallItem -from exo.shared.types.common import ModelId -from exo.shared.types.worker.runner_response import GenerationResponse, ToolCallResponse from exo.worker.engines.mlx.utils_mlx import ( detect_thinking_prompt_suffix, ) diff --git a/src/exo/worker/runner/llm_inference/runner.py b/src/exo/worker/runner/llm_inference/runner.py index 8333e258..8a6978f8 100644 --- a/src/exo/worker/runner/llm_inference/runner.py +++ b/src/exo/worker/runner/llm_inference/runner.py @@ -9,38 +9,19 @@ from enum import Enum from typing import TYPE_CHECKING, Self from anyio import WouldBlock - -from exo.shared.models.model_cards import ModelTask -from exo.shared.types.chunks import ( +from exo_core.model_cards import ModelTask +from exo_core.types.chunks import ( ErrorChunk, TokenChunk, ToolCallChunk, ) -from exo.shared.types.common import CommandId, ModelId -from exo.shared.types.events import ( - ChunkGenerated, - Event, - RunnerStatusUpdated, - TaskAcknowledged, - TaskStatusUpdated, -) -from exo.shared.types.mlx import Model -from exo.shared.types.tasks import ( - ConnectToGroup, - LoadModel, - Shutdown, - StartWarmup, - Task, - TaskId, - TaskStatus, - TextGeneration, -) -from exo.shared.types.worker.instances import BoundInstance -from exo.shared.types.worker.runner_response import ( +from exo_core.types.common import CommandId, ModelId +from exo_core.types.instances import BoundInstance +from exo_core.types.runner_response import ( GenerationResponse, ToolCallResponse, ) -from exo.shared.types.worker.runners import ( +from exo_core.types.runners import ( RunnerConnected, RunnerConnecting, RunnerFailed, @@ -54,6 +35,25 @@ from exo.shared.types.worker.runners import ( RunnerStatus, RunnerWarmingUp, ) +from exo_core.types.tasks import ( + ConnectToGroup, + LoadModel, + Shutdown, + StartWarmup, + Task, + TaskId, + TaskStatus, + TextGeneration, +) + +from exo.shared.types.events import ( + ChunkGenerated, + Event, + RunnerStatusUpdated, + TaskAcknowledged, + TaskStatusUpdated, +) +from exo.shared.types.mlx import Model from exo.utils.channels import MpReceiver, MpSender from exo.worker.engines.mlx.cache import KVPrefixCache from exo.worker.engines.mlx.utils_mlx import ( @@ -544,7 +544,7 @@ class VllmBuilder(Builder): event_sender: MpSender[Event], cancel_receiver: MpReceiver[TaskId], ) -> Self: - from exo.shared.constants import EXO_MODELS_DIR + from exo_core.constants import EXO_MODELS_DIR mid = bound_instance.instance.shard_assignments.model_id return cls( @@ -566,7 +566,7 @@ class VllmBuilder(Builder): on_timeout: Callable[[], None], on_layer_loaded: Callable[[int, int], None], ) -> None: - from exo.worker.engines.vllm.vllm_generator import load_vllm_engine + from vllm_engine.vllm_generator import load_vllm_engine self._engine, self._tool_parser, self._prefix_cache = load_vllm_engine( model_path=self.model_path, diff --git a/src/exo/worker/runner/runner_supervisor.py b/src/exo/worker/runner/runner_supervisor.py index b0882f39..7e83224e 100644 --- a/src/exo/worker/runner/runner_supervisor.py +++ b/src/exo/worker/runner/runner_supervisor.py @@ -10,27 +10,9 @@ from anyio import ( ClosedResourceError, to_thread, ) -from loguru import logger - -from exo.shared.types.chunks import ErrorChunk -from exo.shared.types.events import ( - ChunkGenerated, - Event, - RunnerStatusUpdated, - TaskAcknowledged, - TaskStatusUpdated, -) -from exo.shared.types.tasks import ( - CANCEL_ALL_TASKS, - ImageEdits, - ImageGeneration, - Task, - TaskId, - TaskStatus, - TextGeneration, -) -from exo.shared.types.worker.instances import BoundInstance -from exo.shared.types.worker.runners import ( +from exo_core.types.chunks import ErrorChunk +from exo_core.types.instances import BoundInstance +from exo_core.types.runners import ( RunnerConnecting, RunnerFailed, RunnerIdle, @@ -40,7 +22,25 @@ from exo.shared.types.worker.runners import ( RunnerStatus, RunnerWarmingUp, ) -from exo.shared.types.worker.shards import ShardMetadata +from exo_core.types.shards import ShardMetadata +from exo_core.types.tasks import ( + CANCEL_ALL_TASKS, + ImageEdits, + ImageGeneration, + Task, + TaskId, + TaskStatus, + TextGeneration, +) +from loguru import logger + +from exo.shared.types.events import ( + ChunkGenerated, + Event, + RunnerStatusUpdated, + TaskAcknowledged, + TaskStatusUpdated, +) from exo.utils.channels import MpReceiver, MpSender, Sender, mp_channel from exo.utils.task_group import TaskGroup from exo.worker.runner.bootstrap import entrypoint diff --git a/src/exo/worker/tests/constants.py b/src/exo/worker/tests/constants.py index 05217a32..bd20ce66 100644 --- a/src/exo/worker/tests/constants.py +++ b/src/exo/worker/tests/constants.py @@ -1,9 +1,9 @@ from typing import Final -from exo.shared.models.model_cards import ModelId -from exo.shared.types.common import CommandId, NodeId -from exo.shared.types.tasks import TaskId -from exo.shared.types.worker.instances import InstanceId, RunnerId +from exo_core.types.common import CommandId, ModelId, NodeId +from exo_core.types.instances import InstanceId +from exo_core.types.runners import RunnerId +from exo_core.types.tasks import TaskId MASTER_NODE_ID = NodeId("ffffffff-aaaa-4aaa-8aaa-aaaaaaaaaaaa") diff --git a/src/exo/worker/tests/unittests/conftest.py b/src/exo/worker/tests/unittests/conftest.py index f88148ef..6439fc46 100644 --- a/src/exo/worker/tests/unittests/conftest.py +++ b/src/exo/worker/tests/unittests/conftest.py @@ -1,17 +1,17 @@ from dataclasses import dataclass, field -from exo.shared.models.model_cards import ModelCard, ModelId, ModelTask -from exo.shared.types.common import NodeId -from exo.shared.types.memory import Memory -from exo.shared.types.tasks import BaseTask, TaskId -from exo.shared.types.worker.instances import ( +from exo_core.model_cards import ModelCard, ModelTask +from exo_core.types.common import ModelId, NodeId +from exo_core.types.instances import ( BoundInstance, Instance, InstanceId, MlxRingInstance, ) -from exo.shared.types.worker.runners import RunnerId, RunnerStatus, ShardAssignments -from exo.shared.types.worker.shards import PipelineShardMetadata, ShardMetadata +from exo_core.types.runners import RunnerId, RunnerStatus, ShardAssignments +from exo_core.types.shards import PipelineShardMetadata, ShardMetadata +from exo_core.types.tasks import BaseTask, TaskId +from exo_core.utils.memory import Memory # Runner supervisor without multiprocessing logic. diff --git a/src/exo/worker/tests/unittests/test_mlx/conftest.py b/src/exo/worker/tests/unittests/test_mlx/conftest.py index a6bfdfc1..089715dd 100644 --- a/src/exo/worker/tests/unittests/test_mlx/conftest.py +++ b/src/exo/worker/tests/unittests/test_mlx/conftest.py @@ -9,14 +9,14 @@ from typing import Any, cast import mlx.core as mx import mlx.nn as nn +from exo_core.constants import EXO_MODELS_DIR +from exo_core.model_cards import ModelCard, ModelTask +from exo_core.types.common import ModelId +from exo_core.types.shards import PipelineShardMetadata, TensorShardMetadata +from exo_core.types.text_generation import InputMessage, TextGenerationTaskParams +from exo_core.utils.memory import Memory -from exo.shared.constants import EXO_MODELS_DIR -from exo.shared.models.model_cards import ModelCard, ModelTask -from exo.shared.types.common import ModelId -from exo.shared.types.memory import Memory from exo.shared.types.mlx import Model -from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams -from exo.shared.types.worker.shards import PipelineShardMetadata, TensorShardMetadata from exo.worker.engines.mlx.generator.generate import mlx_generate from exo.worker.engines.mlx.utils_mlx import apply_chat_template, shard_and_load diff --git a/src/exo/worker/tests/unittests/test_mlx/test_kv_prefix_cache.py b/src/exo/worker/tests/unittests/test_mlx/test_kv_prefix_cache.py index f9b4d1d4..1d9df7c5 100644 --- a/src/exo/worker/tests/unittests/test_mlx/test_kv_prefix_cache.py +++ b/src/exo/worker/tests/unittests/test_mlx/test_kv_prefix_cache.py @@ -5,12 +5,12 @@ from unittest.mock import patch import mlx.core as mx import pytest +from exo_core.types.common import ModelId +from exo_core.types.text_generation import InputMessage, TextGenerationTaskParams from mlx_lm.models.cache import KVCache from mlx_lm.sample_utils import make_sampler -from exo.shared.types.common import ModelId from exo.shared.types.mlx import Model -from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams from exo.worker.engines.mlx.cache import ( KVPrefixCache, cache_length, diff --git a/src/exo/worker/tests/unittests/test_mlx/test_pipeline_prefill_callbacks.py b/src/exo/worker/tests/unittests/test_mlx/test_pipeline_prefill_callbacks.py index 89f1b66a..34c98b6d 100644 --- a/src/exo/worker/tests/unittests/test_mlx/test_pipeline_prefill_callbacks.py +++ b/src/exo/worker/tests/unittests/test_mlx/test_pipeline_prefill_callbacks.py @@ -14,12 +14,11 @@ import traceback from typing import Any, cast import pytest - -from exo.shared.constants import EXO_MODELS_DIR -from exo.shared.models.model_cards import ModelCard, ModelTask -from exo.shared.types.common import ModelId -from exo.shared.types.memory import Memory -from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams +from exo_core.constants import EXO_MODELS_DIR +from exo_core.model_cards import ModelCard, ModelTask +from exo_core.types.common import ModelId +from exo_core.types.text_generation import InputMessage, TextGenerationTaskParams +from exo_core.utils.memory import Memory MODEL_ID = "mlx-community/gpt-oss-20b-MXFP4-Q8" MODEL_PATH = EXO_MODELS_DIR / "mlx-community--gpt-oss-20b-MXFP4-Q8" @@ -73,9 +72,9 @@ def _run_single_device( """Load full model without pipeline sharding, run mlx_generate, record callbacks.""" try: import mlx.core as mx + from exo_core.types.shards import PipelineShardMetadata from mlx_lm.utils import load_model - from exo.shared.types.worker.shards import PipelineShardMetadata from exo.worker.engines.mlx.cache import encode_prompt from exo.worker.engines.mlx.generator.generate import mlx_generate from exo.worker.engines.mlx.utils_mlx import ( @@ -156,8 +155,8 @@ def _run_pipeline_device( try: import mlx.core as mx + from exo_core.types.shards import PipelineShardMetadata - from exo.shared.types.worker.shards import PipelineShardMetadata from exo.worker.engines.mlx.cache import encode_prompt from exo.worker.engines.mlx.generator.generate import mlx_generate from exo.worker.engines.mlx.utils_mlx import shard_and_load diff --git a/src/exo/worker/tests/unittests/test_mlx/test_prefix_cache_architectures.py b/src/exo/worker/tests/unittests/test_mlx/test_prefix_cache_architectures.py index 944e8290..d9946cc7 100644 --- a/src/exo/worker/tests/unittests/test_mlx/test_prefix_cache_architectures.py +++ b/src/exo/worker/tests/unittests/test_mlx/test_prefix_cache_architectures.py @@ -11,12 +11,12 @@ from typing import Any, cast import mlx.core as mx import mlx.nn as nn import pytest +from exo_core.types.common import ModelId +from exo_core.types.text_generation import InputMessage, TextGenerationTaskParams from mlx.utils import tree_flatten, tree_unflatten from mlx_lm.tokenizer_utils import TokenizerWrapper -from exo.shared.types.common import ModelId from exo.shared.types.mlx import Model -from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams from exo.worker.engines.mlx.cache import KVPrefixCache from exo.worker.engines.mlx.generator.generate import mlx_generate from exo.worker.engines.mlx.utils_mlx import ( diff --git a/src/exo/worker/tests/unittests/test_mlx/test_tokenizers.py b/src/exo/worker/tests/unittests/test_mlx/test_tokenizers.py index ce06ab86..c2c2b4d9 100644 --- a/src/exo/worker/tests/unittests/test_mlx/test_tokenizers.py +++ b/src/exo/worker/tests/unittests/test_mlx/test_tokenizers.py @@ -10,13 +10,14 @@ import contextlib from pathlib import Path import pytest - -from exo.download.download_utils import ( +from exo_core.model_cards import ModelCard, get_model_cards +from exo_core.types.common import ModelId +from exo_core.utils.downloads import ( download_file_with_retry, ensure_models_dir, fetch_file_list_with_cache, ) -from exo.shared.models.model_cards import ModelCard, ModelId, get_model_cards + from exo.worker.engines.mlx.utils_mlx import ( get_eos_token_ids_for_model, load_tokenizer_for_model_id, diff --git a/src/exo/worker/tests/unittests/test_plan/test_download_and_loading.py b/src/exo/worker/tests/unittests/test_plan/test_download_and_loading.py index abcb4939..f3239c33 100644 --- a/src/exo/worker/tests/unittests/test_plan/test_download_and_loading.py +++ b/src/exo/worker/tests/unittests/test_plan/test_download_and_loading.py @@ -1,13 +1,14 @@ -import exo.worker.plan as plan_mod -from exo.shared.types.common import NodeId -from exo.shared.types.memory import Memory -from exo.shared.types.tasks import LoadModel -from exo.shared.types.worker.downloads import DownloadCompleted, DownloadProgress -from exo.shared.types.worker.instances import BoundInstance -from exo.shared.types.worker.runners import ( +from exo_core.types.common import NodeId +from exo_core.types.downloads import DownloadCompleted, DownloadProgress +from exo_core.types.instances import BoundInstance +from exo_core.types.runners import ( RunnerConnected, RunnerIdle, ) +from exo_core.types.tasks import LoadModel +from exo_core.utils.memory import Memory + +import exo.worker.plan as plan_mod from exo.worker.tests.constants import ( INSTANCE_1_ID, MODEL_A_ID, diff --git a/src/exo/worker/tests/unittests/test_plan/test_runner_lifecycle.py b/src/exo/worker/tests/unittests/test_plan/test_runner_lifecycle.py index a1b87ca1..87d6b42c 100644 --- a/src/exo/worker/tests/unittests/test_plan/test_runner_lifecycle.py +++ b/src/exo/worker/tests/unittests/test_plan/test_runner_lifecycle.py @@ -1,14 +1,15 @@ from typing import Any -import exo.worker.plan as plan_mod -from exo.shared.types.tasks import Shutdown -from exo.shared.types.worker.instances import BoundInstance, Instance, InstanceId -from exo.shared.types.worker.runners import ( +from exo_core.types.instances import BoundInstance, Instance, InstanceId +from exo_core.types.runners import ( RunnerFailed, RunnerId, RunnerReady, RunnerStatus, ) +from exo_core.types.tasks import Shutdown + +import exo.worker.plan as plan_mod from exo.worker.tests.constants import ( INSTANCE_1_ID, MODEL_A_ID, diff --git a/src/exo/worker/tests/unittests/test_plan/test_task_forwarding.py b/src/exo/worker/tests/unittests/test_plan/test_task_forwarding.py index 64be74e6..2f31bd8f 100644 --- a/src/exo/worker/tests/unittests/test_plan/test_task_forwarding.py +++ b/src/exo/worker/tests/unittests/test_plan/test_task_forwarding.py @@ -1,14 +1,15 @@ from typing import cast -import exo.worker.plan as plan_mod -from exo.shared.types.tasks import Task, TaskId, TaskStatus, TextGeneration -from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams -from exo.shared.types.worker.instances import BoundInstance, InstanceId -from exo.shared.types.worker.runners import ( +from exo_core.types.instances import BoundInstance, InstanceId +from exo_core.types.runners import ( RunnerIdle, RunnerReady, RunnerRunning, ) +from exo_core.types.tasks import Task, TaskId, TaskStatus, TextGeneration +from exo_core.types.text_generation import InputMessage, TextGenerationTaskParams + +import exo.worker.plan as plan_mod from exo.worker.tests.constants import ( COMMAND_1_ID, INSTANCE_1_ID, diff --git a/src/exo/worker/tests/unittests/test_plan/test_warmup.py b/src/exo/worker/tests/unittests/test_plan/test_warmup.py index 52848446..ce5257b6 100644 --- a/src/exo/worker/tests/unittests/test_plan/test_warmup.py +++ b/src/exo/worker/tests/unittests/test_plan/test_warmup.py @@ -1,12 +1,13 @@ -import exo.worker.plan as plan_mod -from exo.shared.types.tasks import StartWarmup -from exo.shared.types.worker.instances import BoundInstance -from exo.shared.types.worker.runners import ( +from exo_core.types.instances import BoundInstance +from exo_core.types.runners import ( RunnerIdle, RunnerLoaded, RunnerLoading, RunnerWarmingUp, ) +from exo_core.types.tasks import StartWarmup + +import exo.worker.plan as plan_mod from exo.worker.tests.constants import ( INSTANCE_1_ID, MODEL_A_ID, diff --git a/src/exo/worker/tests/unittests/test_runner/test_dsml_e2e.py b/src/exo/worker/tests/unittests/test_runner/test_dsml_e2e.py index a5502167..c99a6e6b 100644 --- a/src/exo/worker/tests/unittests/test_runner/test_dsml_e2e.py +++ b/src/exo/worker/tests/unittests/test_runner/test_dsml_e2e.py @@ -2,10 +2,11 @@ import json from collections.abc import Generator from typing import Any -from exo.shared.types.worker.runner_response import ( +from exo_core.types.runner_response import ( GenerationResponse, ToolCallResponse, ) + from exo.worker.engines.mlx.dsml_encoding import ( ASSISTANT_TOKEN, BOS_TOKEN, diff --git a/src/exo/worker/tests/unittests/test_runner/test_event_ordering.py b/src/exo/worker/tests/unittests/test_runner/test_event_ordering.py index 3600290e..dbb072fa 100644 --- a/src/exo/worker/tests/unittests/test_runner/test_event_ordering.py +++ b/src/exo/worker/tests/unittests/test_runner/test_event_ordering.py @@ -5,31 +5,9 @@ from typing import Callable import mlx.core as mx import pytest - -import exo.worker.runner.llm_inference.batch_generator as mlx_batch_generator -import exo.worker.runner.llm_inference.model_output_parsers as mlx_model_output_parsers -import exo.worker.runner.llm_inference.runner as mlx_runner -from exo.shared.types.chunks import TokenChunk -from exo.shared.types.events import ( - ChunkGenerated, - Event, - RunnerStatusUpdated, - TaskAcknowledged, - TaskStatusUpdated, -) -from exo.shared.types.tasks import ( - ConnectToGroup, - LoadModel, - Shutdown, - StartWarmup, - Task, - TaskId, - TaskStatus, - TextGeneration, -) -from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams -from exo.shared.types.worker.runner_response import GenerationResponse -from exo.shared.types.worker.runners import ( +from exo_core.types.chunks import TokenChunk +from exo_core.types.runner_response import GenerationResponse +from exo_core.types.runners import ( RunnerConnected, RunnerConnecting, RunnerIdle, @@ -41,6 +19,28 @@ from exo.shared.types.worker.runners import ( RunnerShuttingDown, RunnerWarmingUp, ) +from exo_core.types.tasks import ( + ConnectToGroup, + LoadModel, + Shutdown, + StartWarmup, + Task, + TaskId, + TaskStatus, + TextGeneration, +) +from exo_core.types.text_generation import InputMessage, TextGenerationTaskParams + +import exo.worker.runner.llm_inference.batch_generator as mlx_batch_generator +import exo.worker.runner.llm_inference.model_output_parsers as mlx_model_output_parsers +import exo.worker.runner.llm_inference.runner as mlx_runner +from exo.shared.types.events import ( + ChunkGenerated, + Event, + RunnerStatusUpdated, + TaskAcknowledged, + TaskStatusUpdated, +) from exo.utils.channels import mp_channel from ...constants import ( @@ -262,8 +262,8 @@ def _run(tasks: Iterable[Task], send_after_ready: list[Task] | None = None): "exo.worker.runner.llm_inference.runner.mx.distributed.all_gather", make_nothin(mx.array([1])), ): - builder = mlx_runner.MlxBuilder( - model_id=MODEL_A_ID, + builder = mlx_runner.MlxBuilder.create( + bound_instance, event_sender=event_sender, # pyright: ignore[reportArgumentType] cancel_receiver=cancel_receiver, ) diff --git a/src/exo/worker/tests/unittests/test_runner/test_parse_gpt_oss.py b/src/exo/worker/tests/unittests/test_runner/test_parse_gpt_oss.py index ba331336..e8be227e 100644 --- a/src/exo/worker/tests/unittests/test_runner/test_parse_gpt_oss.py +++ b/src/exo/worker/tests/unittests/test_runner/test_parse_gpt_oss.py @@ -1,10 +1,11 @@ from collections.abc import Generator -from exo.api.types import FinishReason -from exo.shared.types.worker.runner_response import ( +from exo_core.types.runner_response import ( GenerationResponse, ToolCallResponse, ) + +from exo.api.types import FinishReason from exo.worker.runner.llm_inference.model_output_parsers import parse_gpt_oss # Token IDs from mlx-community/gpt-oss-20b-MXFP4-Q8 tokenizer. diff --git a/src/exo/worker/tests/unittests/test_runner/test_parse_tool_calls.py b/src/exo/worker/tests/unittests/test_runner/test_parse_tool_calls.py index 03be01bd..cd9dc843 100644 --- a/src/exo/worker/tests/unittests/test_runner/test_parse_tool_calls.py +++ b/src/exo/worker/tests/unittests/test_runner/test_parse_tool_calls.py @@ -4,7 +4,8 @@ import json from collections.abc import Generator from typing import Any -from exo.shared.types.worker.runner_response import GenerationResponse, ToolCallResponse +from exo_core.types.runner_response import GenerationResponse, ToolCallResponse + from exo.worker.runner.llm_inference.model_output_parsers import parse_tool_calls from exo.worker.runner.llm_inference.tool_parsers import make_mlx_parser diff --git a/src/exo/worker/tests/unittests/test_runner/test_runner_supervisor.py b/src/exo/worker/tests/unittests/test_runner/test_runner_supervisor.py index ecb07f94..6b747aa3 100644 --- a/src/exo/worker/tests/unittests/test_runner/test_runner_supervisor.py +++ b/src/exo/worker/tests/unittests/test_runner/test_runner_supervisor.py @@ -3,15 +3,14 @@ from typing import cast import anyio import pytest +from exo_core.types.chunks import ErrorChunk +from exo_core.types.common import CommandId, ModelId, NodeId +from exo_core.types.instances import BoundInstance, InstanceId +from exo_core.types.runners import RunnerFailed, RunnerId +from exo_core.types.tasks import Task, TaskId, TextGeneration +from exo_core.types.text_generation import InputMessage, TextGenerationTaskParams -from exo.shared.models.model_cards import ModelId -from exo.shared.types.chunks import ErrorChunk -from exo.shared.types.common import CommandId, NodeId from exo.shared.types.events import ChunkGenerated, Event, RunnerStatusUpdated -from exo.shared.types.tasks import Task, TaskId, TextGeneration -from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams -from exo.shared.types.worker.instances import BoundInstance, InstanceId -from exo.shared.types.worker.runners import RunnerFailed, RunnerId from exo.utils.channels import channel, mp_channel from exo.worker.runner.runner_supervisor import RunnerSupervisor from exo.worker.tests.unittests.conftest import get_bound_mlx_ring_instance diff --git a/tests/headless_runner.py b/tests/headless_runner.py index eb194730..20f73525 100644 --- a/tests/headless_runner.py +++ b/tests/headless_runner.py @@ -2,10 +2,25 @@ import socket from typing import Literal import anyio -from exo.shared.models.model_cards import ModelCard, ModelId -from exo.shared.types.chunks import TokenChunk -from exo.shared.types.common import Host, NodeId -from exo.shared.types.tasks import ( +from exo_core.constants import EXO_MODELS_DIR +from exo_core.model_cards import ModelCard, ModelId +from exo_core.types.chunks import TokenChunk +from exo_core.types.common import Host, NodeId +from exo_core.types.instances import ( + BoundInstance, + Instance, + InstanceId, + MlxJacclInstance, + MlxRingInstance, +) +from exo_core.types.runners import ( + RunnerFailed, + RunnerId, + RunnerShutdown, + ShardAssignments, +) +from exo_core.types.shards import PipelineShardMetadata, TensorShardMetadata +from exo_core.types.tasks import ( ConnectToGroup, LoadModel, Shutdown, @@ -13,21 +28,7 @@ from exo.shared.types.tasks import ( Task, TextGeneration, ) -from exo.shared.types.text_generation import InputMessage, TextGenerationTaskParams -from exo.shared.types.worker.instances import ( - BoundInstance, - Instance, - InstanceId, - MlxJacclInstance, - MlxRingInstance, -) -from exo.shared.types.worker.runners import ( - RunnerFailed, - RunnerId, - RunnerShutdown, - ShardAssignments, -) -from exo.shared.types.worker.shards import PipelineShardMetadata, TensorShardMetadata +from exo_core.types.text_generation import InputMessage, TextGenerationTaskParams from fastapi import FastAPI from fastapi.responses import Response, StreamingResponse from hypercorn import Config @@ -35,7 +36,6 @@ from hypercorn.asyncio import serve # pyright: ignore[reportUnknownVariableType from loguru import logger from pydantic import BaseModel -from exo.shared.constants import EXO_MODELS_DIR from exo.shared.types.commands import CommandId from exo.shared.types.events import ChunkGenerated, Event, RunnerStatusUpdated from exo.utils.channels import channel, mp_channel diff --git a/tmp/gen_card.py b/tmp/gen_card.py index 6a9a06ad..b075f889 100644 --- a/tmp/gen_card.py +++ b/tmp/gen_card.py @@ -9,7 +9,7 @@ Model Cards require cleanup for family & quantization data import sys import anyio -from exo.shared.models.model_cards import ModelCard, ModelId +from exo_core.model_cards import ModelCard, ModelId async def main(): diff --git a/uv.lock b/uv.lock index 518a4cd0..77a813d1 100644 --- a/uv.lock +++ b/uv.lock @@ -6,13 +6,24 @@ resolution-markers = [ "python_full_version < '3.14' and sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", "sys_platform == 'darwin' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", "sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "python_full_version >= '3.14' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", - "python_full_version < '3.14' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", + "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", + "python_full_version >= '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", + "python_full_version >= '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", + "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", + "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", + "python_full_version < '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version >= '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version >= '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version < '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version >= '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version >= '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version < '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", ] supported-markers = [ "sys_platform == 'darwin'", @@ -32,6 +43,8 @@ members = [ "exo-bench", "exo-core", "exo-pyo3-bindings", + "mlx-engine", + "vllm-engine", ] [[package]] @@ -173,14 +186,14 @@ name = "anthropic" version = "0.86.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "distro", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "docstring-parser", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "httpx", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "jiter", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "sniffio", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "anyio", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "distro", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "docstring-parser", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "httpx", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "jiter", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "sniffio", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/37/7a/8b390dc47945d3169875d342847431e5f7d5fa716b2e37494d57cfc1db10/anthropic-0.86.0.tar.gz", hash = "sha256:60023a7e879aa4fbb1fed99d487fe407b2ebf6569603e5047cfe304cebdaa0e5", size = 583820, upload-time = "2026-03-18T18:43:08.017Z" } wheels = [ @@ -341,7 +354,7 @@ name = "cffi" version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy' and platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "pycparser", marker = "(implementation_name != 'PyPy' and sys_platform == 'linux') or (implementation_name == 'PyPy' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ @@ -479,10 +492,12 @@ name = "compressed-tensors" version = "0.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "loguru", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "torch", version = "2.10.0+cu130", source = { registry = "https://download.pytorch.org/whl/cu130" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "transformers", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "loguru", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "torch", version = "2.10.0", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (platform_machine == 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "torch", version = "2.10.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "torch", version = "2.10.0+cu130", source = { registry = "https://download.pytorch.org/whl/cu130" }, marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "transformers", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fc/65/88dd1c58fb9d0ded51b5c86471b937a1525f91fad2211a6f051dc1ea822d/compressed_tensors-0.13.0.tar.gz", hash = "sha256:23893824d3498ea3f1a829f14a8fa85f9a5e76a34c711a038b8d7c619ca9a67c", size = 200995, upload-time = "2025-12-16T16:03:55.397Z" } wheels = [ @@ -494,7 +509,7 @@ name = "contourpy" version = "1.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } wheels = [ @@ -549,7 +564,7 @@ name = "cryptography" version = "46.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'" }, + { name = "cffi", marker = "(platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (platform_python_implementation == 'PyPy' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } wheels = [ @@ -602,7 +617,7 @@ name = "cuda-bindings" version = "13.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cuda-pathfinder", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "cuda-pathfinder", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/2f/36/41ccc303eb6be8ae82c5edd2ccae938876e8a794660e8bb96a193174a978/cuda_bindings-13.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb16a7f769c9c67469add7a1d9f6c14dd44637f6921cb6b9eb82cb5015b35c3d", size = 11537064, upload-time = "2025-10-21T15:09:07.84Z" }, @@ -660,7 +675,7 @@ dependencies = [ { name = "httpx", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "huggingface-hub", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "multiprocess", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "packaging", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "pandas", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "pyarrow", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, @@ -679,8 +694,8 @@ name = "depyf" version = "0.20.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "astor", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "dill", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "astor", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "dill", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/88/35/83fb0178212279aa0af031031905804c6de5618435d229f41ed21bb9ad2c/depyf-0.20.0.tar.gz", hash = "sha256:fb7683bd72c44f67b56029df2c47721e9a02ffa4d7b19095f1c54c4ebf797a98", size = 6168761, upload-time = "2025-10-13T12:33:38.589Z" } wheels = [ @@ -755,8 +770,8 @@ name = "email-validator" version = "2.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "dnspython", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "idna", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "dnspython", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "idna", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" } wheels = [ @@ -773,7 +788,7 @@ dependencies = [ { name = "fsspec", extra = ["http"], marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "huggingface-hub", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "multiprocess", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "packaging", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "pandas", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "requests", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, @@ -803,7 +818,7 @@ dependencies = [ { name = "loguru", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "mflux", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "mlx", version = "0.30.6", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "mlx", version = "0.30.7.dev20260312+257d5692", source = { git = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv.git?branch=address-rdma-gpu-locks#257d5692fc7af6bba3b8afaeb63c549b7d1e43d5" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "mlx", version = "0.30.7.dev20260306+257d5692", source = { git = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv.git?branch=address-rdma-gpu-locks#257d5692fc7af6bba3b8afaeb63c549b7d1e43d5" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "mlx-lm", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "msgspec", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "openai-harmony", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, @@ -819,7 +834,7 @@ dependencies = [ [package.optional-dependencies] cuda = [ - { name = "vllm-engine", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "vllm-engine", marker = "sys_platform == 'linux'" }, ] mlx = [ { name = "mlx-engine", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, @@ -854,7 +869,7 @@ requires-dist = [ { name = "mflux", marker = "sys_platform == 'darwin'", specifier = "==0.16.9" }, { name = "mlx", marker = "sys_platform == 'darwin'", git = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv.git?branch=address-rdma-gpu-locks" }, { name = "mlx", marker = "sys_platform == 'linux'", specifier = "==0.30.6" }, - { name = "mlx-engine", marker = "extra == 'mlx'", directory = "python/mlx_engine" }, + { name = "mlx-engine", marker = "extra == 'mlx'", editable = "python/mlx_engine" }, { name = "mlx-lm", git = "https://github.com/rltakashige/mlx-lm?branch=leo%2Feval-left-padding-in-batched-rotation" }, { name = "msgspec", specifier = ">=0.19.0" }, { name = "openai-harmony", specifier = ">=0.0.8" }, @@ -865,7 +880,7 @@ requires-dist = [ { name = "tiktoken", specifier = ">=0.12.0" }, { name = "tomlkit", specifier = ">=0.14.0" }, { name = "types-aiofiles", specifier = ">=24.1.0.20250708" }, - { name = "vllm-engine", marker = "platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'cuda'", directory = "python/vllm_engine" }, + { name = "vllm-engine", marker = "sys_platform == 'linux' and extra == 'cuda'", editable = "python/vllm_engine" }, { name = "zstandard", specifier = ">=0.23.0" }, ] provides-extras = ["mlx", "cuda"] @@ -894,8 +909,9 @@ dependencies = [ { name = "lm-eval", extra = ["api", "math"], marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "loguru", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "math-verify", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "protobuf", version = "7.34.0", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "protobuf", version = "7.34.0", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "tiktoken", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "transformers", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] @@ -925,7 +941,7 @@ dependencies = [ ] [package.metadata] -requires-dist = [{ name = "pydantic" }] +requires-dist = [{ name = "pydantic", specifier = ">=2.13.0b2" }] [[package]] name = "exo-pyo3-bindings" @@ -955,8 +971,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "starlette", version = "0.52.1", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "starlette", version = "1.0.0rc1", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform == 'linux' and extra != 'extra-3-exo-cuda') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "starlette", version = "0.52.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "starlette", version = "1.0.0rc1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "typing-inspection", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] @@ -967,14 +983,14 @@ wheels = [ [package.optional-dependencies] standard = [ - { name = "email-validator", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "fastapi-cli", extra = ["standard"], marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "httpx", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "jinja2", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic-extra-types", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic-settings", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "python-multipart", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "uvicorn", extra = ["standard"], marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "email-validator", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "fastapi-cli", extra = ["standard"], marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "httpx", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "jinja2", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic-extra-types", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic-settings", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "python-multipart", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "uvicorn", extra = ["standard"], marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] [[package]] @@ -982,9 +998,9 @@ name = "fastapi-cli" version = "0.0.24" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "rich-toolkit", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typer", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "uvicorn", extra = ["standard"], marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "rich-toolkit", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typer", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "uvicorn", extra = ["standard"], marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6e/58/74797ae9e4610cfa0c6b34c8309096d3b20bb29be3b8b5fbf1004d10fa5f/fastapi_cli-0.0.24.tar.gz", hash = "sha256:1afc9c9e21d7ebc8a3ca5e31790cd8d837742be7e4f8b9236e99cb3451f0de00", size = 19043, upload-time = "2026-02-24T10:45:10.476Z" } wheels = [ @@ -993,8 +1009,8 @@ wheels = [ [package.optional-dependencies] standard = [ - { name = "fastapi-cloud-cli", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "uvicorn", extra = ["standard"], marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "fastapi-cloud-cli", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "uvicorn", extra = ["standard"], marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] [[package]] @@ -1002,14 +1018,14 @@ name = "fastapi-cloud-cli" version = "0.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "fastar", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "httpx", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic", extra = ["email"], marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "rich-toolkit", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "rignore", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "sentry-sdk", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typer", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "uvicorn", extra = ["standard"], marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "fastar", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "httpx", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic", extra = ["email"], marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "rich-toolkit", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "rignore", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "sentry-sdk", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typer", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "uvicorn", extra = ["standard"], marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/63/e1/05c44e7bbc619e980fab0236cff9f5f323ac1aaa79434b4906febf98b1d3/fastapi_cloud_cli-0.15.0.tar.gz", hash = "sha256:d02515231f3f505f7669c20920343934570a88a08af9f9a6463ca2807f27ffe5", size = 45309, upload-time = "2026-03-11T22:31:32.455Z" } wheels = [ @@ -1074,7 +1090,7 @@ name = "fastsafetensors" version = "0.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typer", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "typer", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f2/c2/1504b51a4ce61cd0f6b8c6a88c0dbed22df011a2aeb99ade35e528b0e091/fastsafetensors-0.2.2.tar.gz", hash = "sha256:67c06bdbb9855070ebb036e1ce7a61a71d2ce722bbd5457534af602dd4734249", size = 52029, upload-time = "2026-02-10T14:12:34.706Z" } wheels = [ @@ -1227,10 +1243,10 @@ name = "gguf" version = "0.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pyyaml", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "requests", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "tqdm", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pyyaml", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "requests", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "tqdm", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3f/26/7622a41c39db9d7090225a4bf8368550e59694dcf7313b44f9a82b501209/gguf-0.18.0.tar.gz", hash = "sha256:b4659093d5d0dccdb5902a904d54b327f4052879fe5e90946ad5fce9f8018c2e", size = 107170, upload-time = "2026-02-27T15:05:39.254Z" } wheels = [ @@ -1242,7 +1258,7 @@ name = "googleapis-common-protos" version = "1.73.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/99/96/a0205167fa0154f4a542fd6925bdc63d039d88dab3588b875078107e6f06/googleapis_common_protos-1.73.0.tar.gz", hash = "sha256:778d07cd4fbeff84c6f7c72102f0daf98fa2bfd3fa8bea426edc545588da0b5a", size = 147323, upload-time = "2026-03-06T21:53:09.727Z" } wheels = [ @@ -1254,7 +1270,7 @@ name = "grpcio" version = "1.80.0rc1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/71/7b/f268818409a2b27fb02b6aa1984ebcc52b4e726e6897921da56f966c0be3/grpcio-1.80.0rc1.tar.gz", hash = "sha256:acf128375159a1ab6e715283aea6c9445a1be2cb20e007e5be3ef78ea24954b4", size = 13001149, upload-time = "2026-03-17T16:34:17.515Z" } wheels = [ @@ -1460,7 +1476,7 @@ version = "1.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fire", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "tqdm", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0a/4b/44832f60f8fb14257019084412229a2ed48e34acd0d9d3f8198196d02dd7/human-eval-1.0.3.tar.gz", hash = "sha256:03ee63d3fbbb6fecbc5dfae58381fc655004ad86caafeb141ca2169c63648766", size = 54651, upload-time = "2023-07-24T18:45:58.99Z" } @@ -1570,7 +1586,7 @@ name = "importlib-metadata" version = "8.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "zipp", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "zipp", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } wheels = [ @@ -1726,10 +1742,10 @@ name = "jsonschema" version = "4.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "attrs", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "jsonschema-specifications", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "referencing", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "rpds-py", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "attrs", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "jsonschema-specifications", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "referencing", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "rpds-py", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } wheels = [ @@ -1741,7 +1757,7 @@ name = "jsonschema-specifications" version = "2025.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "referencing", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "referencing", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } wheels = [ @@ -1871,19 +1887,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5a/7e/809349638231f469b9056c0e1bfd924d5ef5558b3b3ec72d093b6fad33b1/llguidance-1.3.0-cp39-abi3-win_amd64.whl", hash = "sha256:1d1cd1c8618d1a13605d3e057c978651e551c8c469b481ee4041f1d6c436002d", size = 2789946, upload-time = "2025-10-20T19:58:45.958Z" }, ] -[[package]] -name = "llvmlite" -version = "0.44.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/89/6a/95a3d3610d5c75293d5dbbb2a76480d5d4eeba641557b69fe90af6c5b84e/llvmlite-0.44.0.tar.gz", hash = "sha256:07667d66a5d150abed9157ab6c0b9393c9356f229784a4385c02f99e94fc94d4", size = 171880, upload-time = "2025-01-20T11:14:41.342Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/89/24/4c0ca705a717514c2092b18476e7a12c74d34d875e05e4d742618ebbf449/llvmlite-0.44.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:319bddd44e5f71ae2689859b7203080716448a3cd1128fb144fe5c055219d516", size = 28132306, upload-time = "2025-01-20T11:14:09.035Z" }, - { url = "https://files.pythonhosted.org/packages/01/cf/1dd5a60ba6aee7122ab9243fd614abcf22f36b0437cbbe1ccf1e3391461c/llvmlite-0.44.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c58867118bad04a0bb22a2e0068c693719658105e40009ffe95c7000fcde88e", size = 26201090, upload-time = "2025-01-20T11:14:15.401Z" }, - { url = "https://files.pythonhosted.org/packages/d2/1b/656f5a357de7135a3777bd735cc7c9b8f23b4d37465505bd0eaf4be9befe/llvmlite-0.44.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46224058b13c96af1365290bdfebe9a6264ae62fb79b2b55693deed11657a8bf", size = 42361904, upload-time = "2025-01-20T11:14:22.949Z" }, - { url = "https://files.pythonhosted.org/packages/d8/e1/12c5f20cb9168fb3464a34310411d5ad86e4163c8ff2d14a2b57e5cc6bac/llvmlite-0.44.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0097052c32bf721a4efc03bd109d335dfa57d9bffb3d4c24cc680711b8b4fc", size = 41184245, upload-time = "2025-01-20T11:14:31.731Z" }, - { url = "https://files.pythonhosted.org/packages/d0/81/e66fc86539293282fd9cb7c9417438e897f369e79ffb62e1ae5e5154d4dd/llvmlite-0.44.0-cp313-cp313-win_amd64.whl", hash = "sha256:2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930", size = 30331193, upload-time = "2025-01-20T11:14:38.578Z" }, -] - [[package]] name = "lm-eval" version = "0.4.11" @@ -1895,7 +1898,7 @@ dependencies = [ { name = "jinja2", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "jsonlines", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "more-itertools", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "pytablewriter", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "rouge-score", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "sacrebleu", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, @@ -1929,10 +1932,10 @@ name = "lm-format-enforcer" version = "0.11.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "interegular", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "packaging", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pyyaml", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "interegular", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "packaging", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pyyaml", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/84/d5/41cd417ba7dfdbbcfe46cebf81fb3dfd7c591b89897560ad05bb410a465d/lm_format_enforcer-0.11.3.tar.gz", hash = "sha256:e68081c108719cce284a9bcc889709b26ffb085a1945b5eba3a12cfa96d528da", size = 40258, upload-time = "2025-08-24T19:37:47.527Z" } wheels = [ @@ -2112,7 +2115,7 @@ dependencies = [ { name = "cycler", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "fonttools", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "kiwisolver", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "packaging", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "pillow", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "pyparsing", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, @@ -2167,19 +2170,19 @@ name = "mcp" version = "1.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "httpx", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "httpx-sse", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "jsonschema", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic-settings", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pyjwt", extra = ["crypto"], marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "python-multipart", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "sse-starlette", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "starlette", version = "0.52.1", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-inspection", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "uvicorn", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "anyio", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "httpx", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "httpx-sse", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "jsonschema", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic-settings", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pyjwt", extra = ["crypto"], marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "python-multipart", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "sse-starlette", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "starlette", version = "0.52.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-inspection", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "uvicorn", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fc/6d/62e76bbb8144d6ed86e202b5edd8a4cb631e7c8130f3f4893c3f90262b10/mcp-1.26.0.tar.gz", hash = "sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66", size = 608005, upload-time = "2026-01-24T19:40:32.468Z" } wheels = [ @@ -2205,8 +2208,8 @@ dependencies = [ { name = "hf-transfer", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "huggingface-hub", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "matplotlib", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "mlx", version = "0.30.7.dev20260312+257d5692", source = { git = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv.git?branch=address-rdma-gpu-locks#257d5692fc7af6bba3b8afaeb63c549b7d1e43d5" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "mlx", version = "0.30.7.dev20260306+257d5692", source = { git = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv.git?branch=address-rdma-gpu-locks#257d5692fc7af6bba3b8afaeb63c549b7d1e43d5" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "opencv-python", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "piexif", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "pillow", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, @@ -2233,14 +2236,14 @@ name = "mistral-common" version = "1.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "jsonschema", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pillow", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic-extra-types", extra = ["pycountry"], marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "requests", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "tiktoken", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "jsonschema", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pillow", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic-extra-types", extra = ["pycountry"], marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "requests", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "tiktoken", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a7/22/f798c1acc3f8cf32b6201b063d96867d79aa39d31dff12478739e1a78979/mistral_common-1.10.0.tar.gz", hash = "sha256:e456ff101edbdfc094039ec6c26f7d0f73356729798d628a6e6e96c3917147bc", size = 6351515, upload-time = "2026-03-13T10:13:46.683Z" } wheels = [ @@ -2249,7 +2252,7 @@ wheels = [ [package.optional-dependencies] image = [ - { name = "opencv-python-headless", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "opencv-python-headless", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] [[package]] @@ -2257,13 +2260,12 @@ name = "mlx" version = "0.30.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", - "python_full_version < '3.14' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", - "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version >= '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'", + "python_full_version >= '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", + "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'", + "python_full_version < '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", ] wheels = [ { url = "https://files.pythonhosted.org/packages/ae/5b/e460e144a34d5529e010056cccf50b538d56ed001473bc6b246018fd58cb/mlx-0.30.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ed86f8bffc174c2f259ca589ea25464c96cf69d1bb457074a2bf2ef53737e54f", size = 573515, upload-time = "2026-02-06T03:45:23.405Z" }, @@ -2280,7 +2282,7 @@ wheels = [ [[package]] name = "mlx" -version = "0.30.7.dev20260312+257d5692" +version = "0.30.7.dev20260306+257d5692" source = { git = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv.git?branch=address-rdma-gpu-locks#257d5692fc7af6bba3b8afaeb63c549b7d1e43d5" } resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", @@ -2294,10 +2296,10 @@ name = "mlx-cuda-13" version = "0.30.6" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-nvrtc", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cudnn-cu13", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-nccl-cu13", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "nvidia-cublas", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-cuda-nvrtc", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-cudnn-cu13", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-nccl-cu13", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/08/6b/27cd4abed63ca9e4086536acde4486ea7a762dda5b36bb867ed954efe93a/mlx_cuda_13-0.30.6-py3-none-manylinux_2_35_aarch64.whl", hash = "sha256:1a5e58eaf4b1a4eb6cb0111ecb4099f6f1380403599f8992ec93dfbad8d9c6f1", size = 66904875, upload-time = "2026-02-06T02:49:19.183Z" }, @@ -2307,7 +2309,13 @@ wheels = [ [[package]] name = "mlx-engine" version = "0.1.0" -source = { directory = "python/mlx_engine" } +source = { editable = "python/mlx_engine" } +dependencies = [ + { name = "exo-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, +] + +[package.metadata] +requires-dist = [{ name = "exo-core", editable = "python/exo_core" }] [[package]] name = "mlx-lm" @@ -2315,11 +2323,10 @@ version = "0.31.0" source = { git = "https://github.com/rltakashige/mlx-lm?branch=leo%2Feval-left-padding-in-batched-rotation#1f17c5fecac52b82d1bd7e2735ed1d9eef83e28d" } dependencies = [ { name = "jinja2", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "mlx", version = "0.30.7.dev20260312+257d5692", source = { git = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv.git?branch=address-rdma-gpu-locks#257d5692fc7af6bba3b8afaeb63c549b7d1e43d5" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform == 'linux' and extra != 'extra-3-exo-cuda') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "protobuf", version = "7.34.0", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform == 'linux' and extra != 'extra-3-exo-cuda') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "mlx", version = "0.30.7.dev20260306+257d5692", source = { git = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv.git?branch=address-rdma-gpu-locks#257d5692fc7af6bba3b8afaeb63c549b7d1e43d5" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "protobuf", version = "7.34.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "sentencepiece", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "transformers", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, @@ -2330,13 +2337,13 @@ name = "model-hosting-container-standards" version = "0.1.14" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "fastapi", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "httpx", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "jmespath", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "setuptools", version = "77.0.3", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "starlette", version = "0.52.1", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "supervisor", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "fastapi", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "httpx", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "jmespath", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "setuptools", version = "77.0.3", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "starlette", version = "0.52.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "supervisor", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c6/3d/cf5c6029648cb0a116f7b5c2f74aa155ab0c6dd723a1f204a6d7ff354526/model_hosting_container_standards-0.1.14.tar.gz", hash = "sha256:b6cf4c46d88ce6acd6e543a578bb88ffd55d1179a7c09c22e61ae1d8a567c564", size = 90386, upload-time = "2026-03-18T21:25:14.513Z" } wheels = [ @@ -2600,70 +2607,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3a/e9/cc97ecd8b41a92f17afeaa9b51fc89abe3f41493568a449fcf7beb5df1f7/nodejs_wheel_binaries-25.5.0rc0-py2.py3-none-win_arm64.whl", hash = "sha256:6b4bda8da2166555e17fd08340e1d35c4ef2f4acbc3d2f8705033393f744a51b", size = 40265354, upload-time = "2026-02-01T20:07:53.597Z" }, ] -[[package]] -name = "numba" -version = "0.61.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "llvmlite", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1c/a0/e21f57604304aa03ebb8e098429222722ad99176a4f979d34af1d1ee80da/numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d", size = 2820615, upload-time = "2025-04-09T02:58:07.659Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/f3/0fe4c1b1f2569e8a18ad90c159298d862f96c3964392a20d74fc628aee44/numba-0.61.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:3a10a8fc9afac40b1eac55717cece1b8b1ac0b946f5065c89e00bde646b5b154", size = 2771785, upload-time = "2025-04-09T02:57:59.96Z" }, - { url = "https://files.pythonhosted.org/packages/e9/71/91b277d712e46bd5059f8a5866862ed1116091a7cb03bd2704ba8ebe015f/numba-0.61.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d3bcada3c9afba3bed413fba45845f2fb9cd0d2b27dd58a1be90257e293d140", size = 2773289, upload-time = "2025-04-09T02:58:01.435Z" }, - { url = "https://files.pythonhosted.org/packages/0d/e0/5ea04e7ad2c39288c0f0f9e8d47638ad70f28e275d092733b5817cf243c9/numba-0.61.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdbca73ad81fa196bd53dc12e3aaf1564ae036e0c125f237c7644fe64a4928ab", size = 3893918, upload-time = "2025-04-09T02:58:02.933Z" }, - { url = "https://files.pythonhosted.org/packages/17/58/064f4dcb7d7e9412f16ecf80ed753f92297e39f399c905389688cf950b81/numba-0.61.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f154aaea625fb32cfbe3b80c5456d514d416fcdf79733dd69c0df3a11348e9e", size = 3584056, upload-time = "2025-04-09T02:58:04.538Z" }, - { url = "https://files.pythonhosted.org/packages/af/a4/6d3a0f2d3989e62a18749e1e9913d5fa4910bbb3e3311a035baea6caf26d/numba-0.61.2-cp313-cp313-win_amd64.whl", hash = "sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7", size = 2831846, upload-time = "2025-04-09T02:58:06.125Z" }, -] - -[[package]] -name = "numpy" -version = "2.2.6" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", -] -sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, - { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, - { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, - { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, - { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, - { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, - { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, - { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, - { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, - { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, - { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, - { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, - { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, - { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, - { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, -] - [[package]] name = "numpy" version = "2.4.3" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", - "python_full_version < '3.14' and sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", - "sys_platform == 'darwin' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "python_full_version >= '3.14' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", - "python_full_version < '3.14' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", - "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", -] sdist = { url = "https://files.pythonhosted.org/packages/10/8b/c265f4823726ab832de836cdd184d0986dcf94480f81e8739692a7ac7af2/numpy-2.4.3.tar.gz", hash = "sha256:483a201202b73495f00dbc83796c6ae63137a9bdade074f7648b3e32613412dd", size = 20727743, upload-time = "2026-03-09T07:58:53.426Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b6/d0/1fe47a98ce0df229238b77611340aff92d52691bcbc10583303181abf7fc/numpy-2.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b346845443716c8e542d54112966383b448f4a3ba5c66409771b8c0889485dd3", size = 16665297, upload-time = "2026-03-09T07:56:52.296Z" }, @@ -2755,7 +2702,7 @@ name = "nvidia-cudnn-cu13" version = "9.15.1.9" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "nvidia-cublas", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/ff/93/b3c9db2c35d6183361333d2dcfea50e094c012d012c8a4d7effbfb53ef62/nvidia_cudnn_cu13-9.15.1.9-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:44cd2ec83c3ef62a7357614bd02ce7f3dac35ffcbb04ad20999e730741f0ba17", size = 415636241, upload-time = "2025-11-12T20:22:26.582Z" }, @@ -2768,7 +2715,7 @@ name = "nvidia-cufft" version = "12.0.0.61" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/8b/ae/f417a75c0259e85c1d2f83ca4e960289a5f814ed0cea74d18c353d3e989d/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2708c852ef8cd89d1d2068bdbece0aa188813a0c934db3779b9b1faa8442e5f5", size = 214053554, upload-time = "2025-09-04T08:31:38.196Z" }, @@ -2800,9 +2747,9 @@ name = "nvidia-cusolver" version = "12.0.4.66" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cusparse", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-nvjitlink", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "nvidia-cublas", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-cusparse", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/c8/c3/b30c9e935fc01e3da443ec0116ed1b2a009bb867f5324d3f2d7e533e776b/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:02c2457eaa9e39de20f880f4bd8820e6a1cfb9f9a34f820eb12a155aa5bc92d2", size = 223467760, upload-time = "2025-09-04T08:33:04.222Z" }, @@ -2815,7 +2762,7 @@ name = "nvidia-cusparse" version = "12.6.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/f8/94/5c26f33738ae35276672f12615a64bd008ed5be6d1ebcb23579285d960a9/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80bcc4662f23f1054ee334a15c72b8940402975e0eab63178fc7e670aa59472c", size = 162155568, upload-time = "2025-09-04T08:33:42.864Z" }, @@ -2876,14 +2823,14 @@ name = "openai" version = "2.24.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "distro", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "httpx", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "jiter", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "sniffio", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "tqdm", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "anyio", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "distro", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "httpx", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "jiter", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "sniffio", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "tqdm", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/55/13/17e87641b89b74552ed408a92b231283786523edddc95f3545809fab673c/openai-2.24.0.tar.gz", hash = "sha256:1e5769f540dbd01cb33bc4716a23e67b9d695161a734aff9c5f925e2bf99a673", size = 658717, upload-time = "2026-02-24T20:02:07.958Z" } wheels = [ @@ -2918,7 +2865,7 @@ name = "opencv-python" version = "4.13.0.92" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/fc/6f/5a28fef4c4a382be06afe3938c64cc168223016fa520c5abaf37e8862aa5/opencv_python-4.13.0.92-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:caf60c071ec391ba51ed00a4a920f996d0b64e3e46068aac1f646b5de0326a19", size = 46247052, upload-time = "2026-02-05T07:01:25.046Z" }, @@ -2936,7 +2883,7 @@ name = "opencv-python-headless" version = "4.13.0.92" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/79/42/2310883be3b8826ac58c3f2787b9358a2d46923d61f88fedf930bc59c60c/opencv_python_headless-4.13.0.92-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:1a7d040ac656c11b8c38677cc8cccdc149f98535089dbe5b081e80a4e5903209", size = 46247192, upload-time = "2026-02-05T07:01:35.187Z" }, @@ -2954,8 +2901,8 @@ name = "opentelemetry-api" version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "importlib-metadata", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "importlib-metadata", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2c/1d/4049a9e8698361cc1a1aa03a6c59e4fa4c71e0c0f94a30f988a6876a2ae6/opentelemetry_api-1.40.0.tar.gz", hash = "sha256:159be641c0b04d11e9ecd576906462773eb97ae1b657730f0ecf64d32071569f", size = 70851, upload-time = "2026-03-04T14:17:21.555Z" } wheels = [ @@ -2967,8 +2914,8 @@ name = "opentelemetry-exporter-otlp" version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "opentelemetry-exporter-otlp-proto-grpc", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-exporter-otlp-proto-http", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "opentelemetry-exporter-otlp-proto-grpc", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-exporter-otlp-proto-http", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d0/37/b6708e0eff5c5fb9aba2e0ea09f7f3bcbfd12a592d2a780241b5f6014df7/opentelemetry_exporter_otlp-1.40.0.tar.gz", hash = "sha256:7caa0870b95e2fcb59d64e16e2b639ecffb07771b6cd0000b5d12e5e4fef765a", size = 6152, upload-time = "2026-03-04T14:17:23.235Z" } wheels = [ @@ -2980,7 +2927,7 @@ name = "opentelemetry-exporter-otlp-proto-common" version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "opentelemetry-proto", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "opentelemetry-proto", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/51/bc/1559d46557fe6eca0b46c88d4c2676285f1f3be2e8d06bb5d15fbffc814a/opentelemetry_exporter_otlp_proto_common-1.40.0.tar.gz", hash = "sha256:1cbee86a4064790b362a86601ee7934f368b81cd4cc2f2e163902a6e7818a0fa", size = 20416, upload-time = "2026-03-04T14:17:23.801Z" } wheels = [ @@ -2992,13 +2939,13 @@ name = "opentelemetry-exporter-otlp-proto-grpc" version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "googleapis-common-protos", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "grpcio", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-api", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-exporter-otlp-proto-common", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-proto", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-sdk", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "googleapis-common-protos", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "grpcio", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-api", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-exporter-otlp-proto-common", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-proto", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-sdk", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8f/7f/b9e60435cfcc7590fa87436edad6822240dddbc184643a2a005301cc31f4/opentelemetry_exporter_otlp_proto_grpc-1.40.0.tar.gz", hash = "sha256:bd4015183e40b635b3dab8da528b27161ba83bf4ef545776b196f0fb4ec47740", size = 25759, upload-time = "2026-03-04T14:17:24.4Z" } wheels = [ @@ -3010,13 +2957,13 @@ name = "opentelemetry-exporter-otlp-proto-http" version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "googleapis-common-protos", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-api", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-exporter-otlp-proto-common", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-proto", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-sdk", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "requests", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "googleapis-common-protos", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-api", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-exporter-otlp-proto-common", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-proto", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-sdk", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "requests", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2e/fa/73d50e2c15c56be4d000c98e24221d494674b0cc95524e2a8cb3856d95a4/opentelemetry_exporter_otlp_proto_http-1.40.0.tar.gz", hash = "sha256:db48f5e0f33217588bbc00274a31517ba830da576e59503507c839b38fa0869c", size = 17772, upload-time = "2026-03-04T14:17:25.324Z" } wheels = [ @@ -3028,7 +2975,7 @@ name = "opentelemetry-proto" version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4c/77/dd38991db037fdfce45849491cb61de5ab000f49824a00230afb112a4392/opentelemetry_proto-1.40.0.tar.gz", hash = "sha256:03f639ca129ba513f5819810f5b1f42bcb371391405d99c168fe6937c62febcd", size = 45667, upload-time = "2026-03-04T14:17:31.194Z" } wheels = [ @@ -3040,9 +2987,9 @@ name = "opentelemetry-sdk" version = "1.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "opentelemetry-api", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-semantic-conventions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "opentelemetry-api", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-semantic-conventions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/fd/3c3125b20ba18ce2155ba9ea74acb0ae5d25f8cd39cfd37455601b7955cc/opentelemetry_sdk-1.40.0.tar.gz", hash = "sha256:18e9f5ec20d859d268c7cb3c5198c8d105d073714db3de50b593b8c1345a48f2", size = 184252, upload-time = "2026-03-04T14:17:31.87Z" } wheels = [ @@ -3054,8 +3001,8 @@ name = "opentelemetry-semantic-conventions" version = "0.61b0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "opentelemetry-api", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "opentelemetry-api", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6d/c0/4ae7973f3c2cfd2b6e321f1675626f0dab0a97027cc7a297474c9c8f3d04/opentelemetry_semantic_conventions-0.61b0.tar.gz", hash = "sha256:072f65473c5d7c6dc0355b27d6c9d1a679d63b6d4b4b16a9773062cb7e31192a", size = 145755, upload-time = "2026-03-04T14:17:32.664Z" } wheels = [ @@ -3067,8 +3014,8 @@ name = "opentelemetry-semantic-conventions-ai" version = "0.4.15" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "opentelemetry-sdk", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-semantic-conventions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "opentelemetry-sdk", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-semantic-conventions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e9/75/455c15f8360b475dd31101a87eab316420388486f7941bf019cbf4e63d5b/opentelemetry_semantic_conventions_ai-0.4.15.tar.gz", hash = "sha256:12de172d1e11d21c6e82bbf578c7e8a713589a7fda76af9ed785632564a28b81", size = 18595, upload-time = "2026-03-02T15:36:50.254Z" } wheels = [ @@ -3105,7 +3052,7 @@ name = "pandas" version = "3.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "python-dateutil", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2e/0c/b28ed414f080ee0ad153f848586d61d1878f91689950f037f976ce15f6c8/pandas-3.0.1.tar.gz", hash = "sha256:4186a699674af418f655dbd420ed87f50d56b4cd6603784279d9eef6627823c8", size = 4641901, upload-time = "2026-02-17T22:20:16.434Z" } @@ -3278,8 +3225,8 @@ name = "prometheus-fastapi-instrumentator" version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "prometheus-client", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "starlette", version = "0.52.1", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "prometheus-client", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "starlette", version = "0.52.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/69/6d/24d53033cf93826aa7857699a4450c1c67e5b9c710e925b1ed2b320c04df/prometheus_fastapi_instrumentator-7.1.0.tar.gz", hash = "sha256:be7cd61eeea4e5912aeccb4261c6631b3f227d8924542d79eaf5af3f439cbe5e", size = 20220, upload-time = "2025-03-19T19:35:05.351Z" } wheels = [ @@ -3361,7 +3308,11 @@ version = "6.33.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version >= '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'", + "python_full_version >= '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'", + "python_full_version < '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", ] sdist = { url = "https://files.pythonhosted.org/packages/66/70/e908e9c5e52ef7c3a6c7902c9dfbb34c7e29c25d2f81ade3856445fd5c94/protobuf-6.33.6.tar.gz", hash = "sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135", size = 444531, upload-time = "2026-03-18T19:05:00.988Z" } wheels = [ @@ -3383,11 +3334,6 @@ resolution-markers = [ "python_full_version < '3.14' and sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", "sys_platform == 'darwin' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", "sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "python_full_version >= '3.14' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", - "python_full_version < '3.14' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", - "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", ] sdist = { url = "https://files.pythonhosted.org/packages/f2/00/04a2ab36b70a52d0356852979e08b44edde0435f2115dc66e25f2100f3ab/protobuf-7.34.0.tar.gz", hash = "sha256:3871a3df67c710aaf7bb8d214cc997342e63ceebd940c8c7fc65c9b3d697591a", size = 454726, upload-time = "2026-02-27T00:30:25.421Z" } wheels = [ @@ -3602,7 +3548,7 @@ wheels = [ [package.optional-dependencies] email = [ - { name = "email-validator", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "email-validator", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] [[package]] @@ -3663,8 +3609,8 @@ name = "pydantic-extra-types" version = "2.11.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pydantic", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "pydantic", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/71/dba38ee2651f84f7842206adbd2233d8bbdb59fb85e9fa14232486a8c471/pydantic_extra_types-2.11.1.tar.gz", hash = "sha256:46792d2307383859e923d8fcefa82108b1a141f8a9c0198982b3832ab5ef1049", size = 172002, upload-time = "2026-03-16T08:08:03.92Z" } wheels = [ @@ -3673,7 +3619,7 @@ wheels = [ [package.optional-dependencies] pycountry = [ - { name = "pycountry", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "pycountry", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] [[package]] @@ -3681,9 +3627,9 @@ name = "pydantic-settings" version = "2.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pydantic", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "python-dotenv", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-inspection", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "pydantic", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "python-dotenv", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-inspection", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/52/6d/fffca34caecc4a3f97bda81b2098da5e8ab7efc9a66e819074a11955d87e/pydantic_settings-2.13.1.tar.gz", hash = "sha256:b4c11847b15237fb0171e1462bf540e294affb9b86db4d9aa5c01730bdbe4025", size = 223826, upload-time = "2026-02-19T13:45:08.055Z" } wheels = [ @@ -3708,8 +3654,8 @@ dependencies = [ { name = "macholib", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "pyinstaller-hooks-contrib", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "setuptools", version = "77.0.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "setuptools", version = "82.0.1", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform == 'linux' and extra != 'extra-3-exo-cuda') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "setuptools", version = "77.0.3", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "setuptools", version = "82.0.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c8/63/fd62472b6371d89dc138d40c36d87a50dc2de18a035803bbdc376b4ffac4/pyinstaller-6.19.0.tar.gz", hash = "sha256:ec73aeb8bd9b7f2f1240d328a4542e90b3c6e6fbc106014778431c616592a865", size = 4036072, upload-time = "2026-02-14T18:06:28.718Z" } wheels = [ @@ -3732,8 +3678,8 @@ version = "2026.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "setuptools", version = "77.0.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "setuptools", version = "82.0.1", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform == 'linux' and extra != 'extra-3-exo-cuda') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "setuptools", version = "77.0.3", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "setuptools", version = "82.0.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/80/17/716326f6ba18d0663f7995ae369c23e50efebc22fbb054e9710a45688f61/pyinstaller_hooks_contrib-2026.3.tar.gz", hash = "sha256:800d3a198a49a6cd0de2d7fb795005fdca7a0222ed9cb47c0691abd1c27b9310", size = 172323, upload-time = "2026-03-09T22:44:06.345Z" } wheels = [ @@ -3751,7 +3697,7 @@ wheels = [ [package.optional-dependencies] crypto = [ - { name = "cryptography", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "cryptography", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] [[package]] @@ -3771,7 +3717,8 @@ dependencies = [ { name = "dataproperty", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "mbstrdecoder", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "pathvalidate", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "setuptools", version = "82.0.1", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "setuptools", version = "77.0.3", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "setuptools", version = "82.0.1", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "tabledata", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "tcolorpy", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "typepy", extra = ["datetime"], marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, @@ -3910,7 +3857,7 @@ name = "pyzmq" version = "27.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "implementation_name == 'pypy' and platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "cffi", marker = "(implementation_name == 'pypy' and sys_platform == 'linux') or (implementation_name != 'pypy' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } wheels = [ @@ -3967,8 +3914,8 @@ name = "referencing" version = "0.37.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "attrs", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "rpds-py", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "attrs", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "rpds-py", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } wheels = [ @@ -4101,9 +4048,9 @@ name = "rich-toolkit" version = "0.19.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "rich", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "click", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "rich", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/ba/dae9e3096651042754da419a4042bc1c75e07d615f9b15066d738838e4df/rich_toolkit-0.19.7.tar.gz", hash = "sha256:133c0915872da91d4c25d85342d5ec1dfacc69b63448af1a08a0d4b4f23ef46e", size = 195877, upload-time = "2026-02-24T16:06:20.555Z" } wheels = [ @@ -4170,7 +4117,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "absl-py", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "nltk", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "six", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e2/c5/9136736c37022a6ad27fea38f3111eb8f02fe75d067f9a985cc358653102/rouge_score-0.1.2.tar.gz", hash = "sha256:c7d4da2683e68c9abf0135ef915d63a46643666f848e558a1b9f7ead17ff0f04", size = 17400, upload-time = "2022-07-22T22:46:22.909Z" } @@ -4271,8 +4218,7 @@ name = "rustworkx" version = "0.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform == 'linux' and extra != 'extra-3-exo-cuda') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e7/b0/66d96f02120f79eeed86b5c5be04029b6821155f31ed4907a4e9f1460671/rustworkx-0.17.1.tar.gz", hash = "sha256:59ea01b4e603daffa4e8827316c1641eef18ae9032f0b1b14aa0181687e3108e", size = 399407, upload-time = "2025-09-15T16:29:46.429Z" } wheels = [ @@ -4296,7 +4242,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "lxml", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "portalocker", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "regex", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "tabulate", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, @@ -4334,7 +4280,7 @@ version = "1.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "joblib", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "scipy", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "threadpoolctl", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] @@ -4371,7 +4317,7 @@ name = "scipy" version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "(sys_platform == 'darwin' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra == 'project-9-exo-bench') or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } wheels = [ @@ -4462,9 +4408,9 @@ name = "sentry-sdk" version = "3.0.0a7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "certifi", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-sdk", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "urllib3", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "certifi", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-sdk", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "urllib3", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/a5/747ab268f2cf3f4cb50af521e1a85a959411f74cf4a2ecf47782e1981cee/sentry_sdk-3.0.0a7.tar.gz", hash = "sha256:439a858d409b84407560df6b7ebb760acd9ad3d14e05cd919ae36b204e411cb2", size = 329999, upload-time = "2025-10-20T13:50:38.131Z" } wheels = [ @@ -4525,7 +4471,11 @@ version = "77.0.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version >= '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'", + "python_full_version >= '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'", + "python_full_version < '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", ] sdist = { url = "https://files.pythonhosted.org/packages/81/ed/7101d53811fd359333583330ff976e5177c5e871ca8b909d1d6c30553aa3/setuptools-77.0.3.tar.gz", hash = "sha256:583b361c8da8de57403743e756609670de6fb2345920e36dc5c2d914c319c945", size = 1367236, upload-time = "2025-03-20T14:38:08.777Z" } wheels = [ @@ -4541,11 +4491,6 @@ resolution-markers = [ "python_full_version < '3.14' and sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", "sys_platform == 'darwin' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", "sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "python_full_version >= '3.14' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", - "python_full_version < '3.14' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", - "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", ] sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z" } wheels = [ @@ -4590,8 +4535,8 @@ name = "sse-starlette" version = "3.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "starlette", version = "0.52.1", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "anyio", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "starlette", version = "0.52.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/14/2f/9223c24f568bb7a0c03d751e609844dce0968f13b39a3f73fbb3a96cd27a/sse_starlette-3.3.3.tar.gz", hash = "sha256:72a95d7575fd5129bd0ae15275ac6432bb35ac542fdebb82889c24bb9f3f4049", size = 32420, upload-time = "2026-03-17T20:05:55.529Z" } wheels = [ @@ -4604,10 +4549,14 @@ version = "0.52.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version >= '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'", + "python_full_version >= '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'", + "python_full_version < '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", ] dependencies = [ - { name = "anyio", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "anyio", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c4/68/79977123bb7be889ad680d79a40f339082c1978b5cfcf62c2d8d196873ac/starlette-0.52.1.tar.gz", hash = "sha256:834edd1b0a23167694292e94f597773bc3f89f362be6effee198165a35d62933", size = 2653702, upload-time = "2026-01-18T13:34:11.062Z" } wheels = [ @@ -4623,14 +4572,9 @@ resolution-markers = [ "python_full_version < '3.14' and sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", "sys_platform == 'darwin' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", "sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "python_full_version >= '3.14' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", - "python_full_version < '3.14' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", - "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", - "sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", ] dependencies = [ - { name = "anyio", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform == 'linux' and extra != 'extra-3-exo-cuda') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "anyio", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/47/11581c2f488a65ab8a32a1843e989203c7b359c39bd06d31ff8bc4ddc6f3/starlette-1.0.0rc1.tar.gz", hash = "sha256:c369b9ac3af2e64b3a5301d7059f4222cfa884ad5e91320336109789cfe0fe23", size = 2653401, upload-time = "2026-02-23T22:12:32.257Z" } wheels = [ @@ -4651,7 +4595,7 @@ name = "sympy" version = "1.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mpmath", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux' and extra == 'project-9-exo-bench') or (platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "mpmath", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } wheels = [ @@ -4809,15 +4753,22 @@ resolution-markers = [ "python_full_version < '3.14' and sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", "sys_platform == 'darwin' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", "sys_platform == 'darwin' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version >= '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", + "python_full_version < '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra == 'project-9-exo-bench'", + "python_full_version >= '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version < '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version >= '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", + "python_full_version < '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux' and extra != 'extra-3-exo-cuda' and extra != 'project-9-exo-bench'", ] dependencies = [ - { name = "filelock", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "fsspec", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "jinja2", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "networkx", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "filelock", marker = "(platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (platform_machine == 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "fsspec", marker = "(platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (platform_machine == 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "jinja2", marker = "(platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (platform_machine == 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "networkx", marker = "(platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (platform_machine == 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "setuptools", version = "77.0.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (platform_machine == 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "setuptools", version = "82.0.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "sympy", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "typing-extensions", marker = "sys_platform == 'darwin' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "sympy", marker = "(platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (platform_machine == 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "(platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (platform_machine == 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/ec/23/2c9fe0c9c27f7f6cb865abcea8a4568f29f00acaeadfc6a37f6801f84cb4/torch-2.10.0-2-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:e521c9f030a3774ed770a9c011751fb47c4d12029a3d6522116e48431f2ff89e", size = 79498254, upload-time = "2026-02-10T21:44:44.095Z" }, @@ -4843,6 +4794,47 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/66/4d/35352043ee0eaffdeff154fad67cd4a31dbed7ff8e3be1cc4549717d6d51/torch-2.10.0-cp314-cp314t-win_amd64.whl", hash = "sha256:71283a373f0ee2c89e0f0d5f446039bdabe8dbc3c9ccf35f0f784908b0acd185", size = 113995816, upload-time = "2026-01-21T16:22:05.312Z" }, ] +[[package]] +name = "torch" +version = "2.10.0+cpu" +source = { registry = "https://download.pytorch.org/whl/cpu" } +resolution-markers = [ + "python_full_version >= '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'", + "python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'linux'", +] +dependencies = [ + { name = "filelock", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "fsspec", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "jinja2", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "networkx", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "setuptools", version = "77.0.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "sympy", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, +] +wheels = [ + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313-linux_aarch64.whl", hash = "sha256:fd215f3d0f681905c5b56b0630a3d666900a37fcc3ca5b937f95275c66f9fd9c" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313-linux_s390x.whl", hash = "sha256:170a0623108055be5199370335cf9b41ba6875b3cb6f086db4aee583331a4899" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:e51994492cdb76edce29da88de3672a3022f9ef0ffd90345436948d4992be2c7" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:8d316e5bf121f1eab1147e49ad0511a9d92e4c45cc357d1ab0bee440da71a095" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313-win_amd64.whl", hash = "sha256:b719da5af01b59126ac13eefd6ba3dd12d002dc0e8e79b8b365e55267a8189d3" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313-win_arm64.whl", hash = "sha256:b67d91326e4ed9eccbd6b7d84ed7ffa43f93103aa3f0b24145f3001f3b11b714" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313t-linux_aarch64.whl", hash = "sha256:5af75e5f49de21b0bdf7672bc27139bd285f9e8dbcabe2d617a2eb656514ac36" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313t-linux_s390x.whl", hash = "sha256:ba51ef01a510baf8fff576174f702c47e1aa54389a9f1fba323bb1a5003ff0bf" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:0fedcb1a77e8f2aaf7bfd21591bf6d1e0b207473268c9be16b17cb7783253969" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:106dd1930cb30a4a337366ba3f9b25318ebf940f51fd46f789281dd9e736bdc4" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313t-win_amd64.whl", hash = "sha256:eb1bde1ce198f05c8770017de27e001d404499cf552aaaa014569eff56ca25c0" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314-linux_aarch64.whl", hash = "sha256:ea2bcc9d1fca66974a71d4bf9a502539283f35d61fcab5a799b4e120846f1e02" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314-linux_s390x.whl", hash = "sha256:f8294fd2fc6dd8f4435a891a0122307a043b14b21f0dac1bca63c85bfb59e586" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:a28fdbcfa2fbacffec81300f24dd1bed2b0ccfdbed107a823cff12bc1db070f6" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:aada8afc068add586464b2a55adb7cc9091eec55caf5320447204741cb6a0604" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314-win_amd64.whl", hash = "sha256:2adc71fe471e98a608723bfc837f7e1929885ebb912c693597711e139c1cda41" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314t-linux_aarch64.whl", hash = "sha256:9412bd37b70f5ebd1205242c4ba4cabae35a605947f2b30806d5c9b467936db9" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314t-linux_s390x.whl", hash = "sha256:e71c476517c33e7db69825a9ff46c7f47a723ec4dac5b2481cff4246d1c632be" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:23882f8d882460aca809882fc42f5e343bf07585274f929ced00177d1be1eb67" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:4fcd8b4cc2ae20f2b7749fb275349c55432393868778c2d50a08e81d5ee5591e" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314t-win_amd64.whl", hash = "sha256:ffc8da9a1341092d6a90cb5b1c1a33cd61abf0fb43f0cd88443c27fa372c26ae" }, +] + [[package]] name = "torch" version = "2.10.0+cu130" @@ -4852,30 +4844,30 @@ resolution-markers = [ "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "cuda-bindings", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "filelock", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "fsspec", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "jinja2", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "networkx", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cublas", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-cupti", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-nvrtc", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-runtime", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cudnn-cu13", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cufft", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cufile", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-curand", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cusolver", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cusparse", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-cusparselt-cu13", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-nccl-cu13", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-nvjitlink", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-nvshmem-cu13", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "nvidia-nvtx", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "setuptools", version = "77.0.3", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "sympy", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "triton", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "cuda-bindings", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "filelock", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "fsspec", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "jinja2", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "networkx", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-cublas", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-cuda-cupti", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-cuda-nvrtc", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-cuda-runtime", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-cudnn-cu13", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-cufft", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-cufile", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-curand", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-cusolver", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-cusparse", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-cusparselt-cu13", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-nccl-cu13", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-nvshmem-cu13", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "nvidia-nvtx", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "setuptools", version = "77.0.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "sympy", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "triton", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] wheels = [ { url = "https://download.pytorch.org/whl/cu130/torch-2.10.0%2Bcu130-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:75780283308df9fede371eeda01e9607c8862a1803a2f2f31a08a2c0deaed342" }, @@ -4892,60 +4884,6 @@ wheels = [ { url = "https://download.pytorch.org/whl/cu130/torch-2.10.0%2Bcu130-cp314-cp314t-win_amd64.whl", hash = "sha256:d5ea18790a18b660d655f6e75a8ca6e8d6298b55fc338f8c921764b94c886743" }, ] -[[package]] -name = "torchaudio" -version = "2.10.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "torch", version = "2.10.0+cu130", source = { registry = "https://download.pytorch.org/whl/cu130" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/02/341e7bd588355f82c5180103cb2f8070a72ab1be920ab27553a1135d4aa6/torchaudio-2.10.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:8fd38d28ee150c584d3ee3b05f39e021f0ad8a8ec8fec1f26dfe150c9db9b2f5", size = 737164, upload-time = "2026-01-21T16:28:38.354Z" }, - { url = "https://files.pythonhosted.org/packages/49/fd/831c2595c81b17141180ca11ab3c0836cc544ef13e15aa0e7b2cb619e582/torchaudio-2.10.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5bc39ff3ea341097ce1ab023dd88c9dd8ca5f96ebf48821e7d23766137bb55d7", size = 392757, upload-time = "2026-01-21T16:28:33.631Z" }, - { url = "https://files.pythonhosted.org/packages/8e/d8/405c80c57dc68ca5855bddfaae57c3d84ea7397bf1eb2aa5d59c9fa1d3a9/torchaudio-2.10.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3057c4286db5673d266124a2a10ca54e19f516772e9057f44573a7da5b85e328", size = 1897099, upload-time = "2026-01-21T16:28:24.793Z" }, - { url = "https://files.pythonhosted.org/packages/73/cf/0e48d67788c935e3b3d00e6f55a930a54a67f432e04c33ef80a38cb764fd/torchaudio-2.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:99e74d1901742bc10961d807fe75c0dd9496f4a4a4ff4bb317c5de4a0b6f24e6", size = 475476, upload-time = "2026-01-21T16:28:28.249Z" }, - { url = "https://files.pythonhosted.org/packages/48/29/30bcce0f17a8279b051b09250993691a828f89a03278306b23571c18df04/torchaudio-2.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6cfe98ef0ea9bee6d6297493ce67ce0c54a38d80caf6535a3ae48900fd5f3769", size = 742449, upload-time = "2026-01-21T16:28:29.556Z" }, - { url = "https://files.pythonhosted.org/packages/43/8c/653e7f67855424bf3b7cbb48335f8316f7fb02bb01a6cab38f6bf9555676/torchaudio-2.10.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:b41b254d958632dc00dc7768431cadda516c91641d798775cbb19bcd4f0d2be4", size = 393430, upload-time = "2026-01-21T16:28:34.855Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1f/f91fcb9dd47a19b720fb48042a2f6f023651948e73726e98fff60d5ed5c7/torchaudio-2.10.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:da1081d1018a1e95f5a13947402aeb037cf5ac8861219a6164df004898a96bb1", size = 1897271, upload-time = "2026-01-21T16:28:23.519Z" }, - { url = "https://files.pythonhosted.org/packages/57/27/270c26890f43838e8faa5d3e52f079bd9d9d09f9a535a11cf6b94e20ed21/torchaudio-2.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f1afa53146a5655258d3a86e689c6879dfe78581d9bee9ef611ace98722f86bb", size = 478966, upload-time = "2026-01-21T16:28:32.491Z" }, - { url = "https://files.pythonhosted.org/packages/cc/5c/0e54b162bd0d1ec2f87b545553af839f906b940888d0122cdef04b965385/torchaudio-2.10.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1f2897fbf776d55afcb5f6d9b7bdfaea850ca7a129c8f5e4b3a4b025c431130d", size = 739544, upload-time = "2026-01-21T16:28:26.947Z" }, - { url = "https://files.pythonhosted.org/packages/57/a1/ef5571406858f4ea89c18d6ad844d21cb9858708149e6bbd9a789ee30ea5/torchaudio-2.10.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:b2d5e11a2bec08f02a4f5fb7d1902ff82d48c533a27ceedc21e6ade650cf65b3", size = 393061, upload-time = "2026-01-21T16:28:25.802Z" }, - { url = "https://files.pythonhosted.org/packages/9d/0f/a0cf0ebc6f71b1868ea056dd4cd4f1a2244b8da8bc38372a1adc984a7c1f/torchaudio-2.10.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:77f6cf11a3b61af1b0967cd642368ecd30a86d70f622b22410ae6cb42d980b72", size = 1897137, upload-time = "2026-01-21T16:28:15.366Z" }, - { url = "https://files.pythonhosted.org/packages/7f/48/98e6710a4601e190bc923c3683629c29d41fb18a818a9328515541f023ed/torchaudio-2.10.0-cp314-cp314-win_amd64.whl", hash = "sha256:4711c2a86a005685ca3b5da135b2f370d81ac354e3dcb142ef45fe2c78b9c9c4", size = 475154, upload-time = "2026-01-21T16:28:22.438Z" }, - { url = "https://files.pythonhosted.org/packages/c1/9b/cd02f8add38bd98761548b0821a5e54c564117a9bbeafaf95f665ab0fd72/torchaudio-2.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:13bdc1bde0c88e999699d1503304a56fc9dea6401b76bc08a5f268368129d46c", size = 742453, upload-time = "2026-01-21T16:28:20.989Z" }, - { url = "https://files.pythonhosted.org/packages/53/8a/946aa07393845b918d318b5e34b3bd0359fd27fc9fac10a85fae2bb86382/torchaudio-2.10.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:ed912de8ec1b400e17a5172badcfcddc601a9cd4e02d200f3a9504fc8e54961c", size = 393434, upload-time = "2026-01-21T16:28:18.668Z" }, - { url = "https://files.pythonhosted.org/packages/e1/68/e37e8fbbae986afa80f8851e08fc017eb8ae5f7b398ee28ed92303da163e/torchaudio-2.10.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:f7aa33a8198e87949896e16ea245ea731906445becdf10130e8823c68494a94a", size = 1897289, upload-time = "2026-01-21T16:28:17.059Z" }, - { url = "https://files.pythonhosted.org/packages/5d/61/0e1f464463b85bc677036faffdfd23493aa17e8c3fc3a649abca8c019701/torchaudio-2.10.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e49f6a18a8552620c4394f8529b7551eda9312d46dfdd3500bd2be459c86aea4", size = 478968, upload-time = "2026-01-21T16:28:19.542Z" }, -] - -[[package]] -name = "torchvision" -version = "0.25.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pillow", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "torch", version = "2.10.0+cu130", source = { registry = "https://download.pytorch.org/whl/cu130" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/5b/1562a04a6a5a4cf8cf40016a0cdeda91ede75d6962cff7f809a85ae966a5/torchvision-0.25.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:24e11199e4d84ba9c5ee7825ebdf1cd37ce8deec225117f10243cae984ced3ec", size = 1874918, upload-time = "2026-01-21T16:27:39.02Z" }, - { url = "https://files.pythonhosted.org/packages/36/b1/3d6c42f62c272ce34fcce609bb8939bdf873dab5f1b798fd4e880255f129/torchvision-0.25.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f271136d2d2c0b7a24c5671795c6e4fd8da4e0ea98aeb1041f62bc04c4370ef", size = 2309106, upload-time = "2026-01-21T16:27:30.624Z" }, - { url = "https://files.pythonhosted.org/packages/c7/60/59bb9c8b67cce356daeed4cb96a717caa4f69c9822f72e223a0eae7a9bd9/torchvision-0.25.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:855c0dc6d37f462482da7531c6788518baedca1e0847f3df42a911713acdfe52", size = 8071522, upload-time = "2026-01-21T16:27:29.392Z" }, - { url = "https://files.pythonhosted.org/packages/32/a5/9a9b1de0720f884ea50dbf9acb22cbe5312e51d7b8c4ac6ba9b51efd9bba/torchvision-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:cef0196be31be421f6f462d1e9da1101be7332d91984caa6f8022e6c78a5877f", size = 4321911, upload-time = "2026-01-21T16:27:35.195Z" }, - { url = "https://files.pythonhosted.org/packages/52/99/dca81ed21ebaeff2b67cc9f815a20fdaa418b69f5f9ea4c6ed71721470db/torchvision-0.25.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a8f8061284395ce31bcd460f2169013382ccf411148ceb2ee38e718e9860f5a7", size = 1896209, upload-time = "2026-01-21T16:27:32.159Z" }, - { url = "https://files.pythonhosted.org/packages/28/cc/2103149761fdb4eaed58a53e8437b2d716d48f05174fab1d9fcf1e2a2244/torchvision-0.25.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:146d02c9876858420adf41f3189fe90e3d6a409cbfa65454c09f25fb33bf7266", size = 2310735, upload-time = "2026-01-21T16:27:22.327Z" }, - { url = "https://files.pythonhosted.org/packages/76/ad/f4c985ad52ddd3b22711c588501be1b330adaeaf6850317f66751711b78c/torchvision-0.25.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c4d395cb2c4a2712f6eb93a34476cdf7aae74bb6ea2ea1917f858e96344b00aa", size = 8089557, upload-time = "2026-01-21T16:27:27.666Z" }, - { url = "https://files.pythonhosted.org/packages/63/cc/0ea68b5802e5e3c31f44b307e74947bad5a38cc655231d845534ed50ddb8/torchvision-0.25.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5e6b449e9fa7d642142c0e27c41e5a43b508d57ed8e79b7c0a0c28652da8678c", size = 4344260, upload-time = "2026-01-21T16:27:17.018Z" }, - { url = "https://files.pythonhosted.org/packages/9e/1f/fa839532660e2602b7e704d65010787c5bb296258b44fa8b9c1cd6175e7d/torchvision-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:620a236288d594dcec7634c754484542dc0a5c1b0e0b83a34bda5e91e9b7c3a1", size = 1896193, upload-time = "2026-01-21T16:27:24.785Z" }, - { url = "https://files.pythonhosted.org/packages/80/ed/d51889da7ceaf5ff7a0574fb28f9b6b223df19667265395891f81b364ab3/torchvision-0.25.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:0b5e7f50002a8145a98c5694a018e738c50e2972608310c7e88e1bd4c058f6ce", size = 2309331, upload-time = "2026-01-21T16:27:19.97Z" }, - { url = "https://files.pythonhosted.org/packages/90/a5/f93fcffaddd8f12f9e812256830ec9c9ca65abbf1bc369379f9c364d1ff4/torchvision-0.25.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:632db02300e83793812eee4f61ae6a2686dab10b4cfd628b620dc47747aa9d03", size = 8088713, upload-time = "2026-01-21T16:27:15.281Z" }, - { url = "https://files.pythonhosted.org/packages/1f/eb/d0096eed5690d962853213f2ee00d91478dfcb586b62dbbb449fb8abc3a6/torchvision-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:d1abd5ed030c708f5dbf4812ad5f6fbe9384b63c40d6bd79f8df41a4a759a917", size = 4325058, upload-time = "2026-01-21T16:27:26.165Z" }, - { url = "https://files.pythonhosted.org/packages/97/36/96374a4c7ab50dea9787ce987815614ccfe988a42e10ac1a2e3e5b60319a/torchvision-0.25.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad9a8a5877782944d99186e4502a614770fe906626d76e9cd32446a0ac3075f2", size = 1896207, upload-time = "2026-01-21T16:27:23.383Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e2/7abb10a867db79b226b41da419b63b69c0bd5b82438c4a4ed50e084c552f/torchvision-0.25.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:40a122c3cf4d14b651f095e0f672b688dde78632783fc5cd3d4d5e4f6a828563", size = 2310741, upload-time = "2026-01-21T16:27:18.712Z" }, - { url = "https://files.pythonhosted.org/packages/08/e6/0927784e6ffc340b6676befde1c60260bd51641c9c574b9298d791a9cda4/torchvision-0.25.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:846890161b825b38aa85fc37fb3ba5eea74e7091ff28bab378287111483b6443", size = 8089772, upload-time = "2026-01-21T16:27:14.048Z" }, - { url = "https://files.pythonhosted.org/packages/b6/37/e7ca4ec820d434c0f23f824eb29f0676a0c3e7a118f1514f5b949c3356da/torchvision-0.25.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f07f01d27375ad89d72aa2b3f2180f07da95dd9d2e4c758e015c0acb2da72977", size = 4425879, upload-time = "2026-01-21T16:27:12.579Z" }, -] - [[package]] name = "tqdm" version = "4.67.3" @@ -4961,8 +4899,7 @@ version = "5.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or sys_platform == 'darwin' or (sys_platform == 'linux' and extra != 'extra-3-exo-cuda') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, { name = "regex", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, @@ -5089,8 +5026,8 @@ name = "uvicorn" version = "0.42.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "h11", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "click", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "h11", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e3/ad/4a96c425be6fb67e0621e62d86c402b4a17ab2be7f7c055d9bd2f638b9e2/uvicorn-0.42.0.tar.gz", hash = "sha256:9b1f190ce15a2dd22e7758651d9b6d12df09a13d51ba5bf4fc33c383a48e1775", size = 85393, upload-time = "2026-03-16T06:19:50.077Z" } wheels = [ @@ -5099,12 +5036,12 @@ wheels = [ [package.optional-dependencies] standard = [ - { name = "httptools", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "python-dotenv", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pyyaml", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "uvloop", marker = "platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'" }, - { name = "watchfiles", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "websockets", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "httptools", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "python-dotenv", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pyyaml", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "uvloop", marker = "(platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (platform_python_implementation == 'PyPy' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "watchfiles", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "websockets", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] [[package]] @@ -5135,90 +5072,90 @@ wheels = [ [[package]] name = "vllm" -version = "0.1.dev14936+gb99bedc73" +version = "0.1.dev14936+gb99bedc73.empty" source = { git = "https://github.com/hmellor/vllm.git?rev=b99bedc737166ae5ca98cb9e3534b96e0c8c69aa#b99bedc737166ae5ca98cb9e3534b96e0c8c69aa" } dependencies = [ - { name = "aiohttp", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "anthropic", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "blake3", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "cachetools", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "cbor2", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "cloudpickle", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "compressed-tensors", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "depyf", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "diskcache", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "einops", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "fastapi", extra = ["standard"], marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "filelock", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "gguf", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "ijson", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "lark", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "llguidance", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "lm-format-enforcer", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "mcp", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "mistral-common", extra = ["image"], marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'extra-3-exo-cuda') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, - { name = "model-hosting-container-standards", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "msgspec", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "ninja", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "numba", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "openai", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "openai-harmony", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opencv-python-headless", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-api", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-exporter-otlp", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-sdk", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "opentelemetry-semantic-conventions-ai", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "outlines-core", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "partial-json-parser", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pillow", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "prometheus-client", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "prometheus-fastapi-instrumentator", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "psutil", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "py-cpuinfo", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pybase64", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "python-json-logger", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pyyaml", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pyzmq", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "regex", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "requests", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "sentencepiece", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "setproctitle", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "setuptools", version = "77.0.3", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "six", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "tiktoken", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "tokenizers", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "torch", version = "2.10.0+cu130", source = { registry = "https://download.pytorch.org/whl/cu130" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "torchaudio", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "torchvision", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "tqdm", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "transformers", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "watchfiles", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "xgrammar", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "aiohttp", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "anthropic", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "blake3", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "cachetools", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "cbor2", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "cloudpickle", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "compressed-tensors", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "depyf", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "diskcache", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "einops", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "fastapi", extra = ["standard"], marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "filelock", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "gguf", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "ijson", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "lark", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "llguidance", marker = "(platform_machine != 'aarch64' and platform_machine != 'arm64' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'arm64' and sys_platform == 'linux') or (platform_machine == 'ppc64le' and sys_platform == 'linux') or (platform_machine == 's390x' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "lm-format-enforcer", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "mcp", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "mistral-common", extra = ["image"], marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "model-hosting-container-standards", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "msgspec", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "ninja", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "numpy", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "openai", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "openai-harmony", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opencv-python-headless", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-api", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-exporter-otlp", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-sdk", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "opentelemetry-semantic-conventions-ai", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "outlines-core", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "partial-json-parser", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pillow", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "prometheus-client", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "prometheus-fastapi-instrumentator", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "psutil", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "py-cpuinfo", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pybase64", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "python-json-logger", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pyyaml", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pyzmq", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "regex", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "requests", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "sentencepiece", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "setproctitle", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "setuptools", version = "77.0.3", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "six", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "tiktoken", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "tokenizers", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "tqdm", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "transformers", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "watchfiles", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "xgrammar", marker = "(platform_machine != 'aarch64' and platform_machine != 'arm64' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'arm64' and sys_platform == 'linux') or (platform_machine == 'ppc64le' and sys_platform == 'linux') or (platform_machine == 's390x' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] [[package]] name = "vllm-engine" version = "0.1.0" -source = { directory = "python/vllm_engine" } +source = { editable = "python/vllm_engine" } dependencies = [ - { name = "fastsafetensors", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "mlx-cuda-13", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "torch", version = "2.10.0+cu130", source = { registry = "https://download.pytorch.org/whl/cu130" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "vllm", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "exo-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "fastsafetensors", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "mlx-cuda-13", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "torch", version = "2.10.0", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (platform_machine == 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "torch", version = "2.10.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "torch", version = "2.10.0+cu130", source = { registry = "https://download.pytorch.org/whl/cu130" }, marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "vllm", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] [package.metadata] requires-dist = [ + { name = "exo-core", editable = "python/exo_core" }, { name = "fastsafetensors", marker = "sys_platform == 'linux'", specifier = ">=0.1.10" }, { name = "mlx-cuda-13", marker = "sys_platform == 'linux'", specifier = "==0.30.6" }, { name = "torch", marker = "platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux'", specifier = ">=2.10.0" }, { name = "torch", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'", specifier = ">=2.10.0", index = "https://download.pytorch.org/whl/cu130" }, { name = "torch", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'", specifier = ">=2.10.0", index = "https://download.pytorch.org/whl/cpu" }, - { name = "vllm", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'", git = "https://github.com/hmellor/vllm.git?rev=b99bedc737166ae5ca98cb9e3534b96e0c8c69aa" }, + { name = "vllm", marker = "sys_platform == 'linux'", git = "https://github.com/hmellor/vllm.git?rev=b99bedc737166ae5ca98cb9e3534b96e0c8c69aa" }, ] [[package]] @@ -5226,7 +5163,7 @@ name = "watchfiles" version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "anyio", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } wheels = [ @@ -5337,11 +5274,14 @@ name = "xgrammar" version = "0.1.29" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "pydantic", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "torch", version = "2.10.0+cu130", source = { registry = "https://download.pytorch.org/whl/cu130" }, marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "transformers", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "pydantic", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "torch", version = "2.10.0", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (platform_machine == 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "torch", version = "2.10.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "torch", version = "2.10.0+cu130", source = { registry = "https://download.pytorch.org/whl/cu130" }, marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "transformers", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "triton", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench') or (sys_platform != 'linux' and extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or (extra == 'extra-3-exo-cuda' and extra == 'project-9-exo-bench')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/02/a3/70dbe3ffd331a1e7e1ad5a95690a4086e6c7cdb8089f5c7eda712219ccec/xgrammar-0.1.29.tar.gz", hash = "sha256:cf195afa81b489eebf35d4c6f37f27136d05420739ab4a6f7f065c938d7e4baa", size = 2321317, upload-time = "2025-12-19T08:23:54.53Z" } wheels = [