← back to Exo

pyproject.toml

260 lines

[project]
name = "exo"
version = "0.3.70"
description = "Exo"
readme = "README.md"
requires-python = "==3.13.*"
dependencies = [
  "aiofiles>=24.1.0",
  "aiohttp>=3.12.14",
  "types-aiofiles>=24.1.0.20250708",
  "pydantic>=2.11.7",
  "fastapi>=0.116.1",
  "filelock>=3.18.0",
  "rustworkx>=0.17.1",
  "huggingface-hub>=1.8.0",
  "psutil>=7.0.0",
  "loguru>=0.7.3",
  "exo-rs",                          # rust bindings
  "anyio==4.11.0",
  "tiktoken>=0.12.0",                # required for kimi k2 tokenizer
  "hypercorn>=0.18.0",
  "openai-harmony>=0.0.8",
  "httpx>=0.28.1",
  "tomlkit>=0.14.0",
  "python-multipart>=0.0.21",
  "msgspec>=0.19.0",
  "zstandard>=0.23.0",
  "transformers>=5.6.2",
  "python-daemon>=3.1.2",
]

[project.scripts]
exo = "exo.main:main"

# dependencies only required for development
[dependency-groups]
dev = [
  "basedpyright>=1.29.0",
  "pyinstaller>=6.17.0",
  "playwright>=1.52.0",
  "pytest>=8.4.0",
  "pytest-asyncio>=1.0.0",
  "pytest-env",
  "ruff>=0.11.13",
]

[project.optional-dependencies]
build = ["nanobind"]
mlx-none = ["anyio"]
mlx = [
  # LOCAL MOD: 0.32.0 only exists in the RDMA fork (source build, needs Metal toolchain);
  # 0.31.2 is the newest stock PyPI wheel. Revert if upstream publishes 0.32.0 wheels.
  "mlx==0.31.2; sys_platform == 'darwin'",
  "mlx==0.32.0; sys_platform == 'linux'",
  "mlx-lm",
  "mlx-vlm>=0.3.11",
  "mflux==0.17.5",
  "torch==2.10.0; sys_platform == 'darwin'",
  "torch==2.10.0; sys_platform == 'linux'",
  "torchaudio==2.10.0; sys_platform == 'darwin'",
  "torchaudio==2.10.0; sys_platform == 'linux'",
  "torchvision==0.25.0; sys_platform == 'darwin'",
  "torchvision==0.25.0; sys_platform == 'linux'",
]
mlx-cpu = ["exo[mlx]", "mlx-cpu==0.31.2; sys_platform == 'linux'"]
mlx-cuda12 = [
  "exo[mlx]",
  "mlx-cuda-12==0.32.0; sys_platform == 'linux'",
  "nvidia-ml-py>=13.595.45",
]
mlx-cuda13 = [
  "exo[mlx]",
  "mlx-cuda-13==0.32.0; sys_platform == 'linux'",
  "nvidia-ml-py>=13.595.45",
]

###
# workspace configuration
###

[tool.uv.workspace]
members = ["rust/exo_rs", "bench", "tools"]

