Compare commits

..

2 commits

Author SHA1 Message Date
49a7756a01 docs: add CHANGELOG and ship LICENSE/CHANGELOG in the archive
- Add CHANGELOG.md (Keep a Changelog format) with a 0.1.0 entry summarizing
  the initial release plus the recent healthcheck fix, image pin, and
  profile-naming changes.
- Add LICENSE and CHANGELOG.md to the build_archive.py manifest so the
  distributable tarball actually contains the license and history.
- Expand the README license section to the full MIT + copyright line.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 10:36:14 +02:00
946de07d47 build: make pyproject the single source of dependency truth
requirements.txt / requirements-dev.txt used to duplicate the dependency
pins from pyproject.toml by hand, which can silently drift. Point them at
the package itself (`.` and `-e .[dev]`) so the pins live in exactly one
place; `pip install -r requirements*.txt` keeps working.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 10:36:00 +02:00
5 changed files with 62 additions and 12 deletions

47
CHANGELOG.md Normal file
View file

@ -0,0 +1,47 @@
# Changelog
All notable changes to this project are documented here.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [0.1.0] - 2026-07-07
Initial release. Replaces the previous collection of shell scripts
(`start-llm-server.sh`, `status-llm-server.sh`, `switch-llm.sh`, …) with a
single Python package.
### Added
- CLI to start, check, stop, and switch (`--change`) `llama.cpp` OpenAI-compatible
Docker server instances, plus `--chat` and `--dry-run`.
- Layered configuration (builtin defaults → `[default]``[model.<profile>]`
CLI overrides) with `[prompt.<profile>]` fallback system prompts and
`${ENV}`/`~` expansion.
- Security-hardened prompt input layer for `--system-*`/`--prompt-*`: file reads
limited to regular UTF-8 files with a size cap and symlink rejection; URL reads
are HTTPS-only with SSRF defenses (IP-literal and private/loopback/link-local/
metadata blocking, DNS pinning against rebinding, no-credentials URLs, redirect
re-validation, content-type allowlist, streaming size limit).
- Loopback-only port publishing by default; `--expose` + `--api-key` for LAN use.
- Readiness check via a real chat completion (not just an open port) and an
exclusive non-blocking file lock for `--change`.
- MIT `LICENSE`, man page, and an opt-in end-to-end smoke test (`scripts/smoke.sh`).
- Continuous integration on Forgejo: `pytest` (Python 3.10 and 3.12), `ruff`,
and `mypy`.
### Changed
- Pin the default `llama.cpp` Docker image by digest for reproducibility instead
of the moving `:server-cuda` tag.
- Model-size profile names carry a `b` suffix (`qwen35b`, `qwen27b`) so the digits
read as parameter count, not Qwen version; documentation examples run against
the `[default]` section so they work by copy & paste.
### Fixed
- Override the image's baked-in Docker `HEALTHCHECK` (hardcoded to port 8080) so
it targets the configured `container_port`, ending the false "unhealthy" status
when the server runs on a different port.
[Unreleased]: https://kitux.de/forgejo/dschlueter/llamacppctl/compare/v0.1.0...HEAD
[0.1.0]: https://kitux.de/forgejo/dschlueter/llamacppctl/releases/tag/v0.1.0

View file

@ -177,4 +177,6 @@ SMOKE_GPU=1 scripts/smoke.sh
## Lizenz ## Lizenz
MIT MIT License
Copyright (c) 2026 Dieter Schlueter

View file

@ -44,6 +44,8 @@ from pathlib import Path
REQUIRED_FILES = [ REQUIRED_FILES = [
"pyproject.toml", "pyproject.toml",
"README.md", "README.md",
"LICENSE",
"CHANGELOG.md",
"requirements.txt", "requirements.txt",
"requirements-dev.txt", "requirements-dev.txt",
"llama.cpp.config.example", "llama.cpp.config.example",
@ -83,6 +85,8 @@ INCLUDE_DIRS = ["src", "tests", "docs", "man", "scripts"]
INCLUDE_FILES = [ INCLUDE_FILES = [
"pyproject.toml", "pyproject.toml",
"README.md", "README.md",
"LICENSE",
"CHANGELOG.md",
"requirements.txt", "requirements.txt",
"requirements-dev.txt", "requirements-dev.txt",
"llama.cpp.config.example", "llama.cpp.config.example",

View file

@ -1,7 +1,4 @@
# Development/test dependencies (mirrors [project.optional-dependencies].dev # Development install. Editable package plus the [dev] extra (pytest, ruff,
# in pyproject.toml). # mypy, ...). pyproject.toml remains the single source of truth; there is no
-r requirements.txt # manual dependency mirror to keep in sync.
pytest>=7.4 -e .[dev]
ruff>=0.6
mypy>=1.11
types-requests

View file

@ -1,4 +1,4 @@
# Runtime dependencies (mirrors [project.dependencies] in pyproject.toml). # Runtime install. pyproject.toml is the single source of truth for
# Provided for users who want to verify/install dependencies without pip's # dependencies; this file just installs the package (and thus its declared
# PEP 517 build isolation, e.g. `pip install -r requirements.txt`. # runtime dependencies) so `pip install -r requirements.txt` keeps working.
requests>=2.31,<3 .