main
toml 270 lines 7.42 KB
Raw
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"]