Files
mlx-knife/CONTRIBUTING.md
T
The BROKE Team 1aad374d08 Release MLX Knife 1.1.0-beta2 - Critical Bug Fixes & Test Stability
Major fixes:
  - Issue #19: Server response truncation resolved - large context models work at full capacity
  - Issue #20: End-Token filtering in non-streaming mode - clean professional output
  - Test stability: Fixed flaky server tests, improved lifecycle management

  Technical changes:
  - Server: Dynamic token limits by default (--max-tokens None)
  - MLXRunner: Added _filter_end_tokens_from_response() for batch consistency
  - Tests: 132/132 passing + 48 comprehensive server tests
  - Documentation: Updated CHANGELOG.md, README.md, TESTING.md
2025-08-22 23:16:50 +02:00

206 lines
6.6 KiB
Markdown

# Contributing to MLX Knife
First off, thank you for considering contributing to MLX Knife! It's people like you who make MLX Knife such a great tool for the Apple Silicon ML community.
## 🦫 About The BROKE Team
We're a small team passionate about making MLX models accessible and easy to use on Apple Silicon. We welcome contributions from everyone who shares this vision.
## How Can I Contribute?
### Reporting Bugs
Before creating bug reports, please check existing issues to avoid duplicates. When you create a bug report, include as many details as possible:
- **Use a clear and descriptive title**
- **Describe the exact steps to reproduce the problem**
- **Provide specific examples** (commands, model names, error messages)
- **Describe the behavior you observed and expected**
- **Include your system info** (macOS version, Python version, Apple Silicon chip)
### Suggesting Enhancements
Enhancement suggestions are tracked as GitHub issues. When creating an enhancement suggestion:
- **Use a clear and descriptive title**
- **Provide a detailed description** of the suggested enhancement
- **Explain why this enhancement would be useful** to MLX Knife users
- **List some examples** of how it would be used
### Pull Requests
1. Fork the repository and create your branch from `main`
2. If you've added code, add tests that cover your changes
3. Ensure the test suite passes locally: `pytest tests/`
4. Make sure your code follows the existing style: `ruff check mlx_knife/ --fix`
5. Write a clear commit message
6. Open a Pull Request with a clear title and description
## Development Setup
```bash
# Clone your fork
git clone https://github.com/mzau/mlx-knife.git
cd mlx-knife
# Install in development mode with all dependencies
pip install -e ".[dev,test]"
# Download a test model (required for full test suite)
mlxk pull mlx-community/Phi-3-mini-4k-instruct-4bit
# Run tests
pytest
# Check code style
ruff check mlx_knife/
mypy mlx_knife/
# Test with a real model
mlxk run Phi-3-mini "Hello world"
```
## Repository Structure
Understanding what goes where:
```
Repository structure:
├── mlx_knife/ # Python package (→ PyPI)
├── tests/ # Test suite
├── simple_chat.html # Web interface (GitHub only)
├── README.md # User documentation
├── CONTRIBUTING.md # This file
├── TESTING.md # Testing guide
├── pyproject.toml # Build configuration
└── requirements.txt # Dependencies
```
**What goes where:**
- **PyPI Package**: Only `mlx_knife/` + build files (`pyproject.toml`, `requirements.txt`)
- **GitHub Repository**: Everything else (documentation, tests, web interface)
This helps ensure contributors commit files to the right place and understand the package vs. repository distinction.
## Testing Requirements
**Important**: MLX Knife requires Apple Silicon hardware for testing. Tests must be run locally on M1/M2/M3 Macs.
### Why Local Testing?
- MLX framework only runs on Apple Silicon
- Tests use real MLX models (4GB+) for realistic validation
- This ensures tests reflect actual usage, not mocked behavior
- Standard practice for MLX projects
### Running Tests
**Prerequisites:**
1. Apple Silicon Mac (M1/M2/M3)
2. Python 3.9 or newer
3. At least one MLX model installed:
```bash
mlxk pull mlx-community/Phi-3-mini-4k-instruct-4bit
```
**Test Commands:**
```bash
# Run all tests
pytest
```
For detailed testing options, troubleshooting, and advanced workflows, see **[TESTING.md](TESTING.md)**.
### Before Submitting PRs
Please ensure all tests pass locally:
```bash
# Complete test workflow
ruff check mlx_knife/ --fix # Fix code style
mypy mlx_knife/ # Check types
pytest tests/ # Run all tests
```
Since we don't have CI/CD (MLX requires Apple Silicon), we rely on contributors to verify their changes locally. Please mention in your PR:
- Which Python version you tested with
- Which Mac model you tested on (M1/M2/M3)
- Test results summary
## Python Version Requirements
**Minimum**: Python 3.9 (the native macOS version on Apple Silicon)
We prioritize compatibility with:
- **Python 3.9**: Native macOS version - MUST work
- **Newer versions**: Should work, but 3.9 is our baseline
You don't need to test on all Python versions! Just test with what you have:
- If you have native macOS Python 3.9: Perfect! That's our main target
- If you have a newer version: Great, test with that
- Multiple versions installed? Bonus, but not required
Mention your Python version in the PR description.
## Development Workflow
1. **Before starting work:**
- Check if an issue exists for your change
- If not, open an issue to discuss the change
- For major changes, wait for feedback before starting
2. **While working:**
- Keep changes focused and atomic
- Write descriptive commit messages
- Add/update tests as needed
- Update documentation if needed
3. **Before submitting:**
- Run the full test suite locally: `pytest tests/`
- Run code quality checks: `ruff check mlx_knife/ --fix`
- Test with YOUR Python version (3.9+ required)
- Update README.md if you've added features
## Testing
MLX Knife has comprehensive test coverage. For detailed testing documentation including advanced options, test structure, and troubleshooting, see **[TESTING.md](TESTING.md)**.
**When adding new tests**: Please update the test structure documentation in **[TESTING.md](TESTING.md)** if you add new test files or categories.
## Code Style
- We use `ruff` for formatting and linting
- Type hints are encouraged (checked with `mypy`)
- Follow existing patterns in the codebase
- **IMPORTANT**: Keep Python 3.9 compatibility!
- Use `Union[str, List[str]]` not `str | List[str]`
- Use `Optional[str]` not `str | None`
- Import from `typing` module for type hints
- Test with native macOS Python if possible
## Documentation
- Update docstrings for new functions/classes
- Update README.md for user-facing changes
- Keep CLI help text (`--help`) up to date
- Add comments for complex logic
## Recognition
Contributors who submit accepted PRs will be:
- Added to a CONTRIBUTORS.md file (once we have contributors!)
- Mentioned in release notes
- Forever part of MLX Knife history 🦫
## Questions?
Feel free to open an issue with the "question" label or start a discussion. We're here to help!
## License
By contributing, you agree that your contributions will be licensed under the MIT License.
---
**Thank you for contributing to MLX Knife!**
Every contribution, no matter how small, makes a difference. Whether it's fixing a typo, adding a test, or implementing a new feature - we appreciate your time and effort.