Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.

« Hermes » : différence entre les versions

De Le Wiki de Lug
Ligne 434 : Ligne 434 :
* <code>session_search</code> : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)
* <code>session_search</code> : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)
* <code>flush_memories</code> : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)
* <code>flush_memories</code> : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)
==== Note sur vision et les modèles principaux multimodaux ====
Certains modèles principaux (ex. Qwen3.6-27B) sont '''nativement multimodaux''' (encodeur vision intégré au checkpoint) — ce n’est donc pas systématiquement une histoire de « modèle texte qui ne sait pas voir ». Même dans ce cas, garder <code>vision</code> sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :
# Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.
# Le petit modèle peut se décharger automatiquement (<code>--sleep-idle-seconds</code>), pas forcément possible/souhaitable sur le principal.
# Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.


==== Recommandations ====
==== Recommandations ====
Ligne 439 : Ligne 447 :
Dans une configuration locale disposant de peu de VRAM disponible, il est recommandé d’attribuer certaines fonctions auxiliaires à des modèles plus petits et plus rapides, afin d’éviter de mobiliser inutilement le modèle principal.
Dans une configuration locale disposant de peu de VRAM disponible, il est recommandé d’attribuer certaines fonctions auxiliaires à des modèles plus petits et plus rapides, afin d’éviter de mobiliser inutilement le modèle principal.


* <code>vision</code> : fortement recommandé avec un modèle multimodal séparé (environ 3 à 4 milliards de paramètres ; par exemple Qwen2.5-VL-3B-Instruct, Qwen3-VL-4B-Instruct ou Gemma 3 4B). Un modèle quantifié en Q4 est généralement suffisant pour l’analyse d’images courante et limite fortement l’utilisation de la VRAM.
* <code>vision</code> : fortement recommandé avec un modèle multimodal séparé (environ 3 à 4 milliards de paramètres ; par exemple Qwen2.5-VL-3B-Instruct, Qwen3-VL-4B-Instruct ou Gemma 3 4B). Un modèle quantifié en Q4 est généralement suffisant pour l’analyse d’images courante. '''Pour de l’OCR/transcription de texte dense''', augmenter <code>--image-min-tokens</code>/<code>--image-max-tokens</code> (ex. 2048/8192) et ajouter un <code>--repeat-penalty 1.1</code> pour éviter les boucles de génération sur du texte peu lisible à basse résolution.
* <code>title_generation</code> : recommandé avec un petit modèle texte très rapide (environ 0,5 à 3 milliards de paramètres ; par exemple Qwen3 0.6B, 1.7B ou un modèle instruct équivalent). Cette tâche est simple et ne nécessite pas un modèle puissant.
* <code>title_generation</code> : recommandé avec un petit modèle texte très rapide (environ 0,5 à 3 milliards de paramètres ; par exemple Qwen3 0.6B, 1.7B ou un modèle instruct équivalent). Tâche simple, ne nécessite pas un modèle puissant.
* <code>web_extract</code> : recommandé avec un modèle texte rapide disposant d’un contexte suffisamment long (environ 3 à 8 milliards de paramètres ; par exemple Qwen3 4B Instruct ou Gemma 3 4B). Privilégier un modèle capable de traiter au moins 32 000 jetons.
* <code>web_extract</code> : recommandé avec un modèle texte rapide disposant d’un contexte suffisamment long (environ 3 à 8 milliards de paramètres ; par exemple Qwen3 4B Instruct ou Gemma 3 4B). Privilégier un modèle capable de traiter au moins 32 000 jetons.
* <code>compression</code> : recommandé avec un modèle texte intermédiaire doté d’un contexte long et de bonnes capacités de résumé (environ 7 à 14 milliards de paramètres). Un modèle de 3 à 4 milliards peut fonctionner, mais risque de perdre davantage d’informations lors de la compression de longues conversations.
* <code>compression</code> : recommandé avec un modèle texte intermédiaire doté d’un contexte long et de bonnes capacités de résumé (environ 7 à 14 milliards de paramètres). Un modèle de 3-4B peut fonctionner mais risque de perdre davantage d’informations sur de longues conversations — '''à éviter si le modèle principal tourne avec un gros contexte (100K+)''', préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.
* <code>mcp</code> : peut utiliser un petit modèle texte fiable en sélection et appel d’outils (environ 3 à 8 milliards de paramètres ; par exemple Qwen3 4B Instruct). Éviter les modèles extrêmement petits si plusieurs outils ont des descriptions proches.
* <code>mcp</code> : petit modèle texte fiable en sélection/appel d’outils (environ 3 à 8 milliards de paramètres ; ex. Qwen3 4B Instruct). Éviter les modèles extrêmement petits si plusieurs outils ont des descriptions proches.
* <code>approval</code> : peut utiliser un petit modèle texte fiable (environ 3 à 8 milliards de paramètres). La qualité et le respect des consignes sont plus importants que la vitesse brute.
* <code>approval</code> : petit modèle texte fiable (environ 3 à 8 milliards de paramètres). Qualité et respect des consignes plus importants que la vitesse brute — valide des actions sensibles, ne pas sous-dimensionner.
* <code>skills_hub</code> : un petit modèle texte rapide est généralement suffisant (environ 1 à 4 milliards de paramètres).
* <code>skills_hub</code>, <code>triage_specifier</code>, <code>tts_audio_tags</code>, <code>session_search</code>, <code>monitor</code> : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).
* <code>triage_specifier</code> : un petit modèle texte rapide convient pour la classification et l’orientation des demandes (environ 1 à 4 milliards de paramètres).
* <code>flush_memories</code> : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).
* <code>tts_audio_tags</code> : un petit modèle texte est généralement suffisant (environ 1 à 4 milliards de paramètres).
* <code>profile_describer</code> : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).
* <code>session_search</code> : peut être confié à un petit modèle texte rapide (environ 1 à 4 milliards de paramètres).
* <code>kanban_decomposer</code>, <code>background_review</code> : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).
* <code>flush_memories</code> : utiliser de préférence un petit modèle fiable capable de distinguer les informations importantes des détails temporaires (environ 3 à 8 milliards de paramètres).
* <code>curator</code> : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).
* <code>profile_describer</code> : un petit ou moyen modèle texte est généralement suffisant (environ 3 à 8 milliards de paramètres).
* <code>moa_reference</code> : modèle texte performant (14 milliards de paramètres ou plus).
* <code>monitor</code> : un petit modèle texte rapide convient dans la plupart des cas (environ 1 à 4 milliards de paramètres).
* <code>moa_aggregator</code> : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).
* <code>kanban_decomposer</code> : privilégier un modèle texte intermédiaire avec de bonnes capacités de planification (environ 7 à 14 milliards de paramètres).
* <code>background_review</code> : un modèle texte intermédiaire est préférable pour les tâches de révision et d’analyse (environ 7 à 14 milliards de paramètres).
* <code>curator</code> : privilégier un modèle texte intermédiaire ou performant pour la sélection et la synthèse de contenu (environ 7 à 14 milliards de paramètres, voire davantage pour les analyses complexes).
* <code>moa_reference</code> : utiliser un modèle texte performant (environ 14 milliards de paramètres ou plus).
* <code>moa_aggregator</code> : utiliser un modèle texte performant disposant d’un contexte long pour agréger plusieurs réponses (environ 14 milliards de paramètres ou plus, avec au moins 64 000 jetons de contexte).


