Fiche mémo · à garder ouverte

Toutes les commandes, dans l'ordre

Le condensé du guide : chaque commande avec la vérification qui prouve qu'elle a réussi. Aucune explication longue — la version détaillée est dans le guide complet.

Comment lire cette page

Les blocs encadrés en vert sont les vérifications : c'est la preuve que l'étape précédente a marché. Ne passez jamais à l'étape suivante sans l'avoir obtenue. Le bouton copier place la commande dans votre presse-papiers sans le $.

A.Système & préparation

A1. Se connecter au Pi

ssh romain@hermes-pi.local
Vérification
uname -m
nproc
free -h
aarch64      <- 64 bits obligatoire (jamais armv7l)
4
Mem: 16Gi (ou 8Gi, ou 4Gi)

A2. Mise à jour et outils de base

sudo apt update
sudo apt full-upgrade -y
sudo apt install -y git curl xz-utils lm-sensors
Vérification
git --version
curl --version | head -1
sensors
git version 2.4x.x
curl 8.x.x (aarch64-...)
Package id 0: +48.0°C

A3. Disque, swap, température

findmnt /
df -h /
swapon --show
cat /sys/class/thermal/thermal_zone0/temp
Vérification
/  /dev/mapper/ubuntu--vg-ubuntu--lv  ext4  <- SSD/NVMe attendu
... 48G  14G  32G  31% /
NAME      TYPE SIZE USED PRIO
/swap.img file   4G   0B
52600     <- 52,6 °C. Au-delà de 80000 : bridage thermique

B.Ollama

B1. Installer

curl -fsSL https://ollama.com/install.sh | sh
Vérification
ollama --version
systemctl is-active ollama
systemctl is-enabled ollama
curl -s http://127.0.0.1:11434/api/tags
ss -ltn | grep 11434
ollama version is 0.x.y
active
enabled
{"models":[]}
LISTEN 0 4096 127.0.0.1:11434 0.0.0.0:*    <- 127.0.0.1 = jamais exposé au réseau

B2. Régler le contexte et le maintien en mémoire

sudo systemctl edit ollama

Collez dans le fichier ouvert par nano (puis Ctrl+O, Entrée, Ctrl+X) :

[Service]
Environment="OLLAMA_KEEP_ALIVE=24h"
Environment="OLLAMA_CONTEXT_LENGTH=16384"
Environment="OLLAMA_NUM_PARALLEL=1"
sudo systemctl daemon-reload
sudo systemctl restart ollama
Vérification
systemctl show ollama -p Environment
curl -s http://127.0.0.1:11434/api/tags >/dev/null && echo "API OK"
Environment=OLLAMA_KEEP_ALIVE=24h OLLAMA_CONTEXT_LENGTH=16384 OLLAMA_NUM_PARALLEL=1
API OK

B3. Précharger le modèle

curl -s http://127.0.0.1:11434/api/generate -d '{"model":"qwen3:4b","keep_alive":"24h"}' | head -c 200
Vérification
ollama ps
NAME        SIZE     PROCESSOR   CONTEXT   UNTIL
qwen3:4b    3.6 GB   100% CPU    16384     23 hours from now

C.Le modèle

C1. Télécharger

ollama pull qwen3:4b
ollama list
Vérification — le modèle sait-il appeler des outils ?
ollama show qwen3:4b | sed -n '/Capabilities/,$p'
  Capabilities
    completion
    tools        <- LA ligne indispensable. Absente = le modèle ne peut que discuter.

C2. Mesurer le débit réel (la mesure qui compte)

ollama run qwen3:4b --verbose "Explique en trois phrases ce qu'est un ordinateur. Réponds en français."
Vérification — lisez eval rate et prompt eval rate
prompt eval rate:     28.03 tokens/s    <- absorption du prompt
eval rate:            4.49 tokens/s     <- votre débit de génération

Sortir d'Ollama : /bye

C3. Tester l'API compatible OpenAI

curl -s http://127.0.0.1:11434/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"qwen3:4b","messages":[{"role":"user","content":"Dis bonjour"}],"max_tokens":40}'
Vérification
{"id":"chatcmpl-...","object":"chat.completion","model":"qwen3:4b",
 "choices":[{"message":{"role":"assistant","content":"Bonjour !..."}}]}

D.Hermes

D1. Installer

curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash -s -- --skip-browser
source ~/.bashrc
Vérification
which hermes
hermes --version
hermes doctor
/home/romain/.local/bin/hermes
Hermes Agent v0.xx.y
🩺 Hermes Doctor ... aucune ✗

D2. Brancher sur Ollama (3 voies, en choisir une)

Voie A — automatique :

ollama launch hermes

Voie B — assistant Hermes : hermes setup → Quick setup → More providers… → Custom endpoint → URL http://127.0.0.1:11434/v1 → clé vide → confirmer le modèle détecté.

Voie C — sans question :

hermes config set model.provider custom
hermes config set model.base_url http://127.0.0.1:11434/v1
hermes config set model.default qwen3:4b
Vérification
hermes config get model.provider
hermes config get model.base_url
hermes config get model.default
custom
http://127.0.0.1:11434/v1
qwen3:4b

D3. Élargir les délais (modèle lent oblige)

echo 'HERMES_API_TIMEOUT=1800' >> ~/.hermes/.env
Vérification
grep -n HERMES_API_TIMEOUT "$(hermes config env-path)"
sed -E 's/=.*/=<masqué>/' "$(hermes config env-path)"
12:HERMES_API_TIMEOUT=1800
OPENROUTER_API_KEY=<masqué>     <- on vérifie la liste des variables sans jamais afficher les valeurs