[tool.uv.sources]
exo-rs = { workspace = true }
mlx = [
  # LOCAL MOD (Steve Mac fleet): darwin resolves mlx from the stock PyPI wheel instead
  # of the RDMA-patched source fork — no Metal toolchain on these Macs, and the fork's
  # RDMA-over-Thunderbolt fixes don't apply to a LAN-only cluster.
  { url = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv/releases/download/mlx_cuda/mlx-0.32.0-cp313-cp313-manylinux_2_35_aarch64.whl", marker = "sys_platform == 'linux' and platform_machine == 'aarch64'" },
  { url = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv/releases/download/mlx_cuda/mlx-0.32.0-cp313-cp313-manylinux_2_35_x86_64.whl", marker = "sys_platform == 'linux' and platform_machine != 'aarch64'" },
]
mlx-cuda-12 = [
  { url = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv/releases/download/mlx_cuda/mlx_cuda_12-0.32.0-py3-none-manylinux_2_35_aarch64.whl", marker = "sys_platform == 'linux' and platform_machine == 'aarch64'" },
  { url = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv/releases/download/mlx_cuda/mlx_cuda_12-0.32.0-py3-none-manylinux_2_35_x86_64.whl", marker = "sys_platform == 'linux' and platform_machine != 'aarch64'" },
]
mlx-cuda-13 = [
  { url = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv/releases/download/mlx_cuda/mlx_cuda_13-0.32.0-py3-none-manylinux_2_35_aarch64.whl", marker = "sys_platform == 'linux' and platform_machine == 'aarch64'" },
  { url = "https://github.com/rltakashige/mlx-jaccl-fix-small-recv/releases/download/mlx_cuda/mlx_cuda_13-0.32.0-py3-none-manylinux_2_35_x86_64.whl", marker = "sys_platform == 'linux' and platform_machine != 'aarch64'" },
]
mlx-lm = { git = "https://github.com/rltakashige/mlx-lm", branch = "leo/deepseek-v4" }
mflux = { git = "https://github.com/evanev7/mflux", branch = "exo2" }
torch = [
  { index = "pytorch-cpu", marker = "sys_platform == 'linux' and extra == 'mlx-cpu' and extra != 'mlx-cuda13' and extra != 'mlx-cuda12'" },
  { index = "pytorch-cu128", marker = "sys_platform == 'linux' and extra == 'mlx-cuda12' and extra != 'mlx-cuda13' " },
  { index = "pytorch-cu130", marker = "sys_platform == 'linux' and extra == 'mlx-cuda13'" },
]
torchvision = [
  { index = "pytorch-cpu", marker = "sys_platform == 'linux' and extra == 'mlx-cpu' and extra != 'mlx-cuda13' and extra != 'mlx-cuda12'" },
  { index = "pytorch-cu128", marker = "sys_platform == 'linux' and extra == 'mlx-cuda12' and extra != 'mlx-cuda13'" },
  { index = "pytorch-cu130", marker = "sys_platform == 'linux' and extra == 'mlx-cuda13'" },
]
torchaudio = [
  { index = "pytorch-cpu", marker = "sys_platform == 'linux' and extra == 'mlx-cpu' and extra != 'mlx-cuda13' and extra != 'mlx-cuda12'" },
  { index = "pytorch-cu128", marker = "sys_platform == 'linux' and extra == 'mlx-cuda12' and extra != 'mlx-cuda13'" },
  { index = "pytorch-cu130", marker = "sys_platform == 'linux' and extra == 'mlx-cuda13'" },
]

[[tool.uv.index]]
name = "pytorch-cu130"
url = "https://download.pytorch.org/whl/cu130"
explicit = true

[[tool.uv.index]]
name = "pytorch-cu128"
url = "https://download.pytorch.org/whl/cu128"
explicit = true

[[tool.uv.index]]
name = "pytorch-cpu"
url = "https://download.pytorch.org/whl/cpu"
explicit = true

[build-system]
requires = ["uv_build>=0.8.9,<0.9.0"]
build-backend = "uv_build"

###
# type-checker configuration
###

[tool.basedpyright]
include = ["src", "bench", "tools"]
typeCheckingMode = "strict"
failOnWarnings = true

reportAny = "error"
reportUnknownVariableType = "error"
reportUnknownParameterType = "error"
reportMissingParameterType = "error"
reportMissingTypeStubs = "error"
reportInvalidCast = "error"
reportUnnecessaryCast = "error"
reportUnnecessaryTypeIgnoreComment = "error"

pythonVersion = "3.13"
pythonPlatform = "Darwin"

exclude = [
  "**/.venv",
  "**/venv",
  "**/__pycache__",
  "**/exo_scripts",
  "**/.direnv",
  "**/rust",
  "**/.github",
]
stubPath = ".typings"

[[tool.basedpyright.executionEnvironments]]
root = "src/exo/worker/engines/image"
reportMissingModuleSource = false

[[tool.basedpyright.executionEnvironments]]
root = "src"

[[tool.basedpyright.executionEnvironments]]
root = "bench"
extraPaths = ["tools/src"]

[[tool.basedpyright.executionEnvironments]]
root = "tools/src"


###
# uv configuration
###

# supported platforms for this project
[tool.uv]
required-version = ">=0.8.6"
prerelease = "allow"
environments = ["sys_platform == 'darwin'", "sys_platform == 'linux'"]
override-dependencies = ["opencv-python; python_version < '0'"]
conflicts = [
  [
    { extra = "mlx-cuda13" },
    { extra = "mlx-cuda12" },
    { extra = "mlx-cpu" },
    { extra = "mlx-none" },
  ],
]

[tool.uv.extra-build-dependencies]
miniaudio = ["setuptools", "cffi", "pycparser"]
mlx = [
  "setuptools",
  "typing-extensions",
  "nanobind",
  "pybind11",
  "wheel",
  "cmake",
  "ninja",
]
mlx-lm = ["setuptools"]
mflux = ["uv_build"]
xgrammar = [
  "nanobind",
  "setuptools",
  "scikit-build-core",
  "packaging",
  "pathspec",
]
rouge-score = ["setuptools"]
sacrebleu = ["setuptools"]
sqlitedict = ["setuptools"]
word2number = ["setuptools"]
vllm = [
  "setuptools",
  "setuptools-scm",
  "scikit-build-core",
  "jinja2",
  "wheel",
  "markupsafe",
  "typing-extensions",
  "torch",
]
fastsafetensors = ["setuptools", "pybind11"]
torch = ["typing-extensions"]
torchvision = ["torch"]
torchaudio = ["torch"]

###
# ruff configuration
###

[tool.ruff]
extend-exclude = [".typings/**", "rust/exo_rs/**", "bench/vendor/**"]

[tool.ruff.lint]
extend-select = ["I", "N", "B", "A", "PIE", "SIM"]

[tool.pytest.ini_options]
pythonpath = "."
asyncio_mode = "auto"
markers = ["slow: marks tests as slow (deselected by default)"]
env = ["EXO_TESTS=1"]
addopts = "-m 'not slow' --ignore=tests --ignore=tmp"
filterwarnings = ["ignore:builtin type Swig:DeprecationWarning"]