[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",
    "typeguard>=4.4.4",
    "pydantic>=2.11.7",
    "base58>=2.1.1",
    "cryptography>=45.0.5",
    "fastapi>=0.116.1",
    "filelock>=3.18.0",
    "aiosqlite>=0.21.0",
    "networkx>=3.5",
    "pathlib>=1.0.1",
    "protobuf>=6.32.0",
    "rich>=14.1.0",
    "rustworkx>=0.17.1",
    "sqlmodel>=0.0.24",
    "sqlalchemy[asyncio]>=2.0.43",
    "greenlet>=3.2.4",
    "huggingface-hub>=0.33.4",
    "psutil>=7.0.0",
    "loguru>=0.7.3",
    "textual>=5.3.0",
    "exo_pyo3_bindings", # rust bindings
    "anyio==4.11.0",
    "bidict>=0.23.1",
    "mlx>=0.29.3",
    "mlx-lm>=0.28.3",
    "tiktoken>=0.12.0", # required for kimi k2 tokenizer
    "hypercorn>=0.18.0",
]

[project.scripts]
exo-master = "exo.master.main:main"
exo-worker = "exo.worker.main:main"
exo = "exo.main:main"

# dependencies only required for development
[dependency-groups]
dev = [
    "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 }
# 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"]
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]
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'"
