Thanks for looking at Personal LLM. It is a personal project, but issues and small, focused PRs are welcome.
- Tests stay offline and keyless. Every test must run with no API key, no network,
no real model, and no system binaries (Tesseract, ffmpeg). Inject fakes the way
tests/conftest.pydoes (FakeRouterwith hash-based embeddings). A PR that adds a networked test will be asked to mock it. - One concern per PR. Small and surgical beats broad and clever.
- Model calls go through the router.
router/router.pyis the only place that talks to Gemini/Ollama; new providers plug in there, nowhere else. - Interfaces stay thin. CLI / FastAPI / Streamlit are clients of the engine; logic belongs in the engine packages, not in the interface layer.
Follow the Quickstart in README.md (Python 3.12), then:
& "venv\Scripts\python" -m pytest tests/ -qAll 100 tests should pass before and after your change. CI runs the same command on every push and PR.
Architecture decisions are recorded in docs/DECISIONS/ (ADRs). If your change alters
a recorded decision, update or add an ADR in the same PR.