feat: harden and extend the CLI (security, UX, robustness, tests)
Sieben Verbesserungen; die Dateien überschneiden sich thematisch, daher ein Commit (jeder Commit bleibt grün: 115 Tests). - #1 --check ist scriptbar: Exit 0 wenn Container läuft und erreichbar, sonst 5 (check_exit_code / CheckResult). - #2 --force implementiert: Bypass eines belegten Locks mit Warnung (_container_lock) und stop_container(force=…) schluckt Inkonsistenzen. - #3 stille Trunkierung behoben: chat_completion_text liefert ChatReply (content + finish_reason); bei finish_reason=length Hinweis auf stderr, --chat gibt Exit 1 bei leerem Content zurück. - #4 keine vermeidbare Downtime: --change validiert den Modellpfad VOR dem Entfernen des laufenden Containers. - #5 Netzwerk dicht: Port-Publish standardmäßig nur auf 127.0.0.1 (--expose/expose für alle Interfaces), optionaler --api-key/api_key (Server --api-key + Bearer-Token auf allen Requests). - #6 --stream: Chat-Reply token-weise via SSE auf stdout (stream_chat). - #7 tests/test_actions.py: Orchestrierungs-Ebene (dry-run-Nebenwirkungen, Lock, validate-before-remove, chat/stream/exit-codes). Doku aktualisiert (Manpage, README, llama.cpp.config.example). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
3158d16f9b
commit
24202feee6
14 changed files with 485 additions and 32 deletions
|
|
@ -206,6 +206,30 @@ def test_chat_params_from_config(tmp_path):
|
|||
assert prompt_cfg.temperature == 0.6
|
||||
|
||||
|
||||
def test_expose_and_api_key_default_and_config(tmp_path):
|
||||
cfg_path = _write_config(tmp_path)
|
||||
server_cfg, _ = resolve_effective_config(_parse(["--start", "--config", str(cfg_path)]))
|
||||
assert server_cfg.expose is False # loopback-only default
|
||||
assert server_cfg.api_key == ""
|
||||
|
||||
cfg = CONFIG_BASIC.replace(
|
||||
"host = 0.0.0.0", "host = 0.0.0.0\nexpose = true\napi_key = s3cr3t"
|
||||
)
|
||||
cfg_path2 = _write_config(tmp_path, cfg)
|
||||
server_cfg, _ = resolve_effective_config(_parse(["--start", "--config", str(cfg_path2)]))
|
||||
assert server_cfg.expose is True
|
||||
assert server_cfg.api_key == "s3cr3t"
|
||||
|
||||
|
||||
def test_expose_cli_overrides_config(tmp_path):
|
||||
cfg = CONFIG_BASIC.replace("host = 0.0.0.0", "host = 0.0.0.0\nexpose = true")
|
||||
cfg_path = _write_config(tmp_path, cfg)
|
||||
server_cfg, _ = resolve_effective_config(
|
||||
_parse(["--start", "--config", str(cfg_path), "--no-expose"])
|
||||
)
|
||||
assert server_cfg.expose is False
|
||||
|
||||
|
||||
def test_chat_params_cli_overrides_config(tmp_path):
|
||||
cfg = CONFIG_BASIC.replace(
|
||||
"poll_interval = 2",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue