Feat: Hermes-Terminal (ttyd) statt AnythingLLM + AnythingLLM komplett raus

Paket B des Plans. AnythingLLM war nur ein Fallback-Chat zu Hermes; ersetzt durch das
echte interaktive Agent-Terminal (`hermes chat`, mit Tools/PC) als eingebettetes
Web-Terminal.

Box: ttyd (apt) wrappt `hermes chat`; systemd-User-Unit deploy/hermes-terminal.service
(LAN-Bind eno1:7681, apt-Default-ttyd-Dienst deaktiviert). In deploy.sh verankert.

Backend: config HERMES_TERMINAL_URL statt ANYTHINGLLM_URL/_REPO; agent_status liefert
terminal_url/terminal_reachable; maintenance ohne _anythingllm_update; system.py Dienst-Liste
zeigt "Hermes-Terminal".

Frontend: neue Terminal-Seite (iframe auf ttyd) + Nav-Tab; AgentView/AgentStatusCard/nav/api
auf Terminal umgestellt; SystemDrawer toter hermes-dashboard raus, hermes-webui -> hermes-terminal;
Guide-Texte aktualisiert.

Cleanup: deploy/hermes-webui.service + deploy/lobechat/ entfernt (LobeChat-Migration hinfaellig),
HERMES_WEBUI_URL-Env raus.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-06-27 18:23:37 +02:00
parent cf65589b93
commit dcfede7e69
23 changed files with 246 additions and 281 deletions
+6 -1
View File
@@ -19,13 +19,18 @@ fi
"$SRC/backend/.venv/bin/python" -m pip install -q --upgrade pip
"$SRC/backend/.venv/bin/python" -m pip install -q -r "$SRC/backend/requirements.txt"
# systemd-USER-Unit installieren/aktualisieren
# systemd-USER-Units installieren/aktualisieren
mkdir -p "$HOME/.config/systemd/user"
cp "$SRC/deploy/mission-control-2.service" "$HOME/.config/systemd/user/mission-control-2.service"
# Hermes-Terminal (ttyd -> `hermes chat`), in MC2 als Terminal-Seite eingebettet.
# Einmalig manuell noetig: `sudo apt install -y ttyd` + `sudo systemctl disable --now ttyd` (apt-Default-Dienst).
cp "$SRC/deploy/hermes-terminal.service" "$HOME/.config/systemd/user/hermes-terminal.service"
systemctl --user daemon-reload
systemctl --user enable mission-control-2 >/dev/null 2>&1 || true
systemctl --user enable hermes-terminal >/dev/null 2>&1 || true
loginctl enable-linger "$USER" >/dev/null 2>&1 || true
systemctl --user restart mission-control-2
command -v ttyd >/dev/null 2>&1 && systemctl --user restart hermes-terminal 2>/dev/null || true
sleep 2
echo "--- Health ---"
+21
View File
@@ -0,0 +1,21 @@
[Unit]
Description=Hermes Terminal — ttyd web terminal wrapping `hermes chat` (interaktiver Agent)
Documentation=https://github.com/tsl0922/ttyd
After=network.target
[Service]
# Exponiert die interaktive Hermes-Agent-CLI (`hermes chat`, voller Agent mit Tools/PC) als
# Web-Terminal. Wird in MC2 per iframe eingebettet (Terminal-Seite) — Ersatz fuer AnythingLLM.
#
# SICHERHEIT: --writable + LAN-Bind ohne Auth = dasselbe Trust-Modell wie das MC2-Dashboard
# (vertrautes Heim-LAN, kein Internet-Exposure). Fuer Basic-Auth: am ExecStart
# --credential <user>:<pass>
# ergaenzen (Browser fragt dann einmalig im iframe nach).
Type=simple
# --interface eno1 = LAN-Bind (box-spezifisch; eno1 traegt 192.168.178.151).
ExecStart=/usr/bin/ttyd --writable --interface eno1 --port 7681 --max-clients 2 --cwd %h/.hermes %h/.hermes/hermes-agent/venv/bin/python -m hermes_cli.main chat
Restart=always
RestartSec=3
[Install]
WantedBy=default.target
-27
View File
@@ -1,27 +0,0 @@
# systemd-USER-Unit für das standalone Hermes-WebUI (nesquena/hermes-webui).
# Eigene Oberfläche des Agenten (Chat/Sessions/Workspace/Cron/Skills/Memory).
# An 0.0.0.0:8787 gebunden, damit der Windows-PC im LAN direkt zugreifen kann
# → Passwort-Schutz aktivieren (HERMES_WEBUI_PASSWORD)!
# Ablage: ~/.config/systemd/user/hermes-webui.service ; dann:
# systemctl --user enable --now hermes-webui
# loginctl enable-linger hitonabi # läuft auch ohne aktive Session
[Unit]
Description=Hermes WebUI (standalone)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
WorkingDirectory=%h/hermes-webui
# Start über das mitgelieferte Control-Skript (siehe docs/HERMES_SETUP.md).
ExecStart=%h/hermes-webui/ctl.sh start --foreground
Environment=HERMES_WEBUI_HOST=0.0.0.0
Environment=HERMES_WEBUI_PORT=8787
Environment=HERMES_HOME=%h/.hermes
# Environment=HERMES_WEBUI_PASSWORD=... # in ~/.config/environment.d/ setzen, NICHT hier committen
Restart=on-failure
RestartSec=3
[Install]
WantedBy=default.target
-13
View File
@@ -1,13 +0,0 @@
# LobeChat-Konfiguration (auf dem Proxmox-MiniPC). Kopiere zu .env und anpassen.
# OpenAI-kompatibler Endpoint der AI-Box. Optionen:
# MC2-Gateway (empfohlen, model:auto + alle Modelle): http://192.168.178.151:9001/v1
# llama-swap direkt (nur Modell-Liste): http://192.168.178.151:8080/v1
# hermes-agent (Agent mit Tools/MCP, falls gewünscht): http://192.168.178.151:8642/v1
AI_BOX_GATEWAY=http://192.168.178.151:9001/v1
# Dummy-Key (lokale Endpoints prüfen ihn nicht):
OPENAI_API_KEY=mc2-local
# Zugangscode fürs Web-UI (PFLICHT — frei wählen):
ACCESS_CODE=bitte-aendern
-42
View File
@@ -1,42 +0,0 @@
# LobeChat — Hermes-Chat-Frontend (ersetzt nesquena/hermes-webui)
Läuft auf dem **Proxmox-MiniPC** (nicht auf der AI-Box). Schlanke client-only Edition:
kein Postgres/Auth/S3, Verlauf liegt im Browser. Spricht über LAN den OpenAI-kompatiblen
**MC2-Gateway** der AI-Box an (`:9001/v1`, liefert `model:auto` + alle llama-swap-Modelle).
## Installation (auf dem Proxmox-Host bzw. einem LXC/VM mit Docker)
```bash
# In einem LXC/VM mit Docker + compose-Plugin:
mkdir -p ~/lobechat && cd ~/lobechat
# docker-compose.yml + .env.example aus diesem Ordner herkopieren
cp .env.example .env
nano .env # ACCESS_CODE setzen, AI_BOX_GATEWAY prüfen
docker compose up -d
```
Öffnen: `http://<proxmox-ip>:3210` → Zugangscode = `ACCESS_CODE`.
## Was ist vorkonfiguriert
- **Modell-Liste** auf `Hermes-4-14B`, `Qwen3.6-35B-A3B` (fast), `Qwen3-Coder-Next`,
`Qwen3.5-122B-A10B` (heavy) und `auto` fixiert (`OPENAI_MODEL_LIST`).
- **Hermes-Standardassistent** (Modell `Hermes-4-14B` + System-Prompt) via
`DEFAULT_AGENT_CONFIG`.
## Endpoint-Wahl (in `.env`)
- **MC2-Gateway `:9001/v1`** *(Default, empfohlen)* — OpenAI-kompatibel, `model:auto`,
Token-Tracking, alle Modelle.
- **llama-swap `:8080/v1`** — direkt, ohne Routing/Token-Tracking.
- **hermes-agent `:8642/v1`** — nur falls die Chat-UI den **Agenten** (Tools/MCP/Memory)
nutzen soll; API-Kompatibilität vorher prüfen.
## Cutover (alte hermes-webui ablösen)
Auf der **AI-Box**:
```bash
systemctl --user disable --now hermes-webui
```
In MC2 den „Hermes öffnen"-Link auf LobeChat zeigen lassen:
`HERMES_WEBUI_URL=http://<proxmox-ip>:3210` (env der `mission-control-2.service`).
## Hinweis
Tool-/Function-Calls streamt llama.cpp nicht nativ — für reine Chat-Nutzung irrelevant.
Bei Bedarf an persistenter History/RAG später auf die DB-Edition (Postgres+pgvector)
umstellen.
-25
View File
@@ -1,25 +0,0 @@
# LobeChat als Hermes-Chat-Frontend — läuft auf dem Proxmox-MiniPC (Docker/LXC),
# NICHT auf der AI-Box. Spricht über LAN den OpenAI-kompatiblen MC2-Gateway der Box an.
# Client-only Edition (kein Postgres/Auth/S3) — bewusst schlank ("nicht overengineeren").
#
# Start: cp .env.example .env && $EDITOR .env && docker compose up -d
# Öffnen: http://<proxmox-ip>:3210 (Zugangscode = ACCESS_CODE)
services:
lobe-chat:
image: lobehub/lobe-chat:latest
container_name: lobe-chat
restart: unless-stopped
ports:
- "3210:3210"
environment:
# --- Provider: MC2-Gateway der AI-Box (OpenAI-kompatibel, liefert model:auto + alle Modelle) ---
- OPENAI_API_KEY=${OPENAI_API_KEY:-mc2-local}
- OPENAI_PROXY_URL=${AI_BOX_GATEWAY:-http://192.168.178.151:9001/v1}
# Modell-Auswahl auf unsere llama-swap-Modelle fixieren (-all entfernt Defaults):
- "OPENAI_MODEL_LIST=-all,+Hermes-4-14B,+Qwen3.6-35B-A3B,+Qwen3-Coder-Next,+Qwen3.5-122B-A10B,+auto"
# --- Hermes-Standardassistent (Modell + System-Prompt) ---
- "DEFAULT_AGENT_CONFIG=model=Hermes-4-14B;provider=openai;params.temperature=0.7;systemRole=Du bist Hermes, der lokale KI-Assistent dieses Homelabs. Antworte präzise, hilfsbereit und auf Deutsch, sofern nicht anders gewünscht."
# --- Zugriffsschutz im LAN (einfacher Code statt voller Auth) ---
- ACCESS_CODE=${ACCESS_CODE:?bitte in .env setzen}
- ACCESS_CODE_ENABLED=1
-1
View File
@@ -21,7 +21,6 @@ Environment=MC_MODELS_DIR=/srv/models
# Geteiltes Gedächtnis = die bestehende v1-DB (Kontinuität bis/über Cutover).
Environment=MC_MEMORY_DB=/srv/models/mission-control-memory.db
Environment=MC_ENGINE_UPDATE_CMD=/usr/local/bin/update-llamacpp
Environment=HERMES_WEBUI_URL=http://192.168.178.155:3001
Restart=on-failure
RestartSec=3