Pour une première optimisation, il est conseillé de configurer en priorité :
Pour une première optimisation, il est conseillé de configurer en priorité :
Ligne 466 : Ligne 469 :


Les autres fonctions peuvent rester sur <code>provider: auto</code> tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.
Les autres fonctions peuvent rester sur <code>provider: auto</code> tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.
==== Contexte recommandé par fonction ====
Le sur-dimensionnement du contexte (<code>-c</code>) est l’un des plus gros gaspillages de VRAM sur les petits modèles auxiliaires — le mettre par défaut à une valeur « confortable » unique pour toutes les routes coûte cher sans bénéfice.
{| class="wikitable"
! Fonction !! Contexte suggéré !! Remarque
|-
| <code>title_generation</code> || 2-4K || Ne voit que les 1-2 premiers messages
|-
| <code>tts_audio_tags</code> || 2-4K || Passage de texte court à annoter
|-
| <code>triage_specifier</code> || 4K || Juste la requête à classifier
|-
| <code>skills_hub</code> || 4-8K || Liste de compétences + requête
|-
| <code>session_search</code> || 8K || Résultats de recherche à trier
|-
| <code>monitor</code> || 8K || Selon la taille des logs surveillés
|-
| <code>flush_memories</code> || 8K || Candidats mémoire à évaluer
|-
| <code>profile_describer</code> || 8K || Historique modéré
|-
| <code>approval</code> || 8-16K || Action proposée + contexte suffisant
|-
| <code>mcp</code> || 8-16K || Selon le nombre d’outils déclarés
|-
| <code>kanban_decomposer</code> || 8-16K || Description de projet
|-
| <code>vision</code> || 16K || Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)
|-
| <code>curator</code> || 16-32K || Peut agréger plusieurs sources
|-
| <code>background_review</code> || 16-32K || Selon ce qui est passé en revue
|-
| <code>web_extract</code> || 32K || Recommandation explicite
|-
| <code>moa_reference</code> || 32K || Réponses de référence potentiellement longues
|-
| <code>compression</code> || 32-64K || Dépend de la longueur laissée s’accumuler avant déclenchement
|-
| <code>moa_aggregator</code> || 64K minimum || Exigence explicite (agrège plusieurs longues réponses)
|}
==== Quantification (poids du modèle) ====
* '''Tâches à faible enjeu''' (<code>title_generation</code>, <code>tts_audio_tags</code>, <code>skills_hub</code>, <code>monitor</code>, <code>session_search</code>, <code>triage_specifier</code>) : Q4_K_M suffit largement.
* '''Tâches à enjeu réel''' (<code>approval</code>, <code>mcp</code>, <code>web_extract</code>, <code>compression</code>, <code>vision</code>) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent &lt; 1,5 Go), autant prendre la marge.
==== KV cache (contexte) ====
* '''En dessous de 16K de contexte''' : Pas de quantization ou q8_0/q8_0 en KV cache partout par défaut, sur toutes les routes auxiliaires — risque de dégradation négligeable, aucune raison de s'en priver même à faible contexte.
* '''À partir de 32K''' (<code>web_extract</code>, <code>moa_reference</code>, <code>compression</code>) : <code>q8_0</code>/<code>q8_0</code> simple devient intéressant, gain notable pour un risque quasi nul.
* '''<code>moa_aggregator</code> à 64K+''' : seule route où une approche plus poussée type <code>q8_0</code>/<code>q6_0</code> + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.


