| 1 | [build-system] |
| 2 | # Should be mirrored in requirements/build/cuda.txt |
| 3 | requires = [ |
| 4 | "cmake>=3.26.1", |
| 5 | "ninja", |
| 6 | "packaging>=24.2", |
| 7 | "setuptools>=77.0.3,<81.0.0", |
| 8 | "setuptools-scm>=8.0", |
| 9 | "setuptools-rust>=1.9.0", |
| 10 | "torch == 2.13.0", |
| 11 | "wheel", |
| 12 | "jinja2", |
| 13 | ] |
| 14 | build-backend = "setuptools.build_meta" |
| 15 | |
| 16 | [project] |
| 17 | name = "vllm" |
| 18 | authors = [{name = "vLLM Team"}] |
| 19 | license = "Apache-2.0" |
| 20 | license-files = ["LICENSE"] |
| 21 | readme = "README.md" |
| 22 | description = "A high-throughput and memory-efficient inference and serving engine for LLMs" |
| 23 | classifiers = [ |
| 24 | "Programming Language :: Python :: 3.10", |
| 25 | "Programming Language :: Python :: 3.11", |
| 26 | "Programming Language :: Python :: 3.12", |
| 27 | "Programming Language :: Python :: 3.13", |
| 28 | "Programming Language :: Python :: 3.14", |
| 29 | "Intended Audience :: Developers", |
| 30 | "Intended Audience :: Information Technology", |
| 31 | "Intended Audience :: Science/Research", |
| 32 | "Topic :: Scientific/Engineering :: Artificial Intelligence", |
| 33 | "Topic :: Scientific/Engineering :: Information Analysis", |
| 34 | ] |
| 35 | requires-python = ">=3.10,<3.15" |
| 36 | dynamic = [ "version", "dependencies", "optional-dependencies"] |
| 37 | |
| 38 | [project.urls] |
| 39 | Homepage="https://github.com/vllm-project/vllm" |
| 40 | Documentation="https://docs.vllm.ai/en/latest/" |
| 41 | Slack="https://slack.vllm.ai/" |
| 42 | |
| 43 | [project.scripts] |
| 44 | vllm = "vllm.entrypoints.cli.main:main" |
| 45 | |
| 46 | [project.entry-points."vllm.general_plugins"] |
| 47 | lora_filesystem_resolver = "vllm.plugins.lora_resolvers.filesystem_resolver:register_filesystem_resolver" |
| 48 | lora_hf_hub_resolver = "vllm.plugins.lora_resolvers.hf_hub_resolver:register_hf_hub_resolver" |
| 49 | |
| 50 | [tool.setuptools_scm] |
| 51 | # no extra settings needed, presence enables setuptools-scm |
| 52 | |
| 53 | [tool.setuptools.packages.find] |
| 54 | where = ["."] |
| 55 | include = ["vllm*"] |
| 56 | |
| 57 | [tool.ruff.lint.per-file-ignores] |
| 58 | # `vllm` is the only installed package; everything else is standalone scripts |
| 59 | "!vllm/**" = ["INP"] |
| 60 | "vllm/third_party/**" = ["ALL"] |
| 61 | "vllm/version.py" = ["F401"] |
| 62 | "vllm/_version.py" = ["ALL"] |
| 63 | # test args are mostly pytest fixtures, which don't benefit from descriptions |
| 64 | "tests/**" = ["D417"] |
| 65 | |
| 66 | [tool.ruff.lint] |
| 67 | select = [ |
| 68 | # pydocstyle |
| 69 | "D", |
| 70 | # pycodestyle |
| 71 | "E", |
| 72 | # Pyflakes |
| 73 | "F", |
| 74 | # pyupgrade |
| 75 | "UP", |
| 76 | # flake8-bugbear |
| 77 | "B", |
| 78 | # flake8-implicit-str-concat |
| 79 | "ISC", |
| 80 | # flake8-simplify |
| 81 | "SIM", |
| 82 | # isort |
| 83 | "I", |
| 84 | # flake8-logging-format |
| 85 | "G", |
| 86 | # flake8-no-pep420 |
| 87 | "INP", |
| 88 | ] |
| 89 | ignore = [ |
| 90 | # don't enforce that everything has a docstring |
| 91 | "D100", "D101", "D102", "D103", "D104", "D105", "D106", "D107", |
| 92 | # unwanted pydocstyle rules |
| 93 | "D205", "D209", "D301", "D400", "D401", "D404", "D415", |
| 94 | # incompatible pydocstyle pairs; pin the half `ruff` already picks |
| 95 | "D203", "D213", |
| 96 | # star imports |
| 97 | "F405", "F403", |
| 98 | # lambda expression assignment |
| 99 | "E731", |
| 100 | # zip without `strict=` |
| 101 | "B905", |
| 102 | # Loop control variable not used within loop body |
| 103 | "B007", |
| 104 | # f-string format |
| 105 | "UP032", |
| 106 | ] |
| 107 | |
| 108 | [tool.ruff.lint.pydocstyle] |
| 109 | ignore-var-parameters = true |
| 110 | |
| 111 | [tool.ruff.format] |
| 112 | docstring-code-format = true |
| 113 | |
| 114 | [tool.mypy] |
| 115 | plugins = ['pydantic.mypy'] |
| 116 | ignore_missing_imports = true |
| 117 | check_untyped_defs = true |
| 118 | follow_imports = "silent" |
| 119 | |
| 120 | [[tool.mypy.overrides]] |
| 121 | module = "tests.*" |
| 122 | disable_error_code = ["arg-type", "assignment"] |
| 123 | enable_error_code = ["method-assign"] |
| 124 | |
| 125 | [tool.pytest.ini_options] |
| 126 | markers = [ |
| 127 | "slow_test", |
| 128 | "skip_global_cleanup", |
| 129 | "core_model: enable this model test in each PR instead of only nightly", |
| 130 | "hybrid_model: models that contain mamba layers (including pure SSM and hybrid architectures)", |
| 131 | "cpu_model: enable this model test in CPU tests", |
| 132 | "cpu_test: mark test as CPU-only test", |
| 133 | "split: run this test as part of a split", |
| 134 | "distributed: run this test only in distributed GPU tests", |
| 135 | "optional: optional tests that are automatically skipped, include --optional to run them", |
| 136 | ] |
| 137 | |
| 138 | [tool.coverage.run] |
| 139 | # Track the installed vllm package (this is what actually gets imported during tests) |
| 140 | # Use wildcard pattern to match the installed location |
| 141 | source = ["vllm", "*/dist-packages/vllm", "*/site-packages/vllm"] |
| 142 | omit = [ |
| 143 | "*/tests/*", |
| 144 | "*/test_*", |
| 145 | "*/__pycache__/*", |
| 146 | "*/build/*", |
| 147 | "*/dist/*", |
| 148 | "*/vllm.egg-info/*", |
| 149 | "*/third_party/*", |
| 150 | "*/examples/*", |
| 151 | "*/benchmarks/*", |
| 152 | "*/docs/*", |
| 153 | ] |
| 154 | |
| 155 | [tool.coverage.paths] |
| 156 | # Map all possible vllm locations to a canonical "vllm" path |
| 157 | # This ensures coverage.combine properly merges data from different test runs |
| 158 | source = [ |
| 159 | "vllm", |
| 160 | "/vllm-workspace/src/vllm", |
| 161 | "/vllm-workspace/vllm", |
| 162 | "*/site-packages/vllm", |
| 163 | "*/dist-packages/vllm", |
| 164 | ] |
| 165 | |
| 166 | [tool.coverage.report] |
| 167 | exclude_lines = [ |
| 168 | 'pragma: no cover', |
| 169 | 'def __repr__', |
| 170 | 'if self.debug:', |
| 171 | 'if settings.DEBUG', |
| 172 | 'raise AssertionError', |
| 173 | 'raise NotImplementedError', |
| 174 | 'if 0:', |
| 175 | 'if __name__ == .__main__.:', |
| 176 | 'class .*\bProtocol\):', |
| 177 | '@(abc\.)?abstractmethod', |
| 178 | ] |
| 179 | |
| 180 | [tool.coverage.html] |
| 181 | directory = "htmlcov" |
| 182 | |
| 183 | [tool.coverage.xml] |
| 184 | output = "coverage.xml" |
| 185 | |
| 186 | [tool.ty.src] |
| 187 | respect-ignore-files = true |
| 188 | |
| 189 | [tool.ty.environment] |
| 190 | python = "./.venv" |
| 191 | |
| 192 | [tool.typos.files] |
| 193 | # these files may be written in non english words |
| 194 | extend-exclude = ["tests/models/fixtures/*", "tests/prompts/*", "tests/tokenizers_/*", |
| 195 | "benchmarks/sonnet.txt", "rust/src/bench/src/datasets/sonnet.txt", |
| 196 | "tests/lora/data/*", "build/*", |
| 197 | "examples/pooling/token_embed/*", "tests/models/language/pooling/*", |
| 198 | "vllm/third_party/*", "vllm/entrypoints/serve/instrumentator/static/*", |
| 199 | "tests/entrypoints/speech_to_text/transcription/test_transcription_validation.py", |
| 200 | "docs/governance/process.md", "docs/assets/contributing/vllm_bench_serve_timeline.html", |
| 201 | "tests/v1/engine/test_fast_incdec_prefix_err.py", ".git/*", "csrc/cpu/sgl-kernels/*", |
| 202 | "rust/src/chat/src/renderer/deepseek_v32/fixtures/*", "rust/src/parser/**", |
| 203 | "rust/src/text/src/output/decoded.rs", |
| 204 | "rust/src/tokenizer/src/incremental.rs"] |
| 205 | ignore-hidden = false |
| 206 | |
| 207 | [tool.typos.default] |
| 208 | extend-ignore-identifiers-re = [".*[Uu][Ee][0-9][Mm][0-9].*"] |
| 209 | |
| 210 | [tool.typos.default.extend-identifiers] |
| 211 | a63ede7 = "a63ede7" |
| 212 | bbc5b7ede = "bbc5b7ede" |
| 213 | NOOPs = "NOOPs" |
| 214 | nin_shortcut = "nin_shortcut" |
| 215 | cudaDevAttrMaxSharedMemoryPerBlockOptin = "cudaDevAttrMaxSharedMemoryPerBlockOptin" |
| 216 | sharedMemPerBlockOptin = "sharedMemPerBlockOptin" |
| 217 | |
| 218 | depthwise_seperable_out_channel = "depthwise_seperable_out_channel" |
| 219 | pard_token = "pard_token" |
| 220 | ptd_token_id = "ptd_token_id" |
| 221 | ser_de = "ser_de" |
| 222 | shared_memory_per_block_optin = "shared_memory_per_block_optin" |
| 223 | FoPE = "FoPE" |
| 224 | k_ot = "k_ot" |
| 225 | view_seperator = "view_seperator" |
| 226 | inverse_std_variences = "inverse_std_variences" |
| 227 | |
| 228 | [tool.typos.default.extend-words] |
| 229 | Hel = "Hel" |
| 230 | wether = "wether" |
| 231 | iy = "iy" |
| 232 | indx = "indx" |
| 233 | # intel cpu features |
| 234 | tme = "tme" |
| 235 | dout = "dout" |
| 236 | Pn = "Pn" |
| 237 | arange = "arange" |
| 238 | thw = "thw" |
| 239 | # temporal position ids (parallels hpos/wpos in vision RoPE) |
| 240 | tpos = "tpos" |
| 241 | subtile = "subtile" |
| 242 | HSA = "HSA" |
| 243 | setp = "setp" |
| 244 | CPY = "CPY" |
| 245 | thr = "thr" |
| 246 | Thr = "Thr" |
| 247 | PARD = "PARD" |
| 248 | pard = "pard" |
| 249 | AKS = "AKS" |
| 250 | ba = "ba" |
| 251 | fo = "fo" |
| 252 | nd = "nd" |
| 253 | eles = "eles" |
| 254 | datas = "datas" |
| 255 | ser = "ser" |
| 256 | ure = "ure" |
| 257 | VALU = "VALU" |
| 258 | # Walsh-Hadamard Transform |
| 259 | wht = "wht" |
| 260 | WHT = "WHT" |
| 261 | # Huawei Compute Architecture for Neural Networks |
| 262 | CANN = "CANN" |
| 263 | |
| 264 | [tool.uv] |
| 265 | no-build-isolation-package = ["torch"] |
| 266 | # vLLM depends on oss-harmony, a fork that ships the same `openai_harmony` |
| 267 | # module without downloading tiktoken vocabularies at runtime. Installing |
| 268 | # openai-harmony alongside it silently overwrites those files, so keep it out |
| 269 | # of every resolution; gpt-oss pulls it in transitively. |
| 270 | exclude-dependencies = ["openai-harmony"] |