# Contributing 👍🎉 First off, thank you for taking the time to contribute! 🎉👍 Check out the [online docs](https://docs.lmcache.ai/developer_guide/contributing.html) for a set of guidelines for contributing. A summary of LMCache's current direction can be found at: [[Onboarding] Welcoming contributors with good first issues!](https://github.com/LMCache/LMCache/issues/627) ======= ## Becoming an LMCache Committer To become a committer, you should: - Have **more than 5 important features** merged. - Have been **contributing for longer than 3 months**. - Be [**nominated by an existing committer**](MAINTAINERS.md). ======== ## Basics of LMCache dev The default branch is `dev`. Base all new branches and pull requests against `dev`. ## Python Environment We recommend using [uv](https://docs.astral.sh/uv/) to manage Python environments and dependencies: ```bash # Create and activate a virtual environment uv venv --python 3.12 source .venv/bin/activate # Install dependencies uv pip install vllm/sglang/other engines # Install LMCache. Requires nvcc. Use --no-build-isolation to ensure torch compatibility. uv pip install -e . --no-build-isolation # For ROCm build BUILD_WITH_HIP=1 pip install -e . ``` ## Testing ### Running Tests ```bash # Run standard test suite (mirrors CI) pytest -xvs --ignore=tests/disagg \ --ignore=tests/v1/multiprocess/ \ --ignore=tests/v1/distributed/ \ --ignore=tests/skipped \ --ignore=tests/v1/storage_backend/test_eic.py # Run a single test file pytest -xvs tests/v1/test_cache_engine.py # Run a single test pytest -xvs tests/v1/test_cache_engine.py::test_function_name ``` Test dependencies: `uv pip install -r requirements/test.txt` Pytest marker: `@pytest.mark.no_shared_allocator` disables the shared-allocator monkeypatch for a test. ### Testing Practices - Write tests against the **public interface and docstring contract**, not the implementation. Test as if you don't know the internals — verify that behavior matches what the docstring describes. - Avoid accessing private members in tests unless strongly needed. - All new features and bug fixes should include corresponding tests. - Ensure existing tests still pass before submitting changes. ## Linting & Code Quality ```bash # Run all checks (mirrors CI exactly) pre-commit run --all-files # Individual tools ruff check . # Lint (E, F, B, SLF rules) ruff format . # Format (line-length 88) isort . # Import sorting (black profile, from_first=true) mypy --config-file=pyproject.toml # Type checking codespell --toml pyproject.toml # Spell checking ``` C++/CUDA files use clang-format (Google style, 80-col). Rust code in `rust/` uses `cargo fmt` and `cargo clippy`. All Python files require an `# SPDX-License-Identifier: Apache-2.0` header as the first line. ### Import Ordering Imports must follow this section-heading convention: ```python # Standard import os # Third Party import torch # First Party from lmcache.v1.config import LMCacheEngineConfig # Local from .utils import helper ``` ### SLF (Private Member Access) SLF lint rules are currently enforced by CI only in `lmcache/v1/multiprocess/` and `lmcache/v1/distributed/`. However, **all new code should follow SLF discipline regardless of location** — never access private members (prefixed with `_`) of other classes. Treat this as a project-wide coding standard for any new or modified code. ## Coding Conventions ### Type Hints All functions and methods must have type hints for arguments and return values. ### Docstrings Every public function and method must have a clear docstring covering: - What the function does - Arguments (with types and descriptions) - Return values - Raised exceptions (if any) - Additional notes when behavior is non-obvious ### Encapsulation Never access private members (prefixed with `_`) of other classes. Interact only through their public API. ### Code Organization - **Module-level helper functions** go at the top of the file (after imports, before classes). - **Private/helper methods** within a class go at the end of the class, after all public methods.