D4. Première conversation

hermes chat -q "Réponds en une seule phrase, en français : quelle est la capitale de la Suisse ?"
Vérification — dans une SECONDE fenêtre SSH, pendant que ça répond
ollama ps
top -bn1 | head -10
qwen3:4b  3.6 GB  100% CPU  16384  23 hours from now
 4213 romain 391% 22.0 ollama runner ...   <- le calcul se fait bien sur le Pi

D5. Alléger le préambule fixe

hermes prompt-size
hermes tools
hermes skills list
Vérification — remesurer après avoir désactivé des outils
System prompt total :   23,455 B
Tool schemas         :   40,612 B (25 tools)   <- doit baisser si vous désactivez des outils

E.Service permanent

E1. Ollama au démarrage (déjà fait par l'installateur)

systemctl is-enabled ollama
Vérification
enabled

E2. Précharger le modèle au boot (optionnel)

sudo tee /usr/local/bin/ollama-warmup.sh > /dev/null <<'EOF'
#!/bin/bash
set -eu
MODEL="qwen3:4b"
curl -sf -X POST http://127.0.0.1:11434/api/generate \
  -H 'Content-Type: application/json' \
  -d "{\"model\":\"$MODEL\",\"keep_alive\":\"24h\"}" >/dev/null
echo "ollama: $MODEL prechauffe"
EOF
sudo chmod 755 /usr/local/bin/ollama-warmup.sh
sudo tee /etc/systemd/system/ollama-warmup.service > /dev/null <<'EOF'
[Unit]
Description=Precharge le modele Ollama utilise par Hermes
After=ollama.service
Requires=ollama.service

[Service]
Type=oneshot
RemainAfterExit=yes
User=romain
ExecStart=/usr/local/bin/ollama-warmup.sh

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now ollama-warmup
Vérification
systemctl is-enabled ollama-warmup
systemctl is-active ollama-warmup
enabled
active

E3. Hermes (gateway) en service

hermes gateway setup
sudo loginctl enable-linger $USER
hermes gateway install
hermes gateway start

Variante service système (démarre au boot sans dépendre de votre session) :

sudo hermes gateway install --system
Vérification
systemctl --user is-enabled hermes-gateway
systemctl --user is-active hermes-gateway
hermes gateway status
loginctl show-user $USER -p Linger
enabled
active
Gateway: running (profile: default)
Linger=yes

E4. Le test qui compte : redémarrer

sudo reboot
Vérification après reconnexion SSH
systemctl is-active ollama
ollama ps
systemctl --user is-active hermes-gateway
hermes --version
active
qwen3:4b  3.6 GB  100% CPU  16384  23 hours from now
active
Hermes Agent v0.xx.y

F.Diagnostic express

F1. Ollama ne répond pas

systemctl status ollama --no-pager | head -12
journalctl -u ollama -n 40 --no-pager
sudo systemctl restart ollama
curl -s http://127.0.0.1:11434/api/tags
Vérification
{"models":[...]}    <- l'API répond de nouveau

F2. hermes: command not found

source ~/.bashrc
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
which hermes
Vérification
/home/romain/.local/bin/hermes

F3. « Ça ne répond pas » — distinguer travail et panne

ollama ps
top -bn1 | head -10
sensors | grep -i -E "package|temp"
Vérification
100% CPU + 300-400 % de CPU sur « ollama runner » = ça travaille, attendez (prefill)
Au-delà de 80 °C : la machine bride, ventilez avant d'optimiser quoi que ce soit

F4. Mémoire saturée / swap utilisé

free -h
ollama ps
journalctl -u ollama -n 40 --no-pager | grep -i -E "memory|oom|error"
Vérification
Swap used > 0 pendant une génération = le modèle est trop gros
available < 1 Gi = même conclusion
Corrections : modèle plus petit, puis OLLAMA_CONTEXT_LENGTH à 8192

F5. Hermes n'exécute pas ses outils

ollama show qwen3:4b | sed -n '/Capabilities/,$p'
Vérification
  Capabilities
    tools        <- présente : réduisez le nombre d'outils (hermes tools) et reformulez
                    absente : changez de modèle (qwen3:*, llama3.2:1b/3b, gemma4:*)

F6. Contexte trop petit / conversation qui casse

ollama ps
hermes prompt-size
Vérification
CONTEXT (ollama ps) doit être bien supérieur au préambule fixe de Hermes
Si les deux valeurs sont proches : /compress dans la session, ou montez le contexte à 32768 si la RAM suit

F7. Lenteur inexpliquée (le réflexe matériel)

vcgencmd get_throttled
cat /sys/class/thermal/thermal_zone0/temp
dmesg | grep -i -E "under-voltage|throttl" | tail -5
Vérification
throttled=0x0    <- tout autre valeur = alimentation insuffisante ou surchauffe
52600            <- 52,6 °C

G.Mises à jour

G1. Hermes

hermes update --check
hermes update
hermes doctor
hermes --version
Vérification
✅ Hermes Agent updated successfully!
hermes doctor : aucune ✗
hermes --version : numéro à jour

G2. Ollama et les modèles

curl -fsSL https://ollama.com/install.sh | sh
ollama --version
ollama pull qwen3:4b
ollama list
Vérification
ollama version is 0.x.y (plus récent)
ollama list : la date de MODIFIED du modèle a bougé

G3. Ubuntu

sudo apt update
sudo apt full-upgrade -y
sudo reboot
Vérification après reboot
systemctl is-active ollama
systemctl --user is-active hermes-gateway
active
active