cf7201f91e
The uv.lock is churning constantly as different UV versions bounce it between revisions. This is made worse by GitHub automatically hiding the uv.lock changes, meaning it's hard to notice when this went wrong. Set a minimum version for `uv` in pyproject.toml to fix this. I tried quite a few versions (not all) and found 0.8.6 sets the revision to 3, which I believe is the latest. This is from August 2025 so has been around for a while. Test plan: ``` jake@maverick:/data/users/jake/repos/exo/ > git checkout main uv.lock jake@maverick:/data/users/jake/repos/exo/ > nix shell github:nixos/nixpkgs/3dce7f4a77812afd69efcbfe15e5223f98c5c69e#uv --command sh -c 'uv add pip --frozen && uv lock && uv remove pip --frozen && uv lock && uv --version' Resolved 140 packages in 147ms Added pip v26.0.1 Resolved 139 packages in 48ms Removed pip v26.0.1 uv 0.8.6 ```
136 lines
3.0 KiB
TOML
136 lines
3.0 KiB
TOML
[project]
|
|
name = "exo"
|
|
version = "0.3.0"
|
|
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>=0.33.4",
|
|
"psutil>=7.0.0",
|
|
"loguru>=0.7.3",
|
|
"exo_pyo3_bindings", # rust bindings
|
|
"anyio==4.11.0",
|
|
"mlx==0.30.5; sys_platform == 'darwin'",
|
|
"mlx[cpu]==0.30.5; sys_platform == 'linux'",
|
|
"mlx-lm==0.30.6",
|
|
"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",
|
|
"pillow>=11.0,<12.0", # compatibility with mflux
|
|
"mflux==0.15.4",
|
|
"python-multipart>=0.0.21",
|
|
]
|
|
|
|
[project.scripts]
|
|
exo = "exo.main:main"
|
|
|
|
# dependencies only required for development
|
|
[dependency-groups]
|
|
dev = [
|
|
"basedpyright>=1.29.0",
|
|
"pyinstaller>=6.17.0",
|
|
"pytest>=8.4.0",
|
|
"pytest-asyncio>=1.0.0",
|
|
"pytest-env",
|
|
"ruff>=0.11.13",
|
|
]
|
|
|
|
# mlx[cuda] requires a newer version of mlx. the ideal on linux is: default to mlx[cpu] unless[cuda] specified.
|
|
[project.optional-dependencies]
|
|
# cuda = [
|
|
# "mlx[cuda]==0.26.3",
|
|
# ]
|
|
|
|
###
|
|
# workspace configuration
|
|
###
|
|
|
|
[tool.uv.workspace]
|
|
members = [
|
|
"rust/exo_pyo3_bindings",
|
|
]
|
|
|
|
[tool.uv.sources]
|
|
exo_pyo3_bindings = { workspace = true }
|
|
#mlx-lm = { git = "https://github.com/davidmcc73/mlx-lm", branch = "stable" }
|
|
# Uncomment to use local mlx/mlx-lm development versions:
|
|
# mlx = { path = "/Users/Shared/mlx", editable=true }
|
|
# mlx-lm = { path = "/Users/Shared/mlx-lm", editable=true }
|
|
|
|
[build-system]
|
|
requires = ["uv_build>=0.8.9,<0.9.0"]
|
|
build-backend = "uv_build"
|
|
|
|
###
|
|
# type-checker configuration
|
|
###
|
|
|
|
[tool.basedpyright]
|
|
include = [".venv/lib/mlx", ".venv/lib/mlx_lm", "src", "bench"]
|
|
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 = ".mlx_typings"
|
|
|
|
[[tool.basedpyright.executionEnvironments]]
|
|
root = "src"
|
|
|
|
###
|
|
# uv configuration
|
|
###
|
|
|
|
# supported platforms for this project
|
|
[tool.uv]
|
|
required-version = ">=0.8.6"
|
|
prerelease = "allow"
|
|
environments = [
|
|
"sys_platform == 'darwin'",
|
|
"sys_platform == 'linux'",
|
|
]
|
|
|
|
###
|
|
# ruff configuration
|
|
###
|
|
|
|
[tool.ruff]
|
|
extend-exclude = ["shared/protobufs/**", "*mlx_typings/**", "rust/exo_pyo3_bindings/**"]
|
|
|
|
[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'"
|
|
filterwarnings = [
|
|
"ignore:builtin type Swig:DeprecationWarning",
|
|
]
|