Align Hermes context window with local 64K model profiles

This commit is contained in:
admin committed 2026-10-23 14:56:28 +02:00
1 parent 8544abd2d4
commit 0929cdb555
7 files changed
+91 -2

No files matched your search

+8
View File
@@ -1,3 +1,11 @@
# 2026-10-23 — Explizites 64K-Kontextfenster für Hermes
- `model.context_length: 65536` passend zu beiden Hauptmodellprofilen gesetzt;
verhindert den beobachteten Alias-Fallback auf 256.000 Tokens.
- Bestehende CPU-Kompressionsschwelle von 24.000 Tokens beibehalten.
- Bereitstellung, Migration und Betriebsdokumentation aktualisiert; Regression
für alte Kontextwerte, Profilabgleich und wiederholte Konfiguration ergänzt.
# 2026-10-23 — Routineprofil und Begrenzung lokaler Inferenz
- Qwen3.5-4B als Alltagsmodell, 27B als explizite Alternative und bestehendes
+3
View File
@@ -134,6 +134,9 @@ Start des llama-Dienstes geladen, nicht bei der Konfigurationsprüfung.
Die aktuellen Schutzmaßnahmen gegen endlose Modellantworten und die explizite
Umschaltung zwischen Routine- und großem Modell stehen in
[INFERENCE_LIMITS.md](docs/INFERENCE_LIMITS.md).
Hermes wird mit `model.context_length: 65536` auf das tatsächliche 64K-Fenster
beider Hauptmodellprofile eingestellt; die CPU-Kompression beginnt spätestens
bei 24.000 Tokens.
```bash
hermes-stack-model status
+37
View File
@@ -20,6 +20,43 @@ Kompatibilitätsnamen für bestehende Sitzungen erreichbar. Sie bezeichnen dann
ebenfalls das aktiv ausgewählte Modell; die tatsächliche Modelldatei zeigt
`/props.model_path`. Neue Sitzungen und entbundene Cronjobs verwenden `hermes-local`.
## Kontextgröße und Kompression
Beide Hauptmodellprofile starten mit `--ctx-size 65536`. Hermes muss dieselbe
Grenze kennen: `model.context_length: 65536` in `~/.hermes/config.yaml`.
Der lokale Alias `hermes-local` wurde bei der Live-Prüfung vom 23.10.2026 nicht
zuverlässig erkannt; Hermes meldete einen Fallback auf 256.000 Tokens.
Die explizite Grenze verhindert eine zu große Annahme bei Kontextverwaltung und
Platzplanung. Sie vergrößert weder das Modellfenster noch die GPU-Belegung.
`scripts/prepare-workstation.py --configure-hermes` setzt die Grenze bei der
Einrichtung für Routine- und großes Profil. Bei einem späteren eigenen Profil
mit anderer `--ctx-size` muss `model.context_length` entsprechend mitgeändert
werden.
Die bestehende CPU-Kompression bleibt bei `threshold: 0.5` und
`threshold_tokens: 24000`: Die absolute Obergrenze zieht die Kompression vor
die rechnerische 50-Prozent-Schwelle von 32.768 Tokens. `target_ratio: 0.2`,
Schutz der ersten drei und letzten zehn Nachrichten sowie die bestehenden
Zeitbudgets bleiben erhalten. Die Schwelle ist ein Auslöser, keine harte
Obergrenze für einzelne Nachrichten oder Werkzeugergebnisse.
Für eine bestehende Installation genügt nach Abschluss laufender Aufträge:
```bash
cp -p ~/.hermes/config.yaml ~/.hermes/config.yaml.before-context-64k
hermes config set model.context_length 65536
hermes config get model.context_length
systemctl --user restart hermes-gateway.service
```
Den Sicherungsnamen bei wiederholter Ausführung ändern, damit die frühere
Sicherung erhalten bleibt. Der Hauptmodell- und CPU-Kompressionsdienst brauchen
für diese Hermes-Einstellung keinen Neustart. Neue Sitzungen verwenden die neue
Grenze; bereits im Agentzustand gehaltene Kontextwerte sind kein verlässlicher
Nachweis. Zur Abnahme eine neue Sitzung öffnen und die Modellantwort sowie das
Gateway-Protokoll auf erneute Kontext-Fallback-Warnungen prüfen.
## Drei Schutzebenen
- Der Runner setzt `--n-predict 2048` als Serverstandard. Das ist kein harter
+3 -1
View File
@@ -106,7 +106,9 @@ verzeichnis verschieben. Das gilt auch für `LLAMA_SERVER_BIN`.
`--configure-hermes` aktualisiert mit Backup die lokalen Provider-, Vision- und
optional Kompressionseinstellungen, das 30-Minuten-Auftragsbudget und die
600-Sekunden-/2048-Token-Limits. Fremde Provider, Terminal, Plugins und andere
600-Sekunden-/2048-Token-Limits. Dabei setzt er `model.context_length: 65536`
passend zu beiden Hauptmodellprofilen. Bei CPU-Kompression bleibt die
Kompressionsschwelle auf 24.000 Tokens begrenzt. Fremde Provider, Terminal, Plugins und andere
Einstellungen bleiben bestehen. `--unpin-local-cron` löst nur bekannte lokale
Modellbindungen über die Hermes-CLI; eigene Cloud-Provider bleiben gebunden.
Die Option legt keine Cronjobs an. Vorhandene Cronjobs kommen aus dem privaten
+22
View File
@@ -1,3 +1,25 @@
# Validierung vom 2026-10-23 — Kontextabgleich
- `make test`: Syntax-/Secret-Musterprüfung und **52 Funktionstests bestanden**
(26 llama-, zehn Watchdog-, elf Workstation- und fünf Updater-Tests).
ShellCheck fehlt lokal und wurde nicht ausgeführt.
- Regression prüft Ersatz eines veralteten 256.000-Token-Werts, Abgleich mit
beiden 65.536-Token-Hauptmodellprofilen, Erhalt der 24.000-Token-
Kompressionsschwelle und unveränderten zweiten Konfigurationslauf.
- `git diff --check`: erfolgreich.
- Auf Archwork ausschließlich `model.context_length: 65536` ergänzt;
semantischer YAML-Vergleich bestätigt, dass keine andere Einstellung geändert
wurde. Private Sicherung unter
`~/.local/state/hermes-stack-maintenance/context-64k-20261023-144440/config.yaml`.
- Gateway kontrolliert neu gestartet; Hauptmodell und CPU-Kompression ohne
Neustart. `hermes config get model.context_length` liefert `65536`.
- Neue lokale Hermes-Sitzung über den Gateway antwortet korrekt mit
`HERMES_OK 323`. Seit der Aktivierung keine erneute Kontext-Fallback-Warnung
im Hermes-Fehlerprotokoll. Bestehende Plugin-/Docker-Warnungen bleiben sichtbar.
- Kein langer 64K-Dialog, keine erzwungene Kompression und kein Test des großen
Modells für diese Änderung; der Live-Nachweis gilt für die neue kurze Sitzung
mit dem aktiven Routineprofil.
# Validierung vom 2026-10-21
- `make test`: Syntax- und Secret-Musterprüfung sowie **31 Funktionstests
+2 -1
View File
@@ -96,7 +96,8 @@ def profile_config(name, paths, server_bin=""):
def configure_hermes(config, compression=False):
config.setdefault("model", {}).update(default="hermes-local", provider="custom", base_url=LOCAL_URL)
config.setdefault("model", {}).update(default="hermes-local", provider="custom",
base_url=LOCAL_URL, context_length=65536)
config.setdefault("agent", {}).update(run_budget_seconds=1800, budget_warning_ratio=0.8)
config.setdefault("providers", {}).setdefault("custom", {}).update(
request_timeout_seconds=600, stale_timeout_seconds=180)
+16
View File
@@ -58,6 +58,22 @@ class PreparationTests(unittest.TestCase):
self.assertEqual(updated["custom_providers"][1]["extra_body"]["max_tokens"], 2048)
self.assertEqual(updated["auxiliary"]["compression"]["base_url"], "http://127.0.0.1:8081/v1")
def test_context_matches_both_main_profiles_and_replaces_stale_window(self):
for previous in (None, 256000):
with self.subTest(previous=previous):
config = {"model": {"context_length": previous},
"compression": {"threshold_tokens": 24000}}
prepare.configure_hermes(config)
window = config["model"]["context_length"]
self.assertEqual(window, 65536)
for name in ("routine", "large"):
text = prepare.profile_config(name, [self.root / "weights.gguf"])
self.assertIn(f"--ctx-size {window}", text)
self.assertEqual(config["compression"]["threshold_tokens"], 24000)
before = json.dumps(config, sort_keys=True)
prepare.configure_hermes(config)
self.assertEqual(json.dumps(config, sort_keys=True), before)
def test_existing_profiles_preserved_and_explicit_selection_backed_up(self):
path = self.root / "llama.env"
path.write_text("custom tuning\n")