= Commandes =
= Commandes =

Version du 21 juillet 2026 à 09:11

Prérequis

(Hermes seul)

  • Une machine ou VM dédiée (LXC compatible)

Pour un Hermes de base (sans LLM local) :

  • RAM :
    • 1 Go → minimum (test uniquement)
    • 2 Go → recommandé
    • 4 Go -> confortable
  • CPU / vCPU :
    • 1 vCPU → suffisant
    • 2 vCPU → recommandé
  • Espace disque :
    • 5 Go → minimum
    • 10 Go → confortable
  • GPU :
    • Inutile

Installation Hermes (service dédié)

Installation (Debian)

# apt update && apt upgrade
# apt install curl git
# curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
How would you like to set up Hermes?
> (○) Quick setup — provider, model & messaging (recommended)

  • Ollama local :
Select provider:
>(○) Custom endpoint (enter URL manually)
Custom OpenAI-compatible endpoint configuration:
API base URL [e.g. https://api.example.com/v1]: http://IP_OLLAMA:11434/v1
API key [optional]:
Detected model: mon_model
Use this model? [Y/n]: Y
Context length in tokens [leave blank for auto-detect]:
Display name [192.168.2.216:11434]: Ollama

  • Llama.cpp :
Select provider:
>(○) Custom endpoint (enter URL manually)
Custom OpenAI-compatible endpoint configuration:
API base URL [e.g. https://api.example.com/v1]: https://IP_OLLAMA:11434/v1

Remplir les options désirées puis fin de l'installation :

Launch hermes chat now? [Y/n]: y

Ensuite, inscrire Hermes comme service pour qu'il se lance automatiquement :


  • Sur une machine physique ou VM :
# hermes gateway install --system
  • Dans un LXC :
# hermes gateway install --system --run-as-user root

# systemctl enable hermes-gateway.service      
# systemctl start hermes-gateway.service

Configuration

Activer le serveur API

On édite le fichier :

# vi ~/.hermes/.env

Ajouter :

...
API_SERVER_ENABLED=true
API_SERVER_KEY="maclefsecrete"
# pour autoriser toutes les interfaces :
API_SERVER_HOST=0.0.0.0
# pour autoriser une seule interface :
# API_SERVER_HOST=IP_HERMES
API_SERVER_PORT=8642

On relance le service :

# systemctl restart hermes-gateway.service

Pour tester :

# curl http://IP_HERMES:8642/health

Doit renvoyer :

{"status":"ok"}

Pour vérifier le modèle exposé :

# curl http://IP_HERMES:8642/v1/models -H "Authorization: Bearer maclefsecrete"

Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer

# systemctl edit hermes-gateway.service

Ajouter dans la zone d’édition (partie supérieure du fichier) :

...
### Anything between here and the comment below will become the contents of the drop-in file

[Service]
ExecStartPre=/bin/sh -c 'uptime=$(cut -d. -f1 /proc/uptime); [ "$uptime" -lt 120 ] && sleep 30 || true'

### Edits below this comment will be discarded
...

Utiliser une CA privée avec Hermes

Si Hermes doit se connecter à un service HTTPS signé par une CA privée locale, il peut être nécessaire d’indiquer explicitement à Python et aux bibliothèques HTTP quel bundle de certificats utiliser.

Éditer l’override systemd du service :

# systemctl edit hermes-gateway.service

Ajouter dans la zone d’édition (partie supérieure du fichier) :

...
### Anything between here and the comment below will become the contents of the drop-in file

[Service]
Environment="SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt"
Environment="REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt"
Environment="CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt"

### Edits below this comment will be discarded
...

Explication rapide :

  • SSL_CERT_FILE : utilisé par Python / OpenSSL
  • REQUESTS_CA_BUNDLE : utilisé par la bibliothèque Python requests
  • CURL_CA_BUNDLE : utilisé par curl et parfois comme variable de repli

Puis recharger et redémarrer le service :

# systemctl daemon-reload
# systemctl restart hermes-gateway.service

Cas particulier : bundle certifi du venv Hermes

Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.

Si curl valide déjà le certificat avec /etc/ssl/certs/ca-certificates.crt mais que Hermes/OpenAI/httpx échoue avec CERTIFICATE_VERIFY_FAILED, on peut remplacer le bundle certifi du venv Hermes par le bundle système.

Sauvegarder le bundle actuel :

# cp /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem.bak

Remplacer par le bundle système :

# cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem

Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.

Automatiser le remplacement du certificat du venv

On édite le service Hermes :

# systemctl edit hermes-gateway.service

Ajouter dans la zone d’édition (partie supérieure du fichier) :

...
### Anything between here and the comment below will become the contents of the drop-in file

[Service]
ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem

### Edits below this comment will be discarded
...

Puis recharger systemd et redémarrer le service :

# systemctl daemon-reload
# systemctl restart hermes-gateway.service

Éditer le prompt système

Dans le fichier de configuration :

# vi ~/.hermes/config.yaml

On édite ou vérifie le profil utilisé dans la section display :

...
 display:
  compact: false
  personality: kawaii
  resume_display: full
...

Puis on modifie le prompt système via le profil correspondant dans la section agent :

...
agent:
  max_turns: 90
  gateway_timeout: 1800
  restart_drain_timeout: 60
  api_max_retries: 3
  service_tier: 
  tool_use_enforcement: auto
  gateway_timeout_warning: 900
  gateway_notify_interval: 600
  verbose: false
  reasoning_effort: medium
  personalities:
    helpful: You are a helpful, friendly AI assistant.
    concise: You are a concise assistant. Keep responses brief and to the point.
...

Enfin, on redémarre le service :

# systemctl restart hermes-gateway.service

⚠️ Attention, pour que les lignes contenant : ne soient pas interprétées comme des personnalités dans le fichier YAML, il faut écrire le prompt sous forme de bloc multiligne avec le symbole |, en respectant l'indentation. Exemple :

    concise: |
      You are a concise assistant. Keep responses brief and to the point.
      TOOLS:
      - For current, recent, uncertain, or factual information, use mcp_searxng_searxng_web_search.
      - To read a specific URL, use mcp_searxng_web_url_read.
      - For system tasks, use terminal.

      RULES:
      - Respond in the same language as the user.
      - Do not invent tool results.
      - If a tool fails, say so.
      - Do not use tools for simple rewriting, translation, or opinion unless needed.

Signal

Signal est une messagerie instantanée axée sur la confidentialité. Tous les messages et appels y sont chiffrés de bout en bout par défaut via le Signal Protocol, de sorte que ni Signal ni un tiers ne peuvent en lire le contenu. Signal se distingue également par une collecte de données très limitée, l’absence de publicité et de traqueurs, ainsi qu’un effort particulier pour réduire les métadonnées accessibles au service.

Signal permet de relier Hermes à la messagerie chiffrée Signal. La connexion ne se fait pas directement avec le téléphone, mais via signal-cli exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.

  • Installation :

Via Docker

# mkdir -p /opt/signal-cli
# vi /opt/signal-cli/docker-compose.yml
services:
  signal-cli:
    image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest
    container_name: signal-cli
    restart: unless-stopped
    command: daemon --http 0.0.0.0:8080
    ports:
      - "IP_SERVEUR:8080:8080" # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement
    volumes:
      - signal-cli-data:/var/lib/signal-cli
    tmpfs:
      - /tmp:exec

volumes:
  signal-cli-data:
 # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d
  • Connexion au téléphone :

Installer qrencode :

# apt install qrencode

Dans le terminal :

# docker exec signal-cli signal-cli link -n "HermesAgent" > /tmp/signal-link.txt 2>&1 & sleep 3 && grep -o 'sgnl://[^ ]*' /tmp/signal-link.txt | qrencode -t ANSIUTF8 && wait

Puis scanner le QR code avec l’application Signal via Paramètres -> Appareils associés.

  • Connecter Hermes à Signal :
# hermes setup
Connect a messaging platform? (Telegram, Discord, etc.)
-> ●) Set up messaging now (recommended)

Puis redémarrer le service :

# systemctl restart hermes-gateway.service
  • Communiquer avec le serveur via Signal (depuis le téléphone dans l'application Signal) :
    • Appuyer sur l’icône ✏️ (nouveau message)
    • Tout en haut de la liste, "Note to Self" ou votre propre nom apparaît
    • Taper votre message : Hermes répond dans cette même conversation
    • (Optionnel) taper /sethome pour définir le canal par défaut pour les notifications et les tâches planifiées.

Native

  • Installation :

On installe les dépendances si nécessaire :

# apt update && apt upgrade
# apt install tar qrencode openjdk-25-jre-headless

On Installe le programme :

# cd /tmp
# VERSION=$(curl -Ls -o /dev/null -w %{url_effective} https://github.com/AsamK/signal-cli/releases/latest | sed 's/^.*\/v//')
# curl -L -O "https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz"
# tar xf "signal-cli-${VERSION}.tar.gz" -C /opt
# ln -sf "/opt/signal-cli-${VERSION}/bin/signal-cli" /usr/local/bin/
# rm /tmp/signal-cli-${VERSION}.tar.gz

Appareillage du téléphone :

# signal-cli link -n "HermesAgent" > /tmp/signal-link.txt 2>&1 & sleep 5 && grep -o 'sgnl://[^ ]*' /tmp/signal-link.txt | qrencode -t ANSIUTF8 && wait

Puis scanner le QR code avec l’application Signal via Paramètres -> Appareils associés.

On créé un service :

# vi /etc/systemd/system/signal-cli.service
[Unit]
Description=signal-cli daemon
After=network.target

[Service]
ExecStart=/usr/local/bin/signal-cli --account +VOTRE_NUMERO daemon --http 127.0.0.1:8080
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
# systemctl daemon-reload
# systemctl enable --now signal-cli
# systemctl status signal-cli
  • Connecter Hermes à Signal :
# hermes setup
Connect a messaging platform? (Telegram, Discord, etc.)
-> ●) Set up messaging now (recommended)

Puis redémarrer le service :

# systemctl restart hermes-gateway.service
  • Communiquer avec le serveur via Signal (depuis le téléphone dans l'application Signal) :
    • Appuyer sur l’icône ✏️ (nouveau message)
    • Tout en haut de la liste, "Note to Self" ou votre propre nom apparaît
    • Taper votre message : Hermes répond dans cette même conversation
    • (Optionnel) taper /sethome pour définir le canal par défaut pour les notifications et les tâches planifiées.

Mise à jour automatique

  • Version native :

On créé un script :

# vi /usr/local/bin/update-signal-cli.sh
#!/bin/bash
set -e

systemctl stop signal-cli || true
cd /tmp

VERSION=$(curl -Ls -o /dev/null -w '%{url_effective}' https://github.com/AsamK/signal-cli/releases/latest | sed 's/^.*\/v//')

curl -L -O "https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz"

rm -rf "/opt/signal-cli-${VERSION}"
tar xf "signal-cli-${VERSION}.tar.gz" -C /opt

ln -sf "/opt/signal-cli-${VERSION}/bin/signal-cli" /usr/local/bin/signal-cli
rm -f "/tmp/signal-cli-${VERSION}.tar.gz"

# Vérifier la compatibilité Java
if ! signal-cli --version > /dev/null 2>&1; then
    ERROR="$(signal-cli --version 2>&1 || true)"

    echo "$ERROR"

    REQUIRED="$(echo "$ERROR" | grep -oE 'class file (version|major version) [0-9]+' | grep -oE '[0-9]+' | tail -n1 || true)"

    if [ -z "$REQUIRED" ]; then
        echo "Impossible de détecter automatiquement la version Java requise."
        echo "Installation de Java 21 par défaut..."
        JAVA_VERSION=21
    else
        JAVA_VERSION=$((REQUIRED - 44))
        echo "Class file version $REQUIRED détectée => Java $JAVA_VERSION requis."
    fi

    apt update
    apt install -y "openjdk-${JAVA_VERSION}-jre-headless"

    if [ -x "/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java" ]; then
        update-alternatives --set java "/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java"
    else
        echo "Java $JAVA_VERSION installé, mais chemin update-alternatives non trouvé. Vérifie avec :"
        echo "update-alternatives --config java"
    fi
fi

systemctl start signal-cli
# chmod +x /usr/local/bin/update-signal-cli.sh

On ajoute le script au crontab :

# crontab -e

Ajouter :

...
0 3 1 * * /usr/local/bin/update-signal-cli.sh
  • Version docker :

Voir Watchtower pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)

SearXNG

Il faut d’abord avoir installé une instance SearXNG.

Sur le serveur Hermes, lancer :

# hermes tools
→ (○) Reconfigure an existing tool's provider or API key
→ (○) 🔍 Web Search & Scraping
→ (●) SearXNG [free · self-hosted] — Free, privacy-respecting metasearch. Point SEARXNG_URL at your instance. [active]

Entrer ensuite l’adresse de l’instance SearXNG :

SearXNG instance URL (e.g. http://localhost:8080) (Enter to keep current):

Prompt système :

      TOOLS:
      - Use web search for current, recent, time-sensitive, location-specific, uncertain, or externally verifiable information.

      RULES:
      - For image results, output direct image URLs using markdown image syntax: ![](URL)
      - For video results, output links in this format: ~_~N [Titre de la vidéo](URL)

Camoufox

Fonctions auxiliaires

Configuration des modèles utilisés par Hermes pour les tâches secondaires, indépendamment du modèle principal de conversation.

Editer la section auxiliary dans :

# vi ~/.hermes/config.yaml
  • vision : analyse d’images (modèle multimodal avec vision)
  • web_extract : extraction et synthèse de contenu web (LLM texte)
  • compression : compression et résumé du contexte (LLM texte avec un contexte suffisamment long)
  • skills_hub : recherche et sélection de compétences (LLM texte léger)
  • approval : évaluation et validation des actions sensibles (LLM texte léger et fiable)
  • mcp : sélection et routage des outils MCP (LLM texte efficace en appel d’outils)
  • title_generation : génération de titres de conversations (petit LLM texte rapide)
  • tts_audio_tags : génération de balises expressives pour la synthèse vocale (LLM texte léger)
  • triage_specifier : classification et orientation des demandes (LLM texte léger)
  • kanban_decomposer : décomposition d’un projet en tâches Kanban (LLM texte avec de bonnes capacités de planification)
  • profile_describer : génération d’une description de profil (LLM texte)
  • curator : sélection et organisation du contenu (LLM texte avec de bonnes capacités de synthèse)
  • monitor : analyse des résultats de surveillance (LLM texte léger)
  • background_review : révision et analyse en arrière-plan (LLM texte)
  • moa_reference : production d’une réponse de référence pour le MoA (LLM texte performant)
  • moa_aggregator : agrégation et synthèse des réponses MoA (LLM texte performant avec un contexte long)
  • session_search : analyse et sélection des résultats de recherche dans les sessions (LLM texte léger)
  • flush_memories : sélection et consolidation des souvenirs pertinents (LLM texte léger et fiable)

Note sur vision et les modèles principaux multimodaux

Certains modèles principaux (ex. Qwen3.6-27B) sont nativement multimodaux (encodeur vision intégré au checkpoint) — ce n’est donc pas systématiquement une histoire de « modèle texte qui ne sait pas voir ». Même dans ce cas, garder vision sur un petit modèle auxiliaire séparé reste recommandé pour trois raisons :

  1. Évite de mobiliser le modèle principal (VRAM + temps de calcul) pour une tâche que 4B suffit à traiter.
  2. Le petit modèle peut se décharger automatiquement (--sleep-idle-seconds), pas forcément possible/souhaitable sur le principal.
  3. Latence : un 4B répond bien plus vite qu’un 27B pour une simple description/OCR d’image.

Recommandations

Dans une configuration locale disposant de peu de VRAM disponible, il est recommandé d’attribuer certaines fonctions auxiliaires à des modèles plus petits et plus rapides, afin d’éviter de mobiliser inutilement le modèle principal.

  • vision : fortement recommandé avec un modèle multimodal séparé (environ 3 à 4 milliards de paramètres ; par exemple Qwen2.5-VL-3B-Instruct, Qwen3-VL-4B-Instruct ou Gemma 3 4B). Un modèle quantifié en Q4 est généralement suffisant pour l’analyse d’images courante. Pour de l’OCR/transcription de texte dense, augmenter --image-min-tokens/--image-max-tokens (ex. 2048/8192) et ajouter un --repeat-penalty 1.1 pour éviter les boucles de génération sur du texte peu lisible à basse résolution.
  • title_generation : recommandé avec un petit modèle texte très rapide (environ 0,5 à 3 milliards de paramètres ; par exemple Qwen3 0.6B, 1.7B ou un modèle instruct équivalent). Tâche simple, ne nécessite pas un modèle puissant.
  • web_extract : recommandé avec un modèle texte rapide disposant d’un contexte suffisamment long (environ 3 à 8 milliards de paramètres ; par exemple Qwen3 4B Instruct ou Gemma 3 4B). Privilégier un modèle capable de traiter au moins 32 000 jetons.
  • compression : recommandé avec un modèle texte intermédiaire doté d’un contexte long et de bonnes capacités de résumé (environ 7 à 14 milliards de paramètres). Un modèle de 3-4B peut fonctionner mais risque de perdre davantage d’informations sur de longues conversations — à éviter si le modèle principal tourne avec un gros contexte (100K+), préférer laisser cette tâche sur le principal dans ce cas plutôt qu’un 4B sous-dimensionné.
  • mcp : petit modèle texte fiable en sélection/appel d’outils (environ 3 à 8 milliards de paramètres ; ex. Qwen3 4B Instruct). Éviter les modèles extrêmement petits si plusieurs outils ont des descriptions proches.
  • approval : petit modèle texte fiable (environ 3 à 8 milliards de paramètres). Qualité et respect des consignes plus importants que la vitesse brute — valide des actions sensibles, ne pas sous-dimensionner.
  • skills_hub, triage_specifier, tts_audio_tags, session_search, monitor : petit modèle texte rapide suffisant (environ 1 à 4 milliards de paramètres).
  • flush_memories : petit modèle fiable capable de distinguer l’important du temporaire (environ 3 à 8 milliards de paramètres).
  • profile_describer : petit ou moyen modèle texte (environ 3 à 8 milliards de paramètres).
  • kanban_decomposer, background_review : modèle texte intermédiaire avec de bonnes capacités de planification/analyse (environ 7 à 14 milliards de paramètres).
  • curator : modèle texte intermédiaire à performant pour synthèse (7 à 14 milliards de paramètres, plus pour analyses complexes).
  • moa_reference : modèle texte performant (14 milliards de paramètres ou plus).
  • moa_aggregator : modèle texte performant avec contexte long (14B+, au moins 64 000 jetons de contexte).

Pour une première optimisation, il est conseillé de configurer en priorité :

  • vision : modèle multimodal de 3 à 4 milliards de paramètres
  • title_generation : modèle texte de 0,5 à 3 milliards de paramètres
  • web_extract : modèle texte de 3 à 8 milliards de paramètres avec contexte long
  • compression : modèle texte de 7 à 14 milliards de paramètres avec de bonnes capacités de résumé

Les autres fonctions peuvent rester sur provider: auto tant qu’elles ne provoquent pas de lenteurs, de délais d’attente ou une consommation excessive de ressources.

Contexte recommandé par fonction

Le sur-dimensionnement du contexte (-c) est l’un des plus gros gaspillages de VRAM sur les petits modèles auxiliaires — le mettre par défaut à une valeur « confortable » unique pour toutes les routes coûte cher sans bénéfice.

Fonction Contexte suggéré Remarque
title_generation 2-4K Ne voit que les 1-2 premiers messages
tts_audio_tags 2-4K Passage de texte court à annoter
triage_specifier 4K Juste la requête à classifier
skills_hub 4-8K Liste de compétences + requête
session_search 8K Résultats de recherche à trier
monitor 8K Selon la taille des logs surveillés
flush_memories 8K Candidats mémoire à évaluer
profile_describer 8K Historique modéré
approval 8-16K Action proposée + contexte suffisant
mcp 8-16K Selon le nombre d’outils déclarés
kanban_decomposer 8-16K Description de projet
vision 16K Ajuster si usage OCR intensif (image seule jusqu’à 8K tokens)
curator 16-32K Peut agréger plusieurs sources
background_review 16-32K Selon ce qui est passé en revue
web_extract 32K Recommandation explicite
moa_reference 32K Réponses de référence potentiellement longues
compression 32-64K Dépend de la longueur laissée s’accumuler avant déclenchement
moa_aggregator 64K minimum Exigence explicite (agrège plusieurs longues réponses)

Quantification (poids du modèle)

  • Tâches à faible enjeu (title_generation, tts_audio_tags, skills_hub, monitor, session_search, triage_specifier) : Q4_K_M suffit largement.
  • Tâches à enjeu réel (approval, mcp, web_extract, compression, vision) : privilégier Q5_K_M ou Q6_K — sur des modèles 4-8B, l’écart VRAM entre Q4 et Q6 reste faible (souvent < 1,5 Go), autant prendre la marge.

KV cache (contexte)

  • En dessous de 16K de contexte : Pas de quantization ou q8_0/q8_0 en KV cache partout par défaut, sur toutes les routes auxiliaires — risque de dégradation négligeable, aucune raison de s'en priver même à faible contexte.
  • À partir de 32K (web_extract, moa_reference, compression) : q8_0/q8_0 simple devient intéressant, gain notable pour un risque quasi nul.
  • moa_aggregator à 64K+ : seule route où une approche plus poussée type q8_0/q6_0 + Hadamard (si le fork le supporte) se justifie, vu le volume réel de KV cache à comprimer.

Commandes

  • Lancer l’interface interactive :
# hermes
  • Choisir le modèle et le provider LLM :
# hermes model
  • Configurer les outils disponibles :
# hermes tools
  • Modifier une configuration spécifique :
# hermes config set
  • Démarrer le gateway (Telegram, Discord, etc.) :
# hermes gateway
  • Lancer le script de configuration complet :
# hermes setup
  • Migrer depuis OpenClaw :
# hermes claw migrate
  • Mettre à jour Hermes :
# hermes update
  • Diagnostiquer les problèmes :
# hermes doctor

MCP

# vi ~/.hermes/config.yaml

On inscrit le serveur MCP SearXNG (créer la section mcp_servers si absente) :

...
mcp_servers:
  searxng:
    url: http://IP_MCP:3000/mcp
...

On redémarre le service :

# systemctl restart hermes-gateway.service

Ou depuis Hermes :

/reload-mcp

Test :

# hermes mcp list
# hermes mcp test searxng

Le serveur ihor-sokoliuk/mcp-searxng expose notamment les outils suivants :

searxng_web_search
searxng_search_suggestions
searxng_instance_info
web_url_read
concise: |-
  You are a concise assistant. Keep responses brief and to the point.

  TOOLS:
  - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use searxng_web_search.
  - To read a specific URL, use web_url_read.
  - For search suggestions, use searxng_search_suggestions.
  - For SearXNG instance capabilities, categories, engines, locales, and plugins, use searxng_instance_info.
  - For system tasks, use terminal.

  RULES:
  - Respond in the same language as the user.
  - Do not invent tool results.
  - If a tool fails, say so explicitly.
  - Do not promise to continue later, follow up later, or say that results are still coming.
  - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.
  - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.
  - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.
  - If no tool result is available, say you cannot verify and do not guess.
  - Use search categories when relevant.
  - For image searches, use searxng_web_search with categories=images.
  - For video searches, use searxng_web_search with categories=videos.
  - For image results, output direct image URLs using markdown image syntax: ![](URL)
  - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)
  - Do not use tools for simple rewriting, translation, or opinion unless needed.

  • Recommandation :

Il est recommandé de désactiver le service natif correspondant :

# hermes tools

Décocher :

🔍 Web Search & Scraping  (web_search, web_extract)  [no API key]
# vi ~/.hermes/config.yaml

On inscrit le serveur MCP RAGFlow (créer la section mcp_servers si absente) :

...
mcp_servers:
  ragflow:
    url: http://IP_MCP:9382/mcp
...

On redémarre le service :

# systemctl restart hermes-gateway.service

Ou depuis Hermes :

/reload-mcp

Test :

# hermes mcp list
# hermes mcp test ragflow

Prompt système recommandé :

 TOOLS:
 - For indexed documents, internal documentation, knowledge bases, or when the user asks to check the docs, use the RAGFlow MCP tools: ragflow_retrieval, ragflow_list_datasets, and ragflow_list_chats.

 RULES:
 - Do not use terminal/curl to query RAGFlow unless explicitly asked for a network diagnostic.
 - If no RAGFlow dataset exists or no relevant result is found, say so clearly.