default_install_hook_types: - pre-commit - commit-msg default_stages: - pre-commit # Run locally - manual # Run in CI exclude: 'vllm/third_party/.*' repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.14.0 hooks: - id: ruff-check args: [--output-format, github, --fix] - id: ruff-format - repo: https://github.com/crate-ci/typos rev: v1.38.1 hooks: - id: typos - repo: https://github.com/pre-commit/mirrors-clang-format rev: v21.1.2 hooks: - id: clang-format exclude: 'csrc/(moe/topk_softmax_kernels.cu|quantization/gguf/(ggml-common.h|dequantize.cuh|vecdotq.cuh|mmq.cuh|mmvq.cuh))|vllm/third_party/.*' types_or: [c++, cuda] args: [--style=file, --verbose] - repo: https://github.com/igorshubovych/markdownlint-cli rev: v0.45.0 hooks: - id: markdownlint exclude: '.*\.inc\.md' stages: [manual] # Only run in CI - repo: https://github.com/rhysd/actionlint rev: v1.7.7 hooks: - id: actionlint - repo: https://github.com/astral-sh/uv-pre-commit rev: 0.9.1 hooks: - id: pip-compile args: [requirements/test.in, -o, requirements/test.txt, --index-strategy, unsafe-best-match, --torch-backend, cu128, --python-platform, x86_64-manylinux_2_28] files: ^requirements/test\.(in|txt)$ - repo: local hooks: - id: format-torch-nightly-test name: reformat nightly_torch_test.txt to be in sync with test.in language: python entry: python tools/generate_nightly_torch_test.py files: ^requirements/test\.(in|txt)$ - id: mypy-local name: Run mypy for local Python installation entry: python tools/pre_commit/mypy.py 0 "local" stages: [pre-commit] # Don't run in CI <<: &mypy_common language: python types_or: [python, pyi] require_serial: true additional_dependencies: [mypy==1.11.1, regex, types-cachetools, types-setuptools, types-PyYAML, types-requests, types-torch, pydantic] - id: mypy-3.10 # TODO: Use https://github.com/pre-commit/mirrors-mypy when mypy setup is less awkward name: Run mypy for Python 3.10 entry: python tools/pre_commit/mypy.py 1 "3.10" <<: *mypy_common stages: [manual] # Only run in CI - id: mypy-3.11 # TODO: Use https://github.com/pre-commit/mirrors-mypy when mypy setup is less awkward name: Run mypy for Python 3.11 entry: python tools/pre_commit/mypy.py 1 "3.11" <<: *mypy_common stages: [manual] # Only run in CI - id: mypy-3.12 # TODO: Use https://github.com/pre-commit/mirrors-mypy when mypy setup is less awkward name: Run mypy for Python 3.12 entry: python tools/pre_commit/mypy.py 1 "3.12" <<: *mypy_common stages: [manual] # Only run in CI - id: mypy-3.13 # TODO: Use https://github.com/pre-commit/mirrors-mypy when mypy setup is less awkward name: Run mypy for Python 3.13 entry: python tools/pre_commit/mypy.py 1 "3.13" <<: *mypy_common stages: [manual] # Only run in CI - id: shellcheck name: Lint shell scripts entry: tools/shellcheck.sh language: script types: [shell] - id: png-lint name: Lint PNG exports from excalidraw entry: tools/png-lint.sh language: script types: [png] - id: signoff-commit name: Sign-off Commit entry: bash args: - -c - | if ! grep -q "^Signed-off-by: $(git config user.name) <$(git config user.email)>" "$(git rev-parse --git-path COMMIT_EDITMSG)"; then printf "\nSigned-off-by: $(git config user.name) <$(git config user.email)>\n" >> "$(git rev-parse --git-path COMMIT_EDITMSG)" fi language: system verbose: true stages: [commit-msg] - id: check-spdx-header name: Check SPDX headers entry: python tools/check_spdx_header.py language: python types: [python] - id: check-root-lazy-imports name: Check root lazy imports entry: python tools/check_init_lazy_imports.py language: python types: [python] - id: check-filenames name: Check for spaces in all filenames entry: bash args: - -c - 'git ls-files | grep " " && echo "Filenames should not contain spaces!" && exit 1 || exit 0' language: system always_run: true pass_filenames: false - id: update-dockerfile-graph name: Update Dockerfile dependency graph entry: tools/update-dockerfile-graph.sh language: script - id: enforce-import-regex-instead-of-re name: Enforce import regex as re entry: python tools/enforce_regex_import.py language: python types: [python] pass_filenames: false additional_dependencies: [regex] # forbid directly import triton - id: forbid-direct-triton-import name: "Forbid direct 'import triton'" entry: python tools/check_triton_import.py language: python types: [python] pass_filenames: false additional_dependencies: [regex] - id: check-pickle-imports name: Prevent new pickle/cloudpickle imports entry: python tools/pre_commit/check_pickle_imports.py language: python types: [python] additional_dependencies: [regex] - id: validate-config name: Validate configuration has default values and that each field has a docstring entry: python tools/validate_config.py language: python additional_dependencies: [regex] # Keep `suggestion` last - id: suggestion name: Suggestion entry: bash -c 'echo "To bypass all the pre-commit hooks, add --no-verify to git commit. To skip a specific hook, prefix the commit command with SKIP=."' language: system verbose: true pass_filenames: false # Insert new entries above the `suggestion` entry