chore(repo): add LICENSE, CI workflow, and untrack local config

Public-repo hygiene now that the project is hosted on Forgejo:

- LICENSE: add the MIT text that pyproject.toml already declares.
- .forgejo/workflows/ci.yml: run the pytest suite on push/PR against
  Python 3.10 and 3.12, so regressions (e.g. the healthcheck port bug)
  get caught automatically.
- Untrack llama.cpp.config and gitignore it: it is a machine-specific
  runtime config that may later hold an api_key. The tracked template
  remains llama.cpp.config.example (copy it to get started).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-07-07 10:23:05 +02:00
commit d72361cbae
4 changed files with 52 additions and 79 deletions

27
.forgejo/workflows/ci.yml Normal file
View file

@ -0,0 +1,27 @@
name: CI
on:
push:
branches: [main]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# requires-python = ">=3.10"; test the floor and a recent version.
python-version: ["3.10", "3.12"]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install package with dev extras
run: pip install -e ".[dev]"
- name: Run test suite
run: pytest -q

4
.gitignore vendored
View file

@ -19,3 +19,7 @@ venv/
# Runtime lock files # Runtime lock files
*.lock *.lock
# Local runtime config (machine-specific; may hold an api_key).
# The tracked template is llama.cpp.config.example — copy it to get started.
llama.cpp.config

21
LICENSE Normal file
View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 Dieter Schlueter
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -1,79 +0,0 @@
# llama.cpp.config.example
#
# Copy this file to llama.cpp.config and adjust it for your host before
# running llamacppctl. See docs/SECURITY_AND_OPERATIONS.md for details on
# every field and on the security model for --system-url/--prompt-url.
#
# Section types:
# [default] global defaults, merged over the built-in fallbacks
# [model.<name>] a model profile, selected via --profile <name>
# [prompt.<name>] a system-prompt profile, selected via --system-prompt-profile <name>
#
# container_name is MANDATORY and must be unique per profile you intend to
# run concurrently: it is the single identity anchor for Docker naming,
# locking (--change), and --stop/--check targeting.
[default]
image = ghcr.io/ggml-org/llama.cpp:server-cuda
hf_home = ${HF_HOME}
model_path = models/qwen3/Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf
container_name = llama_cpp_server
host_port = 8001
container_port = 8000
model_alias = default_llm
gpu_device = 1
restart_policy = unless-stopped
# Groß-Profil für literarische Texte / durchdachte Reden: volles
# 256k-Kontextfenster (= n_ctx_train des Modells) und sehr lange Antworten.
# Empirisch gemessen passt der q4_0-KV-Cache dafür knapp auf EINE 24-GB-3090
# (~22,6 GB inkl. 21-GB-Modell). Bei Bedarf auf 131072/65536 senken.
ctx_size = 262144
n_predict = 32768
temp = 0.65
top_p = 0.80
top_k = 20
min_p = 0.01
repeat_penalty = 1.05
main_gpu = 0
ngl = 999
fa = true
kv_unified = true
jinja = true
reasoning = on
no_context_shift = true
cache_type_k = q4_0
cache_type_v = q4_0
batch_size = 1024
ubatch_size = 512
parallel = 1
cont_batching = true
health_endpoint = /health
models_endpoint = /v1/models
chat_endpoint = /v1/chat/completions
timeout = 300
poll_interval = 2
# Chat-Antwortbudget (Reasoning-Modell braucht viel; für lange Texte hoch):
max_tokens = 32768
# chat_temperature leer lassen -> Server-Temp (temp oben) gilt.
chat_temperature =
# Modell-Profile: erben ALLES aus [default] (Port 8001, Container
# llama_cpp_server, Alias default_llm, gpu_device 1, ctx_size 262144) und
# überschreiben NUR das Modell. Es läuft also immer ein Modell auf dem
# Standard-Port; --start/--change tauscht es aus. Wer Modelle GLEICHZEITIG
# betreiben will, gibt dem Profil zusätzlich einen eigenen container_name +
# host_port (Muster siehe llama.cpp.config.example).
[model.carnice]
model_path = models/qwen3/Carnice-Qwen3.6-MoE-35B-A3B-Q4_K_M.gguf
[model.qwen27b]
model_path = models/qwen3/Qwen3.6-27B-Uncensored-HauhauCS-Aggressive-IQ4_XS.gguf
[model.qwopus]
model_path = models/qwen3/Qwopus3.6-35B-A3B-v1-Q4_K_M.gguf
[prompt.concise]
system_prompt = Du antwortest kurz, präzise und technisch.
[prompt.coding]
system_prompt = Du bist ein erfahrener Linux-, Python- und LLM-Infrastruktur-Engineer.