Hermes Agent w praktyce — raporty z homelabu, kod i dokumenty

Codzienny raport z Proxmoxa przez klucz SSH z wymuszonym poleceniem, pomoc przy kodzie w repozytorium i porządkowanie dokumentów — lokalnie, z Gemmą 4.

Agent jest zainstalowany, rozmawia z lokalnym modelem i odpowiada na Telegramie. Czas dać mu pracę. W tej części zbudujesz trzy automatyzacje, które na co dzień oszczędzają najwięcej czasu, każdą z granicami bezpieczeństwa dopasowanymi do ryzyka.

Raport z homelabu co rano

Cel: codziennie o 7:00 dostajesz na Telegram krótkie podsumowanie stanu labu. Pule ZFS, wolne miejsce, zatrzymane maszyny, ostatnie backupy i aktualizacje, a przy problemie — co dokładnie wymaga uwagi.

Nie dajemy agentowi konta na serwerze. Proxmox udostępni jeden skrypt tylko do odczytu, a klucz SSH agenta nie pozwoli uruchomić niczego innego — nawet jeśli model źle zrozumie polecenie albo ktoś spróbuje go zmanipulować.

Skrypt raportu na Proxmoxie

/usr/local/bin/lab-status
#!/usr/bin/env bash
# Raport stanu homelabu — wyłącznie odczyt.
# Uruchamiany przez klucz SSH z wymuszonym poleceniem (command=... w authorized_keys).
set -uo pipefail
section() { printf '\n## %s\n' "$1"; }
echo "# $(hostname -f) — $(date '+%F %T')"
section "Uptime i obciążenie"
uptime
section "ZFS"
zpool status -x
zpool list -o name,size,alloc,free,cap,frag,health
section "Magazyny Proxmox"
pvesm status
section "Maszyny wirtualne"
qm list
section "Kontenery LXC"
pct list
section "Snapshoty (Sanoid)"
sanoid --monitor-snapshots 2>&1 || true
section "Ostatnie backupy vzdump"
for log in $(ls -1t /tank/backup/dump/*.log 2>/dev/null | head -5); do
printf '%s: %s\n' "$(basename "$log")" "$(tail -n 1 "$log")"
done
section "Aktualizacje"
echo "Pakiety do aktualizacji: $(apt list --upgradable 2>/dev/null | tail -n +2 | wc -l)"
section "SMART"
for disk in /dev/disk/by-id/ata-* /dev/disk/by-id/nvme-*; do
[[ -e "$disk" && "$disk" != *-part* ]] || continue
printf '%s: %s\n' "$(basename "$disk")" \
"$(smartctl -H "$disk" 2>/dev/null | awk -F': *' '/overall-health|Health Status/ {print $2}')"
done
Na hoście Proxmox
chmod 755 /usr/local/bin/lab-status
/usr/local/bin/lab-status # sprawdź, czy wszystkie sekcje działają

Proxmox codziennie odświeża listę pakietów (pve-daily-update), więc sekcja aktualizacji jest aktualna bez uruchamiania apt update w skrypcie.

Klucz z wymuszonym poleceniem

Na stacji roboczej wygeneruj osobny klucz dla agenta. Hasło zostaw puste — agent działa bez nadzoru, a klucz i tak pozwoli tylko na jeden skrypt:

PowerShell na stacji roboczej
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\hermes_lab" -C "hermes-raport"
Get-Content "$env:USERPROFILE\.ssh\hermes_lab.pub"

Na Proxmoxie dopisz klucz publiczny do /root/.ssh/authorized_keys z ograniczeniami przed kluczem:

/root/.ssh/authorized_keys (jedna linia)
restrict,command="/usr/local/bin/lab-status",from="192.168.1.50" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...reszta-klucza hermes-raport
  • command="…" — niezależnie od tego, co klient chce uruchomić, serwer wykona tylko skrypt raportu.
  • restrict — wyłącza przekierowanie portów, agenta SSH, X11 i terminal. Klucz nie posłuży nawet do tunelu.
  • from="…" — klucz działa tylko z adresu stacji roboczej (wstaw jej adres w LAN).

Wpis w konfiguracji SSH na stacji roboczej skraca polecenie do jednego słowa:

%USERPROFILE%.ssh\config
Host pve1-raport
HostName 192.168.1.10
User root
IdentityFile ~/.ssh/hermes_lab
IdentitiesOnly yes
Okno terminala
ssh pve1-raport # wypisze raport
ssh pve1-raport hostname # też wypisze raport, a nie nazwę hosta — polecenie klienta jest ignorowane

Zadanie w harmonogramie

Najpierw sprawdź zadanie ręcznie w rozmowie z agentem:

Uruchom polecenie `ssh pve1-raport` i na podstawie wyniku przygotuj krótki raport o stanie homelabu.

Przy pierwszym uruchomieniu Hermes może zapytać o zgodę na polecenie — wybierz zawsze, żeby dopisać je do listy dozwolonych. Zadania z harmonogramu działają z cron_mode: deny i nie mają kogo zapytać, więc bez tego wpisu zostałyby zablokowane.

Teraz harmonogram:

Codzienny raport o 7:00
hermes cron create "every day at 7am" "Uruchom polecenie 'ssh pve1-raport' i przeanalizuj wynik. Wyślij raport po polsku, maksymalnie 8 linii. Na początku jedno słowo: OK, UWAGA albo AWARIA. Wymień tylko to, co wymaga działania: pule ZFS inne niż healthy lub zajęte powyżej 80%, zatrzymane maszyny z onboot, nieudane backupy, dyski z SMART innym niż PASSED/OK, więcej niż 20 aktualizacji. Jeśli wszystko jest w porządku, napisz tylko: OK — homelab działa poprawnie." --deliver telegram
hermes cron list

Treść zadania to prompt dla modelu. Im precyzyjniej opiszesz progi i format, tym bardziej przewidywalny raport. Bramka musi działać (hermes gateway start), żeby wynik dotarł na Telegram.

Pomoc przy kodzie

Hermes czyta i edytuje pliki, uruchamia testy i polecenia gita. Z lokalnym modelem 12B najlepiej sprawdza się w małych, dobrze opisanych zadaniach: napisanie funkcji, test do istniejącego kodu, wyjaśnienie modułu, refaktoryzacja jednego pliku, skrypt administracyjny.

Zasady, które oszczędzają frustracji:

  1. Zawsze pracuj na gałęzi i czystym drzewie gita. Zanim zaczniesz: git switch -c agent/opis-zadania. Zmiany agenta ocenisz przez git diff i odrzucisz jednym git restore ..
  2. Uruchamiaj agenta w katalogu projektu (cd D:\projekty\moj-projekt; hermes), a w poleceniu podawaj ścieżki plików. Model 12B nie przeszuka sprawnie dużego repozytorium „na ślepo”.
  3. Jedno zadanie na sesję. Długa rozmowa zjada kontekst 64K. Po zakończeniu zadania zacznij nową sesję.
  4. Weryfikacja należy do Ciebie. Poproś agenta o uruchomienie testów, ale przeczytaj diff przed commitem.

Przykładowe polecenie, które działa dobrze:

Przeczytaj src/utils/posts.ts. Funkcja readingTime liczy słowa w blokach kodu jako połowę.
Dodaj obsługę bloków MDX (komponenty <ProductBox> i <Callout>) tak, żeby tekst wewnątrz Callout
był liczony normalnie, a same znaczniki pomijane. Nie zmieniaj innych funkcji.
Na koniec pokaż mi git diff.

Konkretny plik, konkretna funkcja, jasne kryterium i ograniczenie zakresu — to różnica między agentem, który pomaga, a agentem, który „poprawia” pół projektu.

Przetwarzanie dokumentów

To zastosowanie, w którym lokalny model ma największą przewagę nad chmurą: umowy, faktury, notatki ze spotkań, dokumentacja medyczna — nic nie opuszcza komputera.

Utwórz katalog roboczy, np. D:\Dokumenty\do-przejrzenia, i rozmawiaj z agentem w terminalu na stacji roboczej, nie przez Telegram — treść dokumentów nie powinna przechodzić przez serwery komunikatora.

Przykładowe zadania
Przeczytaj wszystkie pliki .md i .txt w D:\Dokumenty\do-przejrzenia\notatki.
Dla każdego napisz trzy zdania streszczenia i listę zadań do zrobienia z terminami.
Zapisz wynik w D:\Dokumenty\do-przejrzenia\podsumowanie.md.
W katalogu D:\Dokumenty\do-przejrzenia\skany są zdjęcia paragonów.
Odczytaj z każdego datę, sklep i kwotę brutto i zapisz jako CSV
w D:\Dokumenty\do-przejrzenia\wydatki.csv. Jeśli czegoś nie da się odczytać, wpisz BRAK.

Gemma 4 rozumie obrazy, więc zdjęcia i skany odczyta bezpośrednio. Pliki PDF z warstwą tekstową najprościej przekonwertować wcześniej do tekstu. Wyniki traktuj jak pracę stażysty: szybko, ale sprawdź kwoty i daty, zanim na ich podstawie cokolwiek zapłacisz lub wyślesz.

Pamięć agenta

Hermes zapamiętuje ustalenia między sesjami: preferencje, nazwy maszyn, konwencje w projektach. Ułatw mu to od razu, np. poleceniem: „Zapamiętaj: mój homelab to Proxmox pve1 (192.168.1.10) z pulą ZFS tank. Raporty i odpowiedzi piszemy po polsku, krótko. Kod formatuję tabulatorami.” Kolejne rozmowy nie będą wymagały powtarzania kontekstu.

Zawartość pamięci możesz w każdej chwili przejrzeć i poprawić — to zwykłe pliki w %LOCALAPPDATA%\hermes\.

Podsumowanie serii

Masz kompletny, lokalny stos AI:

  • Gemma 4 12B w całości w 16 GB VRAM z kontekstem 64K, z zapasem pamięci,
  • LM Studio jako serwer API działający w tle,
  • Hermes Agent z pamięcią, zatwierdzaniem poleceń i dostępem z telefonu,
  • automatyzacje z granicami dopasowanymi do ryzyka: raport z homelabu przez klucz z wymuszonym poleceniem, praca z kodem na gałęziach gita, dokumenty tylko lokalnie.

Wszystko bez abonamentu i bez wysyłania prywatnych danych do chmury. Ta sama maszyna w wolnych chwilach zamienia się w domowy serwer gier — o tym w następnej kategorii.