[project]
name = "gpustack"
version = "v0.0.0"
description = "GPUStack"
authors = [{name = "GPUStack Authors", email = "contact@gpustack.ai"}]
readme = "README.md"
requires-python = ">=3.10,<3.13"
dependencies = [
    "fastapi>=0.115.0",
    "sqlmodel>=0.0.18",
    "pydantic>=2.11.5",
    "pydantic-settings>=2.2.1",
    "setproctitle>=1.3.3",
    "inflection>=0.5.1",
    "openai>=1.31.1",
    "prometheus-client>=0.20.0",
    "colorama>=0.4.6",
    "psutil>=7.0.0",
    "requests>=2.32.3",
    "huggingface-hub>=1.0.0",
    "hf-xet>=1.3.1,<2.0.0",
    "attrs>=24.2.0",
    "aiosqlite>=0.20.0",
    "sqlalchemy[asyncio]>=2.0.38",
    "pyjwt>=2.8.0",
    "argon2-cffi>=23.1.0",
    "python-multipart>=0.0.17",
    "dataclasses-json>=0.6.7",
    "apscheduler>=3.10.4,<4.0.0",
    "asyncpg>=0.29.0",
    "httpx[socks]>=0.27.0",
    "alembic>=1.13.2",
    "importlib-resources>=6.4.0",
    "pytest-asyncio>=0.23.7",
    "truststore>=0.9.1",
    "cryptography>=43.0.0",
    "tzdata>=2024.1",
    "modelscope>=1.28",
    "uvicorn>=0.32.0",
    "transformers>=4.51.3,!=4.57.0",
    "fastapi-cdn-host>=0.8.0",
    "wmi>=1.5.1; platform_system == 'Windows'",
    "pywin32>=308; platform_system == 'Windows'",
    "packaging>=24.1",
    "psycopg2-binary>=2.9.10",
    "PyYAML>=6.0,<7.0",
    "tenacity>=9.0.0",
    "aiocache>=0.12.3",
    "aiofiles>=23.2.1",
    "aiohttp>=3.11.2",
    "python-json-logger>=3.3.0",
    "asyncmy>=0.2.10",
    "pymysql>=1.1.1",
    "pyarrow>=18.0.0,<19.0.0",
    "pandas>=2.3.0",
    "blobfile>=3.0.0",
    "aiolimiter>=1.2.1",
    "python3-saml==1.16.0",
    "lxml==5.2.1",
    "xmlsec==1.3.14",
    "pydo>=0.15.0",
    "jinja2>=3.1.6",
    "kubernetes>=33.1.0,<34.0.0",
    "kubernetes-asyncio>=33.1.0,<34.0.0",
    "msgpack>=1.1.2",
    "cachetools>=6.0.0",
    "gpustack-runner==0.1.25.post7",
    "gpustack-runtime==0.1.44.post5",
    "gpustack-higress-plugins==0.2.1.post2",
    "websockets==16.0",
    "py-radix>=1.1.0",
]

[dependency-groups]
dev = [
    "installer==0.7.0",
    "coverage[toml]>=7.5.1",
    "flake8>=7.0.0",
    "flake8-bugbear>=24.4.26",
    "black>=24.4.2",
    "pytest>=8.2.0",
    "openapi-python-client>=0.20.0",
    "httpx-aiohttp>=0.1.4",
    "deptry>=0.16.1",
    "pre-commit>=3.7.1",
    "mkdocs>=1.6.0",
    "mkdocs-material>=9.5.27",
    "shellcheck-py>=0.10.0.1",
    "twine>=5.1.1",
    "mike>=2.1.3",
    "mkdocs-glightbox>=0.4.0",
    "mkdocs-redirects>=1.2.2",
    "matplotlib>=3.10.7",
    "mkdocs-minify-plugin>=0.8.0",
]

[project.optional-dependencies]
vllm = [
    "vllm==0.10.1.1",
    "mistral_common[opencv]>=1.4.3",
    "bitsandbytes>=0.45.2",
    "timm>=1.0.15",
]
audio = [
    "numba>=0.56.0",
]
all = [
    "vllm==0.10.1.1",
    "mistral_common[opencv]>=1.4.3",
    "bitsandbytes>=0.45.2",
    "timm>=1.0.15",
]

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

[build-system]
requires = ["hatchling<1.27"]
build-backend = "hatchling.build"

[tool.hatch.build]
only-include = ["gpustack"]
artifacts = [
    "gpustack/ui",
    "gpustack/third_party"
]

[tool.black]
line-length = 88
target-version = ['py310']
skip-string-normalization = true
force-exclude = '''
/(
    .*/migrations/.*
)/
'''

[tool.uv.extra-build-dependencies]
openai-whisper = ["setuptools~=81.0.0"]
