« Hermes » : différence entre les versions
Autres actions
| (85 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 39 : | Ligne 39 : | ||
Display name [192.168.2.216:11434]: <font color = blue>Ollama</font> | Display name [192.168.2.216:11434]: <font color = blue>Ollama</font> | ||
----- | |||
* Llama.cpp : | |||
<font color = gold>Select provider:</font> | |||
><font color = lightgreen>(○) Custom endpoint (enter URL manually)</font> | |||
Custom OpenAI-compatible endpoint configuration: | |||
API base URL [e.g. <nowiki>https://</nowiki>api.example.com/v1]: http<font color = red>s</font>://<font color = blue>IP_OLLAMA</font>:<font color = green>11434</font>/v1 | |||
----- | ----- | ||
Remplir les options désirées puis fin de l'installation : | Remplir les options désirées puis fin de l'installation : | ||
| Ligne 51 : | Ligne 58 : | ||
# systemctl enable hermes-gateway.service | # systemctl enable hermes-gateway.service | ||
# systemctl start hermes-gateway.service | # systemctl start hermes-gateway.service | ||
== Configuration == | == Configuration == | ||
=== Activer le serveur API === | |||
On édite le fichier : | On édite le fichier : | ||
# vi ~/.hermes/.env | # vi ~/.hermes/.env | ||
| Ligne 58 : | Ligne 66 : | ||
<font color = grey>...</font> | <font color = grey>...</font> | ||
API_SERVER_ENABLED=true | API_SERVER_ENABLED=true | ||
API_SERVER_KEY="<font color = blue>maclefsecrete"</font> | API_SERVER_KEY="<font color = blue>maclefsecrete</font>" | ||
# pour autoriser toutes les interfaces : | |||
API_SERVER_HOST=<font color = blue>0.0.0.0</font> | |||
# pour autoriser une seule interface : | |||
# API_SERVER_HOST=<font color = blue>IP_HERMES</font> | |||
API_SERVER_PORT=<font color = green>8642</font> | |||
{{Méta bandeau | |||
| niveau = grave | |||
| icône = grave | |||
| texte = Si <code>API_SERVER_HOST=0.0.0.0</code> : l’API est accessible sur le réseau. Définir impérativement une clé <code>API_SERVER_KEY</code> longue et aléatoire, au minimum 16 caractères, idéalement générée avec <code>openssl rand -hex 32</code>. Limiter aussi l’accès via firewall ou réseau privé recommandé. | |||
}} | |||
On relance le service : | On relance le service : | ||
# systemctl restart hermes-gateway.service | # systemctl restart hermes-gateway.service | ||
Pour tester : | |||
# curl http://<font color = blue>IP_HERMES</font>:8642/health | |||
Doit renvoyer : | |||
{"status":"ok"} | |||
Pour vérifier le modèle exposé : | |||
# curl http://<font color = blue>IP_HERMES</font>:8642/v1/models -H "Authorization: Bearer <font color = blue>maclefsecrete</font>" | |||
=== 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) : | |||
<font color = grey>...</font> | |||
<font color = grey>### Anything between here and the comment below will become the contents of the drop-in file</font> | |||
<font color = blue>[Service] | |||
ExecStartPre=/bin/sh -c 'uptime=$(cut -d. -f1 /proc/uptime); [ "$uptime" -lt 120 ] && sleep 30 || true'</font> | |||
<font color = grey>### Edits below this comment will be discarded</font> | |||
<font color = grey>...</font> | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = information | |||
| texte = | |||
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes. | |||
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage. | |||
}} | |||
=== 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) : | |||
<font color = grey>...</font> | |||
<font color = grey>### Anything between here and the comment below will become the contents of the drop-in file</font> | |||
<font color = blue>[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"</font> | |||
<font color = grey>### Edits below this comment will be discarded</font> | |||
<font color = grey>...</font> | |||
Explication rapide : | |||
* <code>SSL_CERT_FILE</code> : utilisé par Python / OpenSSL | |||
* <code>REQUESTS_CA_BUNDLE</code> : utilisé par la bibliothèque Python <code>requests</code> | |||
* <code>CURL_CA_BUNDLE</code> : utilisé par <code>curl</code> 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) : | |||
<font color = grey>...</font> | |||
<font color = grey>### Anything between here and the comment below will become the contents of the drop-in file</font> | |||
<font color = blue>[Service] | |||
ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python<font color = green>3.11</font>/site-packages/certifi/cacert.pem</font> | |||
<font color = grey>### Edits below this comment will be discarded</font> | |||
<font color = grey>...</font> | |||
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 <code>display</code> : | |||
<font color = grey>... | |||
display: | |||
compact: false</font> | |||
personality: <font color = green>kawaii</font> | |||
<font color = grey>resume_display: full | |||
...</font> | |||
Puis on modifie le prompt système via le profil correspondant dans la section <code>agent</code> : | |||
<font color = grey>... | |||
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</font> | |||
personalities: | |||
helpful: You are a helpful, friendly AI assistant. | |||
concise: You are a concise assistant. Keep responses brief and to the point. | |||
<font color = grey>...</font> | |||
Enfin, on redémarre le service : | |||
# systemctl restart hermes-gateway.service | |||
⚠️ Attention, pour que les lignes contenant <code>:</code> 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 <code>|</code>, en respectant l'indentation. Exemple : | |||
<font color = cyan>concise</font><font color = red>: |</font> | |||
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 <code>signal-cli</code> exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite. | |||
* Installation : | |||
==== Via [[Docker|Docker]] ==== | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = information | |||
| texte = Installation séparée (Docker sur autre machine) : Les images et fichiers audio générés par Hermes ne peuvent pas être envoyés en pièces jointes natives, signal-cli n'a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises. | |||
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu'Hermes via [[Hermes#Native|l'installation native]]. | |||
}} | |||
# 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: | |||
- "<font color = blue>IP_SERVEUR</font>: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 <code>qrencode</code> : | |||
# apt install qrencode | |||
Dans le terminal : | |||
# docker exec signal-cli signal-cli link -n "<font color = blue>HermesAgent</font>" > /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 <code>Paramètres</code> -> <code>Appareils associés</code>. | |||
* Connecter Hermes à Signal : | |||
# hermes setup | |||
<font color = gold>Connect a messaging platform? (Telegram, Discord, etc.)</font> | |||
-> <font color = lightgreen>●) Set up messaging now (recommended)</font> | |||
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 <code>/sethome</code> 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-<font color = green>25</font>-jre-headless | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = information | |||
| texte = Si l'installation échoue, vérifier la compatibilité Java : <code>signal-cli --version</code>. En cas d'erreur <code>UnsupportedClassVersionError</code>, installer la version Java requise via <code>apt install openjdk-<font color = blue>XX</font>-jre-headless</code>. | |||
}} | |||
On Installe le programme : | |||
# cd /tmp | |||
# VERSION=$(curl -Ls -o /dev/null -w %{url_effective} <nowiki>https://</nowiki>github.com/AsamK/signal-cli/releases/latest | sed 's/^.*\/v//') | |||
# curl -L -O "<nowiki>https://</nowiki>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 <code>Paramètres</code> -> <code>Appareils associés</code>. | |||
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 +<font color = blue>VOTRE_NUMERO</font> 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 | |||
<font color = gold>Connect a messaging platform? (Telegram, Discord, etc.)</font> | |||
-> <font color = lightgreen>●) Set up messaging now (recommended)</font> | |||
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 <code>/sethome</code> pour définir le canal par défaut pour les notifications et les tâches planifiées. | |||
==== Mise à jour automatique ==== | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = information | |||
| texte = Il est recommandé de mettre à jour l'application Signal au moins tous les trois mois. | |||
}} | |||
* Version native : | |||
On créé un script : | |||
# vi /usr/local/bin/update-signal-cli.sh | |||
#!/bin/bash | |||
systemctl stop signal-cli | |||
cd /tmp | |||
# Télécharger la nouvelle version | |||
VERSION=$(curl -Ls -o /dev/null -w %{url_effective} <nowiki>https://</nowiki>github.com/AsamK/signal-cli/releases/latest | sed 's/^.*\/v//') | |||
curl -L -O "<nowiki>https://</nowiki>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/signal-cli | |||
rm /tmp/signal-cli-${VERSION}.tar.gz | |||
# Vérifier la compatibilité Java | |||
if ! signal-cli --version > /dev/null 2>&1; then | |||
# Extraire la version Java requise depuis l'erreur | |||
REQUIRED=$(signal-cli --version 2>&1 | grep -o 'class file version [0-9]*' | grep -o '[0-9]*') | |||
# Convertir class version en version Java (class 69 = Java 25, 65 = Java 21, etc.) | |||
JAVA_VERSION=$((REQUIRED - 44)) | |||
echo "Java $JAVA_VERSION requis, installation..." | |||
apt install -y openjdk-${JAVA_VERSION}-jre-headless | |||
update-alternatives --set java /usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java | |||
fi | |||
systemctl start signal-cli | |||
# chmod +x /usr/local/bin/update-signal-cli.sh | |||
On ajoute le script au crontab : | |||
# crontab -e | |||
Ajouter : | |||
<font color = grey>...</font> | |||
0 3 1 * * /usr/local/bin/update-signal-cli.sh | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = information | |||
| texte = | |||
* 0 → minute 0 | |||
* 3 → 3h du matin | |||
* 1 → le 1er du mois | |||
* * → tous les mois | |||
* * → peu importe le jour de la semaine | |||
}} | |||
* Version docker : | |||
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..) | |||
= Commandes = | = Commandes = | ||
| Ligne 89 : | Ligne 390 : | ||
* Diagnostiquer les problèmes : | * Diagnostiquer les problèmes : | ||
# hermes doctor | # hermes doctor | ||
= MCP = | |||
=== [[IA_MCP#SearXNG|SearXNG]] === | |||
# vi ~/.hermes/config.yaml | |||
On inscrit le serveur MCP SearXNG (créer la section <code>mcp_servers</code> si absente) : | |||
<font color=grey>... | |||
mcp_servers:</font> | |||
searxng: | |||
url: "http://<font color=blue>IP_MCP</font>:<font color=green>3000</font>/mcp" | |||
<font color=grey>...</font> | |||
{{Méta bandeau | |||
| niveau = modéré | |||
| icône = modéré | |||
| texte = La section <code>mcp_servers</code> doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG. | |||
}} | |||
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 <code>ihor-sokoliuk/mcp-searxng</code> expose notamment les outils suivants : | |||
searxng_web_search | |||
searxng_search_suggestions | |||
searxng_instance_info | |||
web_url_read | |||
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) : | |||
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 mcp_searxng_searxng_web_search. | |||
- To read a specific URL, use mcp_searxng_web_url_read. | |||
- For search suggestions, use mcp_searxng_searxng_search_suggestions. | |||
- For SearXNG instance capabilities, categories, engines, locales, and plugins, use mcp_searxng_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 mcp_searxng_searxng_web_search with categories=images. | |||
- For video searches, use mcp_searxng_searxng_web_search with categories=videos. | |||
- For image results, output direct image URLs using markdown image syntax:  | |||
- 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] | |||
Dernière version du 30 juin 2026 à 14:55
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 / OpenSSLREQUESTS_CA_BUNDLE: utilisé par la bibliothèque PythonrequestsCURL_CA_BUNDLE: utilisé parcurlet 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
/sethomepour 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
/sethomepour 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
systemctl stop signal-cli
cd /tmp
# Télécharger la nouvelle version
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/signal-cli
rm /tmp/signal-cli-${VERSION}.tar.gz
# Vérifier la compatibilité Java
if ! signal-cli --version > /dev/null 2>&1; then
# Extraire la version Java requise depuis l'erreur
REQUIRED=$(signal-cli --version 2>&1 | grep -o 'class file version [0-9]*' | grep -o '[0-9]*')
# Convertir class version en version Java (class 69 = Java 25, 65 = Java 21, etc.)
JAVA_VERSION=$((REQUIRED - 44))
echo "Java $JAVA_VERSION requis, installation..."
apt install -y openjdk-${JAVA_VERSION}-jre-headless
update-alternatives --set java /usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java
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..)
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
- Prompt système recommandé (voir Éditer le prompt système) :
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 mcp_searxng_searxng_web_search. - To read a specific URL, use mcp_searxng_web_url_read. - For search suggestions, use mcp_searxng_searxng_search_suggestions. - For SearXNG instance capabilities, categories, engines, locales, and plugins, use mcp_searxng_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 mcp_searxng_searxng_web_search with categories=images. - For video searches, use mcp_searxng_searxng_web_search with categories=videos. - For image results, output direct image URLs using markdown image syntax:  - 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]