Files
2026-07-13 12:24:33 +08:00

136 lines
4.1 KiB
Markdown

# 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.